@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.
- package/README.md +518 -0
- package/bin/tinybird.js +7 -0
- package/dist/api/branches.d.ts +98 -0
- package/dist/api/branches.d.ts.map +1 -0
- package/dist/api/branches.js +203 -0
- package/dist/api/branches.js.map +1 -0
- package/dist/api/branches.test.d.ts +2 -0
- package/dist/api/branches.test.d.ts.map +1 -0
- package/dist/api/branches.test.js +286 -0
- package/dist/api/branches.test.js.map +1 -0
- package/dist/api/build.d.ts +130 -0
- package/dist/api/build.d.ts.map +1 -0
- package/dist/api/build.js +143 -0
- package/dist/api/build.js.map +1 -0
- package/dist/api/build.test.d.ts +2 -0
- package/dist/api/build.test.d.ts.map +1 -0
- package/dist/api/build.test.js +138 -0
- package/dist/api/build.test.js.map +1 -0
- package/dist/api/deploy.d.ts +39 -0
- package/dist/api/deploy.d.ts.map +1 -0
- package/dist/api/deploy.js +135 -0
- package/dist/api/deploy.js.map +1 -0
- package/dist/api/deploy.test.d.ts +2 -0
- package/dist/api/deploy.test.d.ts.map +1 -0
- package/dist/api/deploy.test.js +118 -0
- package/dist/api/deploy.test.js.map +1 -0
- package/dist/api/workspaces.d.ts +46 -0
- package/dist/api/workspaces.d.ts.map +1 -0
- package/dist/api/workspaces.js +39 -0
- package/dist/api/workspaces.js.map +1 -0
- package/dist/api/workspaces.test.d.ts +2 -0
- package/dist/api/workspaces.test.d.ts.map +1 -0
- package/dist/api/workspaces.test.js +65 -0
- package/dist/api/workspaces.test.js.map +1 -0
- package/dist/cli/auth.d.ts +86 -0
- package/dist/cli/auth.d.ts.map +1 -0
- package/dist/cli/auth.js +284 -0
- package/dist/cli/auth.js.map +1 -0
- package/dist/cli/branch-store.d.ts +53 -0
- package/dist/cli/branch-store.d.ts.map +1 -0
- package/dist/cli/branch-store.js +91 -0
- package/dist/cli/branch-store.js.map +1 -0
- package/dist/cli/branch-store.test.d.ts +2 -0
- package/dist/cli/branch-store.test.d.ts.map +1 -0
- package/dist/cli/branch-store.test.js +115 -0
- package/dist/cli/branch-store.test.js.map +1 -0
- package/dist/cli/commands/branch.d.ts +82 -0
- package/dist/cli/commands/branch.d.ts.map +1 -0
- package/dist/cli/commands/branch.js +215 -0
- package/dist/cli/commands/branch.js.map +1 -0
- package/dist/cli/commands/build.d.ts +43 -0
- package/dist/cli/commands/build.d.ts.map +1 -0
- package/dist/cli/commands/build.js +138 -0
- package/dist/cli/commands/build.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +78 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/dev.js +226 -0
- package/dist/cli/commands/dev.js.map +1 -0
- package/dist/cli/commands/init.d.ts +45 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +277 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/init.test.d.ts +2 -0
- package/dist/cli/commands/init.test.d.ts.map +1 -0
- package/dist/cli/commands/init.test.js +158 -0
- package/dist/cli/commands/init.test.js.map +1 -0
- package/dist/cli/commands/login.d.ts +37 -0
- package/dist/cli/commands/login.d.ts.map +1 -0
- package/dist/cli/commands/login.js +64 -0
- package/dist/cli/commands/login.js.map +1 -0
- package/dist/cli/config.d.ts +114 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +258 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/config.test.d.ts +2 -0
- package/dist/cli/config.test.d.ts.map +1 -0
- package/dist/cli/config.test.js +243 -0
- package/dist/cli/config.test.js.map +1 -0
- package/dist/cli/env.d.ts +29 -0
- package/dist/cli/env.d.ts.map +1 -0
- package/dist/cli/env.js +66 -0
- package/dist/cli/env.js.map +1 -0
- package/dist/cli/git.d.ts +29 -0
- package/dist/cli/git.d.ts.map +1 -0
- package/dist/cli/git.js +114 -0
- package/dist/cli/git.js.map +1 -0
- package/dist/cli/git.test.d.ts +2 -0
- package/dist/cli/git.test.d.ts.map +1 -0
- package/dist/cli/git.test.js +125 -0
- package/dist/cli/git.test.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +337 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/schema-validation.d.ts +95 -0
- package/dist/cli/utils/schema-validation.d.ts.map +1 -0
- package/dist/cli/utils/schema-validation.js +175 -0
- package/dist/cli/utils/schema-validation.js.map +1 -0
- package/dist/cli/utils/schema-validation.test.d.ts +5 -0
- package/dist/cli/utils/schema-validation.test.d.ts.map +1 -0
- package/dist/cli/utils/schema-validation.test.js +173 -0
- package/dist/cli/utils/schema-validation.test.js.map +1 -0
- package/dist/client/base.d.ts +116 -0
- package/dist/client/base.d.ts.map +1 -0
- package/dist/client/base.js +328 -0
- package/dist/client/base.js.map +1 -0
- package/dist/client/types.d.ts +137 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +43 -0
- package/dist/client/types.js.map +1 -0
- package/dist/generator/client.d.ts +44 -0
- package/dist/generator/client.d.ts.map +1 -0
- package/dist/generator/client.js +144 -0
- package/dist/generator/client.js.map +1 -0
- package/dist/generator/datasource.d.ts +57 -0
- package/dist/generator/datasource.d.ts.map +1 -0
- package/dist/generator/datasource.js +169 -0
- package/dist/generator/datasource.js.map +1 -0
- package/dist/generator/datasource.test.d.ts +2 -0
- package/dist/generator/datasource.test.d.ts.map +1 -0
- package/dist/generator/datasource.test.js +254 -0
- package/dist/generator/datasource.test.js.map +1 -0
- package/dist/generator/index.d.ts +131 -0
- package/dist/generator/index.d.ts.map +1 -0
- package/dist/generator/index.js +121 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/generator/index.test.d.ts +2 -0
- package/dist/generator/index.test.d.ts.map +1 -0
- package/dist/generator/index.test.js +175 -0
- package/dist/generator/index.test.js.map +1 -0
- package/dist/generator/loader.d.ts +156 -0
- package/dist/generator/loader.d.ts.map +1 -0
- package/dist/generator/loader.js +295 -0
- package/dist/generator/loader.js.map +1 -0
- package/dist/generator/pipe.d.ts +72 -0
- package/dist/generator/pipe.d.ts.map +1 -0
- package/dist/generator/pipe.js +174 -0
- package/dist/generator/pipe.js.map +1 -0
- package/dist/generator/pipe.test.d.ts +2 -0
- package/dist/generator/pipe.test.d.ts.map +1 -0
- package/dist/generator/pipe.test.js +393 -0
- package/dist/generator/pipe.test.js.map +1 -0
- package/dist/index.d.ts +74 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +73 -0
- package/dist/index.js.map +1 -0
- package/dist/infer/index.d.ts +202 -0
- package/dist/infer/index.d.ts.map +1 -0
- package/dist/infer/index.js +5 -0
- package/dist/infer/index.js.map +1 -0
- package/dist/schema/datasource.d.ts +135 -0
- package/dist/schema/datasource.d.ts.map +1 -0
- package/dist/schema/datasource.js +105 -0
- package/dist/schema/datasource.js.map +1 -0
- package/dist/schema/datasource.test.d.ts +2 -0
- package/dist/schema/datasource.test.d.ts.map +1 -0
- package/dist/schema/datasource.test.js +142 -0
- package/dist/schema/datasource.test.js.map +1 -0
- package/dist/schema/engines.d.ts +157 -0
- package/dist/schema/engines.d.ts.map +1 -0
- package/dist/schema/engines.js +155 -0
- package/dist/schema/engines.js.map +1 -0
- package/dist/schema/engines.test.d.ts +2 -0
- package/dist/schema/engines.test.d.ts.map +1 -0
- package/dist/schema/engines.test.js +221 -0
- package/dist/schema/engines.test.js.map +1 -0
- package/dist/schema/params.d.ts +106 -0
- package/dist/schema/params.d.ts.map +1 -0
- package/dist/schema/params.js +138 -0
- package/dist/schema/params.js.map +1 -0
- package/dist/schema/params.test.d.ts +2 -0
- package/dist/schema/params.test.d.ts.map +1 -0
- package/dist/schema/params.test.js +175 -0
- package/dist/schema/params.test.js.map +1 -0
- package/dist/schema/pipe.d.ts +436 -0
- package/dist/schema/pipe.d.ts.map +1 -0
- package/dist/schema/pipe.js +484 -0
- package/dist/schema/pipe.js.map +1 -0
- package/dist/schema/pipe.test.d.ts +2 -0
- package/dist/schema/pipe.test.d.ts.map +1 -0
- package/dist/schema/pipe.test.js +488 -0
- package/dist/schema/pipe.test.js.map +1 -0
- package/dist/schema/project.d.ts +202 -0
- package/dist/schema/project.d.ts.map +1 -0
- package/dist/schema/project.js +188 -0
- package/dist/schema/project.js.map +1 -0
- package/dist/schema/project.test.d.ts +2 -0
- package/dist/schema/project.test.d.ts.map +1 -0
- package/dist/schema/project.test.js +180 -0
- package/dist/schema/project.test.js.map +1 -0
- package/dist/schema/types.d.ts +140 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +174 -0
- package/dist/schema/types.js.map +1 -0
- package/dist/schema/types.test.d.ts +2 -0
- package/dist/schema/types.test.d.ts.map +1 -0
- package/dist/schema/types.test.js +176 -0
- package/dist/schema/types.test.js.map +1 -0
- package/dist/test/handlers.d.ts +58 -0
- package/dist/test/handlers.d.ts.map +1 -0
- package/dist/test/handlers.js +62 -0
- package/dist/test/handlers.js.map +1 -0
- package/dist/test/setup.d.ts +5 -0
- package/dist/test/setup.d.ts.map +1 -0
- package/dist/test/setup.js +11 -0
- package/dist/test/setup.js.map +1 -0
- package/package.json +57 -0
- package/src/api/branches.test.ts +377 -0
- package/src/api/branches.ts +334 -0
- package/src/api/build.test.ts +216 -0
- package/src/api/build.ts +266 -0
- package/src/api/deploy.test.ts +193 -0
- package/src/api/deploy.ts +163 -0
- package/src/api/workspaces.test.ts +81 -0
- package/src/api/workspaces.ts +77 -0
- package/src/cli/auth.ts +358 -0
- package/src/cli/branch-store.test.ts +139 -0
- package/src/cli/branch-store.ts +137 -0
- package/src/cli/commands/branch.ts +306 -0
- package/src/cli/commands/build.ts +183 -0
- package/src/cli/commands/dev.ts +334 -0
- package/src/cli/commands/init.test.ts +249 -0
- package/src/cli/commands/init.ts +323 -0
- package/src/cli/commands/login.ts +98 -0
- package/src/cli/config.test.ts +359 -0
- package/src/cli/config.ts +335 -0
- package/src/cli/env.ts +86 -0
- package/src/cli/git.test.ts +147 -0
- package/src/cli/git.ts +125 -0
- package/src/cli/index.ts +382 -0
- package/src/cli/utils/schema-validation.test.ts +222 -0
- package/src/cli/utils/schema-validation.ts +272 -0
- package/src/client/base.ts +414 -0
- package/src/client/types.ts +165 -0
- package/src/generator/client.ts +194 -0
- package/src/generator/datasource.test.ts +297 -0
- package/src/generator/datasource.ts +217 -0
- package/src/generator/index.test.ts +209 -0
- package/src/generator/index.ts +203 -0
- package/src/generator/loader.ts +406 -0
- package/src/generator/pipe.test.ts +441 -0
- package/src/generator/pipe.ts +220 -0
- package/src/index.ts +191 -0
- package/src/infer/index.ts +247 -0
- package/src/schema/datasource.test.ts +187 -0
- package/src/schema/datasource.ts +195 -0
- package/src/schema/engines.test.ts +247 -0
- package/src/schema/engines.ts +271 -0
- package/src/schema/params.test.ts +208 -0
- package/src/schema/params.ts +249 -0
- package/src/schema/pipe.test.ts +588 -0
- package/src/schema/pipe.ts +832 -0
- package/src/schema/project.test.ts +236 -0
- package/src/schema/project.ts +394 -0
- package/src/schema/types.test.ts +212 -0
- package/src/schema/types.ts +366 -0
- package/src/test/handlers.ts +79 -0
- 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":"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"}
|
|
@@ -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 @@
|
|
|
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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"}
|