@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,114 @@
1
+ /**
2
+ * Configuration loader for tinybird.json
3
+ */
4
+ /**
5
+ * Tinybird configuration file structure
6
+ */
7
+ export interface TinybirdConfig {
8
+ /** Array of TypeScript files to scan for datasources and pipes */
9
+ include?: string[];
10
+ /** @deprecated Use `include` instead. Path to the TypeScript schema entry point */
11
+ schema?: string;
12
+ /** API token (supports ${ENV_VAR} interpolation) */
13
+ token: string;
14
+ /** Tinybird API base URL (optional, defaults to EU region) */
15
+ baseUrl?: string;
16
+ }
17
+ /**
18
+ * Resolved configuration with all values expanded
19
+ */
20
+ export interface ResolvedConfig {
21
+ /** Array of TypeScript files to scan for datasources and pipes */
22
+ include: string[];
23
+ /** Resolved API token (workspace main token) */
24
+ token: string;
25
+ /** Tinybird API base URL */
26
+ baseUrl: string;
27
+ /** Path to the config file */
28
+ configPath: string;
29
+ /** Working directory */
30
+ cwd: string;
31
+ /** Current git branch (null if not in git repo or detached HEAD) */
32
+ gitBranch: string | null;
33
+ /** Sanitized branch name for Tinybird (symbols replaced with underscores) */
34
+ tinybirdBranch: string | null;
35
+ /** Whether we're on the main/master branch */
36
+ isMainBranch: boolean;
37
+ }
38
+ /**
39
+ * Detect if project has a src folder
40
+ */
41
+ export declare function hasSrcFolder(cwd: string): boolean;
42
+ /**
43
+ * Get the tinybird directory path based on project structure
44
+ * Returns 'src/tinybird' if project has src folder, otherwise 'tinybird'
45
+ */
46
+ export declare function getTinybirdDir(cwd: string): string;
47
+ /**
48
+ * Get the relative tinybird directory path based on project structure
49
+ */
50
+ export declare function getRelativeTinybirdDir(cwd: string): string;
51
+ /**
52
+ * Get the datasources.ts path based on project structure
53
+ */
54
+ export declare function getDatasourcesPath(cwd: string): string;
55
+ /**
56
+ * Get the pipes.ts path based on project structure
57
+ */
58
+ export declare function getPipesPath(cwd: string): string;
59
+ /**
60
+ * Get the client.ts path based on project structure
61
+ */
62
+ export declare function getClientPath(cwd: string): string;
63
+ export declare function getLibDir(cwd: string): string;
64
+ export declare function getRelativeLibDir(cwd: string): string;
65
+ export declare function getTinybirdSchemaPath(cwd: string): string;
66
+ export declare function getRelativeSchemaPath(cwd: string): string;
67
+ /**
68
+ * Find the config file by walking up the directory tree
69
+ *
70
+ * @param startDir - Directory to start searching from
71
+ * @returns Path to the config file, or null if not found
72
+ */
73
+ export declare function findConfigFile(startDir: string): string | null;
74
+ /**
75
+ * Load and resolve the tinybird.json configuration
76
+ *
77
+ * @param cwd - Working directory to start searching from (defaults to process.cwd())
78
+ * @returns Resolved configuration
79
+ *
80
+ * @example
81
+ * ```ts
82
+ * const config = loadConfig();
83
+ * console.log(config.schema); // 'lib/tinybird.ts' or 'src/lib/tinybird.ts'
84
+ * console.log(config.token); // 'p.xxx' (resolved from ${TINYBIRD_TOKEN})
85
+ * ```
86
+ */
87
+ export declare function loadConfig(cwd?: string): ResolvedConfig;
88
+ /**
89
+ * Check if a config file exists in the given directory
90
+ */
91
+ export declare function configExists(cwd?: string): boolean;
92
+ /**
93
+ * Get the expected config file path for a directory
94
+ */
95
+ export declare function getConfigPath(cwd?: string): string;
96
+ /**
97
+ * Update specific fields in tinybird.json
98
+ *
99
+ * Throws an error if the config file doesn't exist to prevent creating
100
+ * partial config files that would break loadConfig.
101
+ *
102
+ * @param configPath - Path to the config file
103
+ * @param updates - Fields to update
104
+ * @throws Error if config file doesn't exist
105
+ */
106
+ export declare function updateConfig(configPath: string, updates: Partial<TinybirdConfig>): void;
107
+ /**
108
+ * Check if a valid token is configured (either in file or via env var)
109
+ *
110
+ * @param cwd - Working directory to search from
111
+ * @returns true if a valid token exists
112
+ */
113
+ export declare function hasValidToken(cwd?: string): boolean;
114
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,mFAAmF;IACnF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,kEAAkE;IAClE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,wBAAwB;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,oEAAoE;IACpE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,6EAA6E;IAC7E,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,8CAA8C;IAC9C,YAAY,EAAE,OAAO,CAAC;CACvB;AAiBD;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGjD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjD;AAGD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEzD;AAiBD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgB9D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,cAAc,CAmFtE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAEjE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,CAEjE;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC1B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAC/B,IAAI,CAYN;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CA8BlE"}
@@ -0,0 +1,258 @@
1
+ /**
2
+ * Configuration loader for tinybird.json
3
+ */
4
+ import * as fs from "fs";
5
+ import * as path from "path";
6
+ import { getCurrentGitBranch, isMainBranch, getTinybirdBranchName } from "./git.js";
7
+ /**
8
+ * Default base URL (EU region)
9
+ */
10
+ const DEFAULT_BASE_URL = "https://api.tinybird.co";
11
+ /**
12
+ * Config file name
13
+ */
14
+ const CONFIG_FILE = "tinybird.json";
15
+ /**
16
+ * Tinybird folder name
17
+ */
18
+ const TINYBIRD_FOLDER = "tinybird";
19
+ /**
20
+ * Detect if project has a src folder
21
+ */
22
+ export function hasSrcFolder(cwd) {
23
+ const srcPath = path.join(cwd, "src");
24
+ return fs.existsSync(srcPath) && fs.statSync(srcPath).isDirectory();
25
+ }
26
+ /**
27
+ * Get the tinybird directory path based on project structure
28
+ * Returns 'src/tinybird' if project has src folder, otherwise 'tinybird'
29
+ */
30
+ export function getTinybirdDir(cwd) {
31
+ return hasSrcFolder(cwd) ? path.join(cwd, "src", TINYBIRD_FOLDER) : path.join(cwd, TINYBIRD_FOLDER);
32
+ }
33
+ /**
34
+ * Get the relative tinybird directory path based on project structure
35
+ */
36
+ export function getRelativeTinybirdDir(cwd) {
37
+ return hasSrcFolder(cwd) ? `src/${TINYBIRD_FOLDER}` : TINYBIRD_FOLDER;
38
+ }
39
+ /**
40
+ * Get the datasources.ts path based on project structure
41
+ */
42
+ export function getDatasourcesPath(cwd) {
43
+ return path.join(getTinybirdDir(cwd), "datasources.ts");
44
+ }
45
+ /**
46
+ * Get the pipes.ts path based on project structure
47
+ */
48
+ export function getPipesPath(cwd) {
49
+ return path.join(getTinybirdDir(cwd), "pipes.ts");
50
+ }
51
+ /**
52
+ * Get the client.ts path based on project structure
53
+ */
54
+ export function getClientPath(cwd) {
55
+ return path.join(getTinybirdDir(cwd), "client.ts");
56
+ }
57
+ // Legacy exports for backwards compatibility
58
+ export function getLibDir(cwd) {
59
+ return getTinybirdDir(cwd);
60
+ }
61
+ export function getRelativeLibDir(cwd) {
62
+ return getRelativeTinybirdDir(cwd);
63
+ }
64
+ export function getTinybirdSchemaPath(cwd) {
65
+ return getDatasourcesPath(cwd);
66
+ }
67
+ export function getRelativeSchemaPath(cwd) {
68
+ return `${getRelativeTinybirdDir(cwd)}/datasources.ts`;
69
+ }
70
+ /**
71
+ * Interpolate environment variables in a string
72
+ *
73
+ * Supports ${VAR_NAME} syntax
74
+ */
75
+ function interpolateEnvVars(value) {
76
+ return value.replace(/\$\{([^}]+)\}/g, (_, envVar) => {
77
+ const envValue = process.env[envVar];
78
+ if (envValue === undefined) {
79
+ throw new Error(`Environment variable ${envVar} is not set`);
80
+ }
81
+ return envValue;
82
+ });
83
+ }
84
+ /**
85
+ * Find the config file by walking up the directory tree
86
+ *
87
+ * @param startDir - Directory to start searching from
88
+ * @returns Path to the config file, or null if not found
89
+ */
90
+ export function findConfigFile(startDir) {
91
+ let currentDir = startDir;
92
+ while (true) {
93
+ const configPath = path.join(currentDir, CONFIG_FILE);
94
+ if (fs.existsSync(configPath)) {
95
+ return configPath;
96
+ }
97
+ const parentDir = path.dirname(currentDir);
98
+ if (parentDir === currentDir) {
99
+ // Reached root
100
+ return null;
101
+ }
102
+ currentDir = parentDir;
103
+ }
104
+ }
105
+ /**
106
+ * Load and resolve the tinybird.json configuration
107
+ *
108
+ * @param cwd - Working directory to start searching from (defaults to process.cwd())
109
+ * @returns Resolved configuration
110
+ *
111
+ * @example
112
+ * ```ts
113
+ * const config = loadConfig();
114
+ * console.log(config.schema); // 'lib/tinybird.ts' or 'src/lib/tinybird.ts'
115
+ * console.log(config.token); // 'p.xxx' (resolved from ${TINYBIRD_TOKEN})
116
+ * ```
117
+ */
118
+ export function loadConfig(cwd = process.cwd()) {
119
+ const configPath = findConfigFile(cwd);
120
+ if (!configPath) {
121
+ throw new Error(`Could not find ${CONFIG_FILE}. Run 'npx tinybird init' to create one.`);
122
+ }
123
+ let rawContent;
124
+ try {
125
+ rawContent = fs.readFileSync(configPath, "utf-8");
126
+ }
127
+ catch (error) {
128
+ throw new Error(`Failed to read ${configPath}: ${error.message}`);
129
+ }
130
+ let config;
131
+ try {
132
+ config = JSON.parse(rawContent);
133
+ }
134
+ catch (error) {
135
+ throw new Error(`Failed to parse ${configPath}: ${error.message}`);
136
+ }
137
+ // Validate required fields - need either include or schema
138
+ if (!config.include && !config.schema) {
139
+ throw new Error(`Missing 'include' field in ${configPath}. Add an array of files to scan for datasources and pipes.`);
140
+ }
141
+ if (!config.token) {
142
+ throw new Error(`Missing 'token' field in ${configPath}`);
143
+ }
144
+ // Resolve include paths (support legacy schema field)
145
+ let include;
146
+ if (config.include) {
147
+ include = config.include;
148
+ }
149
+ else if (config.schema) {
150
+ // Legacy mode: treat schema as a single include path
151
+ include = [config.schema];
152
+ }
153
+ else {
154
+ // Should never reach here due to validation above
155
+ include = [];
156
+ }
157
+ // Get the directory containing the config file
158
+ const configDir = path.dirname(configPath);
159
+ // Resolve token (may contain env vars)
160
+ let resolvedToken;
161
+ try {
162
+ resolvedToken = interpolateEnvVars(config.token);
163
+ }
164
+ catch (error) {
165
+ throw new Error(`Failed to resolve token in ${configPath}: ${error.message}`);
166
+ }
167
+ // Resolve base URL
168
+ let resolvedBaseUrl = DEFAULT_BASE_URL;
169
+ if (config.baseUrl) {
170
+ try {
171
+ resolvedBaseUrl = interpolateEnvVars(config.baseUrl);
172
+ }
173
+ catch (error) {
174
+ throw new Error(`Failed to resolve baseUrl in ${configPath}: ${error.message}`);
175
+ }
176
+ }
177
+ // Detect git branch
178
+ const gitBranch = getCurrentGitBranch();
179
+ const tinybirdBranch = getTinybirdBranchName();
180
+ return {
181
+ include,
182
+ token: resolvedToken,
183
+ baseUrl: resolvedBaseUrl,
184
+ configPath,
185
+ cwd: configDir,
186
+ gitBranch,
187
+ tinybirdBranch,
188
+ isMainBranch: isMainBranch(),
189
+ };
190
+ }
191
+ /**
192
+ * Check if a config file exists in the given directory
193
+ */
194
+ export function configExists(cwd = process.cwd()) {
195
+ return findConfigFile(cwd) !== null;
196
+ }
197
+ /**
198
+ * Get the expected config file path for a directory
199
+ */
200
+ export function getConfigPath(cwd = process.cwd()) {
201
+ return path.join(cwd, CONFIG_FILE);
202
+ }
203
+ /**
204
+ * Update specific fields in tinybird.json
205
+ *
206
+ * Throws an error if the config file doesn't exist to prevent creating
207
+ * partial config files that would break loadConfig.
208
+ *
209
+ * @param configPath - Path to the config file
210
+ * @param updates - Fields to update
211
+ * @throws Error if config file doesn't exist
212
+ */
213
+ export function updateConfig(configPath, updates) {
214
+ if (!fs.existsSync(configPath)) {
215
+ throw new Error(`Config not found at ${configPath}`);
216
+ }
217
+ const content = fs.readFileSync(configPath, "utf-8");
218
+ const config = JSON.parse(content);
219
+ // Merge updates
220
+ const updated = { ...config, ...updates };
221
+ fs.writeFileSync(configPath, JSON.stringify(updated, null, 2) + "\n");
222
+ }
223
+ /**
224
+ * Check if a valid token is configured (either in file or via env var)
225
+ *
226
+ * @param cwd - Working directory to search from
227
+ * @returns true if a valid token exists
228
+ */
229
+ export function hasValidToken(cwd = process.cwd()) {
230
+ try {
231
+ const configPath = findConfigFile(cwd);
232
+ if (!configPath) {
233
+ return false;
234
+ }
235
+ const content = fs.readFileSync(configPath, "utf-8");
236
+ const config = JSON.parse(content);
237
+ if (!config.token) {
238
+ return false;
239
+ }
240
+ // Check if token is a placeholder or env var reference
241
+ if (config.token.includes("${")) {
242
+ // Try to resolve the env var
243
+ try {
244
+ const resolved = interpolateEnvVars(config.token);
245
+ return Boolean(resolved);
246
+ }
247
+ catch {
248
+ return false;
249
+ }
250
+ }
251
+ // Token is a literal value
252
+ return Boolean(config.token);
253
+ }
254
+ catch {
255
+ return false;
256
+ }
257
+ }
258
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../src/cli/config.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,243 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
+ import * as fs from "fs";
3
+ import * as path from "path";
4
+ import * as os from "os";
5
+ import { hasSrcFolder, getLibDir, getRelativeLibDir, getTinybirdSchemaPath, getRelativeSchemaPath, findConfigFile, loadConfig, getConfigPath, configExists, updateConfig, hasValidToken, } from "./config.js";
6
+ describe("Config", () => {
7
+ let tempDir;
8
+ beforeEach(() => {
9
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tinybird-config-test-"));
10
+ });
11
+ afterEach(() => {
12
+ try {
13
+ fs.rmSync(tempDir, { recursive: true });
14
+ }
15
+ catch {
16
+ // Ignore cleanup errors
17
+ }
18
+ vi.restoreAllMocks();
19
+ });
20
+ describe("hasSrcFolder", () => {
21
+ it("returns true when src folder exists", () => {
22
+ fs.mkdirSync(path.join(tempDir, "src"));
23
+ expect(hasSrcFolder(tempDir)).toBe(true);
24
+ });
25
+ it("returns false when src folder does not exist", () => {
26
+ expect(hasSrcFolder(tempDir)).toBe(false);
27
+ });
28
+ it("returns false when src is a file not a folder", () => {
29
+ fs.writeFileSync(path.join(tempDir, "src"), "not a folder");
30
+ expect(hasSrcFolder(tempDir)).toBe(false);
31
+ });
32
+ });
33
+ describe("getLibDir", () => {
34
+ it("returns src/tinybird when project has src folder", () => {
35
+ fs.mkdirSync(path.join(tempDir, "src"));
36
+ expect(getLibDir(tempDir)).toBe(path.join(tempDir, "src", "tinybird"));
37
+ });
38
+ it("returns tinybird when project does not have src folder", () => {
39
+ expect(getLibDir(tempDir)).toBe(path.join(tempDir, "tinybird"));
40
+ });
41
+ });
42
+ describe("getRelativeLibDir", () => {
43
+ it("returns src/tinybird when project has src folder", () => {
44
+ fs.mkdirSync(path.join(tempDir, "src"));
45
+ expect(getRelativeLibDir(tempDir)).toBe("src/tinybird");
46
+ });
47
+ it("returns tinybird when project does not have src folder", () => {
48
+ expect(getRelativeLibDir(tempDir)).toBe("tinybird");
49
+ });
50
+ });
51
+ describe("getTinybirdSchemaPath", () => {
52
+ it("returns src/tinybird/datasources.ts when project has src folder", () => {
53
+ fs.mkdirSync(path.join(tempDir, "src"));
54
+ expect(getTinybirdSchemaPath(tempDir)).toBe(path.join(tempDir, "src", "tinybird", "datasources.ts"));
55
+ });
56
+ it("returns tinybird/datasources.ts when project does not have src folder", () => {
57
+ expect(getTinybirdSchemaPath(tempDir)).toBe(path.join(tempDir, "tinybird", "datasources.ts"));
58
+ });
59
+ });
60
+ describe("getRelativeSchemaPath", () => {
61
+ it("returns src/tinybird/datasources.ts when project has src folder", () => {
62
+ fs.mkdirSync(path.join(tempDir, "src"));
63
+ expect(getRelativeSchemaPath(tempDir)).toBe("src/tinybird/datasources.ts");
64
+ });
65
+ it("returns tinybird/datasources.ts when project does not have src folder", () => {
66
+ expect(getRelativeSchemaPath(tempDir)).toBe("tinybird/datasources.ts");
67
+ });
68
+ });
69
+ describe("findConfigFile", () => {
70
+ it("finds tinybird.json in current directory", () => {
71
+ const configPath = path.join(tempDir, "tinybird.json");
72
+ fs.writeFileSync(configPath, "{}");
73
+ expect(findConfigFile(tempDir)).toBe(configPath);
74
+ });
75
+ it("finds tinybird.json in parent directory", () => {
76
+ const nestedDir = path.join(tempDir, "src", "app");
77
+ fs.mkdirSync(nestedDir, { recursive: true });
78
+ const configPath = path.join(tempDir, "tinybird.json");
79
+ fs.writeFileSync(configPath, "{}");
80
+ expect(findConfigFile(nestedDir)).toBe(configPath);
81
+ });
82
+ it("returns null when no config file exists", () => {
83
+ expect(findConfigFile(tempDir)).toBe(null);
84
+ });
85
+ });
86
+ describe("getConfigPath", () => {
87
+ it("returns path to tinybird.json in directory", () => {
88
+ expect(getConfigPath(tempDir)).toBe(path.join(tempDir, "tinybird.json"));
89
+ });
90
+ });
91
+ describe("configExists", () => {
92
+ it("returns true when config exists", () => {
93
+ fs.writeFileSync(path.join(tempDir, "tinybird.json"), "{}");
94
+ expect(configExists(tempDir)).toBe(true);
95
+ });
96
+ it("returns false when config does not exist", () => {
97
+ expect(configExists(tempDir)).toBe(false);
98
+ });
99
+ });
100
+ describe("loadConfig", () => {
101
+ beforeEach(() => {
102
+ // Mock git functions to avoid git dependency in tests
103
+ vi.mock("./git.js", () => ({
104
+ getCurrentGitBranch: () => "main",
105
+ isMainBranch: () => true,
106
+ getTinybirdBranchName: () => null,
107
+ }));
108
+ });
109
+ it("throws error when no config file exists", () => {
110
+ expect(() => loadConfig(tempDir)).toThrow("Could not find tinybird.json");
111
+ });
112
+ it("loads config with include array", () => {
113
+ const config = {
114
+ include: ["lib/datasources.ts", "lib/pipes.ts"],
115
+ token: "test-token",
116
+ };
117
+ fs.writeFileSync(path.join(tempDir, "tinybird.json"), JSON.stringify(config));
118
+ const result = loadConfig(tempDir);
119
+ expect(result.include).toEqual(["lib/datasources.ts", "lib/pipes.ts"]);
120
+ expect(result.token).toBe("test-token");
121
+ expect(result.baseUrl).toBe("https://api.tinybird.co");
122
+ });
123
+ it("loads legacy config with schema (backward compat)", () => {
124
+ const config = {
125
+ schema: "src/lib/tinybird.ts",
126
+ token: "test-token",
127
+ };
128
+ fs.writeFileSync(path.join(tempDir, "tinybird.json"), JSON.stringify(config));
129
+ const result = loadConfig(tempDir);
130
+ // Legacy schema is converted to include array
131
+ expect(result.include).toEqual(["src/lib/tinybird.ts"]);
132
+ });
133
+ it("loads config with custom baseUrl", () => {
134
+ const config = {
135
+ schema: "lib/tinybird.ts",
136
+ token: "test-token",
137
+ baseUrl: "https://api.us-east.tinybird.co",
138
+ };
139
+ fs.writeFileSync(path.join(tempDir, "tinybird.json"), JSON.stringify(config));
140
+ const result = loadConfig(tempDir);
141
+ expect(result.baseUrl).toBe("https://api.us-east.tinybird.co");
142
+ });
143
+ it("interpolates environment variables in token", () => {
144
+ process.env.TEST_TINYBIRD_TOKEN = "secret-token-from-env";
145
+ const config = {
146
+ schema: "lib/tinybird.ts",
147
+ token: "${TEST_TINYBIRD_TOKEN}",
148
+ };
149
+ fs.writeFileSync(path.join(tempDir, "tinybird.json"), JSON.stringify(config));
150
+ const result = loadConfig(tempDir);
151
+ expect(result.token).toBe("secret-token-from-env");
152
+ delete process.env.TEST_TINYBIRD_TOKEN;
153
+ });
154
+ it("throws error when env var is not set", () => {
155
+ delete process.env.NONEXISTENT_VAR;
156
+ const config = {
157
+ schema: "lib/tinybird.ts",
158
+ token: "${NONEXISTENT_VAR}",
159
+ };
160
+ fs.writeFileSync(path.join(tempDir, "tinybird.json"), JSON.stringify(config));
161
+ expect(() => loadConfig(tempDir)).toThrow("Environment variable NONEXISTENT_VAR is not set");
162
+ });
163
+ it("throws error when include field is missing", () => {
164
+ const config = {
165
+ token: "test-token",
166
+ };
167
+ fs.writeFileSync(path.join(tempDir, "tinybird.json"), JSON.stringify(config));
168
+ expect(() => loadConfig(tempDir)).toThrow("Missing 'include' field");
169
+ });
170
+ it("throws error when token field is missing", () => {
171
+ const config = {
172
+ schema: "lib/tinybird.ts",
173
+ };
174
+ fs.writeFileSync(path.join(tempDir, "tinybird.json"), JSON.stringify(config));
175
+ expect(() => loadConfig(tempDir)).toThrow("Missing 'token' field");
176
+ });
177
+ it("throws error for invalid JSON", () => {
178
+ fs.writeFileSync(path.join(tempDir, "tinybird.json"), "not valid json");
179
+ expect(() => loadConfig(tempDir)).toThrow("Failed to parse");
180
+ });
181
+ });
182
+ describe("updateConfig", () => {
183
+ it("updates existing config file", () => {
184
+ const configPath = path.join(tempDir, "tinybird.json");
185
+ const initialConfig = {
186
+ schema: "lib/tinybird.ts",
187
+ token: "${TINYBIRD_TOKEN}",
188
+ baseUrl: "https://api.tinybird.co",
189
+ };
190
+ fs.writeFileSync(configPath, JSON.stringify(initialConfig));
191
+ updateConfig(configPath, { baseUrl: "https://api.us-east.tinybird.co" });
192
+ const updatedConfig = JSON.parse(fs.readFileSync(configPath, "utf-8"));
193
+ expect(updatedConfig.baseUrl).toBe("https://api.us-east.tinybird.co");
194
+ expect(updatedConfig.schema).toBe("lib/tinybird.ts");
195
+ expect(updatedConfig.token).toBe("${TINYBIRD_TOKEN}");
196
+ });
197
+ it("throws error when config file does not exist", () => {
198
+ const configPath = path.join(tempDir, "nonexistent.json");
199
+ expect(() => updateConfig(configPath, { baseUrl: "test" })).toThrow("Config not found");
200
+ });
201
+ });
202
+ describe("hasValidToken", () => {
203
+ it("returns false when no config exists", () => {
204
+ expect(hasValidToken(tempDir)).toBe(false);
205
+ });
206
+ it("returns true when token is literal value", () => {
207
+ const config = {
208
+ schema: "lib/tinybird.ts",
209
+ token: "p.some-token",
210
+ };
211
+ fs.writeFileSync(path.join(tempDir, "tinybird.json"), JSON.stringify(config));
212
+ expect(hasValidToken(tempDir)).toBe(true);
213
+ });
214
+ it("returns true when token env var is set", () => {
215
+ process.env.HAS_VALID_TOKEN_TEST = "some-value";
216
+ const config = {
217
+ schema: "lib/tinybird.ts",
218
+ token: "${HAS_VALID_TOKEN_TEST}",
219
+ };
220
+ fs.writeFileSync(path.join(tempDir, "tinybird.json"), JSON.stringify(config));
221
+ expect(hasValidToken(tempDir)).toBe(true);
222
+ delete process.env.HAS_VALID_TOKEN_TEST;
223
+ });
224
+ it("returns false when token env var is not set", () => {
225
+ delete process.env.MISSING_TOKEN_VAR;
226
+ const config = {
227
+ schema: "lib/tinybird.ts",
228
+ token: "${MISSING_TOKEN_VAR}",
229
+ };
230
+ fs.writeFileSync(path.join(tempDir, "tinybird.json"), JSON.stringify(config));
231
+ expect(hasValidToken(tempDir)).toBe(false);
232
+ });
233
+ it("returns false when token field is empty", () => {
234
+ const config = {
235
+ schema: "lib/tinybird.ts",
236
+ token: "",
237
+ };
238
+ fs.writeFileSync(path.join(tempDir, "tinybird.json"), JSON.stringify(config));
239
+ expect(hasValidToken(tempDir)).toBe(false);
240
+ });
241
+ });
242
+ });
243
+ //# sourceMappingURL=config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/cli/config.test.ts"],"names":[],"mappings":"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"}