@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,27 @@
1
+ export class InsertBuilder {
2
+ _table;
3
+ _rows = [];
4
+ constructor(table) {
5
+ this._table = table;
6
+ }
7
+ values(rows) {
8
+ this._rows = rows;
9
+ return this;
10
+ }
11
+ /**
12
+ * Compile the insert metadata.
13
+ *
14
+ * For bulk inserts, prefer using the client's `insert()` method
15
+ * which uses ClickHouse's native insert protocol.
16
+ */
17
+ compile() {
18
+ const table = this._table;
19
+ if (this._rows.length === 0) {
20
+ return { sql: `INSERT INTO ${table}`, params: {}, table, rows: [] };
21
+ }
22
+ const columns = Object.keys(this._rows[0]);
23
+ const sql = `INSERT INTO ${table} (${columns.join(', ')})`;
24
+ return { sql, params: {}, table, rows: this._rows };
25
+ }
26
+ }
27
+ //# sourceMappingURL=insert-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insert-builder.js","sourceRoot":"","sources":["../../src/query/insert-builder.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,aAAa;IAIhB,MAAM,CAAI;IACV,KAAK,GAAwB,EAAE,CAAC;IAExC,YAAY,KAAQ;QAClB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,MAAM,CAAC,IAAyB;QAC9B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACH,OAAO;QACL,MAAM,KAAK,GAAG,IAAI,CAAC,MAAgB,CAAC;QAEpC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,GAAG,EAAE,eAAe,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACtE,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAA4B,CAAC,CAAC;QACtE,MAAM,GAAG,GAAG,eAAe,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QAE3D,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IACtD,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ /** ClickHouse parameter types for {name:Type} placeholders. */
2
+ export type ClickHouseParamType = 'String' | 'UInt8' | 'UInt16' | 'UInt32' | 'UInt64' | 'Int8' | 'Int16' | 'Int32' | 'Int64' | 'Float32' | 'Float64' | 'Bool' | 'Date' | 'DateTime' | 'DateTime64' | 'UUID' | `Array(${string})`;
3
+ /** A parameter reference that compiles to {name:Type} in SQL. */
4
+ export declare class Param {
5
+ readonly name: string;
6
+ readonly type: ClickHouseParamType;
7
+ constructor(name: string, type: ClickHouseParamType);
8
+ toString(): string;
9
+ }
10
+ export declare function param(name: string, type: ClickHouseParamType): Param;
11
+ //# sourceMappingURL=param.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"param.d.ts","sourceRoot":"","sources":["../../src/query/param.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,MAAM,MAAM,mBAAmB,GAC3B,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,MAAM,GACN,OAAO,GACP,OAAO,GACP,OAAO,GACP,SAAS,GACT,SAAS,GACT,MAAM,GACN,MAAM,GACN,UAAU,GACV,YAAY,GACZ,MAAM,GACN,SAAS,MAAM,GAAG,CAAC;AAEvB,iEAAiE;AACjE,qBAAa,KAAK;aAEE,IAAI,EAAE,MAAM;aACZ,IAAI,EAAE,mBAAmB;gBADzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,mBAAmB;IAG3C,QAAQ,IAAI,MAAM;CAGnB;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,KAAK,CAEpE"}
@@ -0,0 +1,16 @@
1
+ /** A parameter reference that compiles to {name:Type} in SQL. */
2
+ export class Param {
3
+ name;
4
+ type;
5
+ constructor(name, type) {
6
+ this.name = name;
7
+ this.type = type;
8
+ }
9
+ toString() {
10
+ return `{${this.name}:${this.type}}`;
11
+ }
12
+ }
13
+ export function param(name, type) {
14
+ return new Param(name, type);
15
+ }
16
+ //# sourceMappingURL=param.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"param.js","sourceRoot":"","sources":["../../src/query/param.ts"],"names":[],"mappings":"AAoBA,iEAAiE;AACjE,MAAM,OAAO,KAAK;IAEE;IACA;IAFlB,YACkB,IAAY,EACZ,IAAyB;QADzB,SAAI,GAAJ,IAAI,CAAQ;QACZ,SAAI,GAAJ,IAAI,CAAqB;IACxC,CAAC;IAEJ,QAAQ;QACN,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC;IACvC,CAAC;CACF;AAED,MAAM,UAAU,KAAK,CAAC,IAAY,EAAE,IAAyB;IAC3D,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { DatabaseSchema, TableName } from './types.js';
2
+ import { type ClickHouseParamType, Param } from './param.js';
3
+ import { SelectBuilder } from './select-builder.js';
4
+ import { InsertBuilder } from './insert-builder.js';
5
+ import { fn } from './expressions.js';
6
+ export interface QueryBuilder<DB extends DatabaseSchema> {
7
+ selectFrom<T extends TableName<DB>>(table: T): SelectBuilder<DB, T>;
8
+ insertInto<T extends TableName<DB>>(table: T): InsertBuilder<DB, T>;
9
+ param(name: string, type: ClickHouseParamType): Param;
10
+ fn: typeof fn;
11
+ }
12
+ /**
13
+ * Create a type-safe query builder for your ClickHouse database.
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * import { createQueryBuilder } from 'chtype/query';
18
+ * import type { Database } from './chtype.generated';
19
+ *
20
+ * const qb = createQueryBuilder<Database>();
21
+ *
22
+ * const query = qb
23
+ * .selectFrom('users')
24
+ * .select(['user_id', 'name'])
25
+ * .where('user_id', '=', qb.param('id', 'String'))
26
+ * .compile();
27
+ * ```
28
+ */
29
+ export declare function createQueryBuilder<DB extends DatabaseSchema>(): QueryBuilder<DB>;
30
+ //# sourceMappingURL=query-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-builder.d.ts","sourceRoot":"","sources":["../../src/query/query-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAEtC,MAAM,WAAW,YAAY,CAAC,EAAE,SAAS,cAAc;IACrD,UAAU,CAAC,CAAC,SAAS,SAAS,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACpE,UAAU,CAAC,CAAC,SAAS,SAAS,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACpE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,KAAK,CAAC;IACtD,EAAE,EAAE,OAAO,EAAE,CAAC;CACf;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,SAAS,cAAc,KAAK,YAAY,CAAC,EAAE,CAAC,CAahF"}
@@ -0,0 +1,36 @@
1
+ import { Param } from './param.js';
2
+ import { SelectBuilder } from './select-builder.js';
3
+ import { InsertBuilder } from './insert-builder.js';
4
+ import { fn } from './expressions.js';
5
+ /**
6
+ * Create a type-safe query builder for your ClickHouse database.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { createQueryBuilder } from 'chtype/query';
11
+ * import type { Database } from './chtype.generated';
12
+ *
13
+ * const qb = createQueryBuilder<Database>();
14
+ *
15
+ * const query = qb
16
+ * .selectFrom('users')
17
+ * .select(['user_id', 'name'])
18
+ * .where('user_id', '=', qb.param('id', 'String'))
19
+ * .compile();
20
+ * ```
21
+ */
22
+ export function createQueryBuilder() {
23
+ return {
24
+ selectFrom(table) {
25
+ return new SelectBuilder(table);
26
+ },
27
+ insertInto(table) {
28
+ return new InsertBuilder(table);
29
+ },
30
+ param(name, type) {
31
+ return new Param(name, type);
32
+ },
33
+ fn,
34
+ };
35
+ }
36
+ //# sourceMappingURL=query-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-builder.js","sourceRoot":"","sources":["../../src/query/query-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,KAAK,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAStC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,UAAU,CAA0B,KAAQ;YAC1C,OAAO,IAAI,aAAa,CAAQ,KAAK,CAAC,CAAC;QACzC,CAAC;QACD,UAAU,CAA0B,KAAQ;YAC1C,OAAO,IAAI,aAAa,CAAQ,KAAK,CAAC,CAAC;QACzC,CAAC;QACD,KAAK,CAAC,IAAY,EAAE,IAAyB;YAC3C,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/B,CAAC;QACD,EAAE;KACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Type-safe SELECT query builder for ClickHouse.
3
+ *
4
+ * All values in WHERE/HAVING must be Param or Expression — raw string/number
5
+ * literals are NOT allowed to prevent SQL injection. Use `qb.param()` to create
6
+ * typed parameter placeholders.
7
+ */
8
+ import type { ColumnName, CompiledQuery, ComparisonOp, DatabaseSchema, JoinType, SetOp, SortDirection, TableName } from './types.js';
9
+ import { Expression } from './expressions.js';
10
+ import { Param } from './param.js';
11
+ export declare class SelectBuilder<DB extends DatabaseSchema, T extends TableName<DB> = TableName<DB>, TSelected extends string = string> {
12
+ private _table;
13
+ private _tableAlias?;
14
+ private _columns;
15
+ private _wheres;
16
+ private _joins;
17
+ private _groupBy;
18
+ private _havings;
19
+ private _orderBys;
20
+ private _limit;
21
+ private _offset;
22
+ private _final;
23
+ private _settings;
24
+ constructor(table: T);
25
+ /** Alias the main table (useful with JOINs). */
26
+ as(alias: string): this;
27
+ select<C extends ColumnName<DB, T>>(columns: (C | Expression)[]): SelectBuilder<DB, T, C>;
28
+ /** Add a WHERE condition. Values must be Param or Expression — no raw strings. */
29
+ where(column: ColumnName<DB, T> | Expression | string, op: ComparisonOp, value: Param | Expression): this;
30
+ /** Add a WHERE IN / NOT IN condition. Value must be an Array(...) Param. */
31
+ where(column: ColumnName<DB, T> | Expression | string, op: SetOp, value: Param | Expression): this;
32
+ /**
33
+ * Add a JOIN clause.
34
+ *
35
+ * @example
36
+ * ```ts
37
+ * qb.selectFrom('orders')
38
+ * .join('INNER JOIN', 'users', 'u', 'orders.user_id', 'u.user_id')
39
+ * .select([...])
40
+ * ```
41
+ */
42
+ join(type: JoinType, table: string, alias: string | undefined, onLeft: string, onRight: string): this;
43
+ /** Shorthand for INNER JOIN. */
44
+ innerJoin(table: string, alias: string | undefined, onLeft: string, onRight: string): this;
45
+ /** Shorthand for LEFT JOIN. */
46
+ leftJoin(table: string, alias: string | undefined, onLeft: string, onRight: string): this;
47
+ /** Shorthand for RIGHT JOIN. */
48
+ rightJoin(table: string, alias: string | undefined, onLeft: string, onRight: string): this;
49
+ /** Shorthand for CROSS JOIN (no ON clause — onLeft/onRight are ignored). */
50
+ crossJoin(table: string, alias?: string): this;
51
+ /** Shorthand for ANY LEFT JOIN (ClickHouse-specific). */
52
+ anyLeftJoin(table: string, alias: string | undefined, onLeft: string, onRight: string): this;
53
+ groupBy(...columns: (ColumnName<DB, T> | Expression | string)[]): this;
54
+ having(column: string | Expression, op: ComparisonOp, value: Param | Expression): this;
55
+ orderBy(column: ColumnName<DB, T> | Expression | string, direction?: SortDirection): this;
56
+ limit(n: number | Param): this;
57
+ offset(n: number | Param): this;
58
+ /** Add the FINAL modifier (use sparingly — only for debug/audit). */
59
+ final(): this;
60
+ /** Add SETTINGS clause. Keys are validated to prevent injection. */
61
+ settings(s: Record<string, string | number | boolean>): this;
62
+ compile(): CompiledQuery;
63
+ }
64
+ //# sourceMappingURL=select-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select-builder.d.ts","sourceRoot":"","sources":["../../src/query/select-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Type-safe SELECT query builder for ClickHouse.
3
+ *
4
+ * All values in WHERE/HAVING must be Param or Expression — raw string/number
5
+ * literals are NOT allowed to prevent SQL injection. Use `qb.param()` to create
6
+ * typed parameter placeholders.
7
+ */
8
+ import { Expression } from './expressions.js';
9
+ import { Param } from './param.js';
10
+ /** Valid ClickHouse setting name pattern. */
11
+ const VALID_SETTING_KEY = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
12
+ export class SelectBuilder {
13
+ _table;
14
+ _tableAlias;
15
+ _columns = [];
16
+ _wheres = [];
17
+ _joins = [];
18
+ _groupBy = [];
19
+ _havings = [];
20
+ _orderBys = [];
21
+ _limit = null;
22
+ _offset = null;
23
+ _final = false;
24
+ _settings = {};
25
+ constructor(table) {
26
+ this._table = table;
27
+ }
28
+ /** Alias the main table (useful with JOINs). */
29
+ as(alias) {
30
+ this._tableAlias = alias;
31
+ return this;
32
+ }
33
+ select(columns) {
34
+ this._columns = columns;
35
+ return this;
36
+ }
37
+ where(column, op, value) {
38
+ const col = column instanceof Expression ? column.sql : column;
39
+ this._wheres.push({ column: col, op, value });
40
+ return this;
41
+ }
42
+ /**
43
+ * Add a JOIN clause.
44
+ *
45
+ * @example
46
+ * ```ts
47
+ * qb.selectFrom('orders')
48
+ * .join('INNER JOIN', 'users', 'u', 'orders.user_id', 'u.user_id')
49
+ * .select([...])
50
+ * ```
51
+ */
52
+ join(type, table, alias, onLeft, onRight) {
53
+ this._joins.push({ type, table, alias, onLeft, onRight });
54
+ return this;
55
+ }
56
+ /** Shorthand for INNER JOIN. */
57
+ innerJoin(table, alias, onLeft, onRight) {
58
+ return this.join('INNER JOIN', table, alias, onLeft, onRight);
59
+ }
60
+ /** Shorthand for LEFT JOIN. */
61
+ leftJoin(table, alias, onLeft, onRight) {
62
+ return this.join('LEFT JOIN', table, alias, onLeft, onRight);
63
+ }
64
+ /** Shorthand for RIGHT JOIN. */
65
+ rightJoin(table, alias, onLeft, onRight) {
66
+ return this.join('RIGHT JOIN', table, alias, onLeft, onRight);
67
+ }
68
+ /** Shorthand for CROSS JOIN (no ON clause — onLeft/onRight are ignored). */
69
+ crossJoin(table, alias) {
70
+ this._joins.push({ type: 'CROSS JOIN', table, alias, onLeft: '', onRight: '' });
71
+ return this;
72
+ }
73
+ /** Shorthand for ANY LEFT JOIN (ClickHouse-specific). */
74
+ anyLeftJoin(table, alias, onLeft, onRight) {
75
+ return this.join('ANY LEFT JOIN', table, alias, onLeft, onRight);
76
+ }
77
+ groupBy(...columns) {
78
+ this._groupBy.push(...columns.map((c) => (c instanceof Expression ? c.sql : c)));
79
+ return this;
80
+ }
81
+ having(column, op, value) {
82
+ const col = column instanceof Expression ? column.sql : column;
83
+ this._havings.push({ column: col, op, value });
84
+ return this;
85
+ }
86
+ orderBy(column, direction = 'ASC') {
87
+ const expr = column instanceof Expression ? column.sql : column;
88
+ this._orderBys.push({ expr, direction });
89
+ return this;
90
+ }
91
+ limit(n) {
92
+ this._limit = n;
93
+ return this;
94
+ }
95
+ offset(n) {
96
+ this._offset = n;
97
+ return this;
98
+ }
99
+ /** Add the FINAL modifier (use sparingly — only for debug/audit). */
100
+ final() {
101
+ this._final = true;
102
+ return this;
103
+ }
104
+ /** Add SETTINGS clause. Keys are validated to prevent injection. */
105
+ settings(s) {
106
+ for (const key of Object.keys(s)) {
107
+ if (!VALID_SETTING_KEY.test(key)) {
108
+ throw new Error(`Invalid ClickHouse setting name: "${key}"`);
109
+ }
110
+ }
111
+ Object.assign(this._settings, s);
112
+ return this;
113
+ }
114
+ compile() {
115
+ const params = {};
116
+ const parts = [];
117
+ const selectList = this._columns.length > 0
118
+ ? this._columns.map((c) => (c instanceof Expression ? c.toString() : c)).join(', ')
119
+ : '*';
120
+ parts.push(`SELECT ${selectList}`);
121
+ const tableName = this._table;
122
+ const tableRef = this._tableAlias ? `${tableName} AS ${this._tableAlias}` : tableName;
123
+ const finalMod = this._final ? ' FINAL' : '';
124
+ parts.push(`FROM ${tableRef}${finalMod}`);
125
+ for (const j of this._joins) {
126
+ const joinTable = j.alias ? `${j.table} AS ${j.alias}` : j.table;
127
+ if (j.type === 'CROSS JOIN') {
128
+ parts.push(`CROSS JOIN ${joinTable}`);
129
+ }
130
+ else {
131
+ parts.push(`${j.type} ${joinTable} ON ${j.onLeft} = ${j.onRight}`);
132
+ }
133
+ }
134
+ if (this._wheres.length > 0) {
135
+ const conditions = this._wheres.map((w) => {
136
+ const val = renderValue(w.value, params);
137
+ return `${w.column} ${w.op} ${val}`;
138
+ });
139
+ parts.push(`WHERE ${conditions.join(' AND ')}`);
140
+ }
141
+ if (this._groupBy.length > 0) {
142
+ parts.push(`GROUP BY ${this._groupBy.join(', ')}`);
143
+ }
144
+ if (this._havings.length > 0) {
145
+ const conditions = this._havings.map((h) => {
146
+ const val = renderValue(h.value, params);
147
+ return `${h.column} ${h.op} ${val}`;
148
+ });
149
+ parts.push(`HAVING ${conditions.join(' AND ')}`);
150
+ }
151
+ if (this._orderBys.length > 0) {
152
+ const clauses = this._orderBys.map((o) => `${o.expr} ${o.direction}`);
153
+ parts.push(`ORDER BY ${clauses.join(', ')}`);
154
+ }
155
+ if (this._limit !== null) {
156
+ parts.push(`LIMIT ${renderValue(this._limit, params)}`);
157
+ }
158
+ if (this._offset !== null) {
159
+ parts.push(`OFFSET ${renderValue(this._offset, params)}`);
160
+ }
161
+ const settingsEntries = Object.entries(this._settings);
162
+ if (settingsEntries.length > 0) {
163
+ const settingsStr = settingsEntries
164
+ .map(([k, v]) => `${k} = ${typeof v === 'string' ? `'${v}'` : v}`)
165
+ .join(', ');
166
+ parts.push(`SETTINGS ${settingsStr}`);
167
+ }
168
+ return { sql: parts.join('\n'), params };
169
+ }
170
+ }
171
+ function renderValue(value, params) {
172
+ if (value instanceof Param) {
173
+ params[value.name] = undefined;
174
+ return value.toString();
175
+ }
176
+ if (value instanceof Expression) {
177
+ return value.sql;
178
+ }
179
+ // Only numbers reach here (from limit/offset)
180
+ return String(value);
181
+ }
182
+ //# sourceMappingURL=select-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select-builder.js","sourceRoot":"","sources":["../../src/query/select-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /** Minimal shape that a generated Database interface must satisfy. */
2
+ export interface DatabaseSchema {
3
+ [tableName: string]: {
4
+ row: Record<string, unknown>;
5
+ insert: Record<string, unknown>;
6
+ engine: string;
7
+ versionColumn: string | null;
8
+ };
9
+ }
10
+ export type TableName<DB extends DatabaseSchema> = keyof DB & string;
11
+ export type RowType<DB extends DatabaseSchema, T extends TableName<DB>> = DB[T]['row'];
12
+ export type InsertType<DB extends DatabaseSchema, T extends TableName<DB>> = DB[T]['insert'];
13
+ export type ColumnName<DB extends DatabaseSchema, T extends TableName<DB>> = keyof RowType<DB, T> & string;
14
+ /** A compiled query ready for execution. */
15
+ export interface CompiledQuery {
16
+ /** The parameterized SQL string with {name:Type} placeholders. */
17
+ sql: string;
18
+ /** Registry of parameter names that appear in the query. Values are undefined (filled at execution time). */
19
+ params: Record<string, unknown>;
20
+ }
21
+ export type SortDirection = 'ASC' | 'DESC';
22
+ /** Comparison operators for scalar values. */
23
+ export type ComparisonOp = '=' | '!=' | '>' | '<' | '>=' | '<=' | 'LIKE';
24
+ /** Set membership operators — require Array(...) param types. */
25
+ export type SetOp = 'IN' | 'NOT IN';
26
+ /** All WHERE operators. */
27
+ export type WhereOp = ComparisonOp | SetOp;
28
+ /** ClickHouse JOIN types. */
29
+ export type JoinType = 'JOIN' | 'INNER JOIN' | 'LEFT JOIN' | 'RIGHT JOIN' | 'FULL JOIN' | 'CROSS JOIN' | 'LEFT OUTER JOIN' | 'RIGHT OUTER JOIN' | 'FULL OUTER JOIN' | 'ANY JOIN' | 'ANY LEFT JOIN' | 'ANY RIGHT JOIN' | 'ANY INNER JOIN' | 'ALL JOIN' | 'ALL LEFT JOIN' | 'ALL RIGHT JOIN' | 'ALL INNER JOIN' | 'ASOF JOIN' | 'ASOF LEFT JOIN';
30
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/query/types.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,WAAW,cAAc;IAC7B,CAAC,SAAS,EAAE,MAAM,GAAG;QACnB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;KAC9B,CAAC;CACH;AAED,MAAM,MAAM,SAAS,CAAC,EAAE,SAAS,cAAc,IAAI,MAAM,EAAE,GAAG,MAAM,CAAC;AACrE,MAAM,MAAM,OAAO,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC,SAAS,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACvF,MAAM,MAAM,UAAU,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC,SAAS,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC7F,MAAM,MAAM,UAAU,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC,SAAS,SAAS,CAAC,EAAE,CAAC,IAAI,MAAM,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC;AAE3G,4CAA4C;AAC5C,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,GAAG,EAAE,MAAM,CAAC;IACZ,6GAA6G;IAC7G,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,CAAC;AAE3C,8CAA8C;AAC9C,MAAM,MAAM,YAAY,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;AAEzE,iEAAiE;AACjE,MAAM,MAAM,KAAK,GAAG,IAAI,GAAG,QAAQ,CAAC;AAEpC,2BAA2B;AAC3B,MAAM,MAAM,OAAO,GAAG,YAAY,GAAG,KAAK,CAAC;AAE3C,6BAA6B;AAC7B,MAAM,MAAM,QAAQ,GAChB,MAAM,GACN,YAAY,GACZ,WAAW,GACX,YAAY,GACZ,WAAW,GACX,YAAY,GACZ,iBAAiB,GACjB,kBAAkB,GAClB,iBAAiB,GACjB,UAAU,GACV,eAAe,GACf,gBAAgB,GAChB,gBAAgB,GAChB,UAAU,GACV,eAAe,GACf,gBAAgB,GAChB,gBAAgB,GAChB,WAAW,GACX,gBAAgB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/query/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "@jantokic/chtype",
3
+ "version": "0.1.0",
4
+ "description": "Type-safe ClickHouse toolkit for TypeScript — schema codegen, query builder, and enhanced client",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "chtype": "./dist/codegen/cli.js"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "import": "./dist/index.js",
14
+ "types": "./dist/index.d.ts"
15
+ },
16
+ "./codegen": {
17
+ "import": "./dist/codegen/index.js",
18
+ "types": "./dist/codegen/index.d.ts"
19
+ },
20
+ "./query": {
21
+ "import": "./dist/query/index.js",
22
+ "types": "./dist/query/index.d.ts"
23
+ },
24
+ "./client": {
25
+ "import": "./dist/client/index.js",
26
+ "types": "./dist/client/index.d.ts"
27
+ }
28
+ },
29
+ "scripts": {
30
+ "build": "tsc",
31
+ "test": "bun test",
32
+ "typecheck": "tsc --noEmit",
33
+ "check": "bun test && tsc --noEmit"
34
+ },
35
+ "dependencies": {
36
+ "@clickhouse/client": "^1.8.0",
37
+ "citty": "^0.1.6",
38
+ "zod": "^3.23.0"
39
+ },
40
+ "devDependencies": {
41
+ "@types/bun": "^1.2.0",
42
+ "typescript": "^5.7.0"
43
+ },
44
+ "files": ["dist", "README.md", "LICENSE"],
45
+ "license": "MIT",
46
+ "keywords": [
47
+ "clickhouse",
48
+ "typescript",
49
+ "codegen",
50
+ "type-safe",
51
+ "query-builder",
52
+ "orm",
53
+ "schema",
54
+ "sql"
55
+ ],
56
+ "repository": {
57
+ "type": "git",
58
+ "url": "https://github.com/jantokic/chtype.git"
59
+ },
60
+ "homepage": "https://github.com/jantokic/chtype",
61
+ "author": "Jan Tokic",
62
+ "engines": {
63
+ "node": ">=20.0.0"
64
+ }
65
+ }