@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,202 @@
1
+ /**
2
+ * Project definition for Tinybird
3
+ * Aggregates all datasources and pipes into a single schema
4
+ */
5
+ import type { DatasourceDefinition, SchemaDefinition } from "./datasource.js";
6
+ import type { PipeDefinition, ParamsDefinition, OutputDefinition } from "./pipe.js";
7
+ import type { TinybirdClient } from "../client/base.js";
8
+ import type { QueryResult } from "../client/types.js";
9
+ import type { InferRow, InferParams, InferOutputRow } from "../infer/index.js";
10
+ declare const PROJECT_BRAND: unique symbol;
11
+ /**
12
+ * Collection of datasource definitions
13
+ */
14
+ export type DatasourcesDefinition = Record<string, DatasourceDefinition<SchemaDefinition>>;
15
+ /**
16
+ * Collection of pipe definitions
17
+ */
18
+ export type PipesDefinition = Record<string, PipeDefinition<ParamsDefinition, OutputDefinition>>;
19
+ /**
20
+ * Type for a single query method
21
+ */
22
+ type QueryMethod<T extends PipeDefinition<ParamsDefinition, OutputDefinition>> = T extends PipeDefinition<infer P, OutputDefinition> ? keyof P extends never ? () => Promise<QueryResult<InferOutputRow<T>>> : (params: InferParams<T>) => Promise<QueryResult<InferOutputRow<T>>> : never;
23
+ /**
24
+ * Type for query methods object
25
+ * Note: At runtime, only pipes with endpoint: true are included
26
+ */
27
+ type QueryMethods<T extends PipesDefinition> = {
28
+ [K in keyof T]: QueryMethod<T[K]>;
29
+ };
30
+ /**
31
+ * Type for a single ingest method
32
+ */
33
+ type IngestMethod<T extends DatasourceDefinition<SchemaDefinition>> = (event: InferRow<T>) => Promise<void>;
34
+ /**
35
+ * Type for a batch ingest method
36
+ */
37
+ type IngestBatchMethod<T extends DatasourceDefinition<SchemaDefinition>> = (events: InferRow<T>[]) => Promise<void>;
38
+ /**
39
+ * Type for ingest methods object
40
+ */
41
+ type IngestMethods<T extends DatasourcesDefinition> = {
42
+ [K in keyof T]: IngestMethod<T[K]>;
43
+ } & {
44
+ [K in keyof T as `${K & string}Batch`]: IngestBatchMethod<T[K]>;
45
+ };
46
+ /**
47
+ * Typed client interface for a project
48
+ */
49
+ export interface ProjectClient<TDatasources extends DatasourcesDefinition, TPipes extends PipesDefinition> {
50
+ /** Query endpoint pipes */
51
+ query: QueryMethods<TPipes>;
52
+ /** Ingest events to datasources */
53
+ ingest: IngestMethods<TDatasources>;
54
+ /** Raw client for advanced usage */
55
+ readonly client: TinybirdClient;
56
+ }
57
+ /**
58
+ * Configuration for createTinybirdClient
59
+ */
60
+ export interface TinybirdClientConfig<TDatasources extends DatasourcesDefinition = DatasourcesDefinition, TPipes extends PipesDefinition = PipesDefinition> {
61
+ /** All datasources */
62
+ datasources: TDatasources;
63
+ /** All pipes */
64
+ pipes: TPipes;
65
+ /** Tinybird API base URL (defaults to TINYBIRD_URL env var or https://api.tinybird.co) */
66
+ baseUrl?: string;
67
+ /** Tinybird API token (defaults to TINYBIRD_TOKEN env var) */
68
+ token?: string;
69
+ }
70
+ /**
71
+ * Project configuration
72
+ */
73
+ export interface ProjectConfig<TDatasources extends DatasourcesDefinition = DatasourcesDefinition, TPipes extends PipesDefinition = PipesDefinition> {
74
+ /** All datasources in this project */
75
+ datasources?: TDatasources;
76
+ /** All pipes in this project */
77
+ pipes?: TPipes;
78
+ }
79
+ /**
80
+ * A project definition with full type information
81
+ */
82
+ export interface ProjectDefinition<TDatasources extends DatasourcesDefinition = DatasourcesDefinition, TPipes extends PipesDefinition = PipesDefinition> {
83
+ readonly [PROJECT_BRAND]: true;
84
+ /** Type marker for inference */
85
+ readonly _type: "project";
86
+ /** All datasources */
87
+ readonly datasources: TDatasources;
88
+ /** All pipes */
89
+ readonly pipes: TPipes;
90
+ /** Typed Tinybird client */
91
+ readonly tinybird: ProjectClient<TDatasources, TPipes>;
92
+ }
93
+ /**
94
+ * Define a Tinybird project
95
+ *
96
+ * This aggregates all datasources and pipes into a single schema definition
97
+ * that can be used for code generation and type inference.
98
+ *
99
+ * @param config - Project configuration with datasources and pipes
100
+ * @returns A project definition
101
+ *
102
+ * @example
103
+ * ```ts
104
+ * // tinybird/schema.ts
105
+ * import { defineProject } from '@tinybirdco/sdk';
106
+ * import { events, users } from './datasources';
107
+ * import { topEvents, userActivity } from './pipes';
108
+ *
109
+ * export default defineProject({
110
+ * datasources: {
111
+ * events,
112
+ * users,
113
+ * },
114
+ * pipes: {
115
+ * topEvents,
116
+ * userActivity,
117
+ * },
118
+ * });
119
+ * ```
120
+ */
121
+ export declare function defineProject<TDatasources extends DatasourcesDefinition, TPipes extends PipesDefinition>(config: ProjectConfig<TDatasources, TPipes>): ProjectDefinition<TDatasources, TPipes>;
122
+ /**
123
+ * Check if a value is a project definition
124
+ */
125
+ export declare function isProjectDefinition(value: unknown): value is ProjectDefinition;
126
+ /**
127
+ * Create a typed Tinybird client
128
+ *
129
+ * Creates a client with typed query and ingest methods based on the provided
130
+ * datasources and pipes. This is the recommended way to create a Tinybird client
131
+ * when using the SDK's auto-generated client file.
132
+ *
133
+ * @param config - Client configuration with datasources and pipes
134
+ * @returns A typed client with query and ingest methods
135
+ *
136
+ * @example
137
+ * ```ts
138
+ * import { createTinybirdClient } from '@tinybirdco/sdk';
139
+ * import { pageViews, events } from './datasources';
140
+ * import { topPages } from './pipes';
141
+ *
142
+ * export const tinybird = createTinybirdClient({
143
+ * datasources: { pageViews, events },
144
+ * pipes: { topPages },
145
+ * });
146
+ *
147
+ * // Query a pipe (fully typed)
148
+ * const result = await tinybird.query.topPages({
149
+ * start_date: new Date('2024-01-01'),
150
+ * end_date: new Date('2024-01-31'),
151
+ * });
152
+ *
153
+ * // Ingest an event (fully typed)
154
+ * await tinybird.ingest.pageViews({
155
+ * timestamp: new Date(),
156
+ * pathname: '/home',
157
+ * session_id: 'abc123',
158
+ * });
159
+ * ```
160
+ */
161
+ export declare function createTinybirdClient<TDatasources extends DatasourcesDefinition, TPipes extends PipesDefinition>(config: TinybirdClientConfig<TDatasources, TPipes>): ProjectClient<TDatasources, TPipes>;
162
+ /**
163
+ * Get all datasource names from a project
164
+ */
165
+ export declare function getDatasourceNames<T extends ProjectDefinition>(project: T): (keyof T["datasources"])[];
166
+ /**
167
+ * Get all pipe names from a project
168
+ */
169
+ export declare function getPipeNames<T extends ProjectDefinition>(project: T): (keyof T["pipes"])[];
170
+ /**
171
+ * Get a datasource by name from a project
172
+ */
173
+ export declare function getDatasource<TDatasources extends DatasourcesDefinition, TPipes extends PipesDefinition, K extends keyof TDatasources>(project: ProjectDefinition<TDatasources, TPipes>, name: K): TDatasources[K];
174
+ /**
175
+ * Get a pipe by name from a project
176
+ */
177
+ export declare function getPipe<TDatasources extends DatasourcesDefinition, TPipes extends PipesDefinition, K extends keyof TPipes>(project: ProjectDefinition<TDatasources, TPipes>, name: K): TPipes[K];
178
+ /**
179
+ * Helper type to extract datasources from a project
180
+ */
181
+ export type ExtractDatasources<T> = T extends ProjectDefinition<infer D, PipesDefinition> ? D : never;
182
+ /**
183
+ * Helper type to extract pipes from a project
184
+ */
185
+ export type ExtractPipes<T> = T extends ProjectDefinition<DatasourcesDefinition, infer P> ? P : never;
186
+ /**
187
+ * Data model type derived from a project
188
+ * Useful for generating typed clients
189
+ */
190
+ export type DataModel<T extends ProjectDefinition> = {
191
+ datasources: {
192
+ [K in keyof T["datasources"]]: T["datasources"][K] extends DatasourceDefinition<infer S> ? S : never;
193
+ };
194
+ pipes: {
195
+ [K in keyof T["pipes"]]: T["pipes"][K] extends PipeDefinition<infer P, infer O> ? {
196
+ params: P;
197
+ output: O;
198
+ } : never;
199
+ };
200
+ };
201
+ export {};
202
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/schema/project.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAEpF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAG/E,QAAA,MAAM,aAAa,eAA6B,CAAC;AAEjD;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAE3F;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAEjG;;GAEG;AACH,KAAK,WAAW,CAAC,CAAC,SAAS,cAAc,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,IAC3E,CAAC,SAAS,cAAc,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC,GAC/C,MAAM,CAAC,SAAS,KAAK,GACnB,MAAM,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,GAC7C,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,GACrE,KAAK,CAAC;AAEZ;;;GAGG;AACH,KAAK,YAAY,CAAC,CAAC,SAAS,eAAe,IAAI;KAC5C,CAAC,IAAI,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAClC,CAAC;AAEF;;GAEG;AACH,KAAK,YAAY,CAAC,CAAC,SAAS,oBAAoB,CAAC,gBAAgB,CAAC,IAAI,CACpE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,KACf,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB;;GAEG;AACH,KAAK,iBAAiB,CAAC,CAAC,SAAS,oBAAoB,CAAC,gBAAgB,CAAC,IAAI,CACzE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,KAClB,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB;;GAEG;AACH,KAAK,aAAa,CAAC,CAAC,SAAS,qBAAqB,IAAI;KACnD,CAAC,IAAI,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACnC,GAAG;KACD,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,GAAG,MAAM,OAAO,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAChE,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,aAAa,CAC5B,YAAY,SAAS,qBAAqB,EAC1C,MAAM,SAAS,eAAe;IAE9B,2BAA2B;IAC3B,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IAC5B,mCAAmC;IACnC,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;IACpC,oCAAoC;IACpC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB,CACnC,YAAY,SAAS,qBAAqB,GAAG,qBAAqB,EAClE,MAAM,SAAS,eAAe,GAAG,eAAe;IAEhD,sBAAsB;IACtB,WAAW,EAAE,YAAY,CAAC;IAC1B,gBAAgB;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,0FAA0F;IAC1F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa,CAC5B,YAAY,SAAS,qBAAqB,GAAG,qBAAqB,EAClE,MAAM,SAAS,eAAe,GAAG,eAAe;IAEhD,sCAAsC;IACtC,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,gCAAgC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAChC,YAAY,SAAS,qBAAqB,GAAG,qBAAqB,EAClE,MAAM,SAAS,eAAe,GAAG,eAAe;IAEhD,QAAQ,CAAC,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC;IAC/B,gCAAgC;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,sBAAsB;IACtB,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC;IACnC,gBAAgB;IAChB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,4BAA4B;IAC5B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;CACxD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,aAAa,CAC3B,YAAY,SAAS,qBAAqB,EAC1C,MAAM,SAAS,eAAe,EAE9B,MAAM,EAAE,aAAa,CAAC,YAAY,EAAE,MAAM,CAAC,GAC1C,iBAAiB,CAAC,YAAY,EAAE,MAAM,CAAC,CAczC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAO9E;AA0FD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,SAAS,qBAAqB,EAC1C,MAAM,SAAS,eAAe,EAE9B,MAAM,EAAE,oBAAoB,CAAC,YAAY,EAAE,MAAM,CAAC,GACjD,aAAa,CAAC,YAAY,EAAE,MAAM,CAAC,CAMrC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,iBAAiB,EAC5D,OAAO,EAAE,CAAC,GACT,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,CAE5B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,iBAAiB,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAE1F;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,YAAY,SAAS,qBAAqB,EAC1C,MAAM,SAAS,eAAe,EAC9B,CAAC,SAAS,MAAM,YAAY,EAC5B,OAAO,EAAE,iBAAiB,CAAC,YAAY,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAE5E;AAED;;GAEG;AACH,wBAAgB,OAAO,CACrB,YAAY,SAAS,qBAAqB,EAC1C,MAAM,SAAS,eAAe,EAC9B,CAAC,SAAS,MAAM,MAAM,EACtB,OAAO,EAAE,iBAAiB,CAAC,YAAY,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAEtE;AAED;;GAEG;AACH,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAAI,CAAC,SAAS,iBAAiB,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC,GACrF,CAAC,GACD,KAAK,CAAC;AAEV;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,iBAAiB,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC,GACrF,CAAC,GACD,KAAK,CAAC;AAEV;;;GAGG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,iBAAiB,IAAI;IACnD,WAAW,EAAE;SACV,CAAC,IAAI,MAAM,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,oBAAoB,CAAC,MAAM,CAAC,CAAC,GACpF,CAAC,GACD,KAAK;KACV,CAAC;IACF,KAAK,EAAE;SACJ,CAAC,IAAI,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GAC3E;YAAE,MAAM,EAAE,CAAC,CAAC;YAAC,MAAM,EAAE,CAAC,CAAA;SAAE,GACxB,KAAK;KACV,CAAC;CACH,CAAC"}
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Project definition for Tinybird
3
+ * Aggregates all datasources and pipes into a single schema
4
+ */
5
+ import { getEndpointConfig } from "./pipe.js";
6
+ // Symbol for brand typing
7
+ const PROJECT_BRAND = Symbol("tinybird.project");
8
+ /**
9
+ * Define a Tinybird project
10
+ *
11
+ * This aggregates all datasources and pipes into a single schema definition
12
+ * that can be used for code generation and type inference.
13
+ *
14
+ * @param config - Project configuration with datasources and pipes
15
+ * @returns A project definition
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * // tinybird/schema.ts
20
+ * import { defineProject } from '@tinybirdco/sdk';
21
+ * import { events, users } from './datasources';
22
+ * import { topEvents, userActivity } from './pipes';
23
+ *
24
+ * export default defineProject({
25
+ * datasources: {
26
+ * events,
27
+ * users,
28
+ * },
29
+ * pipes: {
30
+ * topEvents,
31
+ * userActivity,
32
+ * },
33
+ * });
34
+ * ```
35
+ */
36
+ export function defineProject(config) {
37
+ const datasources = (config.datasources ?? {});
38
+ const pipes = (config.pipes ?? {});
39
+ // Use the shared client builder
40
+ const tinybird = buildProjectClient(datasources, pipes);
41
+ return {
42
+ [PROJECT_BRAND]: true,
43
+ _type: "project",
44
+ datasources,
45
+ pipes,
46
+ tinybird,
47
+ };
48
+ }
49
+ /**
50
+ * Check if a value is a project definition
51
+ */
52
+ export function isProjectDefinition(value) {
53
+ return (typeof value === "object" &&
54
+ value !== null &&
55
+ PROJECT_BRAND in value &&
56
+ value[PROJECT_BRAND] === true);
57
+ }
58
+ /**
59
+ * Build a typed Tinybird client from datasources and pipes
60
+ *
61
+ * This is an internal helper that builds query/ingest methods.
62
+ */
63
+ function buildProjectClient(datasources, pipes, options) {
64
+ // Lazy client initialization
65
+ let _client = null;
66
+ const getClient = async () => {
67
+ if (!_client) {
68
+ // Dynamic import to avoid circular dependencies
69
+ const { createClient } = await import("../client/base.js");
70
+ _client = createClient({
71
+ baseUrl: options?.baseUrl ?? process.env.TINYBIRD_URL ?? "https://api.tinybird.co",
72
+ token: options?.token ?? process.env.TINYBIRD_TOKEN,
73
+ devMode: process.env.NODE_ENV === "development",
74
+ });
75
+ }
76
+ return _client;
77
+ };
78
+ // Build query methods for pipes
79
+ const queryMethods = {};
80
+ for (const [name, pipe] of Object.entries(pipes)) {
81
+ const endpointConfig = getEndpointConfig(pipe);
82
+ if (!endpointConfig) {
83
+ // Non-endpoint pipes get a stub that throws a clear error
84
+ queryMethods[name] = async () => {
85
+ throw new Error(`Pipe "${name}" is not exposed as an endpoint. ` +
86
+ `Set "endpoint: true" in the pipe definition to enable querying.`);
87
+ };
88
+ continue;
89
+ }
90
+ // Use the Tinybird pipe name (snake_case)
91
+ const tinybirdName = pipe._name;
92
+ queryMethods[name] = async (params) => {
93
+ const client = await getClient();
94
+ return client.query(tinybirdName, (params ?? {}));
95
+ };
96
+ }
97
+ // Build ingest methods for datasources
98
+ const ingestMethods = {};
99
+ for (const [name, datasource] of Object.entries(datasources)) {
100
+ // Use the Tinybird datasource name (snake_case)
101
+ const tinybirdName = datasource._name;
102
+ // Single event ingest
103
+ ingestMethods[name] = async (event) => {
104
+ const client = await getClient();
105
+ await client.ingest(tinybirdName, event);
106
+ };
107
+ // Batch ingest
108
+ ingestMethods[`${name}Batch`] = async (events) => {
109
+ const client = await getClient();
110
+ await client.ingestBatch(tinybirdName, events);
111
+ };
112
+ }
113
+ // Create the typed client object
114
+ return {
115
+ query: queryMethods,
116
+ ingest: ingestMethods,
117
+ get client() {
118
+ // Synchronous client access - will throw if not initialized
119
+ if (!_client) {
120
+ throw new Error("Client not initialized. Call a query or ingest method first, or access client asynchronously.");
121
+ }
122
+ return _client;
123
+ },
124
+ };
125
+ }
126
+ /**
127
+ * Create a typed Tinybird client
128
+ *
129
+ * Creates a client with typed query and ingest methods based on the provided
130
+ * datasources and pipes. This is the recommended way to create a Tinybird client
131
+ * when using the SDK's auto-generated client file.
132
+ *
133
+ * @param config - Client configuration with datasources and pipes
134
+ * @returns A typed client with query and ingest methods
135
+ *
136
+ * @example
137
+ * ```ts
138
+ * import { createTinybirdClient } from '@tinybirdco/sdk';
139
+ * import { pageViews, events } from './datasources';
140
+ * import { topPages } from './pipes';
141
+ *
142
+ * export const tinybird = createTinybirdClient({
143
+ * datasources: { pageViews, events },
144
+ * pipes: { topPages },
145
+ * });
146
+ *
147
+ * // Query a pipe (fully typed)
148
+ * const result = await tinybird.query.topPages({
149
+ * start_date: new Date('2024-01-01'),
150
+ * end_date: new Date('2024-01-31'),
151
+ * });
152
+ *
153
+ * // Ingest an event (fully typed)
154
+ * await tinybird.ingest.pageViews({
155
+ * timestamp: new Date(),
156
+ * pathname: '/home',
157
+ * session_id: 'abc123',
158
+ * });
159
+ * ```
160
+ */
161
+ export function createTinybirdClient(config) {
162
+ return buildProjectClient(config.datasources, config.pipes, { baseUrl: config.baseUrl, token: config.token });
163
+ }
164
+ /**
165
+ * Get all datasource names from a project
166
+ */
167
+ export function getDatasourceNames(project) {
168
+ return Object.keys(project.datasources);
169
+ }
170
+ /**
171
+ * Get all pipe names from a project
172
+ */
173
+ export function getPipeNames(project) {
174
+ return Object.keys(project.pipes);
175
+ }
176
+ /**
177
+ * Get a datasource by name from a project
178
+ */
179
+ export function getDatasource(project, name) {
180
+ return project.datasources[name];
181
+ }
182
+ /**
183
+ * Get a pipe by name from a project
184
+ */
185
+ export function getPipe(project, name) {
186
+ return project.pipes[name];
187
+ }
188
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/schema/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=project.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.test.d.ts","sourceRoot":"","sources":["../../src/schema/project.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,180 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { defineProject, isProjectDefinition, getDatasourceNames, getPipeNames, getDatasource, getPipe, } from "./project.js";
3
+ import { defineDatasource } from "./datasource.js";
4
+ import { definePipe, node } from "./pipe.js";
5
+ import { t } from "./types.js";
6
+ describe("Project Schema", () => {
7
+ describe("defineProject", () => {
8
+ it("creates a project with empty config", () => {
9
+ const project = defineProject({});
10
+ expect(project._type).toBe("project");
11
+ expect(project.datasources).toEqual({});
12
+ expect(project.pipes).toEqual({});
13
+ });
14
+ it("creates a project with datasources", () => {
15
+ const events = defineDatasource("events", {
16
+ schema: { id: t.string(), timestamp: t.dateTime() },
17
+ });
18
+ const project = defineProject({
19
+ datasources: { events },
20
+ });
21
+ expect(project.datasources.events).toBe(events);
22
+ expect(project.pipes).toEqual({});
23
+ });
24
+ it("creates a project with pipes", () => {
25
+ const topEvents = definePipe("top_events", {
26
+ nodes: [node({ name: "endpoint", sql: "SELECT 1" })],
27
+ output: { count: t.int64() },
28
+ endpoint: true,
29
+ });
30
+ const project = defineProject({
31
+ pipes: { topEvents },
32
+ });
33
+ expect(project.pipes.topEvents).toBe(topEvents);
34
+ expect(project.datasources).toEqual({});
35
+ });
36
+ it("creates a project with both datasources and pipes", () => {
37
+ const events = defineDatasource("events", {
38
+ schema: { id: t.string() },
39
+ });
40
+ const topEvents = definePipe("top_events", {
41
+ nodes: [node({ name: "endpoint", sql: "SELECT 1" })],
42
+ output: { count: t.int64() },
43
+ endpoint: true,
44
+ });
45
+ const project = defineProject({
46
+ datasources: { events },
47
+ pipes: { topEvents },
48
+ });
49
+ expect(project.datasources.events).toBe(events);
50
+ expect(project.pipes.topEvents).toBe(topEvents);
51
+ });
52
+ it("creates tinybird client with query and ingest methods", () => {
53
+ const events = defineDatasource("events", {
54
+ schema: { id: t.string() },
55
+ });
56
+ const topEvents = definePipe("top_events", {
57
+ nodes: [node({ name: "endpoint", sql: "SELECT 1" })],
58
+ output: { count: t.int64() },
59
+ endpoint: true,
60
+ });
61
+ const project = defineProject({
62
+ datasources: { events },
63
+ pipes: { topEvents },
64
+ });
65
+ expect(project.tinybird.query).toBeDefined();
66
+ expect(project.tinybird.ingest).toBeDefined();
67
+ expect(typeof project.tinybird.query.topEvents).toBe("function");
68
+ expect(typeof project.tinybird.ingest.events).toBe("function");
69
+ expect(typeof project.tinybird.ingest.eventsBatch).toBe("function");
70
+ });
71
+ it("throws error when accessing client before initialization", () => {
72
+ const project = defineProject({});
73
+ expect(() => project.tinybird.client).toThrow("Client not initialized");
74
+ });
75
+ it("creates stub for non-endpoint pipes that throws clear error", async () => {
76
+ const internalPipe = definePipe("internal_pipe", {
77
+ nodes: [node({ name: "endpoint", sql: "SELECT 1" })],
78
+ output: { count: t.int64() },
79
+ endpoint: false,
80
+ });
81
+ const project = defineProject({
82
+ pipes: { internalPipe },
83
+ });
84
+ // Cast to any since the type system expects params but stub throws regardless
85
+ const queryFn = project.tinybird.query.internalPipe;
86
+ await expect(queryFn()).rejects.toThrow('Pipe "internalPipe" is not exposed as an endpoint');
87
+ });
88
+ });
89
+ describe("isProjectDefinition", () => {
90
+ it("returns true for valid project", () => {
91
+ const project = defineProject({});
92
+ expect(isProjectDefinition(project)).toBe(true);
93
+ });
94
+ it("returns false for non-project objects", () => {
95
+ expect(isProjectDefinition({})).toBe(false);
96
+ expect(isProjectDefinition(null)).toBe(false);
97
+ expect(isProjectDefinition(undefined)).toBe(false);
98
+ expect(isProjectDefinition("string")).toBe(false);
99
+ expect(isProjectDefinition(123)).toBe(false);
100
+ expect(isProjectDefinition({ _type: "project" })).toBe(false);
101
+ });
102
+ });
103
+ describe("getDatasourceNames", () => {
104
+ it("returns all datasource names", () => {
105
+ const events = defineDatasource("events", {
106
+ schema: { id: t.string() },
107
+ });
108
+ const users = defineDatasource("users", {
109
+ schema: { id: t.string() },
110
+ });
111
+ const project = defineProject({
112
+ datasources: { events, users },
113
+ });
114
+ const names = getDatasourceNames(project);
115
+ expect(names).toHaveLength(2);
116
+ expect(names).toContain("events");
117
+ expect(names).toContain("users");
118
+ });
119
+ it("returns empty array for project with no datasources", () => {
120
+ const project = defineProject({});
121
+ const names = getDatasourceNames(project);
122
+ expect(names).toHaveLength(0);
123
+ });
124
+ });
125
+ describe("getPipeNames", () => {
126
+ it("returns all pipe names", () => {
127
+ const topEvents = definePipe("top_events", {
128
+ nodes: [node({ name: "endpoint", sql: "SELECT 1" })],
129
+ output: { count: t.int64() },
130
+ endpoint: true,
131
+ });
132
+ const userActivity = definePipe("user_activity", {
133
+ nodes: [node({ name: "endpoint", sql: "SELECT 2" })],
134
+ output: { count: t.int64() },
135
+ endpoint: true,
136
+ });
137
+ const project = defineProject({
138
+ pipes: { topEvents, userActivity },
139
+ });
140
+ const names = getPipeNames(project);
141
+ expect(names).toHaveLength(2);
142
+ expect(names).toContain("topEvents");
143
+ expect(names).toContain("userActivity");
144
+ });
145
+ it("returns empty array for project with no pipes", () => {
146
+ const project = defineProject({});
147
+ const names = getPipeNames(project);
148
+ expect(names).toHaveLength(0);
149
+ });
150
+ });
151
+ describe("getDatasource", () => {
152
+ it("returns datasource by name", () => {
153
+ const events = defineDatasource("events", {
154
+ schema: { id: t.string() },
155
+ });
156
+ const project = defineProject({
157
+ datasources: { events },
158
+ });
159
+ const retrieved = getDatasource(project, "events");
160
+ expect(retrieved).toBe(events);
161
+ expect(retrieved._name).toBe("events");
162
+ });
163
+ });
164
+ describe("getPipe", () => {
165
+ it("returns pipe by name", () => {
166
+ const topEvents = definePipe("top_events", {
167
+ nodes: [node({ name: "endpoint", sql: "SELECT 1" })],
168
+ output: { count: t.int64() },
169
+ endpoint: true,
170
+ });
171
+ const project = defineProject({
172
+ pipes: { topEvents },
173
+ });
174
+ const retrieved = getPipe(project, "topEvents");
175
+ expect(retrieved).toBe(topEvents);
176
+ expect(retrieved._name).toBe("top_events");
177
+ });
178
+ });
179
+ });
180
+ //# sourceMappingURL=project.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.test.js","sourceRoot":"","sources":["../../src/schema/project.test.ts"],"names":[],"mappings":"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"}