@codemarc/blt 1.6.5 → 1.8.0
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 +192 -0
- package/dist/blt +4 -0
- package/dist/blt.d.ts.map +1 -1
- package/dist/blt.js.map +1 -1
- package/dist/commands/data/apply.d.ts +6 -0
- package/dist/commands/data/apply.d.ts.map +1 -0
- package/dist/commands/data/apply.js +363 -0
- package/dist/commands/data/apply.js.map +1 -0
- package/dist/commands/data/helpers.d.ts +15 -0
- package/dist/commands/data/helpers.d.ts.map +1 -0
- package/dist/commands/data/helpers.js +53 -0
- package/dist/commands/data/helpers.js.map +1 -0
- package/dist/commands/data/pull.d.ts +11 -0
- package/dist/commands/data/pull.d.ts.map +1 -0
- package/dist/commands/data/pull.js +101 -0
- package/dist/commands/data/pull.js.map +1 -0
- package/dist/commands/data/remove.d.ts +7 -0
- package/dist/commands/data/remove.d.ts.map +1 -0
- package/dist/commands/data/remove.js +29 -0
- package/dist/commands/data/remove.js.map +1 -0
- package/dist/commands/data.d.ts +3 -0
- package/dist/commands/data.d.ts.map +1 -0
- package/dist/commands/data.js +115 -0
- package/dist/commands/data.js.map +1 -0
- package/dist/commands/spin/dns.d.ts +7 -0
- package/dist/commands/spin/dns.d.ts.map +1 -0
- package/dist/commands/spin/dns.js +42 -0
- package/dist/commands/spin/dns.js.map +1 -0
- package/dist/commands/spin/down.d.ts +3 -0
- package/dist/commands/spin/down.d.ts.map +1 -0
- package/dist/commands/spin/down.js +17 -0
- package/dist/commands/spin/down.js.map +1 -0
- package/dist/commands/spin/helpers.d.ts +7 -0
- package/dist/commands/spin/helpers.d.ts.map +1 -0
- package/dist/commands/spin/helpers.js +38 -0
- package/dist/commands/spin/helpers.js.map +1 -0
- package/dist/commands/spin/list.d.ts +3 -0
- package/dist/commands/spin/list.d.ts.map +1 -0
- package/dist/commands/spin/list.js +20 -0
- package/dist/commands/spin/list.js.map +1 -0
- package/dist/commands/spin/setup.d.ts +3 -0
- package/dist/commands/spin/setup.d.ts.map +1 -0
- package/dist/commands/spin/setup.js +32 -0
- package/dist/commands/spin/setup.js.map +1 -0
- package/dist/commands/spin/ssh.d.ts +3 -0
- package/dist/commands/spin/ssh.d.ts.map +1 -0
- package/dist/commands/spin/ssh.js +14 -0
- package/dist/commands/spin/ssh.js.map +1 -0
- package/dist/commands/spin/status.d.ts +3 -0
- package/dist/commands/spin/status.d.ts.map +1 -0
- package/dist/commands/spin/status.js +21 -0
- package/dist/commands/spin/status.js.map +1 -0
- package/dist/commands/spin/up.d.ts +11 -0
- package/dist/commands/spin/up.d.ts.map +1 -0
- package/dist/commands/spin/up.js +34 -0
- package/dist/commands/spin/up.js.map +1 -0
- package/dist/commands/spin.d.ts +3 -0
- package/dist/commands/spin.d.ts.map +1 -0
- package/dist/commands/spin.js +166 -0
- package/dist/commands/spin.js.map +1 -0
- package/dist/lib/data-pull-extra-tables.d.ts +26 -0
- package/dist/lib/data-pull-extra-tables.d.ts.map +1 -0
- package/dist/lib/data-pull-extra-tables.js +212 -0
- package/dist/lib/data-pull-extra-tables.js.map +1 -0
- package/dist/lib/data-pull-manifest.d.ts +97 -0
- package/dist/lib/data-pull-manifest.d.ts.map +1 -0
- package/dist/lib/data-pull-manifest.js +603 -0
- package/dist/lib/data-pull-manifest.js.map +1 -0
- package/dist/lib/database-runner.d.ts +28 -2
- package/dist/lib/database-runner.d.ts.map +1 -1
- package/dist/lib/database-runner.js +112 -49
- package/dist/lib/database-runner.js.map +1 -1
- package/dist/lib/digitalocean.d.ts +60 -0
- package/dist/lib/digitalocean.d.ts.map +1 -0
- package/dist/lib/digitalocean.js +108 -0
- package/dist/lib/digitalocean.js.map +1 -0
- package/dist/lib/yaml-converter.d.ts +25 -1
- package/dist/lib/yaml-converter.d.ts.map +1 -1
- package/dist/lib/yaml-converter.js +98 -15
- package/dist/lib/yaml-converter.js.map +1 -1
- package/package.json +2 -1
|
@@ -42,66 +42,46 @@ export function getLatestSqlFile() {
|
|
|
42
42
|
}
|
|
43
43
|
return sqlFiles[0];
|
|
44
44
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
let targetFile;
|
|
50
|
-
let sqlContent;
|
|
51
|
-
if (filePath) {
|
|
52
|
-
// Use specified file
|
|
53
|
-
const fileName = filePath.split("/").pop() || filePath;
|
|
54
|
-
sqlContent = readFileSync(filePath, "utf8");
|
|
55
|
-
targetFile = {
|
|
56
|
-
name: fileName,
|
|
57
|
-
version: "unknown",
|
|
58
|
-
path: filePath,
|
|
59
|
-
};
|
|
60
|
-
console.log(`\n🚀 Running SQL file: ${fileName}`);
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
// Use latest file (backward compatibility)
|
|
64
|
-
targetFile = getLatestSqlFile();
|
|
65
|
-
sqlContent = readFileSync(targetFile.path, "utf8");
|
|
66
|
-
console.log(`\n🚀 Running latest SQL file: ${targetFile.name} (v${targetFile.version})`);
|
|
67
|
-
}
|
|
68
|
-
// Read database connection from environment variables
|
|
69
|
-
const connectionString = process.env.SUPABASE_CONNECTION_STRING;
|
|
45
|
+
function resolveExecConnection(connectionOverride) {
|
|
46
|
+
const connectionString = connectionOverride ||
|
|
47
|
+
process.env.BLT_DATA_LOAD_URL ||
|
|
48
|
+
process.env.SUPABASE_CONNECTION_STRING;
|
|
70
49
|
if (!connectionString) {
|
|
71
|
-
console.error(
|
|
72
|
-
console.error("
|
|
73
|
-
console.error("\nExample:");
|
|
74
|
-
console.error(' export SUPABASE_CONNECTION_STRING="postgresql://user:password@localhost:5432/dbname"');
|
|
50
|
+
console.error("\n❌ Error: No database connection string found.");
|
|
51
|
+
console.error("Set BLT_DATA_LOAD_URL (dev target) or SUPABASE_CONNECTION_STRING.");
|
|
75
52
|
process.exit(1);
|
|
76
53
|
}
|
|
77
|
-
|
|
54
|
+
return connectionString;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Execute ad-hoc SQL (e.g. snapshot apply bundle).
|
|
58
|
+
*/
|
|
59
|
+
export async function runSqlContent(sqlContent, meta, connectionOverride) {
|
|
60
|
+
const connectionString = resolveExecConnection(connectionOverride);
|
|
78
61
|
const client = new pg.Client({ connectionString });
|
|
79
62
|
try {
|
|
63
|
+
console.log(`\n🚀 Running SQL: ${meta.name}`);
|
|
80
64
|
console.log("📡 Connecting to database...");
|
|
81
65
|
await client.connect();
|
|
82
66
|
console.log("✅ Connected successfully");
|
|
83
67
|
console.log("\n⏳ Executing SQL script...");
|
|
84
68
|
console.log(" This may take a few moments...\n");
|
|
85
|
-
// Execute the SQL
|
|
86
69
|
await client.query(sqlContent);
|
|
87
70
|
console.log("✅ SQL script executed successfully!");
|
|
88
|
-
if (
|
|
89
|
-
console.log(`\n📊 Database updated with schema v${
|
|
71
|
+
if (meta.version !== "unknown") {
|
|
72
|
+
console.log(`\n📊 Database updated with schema v${meta.version}`);
|
|
90
73
|
}
|
|
91
74
|
}
|
|
92
75
|
catch (error) {
|
|
93
76
|
console.error("\n❌ Error executing SQL:");
|
|
94
77
|
console.error("━".repeat(60));
|
|
95
|
-
// Show the main error message
|
|
96
78
|
console.error(`\n${error.message}`);
|
|
97
|
-
// Show line number if available
|
|
98
79
|
if (error.position) {
|
|
99
80
|
const lines = sqlContent.substring(0, error.position).split("\n");
|
|
100
81
|
const lineNumber = lines.length;
|
|
101
82
|
const columnNumber = lines[lines.length - 1].length + 1;
|
|
102
83
|
console.error(`\n📍 Location: Line ${lineNumber}, Column ${columnNumber}`);
|
|
103
84
|
console.error(` Position: ${error.position} characters into file`);
|
|
104
|
-
// Show context around the error (3 lines before and after)
|
|
105
85
|
const allLines = sqlContent.split("\n");
|
|
106
86
|
const startLine = Math.max(0, lineNumber - 4);
|
|
107
87
|
const endLine = Math.min(allLines.length, lineNumber + 2);
|
|
@@ -114,7 +94,6 @@ export async function runSqlFile(filePath) {
|
|
|
114
94
|
}
|
|
115
95
|
console.error("━".repeat(60));
|
|
116
96
|
}
|
|
117
|
-
// Show additional PostgreSQL error details
|
|
118
97
|
if (error.detail) {
|
|
119
98
|
console.error(`\n📝 Detail: ${error.detail}`);
|
|
120
99
|
}
|
|
@@ -127,10 +106,9 @@ export async function runSqlFile(filePath) {
|
|
|
127
106
|
if (error.code) {
|
|
128
107
|
console.error(`\n🏷️ SQL Error Code: ${error.code}`);
|
|
129
108
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
console.error(` Version: ${targetFile.version}`);
|
|
109
|
+
console.error(`\n📂 Source: ${meta.path}`);
|
|
110
|
+
if (meta.version !== "unknown") {
|
|
111
|
+
console.error(` Version: ${meta.version}`);
|
|
134
112
|
}
|
|
135
113
|
console.error("\n" + "━".repeat(60));
|
|
136
114
|
process.exit(1);
|
|
@@ -141,19 +119,104 @@ export async function runSqlFile(filePath) {
|
|
|
141
119
|
}
|
|
142
120
|
}
|
|
143
121
|
/**
|
|
144
|
-
* Execute a SQL
|
|
122
|
+
* Execute a SQL file against the database.
|
|
123
|
+
* Uses BLT_DATA_LOAD_URL when set (dev snapshot apply), otherwise SUPABASE_CONNECTION_STRING.
|
|
145
124
|
*/
|
|
146
|
-
export async function
|
|
147
|
-
|
|
125
|
+
export async function runSqlFile(filePath, connectionOverride) {
|
|
126
|
+
let targetFile;
|
|
127
|
+
let sqlContent;
|
|
128
|
+
if (filePath) {
|
|
129
|
+
const fileName = filePath.split("/").pop() || filePath;
|
|
130
|
+
sqlContent = readFileSync(filePath, "utf8");
|
|
131
|
+
targetFile = {
|
|
132
|
+
name: fileName,
|
|
133
|
+
version: "unknown",
|
|
134
|
+
path: filePath,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
targetFile = getLatestSqlFile();
|
|
139
|
+
sqlContent = readFileSync(targetFile.path, "utf8");
|
|
140
|
+
}
|
|
141
|
+
await runSqlContent(sqlContent, {
|
|
142
|
+
name: targetFile.name,
|
|
143
|
+
path: targetFile.path,
|
|
144
|
+
version: targetFile.version,
|
|
145
|
+
}, connectionOverride);
|
|
146
|
+
}
|
|
147
|
+
const MISSING_SUPABASE_CONN = "Please set SUPABASE_CONNECTION_STRING environment variable.";
|
|
148
|
+
/** Connection string used by `blt data pull` (read-only replica or safe read URL). */
|
|
149
|
+
const ENV_PULL_URL = "BLT_DATA_PULL_URL";
|
|
150
|
+
/** Connection string used by `blt data apply` (dev target); falls back to SUPABASE_CONNECTION_STRING. */
|
|
151
|
+
const ENV_LOAD_URL = "BLT_DATA_LOAD_URL";
|
|
152
|
+
export function requireConnectionString(envHint) {
|
|
148
153
|
const connectionString = process.env.SUPABASE_CONNECTION_STRING;
|
|
149
154
|
if (!connectionString) {
|
|
150
|
-
console.error(
|
|
151
|
-
console.error(
|
|
152
|
-
console.error(
|
|
153
|
-
console.error('
|
|
155
|
+
console.error("\n❌ Error: No database connection string found.");
|
|
156
|
+
console.error(MISSING_SUPABASE_CONN);
|
|
157
|
+
console.error(envHint ? `\n${envHint}` : "");
|
|
158
|
+
console.error('\nExample: export SUPABASE_CONNECTION_STRING="postgresql://..."');
|
|
159
|
+
process.exit(1);
|
|
160
|
+
}
|
|
161
|
+
return connectionString;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Postgres URL used for snapshot pulls (`blt data pull`).
|
|
165
|
+
* Prefer a read replica or READ ONLY role—not a production superuser.
|
|
166
|
+
*/
|
|
167
|
+
export function getPullConnectionString() {
|
|
168
|
+
const connectionString = process.env[ENV_PULL_URL] || process.env.SUPABASE_CONNECTION_STRING;
|
|
169
|
+
if (!connectionString) {
|
|
170
|
+
console.error(`\n❌ Error: No pull database URL found.`);
|
|
171
|
+
console.error(`Set ${ENV_PULL_URL} (recommended) or SUPABASE_CONNECTION_STRING for read-only pulls.`);
|
|
154
172
|
process.exit(1);
|
|
155
173
|
}
|
|
156
|
-
|
|
174
|
+
return connectionString;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Postgres URL used to apply snapshots (`blt data apply`).
|
|
178
|
+
* Defaults to SUPABASE_CONNECTION_STRING if BLT_DATA_LOAD_URL is unset.
|
|
179
|
+
*/
|
|
180
|
+
export function getLoadConnectionString() {
|
|
181
|
+
return (process.env[ENV_LOAD_URL] ||
|
|
182
|
+
process.env.SUPABASE_CONNECTION_STRING ||
|
|
183
|
+
(() => {
|
|
184
|
+
console.error(`\n❌ Error: No load database URL found.`);
|
|
185
|
+
console.error(`Set ${ENV_LOAD_URL} or SUPABASE_CONNECTION_STRING for apply.`);
|
|
186
|
+
process.exit(1);
|
|
187
|
+
return ""; // unreachable
|
|
188
|
+
})());
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Run queries inside BEGIN READ ONLY / COMMIT. No DML.
|
|
192
|
+
*/
|
|
193
|
+
export async function withReadOnlyClient(connectionString, run) {
|
|
194
|
+
const client = new pg.Client({ connectionString });
|
|
195
|
+
await client.connect();
|
|
196
|
+
try {
|
|
197
|
+
await client.query("BEGIN READ ONLY");
|
|
198
|
+
const out = await run(client);
|
|
199
|
+
await client.query("COMMIT");
|
|
200
|
+
return out;
|
|
201
|
+
}
|
|
202
|
+
catch (e) {
|
|
203
|
+
try {
|
|
204
|
+
await client.query("ROLLBACK");
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
// ignore rollback errors
|
|
208
|
+
}
|
|
209
|
+
throw e;
|
|
210
|
+
}
|
|
211
|
+
finally {
|
|
212
|
+
await client.end();
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Execute a SQL query and return results
|
|
217
|
+
*/
|
|
218
|
+
export async function executeQuery(query) {
|
|
219
|
+
const connectionString = requireConnectionString("");
|
|
157
220
|
const client = new pg.Client({ connectionString });
|
|
158
221
|
try {
|
|
159
222
|
await client.connect();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database-runner.js","sourceRoot":"","sources":["../../src/lib/database-runner.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAE/B,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAgB,MAAM,aAAa,CAAC;AAE/D;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC/B,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAEjD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,kCAAkC,QAAQ,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;SACpC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SACvE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACb,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC;QAC/B,OAAO;YACN,IAAI,EAAE,IAAI;YACV,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;YACxB,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC;SAC1B,CAAC;IACH,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAgB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;SACvC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACd,+CAA+C;QAC/C,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAElE,IAAI,MAAM,KAAK,MAAM;YAAE,OAAO,MAAM,GAAG,MAAM,CAAC;QAC9C,IAAI,MAAM,KAAK,MAAM;YAAE,OAAO,MAAM,GAAG,MAAM,CAAC;QAC9C,OAAO,MAAM,GAAG,MAAM,CAAC;IACxB,CAAC,CAAC,CAAC;IAEJ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"database-runner.js","sourceRoot":"","sources":["../../src/lib/database-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export interface Droplet {
|
|
2
|
+
id: number;
|
|
3
|
+
name: string;
|
|
4
|
+
status: string;
|
|
5
|
+
memory: number;
|
|
6
|
+
vcpus: number;
|
|
7
|
+
disk: number;
|
|
8
|
+
region: {
|
|
9
|
+
slug: string;
|
|
10
|
+
name: string;
|
|
11
|
+
};
|
|
12
|
+
image: {
|
|
13
|
+
slug: string;
|
|
14
|
+
name: string;
|
|
15
|
+
};
|
|
16
|
+
size_slug: string;
|
|
17
|
+
networks: {
|
|
18
|
+
v4: Array<{
|
|
19
|
+
ip_address: string;
|
|
20
|
+
type: string;
|
|
21
|
+
}>;
|
|
22
|
+
v6: Array<{
|
|
23
|
+
ip_address: string;
|
|
24
|
+
type: string;
|
|
25
|
+
}>;
|
|
26
|
+
};
|
|
27
|
+
tags: string[];
|
|
28
|
+
created_at: string;
|
|
29
|
+
}
|
|
30
|
+
export interface DnsRecord {
|
|
31
|
+
id: number;
|
|
32
|
+
type: string;
|
|
33
|
+
name: string;
|
|
34
|
+
data: string;
|
|
35
|
+
ttl: number;
|
|
36
|
+
}
|
|
37
|
+
export interface SshKey {
|
|
38
|
+
id: number;
|
|
39
|
+
name: string;
|
|
40
|
+
fingerprint: string;
|
|
41
|
+
public_key: string;
|
|
42
|
+
}
|
|
43
|
+
export interface CreateDropletOptions {
|
|
44
|
+
name: string;
|
|
45
|
+
size: string;
|
|
46
|
+
region: string;
|
|
47
|
+
image: string;
|
|
48
|
+
sshKeys?: string[];
|
|
49
|
+
tags?: string[];
|
|
50
|
+
userData?: string;
|
|
51
|
+
}
|
|
52
|
+
export declare function createDroplet(opts: CreateDropletOptions): Promise<Droplet>;
|
|
53
|
+
export declare function deleteDroplet(id: number): Promise<void>;
|
|
54
|
+
export declare function listDroplets(tag?: string): Promise<Droplet[]>;
|
|
55
|
+
export declare function getDroplet(idOrName: string): Promise<Droplet>;
|
|
56
|
+
export declare function listSshKeys(): Promise<SshKey[]>;
|
|
57
|
+
export declare function createDnsRecord(domain: string, type: string, name: string, data: string, ttl?: number): Promise<DnsRecord>;
|
|
58
|
+
export declare function listDnsRecords(domain: string): Promise<DnsRecord[]>;
|
|
59
|
+
export declare function deleteDnsRecord(domain: string, recordId: number): Promise<void>;
|
|
60
|
+
//# sourceMappingURL=digitalocean.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digitalocean.d.ts","sourceRoot":"","sources":["../../src/lib/digitalocean.ts"],"names":[],"mappings":"AAiEA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE;QACR,EAAE,EAAE,KAAK,CAAC;YAAE,UAAU,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAChD,EAAE,EAAE,KAAK,CAAC;YAAE,UAAU,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACjD,CAAC;IACF,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAMD,wBAAsB,aAAa,CACjC,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,OAAO,CAAC,CAclB;AAED,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7D;AAED,wBAAsB,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAMnE;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAcnE;AAMD,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAGrD;AAMD,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,GAAG,SAAM,GACR,OAAO,CAAC,SAAS,CAAC,CASpB;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAKzE;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAKf"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// DigitalOcean API helper — pure API layer, no CLI wiring
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
const DO_API = "https://api.digitalocean.com/v2";
|
|
6
|
+
function readDoctlToken() {
|
|
7
|
+
const configPath = process.platform === "darwin"
|
|
8
|
+
? join(homedir(), "Library", "Application Support", "doctl", "config.yaml")
|
|
9
|
+
: join(homedir(), ".config", "doctl", "config.yaml");
|
|
10
|
+
try {
|
|
11
|
+
const content = readFileSync(configPath, "utf-8");
|
|
12
|
+
const match = content.match(/^access-token:\s*(.+)$/m);
|
|
13
|
+
return match?.[1]?.trim() || undefined;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function getToken() {
|
|
20
|
+
const token = process.env.DIGITALOCEAN_ACCESS_TOKEN ??
|
|
21
|
+
process.env.DIGITALOCEAN_TOKEN ??
|
|
22
|
+
readDoctlToken();
|
|
23
|
+
if (!token) {
|
|
24
|
+
throw new Error("DigitalOcean token not found. Either run 'doctl auth init' or set " +
|
|
25
|
+
"DIGITALOCEAN_ACCESS_TOKEN / DIGITALOCEAN_TOKEN.");
|
|
26
|
+
}
|
|
27
|
+
return token;
|
|
28
|
+
}
|
|
29
|
+
async function doFetch(path, options) {
|
|
30
|
+
const res = await fetch(`${DO_API}${path}`, {
|
|
31
|
+
...options,
|
|
32
|
+
headers: {
|
|
33
|
+
"Content-Type": "application/json",
|
|
34
|
+
Authorization: `Bearer ${getToken()}`,
|
|
35
|
+
...options?.headers,
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
if (res.status === 204)
|
|
39
|
+
return undefined;
|
|
40
|
+
const body = await res.text();
|
|
41
|
+
if (!res.ok) {
|
|
42
|
+
throw new Error(`DigitalOcean API ${res.status} ${res.statusText}: ${body}`);
|
|
43
|
+
}
|
|
44
|
+
return body ? JSON.parse(body) : undefined;
|
|
45
|
+
}
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
// Droplet operations
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
export async function createDroplet(opts) {
|
|
50
|
+
const { droplet } = await doFetch("/droplets", {
|
|
51
|
+
method: "POST",
|
|
52
|
+
body: JSON.stringify({
|
|
53
|
+
name: opts.name,
|
|
54
|
+
region: opts.region,
|
|
55
|
+
size: opts.size,
|
|
56
|
+
image: opts.image,
|
|
57
|
+
ssh_keys: opts.sshKeys ?? [],
|
|
58
|
+
tags: opts.tags ?? [],
|
|
59
|
+
...(opts.userData ? { user_data: opts.userData } : {}),
|
|
60
|
+
}),
|
|
61
|
+
});
|
|
62
|
+
return droplet;
|
|
63
|
+
}
|
|
64
|
+
export async function deleteDroplet(id) {
|
|
65
|
+
await doFetch(`/droplets/${id}`, { method: "DELETE" });
|
|
66
|
+
}
|
|
67
|
+
export async function listDroplets(tag) {
|
|
68
|
+
const query = tag ? `?tag_name=${encodeURIComponent(tag)}` : "";
|
|
69
|
+
const { droplets } = await doFetch(`/droplets${query}`);
|
|
70
|
+
return droplets;
|
|
71
|
+
}
|
|
72
|
+
export async function getDroplet(idOrName) {
|
|
73
|
+
if (/^\d+$/.test(idOrName)) {
|
|
74
|
+
const { droplet } = await doFetch(`/droplets/${idOrName}`);
|
|
75
|
+
return droplet;
|
|
76
|
+
}
|
|
77
|
+
const all = await listDroplets();
|
|
78
|
+
const match = all.find((d) => d.name === idOrName);
|
|
79
|
+
if (!match) {
|
|
80
|
+
throw new Error(`Droplet not found: ${idOrName}`);
|
|
81
|
+
}
|
|
82
|
+
return match;
|
|
83
|
+
}
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
// SSH key operations
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
export async function listSshKeys() {
|
|
88
|
+
const { ssh_keys } = await doFetch("/account/keys");
|
|
89
|
+
return ssh_keys;
|
|
90
|
+
}
|
|
91
|
+
// ---------------------------------------------------------------------------
|
|
92
|
+
// DNS operations
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
export async function createDnsRecord(domain, type, name, data, ttl = 300) {
|
|
95
|
+
const { domain_record } = await doFetch(`/domains/${encodeURIComponent(domain)}/records`, {
|
|
96
|
+
method: "POST",
|
|
97
|
+
body: JSON.stringify({ type, name, data, ttl }),
|
|
98
|
+
});
|
|
99
|
+
return domain_record;
|
|
100
|
+
}
|
|
101
|
+
export async function listDnsRecords(domain) {
|
|
102
|
+
const { domain_records } = await doFetch(`/domains/${encodeURIComponent(domain)}/records`);
|
|
103
|
+
return domain_records;
|
|
104
|
+
}
|
|
105
|
+
export async function deleteDnsRecord(domain, recordId) {
|
|
106
|
+
await doFetch(`/domains/${encodeURIComponent(domain)}/records/${recordId}`, { method: "DELETE" });
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=digitalocean.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digitalocean.js","sourceRoot":"","sources":["../../src/lib/digitalocean.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,21 @@
|
|
|
1
1
|
import type { YamlFile } from "./constants";
|
|
2
|
+
/**
|
|
3
|
+
* Recursively substitute environment variables in all string values.
|
|
4
|
+
*
|
|
5
|
+
* `${UUID}` (and `{UUID}` / `$UUID`) is special: each placeholder is replaced
|
|
6
|
+
* with a newly generated UUID, not `process.env.UUID`.
|
|
7
|
+
*
|
|
8
|
+
* NOTE: If you see `${SUPABASE_URL}` (or any other `${VAR}`) in your *output*,
|
|
9
|
+
* instead of the actual env value, it means `process.env.VAR` was undefined
|
|
10
|
+
* at the time this function ran. This likely means the environment variable
|
|
11
|
+
* wasn't loaded, set, or visible to the Bun/Node.js process at runtime.
|
|
12
|
+
*
|
|
13
|
+
* Bun automatically loads from .env, but if you're running this with Node.js,
|
|
14
|
+
* you need to ensure dotenv is loaded, or the env values are set in the OS.
|
|
15
|
+
*
|
|
16
|
+
* If you want to debug, try logging `process.env` or check how you run Bun/Node.
|
|
17
|
+
*/
|
|
18
|
+
export declare function processEnvVars(value: unknown): unknown;
|
|
2
19
|
/**
|
|
3
20
|
* Convert YAML content to JSON array format.
|
|
4
21
|
*/
|
|
@@ -8,7 +25,14 @@ export declare function yamlToJson(yamlContent: string): Record<string, unknown>
|
|
|
8
25
|
*/
|
|
9
26
|
export declare function jsonToSql(rows: {
|
|
10
27
|
row: Record<string, unknown>;
|
|
11
|
-
}[], name: string, type?: "function" | "procedure" | "table"
|
|
28
|
+
}[], name: string, type?: "function" | "procedure" | "table", options?: {
|
|
29
|
+
conflictColumns?: string[];
|
|
30
|
+
excludeFromConflictUpdate?: string[];
|
|
31
|
+
conflictWhere?: string;
|
|
32
|
+
columnUdts?: Record<string, string>;
|
|
33
|
+
/** When true, append `OVERRIDING SYSTEM VALUE` for GENERATED ALWAYS identity columns in the row map. */
|
|
34
|
+
overridingSystemValue?: boolean;
|
|
35
|
+
}): string;
|
|
12
36
|
/**
|
|
13
37
|
* Convert YAML content to SQL statements.
|
|
14
38
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yaml-converter.d.ts","sourceRoot":"","sources":["../../src/lib/yaml-converter.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"yaml-converter.d.ts","sourceRoot":"","sources":["../../src/lib/yaml-converter.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA2B5C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAStD;AA+TD;;GAEG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAEzE;AAED;;GAEG;AACH,wBAAgB,SAAS,CACxB,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,EAAE,EACxC,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,UAAU,GAAG,WAAW,GAAG,OAAiB,EAClD,OAAO,CAAC,EAAE;IACT,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,yBAAyB,CAAC,EAAE,MAAM,EAAE,CAAC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,wGAAwG;IACxG,qBAAqB,CAAC,EAAE,OAAO,CAAC;CAChC,GACC,MAAM,CAmBR;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,UAAU,GAAG,WAAW,GAAG,OAAiB,GACjD,MAAM,CAMR;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE,CAqBxD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAyBvD"}
|