@tinybirdco/sdk 0.0.1

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 (258) hide show
  1. package/README.md +518 -0
  2. package/bin/tinybird.js +7 -0
  3. package/dist/api/branches.d.ts +98 -0
  4. package/dist/api/branches.d.ts.map +1 -0
  5. package/dist/api/branches.js +203 -0
  6. package/dist/api/branches.js.map +1 -0
  7. package/dist/api/branches.test.d.ts +2 -0
  8. package/dist/api/branches.test.d.ts.map +1 -0
  9. package/dist/api/branches.test.js +286 -0
  10. package/dist/api/branches.test.js.map +1 -0
  11. package/dist/api/build.d.ts +130 -0
  12. package/dist/api/build.d.ts.map +1 -0
  13. package/dist/api/build.js +143 -0
  14. package/dist/api/build.js.map +1 -0
  15. package/dist/api/build.test.d.ts +2 -0
  16. package/dist/api/build.test.d.ts.map +1 -0
  17. package/dist/api/build.test.js +138 -0
  18. package/dist/api/build.test.js.map +1 -0
  19. package/dist/api/deploy.d.ts +39 -0
  20. package/dist/api/deploy.d.ts.map +1 -0
  21. package/dist/api/deploy.js +135 -0
  22. package/dist/api/deploy.js.map +1 -0
  23. package/dist/api/deploy.test.d.ts +2 -0
  24. package/dist/api/deploy.test.d.ts.map +1 -0
  25. package/dist/api/deploy.test.js +118 -0
  26. package/dist/api/deploy.test.js.map +1 -0
  27. package/dist/api/workspaces.d.ts +46 -0
  28. package/dist/api/workspaces.d.ts.map +1 -0
  29. package/dist/api/workspaces.js +39 -0
  30. package/dist/api/workspaces.js.map +1 -0
  31. package/dist/api/workspaces.test.d.ts +2 -0
  32. package/dist/api/workspaces.test.d.ts.map +1 -0
  33. package/dist/api/workspaces.test.js +65 -0
  34. package/dist/api/workspaces.test.js.map +1 -0
  35. package/dist/cli/auth.d.ts +86 -0
  36. package/dist/cli/auth.d.ts.map +1 -0
  37. package/dist/cli/auth.js +284 -0
  38. package/dist/cli/auth.js.map +1 -0
  39. package/dist/cli/branch-store.d.ts +53 -0
  40. package/dist/cli/branch-store.d.ts.map +1 -0
  41. package/dist/cli/branch-store.js +91 -0
  42. package/dist/cli/branch-store.js.map +1 -0
  43. package/dist/cli/branch-store.test.d.ts +2 -0
  44. package/dist/cli/branch-store.test.d.ts.map +1 -0
  45. package/dist/cli/branch-store.test.js +115 -0
  46. package/dist/cli/branch-store.test.js.map +1 -0
  47. package/dist/cli/commands/branch.d.ts +82 -0
  48. package/dist/cli/commands/branch.d.ts.map +1 -0
  49. package/dist/cli/commands/branch.js +215 -0
  50. package/dist/cli/commands/branch.js.map +1 -0
  51. package/dist/cli/commands/build.d.ts +43 -0
  52. package/dist/cli/commands/build.d.ts.map +1 -0
  53. package/dist/cli/commands/build.js +138 -0
  54. package/dist/cli/commands/build.js.map +1 -0
  55. package/dist/cli/commands/dev.d.ts +78 -0
  56. package/dist/cli/commands/dev.d.ts.map +1 -0
  57. package/dist/cli/commands/dev.js +226 -0
  58. package/dist/cli/commands/dev.js.map +1 -0
  59. package/dist/cli/commands/init.d.ts +45 -0
  60. package/dist/cli/commands/init.d.ts.map +1 -0
  61. package/dist/cli/commands/init.js +277 -0
  62. package/dist/cli/commands/init.js.map +1 -0
  63. package/dist/cli/commands/init.test.d.ts +2 -0
  64. package/dist/cli/commands/init.test.d.ts.map +1 -0
  65. package/dist/cli/commands/init.test.js +158 -0
  66. package/dist/cli/commands/init.test.js.map +1 -0
  67. package/dist/cli/commands/login.d.ts +37 -0
  68. package/dist/cli/commands/login.d.ts.map +1 -0
  69. package/dist/cli/commands/login.js +64 -0
  70. package/dist/cli/commands/login.js.map +1 -0
  71. package/dist/cli/config.d.ts +114 -0
  72. package/dist/cli/config.d.ts.map +1 -0
  73. package/dist/cli/config.js +258 -0
  74. package/dist/cli/config.js.map +1 -0
  75. package/dist/cli/config.test.d.ts +2 -0
  76. package/dist/cli/config.test.d.ts.map +1 -0
  77. package/dist/cli/config.test.js +243 -0
  78. package/dist/cli/config.test.js.map +1 -0
  79. package/dist/cli/env.d.ts +29 -0
  80. package/dist/cli/env.d.ts.map +1 -0
  81. package/dist/cli/env.js +66 -0
  82. package/dist/cli/env.js.map +1 -0
  83. package/dist/cli/git.d.ts +29 -0
  84. package/dist/cli/git.d.ts.map +1 -0
  85. package/dist/cli/git.js +114 -0
  86. package/dist/cli/git.js.map +1 -0
  87. package/dist/cli/git.test.d.ts +2 -0
  88. package/dist/cli/git.test.d.ts.map +1 -0
  89. package/dist/cli/git.test.js +125 -0
  90. package/dist/cli/git.test.js.map +1 -0
  91. package/dist/cli/index.d.ts +7 -0
  92. package/dist/cli/index.d.ts.map +1 -0
  93. package/dist/cli/index.js +337 -0
  94. package/dist/cli/index.js.map +1 -0
  95. package/dist/cli/utils/schema-validation.d.ts +95 -0
  96. package/dist/cli/utils/schema-validation.d.ts.map +1 -0
  97. package/dist/cli/utils/schema-validation.js +175 -0
  98. package/dist/cli/utils/schema-validation.js.map +1 -0
  99. package/dist/cli/utils/schema-validation.test.d.ts +5 -0
  100. package/dist/cli/utils/schema-validation.test.d.ts.map +1 -0
  101. package/dist/cli/utils/schema-validation.test.js +173 -0
  102. package/dist/cli/utils/schema-validation.test.js.map +1 -0
  103. package/dist/client/base.d.ts +116 -0
  104. package/dist/client/base.d.ts.map +1 -0
  105. package/dist/client/base.js +328 -0
  106. package/dist/client/base.js.map +1 -0
  107. package/dist/client/types.d.ts +137 -0
  108. package/dist/client/types.d.ts.map +1 -0
  109. package/dist/client/types.js +43 -0
  110. package/dist/client/types.js.map +1 -0
  111. package/dist/generator/client.d.ts +44 -0
  112. package/dist/generator/client.d.ts.map +1 -0
  113. package/dist/generator/client.js +144 -0
  114. package/dist/generator/client.js.map +1 -0
  115. package/dist/generator/datasource.d.ts +57 -0
  116. package/dist/generator/datasource.d.ts.map +1 -0
  117. package/dist/generator/datasource.js +169 -0
  118. package/dist/generator/datasource.js.map +1 -0
  119. package/dist/generator/datasource.test.d.ts +2 -0
  120. package/dist/generator/datasource.test.d.ts.map +1 -0
  121. package/dist/generator/datasource.test.js +254 -0
  122. package/dist/generator/datasource.test.js.map +1 -0
  123. package/dist/generator/index.d.ts +131 -0
  124. package/dist/generator/index.d.ts.map +1 -0
  125. package/dist/generator/index.js +121 -0
  126. package/dist/generator/index.js.map +1 -0
  127. package/dist/generator/index.test.d.ts +2 -0
  128. package/dist/generator/index.test.d.ts.map +1 -0
  129. package/dist/generator/index.test.js +175 -0
  130. package/dist/generator/index.test.js.map +1 -0
  131. package/dist/generator/loader.d.ts +156 -0
  132. package/dist/generator/loader.d.ts.map +1 -0
  133. package/dist/generator/loader.js +295 -0
  134. package/dist/generator/loader.js.map +1 -0
  135. package/dist/generator/pipe.d.ts +72 -0
  136. package/dist/generator/pipe.d.ts.map +1 -0
  137. package/dist/generator/pipe.js +174 -0
  138. package/dist/generator/pipe.js.map +1 -0
  139. package/dist/generator/pipe.test.d.ts +2 -0
  140. package/dist/generator/pipe.test.d.ts.map +1 -0
  141. package/dist/generator/pipe.test.js +393 -0
  142. package/dist/generator/pipe.test.js.map +1 -0
  143. package/dist/index.d.ts +74 -0
  144. package/dist/index.d.ts.map +1 -0
  145. package/dist/index.js +73 -0
  146. package/dist/index.js.map +1 -0
  147. package/dist/infer/index.d.ts +202 -0
  148. package/dist/infer/index.d.ts.map +1 -0
  149. package/dist/infer/index.js +5 -0
  150. package/dist/infer/index.js.map +1 -0
  151. package/dist/schema/datasource.d.ts +135 -0
  152. package/dist/schema/datasource.d.ts.map +1 -0
  153. package/dist/schema/datasource.js +105 -0
  154. package/dist/schema/datasource.js.map +1 -0
  155. package/dist/schema/datasource.test.d.ts +2 -0
  156. package/dist/schema/datasource.test.d.ts.map +1 -0
  157. package/dist/schema/datasource.test.js +142 -0
  158. package/dist/schema/datasource.test.js.map +1 -0
  159. package/dist/schema/engines.d.ts +157 -0
  160. package/dist/schema/engines.d.ts.map +1 -0
  161. package/dist/schema/engines.js +155 -0
  162. package/dist/schema/engines.js.map +1 -0
  163. package/dist/schema/engines.test.d.ts +2 -0
  164. package/dist/schema/engines.test.d.ts.map +1 -0
  165. package/dist/schema/engines.test.js +221 -0
  166. package/dist/schema/engines.test.js.map +1 -0
  167. package/dist/schema/params.d.ts +106 -0
  168. package/dist/schema/params.d.ts.map +1 -0
  169. package/dist/schema/params.js +138 -0
  170. package/dist/schema/params.js.map +1 -0
  171. package/dist/schema/params.test.d.ts +2 -0
  172. package/dist/schema/params.test.d.ts.map +1 -0
  173. package/dist/schema/params.test.js +175 -0
  174. package/dist/schema/params.test.js.map +1 -0
  175. package/dist/schema/pipe.d.ts +436 -0
  176. package/dist/schema/pipe.d.ts.map +1 -0
  177. package/dist/schema/pipe.js +484 -0
  178. package/dist/schema/pipe.js.map +1 -0
  179. package/dist/schema/pipe.test.d.ts +2 -0
  180. package/dist/schema/pipe.test.d.ts.map +1 -0
  181. package/dist/schema/pipe.test.js +488 -0
  182. package/dist/schema/pipe.test.js.map +1 -0
  183. package/dist/schema/project.d.ts +202 -0
  184. package/dist/schema/project.d.ts.map +1 -0
  185. package/dist/schema/project.js +188 -0
  186. package/dist/schema/project.js.map +1 -0
  187. package/dist/schema/project.test.d.ts +2 -0
  188. package/dist/schema/project.test.d.ts.map +1 -0
  189. package/dist/schema/project.test.js +180 -0
  190. package/dist/schema/project.test.js.map +1 -0
  191. package/dist/schema/types.d.ts +140 -0
  192. package/dist/schema/types.d.ts.map +1 -0
  193. package/dist/schema/types.js +174 -0
  194. package/dist/schema/types.js.map +1 -0
  195. package/dist/schema/types.test.d.ts +2 -0
  196. package/dist/schema/types.test.d.ts.map +1 -0
  197. package/dist/schema/types.test.js +176 -0
  198. package/dist/schema/types.test.js.map +1 -0
  199. package/dist/test/handlers.d.ts +58 -0
  200. package/dist/test/handlers.d.ts.map +1 -0
  201. package/dist/test/handlers.js +62 -0
  202. package/dist/test/handlers.js.map +1 -0
  203. package/dist/test/setup.d.ts +5 -0
  204. package/dist/test/setup.d.ts.map +1 -0
  205. package/dist/test/setup.js +11 -0
  206. package/dist/test/setup.js.map +1 -0
  207. package/package.json +57 -0
  208. package/src/api/branches.test.ts +377 -0
  209. package/src/api/branches.ts +334 -0
  210. package/src/api/build.test.ts +216 -0
  211. package/src/api/build.ts +266 -0
  212. package/src/api/deploy.test.ts +193 -0
  213. package/src/api/deploy.ts +163 -0
  214. package/src/api/workspaces.test.ts +81 -0
  215. package/src/api/workspaces.ts +77 -0
  216. package/src/cli/auth.ts +358 -0
  217. package/src/cli/branch-store.test.ts +139 -0
  218. package/src/cli/branch-store.ts +137 -0
  219. package/src/cli/commands/branch.ts +306 -0
  220. package/src/cli/commands/build.ts +183 -0
  221. package/src/cli/commands/dev.ts +334 -0
  222. package/src/cli/commands/init.test.ts +249 -0
  223. package/src/cli/commands/init.ts +323 -0
  224. package/src/cli/commands/login.ts +98 -0
  225. package/src/cli/config.test.ts +359 -0
  226. package/src/cli/config.ts +335 -0
  227. package/src/cli/env.ts +86 -0
  228. package/src/cli/git.test.ts +147 -0
  229. package/src/cli/git.ts +125 -0
  230. package/src/cli/index.ts +382 -0
  231. package/src/cli/utils/schema-validation.test.ts +222 -0
  232. package/src/cli/utils/schema-validation.ts +272 -0
  233. package/src/client/base.ts +414 -0
  234. package/src/client/types.ts +165 -0
  235. package/src/generator/client.ts +194 -0
  236. package/src/generator/datasource.test.ts +297 -0
  237. package/src/generator/datasource.ts +217 -0
  238. package/src/generator/index.test.ts +209 -0
  239. package/src/generator/index.ts +203 -0
  240. package/src/generator/loader.ts +406 -0
  241. package/src/generator/pipe.test.ts +441 -0
  242. package/src/generator/pipe.ts +220 -0
  243. package/src/index.ts +191 -0
  244. package/src/infer/index.ts +247 -0
  245. package/src/schema/datasource.test.ts +187 -0
  246. package/src/schema/datasource.ts +195 -0
  247. package/src/schema/engines.test.ts +247 -0
  248. package/src/schema/engines.ts +271 -0
  249. package/src/schema/params.test.ts +208 -0
  250. package/src/schema/params.ts +249 -0
  251. package/src/schema/pipe.test.ts +588 -0
  252. package/src/schema/pipe.ts +832 -0
  253. package/src/schema/project.test.ts +236 -0
  254. package/src/schema/project.ts +394 -0
  255. package/src/schema/types.test.ts +212 -0
  256. package/src/schema/types.ts +366 -0
  257. package/src/test/handlers.ts +79 -0
  258. package/src/test/setup.ts +13 -0
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Tests for schema validation utility
3
+ */
4
+ import { describe, it, expect } from "vitest";
5
+ import { _typesAreCompatible, _validateOutputSchema, _hasRequiredParams, _buildDefaultParams, } from "./schema-validation.js";
6
+ describe("typesAreCompatible", () => {
7
+ it("matches identical types", () => {
8
+ expect(_typesAreCompatible("String", "String")).toBe(true);
9
+ expect(_typesAreCompatible("Int64", "Int64")).toBe(true);
10
+ expect(_typesAreCompatible("UInt64", "UInt64")).toBe(true);
11
+ });
12
+ it("matches Nullable wrapped types", () => {
13
+ expect(_typesAreCompatible("Nullable(String)", "String")).toBe(true);
14
+ expect(_typesAreCompatible("Nullable(Int64)", "Int64")).toBe(true);
15
+ });
16
+ it("matches LowCardinality wrapped types", () => {
17
+ expect(_typesAreCompatible("LowCardinality(String)", "String")).toBe(true);
18
+ });
19
+ it("matches LowCardinality(Nullable(...)) wrapped types", () => {
20
+ expect(_typesAreCompatible("LowCardinality(Nullable(String))", "String")).toBe(true);
21
+ });
22
+ it("matches DateTime with timezone to base DateTime", () => {
23
+ expect(_typesAreCompatible("DateTime('UTC')", "DateTime")).toBe(true);
24
+ expect(_typesAreCompatible("DateTime('Europe/Madrid')", "DateTime")).toBe(true);
25
+ });
26
+ it("matches DateTime64 with precision", () => {
27
+ expect(_typesAreCompatible("DateTime64(3)", "DateTime64")).toBe(true);
28
+ expect(_typesAreCompatible("DateTime64(6, 'UTC')", "DateTime64")).toBe(true);
29
+ });
30
+ it("rejects mismatched types", () => {
31
+ expect(_typesAreCompatible("String", "Int64")).toBe(false);
32
+ expect(_typesAreCompatible("UInt64", "Int64")).toBe(false);
33
+ expect(_typesAreCompatible("DateTime", "Date")).toBe(false);
34
+ });
35
+ });
36
+ describe("validateOutputSchema", () => {
37
+ it("validates matching schema", () => {
38
+ const responseMeta = [
39
+ { name: "id", type: "UInt64" },
40
+ { name: "name", type: "String" },
41
+ ];
42
+ const outputSchema = {
43
+ id: { _tinybirdType: "UInt64" },
44
+ name: { _tinybirdType: "String" },
45
+ };
46
+ const result = _validateOutputSchema(responseMeta, outputSchema);
47
+ expect(result.valid).toBe(true);
48
+ expect(result.missingColumns).toHaveLength(0);
49
+ expect(result.extraColumns).toHaveLength(0);
50
+ expect(result.typeMismatches).toHaveLength(0);
51
+ });
52
+ it("detects missing columns", () => {
53
+ const responseMeta = [{ name: "id", type: "UInt64" }];
54
+ const outputSchema = {
55
+ id: { _tinybirdType: "UInt64" },
56
+ name: { _tinybirdType: "String" },
57
+ };
58
+ const result = _validateOutputSchema(responseMeta, outputSchema);
59
+ expect(result.valid).toBe(false);
60
+ expect(result.missingColumns).toHaveLength(1);
61
+ expect(result.missingColumns[0]).toEqual({
62
+ name: "name",
63
+ expectedType: "String",
64
+ });
65
+ });
66
+ it("detects extra columns", () => {
67
+ const responseMeta = [
68
+ { name: "id", type: "UInt64" },
69
+ { name: "extra", type: "String" },
70
+ ];
71
+ const outputSchema = {
72
+ id: { _tinybirdType: "UInt64" },
73
+ };
74
+ const result = _validateOutputSchema(responseMeta, outputSchema);
75
+ // Extra columns are warnings, not errors
76
+ expect(result.valid).toBe(true);
77
+ expect(result.extraColumns).toHaveLength(1);
78
+ expect(result.extraColumns[0]).toEqual({
79
+ name: "extra",
80
+ actualType: "String",
81
+ });
82
+ });
83
+ it("detects type mismatches", () => {
84
+ const responseMeta = [{ name: "count", type: "Int64" }];
85
+ const outputSchema = {
86
+ count: { _tinybirdType: "UInt64" },
87
+ };
88
+ const result = _validateOutputSchema(responseMeta, outputSchema);
89
+ expect(result.valid).toBe(false);
90
+ expect(result.typeMismatches).toHaveLength(1);
91
+ expect(result.typeMismatches[0]).toEqual({
92
+ name: "count",
93
+ expectedType: "UInt64",
94
+ actualType: "Int64",
95
+ });
96
+ });
97
+ it("handles Nullable types as compatible", () => {
98
+ const responseMeta = [
99
+ { name: "value", type: "Nullable(String)" },
100
+ ];
101
+ const outputSchema = {
102
+ value: { _tinybirdType: "String" },
103
+ };
104
+ const result = _validateOutputSchema(responseMeta, outputSchema);
105
+ expect(result.valid).toBe(true);
106
+ expect(result.typeMismatches).toHaveLength(0);
107
+ });
108
+ });
109
+ describe("hasRequiredParams", () => {
110
+ it("returns false for pipe with no params", () => {
111
+ const pipe = { _name: "test" };
112
+ expect(_hasRequiredParams(pipe)).toBe(false);
113
+ });
114
+ it("returns false for pipe with only optional params", () => {
115
+ const pipe = {
116
+ _name: "test",
117
+ _params: {
118
+ limit: { _required: false, _default: 10 },
119
+ },
120
+ };
121
+ expect(_hasRequiredParams(pipe)).toBe(false);
122
+ });
123
+ it("returns true for pipe with required param without default", () => {
124
+ const pipe = {
125
+ _name: "test",
126
+ _params: {
127
+ start_date: { _required: true, _default: undefined },
128
+ },
129
+ };
130
+ expect(_hasRequiredParams(pipe)).toBe(true);
131
+ });
132
+ it("returns false for required param with default value", () => {
133
+ const pipe = {
134
+ _name: "test",
135
+ _params: {
136
+ start_date: { _required: true, _default: "2024-01-01" },
137
+ },
138
+ };
139
+ expect(_hasRequiredParams(pipe)).toBe(false);
140
+ });
141
+ });
142
+ describe("buildDefaultParams", () => {
143
+ it("returns empty object for pipe with no params", () => {
144
+ const pipe = { _name: "test" };
145
+ expect(_buildDefaultParams(pipe)).toEqual({});
146
+ });
147
+ it("includes params with default values", () => {
148
+ const pipe = {
149
+ _name: "test",
150
+ _params: {
151
+ limit: { _required: false, _default: 10 },
152
+ offset: { _required: false, _default: 0 },
153
+ },
154
+ };
155
+ expect(_buildDefaultParams(pipe)).toEqual({
156
+ limit: 10,
157
+ offset: 0,
158
+ });
159
+ });
160
+ it("excludes params without default values", () => {
161
+ const pipe = {
162
+ _name: "test",
163
+ _params: {
164
+ limit: { _required: false, _default: 10 },
165
+ start_date: { _required: true, _default: undefined },
166
+ },
167
+ };
168
+ expect(_buildDefaultParams(pipe)).toEqual({
169
+ limit: 10,
170
+ });
171
+ });
172
+ });
173
+ //# sourceMappingURL=schema-validation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-validation.test.js","sourceRoot":"","sources":["../../../src/cli/utils/schema-validation.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAIhC,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,MAAM,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,mBAAmB,CAAC,wBAAwB,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,CACJ,mBAAmB,CAAC,kCAAkC,EAAE,QAAQ,CAAC,CAClE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,CAAC,mBAAmB,CAAC,2BAA2B,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CACvE,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,mBAAmB,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,CAAC,mBAAmB,CAAC,sBAAsB,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CACpE,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3D,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3D,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,YAAY,GAAiB;YACjC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC9B,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;SACjC,CAAC;QAEF,MAAM,YAAY,GAAG;YACnB,EAAE,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE;YAC/B,IAAI,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE;SAClC,CAAC;QAEF,MAAM,MAAM,GAAG,qBAAqB,CAAC,YAAY,EAAE,YAAmB,CAAC,CAAC;QAExE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,YAAY,GAAiB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEpE,MAAM,YAAY,GAAG;YACnB,EAAE,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE;YAC/B,IAAI,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE;SAClC,CAAC;QAEF,MAAM,MAAM,GAAG,qBAAqB,CAAC,YAAY,EAAE,YAAmB,CAAC,CAAC;QAExE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YACvC,IAAI,EAAE,MAAM;YACZ,YAAY,EAAE,QAAQ;SACvB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,YAAY,GAAiB;YACjC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC9B,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE;SAClC,CAAC;QAEF,MAAM,YAAY,GAAG;YACnB,EAAE,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE;SAChC,CAAC;QAEF,MAAM,MAAM,GAAG,qBAAqB,CAAC,YAAY,EAAE,YAAmB,CAAC,CAAC;QAExE,yCAAyC;QACzC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YACrC,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,QAAQ;SACrB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,YAAY,GAAiB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAEtE,MAAM,YAAY,GAAG;YACnB,KAAK,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE;SACnC,CAAC;QAEF,MAAM,MAAM,GAAG,qBAAqB,CAAC,YAAY,EAAE,YAAmB,CAAC,CAAC;QAExE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YACvC,IAAI,EAAE,OAAO;YACb,YAAY,EAAE,QAAQ;YACtB,UAAU,EAAE,OAAO;SACpB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,YAAY,GAAiB;YACjC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE;SAC5C,CAAC;QAEF,MAAM,YAAY,GAAG;YACnB,KAAK,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE;SACnC,CAAC;QAEF,MAAM,MAAM,GAAG,qBAAqB,CAAC,YAAY,EAAE,YAAmB,CAAC,CAAC;QAExE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,MAAM,EAAoB,CAAC;QACjD,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,IAAI,GAAG;YACX,KAAK,EAAE,MAAM;YACb,OAAO,EAAE;gBACP,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE;aAC1C;SAC2B,CAAC;QAC/B,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,IAAI,GAAG;YACX,KAAK,EAAE,MAAM;YACb,OAAO,EAAE;gBACP,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE;aACrD;SAC2B,CAAC;QAC/B,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,IAAI,GAAG;YACX,KAAK,EAAE,MAAM;YACb,OAAO,EAAE;gBACP,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE;aACxD;SAC2B,CAAC;QAC/B,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,MAAM,EAAoB,CAAC;QACjD,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,IAAI,GAAG;YACX,KAAK,EAAE,MAAM;YACb,OAAO,EAAE;gBACP,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE;gBACzC,MAAM,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE;aAC1C;SAC2B,CAAC;QAE/B,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;YACxC,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,CAAC;SACV,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,IAAI,GAAG;YACX,KAAK,EAAE,MAAM;YACb,OAAO,EAAE;gBACP,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE;gBACzC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE;aACrD;SAC2B,CAAC;QAE/B,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;YACxC,KAAK,EAAE,EAAE;SACV,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Tinybird client for querying pipes and ingesting events
3
+ */
4
+ import type { ClientConfig, QueryResult, IngestResult, QueryOptions, IngestOptions } from "./types.js";
5
+ /**
6
+ * Tinybird API client
7
+ *
8
+ * Provides methods for querying pipe endpoints and ingesting events to datasources.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * import { TinybirdClient } from '@tinybirdco/sdk';
13
+ *
14
+ * const client = new TinybirdClient({
15
+ * baseUrl: 'https://api.tinybird.co',
16
+ * token: process.env.TINYBIRD_TOKEN,
17
+ * });
18
+ *
19
+ * // Query a pipe
20
+ * const result = await client.query('top_events', {
21
+ * start_date: '2024-01-01',
22
+ * end_date: '2024-01-31',
23
+ * });
24
+ *
25
+ * // Ingest an event
26
+ * await client.ingest('events', {
27
+ * timestamp: new Date().toISOString(),
28
+ * event_type: 'page_view',
29
+ * user_id: 'user_123',
30
+ * });
31
+ * ```
32
+ */
33
+ export declare class TinybirdClient {
34
+ private readonly config;
35
+ private readonly fetchFn;
36
+ private tokenPromise;
37
+ private resolvedToken;
38
+ constructor(config: ClientConfig);
39
+ /**
40
+ * Get the effective token, resolving branch token in dev mode if needed
41
+ */
42
+ private getToken;
43
+ /**
44
+ * Resolve the branch token in dev mode
45
+ */
46
+ private resolveBranchToken;
47
+ /**
48
+ * Query a pipe endpoint
49
+ *
50
+ * @param pipeName - Name of the pipe to query
51
+ * @param params - Query parameters
52
+ * @param options - Additional request options
53
+ * @returns Query result with typed data
54
+ */
55
+ query<T = unknown>(pipeName: string, params?: Record<string, unknown>, options?: QueryOptions): Promise<QueryResult<T>>;
56
+ /**
57
+ * Ingest a single event to a datasource
58
+ *
59
+ * @param datasourceName - Name of the datasource
60
+ * @param event - Event data to ingest
61
+ * @param options - Additional request options
62
+ * @returns Ingest result
63
+ */
64
+ ingest<T extends Record<string, unknown>>(datasourceName: string, event: T, options?: IngestOptions): Promise<IngestResult>;
65
+ /**
66
+ * Ingest multiple events to a datasource
67
+ *
68
+ * @param datasourceName - Name of the datasource
69
+ * @param events - Array of events to ingest
70
+ * @param options - Additional request options
71
+ * @returns Ingest result
72
+ */
73
+ ingestBatch<T extends Record<string, unknown>>(datasourceName: string, events: T[], options?: IngestOptions): Promise<IngestResult>;
74
+ /**
75
+ * Execute a raw SQL query
76
+ *
77
+ * @param sql - SQL query to execute
78
+ * @param options - Additional request options
79
+ * @returns Query result
80
+ */
81
+ sql<T = unknown>(sql: string, options?: QueryOptions): Promise<QueryResult<T>>;
82
+ /**
83
+ * Serialize an event for ingestion, handling Date objects and other special types
84
+ */
85
+ private serializeEvent;
86
+ /**
87
+ * Create an AbortSignal with timeout
88
+ */
89
+ private createAbortSignal;
90
+ /**
91
+ * Handle error responses from the API
92
+ */
93
+ private handleErrorResponse;
94
+ /**
95
+ * Internal fetch wrapper
96
+ */
97
+ private fetch;
98
+ }
99
+ /**
100
+ * Create a Tinybird client
101
+ *
102
+ * @param config - Client configuration
103
+ * @returns Configured Tinybird client
104
+ *
105
+ * @example
106
+ * ```ts
107
+ * import { createClient } from '@tinybirdco/sdk';
108
+ *
109
+ * const client = createClient({
110
+ * baseUrl: process.env.TINYBIRD_URL,
111
+ * token: process.env.TINYBIRD_TOKEN,
112
+ * });
113
+ * ```
114
+ */
115
+ export declare function createClient(config: ClientConfig): TinybirdClient;
116
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/client/base.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,aAAa,EAEd,MAAM,YAAY,CAAC;AAiBpB;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,YAAY,CAA2C;IAC/D,OAAO,CAAC,aAAa,CAAuB;gBAEhC,MAAM,EAAE,YAAY;IAkBhC;;OAEG;YACW,QAAQ;IAsBtB;;OAEG;YACW,kBAAkB;IAsChC;;;;;;;OAOG;IACG,KAAK,CAAC,CAAC,GAAG,OAAO,EACrB,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACpC,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAqC1B;;;;;;;OAOG;IACG,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5C,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,CAAC,EACR,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC;IAIxB;;;;;;;OAOG;IACG,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjD,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,CAAC,EAAE,EACX,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC;IAoCxB;;;;;;OAMG;IACG,GAAG,CAAC,CAAC,GAAG,OAAO,EACnB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAsB1B;;OAEG;IACH,OAAO,CAAC,cAAc;IAmCtB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA4BzB;;OAEG;YACW,mBAAmB;IAwBjC;;OAEG;IACH,OAAO,CAAC,KAAK;CAGd;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,CAEjE"}
@@ -0,0 +1,328 @@
1
+ /**
2
+ * Tinybird client for querying pipes and ingesting events
3
+ */
4
+ import { TinybirdError } from "./types.js";
5
+ /**
6
+ * Default timeout for requests (30 seconds)
7
+ */
8
+ const DEFAULT_TIMEOUT = 30000;
9
+ /**
10
+ * Tinybird API client
11
+ *
12
+ * Provides methods for querying pipe endpoints and ingesting events to datasources.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * import { TinybirdClient } from '@tinybirdco/sdk';
17
+ *
18
+ * const client = new TinybirdClient({
19
+ * baseUrl: 'https://api.tinybird.co',
20
+ * token: process.env.TINYBIRD_TOKEN,
21
+ * });
22
+ *
23
+ * // Query a pipe
24
+ * const result = await client.query('top_events', {
25
+ * start_date: '2024-01-01',
26
+ * end_date: '2024-01-31',
27
+ * });
28
+ *
29
+ * // Ingest an event
30
+ * await client.ingest('events', {
31
+ * timestamp: new Date().toISOString(),
32
+ * event_type: 'page_view',
33
+ * user_id: 'user_123',
34
+ * });
35
+ * ```
36
+ */
37
+ export class TinybirdClient {
38
+ config;
39
+ fetchFn;
40
+ tokenPromise = null;
41
+ resolvedToken = null;
42
+ constructor(config) {
43
+ // Validate required config
44
+ if (!config.baseUrl) {
45
+ throw new Error("baseUrl is required");
46
+ }
47
+ if (!config.token) {
48
+ throw new Error("token is required");
49
+ }
50
+ // Normalize base URL (remove trailing slash)
51
+ this.config = {
52
+ ...config,
53
+ baseUrl: config.baseUrl.replace(/\/$/, ""),
54
+ };
55
+ this.fetchFn = config.fetch ?? globalThis.fetch;
56
+ }
57
+ /**
58
+ * Get the effective token, resolving branch token in dev mode if needed
59
+ */
60
+ async getToken() {
61
+ // If already resolved, return it
62
+ if (this.resolvedToken) {
63
+ return this.resolvedToken;
64
+ }
65
+ // If not in dev mode, use the configured token
66
+ if (!this.config.devMode) {
67
+ this.resolvedToken = this.config.token;
68
+ return this.resolvedToken;
69
+ }
70
+ // In dev mode, lazily resolve the branch token
71
+ if (!this.tokenPromise) {
72
+ this.tokenPromise = this.resolveBranchToken();
73
+ }
74
+ const resolved = await this.tokenPromise;
75
+ this.resolvedToken = resolved.token;
76
+ return this.resolvedToken;
77
+ }
78
+ /**
79
+ * Resolve the branch token in dev mode
80
+ */
81
+ async resolveBranchToken() {
82
+ try {
83
+ // Dynamic import to avoid circular dependencies and to keep CLI code
84
+ // out of the client bundle when not using dev mode
85
+ const { loadConfig } = await import("../cli/config.js");
86
+ const { getOrCreateBranch } = await import("../api/branches.js");
87
+ const config = loadConfig();
88
+ // If on main branch, use the workspace token
89
+ if (config.isMainBranch || !config.tinybirdBranch) {
90
+ return { token: this.config.token, isBranchToken: false };
91
+ }
92
+ const branchName = config.tinybirdBranch;
93
+ // Get or create branch (always fetch fresh to avoid stale cache issues)
94
+ const branch = await getOrCreateBranch({ baseUrl: this.config.baseUrl, token: this.config.token }, branchName);
95
+ if (!branch.token) {
96
+ // Fall back to workspace token if no branch token
97
+ return { token: this.config.token, isBranchToken: false };
98
+ }
99
+ return {
100
+ token: branch.token,
101
+ isBranchToken: true,
102
+ branchName,
103
+ };
104
+ }
105
+ catch {
106
+ // If anything fails, fall back to the workspace token
107
+ return { token: this.config.token, isBranchToken: false };
108
+ }
109
+ }
110
+ /**
111
+ * Query a pipe endpoint
112
+ *
113
+ * @param pipeName - Name of the pipe to query
114
+ * @param params - Query parameters
115
+ * @param options - Additional request options
116
+ * @returns Query result with typed data
117
+ */
118
+ async query(pipeName, params = {}, options = {}) {
119
+ const token = await this.getToken();
120
+ const url = new URL(`/v0/pipes/${pipeName}.json`, this.config.baseUrl);
121
+ // Add parameters to query string
122
+ for (const [key, value] of Object.entries(params)) {
123
+ if (value !== undefined && value !== null) {
124
+ if (Array.isArray(value)) {
125
+ // Handle array parameters
126
+ for (const item of value) {
127
+ url.searchParams.append(key, String(item));
128
+ }
129
+ }
130
+ else if (value instanceof Date) {
131
+ // Handle Date objects
132
+ url.searchParams.set(key, value.toISOString());
133
+ }
134
+ else {
135
+ url.searchParams.set(key, String(value));
136
+ }
137
+ }
138
+ }
139
+ const response = await this.fetch(url.toString(), {
140
+ method: "GET",
141
+ headers: {
142
+ Authorization: `Bearer ${token}`,
143
+ },
144
+ signal: this.createAbortSignal(options.timeout, options.signal),
145
+ });
146
+ if (!response.ok) {
147
+ await this.handleErrorResponse(response);
148
+ }
149
+ const result = (await response.json());
150
+ return result;
151
+ }
152
+ /**
153
+ * Ingest a single event to a datasource
154
+ *
155
+ * @param datasourceName - Name of the datasource
156
+ * @param event - Event data to ingest
157
+ * @param options - Additional request options
158
+ * @returns Ingest result
159
+ */
160
+ async ingest(datasourceName, event, options = {}) {
161
+ return this.ingestBatch(datasourceName, [event], options);
162
+ }
163
+ /**
164
+ * Ingest multiple events to a datasource
165
+ *
166
+ * @param datasourceName - Name of the datasource
167
+ * @param events - Array of events to ingest
168
+ * @param options - Additional request options
169
+ * @returns Ingest result
170
+ */
171
+ async ingestBatch(datasourceName, events, options = {}) {
172
+ if (events.length === 0) {
173
+ return { successful_rows: 0, quarantined_rows: 0 };
174
+ }
175
+ const token = await this.getToken();
176
+ const url = new URL("/v0/events", this.config.baseUrl);
177
+ url.searchParams.set("name", datasourceName);
178
+ if (options.wait !== false) {
179
+ url.searchParams.set("wait", "true");
180
+ }
181
+ // Convert events to NDJSON format
182
+ const ndjson = events
183
+ .map((event) => JSON.stringify(this.serializeEvent(event)))
184
+ .join("\n");
185
+ const response = await this.fetch(url.toString(), {
186
+ method: "POST",
187
+ headers: {
188
+ Authorization: `Bearer ${token}`,
189
+ "Content-Type": "application/x-ndjson",
190
+ },
191
+ body: ndjson,
192
+ signal: this.createAbortSignal(options.timeout, options.signal),
193
+ });
194
+ if (!response.ok) {
195
+ await this.handleErrorResponse(response);
196
+ }
197
+ const result = (await response.json());
198
+ return result;
199
+ }
200
+ /**
201
+ * Execute a raw SQL query
202
+ *
203
+ * @param sql - SQL query to execute
204
+ * @param options - Additional request options
205
+ * @returns Query result
206
+ */
207
+ async sql(sql, options = {}) {
208
+ const token = await this.getToken();
209
+ const url = new URL("/v0/sql", this.config.baseUrl);
210
+ const response = await this.fetch(url.toString(), {
211
+ method: "POST",
212
+ headers: {
213
+ Authorization: `Bearer ${token}`,
214
+ "Content-Type": "text/plain",
215
+ },
216
+ body: sql,
217
+ signal: this.createAbortSignal(options.timeout, options.signal),
218
+ });
219
+ if (!response.ok) {
220
+ await this.handleErrorResponse(response);
221
+ }
222
+ const result = (await response.json());
223
+ return result;
224
+ }
225
+ /**
226
+ * Serialize an event for ingestion, handling Date objects and other special types
227
+ */
228
+ serializeEvent(event) {
229
+ const serialized = {};
230
+ for (const [key, value] of Object.entries(event)) {
231
+ if (value instanceof Date) {
232
+ // Convert Date to ISO string
233
+ serialized[key] = value.toISOString();
234
+ }
235
+ else if (value instanceof Map) {
236
+ // Convert Map to object
237
+ serialized[key] = Object.fromEntries(value);
238
+ }
239
+ else if (typeof value === "bigint") {
240
+ // Convert BigInt to string (ClickHouse will parse it)
241
+ serialized[key] = value.toString();
242
+ }
243
+ else if (Array.isArray(value)) {
244
+ // Recursively serialize array elements
245
+ serialized[key] = value.map((item) => typeof item === "object" && item !== null
246
+ ? this.serializeEvent(item)
247
+ : item instanceof Date
248
+ ? item.toISOString()
249
+ : item);
250
+ }
251
+ else if (typeof value === "object" && value !== null) {
252
+ // Recursively serialize nested objects
253
+ serialized[key] = this.serializeEvent(value);
254
+ }
255
+ else {
256
+ serialized[key] = value;
257
+ }
258
+ }
259
+ return serialized;
260
+ }
261
+ /**
262
+ * Create an AbortSignal with timeout
263
+ */
264
+ createAbortSignal(timeout, existingSignal) {
265
+ const timeoutMs = timeout ?? this.config.timeout ?? DEFAULT_TIMEOUT;
266
+ // If no timeout and no existing signal, return undefined
267
+ if (!timeoutMs && !existingSignal) {
268
+ return undefined;
269
+ }
270
+ // If only existing signal, return it
271
+ if (!timeoutMs && existingSignal) {
272
+ return existingSignal;
273
+ }
274
+ // Create timeout signal
275
+ const timeoutSignal = AbortSignal.timeout(timeoutMs);
276
+ // If only timeout, return timeout signal
277
+ if (!existingSignal) {
278
+ return timeoutSignal;
279
+ }
280
+ // Combine both signals
281
+ return AbortSignal.any([timeoutSignal, existingSignal]);
282
+ }
283
+ /**
284
+ * Handle error responses from the API
285
+ */
286
+ async handleErrorResponse(response) {
287
+ let errorResponse;
288
+ let rawBody;
289
+ try {
290
+ rawBody = await response.text();
291
+ errorResponse = JSON.parse(rawBody);
292
+ }
293
+ catch {
294
+ // Failed to parse error response - include raw body in message
295
+ if (rawBody) {
296
+ throw new TinybirdError(`Request failed with status ${response.status}: ${rawBody}`, response.status, undefined);
297
+ }
298
+ }
299
+ const message = errorResponse?.error ?? `Request failed with status ${response.status}`;
300
+ throw new TinybirdError(message, response.status, errorResponse);
301
+ }
302
+ /**
303
+ * Internal fetch wrapper
304
+ */
305
+ fetch(url, init) {
306
+ return this.fetchFn(url, init);
307
+ }
308
+ }
309
+ /**
310
+ * Create a Tinybird client
311
+ *
312
+ * @param config - Client configuration
313
+ * @returns Configured Tinybird client
314
+ *
315
+ * @example
316
+ * ```ts
317
+ * import { createClient } from '@tinybirdco/sdk';
318
+ *
319
+ * const client = createClient({
320
+ * baseUrl: process.env.TINYBIRD_URL,
321
+ * token: process.env.TINYBIRD_TOKEN,
322
+ * });
323
+ * ```
324
+ */
325
+ export function createClient(config) {
326
+ return new TinybirdClient(config);
327
+ }
328
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/client/base.ts"],"names":[],"mappings":"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"}