@tinybirdco/sdk 0.0.50 → 0.0.51

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 (56) hide show
  1. package/dist/cli/commands/migrate.test.js +247 -2
  2. package/dist/cli/commands/migrate.test.js.map +1 -1
  3. package/dist/codegen/type-mapper.d.ts.map +1 -1
  4. package/dist/codegen/type-mapper.js +70 -7
  5. package/dist/codegen/type-mapper.js.map +1 -1
  6. package/dist/codegen/type-mapper.test.js +9 -0
  7. package/dist/codegen/type-mapper.test.js.map +1 -1
  8. package/dist/generator/datasource.d.ts.map +1 -1
  9. package/dist/generator/datasource.js +19 -0
  10. package/dist/generator/datasource.js.map +1 -1
  11. package/dist/generator/datasource.test.js +16 -0
  12. package/dist/generator/datasource.test.js.map +1 -1
  13. package/dist/generator/pipe.d.ts.map +1 -1
  14. package/dist/generator/pipe.js +92 -3
  15. package/dist/generator/pipe.js.map +1 -1
  16. package/dist/generator/pipe.test.js +19 -0
  17. package/dist/generator/pipe.test.js.map +1 -1
  18. package/dist/index.d.ts +1 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/migrate/emit-ts.d.ts.map +1 -1
  22. package/dist/migrate/emit-ts.js +11 -0
  23. package/dist/migrate/emit-ts.js.map +1 -1
  24. package/dist/migrate/parse-datasource.d.ts.map +1 -1
  25. package/dist/migrate/parse-datasource.js +37 -0
  26. package/dist/migrate/parse-datasource.js.map +1 -1
  27. package/dist/migrate/parse-pipe.d.ts.map +1 -1
  28. package/dist/migrate/parse-pipe.js +212 -93
  29. package/dist/migrate/parse-pipe.js.map +1 -1
  30. package/dist/migrate/parser-utils.d.ts.map +1 -1
  31. package/dist/migrate/parser-utils.js +3 -1
  32. package/dist/migrate/parser-utils.js.map +1 -1
  33. package/dist/migrate/types.d.ts +7 -0
  34. package/dist/migrate/types.d.ts.map +1 -1
  35. package/dist/schema/datasource.d.ts +16 -0
  36. package/dist/schema/datasource.d.ts.map +1 -1
  37. package/dist/schema/datasource.js +16 -0
  38. package/dist/schema/datasource.js.map +1 -1
  39. package/dist/schema/datasource.test.js +39 -0
  40. package/dist/schema/datasource.test.js.map +1 -1
  41. package/package.json +1 -1
  42. package/src/cli/commands/migrate.test.ts +357 -2
  43. package/src/codegen/type-mapper.test.ts +18 -0
  44. package/src/codegen/type-mapper.ts +79 -7
  45. package/src/generator/datasource.test.ts +22 -0
  46. package/src/generator/datasource.ts +25 -0
  47. package/src/generator/pipe.test.ts +21 -0
  48. package/src/generator/pipe.ts +119 -3
  49. package/src/index.ts +1 -0
  50. package/src/migrate/emit-ts.ts +13 -0
  51. package/src/migrate/parse-datasource.ts +72 -1
  52. package/src/migrate/parse-pipe.ts +250 -111
  53. package/src/migrate/parser-utils.ts +5 -1
  54. package/src/migrate/types.ts +8 -0
  55. package/src/schema/datasource.test.ts +53 -0
  56. package/src/schema/datasource.ts +38 -0
@@ -44,6 +44,22 @@ export function defineDatasource(name, options) {
44
44
  if (ingestionConfigCount > 1) {
45
45
  throw new Error("Datasource can only define one ingestion option: `kafka`, `s3`, or `gcs`.");
46
46
  }
47
+ if (options.indexes) {
48
+ for (const index of options.indexes) {
49
+ if (!index.name || /\s/.test(index.name)) {
50
+ throw new Error(`Invalid datasource index name: "${index.name}". Index names must be non-empty and cannot contain whitespace.`);
51
+ }
52
+ if (!index.expr?.trim()) {
53
+ throw new Error(`Invalid datasource index "${index.name}": expr is required.`);
54
+ }
55
+ if (!index.type?.trim()) {
56
+ throw new Error(`Invalid datasource index "${index.name}": type is required.`);
57
+ }
58
+ if (!Number.isInteger(index.granularity) || index.granularity <= 0) {
59
+ throw new Error(`Invalid datasource index "${index.name}": granularity must be a positive integer.`);
60
+ }
61
+ }
62
+ }
47
63
  return {
48
64
  [DATASOURCE_BRAND]: true,
49
65
  _name: name,
@@ -1 +1 @@
1
- {"version":3,"file":"datasource.js","sourceRoot":"","sources":["../../src/schema/datasource.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAyB,MAAM,YAAY,CAAC;AASlF,iEAAiE;AACjE,+DAA+D;AAC/D,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;AAwI3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,OAAmC;IAEnC,sCAAsC;IACtC,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,6BAA6B,IAAI,qGAAqG,CACvI,CAAC;IACJ,CAAC;IAED,MAAM,oBAAoB,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAC7F,IAAI,oBAAoB,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;IAC/F,CAAC;IAED,OAAO;QACL,CAAC,gBAAgB,CAAC,EAAE,IAAI;QACxB,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE,OAAO,CAAC,MAAM;QACvB,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,gBAAgB,IAAI,KAAK;QACxB,KAAiC,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAC9D,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,MAA2C;IACvE,IAAI,MAAM,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACxD,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IACD,OAAO,MAA0B,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAA2C;IAC3E,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC;IACvC,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,IAAI,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,OAAO,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC;IAC5C,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAe;IAEf,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAsB,CAAC;AAClD,CAAC;AAOD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,MAAM,CACpB,IAAO,EACP,OAA2C;IAE3C,OAAO;QACL,IAAI;QACJ,GAAG,OAAO;KACX,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"datasource.js","sourceRoot":"","sources":["../../src/schema/datasource.ts"],"names":[],"mappings":"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"}
@@ -112,6 +112,45 @@ describe("Datasource Schema", () => {
112
112
  expect(ds.options.gcs?.connection._name).toBe("my_gcs");
113
113
  expect(ds.options.gcs?.bucketUri).toBe("gs://my-bucket/events/*.csv");
114
114
  });
115
+ it("accepts datasource indexes", () => {
116
+ const ds = defineDatasource("events", {
117
+ schema: { id: t.string() },
118
+ indexes: [
119
+ {
120
+ name: "id_set",
121
+ expr: "id",
122
+ type: "set(100)",
123
+ granularity: 1,
124
+ },
125
+ ],
126
+ });
127
+ expect(ds.options.indexes).toEqual([
128
+ {
129
+ name: "id_set",
130
+ expr: "id",
131
+ type: "set(100)",
132
+ granularity: 1,
133
+ },
134
+ ]);
135
+ });
136
+ it("validates datasource index fields", () => {
137
+ expect(() => defineDatasource("events", {
138
+ schema: { id: t.string() },
139
+ indexes: [{ name: "invalid name", expr: "id", type: "set(100)", granularity: 1 }],
140
+ })).toThrow("Invalid datasource index name");
141
+ expect(() => defineDatasource("events", {
142
+ schema: { id: t.string() },
143
+ indexes: [{ name: "id_set", expr: "", type: "set(100)", granularity: 1 }],
144
+ })).toThrow('Invalid datasource index "id_set": expr is required.');
145
+ expect(() => defineDatasource("events", {
146
+ schema: { id: t.string() },
147
+ indexes: [{ name: "id_set", expr: "id", type: "", granularity: 1 }],
148
+ })).toThrow('Invalid datasource index "id_set": type is required.');
149
+ expect(() => defineDatasource("events", {
150
+ schema: { id: t.string() },
151
+ indexes: [{ name: "id_set", expr: "id", type: "set(100)", granularity: 0 }],
152
+ })).toThrow('Invalid datasource index "id_set": granularity must be a positive integer.');
153
+ });
115
154
  });
116
155
  describe("isDatasourceDefinition", () => {
117
156
  it("returns true for valid datasource", () => {
@@ -1 +1 @@
1
- {"version":3,"file":"datasource.test.js","sourceRoot":"","sources":["../../src/schema/datasource.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,MAAM,GACP,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEjG,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,EAAE,GAAG,gBAAgB,CAAC,QAAQ,EAAE;gBACpC,MAAM,EAAE;oBACN,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;oBACd,SAAS,EAAE,CAAC,CAAC,QAAQ,EAAE;iBACxB;aACF,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACpC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;YACxC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,EAAE,GAAG,gBAAgB,CAAC,QAAQ,EAAE;gBACpC,WAAW,EAAE,qBAAqB;gBAClC,MAAM,EAAE;oBACN,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;iBACf;aACF,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,EAAE,GAAG,gBAAgB,CAAC,QAAQ,EAAE;gBACpC,MAAM,EAAE;oBACN,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;oBACd,SAAS,EAAE,CAAC,CAAC,QAAQ,EAAE;iBACxB;gBACD,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC;oBACvB,UAAU,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC;oBAC/B,YAAY,EAAE,qBAAqB;iBACpC,CAAC;aACH,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;YACxC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,CAAC,GAAG,EAAE,CACV,gBAAgB,CAAC,YAAY,EAAE;gBAC7B,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;aAC3B,CAAC,CACH,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;YAErC,MAAM,CAAC,GAAG,EAAE,CACV,gBAAgB,CAAC,eAAe,EAAE;gBAChC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;aAC3B,CAAC,CACH,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;YAErC,MAAM,CAAC,GAAG,EAAE,CACV,gBAAgB,CAAC,EAAE,EAAE;gBACnB,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;aAC3B,CAAC,CACH,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,oBAAoB;YACpB,MAAM,GAAG,GAAG,gBAAgB,CAAC,UAAU,EAAE;gBACvC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;aAC3B,CAAC,CAAC;YACH,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAEnC,eAAe;YACf,MAAM,GAAG,GAAG,gBAAgB,CAAC,WAAW,EAAE;gBACxC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;aAC3B,CAAC,CAAC;YACH,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,SAAS,GAAG,qBAAqB,CAAC,UAAU,EAAE;gBAClD,gBAAgB,EAAE,wBAAwB;aAC3C,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,EAAE;gBACzC,MAAM,EAAE,WAAW;gBACnB,GAAG,EAAE,mDAAmD;aACzD,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,mBAAmB,CAAC,QAAQ,EAAE;gBAC5C,6BAA6B,EAAE,yDAAyD;aACzF,CAAC,CAAC;YAEH,MAAM,CAAC,GAAG,EAAE,CACV,gBAAgB,CAAC,QAAQ,EAAE;gBACzB,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC1B,KAAK,EAAE;oBACL,UAAU,EAAE,SAAS;oBACrB,KAAK,EAAE,QAAQ;iBAChB;gBACD,EAAE,EAAE;oBACF,UAAU,EAAE,MAAM;oBAClB,SAAS,EAAE,6BAA6B;iBACzC;aACF,CAAC,CACH,CAAC,OAAO,CAAC,2EAA2E,CAAC,CAAC;YAEvF,MAAM,CAAC,GAAG,EAAE,CACV,gBAAgB,CAAC,YAAY,EAAE;gBAC7B,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC1B,KAAK,EAAE;oBACL,UAAU,EAAE,SAAS;oBACrB,KAAK,EAAE,QAAQ;iBAChB;gBACD,GAAG,EAAE;oBACH,UAAU,EAAE,OAAO;oBACnB,SAAS,EAAE,6BAA6B;iBACzC;aACF,CAAC,CACH,CAAC,OAAO,CAAC,2EAA2E,CAAC,CAAC;QACzF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,OAAO,GAAG,mBAAmB,CAAC,QAAQ,EAAE;gBAC5C,6BAA6B,EAAE,yDAAyD;aACzF,CAAC,CAAC;YAEH,MAAM,EAAE,GAAG,gBAAgB,CAAC,YAAY,EAAE;gBACxC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC1B,GAAG,EAAE;oBACH,UAAU,EAAE,OAAO;oBACnB,SAAS,EAAE,6BAA6B;oBACxC,QAAQ,EAAE,OAAO;iBAClB;aACF,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxD,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,EAAE,GAAG,gBAAgB,CAAC,QAAQ,EAAE;gBACpC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;aAC3B,CAAC,CAAC;YAEH,MAAM,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/C,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjD,MAAM,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtD,MAAM,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrD,MAAM,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChD,MAAM,CAAC,sBAAsB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;YAExC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YACpD,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;YAElC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;YAC1D,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;YAEtC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAC/B,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;YAEtC,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YACnD,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;YACpE,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE;gBAC1D,QAAQ,EAAE,eAAe;aAC1B,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;YAEtC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,MAAM,GAAG;gBACb,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;gBACd,SAAS,EAAE,CAAC,CAAC,QAAQ,EAAE;gBACvB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;aACpB,CAAC;YAEF,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;YAErC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,KAAK,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC;YAEjC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAE/B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAC/B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC;YAE7D,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAC/B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"datasource.test.js","sourceRoot":"","sources":["../../src/schema/datasource.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tinybirdco/sdk",
3
- "version": "0.0.50",
3
+ "version": "0.0.51",
4
4
  "description": "TypeScript SDK for Tinybird Forward - define datasources and pipes as TypeScript",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -107,7 +107,7 @@ export const eventsEndpoint = definePipe("events_endpoint", {
107
107
  SELECT event_id, user_id, payload
108
108
  FROM events
109
109
  WHERE user_id = {{UInt64(user_id)}}
110
- AND env = {{String(env, 'prod')}}
110
+ AND env = {{ String(env) }}
111
111
  \`,
112
112
  }),
113
113
  node({
@@ -168,7 +168,7 @@ GROUP BY user_id
168
168
  sql: \`
169
169
  SELECT user_id, total
170
170
  FROM agg
171
- WHERE total > {{UInt32(min_total, 10)}}
171
+ WHERE total > {{ UInt32(min_total) }}
172
172
  \`,
173
173
  }),
174
174
  ],
@@ -668,6 +668,53 @@ IMPORT_FROM_TIMESTAMP 2024-01-01T00:00:00Z
668
668
  expect(output).toContain('fromTimestamp: "2024-01-01T00:00:00Z"');
669
669
  });
670
670
 
671
+ it("migrates single-quoted gcs import directives", async () => {
672
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tinybird-migrate-"));
673
+ tempDirs.push(tempDir);
674
+
675
+ writeFile(
676
+ tempDir,
677
+ "gcp_billing_reports.connection",
678
+ `TYPE gcs
679
+ GCS_SERVICE_ACCOUNT_CREDENTIALS_JSON {{tb_secret("GCP_SERVICE_ACCOUNT_CREDENTIALS_JSON")}}
680
+ `
681
+ );
682
+
683
+ writeFile(
684
+ tempDir,
685
+ "gcp_production_billing_account_landing.datasource",
686
+ `SCHEMA >
687
+ usage_start_time DateTime64(3)
688
+
689
+ ENGINE "MergeTree"
690
+ ENGINE_SORTING_KEY "usage_start_time"
691
+ IMPORT_CONNECTION_NAME 'gcp_billing_reports'
692
+ IMPORT_BUCKET_URI 'gs://tinybird-oa-sot-fwd/gcp_production_billing_reports/billing_*.csv.gz'
693
+ IMPORT_SCHEDULE '@on-demand'
694
+ `
695
+ );
696
+
697
+ const result = await runMigrate({
698
+ cwd: tempDir,
699
+ patterns: ["."],
700
+ strict: true,
701
+ });
702
+
703
+ expect(result.success).toBe(true);
704
+ expect(result.errors).toHaveLength(0);
705
+
706
+ const output = fs.readFileSync(result.outputPath, "utf-8");
707
+ expect(output).toContain(
708
+ 'export const gcpBillingReports = defineGCSConnection("gcp_billing_reports", {'
709
+ );
710
+ expect(output).toContain("gcs: {");
711
+ expect(output).toContain("connection: gcpBillingReports");
712
+ expect(output).toContain(
713
+ 'bucketUri: "gs://tinybird-oa-sot-fwd/gcp_production_billing_reports/billing_*.csv.gz"'
714
+ );
715
+ expect(output).toContain('schedule: "@on-demand"');
716
+ });
717
+
671
718
  it("reports an error when import directives use a non-bucket connection type", async () => {
672
719
  const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tinybird-migrate-"));
673
720
  tempDirs.push(tempDir);
@@ -750,6 +797,44 @@ KAFKA_STORE_RAW_VALUE True
750
797
  expect(output).toContain("storeRawValue: true");
751
798
  });
752
799
 
800
+ it("migrates INDEXES datasource block", async () => {
801
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tinybird-migrate-"));
802
+ tempDirs.push(tempDir);
803
+
804
+ writeFile(
805
+ tempDir,
806
+ "events.datasource",
807
+ `SCHEMA >
808
+ id String,
809
+ pipe_name String
810
+
811
+ ENGINE "MergeTree"
812
+ ENGINE_SORTING_KEY "id"
813
+ INDEXES >
814
+ pipe_name_set pipe_name TYPE set(100) GRANULARITY 1
815
+ id_bf lower(id) TYPE bloom_filter(0.001) GRANULARITY 4
816
+ `
817
+ );
818
+
819
+ const result = await runMigrate({
820
+ cwd: tempDir,
821
+ patterns: ["."],
822
+ strict: true,
823
+ });
824
+
825
+ expect(result.success).toBe(true);
826
+ expect(result.errors).toHaveLength(0);
827
+
828
+ const output = fs.readFileSync(result.outputPath, "utf-8");
829
+ expect(output).toContain("indexes: [");
830
+ expect(output).toContain(
831
+ '{ name: "pipe_name_set", expr: "pipe_name", type: "set(100)", granularity: 1 }'
832
+ );
833
+ expect(output).toContain(
834
+ '{ name: "id_bf", expr: "lower(id)", type: "bloom_filter(0.001)", granularity: 4 }'
835
+ );
836
+ });
837
+
753
838
  it("migrates kafka schema registry and engine is deleted directives", async () => {
754
839
  const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tinybird-migrate-"));
755
840
  tempDirs.push(tempDir);
@@ -900,6 +985,201 @@ TYPE ENDPOINT
900
985
  expect(output).toContain("endpoint: true,");
901
986
  });
902
987
 
988
+ it("supports Int/Integer aliases and column placeholder params", async () => {
989
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tinybird-migrate-"));
990
+ tempDirs.push(tempDir);
991
+
992
+ writeFile(
993
+ tempDir,
994
+ "placeholder_aliases.pipe",
995
+ `NODE endpoint
996
+ SQL >
997
+ SELECT event_id AS event_id
998
+ FROM events
999
+ WHERE score >= {{int(min_score, 10)}}
1000
+ ORDER BY {{column(sort_col)}} DESC
1001
+ LIMIT {{ Integer(limit, 50) }}
1002
+ TYPE endpoint
1003
+ `
1004
+ );
1005
+
1006
+ const result = await runMigrate({
1007
+ cwd: tempDir,
1008
+ patterns: ["."],
1009
+ strict: true,
1010
+ });
1011
+
1012
+ expect(result.success).toBe(true);
1013
+ expect(result.errors).toHaveLength(0);
1014
+
1015
+ const output = fs.readFileSync(result.outputPath, "utf-8");
1016
+ expect(output).toContain('export const placeholderAliases = definePipe("placeholder_aliases", {');
1017
+ expect(output).toContain("params: {");
1018
+ expect(output).toContain("limit: p.int32().optional(50),");
1019
+ expect(output).toContain("min_score: p.int32().optional(10),");
1020
+ expect(output).toContain("sort_col: p.column(),");
1021
+ });
1022
+
1023
+ it("supports error() placeholder helper without treating it as a param", async () => {
1024
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tinybird-migrate-"));
1025
+ tempDirs.push(tempDir);
1026
+
1027
+ writeFile(
1028
+ tempDir,
1029
+ "placeholder_error.pipe",
1030
+ `NODE endpoint
1031
+ SQL >
1032
+ %
1033
+ {% if not defined(start_date) and not defined(end_date) %}
1034
+ {{ error('start_date and end_date are required parameters') }}
1035
+ {% end %}
1036
+ SELECT 1 AS id
1037
+ WHERE now() >= {{DateTime(start_date, '2025-01-01 00:00:00')}}
1038
+ TYPE endpoint
1039
+ `
1040
+ );
1041
+
1042
+ const result = await runMigrate({
1043
+ cwd: tempDir,
1044
+ patterns: ["."],
1045
+ strict: true,
1046
+ });
1047
+
1048
+ expect(result.success).toBe(true);
1049
+ expect(result.errors).toHaveLength(0);
1050
+
1051
+ const output = fs.readFileSync(result.outputPath, "utf-8");
1052
+ expect(output).toContain('export const placeholderError = definePipe("placeholder_error", {');
1053
+ expect(output).toContain("params: {");
1054
+ expect(output).toContain('start_date: p.dateTime().optional("2025-01-01 00:00:00"),');
1055
+ expect(output).not.toContain("error:");
1056
+ });
1057
+
1058
+ it("uses the last explicit default and strips inline defaults from SQL", async () => {
1059
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tinybird-migrate-"));
1060
+ tempDirs.push(tempDir);
1061
+
1062
+ writeFile(
1063
+ tempDir,
1064
+ "last_default.pipe",
1065
+ `NODE endpoint
1066
+ SQL >
1067
+ SELECT 1
1068
+ WHERE d >= {{ String(start_date, '2025-03-01') }}
1069
+ AND d <= {{ String(start_date, '2025-04-01') }}
1070
+ TYPE endpoint
1071
+ `
1072
+ );
1073
+
1074
+ const result = await runMigrate({
1075
+ cwd: tempDir,
1076
+ patterns: ["."],
1077
+ strict: true,
1078
+ });
1079
+
1080
+ expect(result.success).toBe(true);
1081
+ expect(result.errors).toHaveLength(0);
1082
+
1083
+ const output = fs.readFileSync(result.outputPath, "utf-8");
1084
+ expect(output).toContain('start_date: p.string().optional("2025-04-01"),');
1085
+ expect(output).toContain("{{ String(start_date) }}");
1086
+ expect(output).not.toContain("{{ String(start_date, '2025-03-01') }}");
1087
+ expect(output).not.toContain("{{ String(start_date, '2025-04-01') }}");
1088
+ });
1089
+
1090
+ it("keeps the previous truthy default when a later duplicate uses a falsy default", async () => {
1091
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tinybird-migrate-"));
1092
+ tempDirs.push(tempDir);
1093
+
1094
+ writeFile(
1095
+ tempDir,
1096
+ "truthy_default_precedence.pipe",
1097
+ `NODE endpoint
1098
+ SQL >
1099
+ SELECT 1
1100
+ WHERE d >= {{ String(start_date, '2025-03-01') }}
1101
+ AND d <= {{ String(start_date, '') }}
1102
+ TYPE endpoint
1103
+ `
1104
+ );
1105
+
1106
+ const result = await runMigrate({
1107
+ cwd: tempDir,
1108
+ patterns: ["."],
1109
+ strict: true,
1110
+ });
1111
+
1112
+ expect(result.success).toBe(true);
1113
+ expect(result.errors).toHaveLength(0);
1114
+
1115
+ const output = fs.readFileSync(result.outputPath, "utf-8");
1116
+ expect(output).toContain('start_date: p.string().optional("2025-03-01"),');
1117
+ expect(output).toContain("{{ String(start_date) }}");
1118
+ });
1119
+
1120
+ it("extracts params from placeholder expressions with multiple function calls", async () => {
1121
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tinybird-migrate-"));
1122
+ tempDirs.push(tempDir);
1123
+
1124
+ writeFile(
1125
+ tempDir,
1126
+ "expression_params.pipe",
1127
+ `NODE endpoint
1128
+ SQL >
1129
+ SELECT 1
1130
+ LIMIT {{ Int32(limit, 20) }}
1131
+ OFFSET {{ Int32(page, 0) * Int32(limit, 20) }}
1132
+ TYPE endpoint
1133
+ `
1134
+ );
1135
+
1136
+ const result = await runMigrate({
1137
+ cwd: tempDir,
1138
+ patterns: ["."],
1139
+ strict: true,
1140
+ });
1141
+
1142
+ expect(result.success).toBe(true);
1143
+ expect(result.errors).toHaveLength(0);
1144
+
1145
+ const output = fs.readFileSync(result.outputPath, "utf-8");
1146
+ expect(output).toContain("limit: p.int32().optional(20),");
1147
+ expect(output).toContain("page: p.int32().optional(0),");
1148
+ expect(output).toContain("{{ Int32(limit) }}");
1149
+ expect(output).toContain("{{ Int32(page) * Int32(limit) }}");
1150
+ });
1151
+
1152
+ it("uses the last explicit type when a param appears with mixed placeholder types", async () => {
1153
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tinybird-migrate-"));
1154
+ tempDirs.push(tempDir);
1155
+
1156
+ writeFile(
1157
+ tempDir,
1158
+ "last_type.pipe",
1159
+ `NODE endpoint
1160
+ SQL >
1161
+ SELECT 1
1162
+ WHERE d >= {{ Date(start_date) }}
1163
+ AND d <= {{ String(start_date, '2025-04-01') }}
1164
+ TYPE endpoint
1165
+ `
1166
+ );
1167
+
1168
+ const result = await runMigrate({
1169
+ cwd: tempDir,
1170
+ patterns: ["."],
1171
+ strict: true,
1172
+ });
1173
+
1174
+ expect(result.success).toBe(true);
1175
+ expect(result.errors).toHaveLength(0);
1176
+
1177
+ const output = fs.readFileSync(result.outputPath, "utf-8");
1178
+ expect(output).toContain('start_date: p.string().optional("2025-04-01"),');
1179
+ expect(output).toContain("{{ Date(start_date) }}");
1180
+ expect(output).toContain("{{ String(start_date) }}");
1181
+ });
1182
+
903
1183
  it("parses multiline datasource blocks with flexible indentation", async () => {
904
1184
  const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tinybird-migrate-"));
905
1185
  tempDirs.push(tempDir);
@@ -1198,6 +1478,38 @@ TYPE endpoint
1198
1478
  );
1199
1479
  });
1200
1480
 
1481
+ it("ignores function-like text inside quoted descriptions when parsing placeholders", async () => {
1482
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tinybird-migrate-"));
1483
+ tempDirs.push(tempDir);
1484
+
1485
+ writeFile(
1486
+ tempDir,
1487
+ "description_parentheses.pipe",
1488
+ `NODE endpoint
1489
+ SQL >
1490
+ %
1491
+ SELECT 1 AS id
1492
+ WHERE ts >= now() - interval {{Int32(days, 1, description="Number of days to analyze (defaults to 1 day)")}} day
1493
+ TYPE endpoint
1494
+ `
1495
+ );
1496
+
1497
+ const result = await runMigrate({
1498
+ cwd: tempDir,
1499
+ patterns: ["."],
1500
+ strict: true,
1501
+ });
1502
+
1503
+ expect(result.success).toBe(true);
1504
+ expect(result.errors).toHaveLength(0);
1505
+
1506
+ const output = fs.readFileSync(result.outputPath, "utf-8");
1507
+ expect(output).toContain(
1508
+ 'days: p.int32().optional(1).describe("Number of days to analyze (defaults to 1 day)"),'
1509
+ );
1510
+ expect(output).toContain("{{ Int32(days) }}");
1511
+ });
1512
+
1201
1513
  it("migrates datasource with mixed explicit and default json paths", async () => {
1202
1514
  const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tinybird-migrate-"));
1203
1515
  tempDirs.push(tempDir);
@@ -1449,6 +1761,49 @@ EXPORT_COMPRESSION gzip
1449
1761
  expect(output).toContain('compression: "gzip"');
1450
1762
  });
1451
1763
 
1764
+ it("migrates legacy EXPORT_WRITE_STRATEGY sink directives", async () => {
1765
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tinybird-migrate-"));
1766
+ tempDirs.push(tempDir);
1767
+
1768
+ writeFile(
1769
+ tempDir,
1770
+ "exports_s3.connection",
1771
+ `TYPE s3
1772
+ S3_REGION "us-east-1"
1773
+ S3_ARN "arn:aws:iam::123456789012:role/tinybird-s3-access"
1774
+ `
1775
+ );
1776
+
1777
+ writeFile(
1778
+ tempDir,
1779
+ "events_s3_sink.pipe",
1780
+ `NODE export
1781
+ SQL >
1782
+ SELECT * FROM events
1783
+ TYPE sink
1784
+ EXPORT_CONNECTION_NAME exports_s3
1785
+ EXPORT_BUCKET_URI s3://exports/events/
1786
+ EXPORT_FILE_TEMPLATE events_{date}
1787
+ EXPORT_SCHEDULE @once
1788
+ EXPORT_FORMAT ndjson
1789
+ EXPORT_WRITE_STRATEGY truncate
1790
+ `
1791
+ );
1792
+
1793
+ const result = await runMigrate({
1794
+ cwd: tempDir,
1795
+ patterns: ["."],
1796
+ strict: true,
1797
+ });
1798
+
1799
+ expect(result.success).toBe(true);
1800
+ expect(result.errors).toHaveLength(0);
1801
+
1802
+ const output = fs.readFileSync(result.outputPath, "utf-8");
1803
+ expect(output).toContain('export const eventsS3Sink = defineSinkPipe("events_s3_sink", {');
1804
+ expect(output).toContain('strategy: "replace"');
1805
+ });
1806
+
1452
1807
  it("reports an error when sink pipe references a missing connection", async () => {
1453
1808
  const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tinybird-migrate-"));
1454
1809
  tempDirs.push(tempDir);
@@ -132,6 +132,18 @@ describe("clickhouseTypeToValidator", () => {
132
132
  "t.map(t.string(), t.int32())"
133
133
  );
134
134
  });
135
+
136
+ it("handles Tuple(T1, T2, ...)", () => {
137
+ expect(clickhouseTypeToValidator("Tuple(String, Float64, String)")).toBe(
138
+ "t.tuple(t.string(), t.float64(), t.string())"
139
+ );
140
+ });
141
+
142
+ it("handles Array(Tuple(...))", () => {
143
+ expect(clickhouseTypeToValidator("Array(Tuple(String, Float64, String))")).toBe(
144
+ "t.array(t.tuple(t.string(), t.float64(), t.string()))"
145
+ );
146
+ });
135
147
  });
136
148
 
137
149
  describe("enum types", () => {
@@ -160,6 +172,12 @@ describe("clickhouseTypeToValidator", () => {
160
172
  't.aggregateFunction("uniq", t.string())'
161
173
  );
162
174
  });
175
+
176
+ it("handles AggregateFunction(count) without explicit state type", () => {
177
+ expect(clickhouseTypeToValidator("AggregateFunction(count)")).toBe(
178
+ 't.aggregateFunction("count", t.uint64())'
179
+ );
180
+ });
163
181
  });
164
182
 
165
183
  describe("unknown types", () => {
@@ -16,6 +16,61 @@ function parseEnumValues(enumContent: string): string[] {
16
16
  return values;
17
17
  }
18
18
 
19
+ function splitTopLevelComma(input: string): string[] {
20
+ const parts: string[] = [];
21
+ let current = "";
22
+ let depth = 0;
23
+ let inSingleQuote = false;
24
+ let inDoubleQuote = false;
25
+
26
+ for (let i = 0; i < input.length; i += 1) {
27
+ const char = input[i];
28
+ const prev = i > 0 ? input[i - 1] : "";
29
+
30
+ if (char === "'" && !inDoubleQuote && prev !== "\\") {
31
+ inSingleQuote = !inSingleQuote;
32
+ current += char;
33
+ continue;
34
+ }
35
+
36
+ if (char === '"' && !inSingleQuote && prev !== "\\") {
37
+ inDoubleQuote = !inDoubleQuote;
38
+ current += char;
39
+ continue;
40
+ }
41
+
42
+ if (!inSingleQuote && !inDoubleQuote) {
43
+ if (char === "(") {
44
+ depth += 1;
45
+ current += char;
46
+ continue;
47
+ }
48
+ if (char === ")") {
49
+ depth -= 1;
50
+ current += char;
51
+ continue;
52
+ }
53
+ if (char === "," && depth === 0) {
54
+ const trimmed = current.trim();
55
+ if (trimmed.length > 0) {
56
+ parts.push(trimmed);
57
+ }
58
+ current = "";
59
+ continue;
60
+ }
61
+ }
62
+
63
+ current += char;
64
+ }
65
+
66
+ const trimmed = current.trim();
67
+ if (trimmed.length > 0) {
68
+ parts.push(trimmed);
69
+ }
70
+
71
+ return parts;
72
+ }
73
+
19
74
  /**
20
75
  * Map a ClickHouse type to a t.* validator call
21
76
  *
@@ -138,19 +193,26 @@ export function clickhouseTypeToValidator(chType: string): string {
138
193
  return `t.array(${innerType})`;
139
194
  }
140
195
 
141
- // Tuple(T1, T2, ...) - simplified handling
196
+ // Tuple(T1, T2, ...)
142
197
  const tupleMatch = chType.match(/^Tuple\((.+)\)$/);
143
198
  if (tupleMatch) {
144
- // For complex tuples, we just use a JSON type
145
- // TODO: Could parse and generate t.tuple() for simple cases
146
- return `t.json() /* Tuple: ${chType} */`;
199
+ const tupleArgs = splitTopLevelComma(tupleMatch[1]);
200
+ if (tupleArgs.length === 0) {
201
+ return `t.string() /* TODO: Unknown type: ${chType} */`;
202
+ }
203
+ const tupleTypes = tupleArgs.map((arg) => clickhouseTypeToValidator(arg));
204
+ return `t.tuple(${tupleTypes.join(", ")})`;
147
205
  }
148
206
 
149
207
  // Map(K, V)
150
- const mapMatch = chType.match(/^Map\(([^,]+),\s*(.+)\)$/);
208
+ const mapMatch = chType.match(/^Map\((.+)\)$/);
151
209
  if (mapMatch) {
152
- const keyType = clickhouseTypeToValidator(mapMatch[1]);
153
- const valueType = clickhouseTypeToValidator(mapMatch[2]);
210
+ const mapArgs = splitTopLevelComma(mapMatch[1]);
211
+ if (mapArgs.length !== 2) {
212
+ return `t.string() /* TODO: Unknown type: ${chType} */`;
213
+ }
214
+ const keyType = clickhouseTypeToValidator(mapArgs[0]);
215
+ const valueType = clickhouseTypeToValidator(mapArgs[1]);
154
216
  return `t.map(${keyType}, ${valueType})`;
155
217
  }
156
218
 
@@ -190,6 +252,16 @@ export function clickhouseTypeToValidator(chType: string): string {
190
252
  return `t.aggregateFunction("${func}", ${innerType})`;
191
253
  }
192
254
 
255
+ // AggregateFunction(count)
256
+ const aggNoArgMatch = chType.match(/^AggregateFunction\((\w+)\)$/);
257
+ if (aggNoArgMatch) {
258
+ const func = aggNoArgMatch[1];
259
+ if (func === "count") {
260
+ return 't.aggregateFunction("count", t.uint64())';
261
+ }
262
+ return `t.string() /* TODO: Unknown type: ${chType} */`;
263
+ }
264
+
193
265
  // Nested - treat as JSON
194
266
  if (chType.startsWith("Nested(")) {
195
267
  return `t.json() /* ${chType} */`;