@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,337 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Tinybird CLI
|
|
4
|
+
* Commands for building and deploying Tinybird projects
|
|
5
|
+
*/
|
|
6
|
+
import { readFileSync } from "node:fs";
|
|
7
|
+
import { fileURLToPath } from "node:url";
|
|
8
|
+
import { dirname, resolve } from "node:path";
|
|
9
|
+
import { Command } from "commander";
|
|
10
|
+
import { runInit } from "./commands/init.js";
|
|
11
|
+
import { runBuild } from "./commands/build.js";
|
|
12
|
+
import { runDev } from "./commands/dev.js";
|
|
13
|
+
import { runLogin } from "./commands/login.js";
|
|
14
|
+
import { runBranchList, runBranchStatus, runBranchDelete, } from "./commands/branch.js";
|
|
15
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
16
|
+
const packageJson = JSON.parse(readFileSync(resolve(__dirname, "../../package.json"), "utf-8"));
|
|
17
|
+
const VERSION = packageJson.version;
|
|
18
|
+
/**
|
|
19
|
+
* Format timestamp for console output
|
|
20
|
+
*/
|
|
21
|
+
function formatTime() {
|
|
22
|
+
return new Date().toLocaleTimeString("en-US", { hour12: false });
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Create and configure the CLI
|
|
26
|
+
*/
|
|
27
|
+
function createCli() {
|
|
28
|
+
const program = new Command();
|
|
29
|
+
program
|
|
30
|
+
.name("tinybird")
|
|
31
|
+
.description("Tinybird TypeScript SDK CLI")
|
|
32
|
+
.version(VERSION);
|
|
33
|
+
// Init command
|
|
34
|
+
program
|
|
35
|
+
.command("init")
|
|
36
|
+
.description("Initialize a new Tinybird TypeScript project")
|
|
37
|
+
.option("-f, --force", "Overwrite existing files")
|
|
38
|
+
.option("--skip-login", "Skip browser login flow")
|
|
39
|
+
.action(async (options) => {
|
|
40
|
+
console.log("Initializing Tinybird project...\n");
|
|
41
|
+
const result = await runInit({
|
|
42
|
+
force: options.force,
|
|
43
|
+
skipLogin: options.skipLogin,
|
|
44
|
+
});
|
|
45
|
+
if (!result.success) {
|
|
46
|
+
console.error(`Error: ${result.error}`);
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
if (result.created.length > 0) {
|
|
50
|
+
console.log("Created:");
|
|
51
|
+
result.created.forEach((file) => {
|
|
52
|
+
console.log(` - ${file}`);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
if (result.skipped.length > 0) {
|
|
56
|
+
console.log("\nSkipped (already exists):");
|
|
57
|
+
result.skipped.forEach((file) => {
|
|
58
|
+
console.log(` - ${file}`);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
if (result.loggedIn) {
|
|
62
|
+
console.log(`\nLogged in successfully!`);
|
|
63
|
+
if (result.workspaceName) {
|
|
64
|
+
console.log(` Workspace: ${result.workspaceName}`);
|
|
65
|
+
}
|
|
66
|
+
if (result.userEmail) {
|
|
67
|
+
console.log(` User: ${result.userEmail}`);
|
|
68
|
+
}
|
|
69
|
+
console.log("\nDone! Next steps:");
|
|
70
|
+
console.log(" 1. Edit src/tinybird/schema.ts with your schema");
|
|
71
|
+
console.log(" 2. Run 'npx tinybird dev' to start development");
|
|
72
|
+
}
|
|
73
|
+
else if (result.loggedIn === false) {
|
|
74
|
+
console.log("\nLogin was skipped or failed.");
|
|
75
|
+
console.log("\nDone! Next steps:");
|
|
76
|
+
console.log(" 1. Run 'npx tinybird login' to authenticate");
|
|
77
|
+
console.log(" 2. Edit src/tinybird/schema.ts with your schema");
|
|
78
|
+
console.log(" 3. Run 'npx tinybird dev' to start development");
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
console.log("\nDone! Next steps:");
|
|
82
|
+
console.log(" 1. Edit src/tinybird/schema.ts with your schema");
|
|
83
|
+
console.log(" 2. Run 'npx tinybird dev' to start development");
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
// Login command
|
|
87
|
+
program
|
|
88
|
+
.command("login")
|
|
89
|
+
.description("Authenticate with Tinybird via browser")
|
|
90
|
+
.action(async () => {
|
|
91
|
+
console.log("Starting authentication...\n");
|
|
92
|
+
const result = await runLogin();
|
|
93
|
+
if (!result.success) {
|
|
94
|
+
console.error(`Error: ${result.error}`);
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
console.log("\nAuthentication successful!");
|
|
98
|
+
if (result.workspaceName) {
|
|
99
|
+
console.log(` Workspace: ${result.workspaceName}`);
|
|
100
|
+
}
|
|
101
|
+
if (result.userEmail) {
|
|
102
|
+
console.log(` User: ${result.userEmail}`);
|
|
103
|
+
}
|
|
104
|
+
if (result.baseUrl) {
|
|
105
|
+
console.log(` API Host: ${result.baseUrl}`);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
// Build command
|
|
109
|
+
program
|
|
110
|
+
.command("build")
|
|
111
|
+
.description("Build and push resources to Tinybird")
|
|
112
|
+
.option("--dry-run", "Generate without pushing to API")
|
|
113
|
+
.option("--debug", "Show debug output including API requests/responses")
|
|
114
|
+
.action(async (options) => {
|
|
115
|
+
if (options.debug) {
|
|
116
|
+
process.env.TINYBIRD_DEBUG = "1";
|
|
117
|
+
}
|
|
118
|
+
console.log(`[${formatTime()}] Building...\n`);
|
|
119
|
+
const result = await runBuild({
|
|
120
|
+
dryRun: options.dryRun,
|
|
121
|
+
});
|
|
122
|
+
if (!result.success) {
|
|
123
|
+
console.error(`Error: ${result.error}`);
|
|
124
|
+
process.exit(1);
|
|
125
|
+
}
|
|
126
|
+
const { build, deploy } = result;
|
|
127
|
+
if (build) {
|
|
128
|
+
console.log(`Generated ${build.stats.datasourceCount} datasource(s), ${build.stats.pipeCount} pipe(s)`);
|
|
129
|
+
}
|
|
130
|
+
if (options.dryRun) {
|
|
131
|
+
console.log("\n[Dry run] Resources not deployed to API");
|
|
132
|
+
// Show generated content
|
|
133
|
+
if (build) {
|
|
134
|
+
console.log("\n--- Generated Datasources ---");
|
|
135
|
+
build.resources.datasources.forEach((ds) => {
|
|
136
|
+
console.log(`\n${ds.name}.datasource:`);
|
|
137
|
+
console.log(ds.content);
|
|
138
|
+
});
|
|
139
|
+
console.log("\n--- Generated Pipes ---");
|
|
140
|
+
build.resources.pipes.forEach((pipe) => {
|
|
141
|
+
console.log(`\n${pipe.name}.pipe:`);
|
|
142
|
+
console.log(pipe.content);
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
else if (deploy) {
|
|
147
|
+
if (deploy.result === "no_changes") {
|
|
148
|
+
console.log("No changes detected - already up to date");
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
console.log(`Deployed to Tinybird successfully`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
console.log(`\n[${formatTime()}] Done in ${result.durationMs}ms`);
|
|
155
|
+
});
|
|
156
|
+
// Dev command
|
|
157
|
+
program
|
|
158
|
+
.command("dev")
|
|
159
|
+
.description("Watch for changes and sync with Tinybird")
|
|
160
|
+
.action(async () => {
|
|
161
|
+
console.log(`tinybird dev v${VERSION}`);
|
|
162
|
+
console.log("Loading config from tinybird.json...\n");
|
|
163
|
+
try {
|
|
164
|
+
const controller = await runDev({
|
|
165
|
+
onLoginComplete: (info) => {
|
|
166
|
+
console.log("\nAuthentication successful!");
|
|
167
|
+
if (info.workspaceName) {
|
|
168
|
+
console.log(` Workspace: ${info.workspaceName}`);
|
|
169
|
+
}
|
|
170
|
+
if (info.userEmail) {
|
|
171
|
+
console.log(` User: ${info.userEmail}`);
|
|
172
|
+
}
|
|
173
|
+
console.log("");
|
|
174
|
+
},
|
|
175
|
+
onBranchReady: (info) => {
|
|
176
|
+
if (info.isMainBranch) {
|
|
177
|
+
console.log("On main branch - deploying to workspace\n");
|
|
178
|
+
}
|
|
179
|
+
else if (info.gitBranch) {
|
|
180
|
+
const tinybirdName = info.tinybirdBranch?.name ?? info.gitBranch;
|
|
181
|
+
if (info.wasCreated) {
|
|
182
|
+
console.log(`Detected git branch: ${info.gitBranch}`);
|
|
183
|
+
console.log(`Creating Tinybird branch '${tinybirdName}'...`);
|
|
184
|
+
console.log("Branch created and token cached.\n");
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
console.log(`Detected git branch: ${info.gitBranch}`);
|
|
188
|
+
console.log(`Using existing Tinybird branch '${tinybirdName}'\n`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
console.log("Not in a git repository - deploying to workspace\n");
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
onBuildStart: () => {
|
|
196
|
+
console.log(`[${formatTime()}] Building...`);
|
|
197
|
+
},
|
|
198
|
+
onBuildComplete: (result) => {
|
|
199
|
+
if (!result.success) {
|
|
200
|
+
console.error(`[${formatTime()}] Build failed: ${result.error}`);
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
const { deploy } = result;
|
|
204
|
+
if (deploy) {
|
|
205
|
+
if (deploy.result === "no_changes") {
|
|
206
|
+
console.log(`[${formatTime()}] No changes detected`);
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
console.log(`[${formatTime()}] Built in ${result.durationMs}ms`);
|
|
210
|
+
// Show datasource changes
|
|
211
|
+
if (deploy.datasources) {
|
|
212
|
+
for (const name of deploy.datasources.created) {
|
|
213
|
+
console.log(` + datasource ${name} (created)`);
|
|
214
|
+
}
|
|
215
|
+
for (const name of deploy.datasources.changed) {
|
|
216
|
+
console.log(` ~ datasource ${name} (changed)`);
|
|
217
|
+
}
|
|
218
|
+
for (const name of deploy.datasources.deleted) {
|
|
219
|
+
console.log(` - datasource ${name} (deleted)`);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// Show pipe changes
|
|
223
|
+
if (deploy.pipes) {
|
|
224
|
+
for (const name of deploy.pipes.created) {
|
|
225
|
+
console.log(` + pipe ${name} (created)`);
|
|
226
|
+
}
|
|
227
|
+
for (const name of deploy.pipes.changed) {
|
|
228
|
+
console.log(` ~ pipe ${name} (changed)`);
|
|
229
|
+
}
|
|
230
|
+
for (const name of deploy.pipes.deleted) {
|
|
231
|
+
console.log(` - pipe ${name} (deleted)`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
},
|
|
237
|
+
onSchemaValidation: (validation) => {
|
|
238
|
+
if (validation.issues.length > 0) {
|
|
239
|
+
console.log(`[${formatTime()}] Schema validation:`);
|
|
240
|
+
for (const issue of validation.issues) {
|
|
241
|
+
if (issue.type === "error") {
|
|
242
|
+
console.error(` ERROR [${issue.pipeName}]: ${issue.message}`);
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
console.warn(` WARN [${issue.pipeName}]: ${issue.message}`);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
},
|
|
250
|
+
onError: (error) => {
|
|
251
|
+
console.error(`[${formatTime()}] Error: ${error.message}`);
|
|
252
|
+
},
|
|
253
|
+
});
|
|
254
|
+
console.log("Watching for changes... (Ctrl+C to stop)\n");
|
|
255
|
+
// Handle shutdown
|
|
256
|
+
const shutdown = async () => {
|
|
257
|
+
console.log("\nShutting down...");
|
|
258
|
+
await controller.stop();
|
|
259
|
+
process.exit(0);
|
|
260
|
+
};
|
|
261
|
+
process.on("SIGINT", shutdown);
|
|
262
|
+
process.on("SIGTERM", shutdown);
|
|
263
|
+
// Keep process alive
|
|
264
|
+
await new Promise(() => { });
|
|
265
|
+
}
|
|
266
|
+
catch (error) {
|
|
267
|
+
console.error(`Error: ${error.message}`);
|
|
268
|
+
process.exit(1);
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
// Branch command
|
|
272
|
+
const branchCommand = new Command("branch")
|
|
273
|
+
.description("Manage Tinybird branches");
|
|
274
|
+
branchCommand
|
|
275
|
+
.command("list")
|
|
276
|
+
.description("List all Tinybird branches")
|
|
277
|
+
.action(async () => {
|
|
278
|
+
const result = await runBranchList();
|
|
279
|
+
if (!result.success) {
|
|
280
|
+
console.error(`Error: ${result.error}`);
|
|
281
|
+
process.exit(1);
|
|
282
|
+
}
|
|
283
|
+
if (!result.branches || result.branches.length === 0) {
|
|
284
|
+
console.log("No branches found.");
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
console.log("Branches:");
|
|
288
|
+
result.branches.forEach((branch) => {
|
|
289
|
+
console.log(` - ${branch.name} (created: ${branch.created_at})`);
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
branchCommand
|
|
293
|
+
.command("status")
|
|
294
|
+
.description("Show current branch status")
|
|
295
|
+
.action(async () => {
|
|
296
|
+
const result = await runBranchStatus();
|
|
297
|
+
if (!result.success) {
|
|
298
|
+
console.error(`Error: ${result.error}`);
|
|
299
|
+
process.exit(1);
|
|
300
|
+
}
|
|
301
|
+
console.log("Branch Status:");
|
|
302
|
+
console.log(` Git branch: ${result.gitBranch ?? "(not in git repo)"}`);
|
|
303
|
+
if (result.tinybirdBranchName && result.tinybirdBranchName !== result.gitBranch) {
|
|
304
|
+
console.log(` Tinybird branch name: ${result.tinybirdBranchName} (sanitized)`);
|
|
305
|
+
}
|
|
306
|
+
console.log(` Main branch: ${result.isMainBranch ? "yes" : "no"}`);
|
|
307
|
+
if (result.tinybirdBranch) {
|
|
308
|
+
console.log(` Tinybird branch: ${result.tinybirdBranch.name}`);
|
|
309
|
+
console.log(` Branch ID: ${result.tinybirdBranch.id}`);
|
|
310
|
+
console.log(` Created: ${result.tinybirdBranch.created_at}`);
|
|
311
|
+
}
|
|
312
|
+
else if (!result.isMainBranch && result.tinybirdBranchName) {
|
|
313
|
+
console.log(" Tinybird branch: not created yet");
|
|
314
|
+
console.log(" (Run 'npx tinybird dev' to create it)");
|
|
315
|
+
}
|
|
316
|
+
console.log(` Cached token: ${result.hasCachedToken ? "yes" : "no"}`);
|
|
317
|
+
});
|
|
318
|
+
branchCommand
|
|
319
|
+
.command("delete")
|
|
320
|
+
.description("Delete a Tinybird branch")
|
|
321
|
+
.argument("<name>", "Branch name to delete")
|
|
322
|
+
.action(async (name) => {
|
|
323
|
+
console.log(`Deleting branch '${name}'...`);
|
|
324
|
+
const result = await runBranchDelete(name);
|
|
325
|
+
if (!result.success) {
|
|
326
|
+
console.error(`Error: ${result.error}`);
|
|
327
|
+
process.exit(1);
|
|
328
|
+
}
|
|
329
|
+
console.log(`Branch '${name}' deleted successfully.`);
|
|
330
|
+
});
|
|
331
|
+
program.addCommand(branchCommand);
|
|
332
|
+
return program;
|
|
333
|
+
}
|
|
334
|
+
// Run CLI
|
|
335
|
+
const program = createCli();
|
|
336
|
+
program.parse();
|
|
337
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema validation for pipe output
|
|
3
|
+
* Validates that query responses match the declared output schema
|
|
4
|
+
*/
|
|
5
|
+
import type { ProjectDefinition } from "../../schema/project.js";
|
|
6
|
+
import type { PipeDefinition, OutputDefinition } from "../../schema/pipe.js";
|
|
7
|
+
import type { ColumnMeta } from "../../client/types.js";
|
|
8
|
+
import type { LoadedEntities } from "../../generator/loader.js";
|
|
9
|
+
/**
|
|
10
|
+
* Options for schema validation
|
|
11
|
+
*/
|
|
12
|
+
export interface SchemaValidationOptions {
|
|
13
|
+
/** The project definition containing pipe schemas (legacy) */
|
|
14
|
+
project?: ProjectDefinition;
|
|
15
|
+
/** The loaded entities containing pipe schemas (new) */
|
|
16
|
+
entities?: LoadedEntities;
|
|
17
|
+
/** Names of pipes to validate */
|
|
18
|
+
pipeNames: string[];
|
|
19
|
+
/** Tinybird API base URL */
|
|
20
|
+
baseUrl: string;
|
|
21
|
+
/** API token for authentication */
|
|
22
|
+
token: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* A single validation issue
|
|
26
|
+
*/
|
|
27
|
+
export interface ValidationIssue {
|
|
28
|
+
/** Name of the pipe with the issue */
|
|
29
|
+
pipeName: string;
|
|
30
|
+
/** Issue severity */
|
|
31
|
+
type: "error" | "warning";
|
|
32
|
+
/** Human-readable description of the issue */
|
|
33
|
+
message: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Result of schema validation
|
|
37
|
+
*/
|
|
38
|
+
export interface SchemaValidationResult {
|
|
39
|
+
/** Whether all validations passed (no errors) */
|
|
40
|
+
valid: boolean;
|
|
41
|
+
/** List of validation issues found */
|
|
42
|
+
issues: ValidationIssue[];
|
|
43
|
+
/** Names of pipes that were successfully validated */
|
|
44
|
+
pipesValidated: string[];
|
|
45
|
+
/** Names of pipes that were skipped (e.g., require params) */
|
|
46
|
+
pipesSkipped: string[];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Internal result of validating a single pipe's output schema
|
|
50
|
+
*/
|
|
51
|
+
interface ColumnValidation {
|
|
52
|
+
valid: boolean;
|
|
53
|
+
missingColumns: {
|
|
54
|
+
name: string;
|
|
55
|
+
expectedType: string;
|
|
56
|
+
}[];
|
|
57
|
+
extraColumns: {
|
|
58
|
+
name: string;
|
|
59
|
+
actualType: string;
|
|
60
|
+
}[];
|
|
61
|
+
typeMismatches: {
|
|
62
|
+
name: string;
|
|
63
|
+
expectedType: string;
|
|
64
|
+
actualType: string;
|
|
65
|
+
}[];
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Validate pipe schemas by querying them and comparing response to output definition
|
|
69
|
+
*
|
|
70
|
+
* @param options - Validation options
|
|
71
|
+
* @returns Validation result with issues found
|
|
72
|
+
*/
|
|
73
|
+
export declare function validatePipeSchemas(options: SchemaValidationOptions): Promise<SchemaValidationResult>;
|
|
74
|
+
/**
|
|
75
|
+
* Check if a pipe has any required parameters without defaults
|
|
76
|
+
*/
|
|
77
|
+
declare function hasRequiredParams(pipe: PipeDefinition): boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Build a params object using default values from the pipe definition
|
|
80
|
+
*/
|
|
81
|
+
declare function buildDefaultParams(pipe: PipeDefinition): Record<string, unknown>;
|
|
82
|
+
/**
|
|
83
|
+
* Validate response metadata against the expected output schema
|
|
84
|
+
*/
|
|
85
|
+
declare function validateOutputSchema(responseMeta: ColumnMeta[], outputSchema: OutputDefinition): ColumnValidation;
|
|
86
|
+
/**
|
|
87
|
+
* Check if two ClickHouse types are compatible
|
|
88
|
+
* Handles Nullable, LowCardinality, and timezone variations
|
|
89
|
+
*/
|
|
90
|
+
declare function typesAreCompatible(actual: string, expected: string): boolean;
|
|
91
|
+
export { typesAreCompatible as _typesAreCompatible };
|
|
92
|
+
export { validateOutputSchema as _validateOutputSchema };
|
|
93
|
+
export { hasRequiredParams as _hasRequiredParams };
|
|
94
|
+
export { buildDefaultParams as _buildDefaultParams };
|
|
95
|
+
//# sourceMappingURL=schema-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-validation.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/schema-validation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAmB,MAAM,yBAAyB,CAAC;AAClF,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,8DAA8D;IAC9D,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,wDAAwD;IACxD,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,iCAAiC;IACjC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB;IACrB,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,iDAAiD;IACjD,KAAK,EAAE,OAAO,CAAC;IACf,sCAAsC;IACtC,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,sDAAsD;IACtD,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,8DAA8D;IAC9D,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,UAAU,gBAAgB;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,cAAc,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACzD,YAAY,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACrD,cAAc,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC9E;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,sBAAsB,CAAC,CA2FjC;AAED;;GAEG;AACH,iBAAS,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CASxD;AAED;;GAEG;AACH,iBAAS,kBAAkB,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAYzE;AAED;;GAEG;AACH,iBAAS,oBAAoB,CAC3B,YAAY,EAAE,UAAU,EAAE,EAC1B,YAAY,EAAE,gBAAgB,GAC7B,gBAAgB,CAsClB;AAED;;;GAGG;AACH,iBAAS,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAoBrE;AAGD,OAAO,EAAE,kBAAkB,IAAI,mBAAmB,EAAE,CAAC;AACrD,OAAO,EAAE,oBAAoB,IAAI,qBAAqB,EAAE,CAAC;AACzD,OAAO,EAAE,iBAAiB,IAAI,kBAAkB,EAAE,CAAC;AACnD,OAAO,EAAE,kBAAkB,IAAI,mBAAmB,EAAE,CAAC"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema validation for pipe output
|
|
3
|
+
* Validates that query responses match the declared output schema
|
|
4
|
+
*/
|
|
5
|
+
import { TinybirdClient } from "../../client/base.js";
|
|
6
|
+
/**
|
|
7
|
+
* Validate pipe schemas by querying them and comparing response to output definition
|
|
8
|
+
*
|
|
9
|
+
* @param options - Validation options
|
|
10
|
+
* @returns Validation result with issues found
|
|
11
|
+
*/
|
|
12
|
+
export async function validatePipeSchemas(options) {
|
|
13
|
+
const client = new TinybirdClient({
|
|
14
|
+
baseUrl: options.baseUrl,
|
|
15
|
+
token: options.token,
|
|
16
|
+
});
|
|
17
|
+
const result = {
|
|
18
|
+
valid: true,
|
|
19
|
+
issues: [],
|
|
20
|
+
pipesValidated: [],
|
|
21
|
+
pipesSkipped: [],
|
|
22
|
+
};
|
|
23
|
+
// Get pipes from either project or entities
|
|
24
|
+
const pipes = options.entities
|
|
25
|
+
? Object.fromEntries(Object.entries(options.entities.pipes).map(([name, { definition }]) => [name, definition]))
|
|
26
|
+
: options.project?.pipes ?? {};
|
|
27
|
+
// Only validate the specified pipes
|
|
28
|
+
for (const pipeName of options.pipeNames) {
|
|
29
|
+
// Find pipe by name
|
|
30
|
+
const pipe = Object.values(pipes).find((p) => p._name === pipeName);
|
|
31
|
+
if (!pipe) {
|
|
32
|
+
// Pipe exists in Tinybird but not in local schema (could be deleted or renamed)
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
// Skip if pipe has required params without defaults
|
|
36
|
+
if (hasRequiredParams(pipe)) {
|
|
37
|
+
result.pipesSkipped.push(pipeName);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
// Skip if pipe has no output schema (reusable pipes)
|
|
41
|
+
if (!pipe._output) {
|
|
42
|
+
result.pipesSkipped.push(pipeName);
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
// Build params using defaults
|
|
46
|
+
const params = buildDefaultParams(pipe);
|
|
47
|
+
try {
|
|
48
|
+
const response = await client.query(pipeName, params);
|
|
49
|
+
const validation = validateOutputSchema(response.meta, pipe._output);
|
|
50
|
+
if (!validation.valid) {
|
|
51
|
+
result.valid = false;
|
|
52
|
+
}
|
|
53
|
+
// Add missing column errors
|
|
54
|
+
for (const missing of validation.missingColumns) {
|
|
55
|
+
result.issues.push({
|
|
56
|
+
pipeName,
|
|
57
|
+
type: "error",
|
|
58
|
+
message: `Missing column '${missing.name}' (expected: ${missing.expectedType})`,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
// Add type mismatch errors
|
|
62
|
+
for (const mismatch of validation.typeMismatches) {
|
|
63
|
+
result.issues.push({
|
|
64
|
+
pipeName,
|
|
65
|
+
type: "error",
|
|
66
|
+
message: `Type mismatch '${mismatch.name}': expected ${mismatch.expectedType}, got ${mismatch.actualType}`,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
// Add extra column warnings
|
|
70
|
+
for (const extra of validation.extraColumns) {
|
|
71
|
+
result.issues.push({
|
|
72
|
+
pipeName,
|
|
73
|
+
type: "warning",
|
|
74
|
+
message: `Extra column '${extra.name}' (${extra.actualType}) not in output schema`,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
result.pipesValidated.push(pipeName);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Query failed - skip validation for this pipe
|
|
81
|
+
// This could happen if the pipe doesn't exist yet, network issues, etc.
|
|
82
|
+
result.pipesSkipped.push(pipeName);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Check if a pipe has any required parameters without defaults
|
|
89
|
+
*/
|
|
90
|
+
function hasRequiredParams(pipe) {
|
|
91
|
+
if (!pipe._params)
|
|
92
|
+
return false;
|
|
93
|
+
for (const param of Object.values(pipe._params)) {
|
|
94
|
+
if (param._required && param._default === undefined) {
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Build a params object using default values from the pipe definition
|
|
102
|
+
*/
|
|
103
|
+
function buildDefaultParams(pipe) {
|
|
104
|
+
const params = {};
|
|
105
|
+
if (!pipe._params)
|
|
106
|
+
return params;
|
|
107
|
+
for (const [name, param] of Object.entries(pipe._params)) {
|
|
108
|
+
if (param._default !== undefined) {
|
|
109
|
+
params[name] = param._default;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return params;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Validate response metadata against the expected output schema
|
|
116
|
+
*/
|
|
117
|
+
function validateOutputSchema(responseMeta, outputSchema) {
|
|
118
|
+
const result = {
|
|
119
|
+
valid: true,
|
|
120
|
+
missingColumns: [],
|
|
121
|
+
extraColumns: [],
|
|
122
|
+
typeMismatches: [],
|
|
123
|
+
};
|
|
124
|
+
// Build a map of response columns for lookup
|
|
125
|
+
const responseColumns = new Map(responseMeta.map((col) => [col.name, col.type]));
|
|
126
|
+
// Check each expected column from the schema
|
|
127
|
+
for (const [name, validator] of Object.entries(outputSchema)) {
|
|
128
|
+
const expectedType = validator._tinybirdType;
|
|
129
|
+
const actualType = responseColumns.get(name);
|
|
130
|
+
if (!actualType) {
|
|
131
|
+
// Column missing from response
|
|
132
|
+
result.missingColumns.push({ name, expectedType });
|
|
133
|
+
result.valid = false;
|
|
134
|
+
}
|
|
135
|
+
else if (!typesAreCompatible(actualType, expectedType)) {
|
|
136
|
+
// Column exists but type doesn't match
|
|
137
|
+
result.typeMismatches.push({ name, expectedType, actualType });
|
|
138
|
+
result.valid = false;
|
|
139
|
+
}
|
|
140
|
+
// Remove from map so we can find extra columns
|
|
141
|
+
responseColumns.delete(name);
|
|
142
|
+
}
|
|
143
|
+
// Remaining columns are extras (warnings, not errors)
|
|
144
|
+
for (const [name, actualType] of responseColumns) {
|
|
145
|
+
result.extraColumns.push({ name, actualType });
|
|
146
|
+
}
|
|
147
|
+
return result;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Check if two ClickHouse types are compatible
|
|
151
|
+
* Handles Nullable, LowCardinality, and timezone variations
|
|
152
|
+
*/
|
|
153
|
+
function typesAreCompatible(actual, expected) {
|
|
154
|
+
const normalize = (t) => {
|
|
155
|
+
let normalized = t;
|
|
156
|
+
// Remove LowCardinality(Nullable(...)) to just the inner type (must be before individual removals)
|
|
157
|
+
normalized = normalized.replace(/^LowCardinality\(Nullable\((.+)\)\)$/, "$1");
|
|
158
|
+
// Remove Nullable wrapper
|
|
159
|
+
normalized = normalized.replace(/^Nullable\((.+)\)$/, "$1");
|
|
160
|
+
// Remove LowCardinality wrapper
|
|
161
|
+
normalized = normalized.replace(/^LowCardinality\((.+)\)$/, "$1");
|
|
162
|
+
// Remove timezone from DateTime
|
|
163
|
+
normalized = normalized.replace(/^DateTime\('.+'\)$/, "DateTime");
|
|
164
|
+
// Remove precision and timezone from DateTime64
|
|
165
|
+
normalized = normalized.replace(/^DateTime64\(\d+(, '.+')?\)$/, "DateTime64");
|
|
166
|
+
return normalized;
|
|
167
|
+
};
|
|
168
|
+
return normalize(actual) === normalize(expected);
|
|
169
|
+
}
|
|
170
|
+
// Export internal functions for testing
|
|
171
|
+
export { typesAreCompatible as _typesAreCompatible };
|
|
172
|
+
export { validateOutputSchema as _validateOutputSchema };
|
|
173
|
+
export { hasRequiredParams as _hasRequiredParams };
|
|
174
|
+
export { buildDefaultParams as _buildDefaultParams };
|
|
175
|
+
//# sourceMappingURL=schema-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-validation.js","sourceRoot":"","sources":["../../../src/cli/utils/schema-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-validation.test.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/schema-validation.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|