@tinybirdco/sdk 0.0.3 → 0.0.6

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 (122) hide show
  1. package/README.md +87 -14
  2. package/dist/api/deploy.d.ts +41 -3
  3. package/dist/api/deploy.d.ts.map +1 -1
  4. package/dist/api/deploy.js +141 -19
  5. package/dist/api/deploy.js.map +1 -1
  6. package/dist/api/deploy.test.js +77 -29
  7. package/dist/api/deploy.test.js.map +1 -1
  8. package/dist/api/local.d.ts +92 -0
  9. package/dist/api/local.d.ts.map +1 -0
  10. package/dist/api/local.js +176 -0
  11. package/dist/api/local.js.map +1 -0
  12. package/dist/api/local.test.d.ts +2 -0
  13. package/dist/api/local.test.d.ts.map +1 -0
  14. package/dist/api/local.test.js +182 -0
  15. package/dist/api/local.test.js.map +1 -0
  16. package/dist/api/resources.d.ts +178 -0
  17. package/dist/api/resources.d.ts.map +1 -0
  18. package/dist/api/resources.js +244 -0
  19. package/dist/api/resources.js.map +1 -0
  20. package/dist/api/resources.test.d.ts +2 -0
  21. package/dist/api/resources.test.d.ts.map +1 -0
  22. package/dist/api/resources.test.js +255 -0
  23. package/dist/api/resources.test.js.map +1 -0
  24. package/dist/cli/commands/build.d.ts +6 -4
  25. package/dist/cli/commands/build.d.ts.map +1 -1
  26. package/dist/cli/commands/build.js +95 -47
  27. package/dist/cli/commands/build.js.map +1 -1
  28. package/dist/cli/commands/deploy.d.ts +39 -0
  29. package/dist/cli/commands/deploy.d.ts.map +1 -0
  30. package/dist/cli/commands/deploy.js +90 -0
  31. package/dist/cli/commands/deploy.js.map +1 -0
  32. package/dist/cli/commands/dev.d.ts +9 -2
  33. package/dist/cli/commands/dev.d.ts.map +1 -1
  34. package/dist/cli/commands/dev.js +60 -31
  35. package/dist/cli/commands/dev.js.map +1 -1
  36. package/dist/cli/commands/init.d.ts +24 -1
  37. package/dist/cli/commands/init.d.ts.map +1 -1
  38. package/dist/cli/commands/init.js +174 -23
  39. package/dist/cli/commands/init.js.map +1 -1
  40. package/dist/cli/commands/init.test.js +190 -30
  41. package/dist/cli/commands/init.test.js.map +1 -1
  42. package/dist/cli/config.d.ts +14 -0
  43. package/dist/cli/config.d.ts.map +1 -1
  44. package/dist/cli/config.js +7 -0
  45. package/dist/cli/config.js.map +1 -1
  46. package/dist/cli/config.test.js +29 -0
  47. package/dist/cli/config.test.js.map +1 -1
  48. package/dist/cli/index.js +107 -11
  49. package/dist/cli/index.js.map +1 -1
  50. package/dist/cli/utils/package-manager.d.ts +8 -0
  51. package/dist/cli/utils/package-manager.d.ts.map +1 -0
  52. package/dist/cli/utils/package-manager.js +45 -0
  53. package/dist/cli/utils/package-manager.js.map +1 -0
  54. package/dist/cli/utils/package-manager.test.d.ts +2 -0
  55. package/dist/cli/utils/package-manager.test.d.ts.map +1 -0
  56. package/dist/cli/utils/package-manager.test.js +85 -0
  57. package/dist/cli/utils/package-manager.test.js.map +1 -0
  58. package/dist/codegen/index.d.ts +39 -0
  59. package/dist/codegen/index.d.ts.map +1 -0
  60. package/dist/codegen/index.js +300 -0
  61. package/dist/codegen/index.js.map +1 -0
  62. package/dist/codegen/index.test.d.ts +2 -0
  63. package/dist/codegen/index.test.d.ts.map +1 -0
  64. package/dist/codegen/index.test.js +310 -0
  65. package/dist/codegen/index.test.js.map +1 -0
  66. package/dist/codegen/type-mapper.d.ts +20 -0
  67. package/dist/codegen/type-mapper.d.ts.map +1 -0
  68. package/dist/codegen/type-mapper.js +238 -0
  69. package/dist/codegen/type-mapper.js.map +1 -0
  70. package/dist/codegen/type-mapper.test.d.ts +2 -0
  71. package/dist/codegen/type-mapper.test.d.ts.map +1 -0
  72. package/dist/codegen/type-mapper.test.js +167 -0
  73. package/dist/codegen/type-mapper.test.js.map +1 -0
  74. package/dist/codegen/utils.d.ts +46 -0
  75. package/dist/codegen/utils.d.ts.map +1 -0
  76. package/dist/codegen/utils.js +141 -0
  77. package/dist/codegen/utils.js.map +1 -0
  78. package/dist/codegen/utils.test.d.ts +2 -0
  79. package/dist/codegen/utils.test.d.ts.map +1 -0
  80. package/dist/codegen/utils.test.js +178 -0
  81. package/dist/codegen/utils.test.js.map +1 -0
  82. package/dist/generator/index.d.ts +3 -0
  83. package/dist/generator/index.d.ts.map +1 -1
  84. package/dist/generator/index.js +17 -1
  85. package/dist/generator/index.js.map +1 -1
  86. package/dist/generator/index.test.js +104 -1
  87. package/dist/generator/index.test.js.map +1 -1
  88. package/dist/generator/loader.d.ts +15 -0
  89. package/dist/generator/loader.d.ts.map +1 -1
  90. package/dist/generator/loader.js +24 -0
  91. package/dist/generator/loader.js.map +1 -1
  92. package/dist/test/handlers.d.ts +49 -0
  93. package/dist/test/handlers.d.ts.map +1 -1
  94. package/dist/test/handlers.js +45 -0
  95. package/dist/test/handlers.js.map +1 -1
  96. package/package.json +4 -2
  97. package/src/api/deploy.test.ts +135 -34
  98. package/src/api/deploy.ts +203 -23
  99. package/src/api/local.test.ts +250 -0
  100. package/src/api/local.ts +270 -0
  101. package/src/api/resources.test.ts +332 -0
  102. package/src/api/resources.ts +554 -0
  103. package/src/cli/commands/build.ts +115 -53
  104. package/src/cli/commands/deploy.ts +126 -0
  105. package/src/cli/commands/dev.ts +81 -36
  106. package/src/cli/commands/init.test.ts +239 -30
  107. package/src/cli/commands/init.ts +243 -26
  108. package/src/cli/config.test.ts +47 -0
  109. package/src/cli/config.ts +20 -0
  110. package/src/cli/index.ts +120 -11
  111. package/src/cli/utils/package-manager.test.ts +118 -0
  112. package/src/cli/utils/package-manager.ts +44 -0
  113. package/src/codegen/index.test.ts +367 -0
  114. package/src/codegen/index.ts +379 -0
  115. package/src/codegen/type-mapper.test.ts +224 -0
  116. package/src/codegen/type-mapper.ts +265 -0
  117. package/src/codegen/utils.test.ts +221 -0
  118. package/src/codegen/utils.ts +174 -0
  119. package/src/generator/index.test.ts +121 -1
  120. package/src/generator/index.ts +19 -1
  121. package/src/generator/loader.ts +43 -0
  122. package/src/test/handlers.ts +58 -0
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Type mapping from ClickHouse types to TypeScript SDK validators
3
+ */
4
+ /**
5
+ * Map a ClickHouse type to a t.* validator call
6
+ *
7
+ * Handles:
8
+ * - Basic types: String, Int32, Float64, DateTime, etc.
9
+ * - Nullable wrapper: Nullable(String) -> t.string().nullable()
10
+ * - LowCardinality wrapper: LowCardinality(String) -> t.string().lowCardinality()
11
+ * - Parameterized types: DateTime('UTC'), FixedString(10), Decimal(10, 2)
12
+ * - Complex types: Array(String), Map(String, Int32)
13
+ * - Aggregate functions: SimpleAggregateFunction(sum, UInt64)
14
+ */
15
+ export declare function clickhouseTypeToValidator(chType: string): string;
16
+ /**
17
+ * Map a pipe parameter type to a p.* validator call
18
+ */
19
+ export declare function paramTypeToValidator(paramType: string, defaultValue?: string | number, required?: boolean): string;
20
+ //# 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;;GAEG;AAgBH;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA0KhE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,EAC9B,QAAQ,GAAE,OAAc,GACvB,MAAM,CAwDR"}
@@ -0,0 +1,238 @@
1
+ /**
2
+ * Type mapping from ClickHouse types to TypeScript SDK validators
3
+ */
4
+ /**
5
+ * Parse enum values from an enum type string
6
+ * e.g., "'a' = 1, 'b' = 2" -> ["a", "b"]
7
+ */
8
+ function parseEnumValues(enumContent) {
9
+ const values = [];
10
+ const regex = /'([^']+)'\s*=\s*\d+/g;
11
+ let match;
12
+ while ((match = regex.exec(enumContent)) !== null) {
13
+ values.push(match[1]);
14
+ }
15
+ return values;
16
+ }
17
+ /**
18
+ * Map a ClickHouse type to a t.* validator call
19
+ *
20
+ * Handles:
21
+ * - Basic types: String, Int32, Float64, DateTime, etc.
22
+ * - Nullable wrapper: Nullable(String) -> t.string().nullable()
23
+ * - LowCardinality wrapper: LowCardinality(String) -> t.string().lowCardinality()
24
+ * - Parameterized types: DateTime('UTC'), FixedString(10), Decimal(10, 2)
25
+ * - Complex types: Array(String), Map(String, Int32)
26
+ * - Aggregate functions: SimpleAggregateFunction(sum, UInt64)
27
+ */
28
+ export function clickhouseTypeToValidator(chType) {
29
+ // Trim whitespace
30
+ chType = chType.trim();
31
+ // Handle Nullable wrapper
32
+ const nullableMatch = chType.match(/^Nullable\((.+)\)$/);
33
+ if (nullableMatch) {
34
+ const innerType = clickhouseTypeToValidator(nullableMatch[1]);
35
+ return `${innerType}.nullable()`;
36
+ }
37
+ // Handle LowCardinality wrapper
38
+ const lowCardMatch = chType.match(/^LowCardinality\((.+)\)$/);
39
+ if (lowCardMatch) {
40
+ const innerType = clickhouseTypeToValidator(lowCardMatch[1]);
41
+ // If inner type already has .nullable(), we need to handle this specially
42
+ // LowCardinality(Nullable(X)) should become t.X().nullable().lowCardinality()
43
+ // But the recursive call already returns t.X().nullable()
44
+ return `${innerType}.lowCardinality()`;
45
+ }
46
+ // Simple type mappings
47
+ const simpleTypeMap = {
48
+ String: "t.string()",
49
+ UUID: "t.uuid()",
50
+ Int8: "t.int8()",
51
+ Int16: "t.int16()",
52
+ Int32: "t.int32()",
53
+ Int64: "t.int64()",
54
+ Int128: "t.int128()",
55
+ Int256: "t.int256()",
56
+ UInt8: "t.uint8()",
57
+ UInt16: "t.uint16()",
58
+ UInt32: "t.uint32()",
59
+ UInt64: "t.uint64()",
60
+ UInt128: "t.uint128()",
61
+ UInt256: "t.uint256()",
62
+ Float32: "t.float32()",
63
+ Float64: "t.float64()",
64
+ Bool: "t.bool()",
65
+ Boolean: "t.bool()",
66
+ Date: "t.date()",
67
+ Date32: "t.date32()",
68
+ DateTime: "t.dateTime()",
69
+ JSON: "t.json()",
70
+ Object: "t.json()",
71
+ IPv4: "t.ipv4()",
72
+ IPv6: "t.ipv6()",
73
+ };
74
+ if (simpleTypeMap[chType]) {
75
+ return simpleTypeMap[chType];
76
+ }
77
+ // DateTime with timezone: DateTime('UTC')
78
+ const dtTzMatch = chType.match(/^DateTime\('([^']+)'\)$/);
79
+ if (dtTzMatch) {
80
+ return `t.dateTime("${dtTzMatch[1]}")`;
81
+ }
82
+ // DateTime64 with precision and optional timezone
83
+ const dt64Match = chType.match(/^DateTime64\((\d+)(?:,\s*'([^']+)')?\)$/);
84
+ if (dt64Match) {
85
+ const precision = dt64Match[1];
86
+ const tz = dt64Match[2];
87
+ if (tz) {
88
+ return `t.dateTime64(${precision}, "${tz}")`;
89
+ }
90
+ return `t.dateTime64(${precision})`;
91
+ }
92
+ // DateTime64 without precision (defaults to 3)
93
+ if (chType === "DateTime64") {
94
+ return "t.dateTime64(3)";
95
+ }
96
+ // FixedString(N)
97
+ const fixedMatch = chType.match(/^FixedString\((\d+)\)$/);
98
+ if (fixedMatch) {
99
+ return `t.fixedString(${fixedMatch[1]})`;
100
+ }
101
+ // Decimal(P, S) or Decimal(P)
102
+ const decMatch = chType.match(/^Decimal\((\d+)(?:,\s*(\d+))?\)$/);
103
+ if (decMatch) {
104
+ const precision = decMatch[1];
105
+ const scale = decMatch[2] ?? "0";
106
+ return `t.decimal(${precision}, ${scale})`;
107
+ }
108
+ // Decimal32, Decimal64, Decimal128, Decimal256 with scale
109
+ const decNMatch = chType.match(/^Decimal(32|64|128|256)\((\d+)\)$/);
110
+ if (decNMatch) {
111
+ const bits = decNMatch[1];
112
+ const scale = decNMatch[2];
113
+ const precisionMap = {
114
+ "32": 9,
115
+ "64": 18,
116
+ "128": 38,
117
+ "256": 76,
118
+ };
119
+ return `t.decimal(${precisionMap[bits]}, ${scale})`;
120
+ }
121
+ // Array(T)
122
+ const arrMatch = chType.match(/^Array\((.+)\)$/);
123
+ if (arrMatch) {
124
+ const innerType = clickhouseTypeToValidator(arrMatch[1]);
125
+ return `t.array(${innerType})`;
126
+ }
127
+ // Tuple(T1, T2, ...) - simplified handling
128
+ const tupleMatch = chType.match(/^Tuple\((.+)\)$/);
129
+ if (tupleMatch) {
130
+ // For complex tuples, we just use a JSON type
131
+ // TODO: Could parse and generate t.tuple() for simple cases
132
+ return `t.json() /* Tuple: ${chType} */`;
133
+ }
134
+ // Map(K, V)
135
+ const mapMatch = chType.match(/^Map\(([^,]+),\s*(.+)\)$/);
136
+ if (mapMatch) {
137
+ const keyType = clickhouseTypeToValidator(mapMatch[1]);
138
+ const valueType = clickhouseTypeToValidator(mapMatch[2]);
139
+ return `t.map(${keyType}, ${valueType})`;
140
+ }
141
+ // Enum8('a' = 1, 'b' = 2)
142
+ const enum8Match = chType.match(/^Enum8\((.+)\)$/);
143
+ if (enum8Match) {
144
+ const values = parseEnumValues(enum8Match[1]);
145
+ if (values.length > 0) {
146
+ return `t.enum8(${values.map((v) => `"${v}"`).join(", ")})`;
147
+ }
148
+ return `t.string() /* Enum8 */`;
149
+ }
150
+ // Enum16('a' = 1, 'b' = 2)
151
+ const enum16Match = chType.match(/^Enum16\((.+)\)$/);
152
+ if (enum16Match) {
153
+ const values = parseEnumValues(enum16Match[1]);
154
+ if (values.length > 0) {
155
+ return `t.enum16(${values.map((v) => `"${v}"`).join(", ")})`;
156
+ }
157
+ return `t.string() /* Enum16 */`;
158
+ }
159
+ // SimpleAggregateFunction(func, T)
160
+ const simpleAggMatch = chType.match(/^SimpleAggregateFunction\((\w+),\s*(.+)\)$/);
161
+ if (simpleAggMatch) {
162
+ const func = simpleAggMatch[1];
163
+ const innerType = clickhouseTypeToValidator(simpleAggMatch[2]);
164
+ return `t.simpleAggregateFunction("${func}", ${innerType})`;
165
+ }
166
+ // AggregateFunction(func, T)
167
+ const aggMatch = chType.match(/^AggregateFunction\((\w+),\s*(.+)\)$/);
168
+ if (aggMatch) {
169
+ const func = aggMatch[1];
170
+ const innerType = clickhouseTypeToValidator(aggMatch[2]);
171
+ return `t.aggregateFunction("${func}", ${innerType})`;
172
+ }
173
+ // Nested - treat as JSON
174
+ if (chType.startsWith("Nested(")) {
175
+ return `t.json() /* ${chType} */`;
176
+ }
177
+ // Fallback for unknown types
178
+ return `t.string() /* TODO: Unknown type: ${chType} */`;
179
+ }
180
+ /**
181
+ * Map a pipe parameter type to a p.* validator call
182
+ */
183
+ export function paramTypeToValidator(paramType, defaultValue, required = true) {
184
+ // Normalize type
185
+ paramType = paramType.trim();
186
+ // Simple type mappings
187
+ const typeMap = {
188
+ String: "p.string()",
189
+ UUID: "p.uuid()",
190
+ Int8: "p.int8()",
191
+ Int16: "p.int16()",
192
+ Int32: "p.int32()",
193
+ Int64: "p.int64()",
194
+ UInt8: "p.uint8()",
195
+ UInt16: "p.uint16()",
196
+ UInt32: "p.uint32()",
197
+ UInt64: "p.uint64()",
198
+ Float32: "p.float32()",
199
+ Float64: "p.float64()",
200
+ Boolean: "p.boolean()",
201
+ Bool: "p.boolean()",
202
+ Date: "p.date()",
203
+ DateTime: "p.dateTime()",
204
+ DateTime64: "p.dateTime64()",
205
+ };
206
+ let validator = typeMap[paramType];
207
+ // Handle parameterized DateTime types
208
+ if (!validator) {
209
+ if (paramType.startsWith("DateTime64")) {
210
+ validator = "p.dateTime64()";
211
+ }
212
+ else if (paramType.startsWith("DateTime")) {
213
+ validator = "p.dateTime()";
214
+ }
215
+ else if (paramType.startsWith("Array")) {
216
+ // Array parameters - default to string array
217
+ validator = "p.array(p.string())";
218
+ }
219
+ else {
220
+ // Default to string for unknown types
221
+ validator = "p.string()";
222
+ }
223
+ }
224
+ // Add optional with default if not required or has a default value
225
+ if (!required || defaultValue !== undefined) {
226
+ if (defaultValue !== undefined) {
227
+ const formattedDefault = typeof defaultValue === "string" ? `"${defaultValue}"` : defaultValue;
228
+ // Replace () with .optional(value)
229
+ validator = validator.replace(/\(\)$/, `().optional(${formattedDefault})`);
230
+ }
231
+ else {
232
+ // Just make it optional without a default
233
+ validator = validator.replace(/\(\)$/, "().optional()");
234
+ }
235
+ }
236
+ return validator;
237
+ }
238
+ //# 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=type-mapper.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-mapper.test.d.ts","sourceRoot":"","sources":["../../src/codegen/type-mapper.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,167 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { clickhouseTypeToValidator, paramTypeToValidator } from "./type-mapper.js";
3
+ describe("clickhouseTypeToValidator", () => {
4
+ describe("simple types", () => {
5
+ it("maps String to t.string()", () => {
6
+ expect(clickhouseTypeToValidator("String")).toBe("t.string()");
7
+ });
8
+ it("maps UUID to t.uuid()", () => {
9
+ expect(clickhouseTypeToValidator("UUID")).toBe("t.uuid()");
10
+ });
11
+ it("maps integer types", () => {
12
+ expect(clickhouseTypeToValidator("Int8")).toBe("t.int8()");
13
+ expect(clickhouseTypeToValidator("Int16")).toBe("t.int16()");
14
+ expect(clickhouseTypeToValidator("Int32")).toBe("t.int32()");
15
+ expect(clickhouseTypeToValidator("Int64")).toBe("t.int64()");
16
+ expect(clickhouseTypeToValidator("Int128")).toBe("t.int128()");
17
+ expect(clickhouseTypeToValidator("Int256")).toBe("t.int256()");
18
+ });
19
+ it("maps unsigned integer types", () => {
20
+ expect(clickhouseTypeToValidator("UInt8")).toBe("t.uint8()");
21
+ expect(clickhouseTypeToValidator("UInt16")).toBe("t.uint16()");
22
+ expect(clickhouseTypeToValidator("UInt32")).toBe("t.uint32()");
23
+ expect(clickhouseTypeToValidator("UInt64")).toBe("t.uint64()");
24
+ expect(clickhouseTypeToValidator("UInt128")).toBe("t.uint128()");
25
+ expect(clickhouseTypeToValidator("UInt256")).toBe("t.uint256()");
26
+ });
27
+ it("maps float types", () => {
28
+ expect(clickhouseTypeToValidator("Float32")).toBe("t.float32()");
29
+ expect(clickhouseTypeToValidator("Float64")).toBe("t.float64()");
30
+ });
31
+ it("maps Bool to t.bool()", () => {
32
+ expect(clickhouseTypeToValidator("Bool")).toBe("t.bool()");
33
+ expect(clickhouseTypeToValidator("Boolean")).toBe("t.bool()");
34
+ });
35
+ it("maps date types", () => {
36
+ expect(clickhouseTypeToValidator("Date")).toBe("t.date()");
37
+ expect(clickhouseTypeToValidator("Date32")).toBe("t.date32()");
38
+ expect(clickhouseTypeToValidator("DateTime")).toBe("t.dateTime()");
39
+ });
40
+ it("maps JSON to t.json()", () => {
41
+ expect(clickhouseTypeToValidator("JSON")).toBe("t.json()");
42
+ });
43
+ it("maps IP types", () => {
44
+ expect(clickhouseTypeToValidator("IPv4")).toBe("t.ipv4()");
45
+ expect(clickhouseTypeToValidator("IPv6")).toBe("t.ipv6()");
46
+ });
47
+ });
48
+ describe("Nullable wrapper", () => {
49
+ it("adds .nullable() for Nullable(String)", () => {
50
+ expect(clickhouseTypeToValidator("Nullable(String)")).toBe("t.string().nullable()");
51
+ });
52
+ it("adds .nullable() for Nullable(Int32)", () => {
53
+ expect(clickhouseTypeToValidator("Nullable(Int32)")).toBe("t.int32().nullable()");
54
+ });
55
+ it("adds .nullable() for Nullable(DateTime)", () => {
56
+ expect(clickhouseTypeToValidator("Nullable(DateTime)")).toBe("t.dateTime().nullable()");
57
+ });
58
+ });
59
+ describe("LowCardinality wrapper", () => {
60
+ it("adds .lowCardinality() for LowCardinality(String)", () => {
61
+ expect(clickhouseTypeToValidator("LowCardinality(String)")).toBe("t.string().lowCardinality()");
62
+ });
63
+ it("handles LowCardinality(Nullable(String))", () => {
64
+ expect(clickhouseTypeToValidator("LowCardinality(Nullable(String))")).toBe("t.string().nullable().lowCardinality()");
65
+ });
66
+ });
67
+ describe("parameterized types", () => {
68
+ it("handles DateTime with timezone", () => {
69
+ expect(clickhouseTypeToValidator("DateTime('UTC')")).toBe('t.dateTime("UTC")');
70
+ expect(clickhouseTypeToValidator("DateTime('America/New_York')")).toBe('t.dateTime("America/New_York")');
71
+ });
72
+ it("handles DateTime64 with precision", () => {
73
+ expect(clickhouseTypeToValidator("DateTime64(3)")).toBe("t.dateTime64(3)");
74
+ expect(clickhouseTypeToValidator("DateTime64(6)")).toBe("t.dateTime64(6)");
75
+ });
76
+ it("handles DateTime64 with precision and timezone", () => {
77
+ expect(clickhouseTypeToValidator("DateTime64(3, 'UTC')")).toBe('t.dateTime64(3, "UTC")');
78
+ });
79
+ it("handles FixedString(N)", () => {
80
+ expect(clickhouseTypeToValidator("FixedString(10)")).toBe("t.fixedString(10)");
81
+ expect(clickhouseTypeToValidator("FixedString(255)")).toBe("t.fixedString(255)");
82
+ });
83
+ it("handles Decimal(P, S)", () => {
84
+ expect(clickhouseTypeToValidator("Decimal(10, 2)")).toBe("t.decimal(10, 2)");
85
+ expect(clickhouseTypeToValidator("Decimal(18, 4)")).toBe("t.decimal(18, 4)");
86
+ });
87
+ });
88
+ describe("complex types", () => {
89
+ it("handles Array(T)", () => {
90
+ expect(clickhouseTypeToValidator("Array(String)")).toBe("t.array(t.string())");
91
+ expect(clickhouseTypeToValidator("Array(Int32)")).toBe("t.array(t.int32())");
92
+ });
93
+ it("handles nested Array types", () => {
94
+ expect(clickhouseTypeToValidator("Array(Array(String))")).toBe("t.array(t.array(t.string()))");
95
+ });
96
+ it("handles Array with Nullable elements", () => {
97
+ expect(clickhouseTypeToValidator("Array(Nullable(String))")).toBe("t.array(t.string().nullable())");
98
+ });
99
+ it("handles Map(K, V)", () => {
100
+ expect(clickhouseTypeToValidator("Map(String, Int32)")).toBe("t.map(t.string(), t.int32())");
101
+ });
102
+ });
103
+ describe("enum types", () => {
104
+ it("handles Enum8", () => {
105
+ expect(clickhouseTypeToValidator("Enum8('a' = 1, 'b' = 2)")).toBe('t.enum8("a", "b")');
106
+ });
107
+ it("handles Enum16", () => {
108
+ expect(clickhouseTypeToValidator("Enum16('pending' = 1, 'active' = 2, 'done' = 3)")).toBe('t.enum16("pending", "active", "done")');
109
+ });
110
+ });
111
+ describe("aggregate function types", () => {
112
+ it("handles SimpleAggregateFunction", () => {
113
+ expect(clickhouseTypeToValidator("SimpleAggregateFunction(sum, UInt64)")).toBe('t.simpleAggregateFunction("sum", t.uint64())');
114
+ });
115
+ it("handles AggregateFunction", () => {
116
+ expect(clickhouseTypeToValidator("AggregateFunction(uniq, String)")).toBe('t.aggregateFunction("uniq", t.string())');
117
+ });
118
+ });
119
+ describe("unknown types", () => {
120
+ it("returns string with TODO comment for unknown types", () => {
121
+ expect(clickhouseTypeToValidator("UnknownType")).toBe("t.string() /* TODO: Unknown type: UnknownType */");
122
+ });
123
+ });
124
+ });
125
+ describe("paramTypeToValidator", () => {
126
+ describe("simple types", () => {
127
+ it("maps String to p.string()", () => {
128
+ expect(paramTypeToValidator("String")).toBe("p.string()");
129
+ });
130
+ it("maps Int32 to p.int32()", () => {
131
+ expect(paramTypeToValidator("Int32")).toBe("p.int32()");
132
+ });
133
+ it("maps DateTime to p.dateTime()", () => {
134
+ expect(paramTypeToValidator("DateTime")).toBe("p.dateTime()");
135
+ });
136
+ it("maps Boolean to p.boolean()", () => {
137
+ expect(paramTypeToValidator("Boolean")).toBe("p.boolean()");
138
+ expect(paramTypeToValidator("Bool")).toBe("p.boolean()");
139
+ });
140
+ });
141
+ describe("optional parameters", () => {
142
+ it("adds .optional() for non-required params", () => {
143
+ expect(paramTypeToValidator("String", undefined, false)).toBe("p.string().optional()");
144
+ });
145
+ it("adds .optional(default) for params with defaults", () => {
146
+ expect(paramTypeToValidator("Int32", 10)).toBe("p.int32().optional(10)");
147
+ expect(paramTypeToValidator("String", "test")).toBe('p.string().optional("test")');
148
+ });
149
+ it("adds .optional(default) even for required params with defaults", () => {
150
+ expect(paramTypeToValidator("Int32", 5, true)).toBe("p.int32().optional(5)");
151
+ });
152
+ });
153
+ describe("DateTime variants", () => {
154
+ it("handles DateTime64", () => {
155
+ expect(paramTypeToValidator("DateTime64")).toBe("p.dateTime64()");
156
+ });
157
+ it("handles DateTime with timezone", () => {
158
+ expect(paramTypeToValidator("DateTime('UTC')")).toBe("p.dateTime()");
159
+ });
160
+ });
161
+ describe("unknown types", () => {
162
+ it("defaults to p.string() for unknown types", () => {
163
+ expect(paramTypeToValidator("UnknownType")).toBe("p.string()");
164
+ });
165
+ });
166
+ });
167
+ //# sourceMappingURL=type-mapper.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-mapper.test.js","sourceRoot":"","sources":["../../src/codegen/type-mapper.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Utility functions for code generation
3
+ */
4
+ /**
5
+ * Convert a string to camelCase
6
+ * Handles snake_case and kebab-case
7
+ */
8
+ export declare function toCamelCase(str: string): string;
9
+ /**
10
+ * Convert a string to PascalCase
11
+ * Handles snake_case and kebab-case
12
+ */
13
+ export declare function toPascalCase(str: string): string;
14
+ /**
15
+ * Escape a string for use in JavaScript/TypeScript code
16
+ */
17
+ export declare function escapeString(str: string): string;
18
+ /**
19
+ * Parse a sorting key string into an array
20
+ * Handles comma-separated values and quoted identifiers
21
+ */
22
+ export declare function parseSortingKey(sortingKey?: string): string[];
23
+ /**
24
+ * Generate engine code from engine info
25
+ */
26
+ export declare function generateEngineCode(engine: {
27
+ type: string;
28
+ sorting_key?: string;
29
+ partition_key?: string;
30
+ primary_key?: string;
31
+ ttl?: string;
32
+ ver?: string;
33
+ sign?: string;
34
+ version?: string;
35
+ summing_columns?: string;
36
+ }): string;
37
+ /**
38
+ * Indent a multi-line string
39
+ */
40
+ export declare function indent(str: string, spaces: number): string;
41
+ /**
42
+ * Format SQL for inclusion in template literal
43
+ * Preserves newlines and indentation but escapes backticks
44
+ */
45
+ export declare function formatSqlForTemplate(sql: string): string;
46
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/codegen/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAsB/C;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGhD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOhD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAU7D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,MAAM,CAwET;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAM1D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAExD"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Utility functions for code generation
3
+ */
4
+ /**
5
+ * Convert a string to camelCase
6
+ * Handles snake_case and kebab-case
7
+ */
8
+ export function toCamelCase(str) {
9
+ // Handle reserved keywords
10
+ const reserved = new Set([
11
+ "break", "case", "catch", "class", "const", "continue", "debugger",
12
+ "default", "delete", "do", "else", "enum", "export", "extends",
13
+ "false", "finally", "for", "function", "if", "import", "in",
14
+ "instanceof", "new", "null", "return", "super", "switch", "this",
15
+ "throw", "true", "try", "typeof", "undefined", "var", "void",
16
+ "while", "with", "yield", "let", "static", "implements", "interface",
17
+ "package", "private", "protected", "public", "await", "async",
18
+ ]);
19
+ const result = str
20
+ .replace(/[-_](.)/g, (_, char) => char.toUpperCase())
21
+ .replace(/^[A-Z]/, (char) => char.toLowerCase());
22
+ // If the result is a reserved keyword or starts with a number, prefix with underscore
23
+ if (reserved.has(result) || /^\d/.test(result)) {
24
+ return `_${result}`;
25
+ }
26
+ return result;
27
+ }
28
+ /**
29
+ * Convert a string to PascalCase
30
+ * Handles snake_case and kebab-case
31
+ */
32
+ export function toPascalCase(str) {
33
+ const camel = toCamelCase(str);
34
+ return camel.charAt(0).toUpperCase() + camel.slice(1);
35
+ }
36
+ /**
37
+ * Escape a string for use in JavaScript/TypeScript code
38
+ */
39
+ export function escapeString(str) {
40
+ return str
41
+ .replace(/\\/g, "\\\\")
42
+ .replace(/"/g, '\\"')
43
+ .replace(/\n/g, "\\n")
44
+ .replace(/\r/g, "\\r")
45
+ .replace(/\t/g, "\\t");
46
+ }
47
+ /**
48
+ * Parse a sorting key string into an array
49
+ * Handles comma-separated values and quoted identifiers
50
+ */
51
+ export function parseSortingKey(sortingKey) {
52
+ if (!sortingKey) {
53
+ return [];
54
+ }
55
+ // Split by comma, trim whitespace
56
+ return sortingKey
57
+ .split(",")
58
+ .map((s) => s.trim())
59
+ .filter((s) => s.length > 0);
60
+ }
61
+ /**
62
+ * Generate engine code from engine info
63
+ */
64
+ export function generateEngineCode(engine) {
65
+ const sortingKey = parseSortingKey(engine.sorting_key);
66
+ // Build options object
67
+ const options = [];
68
+ // Sorting key is required for all MergeTree engines
69
+ if (sortingKey.length === 1) {
70
+ options.push(`sortingKey: "${sortingKey[0]}"`);
71
+ }
72
+ else if (sortingKey.length > 1) {
73
+ options.push(`sortingKey: [${sortingKey.map((k) => `"${k}"`).join(", ")}]`);
74
+ }
75
+ // Optional fields
76
+ if (engine.partition_key) {
77
+ options.push(`partitionKey: "${escapeString(engine.partition_key)}"`);
78
+ }
79
+ if (engine.primary_key && engine.primary_key !== engine.sorting_key) {
80
+ const primaryKey = parseSortingKey(engine.primary_key);
81
+ if (primaryKey.length === 1) {
82
+ options.push(`primaryKey: "${primaryKey[0]}"`);
83
+ }
84
+ else if (primaryKey.length > 1) {
85
+ options.push(`primaryKey: [${primaryKey.map((k) => `"${k}"`).join(", ")}]`);
86
+ }
87
+ }
88
+ if (engine.ttl) {
89
+ options.push(`ttl: "${escapeString(engine.ttl)}"`);
90
+ }
91
+ // Engine-specific options
92
+ if (engine.type === "ReplacingMergeTree" && engine.ver) {
93
+ options.push(`ver: "${engine.ver}"`);
94
+ }
95
+ if ((engine.type === "CollapsingMergeTree" ||
96
+ engine.type === "VersionedCollapsingMergeTree") &&
97
+ engine.sign) {
98
+ options.push(`sign: "${engine.sign}"`);
99
+ }
100
+ if (engine.type === "VersionedCollapsingMergeTree" && engine.version) {
101
+ options.push(`version: "${engine.version}"`);
102
+ }
103
+ if (engine.type === "SummingMergeTree" && engine.summing_columns) {
104
+ const columns = parseSortingKey(engine.summing_columns);
105
+ if (columns.length > 0) {
106
+ options.push(`columns: [${columns.map((c) => `"${c}"`).join(", ")}]`);
107
+ }
108
+ }
109
+ // Map engine type to function name
110
+ const engineFunctionMap = {
111
+ MergeTree: "engine.mergeTree",
112
+ ReplacingMergeTree: "engine.replacingMergeTree",
113
+ SummingMergeTree: "engine.summingMergeTree",
114
+ AggregatingMergeTree: "engine.aggregatingMergeTree",
115
+ CollapsingMergeTree: "engine.collapsingMergeTree",
116
+ VersionedCollapsingMergeTree: "engine.versionedCollapsingMergeTree",
117
+ };
118
+ const engineFunc = engineFunctionMap[engine.type] ?? "engine.mergeTree";
119
+ if (options.length === 0) {
120
+ return `${engineFunc}({ sortingKey: [] })`;
121
+ }
122
+ return `${engineFunc}({\n ${options.join(",\n ")},\n })`;
123
+ }
124
+ /**
125
+ * Indent a multi-line string
126
+ */
127
+ export function indent(str, spaces) {
128
+ const prefix = " ".repeat(spaces);
129
+ return str
130
+ .split("\n")
131
+ .map((line) => (line.trim() ? prefix + line : line))
132
+ .join("\n");
133
+ }
134
+ /**
135
+ * Format SQL for inclusion in template literal
136
+ * Preserves newlines and indentation but escapes backticks
137
+ */
138
+ export function formatSqlForTemplate(sql) {
139
+ return sql.replace(/`/g, "\\`").replace(/\${/g, "\\${");
140
+ }
141
+ //# sourceMappingURL=utils.js.map