@tinybirdco/sdk 0.0.4 → 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 (103) hide show
  1. package/README.md +52 -13
  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/resources.d.ts +178 -0
  9. package/dist/api/resources.d.ts.map +1 -0
  10. package/dist/api/resources.js +244 -0
  11. package/dist/api/resources.js.map +1 -0
  12. package/dist/api/resources.test.d.ts +2 -0
  13. package/dist/api/resources.test.d.ts.map +1 -0
  14. package/dist/api/resources.test.js +255 -0
  15. package/dist/api/resources.test.js.map +1 -0
  16. package/dist/cli/commands/build.d.ts +3 -4
  17. package/dist/cli/commands/build.d.ts.map +1 -1
  18. package/dist/cli/commands/build.js +23 -25
  19. package/dist/cli/commands/build.js.map +1 -1
  20. package/dist/cli/commands/deploy.d.ts +39 -0
  21. package/dist/cli/commands/deploy.d.ts.map +1 -0
  22. package/dist/cli/commands/deploy.js +90 -0
  23. package/dist/cli/commands/deploy.js.map +1 -0
  24. package/dist/cli/commands/dev.d.ts.map +1 -1
  25. package/dist/cli/commands/dev.js +7 -3
  26. package/dist/cli/commands/dev.js.map +1 -1
  27. package/dist/cli/commands/init.d.ts +24 -1
  28. package/dist/cli/commands/init.d.ts.map +1 -1
  29. package/dist/cli/commands/init.js +174 -23
  30. package/dist/cli/commands/init.js.map +1 -1
  31. package/dist/cli/commands/init.test.js +190 -30
  32. package/dist/cli/commands/init.test.js.map +1 -1
  33. package/dist/cli/index.js +72 -12
  34. package/dist/cli/index.js.map +1 -1
  35. package/dist/cli/utils/package-manager.d.ts +8 -0
  36. package/dist/cli/utils/package-manager.d.ts.map +1 -0
  37. package/dist/cli/utils/package-manager.js +45 -0
  38. package/dist/cli/utils/package-manager.js.map +1 -0
  39. package/dist/cli/utils/package-manager.test.d.ts +2 -0
  40. package/dist/cli/utils/package-manager.test.d.ts.map +1 -0
  41. package/dist/cli/utils/package-manager.test.js +85 -0
  42. package/dist/cli/utils/package-manager.test.js.map +1 -0
  43. package/dist/codegen/index.d.ts +39 -0
  44. package/dist/codegen/index.d.ts.map +1 -0
  45. package/dist/codegen/index.js +300 -0
  46. package/dist/codegen/index.js.map +1 -0
  47. package/dist/codegen/index.test.d.ts +2 -0
  48. package/dist/codegen/index.test.d.ts.map +1 -0
  49. package/dist/codegen/index.test.js +310 -0
  50. package/dist/codegen/index.test.js.map +1 -0
  51. package/dist/codegen/type-mapper.d.ts +20 -0
  52. package/dist/codegen/type-mapper.d.ts.map +1 -0
  53. package/dist/codegen/type-mapper.js +238 -0
  54. package/dist/codegen/type-mapper.js.map +1 -0
  55. package/dist/codegen/type-mapper.test.d.ts +2 -0
  56. package/dist/codegen/type-mapper.test.d.ts.map +1 -0
  57. package/dist/codegen/type-mapper.test.js +167 -0
  58. package/dist/codegen/type-mapper.test.js.map +1 -0
  59. package/dist/codegen/utils.d.ts +46 -0
  60. package/dist/codegen/utils.d.ts.map +1 -0
  61. package/dist/codegen/utils.js +141 -0
  62. package/dist/codegen/utils.js.map +1 -0
  63. package/dist/codegen/utils.test.d.ts +2 -0
  64. package/dist/codegen/utils.test.d.ts.map +1 -0
  65. package/dist/codegen/utils.test.js +178 -0
  66. package/dist/codegen/utils.test.js.map +1 -0
  67. package/dist/generator/index.d.ts +3 -0
  68. package/dist/generator/index.d.ts.map +1 -1
  69. package/dist/generator/index.js +17 -1
  70. package/dist/generator/index.js.map +1 -1
  71. package/dist/generator/index.test.js +104 -1
  72. package/dist/generator/index.test.js.map +1 -1
  73. package/dist/generator/loader.d.ts +15 -0
  74. package/dist/generator/loader.d.ts.map +1 -1
  75. package/dist/generator/loader.js +24 -0
  76. package/dist/generator/loader.js.map +1 -1
  77. package/dist/test/handlers.d.ts +49 -0
  78. package/dist/test/handlers.d.ts.map +1 -1
  79. package/dist/test/handlers.js +45 -0
  80. package/dist/test/handlers.js.map +1 -1
  81. package/package.json +4 -2
  82. package/src/api/deploy.test.ts +135 -34
  83. package/src/api/deploy.ts +203 -23
  84. package/src/api/resources.test.ts +332 -0
  85. package/src/api/resources.ts +554 -0
  86. package/src/cli/commands/build.ts +29 -33
  87. package/src/cli/commands/deploy.ts +126 -0
  88. package/src/cli/commands/dev.ts +10 -3
  89. package/src/cli/commands/init.test.ts +239 -30
  90. package/src/cli/commands/init.ts +243 -26
  91. package/src/cli/index.ts +84 -11
  92. package/src/cli/utils/package-manager.test.ts +118 -0
  93. package/src/cli/utils/package-manager.ts +44 -0
  94. package/src/codegen/index.test.ts +367 -0
  95. package/src/codegen/index.ts +379 -0
  96. package/src/codegen/type-mapper.test.ts +224 -0
  97. package/src/codegen/type-mapper.ts +265 -0
  98. package/src/codegen/utils.test.ts +221 -0
  99. package/src/codegen/utils.ts +174 -0
  100. package/src/generator/index.test.ts +121 -1
  101. package/src/generator/index.ts +19 -1
  102. package/src/generator/loader.ts +43 -0
  103. package/src/test/handlers.ts +58 -0
@@ -0,0 +1,310 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { generateDatasourceCode, generatePipeCode, generateDatasourcesFile, generatePipesFile, generateClientFile, generateAllFiles, } from "./index.js";
3
+ describe("generateDatasourceCode", () => {
4
+ it("generates valid datasource code", () => {
5
+ const ds = {
6
+ name: "page_views",
7
+ description: "Page view tracking data",
8
+ columns: [
9
+ { name: "timestamp", type: "DateTime" },
10
+ { name: "pathname", type: "String" },
11
+ { name: "session_id", type: "String" },
12
+ ],
13
+ engine: {
14
+ type: "MergeTree",
15
+ sorting_key: "pathname, timestamp",
16
+ },
17
+ };
18
+ const code = generateDatasourceCode(ds);
19
+ expect(code).toContain('export const pageViews = defineDatasource("page_views"');
20
+ expect(code).toContain("timestamp: t.dateTime()");
21
+ expect(code).toContain("pathname: t.string()");
22
+ expect(code).toContain("session_id: t.string()");
23
+ expect(code).toContain("engine.mergeTree");
24
+ expect(code).toContain("export type PageViewsRow = InferRow<typeof pageViews>");
25
+ });
26
+ it("handles nullable columns", () => {
27
+ const ds = {
28
+ name: "events",
29
+ columns: [
30
+ { name: "user_id", type: "Nullable(String)" },
31
+ ],
32
+ engine: { type: "MergeTree", sorting_key: "user_id" },
33
+ };
34
+ const code = generateDatasourceCode(ds);
35
+ expect(code).toContain("user_id: t.string().nullable()");
36
+ });
37
+ it("handles LowCardinality columns", () => {
38
+ const ds = {
39
+ name: "events",
40
+ columns: [
41
+ { name: "country", type: "LowCardinality(String)" },
42
+ ],
43
+ engine: { type: "MergeTree", sorting_key: "country" },
44
+ };
45
+ const code = generateDatasourceCode(ds);
46
+ expect(code).toContain("country: t.string().lowCardinality()");
47
+ });
48
+ it("includes description in JSDoc", () => {
49
+ const ds = {
50
+ name: "events",
51
+ description: "Event tracking data",
52
+ columns: [{ name: "id", type: "String" }],
53
+ engine: { type: "MergeTree", sorting_key: "id" },
54
+ };
55
+ const code = generateDatasourceCode(ds);
56
+ expect(code).toContain("/**");
57
+ expect(code).toContain(" * Event tracking data");
58
+ expect(code).toContain(" */");
59
+ });
60
+ });
61
+ describe("generatePipeCode", () => {
62
+ it("generates endpoint code", () => {
63
+ const pipe = {
64
+ name: "top_pages",
65
+ description: "Get the most visited pages",
66
+ nodes: [
67
+ {
68
+ name: "aggregated",
69
+ sql: "SELECT pathname, count() AS views FROM page_views GROUP BY pathname",
70
+ },
71
+ ],
72
+ params: [
73
+ { name: "limit", type: "Int32", default: 10, required: false },
74
+ ],
75
+ type: "endpoint",
76
+ endpoint: { enabled: true },
77
+ output_columns: [
78
+ { name: "pathname", type: "String" },
79
+ { name: "views", type: "UInt64" },
80
+ ],
81
+ };
82
+ const code = generatePipeCode(pipe);
83
+ expect(code).toContain('export const topPages = defineEndpoint("top_pages"');
84
+ expect(code).toContain("limit: p.int32().optional(10)");
85
+ expect(code).toContain('name: "aggregated"');
86
+ expect(code).toContain("pathname: t.string()");
87
+ expect(code).toContain("views: t.uint64()");
88
+ expect(code).toContain("export type TopPagesParams = InferParams<typeof topPages>");
89
+ expect(code).toContain("export type TopPagesOutput = InferOutputRow<typeof topPages>");
90
+ });
91
+ it("generates materialized view code", () => {
92
+ const pipe = {
93
+ name: "daily_stats_mv",
94
+ nodes: [
95
+ { name: "aggregate", sql: "SELECT toDate(timestamp) AS date, count() AS cnt FROM events GROUP BY date" },
96
+ ],
97
+ params: [],
98
+ type: "materialized",
99
+ materialized: { datasource: "daily_stats" },
100
+ output_columns: [],
101
+ };
102
+ const code = generatePipeCode(pipe);
103
+ expect(code).toContain('export const dailyStatsMv = defineMaterializedView("daily_stats_mv"');
104
+ expect(code).toContain("datasource: dailyStats");
105
+ });
106
+ it("generates copy pipe code", () => {
107
+ const pipe = {
108
+ name: "daily_snapshot",
109
+ nodes: [
110
+ { name: "snapshot", sql: "SELECT * FROM events WHERE date = today()" },
111
+ ],
112
+ params: [],
113
+ type: "copy",
114
+ copy: {
115
+ target_datasource: "snapshots",
116
+ copy_schedule: "0 0 * * *",
117
+ copy_mode: "append",
118
+ },
119
+ output_columns: [],
120
+ };
121
+ const code = generatePipeCode(pipe);
122
+ expect(code).toContain('export const dailySnapshot = defineCopyPipe("daily_snapshot"');
123
+ expect(code).toContain("datasource: snapshots");
124
+ expect(code).toContain('copy_schedule: "0 0 * * *"');
125
+ expect(code).toContain('copy_mode: "append"');
126
+ });
127
+ it("generates regular pipe code", () => {
128
+ const pipe = {
129
+ name: "filtered_events",
130
+ nodes: [
131
+ { name: "filtered", sql: "SELECT * FROM events WHERE status = 'active'" },
132
+ ],
133
+ params: [],
134
+ type: "pipe",
135
+ output_columns: [],
136
+ };
137
+ const code = generatePipeCode(pipe);
138
+ expect(code).toContain('export const filteredEvents = definePipe("filtered_events"');
139
+ });
140
+ it("handles params with descriptions", () => {
141
+ const pipe = {
142
+ name: "search",
143
+ nodes: [{ name: "search", sql: "SELECT * FROM events" }],
144
+ params: [
145
+ { name: "query", type: "String", required: true, description: "Search query" },
146
+ ],
147
+ type: "endpoint",
148
+ endpoint: { enabled: true },
149
+ output_columns: [],
150
+ };
151
+ const code = generatePipeCode(pipe);
152
+ expect(code).toContain('query: p.string().describe("Search query")');
153
+ });
154
+ });
155
+ describe("generateDatasourcesFile", () => {
156
+ it("generates file with imports and all datasources", () => {
157
+ const datasources = [
158
+ {
159
+ name: "events",
160
+ columns: [{ name: "id", type: "String" }],
161
+ engine: { type: "MergeTree", sorting_key: "id" },
162
+ },
163
+ {
164
+ name: "users",
165
+ columns: [{ name: "user_id", type: "String" }],
166
+ engine: { type: "MergeTree", sorting_key: "user_id" },
167
+ },
168
+ ];
169
+ const file = generateDatasourcesFile(datasources);
170
+ expect(file).toContain('import { defineDatasource, t, engine, type InferRow } from "@tinybirdco/sdk"');
171
+ expect(file).toContain('export const events = defineDatasource("events"');
172
+ expect(file).toContain('export const users = defineDatasource("users"');
173
+ });
174
+ it("generates placeholder for empty datasources", () => {
175
+ const file = generateDatasourcesFile([]);
176
+ expect(file).toContain("// No datasources found in workspace");
177
+ });
178
+ });
179
+ describe("generatePipesFile", () => {
180
+ it("generates file with appropriate imports", () => {
181
+ const pipes = [
182
+ {
183
+ name: "top_pages",
184
+ nodes: [{ name: "agg", sql: "SELECT 1" }],
185
+ params: [{ name: "limit", type: "Int32", required: false }],
186
+ type: "endpoint",
187
+ endpoint: { enabled: true },
188
+ output_columns: [{ name: "count", type: "UInt64" }],
189
+ },
190
+ ];
191
+ const file = generatePipesFile(pipes, []);
192
+ expect(file).toContain("defineEndpoint");
193
+ expect(file).toContain("node");
194
+ expect(file).toContain("t");
195
+ expect(file).toContain("p");
196
+ expect(file).toContain("type InferParams");
197
+ expect(file).toContain("type InferOutputRow");
198
+ });
199
+ it("imports datasources for materialized views", () => {
200
+ const datasources = [
201
+ {
202
+ name: "daily_stats",
203
+ columns: [{ name: "date", type: "Date" }],
204
+ engine: { type: "MergeTree", sorting_key: "date" },
205
+ },
206
+ ];
207
+ const pipes = [
208
+ {
209
+ name: "daily_stats_mv",
210
+ nodes: [{ name: "agg", sql: "SELECT 1" }],
211
+ params: [],
212
+ type: "materialized",
213
+ materialized: { datasource: "daily_stats" },
214
+ output_columns: [],
215
+ },
216
+ ];
217
+ const file = generatePipesFile(pipes, datasources);
218
+ expect(file).toContain('import { dailyStats } from "./datasources.js"');
219
+ expect(file).toContain("defineMaterializedView");
220
+ });
221
+ it("generates placeholder for empty pipes", () => {
222
+ const file = generatePipesFile([], []);
223
+ expect(file).toContain("// No pipes found in workspace");
224
+ });
225
+ });
226
+ describe("generateClientFile", () => {
227
+ it("generates client with datasources and pipes", () => {
228
+ const datasources = [
229
+ {
230
+ name: "events",
231
+ columns: [{ name: "id", type: "String" }],
232
+ engine: { type: "MergeTree", sorting_key: "id" },
233
+ },
234
+ ];
235
+ const pipes = [
236
+ {
237
+ name: "top_events",
238
+ nodes: [{ name: "agg", sql: "SELECT 1" }],
239
+ params: [],
240
+ type: "endpoint",
241
+ endpoint: { enabled: true },
242
+ output_columns: [],
243
+ },
244
+ ];
245
+ const file = generateClientFile(datasources, pipes);
246
+ expect(file).toContain('import { createTinybirdClient } from "@tinybirdco/sdk"');
247
+ expect(file).toContain('import { events, type EventsRow } from "./datasources.js"');
248
+ expect(file).toContain('import { topEvents, type TopEventsParams, type TopEventsOutput } from "./pipes.js"');
249
+ expect(file).toContain("datasources: { events }");
250
+ expect(file).toContain("pipes: { topEvents }");
251
+ expect(file).toContain("export type { EventsRow, TopEventsParams, TopEventsOutput }");
252
+ expect(file).toContain("export { events, topEvents }");
253
+ });
254
+ it("handles empty datasources and pipes", () => {
255
+ const file = generateClientFile([], []);
256
+ expect(file).toContain("datasources: {}");
257
+ expect(file).toContain("pipes: {}");
258
+ });
259
+ it("only includes endpoints in client pipes", () => {
260
+ const pipes = [
261
+ {
262
+ name: "endpoint_pipe",
263
+ nodes: [{ name: "n", sql: "SELECT 1" }],
264
+ params: [],
265
+ type: "endpoint",
266
+ endpoint: { enabled: true },
267
+ output_columns: [],
268
+ },
269
+ {
270
+ name: "materialized_pipe",
271
+ nodes: [{ name: "n", sql: "SELECT 1" }],
272
+ params: [],
273
+ type: "materialized",
274
+ materialized: { datasource: "target" },
275
+ output_columns: [],
276
+ },
277
+ ];
278
+ const file = generateClientFile([], pipes);
279
+ expect(file).toContain("endpointPipe");
280
+ expect(file).not.toContain("materializedPipe");
281
+ });
282
+ });
283
+ describe("generateAllFiles", () => {
284
+ it("returns all generated content with counts", () => {
285
+ const datasources = [
286
+ {
287
+ name: "events",
288
+ columns: [{ name: "id", type: "String" }],
289
+ engine: { type: "MergeTree", sorting_key: "id" },
290
+ },
291
+ ];
292
+ const pipes = [
293
+ {
294
+ name: "top_events",
295
+ nodes: [{ name: "agg", sql: "SELECT 1" }],
296
+ params: [],
297
+ type: "endpoint",
298
+ endpoint: { enabled: true },
299
+ output_columns: [],
300
+ },
301
+ ];
302
+ const result = generateAllFiles(datasources, pipes);
303
+ expect(result.datasourceCount).toBe(1);
304
+ expect(result.pipeCount).toBe(1);
305
+ expect(result.datasourcesContent).toContain("defineDatasource");
306
+ expect(result.pipesContent).toContain("defineEndpoint");
307
+ expect(result.clientContent).toContain("createTinybirdClient");
308
+ });
309
+ });
310
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/codegen/index.test.ts"],"names":[],"mappings":"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"}
@@ -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":""}