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