@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,300 @@
1
+ /**
2
+ * Code generator for converting Tinybird API resources to TypeScript SDK code
3
+ */
4
+ import { clickhouseTypeToValidator, paramTypeToValidator } from "./type-mapper.js";
5
+ import { toCamelCase, toPascalCase, escapeString, generateEngineCode, formatSqlForTemplate, } from "./utils.js";
6
+ /**
7
+ * Generate TypeScript code for a single datasource
8
+ */
9
+ export function generateDatasourceCode(ds) {
10
+ const varName = toCamelCase(ds.name);
11
+ const typeName = toPascalCase(ds.name);
12
+ const lines = [];
13
+ // JSDoc comment
14
+ if (ds.description) {
15
+ lines.push("/**");
16
+ lines.push(` * ${ds.description}`);
17
+ lines.push(" */");
18
+ }
19
+ lines.push(`export const ${varName} = defineDatasource("${ds.name}", {`);
20
+ if (ds.description) {
21
+ lines.push(` description: "${escapeString(ds.description)}",`);
22
+ }
23
+ // Schema
24
+ lines.push(" schema: {");
25
+ for (const col of ds.columns) {
26
+ const validator = clickhouseTypeToValidator(col.type);
27
+ lines.push(` ${col.name}: ${validator},`);
28
+ }
29
+ lines.push(" },");
30
+ // Engine
31
+ const engineCode = generateEngineCode(ds.engine);
32
+ lines.push(` engine: ${engineCode},`);
33
+ lines.push("});");
34
+ lines.push("");
35
+ lines.push(`export type ${typeName}Row = InferRow<typeof ${varName}>;`);
36
+ return lines.join("\n");
37
+ }
38
+ /**
39
+ * Generate TypeScript code for a single pipe
40
+ */
41
+ export function generatePipeCode(pipe) {
42
+ const varName = toCamelCase(pipe.name);
43
+ const typeName = toPascalCase(pipe.name);
44
+ const lines = [];
45
+ // Determine which define function to use
46
+ let defineFunc = "definePipe";
47
+ if (pipe.type === "endpoint") {
48
+ defineFunc = "defineEndpoint";
49
+ }
50
+ else if (pipe.type === "materialized") {
51
+ defineFunc = "defineMaterializedView";
52
+ }
53
+ else if (pipe.type === "copy") {
54
+ defineFunc = "defineCopyPipe";
55
+ }
56
+ // JSDoc comment
57
+ if (pipe.description) {
58
+ lines.push("/**");
59
+ lines.push(` * ${pipe.description}`);
60
+ lines.push(" */");
61
+ }
62
+ lines.push(`export const ${varName} = ${defineFunc}("${pipe.name}", {`);
63
+ if (pipe.description) {
64
+ lines.push(` description: "${escapeString(pipe.description)}",`);
65
+ }
66
+ // For materialized views and copy pipes, add datasource first
67
+ if (pipe.type === "materialized" && pipe.materialized) {
68
+ const dsVarName = toCamelCase(pipe.materialized.datasource);
69
+ lines.push(` datasource: ${dsVarName},`);
70
+ }
71
+ else if (pipe.type === "copy" && pipe.copy) {
72
+ const dsVarName = toCamelCase(pipe.copy.target_datasource);
73
+ lines.push(` datasource: ${dsVarName},`);
74
+ if (pipe.copy.copy_schedule) {
75
+ lines.push(` copy_schedule: "${pipe.copy.copy_schedule}",`);
76
+ }
77
+ if (pipe.copy.copy_mode) {
78
+ lines.push(` copy_mode: "${pipe.copy.copy_mode}",`);
79
+ }
80
+ }
81
+ // Params (for endpoints and regular pipes with params)
82
+ if (pipe.params.length > 0 && pipe.type !== "materialized" && pipe.type !== "copy") {
83
+ lines.push(" params: {");
84
+ for (const param of pipe.params) {
85
+ const validator = paramTypeToValidator(param.type, param.default, param.required);
86
+ if (param.description) {
87
+ lines.push(` ${param.name}: ${validator}.describe("${escapeString(param.description)}"),`);
88
+ }
89
+ else {
90
+ lines.push(` ${param.name}: ${validator},`);
91
+ }
92
+ }
93
+ lines.push(" },");
94
+ }
95
+ // Nodes
96
+ lines.push(" nodes: [");
97
+ for (const node of pipe.nodes) {
98
+ lines.push(" node({");
99
+ lines.push(` name: "${node.name}",`);
100
+ const formattedSql = formatSqlForTemplate(node.sql);
101
+ lines.push(` sql: \`${formattedSql}\`,`);
102
+ lines.push(" }),");
103
+ }
104
+ lines.push(" ],");
105
+ // Output (for endpoints)
106
+ if (pipe.type === "endpoint" && pipe.output_columns.length > 0) {
107
+ lines.push(" output: {");
108
+ for (const col of pipe.output_columns) {
109
+ const validator = clickhouseTypeToValidator(col.type);
110
+ lines.push(` ${col.name}: ${validator},`);
111
+ }
112
+ lines.push(" },");
113
+ }
114
+ lines.push("});");
115
+ // Type exports for endpoints
116
+ if (pipe.type === "endpoint") {
117
+ lines.push("");
118
+ lines.push(`export type ${typeName}Params = InferParams<typeof ${varName}>;`);
119
+ lines.push(`export type ${typeName}Output = InferOutputRow<typeof ${varName}>;`);
120
+ }
121
+ return lines.join("\n");
122
+ }
123
+ /**
124
+ * Generate the complete datasources.ts file content
125
+ */
126
+ export function generateDatasourcesFile(datasources) {
127
+ if (datasources.length === 0) {
128
+ return `import { defineDatasource, t, engine, type InferRow } from "@tinybirdco/sdk";
129
+
130
+ // No datasources found in workspace
131
+ `;
132
+ }
133
+ const imports = [
134
+ 'import { defineDatasource, t, engine, type InferRow } from "@tinybirdco/sdk";',
135
+ "",
136
+ ];
137
+ const code = datasources.map((ds) => generateDatasourceCode(ds)).join("\n\n");
138
+ return imports.join("\n") + "\n" + code + "\n";
139
+ }
140
+ /**
141
+ * Generate the complete pipes.ts file content
142
+ */
143
+ export function generatePipesFile(pipes, datasources) {
144
+ if (pipes.length === 0) {
145
+ return `import { defineEndpoint, node, t, p, type InferParams, type InferOutputRow } from "@tinybirdco/sdk";
146
+
147
+ // No pipes found in workspace
148
+ `;
149
+ }
150
+ // Determine which imports are needed
151
+ const hasMaterialized = pipes.some((p) => p.type === "materialized");
152
+ const hasCopy = pipes.some((p) => p.type === "copy");
153
+ const hasEndpoint = pipes.some((p) => p.type === "endpoint");
154
+ const hasPlainPipe = pipes.some((p) => p.type === "pipe");
155
+ const hasParams = pipes.some((p) => p.params.length > 0 && p.type !== "materialized" && p.type !== "copy");
156
+ const sdkImports = ["node", "t"];
157
+ if (hasParams) {
158
+ sdkImports.push("p");
159
+ }
160
+ if (hasEndpoint) {
161
+ sdkImports.push("defineEndpoint", "type InferParams", "type InferOutputRow");
162
+ }
163
+ if (hasMaterialized) {
164
+ sdkImports.push("defineMaterializedView");
165
+ }
166
+ if (hasCopy) {
167
+ sdkImports.push("defineCopyPipe");
168
+ }
169
+ if (hasPlainPipe) {
170
+ sdkImports.push("definePipe");
171
+ }
172
+ const lines = [
173
+ `import { ${sdkImports.join(", ")} } from "@tinybirdco/sdk";`,
174
+ ];
175
+ // Import datasources referenced by materialized/copy pipes
176
+ const referencedDatasources = new Set();
177
+ for (const pipe of pipes) {
178
+ if (pipe.materialized?.datasource) {
179
+ referencedDatasources.add(pipe.materialized.datasource);
180
+ }
181
+ if (pipe.copy?.target_datasource) {
182
+ referencedDatasources.add(pipe.copy.target_datasource);
183
+ }
184
+ }
185
+ if (referencedDatasources.size > 0) {
186
+ // Verify datasources exist
187
+ const existingDatasourceNames = new Set(datasources.map((ds) => ds.name));
188
+ const validReferences = Array.from(referencedDatasources).filter((name) => existingDatasourceNames.has(name));
189
+ if (validReferences.length > 0) {
190
+ const dsImports = validReferences.map((name) => toCamelCase(name)).join(", ");
191
+ lines.push(`import { ${dsImports} } from "./datasources.js";`);
192
+ }
193
+ }
194
+ lines.push("");
195
+ const code = pipes.map((p) => generatePipeCode(p)).join("\n\n");
196
+ return lines.join("\n") + code + "\n";
197
+ }
198
+ /**
199
+ * Generate the complete client.ts file content
200
+ */
201
+ export function generateClientFile(datasources, pipes) {
202
+ const lines = [
203
+ "/**",
204
+ " * Tinybird Client",
205
+ " *",
206
+ " * This file defines the typed Tinybird client for your project.",
207
+ " * Generated from existing workspace resources.",
208
+ " */",
209
+ "",
210
+ 'import { createTinybirdClient } from "@tinybirdco/sdk";',
211
+ "",
212
+ ];
213
+ // Import datasources
214
+ if (datasources.length > 0) {
215
+ const dsImports = [];
216
+ const typeImports = [];
217
+ for (const ds of datasources) {
218
+ const varName = toCamelCase(ds.name);
219
+ const typeName = toPascalCase(ds.name);
220
+ dsImports.push(varName);
221
+ typeImports.push(`type ${typeName}Row`);
222
+ }
223
+ lines.push(`import { ${dsImports.join(", ")}, ${typeImports.join(", ")} } from "./datasources.js";`);
224
+ }
225
+ // Import pipes (only endpoints are useful for the client)
226
+ const endpoints = pipes.filter((p) => p.type === "endpoint");
227
+ if (endpoints.length > 0) {
228
+ const pipeImports = [];
229
+ const typeImports = [];
230
+ for (const pipe of endpoints) {
231
+ const varName = toCamelCase(pipe.name);
232
+ const typeName = toPascalCase(pipe.name);
233
+ pipeImports.push(varName);
234
+ typeImports.push(`type ${typeName}Params`, `type ${typeName}Output`);
235
+ }
236
+ lines.push(`import { ${pipeImports.join(", ")}, ${typeImports.join(", ")} } from "./pipes.js";`);
237
+ }
238
+ lines.push("");
239
+ // Create client
240
+ lines.push("// Create the typed Tinybird client");
241
+ lines.push("export const tinybird = createTinybirdClient({");
242
+ if (datasources.length > 0) {
243
+ const dsNames = datasources.map((ds) => toCamelCase(ds.name)).join(", ");
244
+ lines.push(` datasources: { ${dsNames} },`);
245
+ }
246
+ else {
247
+ lines.push(" datasources: {},");
248
+ }
249
+ if (endpoints.length > 0) {
250
+ const pipeNames = endpoints.map((p) => toCamelCase(p.name)).join(", ");
251
+ lines.push(` pipes: { ${pipeNames} },`);
252
+ }
253
+ else {
254
+ lines.push(" pipes: {},");
255
+ }
256
+ lines.push("});");
257
+ lines.push("");
258
+ // Re-export types
259
+ if (datasources.length > 0 || endpoints.length > 0) {
260
+ lines.push("// Re-export types for convenience");
261
+ const typeExports = [];
262
+ for (const ds of datasources) {
263
+ const typeName = toPascalCase(ds.name);
264
+ typeExports.push(`${typeName}Row`);
265
+ }
266
+ for (const pipe of endpoints) {
267
+ const typeName = toPascalCase(pipe.name);
268
+ typeExports.push(`${typeName}Params`, `${typeName}Output`);
269
+ }
270
+ lines.push(`export type { ${typeExports.join(", ")} };`);
271
+ lines.push("");
272
+ }
273
+ // Re-export entities
274
+ if (datasources.length > 0 || endpoints.length > 0) {
275
+ lines.push("// Re-export entities");
276
+ const entityExports = [];
277
+ for (const ds of datasources) {
278
+ entityExports.push(toCamelCase(ds.name));
279
+ }
280
+ for (const pipe of endpoints) {
281
+ entityExports.push(toCamelCase(pipe.name));
282
+ }
283
+ lines.push(`export { ${entityExports.join(", ")} };`);
284
+ lines.push("");
285
+ }
286
+ return lines.join("\n");
287
+ }
288
+ /**
289
+ * Generate all TypeScript files from resources
290
+ */
291
+ export function generateAllFiles(datasources, pipes) {
292
+ return {
293
+ datasourcesContent: generateDatasourcesFile(datasources),
294
+ pipesContent: generatePipesFile(pipes, datasources),
295
+ clientContent: generateClientFile(datasources, pipes),
296
+ datasourceCount: datasources.length,
297
+ pipeCount: pipes.length,
298
+ };
299
+ }
300
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/codegen/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/codegen/index.test.ts"],"names":[],"mappings":""}
@@ -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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"}