@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,208 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { p, isParamValidator, getParamTinybirdType, isParamRequired, getParamDefault, getParamDescription } from './params.js';
|
|
3
|
+
|
|
4
|
+
describe('Parameter Validators (p.*)', () => {
|
|
5
|
+
describe('String types', () => {
|
|
6
|
+
it('generates String parameter', () => {
|
|
7
|
+
const param = p.string();
|
|
8
|
+
expect(param._tinybirdType).toBe('String');
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
it('generates UUID parameter', () => {
|
|
12
|
+
const param = p.uuid();
|
|
13
|
+
expect(param._tinybirdType).toBe('UUID');
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
describe('Integer types', () => {
|
|
18
|
+
it('generates Int8 parameter', () => {
|
|
19
|
+
const param = p.int8();
|
|
20
|
+
expect(param._tinybirdType).toBe('Int8');
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('generates Int16 parameter', () => {
|
|
24
|
+
const param = p.int16();
|
|
25
|
+
expect(param._tinybirdType).toBe('Int16');
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('generates Int32 parameter', () => {
|
|
29
|
+
const param = p.int32();
|
|
30
|
+
expect(param._tinybirdType).toBe('Int32');
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('generates Int64 parameter', () => {
|
|
34
|
+
const param = p.int64();
|
|
35
|
+
expect(param._tinybirdType).toBe('Int64');
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('generates UInt8 parameter', () => {
|
|
39
|
+
const param = p.uint8();
|
|
40
|
+
expect(param._tinybirdType).toBe('UInt8');
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('generates UInt16 parameter', () => {
|
|
44
|
+
const param = p.uint16();
|
|
45
|
+
expect(param._tinybirdType).toBe('UInt16');
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('generates UInt32 parameter', () => {
|
|
49
|
+
const param = p.uint32();
|
|
50
|
+
expect(param._tinybirdType).toBe('UInt32');
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('generates UInt64 parameter', () => {
|
|
54
|
+
const param = p.uint64();
|
|
55
|
+
expect(param._tinybirdType).toBe('UInt64');
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
describe('Float types', () => {
|
|
60
|
+
it('generates Float32 parameter', () => {
|
|
61
|
+
const param = p.float32();
|
|
62
|
+
expect(param._tinybirdType).toBe('Float32');
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('generates Float64 parameter', () => {
|
|
66
|
+
const param = p.float64();
|
|
67
|
+
expect(param._tinybirdType).toBe('Float64');
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
describe('Boolean type', () => {
|
|
72
|
+
it('generates Boolean parameter', () => {
|
|
73
|
+
const param = p.boolean();
|
|
74
|
+
expect(param._tinybirdType).toBe('Boolean');
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
describe('Date/Time types', () => {
|
|
79
|
+
it('generates Date parameter', () => {
|
|
80
|
+
const param = p.date();
|
|
81
|
+
expect(param._tinybirdType).toBe('Date');
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it('generates DateTime parameter', () => {
|
|
85
|
+
const param = p.dateTime();
|
|
86
|
+
expect(param._tinybirdType).toBe('DateTime');
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('generates DateTime64 parameter', () => {
|
|
90
|
+
const param = p.dateTime64();
|
|
91
|
+
expect(param._tinybirdType).toBe('DateTime64');
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
describe('Special types', () => {
|
|
96
|
+
it('generates column parameter', () => {
|
|
97
|
+
const param = p.column();
|
|
98
|
+
expect(param._tinybirdType).toBe('column');
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
describe('Required by default', () => {
|
|
103
|
+
it('parameters are required by default', () => {
|
|
104
|
+
const param = p.string();
|
|
105
|
+
expect(param._required).toBe(true);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
describe('Optional modifier', () => {
|
|
110
|
+
it('makes parameter optional without default', () => {
|
|
111
|
+
const param = p.int32().optional();
|
|
112
|
+
expect(param._required).toBe(false);
|
|
113
|
+
expect(param._default).toBeUndefined();
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it('makes parameter optional with default value', () => {
|
|
117
|
+
const param = p.int32().optional(10);
|
|
118
|
+
expect(param._required).toBe(false);
|
|
119
|
+
expect(param._default).toBe(10);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it('preserves type when optional', () => {
|
|
123
|
+
const param = p.string().optional('default');
|
|
124
|
+
expect(param._tinybirdType).toBe('String');
|
|
125
|
+
expect(param._default).toBe('default');
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
describe('Required modifier', () => {
|
|
130
|
+
it('makes optional parameter required again', () => {
|
|
131
|
+
const param = p.int32().optional(10).required();
|
|
132
|
+
expect(param._required).toBe(true);
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
describe('Description modifier', () => {
|
|
137
|
+
it('sets description', () => {
|
|
138
|
+
const param = p.string().describe('User ID');
|
|
139
|
+
expect(param._description).toBe('User ID');
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
it('preserves description when chaining', () => {
|
|
143
|
+
const param = p.int32().describe('Limit value').optional(10);
|
|
144
|
+
expect(param._description).toBe('Limit value');
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
describe('Combined modifiers', () => {
|
|
149
|
+
it('supports optional with description', () => {
|
|
150
|
+
const param = p.int32().optional(10).describe('Limit');
|
|
151
|
+
expect(param._required).toBe(false);
|
|
152
|
+
expect(param._default).toBe(10);
|
|
153
|
+
expect(param._description).toBe('Limit');
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it('supports description then optional', () => {
|
|
157
|
+
const param = p.int32().describe('Limit').optional(10);
|
|
158
|
+
expect(param._required).toBe(false);
|
|
159
|
+
expect(param._default).toBe(10);
|
|
160
|
+
expect(param._description).toBe('Limit');
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
describe('Helper functions', () => {
|
|
165
|
+
it('isParamValidator returns true for validators', () => {
|
|
166
|
+
expect(isParamValidator(p.string())).toBe(true);
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it('isParamValidator returns false for non-validators', () => {
|
|
170
|
+
expect(isParamValidator('string')).toBe(false);
|
|
171
|
+
expect(isParamValidator({})).toBe(false);
|
|
172
|
+
expect(isParamValidator(null)).toBe(false);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it('getParamTinybirdType returns type string', () => {
|
|
176
|
+
expect(getParamTinybirdType(p.string())).toBe('String');
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
it('isParamRequired returns required status', () => {
|
|
180
|
+
expect(isParamRequired(p.string())).toBe(true);
|
|
181
|
+
expect(isParamRequired(p.string().optional())).toBe(false);
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
it('getParamDefault returns default value', () => {
|
|
185
|
+
expect(getParamDefault(p.int32().optional(10))).toBe(10);
|
|
186
|
+
expect(getParamDefault(p.int32())).toBeUndefined();
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
it('getParamDescription returns description', () => {
|
|
190
|
+
expect(getParamDescription(p.string().describe('Test'))).toBe('Test');
|
|
191
|
+
expect(getParamDescription(p.string())).toBeUndefined();
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
describe('Array parameter', () => {
|
|
196
|
+
it('creates array parameter', () => {
|
|
197
|
+
const param = p.array(p.string());
|
|
198
|
+
expect(param._tinybirdType).toBe('Array');
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
describe('JSON parameter', () => {
|
|
203
|
+
it('creates JSON parameter', () => {
|
|
204
|
+
const param = p.json();
|
|
205
|
+
expect(param._tinybirdType).toBe('JSON');
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
});
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parameter validators for Tinybird pipe queries
|
|
3
|
+
* Similar to the column type validators but for query parameters
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
// Symbol for brand typing
|
|
7
|
+
const PARAM_BRAND = Symbol("tinybird.param");
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Base interface for parameter validators
|
|
11
|
+
*/
|
|
12
|
+
export interface ParamValidator<
|
|
13
|
+
TType,
|
|
14
|
+
TTinybirdType extends string = string,
|
|
15
|
+
TRequired extends boolean = true
|
|
16
|
+
> {
|
|
17
|
+
readonly [PARAM_BRAND]: true;
|
|
18
|
+
/** The inferred TypeScript type */
|
|
19
|
+
readonly _type: TType;
|
|
20
|
+
/** The Tinybird type string for the parameter */
|
|
21
|
+
readonly _tinybirdType: TTinybirdType;
|
|
22
|
+
/** Whether this parameter is required */
|
|
23
|
+
readonly _required: TRequired;
|
|
24
|
+
/** Default value if optional */
|
|
25
|
+
readonly _default?: TType;
|
|
26
|
+
/** Description for documentation */
|
|
27
|
+
readonly _description?: string;
|
|
28
|
+
|
|
29
|
+
/** Make this parameter optional with an optional default value */
|
|
30
|
+
optional<TDefault extends TType | undefined = undefined>(
|
|
31
|
+
defaultValue?: TDefault
|
|
32
|
+
): ParamValidator<
|
|
33
|
+
TDefault extends undefined ? TType | undefined : TType,
|
|
34
|
+
TTinybirdType,
|
|
35
|
+
false
|
|
36
|
+
>;
|
|
37
|
+
|
|
38
|
+
/** Make this parameter required (default) */
|
|
39
|
+
required(): ParamValidator<TType, TTinybirdType, true>;
|
|
40
|
+
|
|
41
|
+
/** Add a description for this parameter */
|
|
42
|
+
describe(description: string): ParamValidator<TType, TTinybirdType, TRequired>;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Internal implementation
|
|
46
|
+
interface ParamValidatorImpl<TType, TTinybirdType extends string, TRequired extends boolean>
|
|
47
|
+
extends ParamValidator<TType, TTinybirdType, TRequired> {
|
|
48
|
+
readonly tinybirdType: TTinybirdType;
|
|
49
|
+
readonly isRequired: TRequired;
|
|
50
|
+
readonly defaultValue?: TType;
|
|
51
|
+
readonly description?: string;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function createParamValidator<
|
|
55
|
+
TType,
|
|
56
|
+
TTinybirdType extends string,
|
|
57
|
+
TRequired extends boolean = true
|
|
58
|
+
>(
|
|
59
|
+
tinybirdType: TTinybirdType,
|
|
60
|
+
options: {
|
|
61
|
+
required?: TRequired;
|
|
62
|
+
defaultValue?: TType;
|
|
63
|
+
description?: string;
|
|
64
|
+
} = {}
|
|
65
|
+
): ParamValidator<TType, TTinybirdType, TRequired> {
|
|
66
|
+
const isRequired = (options.required ?? true) as TRequired;
|
|
67
|
+
|
|
68
|
+
const validator: ParamValidatorImpl<TType, TTinybirdType, TRequired> = {
|
|
69
|
+
[PARAM_BRAND]: true,
|
|
70
|
+
_type: undefined as unknown as TType,
|
|
71
|
+
_tinybirdType: tinybirdType,
|
|
72
|
+
_required: isRequired,
|
|
73
|
+
_default: options.defaultValue,
|
|
74
|
+
_description: options.description,
|
|
75
|
+
tinybirdType,
|
|
76
|
+
isRequired,
|
|
77
|
+
defaultValue: options.defaultValue,
|
|
78
|
+
description: options.description,
|
|
79
|
+
|
|
80
|
+
optional<TDefault extends TType | undefined = undefined>(defaultValue?: TDefault) {
|
|
81
|
+
return createParamValidator<
|
|
82
|
+
TDefault extends undefined ? TType | undefined : TType,
|
|
83
|
+
TTinybirdType,
|
|
84
|
+
false
|
|
85
|
+
>(tinybirdType, {
|
|
86
|
+
required: false,
|
|
87
|
+
defaultValue: defaultValue as TDefault extends undefined ? TType | undefined : TType,
|
|
88
|
+
description: options.description,
|
|
89
|
+
});
|
|
90
|
+
},
|
|
91
|
+
|
|
92
|
+
required() {
|
|
93
|
+
return createParamValidator<TType, TTinybirdType, true>(tinybirdType, {
|
|
94
|
+
required: true,
|
|
95
|
+
description: options.description,
|
|
96
|
+
});
|
|
97
|
+
},
|
|
98
|
+
|
|
99
|
+
describe(description: string) {
|
|
100
|
+
return createParamValidator<TType, TTinybirdType, TRequired>(tinybirdType, {
|
|
101
|
+
required: isRequired,
|
|
102
|
+
defaultValue: options.defaultValue,
|
|
103
|
+
description,
|
|
104
|
+
});
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
return validator;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Parameter validators for Tinybird pipe queries
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* ```ts
|
|
116
|
+
* import { p } from '@tinybirdco/sdk';
|
|
117
|
+
*
|
|
118
|
+
* const params = {
|
|
119
|
+
* user_id: p.string(),
|
|
120
|
+
* limit: p.int32().optional(10),
|
|
121
|
+
* start_date: p.dateTime().describe('Start of date range'),
|
|
122
|
+
* };
|
|
123
|
+
* ```
|
|
124
|
+
*/
|
|
125
|
+
export const p = {
|
|
126
|
+
// ============ String Types ============
|
|
127
|
+
|
|
128
|
+
/** String parameter */
|
|
129
|
+
string: () => createParamValidator<string, "String">("String"),
|
|
130
|
+
|
|
131
|
+
/** UUID parameter */
|
|
132
|
+
uuid: () => createParamValidator<string, "UUID">("UUID"),
|
|
133
|
+
|
|
134
|
+
// ============ Integer Types ============
|
|
135
|
+
|
|
136
|
+
/** Int8 parameter */
|
|
137
|
+
int8: () => createParamValidator<number, "Int8">("Int8"),
|
|
138
|
+
|
|
139
|
+
/** Int16 parameter */
|
|
140
|
+
int16: () => createParamValidator<number, "Int16">("Int16"),
|
|
141
|
+
|
|
142
|
+
/** Int32 parameter */
|
|
143
|
+
int32: () => createParamValidator<number, "Int32">("Int32"),
|
|
144
|
+
|
|
145
|
+
/** Int64 parameter */
|
|
146
|
+
int64: () => createParamValidator<number, "Int64">("Int64"),
|
|
147
|
+
|
|
148
|
+
/** UInt8 parameter */
|
|
149
|
+
uint8: () => createParamValidator<number, "UInt8">("UInt8"),
|
|
150
|
+
|
|
151
|
+
/** UInt16 parameter */
|
|
152
|
+
uint16: () => createParamValidator<number, "UInt16">("UInt16"),
|
|
153
|
+
|
|
154
|
+
/** UInt32 parameter */
|
|
155
|
+
uint32: () => createParamValidator<number, "UInt32">("UInt32"),
|
|
156
|
+
|
|
157
|
+
/** UInt64 parameter */
|
|
158
|
+
uint64: () => createParamValidator<number, "UInt64">("UInt64"),
|
|
159
|
+
|
|
160
|
+
// ============ Float Types ============
|
|
161
|
+
|
|
162
|
+
/** Float32 parameter */
|
|
163
|
+
float32: () => createParamValidator<number, "Float32">("Float32"),
|
|
164
|
+
|
|
165
|
+
/** Float64 parameter */
|
|
166
|
+
float64: () => createParamValidator<number, "Float64">("Float64"),
|
|
167
|
+
|
|
168
|
+
// ============ Boolean ============
|
|
169
|
+
|
|
170
|
+
/** Boolean parameter */
|
|
171
|
+
boolean: () => createParamValidator<boolean, "Boolean">("Boolean"),
|
|
172
|
+
|
|
173
|
+
// ============ Date/Time Types ============
|
|
174
|
+
|
|
175
|
+
/** Date parameter (YYYY-MM-DD format) */
|
|
176
|
+
date: () => createParamValidator<string, "Date">("Date"),
|
|
177
|
+
|
|
178
|
+
/** DateTime parameter (YYYY-MM-DD HH:MM:SS format) */
|
|
179
|
+
dateTime: () => createParamValidator<string, "DateTime">("DateTime"),
|
|
180
|
+
|
|
181
|
+
/** DateTime64 parameter with sub-second precision */
|
|
182
|
+
dateTime64: () => createParamValidator<string, "DateTime64">("DateTime64"),
|
|
183
|
+
|
|
184
|
+
// ============ Array Types ============
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Array parameter - values can be passed as comma-separated or repeated params
|
|
188
|
+
* @param _element - The type of array elements (used for type inference)
|
|
189
|
+
* @param _separator - Optional custom separator (default: comma)
|
|
190
|
+
*/
|
|
191
|
+
array: <TElement extends ParamValidator<unknown, string, boolean>>(
|
|
192
|
+
_element: TElement,
|
|
193
|
+
_separator?: string
|
|
194
|
+
): ParamValidator<TElement["_type"][], "Array", true> =>
|
|
195
|
+
createParamValidator<TElement["_type"][], "Array">("Array", {
|
|
196
|
+
required: true,
|
|
197
|
+
}),
|
|
198
|
+
|
|
199
|
+
// ============ Special Types ============
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Column reference parameter - allows dynamic column selection
|
|
203
|
+
* Use with caution as it can affect query safety
|
|
204
|
+
*/
|
|
205
|
+
column: () => createParamValidator<string, "column">("column"),
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* JSON parameter - for passing complex structured data
|
|
209
|
+
*/
|
|
210
|
+
json: <TShape = unknown>() => createParamValidator<TShape, "JSON">("JSON"),
|
|
211
|
+
} as const;
|
|
212
|
+
|
|
213
|
+
/** Type alias for any parameter validator */
|
|
214
|
+
export type AnyParamValidator = ParamValidator<unknown, string, boolean>;
|
|
215
|
+
|
|
216
|
+
/** Extract the TypeScript type from a parameter validator */
|
|
217
|
+
export type InferParamType<T extends AnyParamValidator> = T["_required"] extends true
|
|
218
|
+
? T["_type"]
|
|
219
|
+
: T["_type"] | undefined;
|
|
220
|
+
|
|
221
|
+
/** Check if a value is a parameter validator */
|
|
222
|
+
export function isParamValidator(value: unknown): value is AnyParamValidator {
|
|
223
|
+
return (
|
|
224
|
+
typeof value === "object" &&
|
|
225
|
+
value !== null &&
|
|
226
|
+
PARAM_BRAND in value &&
|
|
227
|
+
(value as Record<symbol, unknown>)[PARAM_BRAND] === true
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/** Get the Tinybird type string from a parameter validator */
|
|
232
|
+
export function getParamTinybirdType(validator: AnyParamValidator): string {
|
|
233
|
+
return validator._tinybirdType;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/** Check if a parameter is required */
|
|
237
|
+
export function isParamRequired(validator: AnyParamValidator): boolean {
|
|
238
|
+
return validator._required;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/** Get the default value of a parameter */
|
|
242
|
+
export function getParamDefault<T>(validator: ParamValidator<T, string, boolean>): T | undefined {
|
|
243
|
+
return validator._default;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/** Get the description of a parameter */
|
|
247
|
+
export function getParamDescription(validator: AnyParamValidator): string | undefined {
|
|
248
|
+
return validator._description;
|
|
249
|
+
}
|