@tinybirdco/sdk 0.0.41 → 0.0.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +29 -3
  3. package/dist/api/resources.d.ts +72 -1
  4. package/dist/api/resources.d.ts.map +1 -1
  5. package/dist/api/resources.js +197 -1
  6. package/dist/api/resources.js.map +1 -1
  7. package/dist/api/resources.test.js +82 -1
  8. package/dist/api/resources.test.js.map +1 -1
  9. package/dist/cli/commands/migrate.d.ts +11 -0
  10. package/dist/cli/commands/migrate.d.ts.map +1 -0
  11. package/dist/cli/commands/migrate.js +196 -0
  12. package/dist/cli/commands/migrate.js.map +1 -0
  13. package/dist/cli/commands/migrate.test.d.ts +2 -0
  14. package/dist/cli/commands/migrate.test.d.ts.map +1 -0
  15. package/dist/cli/commands/migrate.test.js +473 -0
  16. package/dist/cli/commands/migrate.test.js.map +1 -0
  17. package/dist/cli/commands/pull.d.ts +59 -0
  18. package/dist/cli/commands/pull.d.ts.map +1 -0
  19. package/dist/cli/commands/pull.js +104 -0
  20. package/dist/cli/commands/pull.js.map +1 -0
  21. package/dist/cli/commands/pull.test.d.ts +2 -0
  22. package/dist/cli/commands/pull.test.d.ts.map +1 -0
  23. package/dist/cli/commands/pull.test.js +140 -0
  24. package/dist/cli/commands/pull.test.js.map +1 -0
  25. package/dist/cli/config.d.ts +10 -0
  26. package/dist/cli/config.d.ts.map +1 -1
  27. package/dist/cli/config.js +22 -0
  28. package/dist/cli/config.js.map +1 -1
  29. package/dist/cli/index.js +77 -0
  30. package/dist/cli/index.js.map +1 -1
  31. package/dist/generator/client.js +2 -2
  32. package/dist/generator/client.js.map +1 -1
  33. package/dist/index.d.ts +1 -1
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +1 -1
  36. package/dist/index.js.map +1 -1
  37. package/dist/migrate/discovery.d.ts +7 -0
  38. package/dist/migrate/discovery.d.ts.map +1 -0
  39. package/dist/migrate/discovery.js +125 -0
  40. package/dist/migrate/discovery.js.map +1 -0
  41. package/dist/migrate/emit-ts.d.ts +4 -0
  42. package/dist/migrate/emit-ts.d.ts.map +1 -0
  43. package/dist/migrate/emit-ts.js +387 -0
  44. package/dist/migrate/emit-ts.js.map +1 -0
  45. package/dist/migrate/parse-connection.d.ts +3 -0
  46. package/dist/migrate/parse-connection.d.ts.map +1 -0
  47. package/dist/migrate/parse-connection.js +74 -0
  48. package/dist/migrate/parse-connection.js.map +1 -0
  49. package/dist/migrate/parse-datasource.d.ts +3 -0
  50. package/dist/migrate/parse-datasource.d.ts.map +1 -0
  51. package/dist/migrate/parse-datasource.js +324 -0
  52. package/dist/migrate/parse-datasource.js.map +1 -0
  53. package/dist/migrate/parse-pipe.d.ts +3 -0
  54. package/dist/migrate/parse-pipe.d.ts.map +1 -0
  55. package/dist/migrate/parse-pipe.js +332 -0
  56. package/dist/migrate/parse-pipe.js.map +1 -0
  57. package/dist/migrate/parse.d.ts +3 -0
  58. package/dist/migrate/parse.d.ts.map +1 -0
  59. package/dist/migrate/parse.js +18 -0
  60. package/dist/migrate/parse.js.map +1 -0
  61. package/dist/migrate/parser-utils.d.ts +20 -0
  62. package/dist/migrate/parser-utils.d.ts.map +1 -0
  63. package/dist/migrate/parser-utils.js +130 -0
  64. package/dist/migrate/parser-utils.js.map +1 -0
  65. package/dist/migrate/types.d.ts +110 -0
  66. package/dist/migrate/types.d.ts.map +1 -0
  67. package/dist/migrate/types.js +2 -0
  68. package/dist/migrate/types.js.map +1 -0
  69. package/dist/schema/project.d.ts +20 -9
  70. package/dist/schema/project.d.ts.map +1 -1
  71. package/dist/schema/project.js +127 -136
  72. package/dist/schema/project.js.map +1 -1
  73. package/dist/schema/project.test.js +22 -0
  74. package/dist/schema/project.test.js.map +1 -1
  75. package/package.json +2 -1
  76. package/src/api/resources.test.ts +121 -0
  77. package/src/api/resources.ts +292 -1
  78. package/src/cli/commands/migrate.test.ts +564 -0
  79. package/src/cli/commands/migrate.ts +240 -0
  80. package/src/cli/commands/pull.test.ts +173 -0
  81. package/src/cli/commands/pull.ts +177 -0
  82. package/src/cli/config.ts +26 -0
  83. package/src/cli/index.ts +112 -0
  84. package/src/generator/client.ts +2 -2
  85. package/src/index.ts +1 -1
  86. package/src/migrate/discovery.ts +151 -0
  87. package/src/migrate/emit-ts.ts +469 -0
  88. package/src/migrate/parse-connection.ts +128 -0
  89. package/src/migrate/parse-datasource.ts +453 -0
  90. package/src/migrate/parse-pipe.ts +518 -0
  91. package/src/migrate/parse.ts +20 -0
  92. package/src/migrate/parser-utils.ts +160 -0
  93. package/src/migrate/types.ts +125 -0
  94. package/src/schema/project.test.ts +28 -0
  95. package/src/schema/project.ts +173 -181
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Pull command - downloads all cloud resources as Tinybird datafiles
3
+ */
4
+ import { type ResourceFileType } from "../../api/resources.js";
5
+ /**
6
+ * Pull command options
7
+ */
8
+ export interface PullCommandOptions {
9
+ /** Working directory (defaults to cwd) */
10
+ cwd?: string;
11
+ /** Output directory for pulled files (defaults to current directory) */
12
+ outputDir?: string;
13
+ /** Whether to overwrite existing files (defaults to false) */
14
+ overwrite?: boolean;
15
+ }
16
+ /**
17
+ * Single file written by pull
18
+ */
19
+ export interface PulledFileResult {
20
+ /** Resource name */
21
+ name: string;
22
+ /** Resource type */
23
+ type: ResourceFileType;
24
+ /** Filename written */
25
+ filename: string;
26
+ /** Absolute path written */
27
+ path: string;
28
+ /** Path relative to cwd */
29
+ relativePath: string;
30
+ /** Whether this file was newly created or overwritten */
31
+ status: "created" | "overwritten";
32
+ }
33
+ /**
34
+ * Pull command result
35
+ */
36
+ export interface PullCommandResult {
37
+ /** Whether pull was successful */
38
+ success: boolean;
39
+ /** Output directory used */
40
+ outputDir?: string;
41
+ /** Files written */
42
+ files?: PulledFileResult[];
43
+ /** Pull statistics */
44
+ stats?: {
45
+ datasources: number;
46
+ pipes: number;
47
+ connections: number;
48
+ total: number;
49
+ };
50
+ /** Error message if failed */
51
+ error?: string;
52
+ /** Duration in milliseconds */
53
+ durationMs: number;
54
+ }
55
+ /**
56
+ * Pull all resources from Tinybird and write them as datafiles
57
+ */
58
+ export declare function runPull(options?: PullCommandOptions): Promise<PullCommandResult>;
59
+ //# sourceMappingURL=pull.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/pull.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,wBAAwB,CAAC;AAEhC;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,oBAAoB;IACpB,IAAI,EAAE,gBAAgB,CAAC;IACvB,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,2BAA2B;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,MAAM,EAAE,SAAS,GAAG,aAAa,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kCAAkC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,KAAK,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC3B,sBAAsB;IACtB,KAAK,CAAC,EAAE;QACN,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;CACpB;AASD;;GAEG;AACH,wBAAsB,OAAO,CAC3B,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAiG5B"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Pull command - downloads all cloud resources as Tinybird datafiles
3
+ */
4
+ import * as fs from "node:fs/promises";
5
+ import * as path from "node:path";
6
+ import { loadConfigAsync } from "../config.js";
7
+ import { pullAllResourceFiles, } from "../../api/resources.js";
8
+ /**
9
+ * Convert grouped resources to a flat file list
10
+ */
11
+ function flattenResources(resources) {
12
+ return [...resources.datasources, ...resources.pipes, ...resources.connections];
13
+ }
14
+ /**
15
+ * Pull all resources from Tinybird and write them as datafiles
16
+ */
17
+ export async function runPull(options = {}) {
18
+ const startTime = Date.now();
19
+ const cwd = options.cwd ?? process.cwd();
20
+ const outputDir = path.resolve(cwd, options.outputDir ?? ".");
21
+ const overwrite = options.overwrite ?? false;
22
+ let config;
23
+ try {
24
+ config = await loadConfigAsync(cwd);
25
+ }
26
+ catch (error) {
27
+ return {
28
+ success: false,
29
+ error: error.message,
30
+ durationMs: Date.now() - startTime,
31
+ };
32
+ }
33
+ let pulled;
34
+ try {
35
+ pulled = await pullAllResourceFiles({
36
+ baseUrl: config.baseUrl,
37
+ token: config.token,
38
+ });
39
+ }
40
+ catch (error) {
41
+ return {
42
+ success: false,
43
+ error: `Pull failed: ${error.message}`,
44
+ durationMs: Date.now() - startTime,
45
+ };
46
+ }
47
+ const allFiles = flattenResources(pulled).sort((a, b) => a.filename.localeCompare(b.filename));
48
+ try {
49
+ await fs.mkdir(outputDir, { recursive: true });
50
+ const writtenFiles = [];
51
+ for (const file of allFiles) {
52
+ const absolutePath = path.join(outputDir, file.filename);
53
+ let existed = false;
54
+ try {
55
+ await fs.access(absolutePath);
56
+ existed = true;
57
+ }
58
+ catch {
59
+ existed = false;
60
+ }
61
+ await fs.writeFile(absolutePath, file.content, {
62
+ encoding: "utf-8",
63
+ flag: overwrite ? "w" : "wx",
64
+ });
65
+ writtenFiles.push({
66
+ name: file.name,
67
+ type: file.type,
68
+ filename: file.filename,
69
+ path: absolutePath,
70
+ relativePath: path.relative(cwd, absolutePath),
71
+ status: existed ? "overwritten" : "created",
72
+ });
73
+ }
74
+ return {
75
+ success: true,
76
+ outputDir,
77
+ files: writtenFiles,
78
+ stats: {
79
+ datasources: pulled.datasources.length,
80
+ pipes: pulled.pipes.length,
81
+ connections: pulled.connections.length,
82
+ total: writtenFiles.length,
83
+ },
84
+ durationMs: Date.now() - startTime,
85
+ };
86
+ }
87
+ catch (error) {
88
+ const err = error;
89
+ if (err.code === "EEXIST") {
90
+ return {
91
+ success: false,
92
+ error: `File already exists: ${err.path ?? "unknown"}. ` +
93
+ "Use --force to overwrite existing files.",
94
+ durationMs: Date.now() - startTime,
95
+ };
96
+ }
97
+ return {
98
+ success: false,
99
+ error: `Failed to write files: ${error.message}`,
100
+ durationMs: Date.now() - startTime,
101
+ };
102
+ }
103
+ }
104
+ //# sourceMappingURL=pull.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../../src/cli/commands/pull.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pull.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull.test.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/pull.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,140 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+ import * as fs from "node:fs/promises";
3
+ import * as os from "node:os";
4
+ import * as path from "node:path";
5
+ import { runPull } from "./pull.js";
6
+ vi.mock("../config.js", () => ({
7
+ loadConfigAsync: vi.fn(),
8
+ }));
9
+ vi.mock("../../api/resources.js", () => ({
10
+ pullAllResourceFiles: vi.fn(),
11
+ }));
12
+ import { loadConfigAsync } from "../config.js";
13
+ import { pullAllResourceFiles } from "../../api/resources.js";
14
+ const mockedLoadConfigAsync = vi.mocked(loadConfigAsync);
15
+ const mockedPullAllResourceFiles = vi.mocked(pullAllResourceFiles);
16
+ describe("Pull Command", () => {
17
+ let tempDir;
18
+ beforeEach(async () => {
19
+ vi.clearAllMocks();
20
+ tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "tinybird-pull-test-"));
21
+ mockedLoadConfigAsync.mockResolvedValue({
22
+ include: ["src/lib/tinybird.ts"],
23
+ token: "p.test-token",
24
+ baseUrl: "https://api.tinybird.co",
25
+ configPath: path.join(tempDir, "tinybird.config.json"),
26
+ cwd: tempDir,
27
+ gitBranch: "feature/pull",
28
+ tinybirdBranch: "feature_pull",
29
+ isMainBranch: false,
30
+ devMode: "branch",
31
+ });
32
+ });
33
+ afterEach(async () => {
34
+ await fs.rm(tempDir, { recursive: true, force: true });
35
+ vi.resetAllMocks();
36
+ });
37
+ it("writes pulled datasource, pipe, and connection files", async () => {
38
+ mockedPullAllResourceFiles.mockResolvedValue({
39
+ datasources: [
40
+ {
41
+ name: "events",
42
+ type: "datasource",
43
+ filename: "events.datasource",
44
+ content: "SCHEMA >\n timestamp DateTime",
45
+ },
46
+ ],
47
+ pipes: [
48
+ {
49
+ name: "top_events",
50
+ type: "pipe",
51
+ filename: "top_events.pipe",
52
+ content: "NODE endpoint\nSQL >\n SELECT 1",
53
+ },
54
+ ],
55
+ connections: [
56
+ {
57
+ name: "main_kafka",
58
+ type: "connection",
59
+ filename: "main_kafka.connection",
60
+ content: "TYPE kafka",
61
+ },
62
+ ],
63
+ });
64
+ const result = await runPull({ cwd: tempDir, outputDir: "pulled" });
65
+ expect(result.success).toBe(true);
66
+ expect(result.stats).toEqual({
67
+ datasources: 1,
68
+ pipes: 1,
69
+ connections: 1,
70
+ total: 3,
71
+ });
72
+ const outputPath = path.join(tempDir, "pulled");
73
+ await expect(fs.readFile(path.join(outputPath, "events.datasource"), "utf-8")).resolves.toContain("SCHEMA >");
74
+ await expect(fs.readFile(path.join(outputPath, "top_events.pipe"), "utf-8")).resolves.toContain("NODE endpoint");
75
+ await expect(fs.readFile(path.join(outputPath, "main_kafka.connection"), "utf-8")).resolves.toContain("TYPE kafka");
76
+ });
77
+ it("returns error when a file exists and overwrite is disabled", async () => {
78
+ mockedPullAllResourceFiles.mockResolvedValue({
79
+ datasources: [
80
+ {
81
+ name: "events",
82
+ type: "datasource",
83
+ filename: "events.datasource",
84
+ content: "SCHEMA >\n timestamp DateTime",
85
+ },
86
+ ],
87
+ pipes: [],
88
+ connections: [],
89
+ });
90
+ const outputPath = path.join(tempDir, "pulled");
91
+ await fs.mkdir(outputPath, { recursive: true });
92
+ await fs.writeFile(path.join(outputPath, "events.datasource"), "old", "utf-8");
93
+ const result = await runPull({
94
+ cwd: tempDir,
95
+ outputDir: "pulled",
96
+ overwrite: false,
97
+ });
98
+ expect(result.success).toBe(false);
99
+ expect(result.error).toContain("File already exists");
100
+ });
101
+ it("overwrites existing files when overwrite is enabled", async () => {
102
+ mockedPullAllResourceFiles.mockResolvedValue({
103
+ datasources: [
104
+ {
105
+ name: "events",
106
+ type: "datasource",
107
+ filename: "events.datasource",
108
+ content: "new-content",
109
+ },
110
+ ],
111
+ pipes: [],
112
+ connections: [],
113
+ });
114
+ const outputPath = path.join(tempDir, "pulled");
115
+ await fs.mkdir(outputPath, { recursive: true });
116
+ await fs.writeFile(path.join(outputPath, "events.datasource"), "old-content", "utf-8");
117
+ const result = await runPull({
118
+ cwd: tempDir,
119
+ outputDir: "pulled",
120
+ overwrite: true,
121
+ });
122
+ expect(result.success).toBe(true);
123
+ expect(result.files?.[0]?.status).toBe("overwritten");
124
+ await expect(fs.readFile(path.join(outputPath, "events.datasource"), "utf-8")).resolves.toBe("new-content");
125
+ });
126
+ it("returns error when config loading fails", async () => {
127
+ mockedLoadConfigAsync.mockRejectedValue(new Error("No config found"));
128
+ const result = await runPull({ cwd: tempDir });
129
+ expect(result.success).toBe(false);
130
+ expect(result.error).toContain("No config found");
131
+ });
132
+ it("returns error when pull API fails", async () => {
133
+ mockedPullAllResourceFiles.mockRejectedValue(new Error("Unauthorized"));
134
+ const result = await runPull({ cwd: tempDir });
135
+ expect(result.success).toBe(false);
136
+ expect(result.error).toContain("Pull failed");
137
+ expect(result.error).toContain("Unauthorized");
138
+ });
139
+ });
140
+ //# sourceMappingURL=pull.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull.test.js","sourceRoot":"","sources":["../../../src/cli/commands/pull.test.ts"],"names":[],"mappings":"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"}
@@ -39,6 +39,16 @@ export declare const LOCAL_BASE_URL = "http://localhost:7181";
39
39
  */
40
40
  declare const CONFIG_FILES: readonly ["tinybird.config.mjs", "tinybird.config.cjs", "tinybird.config.json", "tinybird.json"];
41
41
  type ConfigFileType = (typeof CONFIG_FILES)[number];
42
+ /**
43
+ * Load .env files from a directory.
44
+ *
45
+ * Priority:
46
+ * 1. .env.local
47
+ * 2. .env
48
+ *
49
+ * Existing process.env values are preserved (dotenv default behavior).
50
+ */
51
+ export declare function loadEnvFiles(directory: string): void;
42
52
  /**
43
53
  * Detect if project has a src folder
44
54
  */
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,6EAA6E;IAC7E,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,wBAAwB;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,oEAAoE;IACpE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,6EAA6E;IAC7E,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,8CAA8C;IAC9C,YAAY,EAAE,OAAO,CAAC;IACtB,4CAA4C;IAC5C,OAAO,EAAE,OAAO,CAAC;CAClB;AAOD;;GAEG;AACH,eAAO,MAAM,cAAc,0BAA0B,CAAC;AAEtD;;;;;;GAMG;AACH,QAAA,MAAM,YAAY,kGAKR,CAAC;AAEX,KAAK,cAAc,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAYpD;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGjD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjD;AAkBD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,IAAI,EAAE,cAAc,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAmBxE;AA2ED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,cAAc,CAoCtE;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,cAAc,CAAC,CAgB1F;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAEjE;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,CAG9E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,CAEjE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAQjF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAC1B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAC/B,IAAI,CAkBN;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAoClE"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,6EAA6E;IAC7E,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,wBAAwB;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,oEAAoE;IACpE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,6EAA6E;IAC7E,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,8CAA8C;IAC9C,YAAY,EAAE,OAAO,CAAC;IACtB,4CAA4C;IAC5C,OAAO,EAAE,OAAO,CAAC;CAClB;AAOD;;GAEG;AACH,eAAO,MAAM,cAAc,0BAA0B,CAAC;AAEtD;;;;;;GAMG;AACH,QAAA,MAAM,YAAY,kGAKR,CAAC;AAEX,KAAK,cAAc,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAYpD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAWpD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGjD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjD;AAkBD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,IAAI,EAAE,cAAc,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAmBxE;AA8ED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,cAAc,CAoCtE;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,cAAc,CAAC,CAgB1F;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAEjE;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,CAG9E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,CAEjE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAQjF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAC1B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAC/B,IAAI,CAkBN;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAoClE"}
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import * as fs from "fs";
5
5
  import * as path from "path";
6
+ import { config as loadDotenv } from "dotenv";
6
7
  import { getCurrentGitBranch, isMainBranch, getTinybirdBranchName } from "./git.js";
7
8
  /**
8
9
  * Default base URL (EU region)
@@ -33,6 +34,25 @@ const DEFAULT_CONFIG_FILE = "tinybird.config.json";
33
34
  * Tinybird file path within lib folder
34
35
  */
35
36
  const TINYBIRD_FILE = "lib/tinybird.ts";
37
+ /**
38
+ * Load .env files from a directory.
39
+ *
40
+ * Priority:
41
+ * 1. .env.local
42
+ * 2. .env
43
+ *
44
+ * Existing process.env values are preserved (dotenv default behavior).
45
+ */
46
+ export function loadEnvFiles(directory) {
47
+ const envLocalPath = path.join(directory, ".env.local");
48
+ const envPath = path.join(directory, ".env");
49
+ if (fs.existsSync(envLocalPath)) {
50
+ loadDotenv({ path: envLocalPath });
51
+ }
52
+ if (fs.existsSync(envPath)) {
53
+ loadDotenv({ path: envPath });
54
+ }
55
+ }
36
56
  /**
37
57
  * Detect if project has a src folder
38
58
  */
@@ -140,6 +160,8 @@ function resolveConfig(config, configPath) {
140
160
  }
141
161
  // Get the directory containing the config file
142
162
  const configDir = path.dirname(configPath);
163
+ // Load environment files next to the config before interpolating values.
164
+ loadEnvFiles(configDir);
143
165
  // Resolve token (may contain env vars)
144
166
  let resolvedToken;
145
167
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -17,10 +17,12 @@ import { runBuild } from "./commands/build.js";
17
17
  import { runDeploy } from "./commands/deploy.js";
18
18
  import { runPreview } from "./commands/preview.js";
19
19
  import { runDev } from "./commands/dev.js";
20
+ import { runMigrate } from "./commands/migrate.js";
20
21
  import { runLogin } from "./commands/login.js";
21
22
  import { runBranchList, runBranchStatus, runBranchDelete, } from "./commands/branch.js";
22
23
  import { runClear } from "./commands/clear.js";
23
24
  import { runInfo } from "./commands/info.js";
25
+ import { runPull } from "./commands/pull.js";
24
26
  import { runOpenDashboard, } from "./commands/open-dashboard.js";
25
27
  import { detectPackageManagerRunCmd } from "./utils/package-manager.js";
26
28
  import { output } from "./output.js";
@@ -148,6 +150,36 @@ function createCli() {
148
150
  });
149
151
  }
150
152
  });
153
+ // Pull command
154
+ program
155
+ .command("pull")
156
+ .description("Download datasources, pipes, and connections from Tinybird as datafiles")
157
+ .option("-o, --output-dir <path>", "Directory where pulled files are written", ".")
158
+ .option("-f, --force", "Overwrite existing files")
159
+ .action(async (options) => {
160
+ output.highlight("Pulling resources from Tinybird...");
161
+ const result = await runPull({
162
+ outputDir: options.outputDir,
163
+ overwrite: options.force,
164
+ });
165
+ if (!result.success) {
166
+ output.error(result.error ?? "Pull failed");
167
+ process.exit(1);
168
+ }
169
+ const files = result.files ?? [];
170
+ const stats = result.stats ?? {
171
+ datasources: 0,
172
+ pipes: 0,
173
+ connections: 0,
174
+ total: files.length,
175
+ };
176
+ for (const file of files) {
177
+ const status = file.status === "created" ? "created" : "changed";
178
+ output.showResourceChange(file.relativePath, status);
179
+ }
180
+ output.success(`\nPulled ${stats.total} file(s): ${stats.datasources} datasource(s), ${stats.pipes} pipe(s), ${stats.connections} connection(s)`);
181
+ output.success(`Completed in ${output.formatDuration(result.durationMs)}`);
182
+ });
151
183
  // Open command
152
184
  program
153
185
  .command("open")
@@ -265,6 +297,51 @@ function createCli() {
265
297
  }
266
298
  }
267
299
  });
300
+ // Migrate command
301
+ program
302
+ .command("migrate")
303
+ .description("Migrate .datasource/.pipe/.connection files into TypeScript definitions")
304
+ .argument("<patterns...>", "One or more file paths, directories, or glob patterns")
305
+ .option("-o, --out <path>", "Output TypeScript path (default: ./tinybird.migration.ts)")
306
+ .option("--dry-run", "Preview migration without writing files")
307
+ .option("--force", "Overwrite output file if it already exists")
308
+ .option("--no-strict", "Do not fail command when some resources cannot be migrated")
309
+ .action(async (patterns, options) => {
310
+ const result = await runMigrate({
311
+ patterns,
312
+ out: options.out,
313
+ strict: options.strict,
314
+ dryRun: options.dryRun,
315
+ force: options.force,
316
+ });
317
+ const migratedCounts = {
318
+ datasources: result.migrated.filter((resource) => resource.kind === "datasource")
319
+ .length,
320
+ pipes: result.migrated.filter((resource) => resource.kind === "pipe").length,
321
+ connections: result.migrated.filter((resource) => resource.kind === "connection").length,
322
+ };
323
+ console.log(`Migrated: ${migratedCounts.datasources} datasource(s), ${migratedCounts.pipes} pipe(s), ${migratedCounts.connections} connection(s)`);
324
+ if (result.migrated.length > 0) {
325
+ if (result.dryRun) {
326
+ console.log(`[Dry run] Output would be written to: ${result.outputPath}`);
327
+ }
328
+ else {
329
+ console.log(`Output written to: ${result.outputPath}`);
330
+ }
331
+ }
332
+ else {
333
+ console.log("No resources were migrated.");
334
+ }
335
+ if (result.errors.length > 0) {
336
+ console.log("\nErrors:");
337
+ for (const error of result.errors) {
338
+ console.log(`- ${error.filePath} (${error.resourceKind}:${error.resourceName}): ${error.message}`);
339
+ }
340
+ }
341
+ if (!result.success) {
342
+ process.exit(1);
343
+ }
344
+ });
268
345
  // Deploy command
269
346
  program
270
347
  .command("deploy")