alchemy 2.0.0-beta.20 → 2.0.0-beta.22
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/bin/alchemy.js +1 -1
- package/bin/alchemy.js.map +1 -1
- package/bin/commands/bootstrap.ts +59 -57
- package/bin/commands/deploy.ts +8 -2
- package/bin/commands/login.ts +56 -49
- package/bin/commands/logs.ts +92 -90
- package/bin/commands/profile.ts +74 -70
- package/bin/commands/state.ts +160 -135
- package/bin/commands/tail.ts +94 -92
- package/lib/AWS/CloudFront/CachePolicy.d.ts.map +1 -1
- package/lib/AWS/CloudFront/CachePolicy.js.map +1 -1
- package/lib/AWS/CloudFront/KeyGroup.d.ts.map +1 -1
- package/lib/AWS/CloudFront/KeyGroup.js.map +1 -1
- package/lib/AWS/CloudFront/OriginRequestPolicy.d.ts.map +1 -1
- package/lib/AWS/CloudFront/OriginRequestPolicy.js +3 -1
- package/lib/AWS/CloudFront/OriginRequestPolicy.js.map +1 -1
- package/lib/AWS/CloudFront/PublicKey.d.ts.map +1 -1
- package/lib/AWS/CloudFront/PublicKey.js.map +1 -1
- package/lib/AWS/ECS/CapacityProvider.d.ts.map +1 -1
- package/lib/AWS/ECS/CapacityProvider.js +5 -4
- package/lib/AWS/ECS/CapacityProvider.js.map +1 -1
- package/lib/Axiom/Annotation.d.ts +3 -3
- package/lib/Axiom/Annotation.d.ts.map +1 -1
- package/lib/Axiom/Annotation.js +5 -5
- package/lib/Axiom/Annotation.js.map +1 -1
- package/lib/Axiom/ApiToken.d.ts +3 -3
- package/lib/Axiom/ApiToken.d.ts.map +1 -1
- package/lib/Axiom/ApiToken.js +4 -4
- package/lib/Axiom/ApiToken.js.map +1 -1
- package/lib/Axiom/AuthProvider.js.map +1 -1
- package/lib/Axiom/Credentials.d.ts +1 -1
- package/lib/Axiom/Credentials.d.ts.map +1 -1
- package/lib/Axiom/Credentials.js +2 -3
- package/lib/Axiom/Credentials.js.map +1 -1
- package/lib/Axiom/Dashboard.d.ts +4 -4
- package/lib/Axiom/Dashboard.d.ts.map +1 -1
- package/lib/Axiom/Dashboard.js +5 -5
- package/lib/Axiom/Dashboard.js.map +1 -1
- package/lib/Axiom/Dataset.d.ts.map +1 -1
- package/lib/Axiom/Dataset.js +5 -5
- package/lib/Axiom/Dataset.js.map +1 -1
- package/lib/Axiom/Monitor.d.ts +3 -3
- package/lib/Axiom/Monitor.d.ts.map +1 -1
- package/lib/Axiom/Monitor.js +6 -6
- package/lib/Axiom/Monitor.js.map +1 -1
- package/lib/Axiom/Notifier.d.ts +3 -3
- package/lib/Axiom/Notifier.d.ts.map +1 -1
- package/lib/Axiom/Notifier.js +9 -6
- package/lib/Axiom/Notifier.js.map +1 -1
- package/lib/Axiom/View.d.ts +3 -3
- package/lib/Axiom/View.d.ts.map +1 -1
- package/lib/Axiom/View.js +5 -5
- package/lib/Axiom/View.js.map +1 -1
- package/lib/Axiom/VirtualField.d.ts +3 -3
- package/lib/Axiom/VirtualField.d.ts.map +1 -1
- package/lib/Axiom/VirtualField.js +5 -5
- package/lib/Axiom/VirtualField.js.map +1 -1
- package/lib/Bundle/PurePlugin.d.ts.map +1 -1
- package/lib/Bundle/PurePlugin.js +4 -4
- package/lib/Bundle/PurePlugin.js.map +1 -1
- package/lib/Cloudflare/ApiToken/AccountApiToken.d.ts.map +1 -1
- package/lib/Cloudflare/ApiToken/AccountApiToken.js.map +1 -1
- package/lib/Cloudflare/ApiToken/Common.d.ts.map +1 -1
- package/lib/Cloudflare/ApiToken/Common.js.map +1 -1
- package/lib/Cloudflare/ApiToken/UserApiToken.d.ts.map +1 -1
- package/lib/Cloudflare/ApiToken/UserApiToken.js.map +1 -1
- package/lib/Cloudflare/D1/D1Clone.d.ts +13 -0
- package/lib/Cloudflare/D1/D1Clone.d.ts.map +1 -0
- package/lib/Cloudflare/D1/D1Clone.js +31 -0
- package/lib/Cloudflare/D1/D1Clone.js.map +1 -0
- package/lib/Cloudflare/D1/D1Database.d.ts +150 -5
- package/lib/Cloudflare/D1/D1Database.d.ts.map +1 -1
- package/lib/Cloudflare/D1/D1Database.js +253 -0
- package/lib/Cloudflare/D1/D1Database.js.map +1 -1
- package/lib/Cloudflare/D1/D1Export.d.ts +24 -0
- package/lib/Cloudflare/D1/D1Export.d.ts.map +1 -0
- package/lib/Cloudflare/D1/D1Export.js +34 -0
- package/lib/Cloudflare/D1/D1Export.js.map +1 -0
- package/lib/Cloudflare/D1/D1Import.d.ts +21 -0
- package/lib/Cloudflare/D1/D1Import.d.ts.map +1 -0
- package/lib/Cloudflare/D1/D1Import.js +87 -0
- package/lib/Cloudflare/D1/D1Import.js.map +1 -0
- package/lib/Cloudflare/D1/D1Migrations.d.ts +16 -0
- package/lib/Cloudflare/D1/D1Migrations.d.ts.map +1 -0
- package/lib/Cloudflare/D1/D1Migrations.js +110 -0
- package/lib/Cloudflare/D1/D1Migrations.js.map +1 -0
- package/lib/Cloudflare/D1/D1SqlFile.d.ts +20 -0
- package/lib/Cloudflare/D1/D1SqlFile.d.ts.map +1 -0
- package/lib/Cloudflare/D1/D1SqlFile.js +46 -0
- package/lib/Cloudflare/D1/D1SqlFile.js.map +1 -0
- package/lib/Cloudflare/Fetcher.d.ts.map +1 -1
- package/lib/Cloudflare/Fetcher.js +3 -1
- package/lib/Cloudflare/Fetcher.js.map +1 -1
- package/lib/Cloudflare/Providers.d.ts +1 -1
- package/lib/Cloudflare/Providers.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/Worker.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/Worker.js +12 -3
- package/lib/Cloudflare/Workers/Worker.js.map +1 -1
- package/lib/Output.d.ts.map +1 -1
- package/lib/Output.js +1 -1
- package/lib/Output.js.map +1 -1
- package/lib/Telemetry/Layer.d.ts.map +1 -1
- package/lib/Telemetry/Layer.js.map +1 -1
- package/lib/Telemetry/Metrics.d.ts.map +1 -1
- package/lib/Telemetry/Metrics.js.map +1 -1
- package/package.json +5 -5
- package/src/AWS/CloudFront/CachePolicy.ts +5 -2
- package/src/AWS/CloudFront/KeyGroup.ts +2 -1
- package/src/AWS/CloudFront/OriginRequestPolicy.ts +8 -2
- package/src/AWS/CloudFront/PublicKey.ts +2 -1
- package/src/AWS/ECS/CapacityProvider.ts +12 -9
- package/src/Axiom/Annotation.ts +7 -7
- package/src/Axiom/ApiToken.ts +6 -6
- package/src/Axiom/AuthProvider.ts +2 -7
- package/src/Axiom/Credentials.ts +2 -6
- package/src/Axiom/Dashboard.ts +10 -13
- package/src/Axiom/Dataset.ts +8 -12
- package/src/Axiom/Monitor.ts +8 -8
- package/src/Axiom/Notifier.ts +11 -8
- package/src/Axiom/View.ts +7 -7
- package/src/Axiom/VirtualField.ts +7 -7
- package/src/Bundle/PurePlugin.ts +6 -5
- package/src/Cloudflare/ApiToken/AccountApiToken.ts +1 -3
- package/src/Cloudflare/ApiToken/Common.ts +1 -3
- package/src/Cloudflare/ApiToken/UserApiToken.ts +1 -3
- package/src/Cloudflare/D1/D1Clone.ts +42 -0
- package/src/Cloudflare/D1/D1Database.ts +386 -3
- package/src/Cloudflare/D1/D1Export.ts +70 -0
- package/src/Cloudflare/D1/D1Import.ts +156 -0
- package/src/Cloudflare/D1/D1Migrations.ts +229 -0
- package/src/Cloudflare/D1/D1SqlFile.ts +57 -0
- package/src/Cloudflare/Fetcher.ts +3 -1
- package/src/Cloudflare/Workers/Worker.ts +40 -27
- package/src/Output.ts +1 -2
- package/src/Telemetry/Layer.ts +9 -10
- package/src/Telemetry/Metrics.ts +1 -6
|
@@ -5,6 +5,11 @@ import { createPhysicalName } from "../../PhysicalName.js";
|
|
|
5
5
|
import * as Provider from "../../Provider.js";
|
|
6
6
|
import { Resource } from "../../Resource.js";
|
|
7
7
|
import { CloudflareEnvironment } from "../CloudflareEnvironment.js";
|
|
8
|
+
import { cloneD1Database } from "./D1Clone.js";
|
|
9
|
+
import { importD1Database } from "./D1Import.js";
|
|
10
|
+
import { applyMigrations } from "./D1Migrations.js";
|
|
11
|
+
import { listSqlFiles, readSqlFile } from "./D1SqlFile.js";
|
|
12
|
+
const DEFAULT_MIGRATIONS_TABLE = "d1_migrations";
|
|
8
13
|
/**
|
|
9
14
|
* A Cloudflare D1 serverless SQL database built on SQLite.
|
|
10
15
|
*
|
|
@@ -18,12 +23,95 @@ import { CloudflareEnvironment } from "../CloudflareEnvironment.js";
|
|
|
18
23
|
* ```
|
|
19
24
|
*
|
|
20
25
|
* @example Database with location hint
|
|
26
|
+
* The primary copy of the data is stored in the chosen region; reads can be
|
|
27
|
+
* served closer to users when read replication is enabled.
|
|
21
28
|
* ```typescript
|
|
22
29
|
* const db = yield* Cloudflare.D1Database("my-db", {
|
|
23
30
|
* primaryLocationHint: "wnam",
|
|
24
31
|
* });
|
|
25
32
|
* ```
|
|
26
33
|
*
|
|
34
|
+
* @example Database with read replication
|
|
35
|
+
* Read replication is the only mutable property after creation — toggling it
|
|
36
|
+
* triggers an update rather than a replacement.
|
|
37
|
+
* ```typescript
|
|
38
|
+
* const db = yield* Cloudflare.D1Database("my-db", {
|
|
39
|
+
* readReplication: { mode: "auto" },
|
|
40
|
+
* });
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* @example Database in a specific jurisdiction
|
|
44
|
+
* ```typescript
|
|
45
|
+
* const db = yield* Cloudflare.D1Database("my-db", {
|
|
46
|
+
* jurisdiction: "eu",
|
|
47
|
+
* });
|
|
48
|
+
* ```
|
|
49
|
+
*
|
|
50
|
+
* @section Migrations
|
|
51
|
+
* Point `migrationsDir` at a folder of `.sql` files. Files are sorted by
|
|
52
|
+
* numeric prefix (e.g. `0001_`, `0002_`) and applied in order. Already-applied
|
|
53
|
+
* migrations are skipped on subsequent deploys; new files are detected
|
|
54
|
+
* automatically and applied as part of the next update.
|
|
55
|
+
*
|
|
56
|
+
* Migration tracking uses the wrangler-compatible
|
|
57
|
+
* `(id TEXT PRIMARY KEY, name TEXT, applied_at TEXT)` schema. The resource
|
|
58
|
+
* also detects and upgrades a legacy 2-column tracking table in place if one
|
|
59
|
+
* already exists.
|
|
60
|
+
*
|
|
61
|
+
* @example Apply migrations from a directory
|
|
62
|
+
* ```typescript
|
|
63
|
+
* const db = yield* Cloudflare.D1Database("my-db", {
|
|
64
|
+
* migrationsDir: "./migrations",
|
|
65
|
+
* });
|
|
66
|
+
* ```
|
|
67
|
+
*
|
|
68
|
+
* @example Custom migrations table (e.g. for Drizzle)
|
|
69
|
+
* ```typescript
|
|
70
|
+
* const db = yield* Cloudflare.D1Database("my-db", {
|
|
71
|
+
* migrationsDir: "./migrations",
|
|
72
|
+
* migrationsTable: "drizzle_migrations",
|
|
73
|
+
* });
|
|
74
|
+
* ```
|
|
75
|
+
*
|
|
76
|
+
* @section Importing SQL
|
|
77
|
+
* Use `importFiles` to seed the database with raw `.sql` files via Cloudflare's
|
|
78
|
+
* D1 import API. Each file is hashed; only files whose contents change are
|
|
79
|
+
* re-imported on subsequent deploys.
|
|
80
|
+
*
|
|
81
|
+
* @example Seed a database with SQL files
|
|
82
|
+
* ```typescript
|
|
83
|
+
* const db = yield* Cloudflare.D1Database("my-db", {
|
|
84
|
+
* importFiles: ["./seed/users.sql", "./seed/posts.sql"],
|
|
85
|
+
* });
|
|
86
|
+
* ```
|
|
87
|
+
*
|
|
88
|
+
* @section Cloning a Database
|
|
89
|
+
* `clone` performs a full export → import from a source database during
|
|
90
|
+
* creation. It accepts a `D1Database` resource, a `{ databaseId }`, or a
|
|
91
|
+
* `{ name }` to look up by name.
|
|
92
|
+
*
|
|
93
|
+
* @example Clone by passing the source resource directly
|
|
94
|
+
* ```typescript
|
|
95
|
+
* const source = yield* Cloudflare.D1Database("source-db");
|
|
96
|
+
* const cloned = yield* Cloudflare.D1Database("cloned-db", {
|
|
97
|
+
* clone: source,
|
|
98
|
+
* });
|
|
99
|
+
* ```
|
|
100
|
+
*
|
|
101
|
+
* @example Clone by databaseId
|
|
102
|
+
* ```typescript
|
|
103
|
+
* const cloned = yield* Cloudflare.D1Database("cloned-db", {
|
|
104
|
+
* clone: { databaseId: "abcdef12-3456-7890-abcd-ef1234567890" },
|
|
105
|
+
* });
|
|
106
|
+
* ```
|
|
107
|
+
*
|
|
108
|
+
* @example Clone by name
|
|
109
|
+
* ```typescript
|
|
110
|
+
* const cloned = yield* Cloudflare.D1Database("cloned-db", {
|
|
111
|
+
* clone: { name: "source-db" },
|
|
112
|
+
* });
|
|
113
|
+
* ```
|
|
114
|
+
*
|
|
27
115
|
* @section Binding to a Worker
|
|
28
116
|
* @example Using D1 inside a Worker
|
|
29
117
|
* ```typescript
|
|
@@ -39,6 +127,8 @@ import { CloudflareEnvironment } from "../CloudflareEnvironment.js";
|
|
|
39
127
|
* .bind(newId, name)
|
|
40
128
|
* .run();
|
|
41
129
|
* ```
|
|
130
|
+
*
|
|
131
|
+
* @see https://developers.cloudflare.com/d1/
|
|
42
132
|
*/
|
|
43
133
|
export const D1Database = Resource("Cloudflare.D1Database");
|
|
44
134
|
export const DatabaseProvider = () => Provider.effect(D1Database, Effect.gen(function* () {
|
|
@@ -48,6 +138,8 @@ export const DatabaseProvider = () => Provider.effect(D1Database, Effect.gen(fun
|
|
|
48
138
|
const patchDb = yield* d1.patchDatabase;
|
|
49
139
|
const deleteDb = yield* d1.deleteDatabase;
|
|
50
140
|
const listDbs = yield* d1.listDatabases;
|
|
141
|
+
// rootDir for resolving relative `importFiles` paths
|
|
142
|
+
const rootDir = process.cwd();
|
|
51
143
|
const createDatabaseName = (id, name) => Effect.gen(function* () {
|
|
52
144
|
return name ?? (yield* createPhysicalName({ id }));
|
|
53
145
|
});
|
|
@@ -77,6 +169,31 @@ export const DatabaseProvider = () => Provider.effect(D1Database, Effect.gen(fun
|
|
|
77
169
|
if (oldReplicationMode !== newReplicationMode) {
|
|
78
170
|
return { action: "update" };
|
|
79
171
|
}
|
|
172
|
+
// Detect migration/import file drift.
|
|
173
|
+
if (news.migrationsDir) {
|
|
174
|
+
const newHashes = yield* hashMigrations(news.migrationsDir);
|
|
175
|
+
const oldHashes = output?.migrationsHashes ?? {};
|
|
176
|
+
if (!recordsEqual(newHashes, oldHashes)) {
|
|
177
|
+
return { action: "update" };
|
|
178
|
+
}
|
|
179
|
+
if ((news.migrationsTable ?? DEFAULT_MIGRATIONS_TABLE) !==
|
|
180
|
+
(output?.migrationsTable ?? DEFAULT_MIGRATIONS_TABLE)) {
|
|
181
|
+
return { action: "update" };
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
else if (output?.migrationsHashes &&
|
|
185
|
+
Object.keys(output.migrationsHashes).length > 0) {
|
|
186
|
+
// migrationsDir was removed but state still tracks migrations: nothing
|
|
187
|
+
// to do remotely (we never un-apply), but no diff needed either.
|
|
188
|
+
}
|
|
189
|
+
if (news.importFiles?.length) {
|
|
190
|
+
const newHashes = yield* hashImports(news.importFiles, rootDir);
|
|
191
|
+
const oldHashes = output?.importHashes ?? {};
|
|
192
|
+
if (!recordsEqual(newHashes, oldHashes)) {
|
|
193
|
+
return { action: "update" };
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return undefined;
|
|
80
197
|
}),
|
|
81
198
|
read: Effect.fn(function* ({ id, output, olds }) {
|
|
82
199
|
if (output?.databaseId) {
|
|
@@ -89,6 +206,10 @@ export const DatabaseProvider = () => Provider.effect(D1Database, Effect.gen(fun
|
|
|
89
206
|
jurisdiction: output.jurisdiction,
|
|
90
207
|
readReplication: db.readReplication ?? undefined,
|
|
91
208
|
accountId: output.accountId,
|
|
209
|
+
migrationsDir: output.migrationsDir,
|
|
210
|
+
migrationsTable: output.migrationsTable,
|
|
211
|
+
migrationsHashes: output.migrationsHashes,
|
|
212
|
+
importHashes: output.importHashes,
|
|
92
213
|
})), Effect.catchTag("DatabaseNotFound", () => Effect.succeed(undefined)));
|
|
93
214
|
}
|
|
94
215
|
const name = yield* createDatabaseName(id, olds?.name);
|
|
@@ -101,6 +222,10 @@ export const DatabaseProvider = () => Provider.effect(D1Database, Effect.gen(fun
|
|
|
101
222
|
jurisdiction: (olds?.jurisdiction ?? "default"),
|
|
102
223
|
readReplication: olds?.readReplication,
|
|
103
224
|
accountId,
|
|
225
|
+
migrationsDir: olds?.migrationsDir,
|
|
226
|
+
migrationsTable: olds?.migrationsTable,
|
|
227
|
+
migrationsHashes: {},
|
|
228
|
+
importHashes: {},
|
|
104
229
|
};
|
|
105
230
|
}
|
|
106
231
|
return undefined;
|
|
@@ -129,12 +254,31 @@ export const DatabaseProvider = () => Provider.effect(D1Database, Effect.gen(fun
|
|
|
129
254
|
readReplication: news.readReplication,
|
|
130
255
|
});
|
|
131
256
|
}
|
|
257
|
+
if (news.clone) {
|
|
258
|
+
const sourceId = yield* resolveCloneSource(news.clone, accountId, listDbs);
|
|
259
|
+
yield* cloneD1Database({
|
|
260
|
+
accountId,
|
|
261
|
+
sourceDatabaseId: sourceId,
|
|
262
|
+
targetDatabaseId: databaseId,
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
const migrationsTable = news.migrationsTable ?? DEFAULT_MIGRATIONS_TABLE;
|
|
266
|
+
const migrationsHashes = news.migrationsDir
|
|
267
|
+
? yield* runMigrations(accountId, databaseId, news.migrationsDir, migrationsTable)
|
|
268
|
+
: {};
|
|
269
|
+
const importHashes = news.importFiles?.length
|
|
270
|
+
? yield* runImports(accountId, databaseId, news.importFiles, rootDir, {})
|
|
271
|
+
: {};
|
|
132
272
|
return {
|
|
133
273
|
databaseId,
|
|
134
274
|
databaseName: db.name ?? name,
|
|
135
275
|
jurisdiction,
|
|
136
276
|
readReplication: news.readReplication,
|
|
137
277
|
accountId,
|
|
278
|
+
migrationsDir: news.migrationsDir,
|
|
279
|
+
migrationsTable: news.migrationsDir ? migrationsTable : undefined,
|
|
280
|
+
migrationsHashes,
|
|
281
|
+
importHashes,
|
|
138
282
|
};
|
|
139
283
|
}),
|
|
140
284
|
update: Effect.fn(function* ({ news = {}, output }) {
|
|
@@ -144,12 +288,25 @@ export const DatabaseProvider = () => Provider.effect(D1Database, Effect.gen(fun
|
|
|
144
288
|
databaseId: output.databaseId,
|
|
145
289
|
readReplication: { mode: replicationMode },
|
|
146
290
|
});
|
|
291
|
+
const migrationsTable = news.migrationsTable ??
|
|
292
|
+
output.migrationsTable ??
|
|
293
|
+
DEFAULT_MIGRATIONS_TABLE;
|
|
294
|
+
const migrationsHashes = news.migrationsDir
|
|
295
|
+
? yield* runMigrations(output.accountId, output.databaseId, news.migrationsDir, migrationsTable)
|
|
296
|
+
: output.migrationsHashes;
|
|
297
|
+
const importHashes = news.importFiles?.length
|
|
298
|
+
? yield* runImports(output.accountId, output.databaseId, news.importFiles, rootDir, output.importHashes ?? {})
|
|
299
|
+
: {};
|
|
147
300
|
return {
|
|
148
301
|
databaseId: updated.uuid ?? output.databaseId,
|
|
149
302
|
databaseName: updated.name ?? output.databaseName,
|
|
150
303
|
jurisdiction: output.jurisdiction,
|
|
151
304
|
readReplication: news.readReplication,
|
|
152
305
|
accountId: output.accountId,
|
|
306
|
+
migrationsDir: news.migrationsDir,
|
|
307
|
+
migrationsTable: news.migrationsDir ? migrationsTable : undefined,
|
|
308
|
+
migrationsHashes,
|
|
309
|
+
importHashes,
|
|
153
310
|
};
|
|
154
311
|
}),
|
|
155
312
|
delete: Effect.fn(function* ({ output }) {
|
|
@@ -160,4 +317,100 @@ export const DatabaseProvider = () => Provider.effect(D1Database, Effect.gen(fun
|
|
|
160
317
|
}),
|
|
161
318
|
};
|
|
162
319
|
}));
|
|
320
|
+
/**
|
|
321
|
+
* Resolve a clone source spec into a concrete database UUID. Looks up by
|
|
322
|
+
* name through `listDatabases` when only a name is provided.
|
|
323
|
+
*/
|
|
324
|
+
const resolveCloneSource = (source, accountId, listDbs) => Effect.gen(function* () {
|
|
325
|
+
if ("databaseId" in source && source.databaseId) {
|
|
326
|
+
// At lifecycle time, Output<string> attributes have resolved to strings.
|
|
327
|
+
return source.databaseId;
|
|
328
|
+
}
|
|
329
|
+
if ("name" in source && source.name) {
|
|
330
|
+
const name = source.name;
|
|
331
|
+
const dbs = yield* listDbs({ accountId, name });
|
|
332
|
+
const match = dbs.result.find((db) => db.name === name);
|
|
333
|
+
if (!match?.uuid) {
|
|
334
|
+
return yield* Effect.die(`Source database "${name}" not found for cloning`);
|
|
335
|
+
}
|
|
336
|
+
return match.uuid;
|
|
337
|
+
}
|
|
338
|
+
return yield* Effect.die("Invalid clone source: must provide databaseId or name");
|
|
339
|
+
});
|
|
340
|
+
/**
|
|
341
|
+
* Read all migration files from `migrationsDir`, run pending migrations,
|
|
342
|
+
* and return the per-file content hashes for state tracking.
|
|
343
|
+
*/
|
|
344
|
+
const runMigrations = (accountId, databaseId, migrationsDir, migrationsTable) => Effect.gen(function* () {
|
|
345
|
+
const files = yield* listSqlFiles(migrationsDir);
|
|
346
|
+
if (files.length > 0) {
|
|
347
|
+
yield* applyMigrations({
|
|
348
|
+
accountId,
|
|
349
|
+
databaseId,
|
|
350
|
+
migrationsTable,
|
|
351
|
+
migrationsFiles: files,
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
const hashes = {};
|
|
355
|
+
for (const file of files)
|
|
356
|
+
hashes[file.id] = file.hash;
|
|
357
|
+
return hashes;
|
|
358
|
+
});
|
|
359
|
+
/**
|
|
360
|
+
* Read each `importFiles` entry and run it through the D1 import flow,
|
|
361
|
+
* skipping files whose hash matches the previously-imported hash.
|
|
362
|
+
*/
|
|
363
|
+
const runImports = (accountId, databaseId, importFiles, rootDir, previous) => Effect.gen(function* () {
|
|
364
|
+
const hashes = { ...previous };
|
|
365
|
+
for (const filePath of importFiles) {
|
|
366
|
+
const file = yield* readSqlFile(rootDir, filePath);
|
|
367
|
+
if (previous[filePath] === file.hash) {
|
|
368
|
+
hashes[filePath] = file.hash;
|
|
369
|
+
continue;
|
|
370
|
+
}
|
|
371
|
+
yield* importD1Database({
|
|
372
|
+
accountId,
|
|
373
|
+
databaseId,
|
|
374
|
+
sqlData: file.sql,
|
|
375
|
+
filename: file.id,
|
|
376
|
+
});
|
|
377
|
+
hashes[filePath] = file.hash;
|
|
378
|
+
}
|
|
379
|
+
// Drop entries for files no longer listed.
|
|
380
|
+
const tracked = new Set(importFiles);
|
|
381
|
+
for (const key of Object.keys(hashes)) {
|
|
382
|
+
if (!tracked.has(key))
|
|
383
|
+
delete hashes[key];
|
|
384
|
+
}
|
|
385
|
+
return hashes;
|
|
386
|
+
});
|
|
387
|
+
/**
|
|
388
|
+
* Hash all `.sql` files in `migrationsDir` without applying them; used by
|
|
389
|
+
* `diff` to detect drift relative to previously-applied state.
|
|
390
|
+
*/
|
|
391
|
+
const hashMigrations = (migrationsDir) => listSqlFiles(migrationsDir).pipe(Effect.map((files) => {
|
|
392
|
+
const hashes = {};
|
|
393
|
+
for (const file of files)
|
|
394
|
+
hashes[file.id] = file.hash;
|
|
395
|
+
return hashes;
|
|
396
|
+
}));
|
|
397
|
+
const hashImports = (importFiles, rootDir) => Effect.gen(function* () {
|
|
398
|
+
const hashes = {};
|
|
399
|
+
for (const filePath of importFiles) {
|
|
400
|
+
const file = yield* readSqlFile(rootDir, filePath);
|
|
401
|
+
hashes[filePath] = file.hash;
|
|
402
|
+
}
|
|
403
|
+
return hashes;
|
|
404
|
+
});
|
|
405
|
+
const recordsEqual = (a, b) => {
|
|
406
|
+
const aKeys = Object.keys(a);
|
|
407
|
+
const bKeys = Object.keys(b);
|
|
408
|
+
if (aKeys.length !== bKeys.length)
|
|
409
|
+
return false;
|
|
410
|
+
for (const k of aKeys) {
|
|
411
|
+
if (a[k] !== b[k])
|
|
412
|
+
return false;
|
|
413
|
+
}
|
|
414
|
+
return true;
|
|
415
|
+
};
|
|
163
416
|
//# sourceMappingURL=D1Database.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"D1Database.js","sourceRoot":"","sources":["../../../src/Cloudflare/D1/D1Database.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"D1Database.js","sourceRoot":"","sources":["../../../src/Cloudflare/D1/D1Database.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as d1 from "@distilled.cloud/cloudflare/d1";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import type * as HttpClient from "effect/unstable/http/HttpClient";
|
|
4
|
+
import type { Credentials } from "@distilled.cloud/cloudflare/Credentials";
|
|
5
|
+
export interface ExportD1DatabaseOptions {
|
|
6
|
+
accountId: string;
|
|
7
|
+
databaseId: string;
|
|
8
|
+
dumpOptions?: {
|
|
9
|
+
tables?: string[];
|
|
10
|
+
noSchema?: boolean;
|
|
11
|
+
noData?: boolean;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export interface ExportD1DatabaseResult {
|
|
15
|
+
filename: string;
|
|
16
|
+
signedUrl: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Initiates an export of a Cloudflare D1 database and returns a signed
|
|
20
|
+
* download URL. Recursively polls with the bookmark until the export
|
|
21
|
+
* completes or fails.
|
|
22
|
+
*/
|
|
23
|
+
export declare const exportD1Database: (options: ExportD1DatabaseOptions) => Effect.Effect<ExportD1DatabaseResult, d1.ExportDatabaseError, Credentials | HttpClient.HttpClient>;
|
|
24
|
+
//# sourceMappingURL=D1Export.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"D1Export.d.ts","sourceRoot":"","sources":["../../../src/Cloudflare/D1/D1Export.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACrD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,UAAU,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAE3E,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE;QACZ,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAC3B,SAAS,uBAAuB,KAC/B,MAAM,CAAC,MAAM,CACd,sBAAsB,EACtB,EAAE,CAAC,mBAAmB,EACtB,WAAW,GAAG,UAAU,CAAC,UAAU,CAuCjC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import * as d1 from "@distilled.cloud/cloudflare/d1";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
/**
|
|
4
|
+
* Initiates an export of a Cloudflare D1 database and returns a signed
|
|
5
|
+
* download URL. Recursively polls with the bookmark until the export
|
|
6
|
+
* completes or fails.
|
|
7
|
+
*/
|
|
8
|
+
export const exportD1Database = (options) => Effect.gen(function* () {
|
|
9
|
+
const exportDb = yield* d1.exportDatabase;
|
|
10
|
+
const poll = (currentBookmark) => Effect.gen(function* () {
|
|
11
|
+
const data = yield* exportDb({
|
|
12
|
+
accountId: options.accountId,
|
|
13
|
+
databaseId: options.databaseId,
|
|
14
|
+
outputFormat: "polling",
|
|
15
|
+
currentBookmark,
|
|
16
|
+
dumpOptions: options.dumpOptions,
|
|
17
|
+
});
|
|
18
|
+
if (data.status === "complete" && data.result) {
|
|
19
|
+
if (!data.result.filename || !data.result.signedUrl) {
|
|
20
|
+
return yield* Effect.die("D1 export completed but missing filename/signedUrl");
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
filename: data.result.filename,
|
|
24
|
+
signedUrl: data.result.signedUrl,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
if (data.status === "error") {
|
|
28
|
+
return yield* Effect.die(data.error ?? "Error during D1 export");
|
|
29
|
+
}
|
|
30
|
+
return yield* poll(data.atBookmark ?? undefined);
|
|
31
|
+
});
|
|
32
|
+
return yield* poll();
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=D1Export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"D1Export.js","sourceRoot":"","sources":["../../../src/Cloudflare/D1/D1Export.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACrD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAmBxC;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,OAAgC,EAKhC,EAAE,CACF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC;IAE1C,MAAM,IAAI,GAAG,CACX,eAAwB,EAKxB,EAAE,CACF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC;YAC3B,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,YAAY,EAAE,SAAS;YACvB,eAAe;YACf,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC9C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;gBACpD,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CACtB,oDAAoD,CACrD,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;aACjC,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,wBAAwB,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,SAAS,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEL,OAAO,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import * as d1 from "@distilled.cloud/cloudflare/d1";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
export interface ImportD1DatabaseOptions {
|
|
4
|
+
accountId: string;
|
|
5
|
+
databaseId: string;
|
|
6
|
+
sqlData: string | Uint8Array;
|
|
7
|
+
filename?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ImportD1DatabaseResult {
|
|
10
|
+
filename: string;
|
|
11
|
+
numQueries: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Import SQL into a D1 database via the multi-step Cloudflare flow:
|
|
15
|
+
* 1. POST `action: "init"` -> returns presigned `upload_url`
|
|
16
|
+
* 2. PUT raw SQL to `upload_url`
|
|
17
|
+
* 3. POST `action: "ingest"` -> returns `at_bookmark`
|
|
18
|
+
* 4. POST `action: "poll"` until `status === "complete"`
|
|
19
|
+
*/
|
|
20
|
+
export declare const importD1Database: (options: ImportD1DatabaseOptions) => Effect.Effect<ImportD1DatabaseResult, import("@distilled.cloud/cloudflare").CredentialsError | d1.ImportDatabaseError, any>;
|
|
21
|
+
//# sourceMappingURL=D1Import.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"D1Import.d.ts","sourceRoot":"","sources":["../../../src/Cloudflare/D1/D1Import.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAMrD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAIxC,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAyBD;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAAI,SAAS,uBAAuB,gIAuG7D,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import * as d1 from "@distilled.cloud/cloudflare/d1";
|
|
2
|
+
import { Credentials, formatHeaders, } from "@distilled.cloud/cloudflare/Credentials";
|
|
3
|
+
import crypto from "node:crypto";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import * as HttpClient from "effect/unstable/http/HttpClient";
|
|
6
|
+
import * as HttpClientRequest from "effect/unstable/http/HttpClientRequest";
|
|
7
|
+
const md5 = (data) => crypto.createHash("md5").update(data).digest("hex");
|
|
8
|
+
const importEndpoint = (apiBaseUrl, accountId, databaseId) => `${apiBaseUrl}/accounts/${accountId}/d1/database/${databaseId}/import`;
|
|
9
|
+
/**
|
|
10
|
+
* Import SQL into a D1 database via the multi-step Cloudflare flow:
|
|
11
|
+
* 1. POST `action: "init"` -> returns presigned `upload_url`
|
|
12
|
+
* 2. PUT raw SQL to `upload_url`
|
|
13
|
+
* 3. POST `action: "ingest"` -> returns `at_bookmark`
|
|
14
|
+
* 4. POST `action: "poll"` until `status === "complete"`
|
|
15
|
+
*/
|
|
16
|
+
export const importD1Database = (options) => Effect.gen(function* () {
|
|
17
|
+
const credentialsEff = yield* Credentials;
|
|
18
|
+
const credentials = yield* credentialsEff;
|
|
19
|
+
const authHeaders = formatHeaders(credentials);
|
|
20
|
+
const url = importEndpoint(credentials.apiBaseUrl, options.accountId, options.databaseId);
|
|
21
|
+
const client = yield* HttpClient.HttpClient;
|
|
22
|
+
const postJson = (body) => Effect.gen(function* () {
|
|
23
|
+
const req = HttpClientRequest.post(url).pipe(HttpClientRequest.setHeaders(authHeaders), HttpClientRequest.bodyJsonUnsafe(body));
|
|
24
|
+
const res = yield* client.execute(req).pipe(Effect.orDie);
|
|
25
|
+
if (res.status < 200 || res.status >= 300) {
|
|
26
|
+
const text = yield* res.text.pipe(Effect.orElseSucceed(() => ""));
|
|
27
|
+
return yield* Effect.die(`D1 import request failed (${res.status}): ${text}`);
|
|
28
|
+
}
|
|
29
|
+
const text = yield* res.text.pipe(Effect.orDie);
|
|
30
|
+
const json = JSON.parse(text);
|
|
31
|
+
return json.result;
|
|
32
|
+
});
|
|
33
|
+
const etag = md5(options.sqlData);
|
|
34
|
+
// Step 1: init via the typed d1 client
|
|
35
|
+
const initDb = yield* d1.importDatabase;
|
|
36
|
+
const init = yield* initDb({
|
|
37
|
+
accountId: options.accountId,
|
|
38
|
+
databaseId: options.databaseId,
|
|
39
|
+
action: "init",
|
|
40
|
+
etag,
|
|
41
|
+
});
|
|
42
|
+
if (!init.uploadUrl) {
|
|
43
|
+
return yield* Effect.die(init.error ?? "Failed to get upload URL for D1 import");
|
|
44
|
+
}
|
|
45
|
+
const uploadFilename = options.filename ?? init.filename ?? "import.sql";
|
|
46
|
+
// Step 2: PUT to the presigned upload URL
|
|
47
|
+
const bytes = typeof options.sqlData === "string"
|
|
48
|
+
? new TextEncoder().encode(options.sqlData)
|
|
49
|
+
: options.sqlData;
|
|
50
|
+
const putReq = HttpClientRequest.put(init.uploadUrl).pipe(HttpClientRequest.bodyUint8Array(bytes, "application/sql"));
|
|
51
|
+
const putRes = yield* client.execute(putReq).pipe(Effect.orDie);
|
|
52
|
+
if (putRes.status < 200 || putRes.status >= 300) {
|
|
53
|
+
const text = yield* putRes.text.pipe(Effect.orElseSucceed(() => ""));
|
|
54
|
+
return yield* Effect.die(`Failed to upload SQL file to D1 (${putRes.status}): ${text}`);
|
|
55
|
+
}
|
|
56
|
+
// Step 3: ingest
|
|
57
|
+
const ingest = yield* postJson({
|
|
58
|
+
action: "ingest",
|
|
59
|
+
etag,
|
|
60
|
+
filename: init.filename,
|
|
61
|
+
});
|
|
62
|
+
if (!ingest.at_bookmark) {
|
|
63
|
+
return yield* Effect.die(ingest.error ?? "Ingest response missing bookmark");
|
|
64
|
+
}
|
|
65
|
+
// Step 4: poll until complete
|
|
66
|
+
const poll = (bookmark) => Effect.gen(function* () {
|
|
67
|
+
const data = yield* postJson({
|
|
68
|
+
action: "poll",
|
|
69
|
+
current_bookmark: bookmark,
|
|
70
|
+
});
|
|
71
|
+
if (data.status === "complete" && data.result) {
|
|
72
|
+
return {
|
|
73
|
+
filename: data.filename ?? uploadFilename,
|
|
74
|
+
numQueries: data.result.num_queries ?? 0,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
if (data.status === "error") {
|
|
78
|
+
return yield* Effect.die(data.error ?? "Error during D1 import");
|
|
79
|
+
}
|
|
80
|
+
if (!data.at_bookmark) {
|
|
81
|
+
return yield* Effect.die("D1 import poll missing bookmark");
|
|
82
|
+
}
|
|
83
|
+
return yield* poll(data.at_bookmark);
|
|
84
|
+
});
|
|
85
|
+
return yield* poll(ingest.at_bookmark);
|
|
86
|
+
});
|
|
87
|
+
//# sourceMappingURL=D1Import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"D1Import.js","sourceRoot":"","sources":["../../../src/Cloudflare/D1/D1Import.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import type * as HttpClient from "effect/unstable/http/HttpClient";
|
|
3
|
+
import type { Credentials } from "@distilled.cloud/cloudflare/Credentials";
|
|
4
|
+
import type { D1SqlFile } from "./D1SqlFile.ts";
|
|
5
|
+
export interface ApplyMigrationsOptions {
|
|
6
|
+
accountId: string;
|
|
7
|
+
databaseId: string;
|
|
8
|
+
migrationsTable: string;
|
|
9
|
+
migrationsFiles: ReadonlyArray<D1SqlFile>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Apply pending D1 migrations in order. Uses the wrangler-compatible
|
|
13
|
+
* 3-column schema `(id TEXT PK, name TEXT, applied_at TEXT)`.
|
|
14
|
+
*/
|
|
15
|
+
export declare const applyMigrations: (options: ApplyMigrationsOptions) => Effect.Effect<void, import("@distilled.cloud/cloudflare").DefaultErrors, HttpClient.HttpClient | Credentials>;
|
|
16
|
+
//# sourceMappingURL=D1Migrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"D1Migrations.d.ts","sourceRoot":"","sources":["../../../src/Cloudflare/D1/D1Migrations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,UAAU,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;CAC3C;AA2LD;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAI,SAAS,sBAAsB,kHA0B3D,CAAC"}
|