alchemy 0.87.0 → 0.89.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/bin/alchemy.js +483 -541
- package/lib/cloudflare/compatibility-date.d.ts +1 -1
- package/lib/cloudflare/compatibility-date.d.ts.map +1 -1
- package/lib/cloudflare/index.d.ts +1 -0
- package/lib/cloudflare/index.d.ts.map +1 -1
- package/lib/cloudflare/index.js +1 -0
- package/lib/cloudflare/index.js.map +1 -1
- package/lib/cloudflare/r2-bucket-notification.d.ts +312 -0
- package/lib/cloudflare/r2-bucket-notification.d.ts.map +1 -0
- package/lib/cloudflare/r2-bucket-notification.js +387 -0
- package/lib/cloudflare/r2-bucket-notification.js.map +1 -0
- package/lib/cloudflare/workflow.d.ts +17 -0
- package/lib/cloudflare/workflow.d.ts.map +1 -1
- package/lib/cloudflare/workflow.js +1 -0
- package/lib/cloudflare/workflow.js.map +1 -1
- package/lib/cloudflare/wrangler.json.js +1 -0
- package/lib/cloudflare/wrangler.json.js.map +1 -1
- package/lib/docker/api.d.ts +40 -0
- package/lib/docker/api.d.ts.map +1 -1
- package/lib/docker/api.js +30 -0
- package/lib/docker/api.js.map +1 -1
- package/lib/docker/network.d.ts.map +1 -1
- package/lib/docker/network.js +24 -7
- package/lib/docker/network.js.map +1 -1
- package/lib/planetscale/api.d.ts +1 -0
- package/lib/planetscale/api.d.ts.map +1 -1
- package/lib/planetscale/api.js +1 -1
- package/lib/planetscale/api.js.map +1 -1
- package/lib/planetscale/branch.d.ts +28 -0
- package/lib/planetscale/branch.d.ts.map +1 -1
- package/lib/planetscale/branch.js +12 -0
- package/lib/planetscale/branch.js.map +1 -1
- package/lib/planetscale/database-extensions.d.ts +515 -0
- package/lib/planetscale/database-extensions.d.ts.map +1 -0
- package/lib/planetscale/database-extensions.js +389 -0
- package/lib/planetscale/database-extensions.js.map +1 -0
- package/lib/planetscale/database.d.ts +40 -2
- package/lib/planetscale/database.d.ts.map +1 -1
- package/lib/planetscale/database.js +76 -1
- package/lib/planetscale/database.js.map +1 -1
- package/lib/scope.d.ts.map +1 -1
- package/lib/scope.js +1 -2
- package/lib/scope.js.map +1 -1
- package/lib/util/telemetry.d.ts +1 -6
- package/lib/util/telemetry.d.ts.map +1 -1
- package/lib/util/telemetry.js.map +1 -1
- package/package.json +4 -4
- package/src/cloudflare/index.ts +1 -0
- package/src/cloudflare/r2-bucket-notification.ts +809 -0
- package/src/cloudflare/workflow.ts +18 -0
- package/src/cloudflare/wrangler.json.ts +1 -0
- package/src/docker/api.ts +61 -0
- package/src/docker/network.ts +27 -7
- package/src/planetscale/api.ts +1 -1
- package/src/planetscale/branch.ts +45 -0
- package/src/planetscale/database-extensions.ts +947 -0
- package/src/planetscale/database.ts +141 -2
- package/src/scope.ts +1 -2
- package/src/util/telemetry.ts +1 -20
- package/workers/tunnel-proxy.js +1 -1
- package/lib/state/instrumented-state-store.d.ts +0 -19
- package/lib/state/instrumented-state-store.d.ts.map +0 -1
- package/lib/state/instrumented-state-store.js +0 -68
- package/lib/state/instrumented-state-store.js.map +0 -1
- package/src/state/instrumented-state-store.ts +0 -108
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
import { poll } from "../util/poll.js";
|
|
2
|
+
import { extractToken } from "./api.js";
|
|
3
|
+
/**
|
|
4
|
+
* Base libraries that PlanetScale always includes in shared_preload_libraries.
|
|
5
|
+
* These are managed internally and should not be toggled by users.
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
const BASE_LIBRARIES = ["pg_pscale_utils", "pg_readonly", "pgextwlist"];
|
|
9
|
+
function mapPgCron(config) {
|
|
10
|
+
return {
|
|
11
|
+
library: "pg_cron",
|
|
12
|
+
params: {
|
|
13
|
+
"cron.database_name": config.databaseName ?? "postgres",
|
|
14
|
+
"cron.launch_active_jobs": config.launchActiveJobs ?? "on",
|
|
15
|
+
"cron.log_min_messages": config.logMinMessages ?? "warning",
|
|
16
|
+
"cron.log_run": config.logRun ?? "on",
|
|
17
|
+
"cron.log_statement": config.logStatement ?? "on",
|
|
18
|
+
"cron.max_running_jobs": String(config.maxRunningJobs ?? 1),
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function mapPgDuckdb(config) {
|
|
23
|
+
return {
|
|
24
|
+
library: "pg_duckdb",
|
|
25
|
+
params: {
|
|
26
|
+
"duckdb.postgres_role": config.postgresRole ?? "pscale_superuser",
|
|
27
|
+
"duckdb.memory_limit": config.memoryLimit ?? "0",
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function mapPgHintPlan(config) {
|
|
32
|
+
return {
|
|
33
|
+
library: "pg_hint_plan",
|
|
34
|
+
params: {
|
|
35
|
+
"pg_hint_plan.enable_hint": config.enableHint ?? "on",
|
|
36
|
+
"pg_hint_plan.enable_hint_table": config.enableHintTable ?? "off",
|
|
37
|
+
"pg_hint_plan.parse_messages": config.parseMessages ?? "info",
|
|
38
|
+
"pg_hint_plan.debug_print": config.debugPrint ?? "off",
|
|
39
|
+
"pg_hint_plan.message_level": config.messageLevel ?? "info",
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function mapPgPartmanBgw(config) {
|
|
44
|
+
return {
|
|
45
|
+
library: "pg_partman_bgw",
|
|
46
|
+
params: {
|
|
47
|
+
"pg_partman_bgw.interval": String(config.interval ?? 3600),
|
|
48
|
+
"pg_partman_bgw.dbname": config.dbname ?? "postgres",
|
|
49
|
+
"pg_partman_bgw.role": config.role ?? "postgres",
|
|
50
|
+
"pg_partman_bgw.analyze": config.analyze ?? "off",
|
|
51
|
+
"pg_partman_bgw.jobmon": config.jobmon ?? "on",
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function mapPgSqueeze(config) {
|
|
56
|
+
return {
|
|
57
|
+
library: "pg_squeeze",
|
|
58
|
+
params: {
|
|
59
|
+
"squeeze.max_xlock_time": String(config.maxXlockTime ?? 0),
|
|
60
|
+
"squeeze.worker_autostart": config.workerAutostart ?? "postgres",
|
|
61
|
+
"squeeze.workers_per_database": String(config.workersPerDatabase ?? 1),
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function mapPgStatStatements(config) {
|
|
66
|
+
return {
|
|
67
|
+
library: "pg_stat_statements",
|
|
68
|
+
params: {
|
|
69
|
+
"pg_stat_statements.max": String(config.max ?? 5000),
|
|
70
|
+
"pg_stat_statements.track": config.track ?? "top",
|
|
71
|
+
"pg_stat_statements.track_utility": config.trackUtility ?? "on",
|
|
72
|
+
"pg_stat_statements.track_planning": config.trackPlanning ?? "off",
|
|
73
|
+
"pg_stat_statements.save": config.save ?? "on",
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
function mapTimescaledb(config) {
|
|
78
|
+
return {
|
|
79
|
+
library: "timescaledb",
|
|
80
|
+
params: {
|
|
81
|
+
"timescaledb.bgw_log_level": config.bgwLogLevel ?? "warning",
|
|
82
|
+
"timescaledb.enable_chunk_append": config.enableChunkAppend ?? "on",
|
|
83
|
+
"timescaledb.enable_chunk_skipping": config.enableChunkSkipping ?? "off",
|
|
84
|
+
"timescaledb.enable_constraint_aware_append": config.enableConstraintAwareAppend ?? "on",
|
|
85
|
+
"timescaledb.enable_constraint_exclusion": config.enableConstraintExclusion ?? "on",
|
|
86
|
+
"timescaledb.enable_custom_hashagg": config.enableCustomHashagg ?? "off",
|
|
87
|
+
"timescaledb.enable_deprecation_warnings": config.enableDeprecationWarnings ?? "on",
|
|
88
|
+
"timescaledb.enable_event_triggers": config.enableEventTriggers ?? "off",
|
|
89
|
+
"timescaledb.enable_foreign_key_propagation": config.enableForeignKeyPropagation ?? "on",
|
|
90
|
+
"timescaledb.enable_job_execution_logging": config.enableJobExecutionLogging ?? "off",
|
|
91
|
+
"timescaledb.enable_now_constify": config.enableNowConstify ?? "on",
|
|
92
|
+
"timescaledb.enable_optimizations": config.enableOptimizations ?? "on",
|
|
93
|
+
"timescaledb.enable_ordered_append": config.enableOrderedAppend ?? "on",
|
|
94
|
+
"timescaledb.enable_parallel_chunk_append": config.enableParallelChunkAppend ?? "on",
|
|
95
|
+
"timescaledb.enable_qual_propagation": config.enableQualPropagation ?? "on",
|
|
96
|
+
"timescaledb.enable_runtime_exclusion": config.enableRuntimeExclusion ?? "on",
|
|
97
|
+
"timescaledb.enable_tiered_reads": config.enableTieredReads ?? "on",
|
|
98
|
+
"timescaledb.enable_tss_callbacks": config.enableTssCallbacks ?? "on",
|
|
99
|
+
"timescaledb.max_cached_chunks_per_hypertable": String(config.maxCachedChunksPerHypertable ?? 1024),
|
|
100
|
+
"timescaledb.max_open_chunks_per_insert": String(config.maxOpenChunksPerInsert ?? 1024),
|
|
101
|
+
"timescaledb.restoring": config.restoring ?? "off",
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function mapVector(config) {
|
|
106
|
+
return {
|
|
107
|
+
library: "vector",
|
|
108
|
+
params: {
|
|
109
|
+
"hnsw.ef_search": String(config.hnswEfSearch ?? 40),
|
|
110
|
+
"hnsw.iterative_scan": config.hnswIterativeScan ?? "off",
|
|
111
|
+
"hnsw.max_scan_tuples": String(config.hnswMaxScanTuples ?? 20000),
|
|
112
|
+
"hnsw.scan_mem_multiplier": String(config.hnswScanMemMultiplier ?? 1),
|
|
113
|
+
"ivfflat.probes": String(config.ivfflatProbes ?? 1),
|
|
114
|
+
"ivfflat.iterative_scan": config.ivfflatIterativeScan ?? "off",
|
|
115
|
+
"ivfflat.max_probes": String(config.ivfflatMaxProbes ?? 32768),
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function mapPgInsights(config) {
|
|
120
|
+
return {
|
|
121
|
+
library: "pginsights",
|
|
122
|
+
params: {
|
|
123
|
+
"pginsights.raw_queries": config.rawQueries ?? "off",
|
|
124
|
+
"pginsights.normalize_schema_names": config.normalizeSchemaNames ?? "off",
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Converts a DatabaseExtensions object into a map of library name -> pgconf params.
|
|
130
|
+
* Only includes extensions that are present (enabled).
|
|
131
|
+
* @internal
|
|
132
|
+
*/
|
|
133
|
+
export function extensionsToParamMappings(extensions) {
|
|
134
|
+
const mappings = new Map();
|
|
135
|
+
if (extensions.pgCron !== undefined) {
|
|
136
|
+
const m = mapPgCron(extensions.pgCron);
|
|
137
|
+
mappings.set(m.library, m.params);
|
|
138
|
+
}
|
|
139
|
+
if (extensions.pgDuckdb !== undefined) {
|
|
140
|
+
const m = mapPgDuckdb(extensions.pgDuckdb);
|
|
141
|
+
mappings.set(m.library, m.params);
|
|
142
|
+
}
|
|
143
|
+
if (extensions.pgHintPlan !== undefined) {
|
|
144
|
+
const m = mapPgHintPlan(extensions.pgHintPlan);
|
|
145
|
+
mappings.set(m.library, m.params);
|
|
146
|
+
}
|
|
147
|
+
if (extensions.pgPartmanBgw !== undefined) {
|
|
148
|
+
const m = mapPgPartmanBgw(extensions.pgPartmanBgw);
|
|
149
|
+
mappings.set(m.library, m.params);
|
|
150
|
+
}
|
|
151
|
+
if (extensions.pgSqueeze !== undefined) {
|
|
152
|
+
const m = mapPgSqueeze(extensions.pgSqueeze);
|
|
153
|
+
mappings.set(m.library, m.params);
|
|
154
|
+
}
|
|
155
|
+
if (extensions.pgStatStatements !== undefined) {
|
|
156
|
+
const m = mapPgStatStatements(extensions.pgStatStatements);
|
|
157
|
+
mappings.set(m.library, m.params);
|
|
158
|
+
}
|
|
159
|
+
if (extensions.pgStrict !== undefined) {
|
|
160
|
+
mappings.set("pg_strict", {});
|
|
161
|
+
}
|
|
162
|
+
if (extensions.timescaledb !== undefined) {
|
|
163
|
+
const m = mapTimescaledb(extensions.timescaledb);
|
|
164
|
+
mappings.set(m.library, m.params);
|
|
165
|
+
}
|
|
166
|
+
if (extensions.vector !== undefined) {
|
|
167
|
+
const m = mapVector(extensions.vector);
|
|
168
|
+
mappings.set(m.library, m.params);
|
|
169
|
+
}
|
|
170
|
+
if (extensions.pgInsights !== undefined) {
|
|
171
|
+
const m = mapPgInsights(extensions.pgInsights);
|
|
172
|
+
mappings.set(m.library, m.params);
|
|
173
|
+
}
|
|
174
|
+
return mappings;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Computes the diff between two extension configurations.
|
|
178
|
+
*
|
|
179
|
+
* @param current - The currently active extensions (or `undefined`/`{}` if none)
|
|
180
|
+
* @param desired - The desired extensions configuration
|
|
181
|
+
* @returns An ExtensionsDiff describing what needs to change
|
|
182
|
+
*
|
|
183
|
+
* @example
|
|
184
|
+
* ```ts
|
|
185
|
+
* const diff = diffExtensions(
|
|
186
|
+
* { pgCron: { maxRunningJobs: 1 } },
|
|
187
|
+
* { pgCron: { maxRunningJobs: 5 }, vector: {} },
|
|
188
|
+
* );
|
|
189
|
+
* // diff.changes = [
|
|
190
|
+
* // { library: "pg_cron", action: "update", params: { "cron.max_running_jobs": "5" } },
|
|
191
|
+
* // { library: "vector", action: "add", params: {} },
|
|
192
|
+
* // ]
|
|
193
|
+
* ```
|
|
194
|
+
*/
|
|
195
|
+
export function diffExtensions(current, desired) {
|
|
196
|
+
const currentMappings = extensionsToParamMappings(current ?? {});
|
|
197
|
+
const desiredMappings = extensionsToParamMappings(desired ?? {});
|
|
198
|
+
const changes = [];
|
|
199
|
+
// Find additions and updates
|
|
200
|
+
for (const [library, desiredParams] of desiredMappings) {
|
|
201
|
+
const currentParams = currentMappings.get(library);
|
|
202
|
+
if (!currentParams) {
|
|
203
|
+
// Extension is being added
|
|
204
|
+
changes.push({ library, action: "add", params: desiredParams });
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
// Extension exists — check if params changed
|
|
208
|
+
const paramsChanged = JSON.stringify(sortedEntries(currentParams)) !==
|
|
209
|
+
JSON.stringify(sortedEntries(desiredParams));
|
|
210
|
+
if (paramsChanged) {
|
|
211
|
+
changes.push({ library, action: "update", params: desiredParams });
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// Find removals
|
|
216
|
+
for (const [library] of currentMappings) {
|
|
217
|
+
if (!desiredMappings.has(library)) {
|
|
218
|
+
changes.push({ library, action: "remove", params: {} });
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return {
|
|
222
|
+
changes,
|
|
223
|
+
hasChanges: changes.length > 0,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
function sortedEntries(obj) {
|
|
227
|
+
return Object.entries(obj).sort(([a], [b]) => a.localeCompare(b));
|
|
228
|
+
}
|
|
229
|
+
function resolveOptions(opts) {
|
|
230
|
+
const organization = opts.organization ??
|
|
231
|
+
(typeof opts.database !== "string"
|
|
232
|
+
? opts.database.organization
|
|
233
|
+
: undefined) ??
|
|
234
|
+
process.env.PLANETSCALE_ORGANIZATION ??
|
|
235
|
+
process.env.PLANETSCALE_ORG_ID;
|
|
236
|
+
if (!organization) {
|
|
237
|
+
throw new Error("PlanetScale organization is required. Please set the `organization` property or the `PLANETSCALE_ORGANIZATION` environment variable.");
|
|
238
|
+
}
|
|
239
|
+
const database = typeof opts.database === "string" ? opts.database : opts.database.name;
|
|
240
|
+
const branch = !opts.branch
|
|
241
|
+
? "main"
|
|
242
|
+
: typeof opts.branch === "string"
|
|
243
|
+
? opts.branch
|
|
244
|
+
: opts.branch.name;
|
|
245
|
+
const baseUrl = opts.baseUrl ?? "https://api.planetscale.com/v1";
|
|
246
|
+
const token = extractToken(opts);
|
|
247
|
+
return { organization, database, branch, baseUrl, token };
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Builds the multipart/form-data body for a change request that sets extensions.
|
|
251
|
+
*
|
|
252
|
+
* The API expects:
|
|
253
|
+
* - `_method=PATCH`
|
|
254
|
+
* - `queued=1` (for queue phase) or `update=1` (for apply phase)
|
|
255
|
+
* - `parameters[pgconf][shared_preload_libraries][]` repeated for each library
|
|
256
|
+
* - `parameters[pgconf][<param.name>]=<param.value>` for each config param
|
|
257
|
+
*
|
|
258
|
+
* @internal
|
|
259
|
+
*/
|
|
260
|
+
function buildExtensionFormData(desired, phase) {
|
|
261
|
+
const form = new FormData();
|
|
262
|
+
form.append("_method", "PATCH");
|
|
263
|
+
if (phase === "apply") {
|
|
264
|
+
form.append("update", "1");
|
|
265
|
+
return form;
|
|
266
|
+
}
|
|
267
|
+
// Queue phase — include all libraries and params
|
|
268
|
+
form.append("queued", "1");
|
|
269
|
+
const mappings = extensionsToParamMappings(desired);
|
|
270
|
+
// Always include base libraries
|
|
271
|
+
for (const lib of BASE_LIBRARIES) {
|
|
272
|
+
form.append("parameters[pgconf][shared_preload_libraries][]", lib);
|
|
273
|
+
}
|
|
274
|
+
// Include pginsights in base libraries if it has config, otherwise include as base
|
|
275
|
+
const hasPgInsights = mappings.has("pginsights");
|
|
276
|
+
if (!hasPgInsights) {
|
|
277
|
+
// pginsights is always loaded; if user didn't explicitly configure it, include with defaults off
|
|
278
|
+
form.append("parameters[pgconf][shared_preload_libraries][]", "pginsights");
|
|
279
|
+
form.append("parameters[pgconf][pginsights.raw_queries]", "off");
|
|
280
|
+
form.append("parameters[pgconf][pginsights.normalize_schema_names]", "off");
|
|
281
|
+
}
|
|
282
|
+
// Add user-requested extensions
|
|
283
|
+
for (const [library, params] of mappings) {
|
|
284
|
+
form.append("parameters[pgconf][shared_preload_libraries][]", library);
|
|
285
|
+
for (const [key, value] of Object.entries(params)) {
|
|
286
|
+
form.append(`parameters[pgconf][${key}]`, value);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return form;
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Updates the PostgreSQL extensions on a PlanetScale database branch.
|
|
293
|
+
*
|
|
294
|
+
* Uses the reverse-engineered two-phase change request API:
|
|
295
|
+
* 1. **Queue** — submits a change request with the desired extension config
|
|
296
|
+
* 2. **Apply** — triggers execution of the queued change
|
|
297
|
+
* 3. **Poll** — waits for the change to complete
|
|
298
|
+
*
|
|
299
|
+
* @param desired - The desired extension configuration. Extensions present are enabled;
|
|
300
|
+
* extensions absent are disabled.
|
|
301
|
+
* @param options - Connection and targeting options.
|
|
302
|
+
*
|
|
303
|
+
* @example
|
|
304
|
+
* ## Enable pgvector and pg_cron
|
|
305
|
+
*
|
|
306
|
+
* ```ts
|
|
307
|
+
* await updateExtensions(
|
|
308
|
+
* {
|
|
309
|
+
* vector: { hnswEfSearch: 100 },
|
|
310
|
+
* pgCron: {},
|
|
311
|
+
* },
|
|
312
|
+
* {
|
|
313
|
+
* organization: "my-org",
|
|
314
|
+
* database: "my-db",
|
|
315
|
+
* branch: "main",
|
|
316
|
+
* },
|
|
317
|
+
* );
|
|
318
|
+
* ```
|
|
319
|
+
*
|
|
320
|
+
* @example
|
|
321
|
+
* ## Disable all user extensions
|
|
322
|
+
*
|
|
323
|
+
* ```ts
|
|
324
|
+
* await updateExtensions({}, {
|
|
325
|
+
* organization: "my-org",
|
|
326
|
+
* database: "my-db",
|
|
327
|
+
* });
|
|
328
|
+
* ```
|
|
329
|
+
*/
|
|
330
|
+
export async function updateExtensions(desired, options) {
|
|
331
|
+
const { organization, database, branch, baseUrl, token } = resolveOptions(options);
|
|
332
|
+
const changesUrl = `${baseUrl}/organizations/${organization}/databases/${database}/branches/${branch}/changes`;
|
|
333
|
+
// Wait for any in-flight changes to complete before submitting ours
|
|
334
|
+
await waitForPendingChanges(changesUrl, token);
|
|
335
|
+
// Phase 1: Queue the change
|
|
336
|
+
const queueForm = buildExtensionFormData(desired, "queue");
|
|
337
|
+
const queueResponse = await fetch(changesUrl, {
|
|
338
|
+
method: "POST",
|
|
339
|
+
headers: {
|
|
340
|
+
Authorization: token,
|
|
341
|
+
},
|
|
342
|
+
body: queueForm,
|
|
343
|
+
});
|
|
344
|
+
if (!queueResponse.ok) {
|
|
345
|
+
const errorBody = await queueResponse.text();
|
|
346
|
+
throw new Error(`Failed to queue extension change (${queueResponse.status}): ${errorBody}`);
|
|
347
|
+
}
|
|
348
|
+
// Phase 2: Apply the change
|
|
349
|
+
const applyForm = buildExtensionFormData(desired, "apply");
|
|
350
|
+
const applyResponse = await fetch(changesUrl, {
|
|
351
|
+
method: "POST",
|
|
352
|
+
headers: {
|
|
353
|
+
Authorization: token,
|
|
354
|
+
},
|
|
355
|
+
body: applyForm,
|
|
356
|
+
});
|
|
357
|
+
if (!applyResponse.ok) {
|
|
358
|
+
const errorBody = await applyResponse.text();
|
|
359
|
+
throw new Error(`Failed to apply extension change (${applyResponse.status}): ${errorBody}`);
|
|
360
|
+
}
|
|
361
|
+
// Phase 3: Poll until the change is completed
|
|
362
|
+
await waitForPendingChanges(changesUrl, token);
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Polls the changes endpoint until all changes are completed or canceled.
|
|
366
|
+
* @internal
|
|
367
|
+
*/
|
|
368
|
+
async function waitForPendingChanges(changesUrl, token) {
|
|
369
|
+
await poll({
|
|
370
|
+
description: "extension changes to complete",
|
|
371
|
+
fn: async () => {
|
|
372
|
+
const response = await fetch(`${changesUrl}?per_page=1`, {
|
|
373
|
+
headers: { Authorization: token },
|
|
374
|
+
});
|
|
375
|
+
if (!response.ok) {
|
|
376
|
+
throw new Error(`Failed to poll change status (${response.status}): ${await response.text()}`);
|
|
377
|
+
}
|
|
378
|
+
const data = (await response.json());
|
|
379
|
+
return data;
|
|
380
|
+
},
|
|
381
|
+
predicate: (result) => {
|
|
382
|
+
if (result.data.length === 0)
|
|
383
|
+
return true;
|
|
384
|
+
const latest = result.data[0];
|
|
385
|
+
return latest.state === "completed" || latest.state === "canceled";
|
|
386
|
+
},
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
//# sourceMappingURL=database-extensions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-extensions.js","sourceRoot":"","sources":["../../src/planetscale/database-extensions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Context } from "../context.ts";
|
|
2
2
|
import type { PlanetScaleProps } from "./api.ts";
|
|
3
|
+
import { type DatabaseExtensions } from "./database-extensions.ts";
|
|
3
4
|
import { type PlanetScaleClusterSize } from "./utils.ts";
|
|
4
5
|
interface BaseDatabaseProps extends PlanetScaleProps {
|
|
5
6
|
/**
|
|
@@ -24,11 +25,15 @@ interface BaseDatabaseProps extends PlanetScaleProps {
|
|
|
24
25
|
*/
|
|
25
26
|
delete?: boolean;
|
|
26
27
|
/**
|
|
27
|
-
* The region where the database will be created (create only)
|
|
28
|
+
* The region where the database will be created (create only).
|
|
29
|
+
*
|
|
30
|
+
* @see https://planetscale.com/docs/concepts/regions
|
|
28
31
|
*/
|
|
29
32
|
region?: {
|
|
30
33
|
/**
|
|
31
|
-
* The slug identifier of the region
|
|
34
|
+
* The slug identifier of the region (e.g. "us-east", "eu-west", "gcp-us-central1")
|
|
35
|
+
*
|
|
36
|
+
* @see https://planetscale.com/docs/concepts/regions#available-regions
|
|
32
37
|
*/
|
|
33
38
|
slug: string;
|
|
34
39
|
};
|
|
@@ -106,6 +111,26 @@ interface PostgreSQLDatabaseProps extends BaseDatabaseProps {
|
|
|
106
111
|
* The CPU architecture for the database (PostgreSQL only)
|
|
107
112
|
*/
|
|
108
113
|
arch?: "x86" | "arm";
|
|
114
|
+
/**
|
|
115
|
+
* PostgreSQL extensions to enable on the default branch.
|
|
116
|
+
* Each key represents an extension — if present (even as `{}`), it is enabled with the given config or defaults.
|
|
117
|
+
* If absent, the extension is disabled. (PostgreSQL only)
|
|
118
|
+
*
|
|
119
|
+
* @example
|
|
120
|
+
* ```ts
|
|
121
|
+
* const db = await Database("my-pg-db", {
|
|
122
|
+
* kind: "postgresql",
|
|
123
|
+
* organization: "my-org",
|
|
124
|
+
* clusterSize: "PS_10",
|
|
125
|
+
* extensions: {
|
|
126
|
+
* vector: { hnswEfSearch: 100 },
|
|
127
|
+
* pgCron: {},
|
|
128
|
+
* pgStatStatements: { max: 10000 },
|
|
129
|
+
* },
|
|
130
|
+
* });
|
|
131
|
+
* ```
|
|
132
|
+
*/
|
|
133
|
+
extensions?: DatabaseExtensions;
|
|
109
134
|
}
|
|
110
135
|
/**
|
|
111
136
|
* Properties for creating or updating a PlanetScale Database
|
|
@@ -151,6 +176,19 @@ export type Database = DatabaseProps & {
|
|
|
151
176
|
* The organization of the database
|
|
152
177
|
*/
|
|
153
178
|
organization: string;
|
|
179
|
+
/**
|
|
180
|
+
* The region of the database as reported by PlanetScale.
|
|
181
|
+
*
|
|
182
|
+
* @see https://planetscale.com/docs/concepts/regions
|
|
183
|
+
*/
|
|
184
|
+
region: {
|
|
185
|
+
/**
|
|
186
|
+
* The slug identifier of the region (e.g. "us-east", "eu-west", "gcp-us-central1")
|
|
187
|
+
*
|
|
188
|
+
* @see https://planetscale.com/docs/concepts/regions#available-regions
|
|
189
|
+
*/
|
|
190
|
+
slug: string;
|
|
191
|
+
};
|
|
154
192
|
};
|
|
155
193
|
/**
|
|
156
194
|
* Create, manage and delete PlanetScale databases
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/planetscale/database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD,OAAO,EAEL,KAAK,sBAAsB,
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/planetscale/database.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Resource } from "../resource.js";
|
|
2
2
|
import { createPlanetScaleClient } from "./api.js";
|
|
3
|
-
import {
|
|
3
|
+
import { diffExtensions, updateExtensions, } from "./database-extensions.js";
|
|
4
|
+
import { ensureProductionBranchClusterSize, sanitizeClusterSize, waitForBranchReady, waitForDatabaseReady, } from "./utils.js";
|
|
4
5
|
/**
|
|
5
6
|
* Create, manage and delete PlanetScale databases
|
|
6
7
|
*
|
|
@@ -99,6 +100,38 @@ export const Database = Resource("planetscale::Database", async function (id, pr
|
|
|
99
100
|
cause: getResponse.error,
|
|
100
101
|
});
|
|
101
102
|
}
|
|
103
|
+
// Validate immutable properties match if specified
|
|
104
|
+
const actualKind = getResponse.data.kind;
|
|
105
|
+
if (props.kind && actualKind !== props.kind) {
|
|
106
|
+
throw new Error(`Database "${databaseName}" has kind "${actualKind}" but expected "${props.kind}". ` +
|
|
107
|
+
`Database kind cannot be changed after creation.`);
|
|
108
|
+
}
|
|
109
|
+
if (props.region) {
|
|
110
|
+
const actualSlug = getResponse.data.region.slug;
|
|
111
|
+
if (actualSlug !== props.region.slug) {
|
|
112
|
+
throw new Error(`Database "${databaseName}" is in region "${actualSlug}" but expected "${props.region.slug}". ` +
|
|
113
|
+
`PlanetScale database regions cannot be changed after creation. ` +
|
|
114
|
+
`Either update the region in your configuration to match, or create a new database in the correct region.`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (props.kind === "postgresql" && props.arch) {
|
|
118
|
+
const defaultBranch = props.defaultBranch || "main";
|
|
119
|
+
const branchInfo = await api.getBranch({
|
|
120
|
+
path: {
|
|
121
|
+
organization,
|
|
122
|
+
database: databaseName,
|
|
123
|
+
branch: defaultBranch,
|
|
124
|
+
},
|
|
125
|
+
throwOnError: false,
|
|
126
|
+
});
|
|
127
|
+
if (branchInfo.data?.cluster_architecture) {
|
|
128
|
+
const actualArch = branchInfo.data.cluster_architecture === "aarch64" ? "arm" : "x86";
|
|
129
|
+
if (actualArch !== props.arch) {
|
|
130
|
+
throw new Error(`Database "${databaseName}" has architecture "${actualArch}" but expected "${props.arch}". ` +
|
|
131
|
+
`Database architecture cannot be changed after creation.`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
102
135
|
// Update database settings
|
|
103
136
|
// If updating to a non-'main' default branch, create it first
|
|
104
137
|
if (props.defaultBranch && props.defaultBranch !== "main") {
|
|
@@ -150,6 +183,24 @@ export const Database = Resource("planetscale::Database", async function (id, pr
|
|
|
150
183
|
},
|
|
151
184
|
});
|
|
152
185
|
await ensureProductionBranchClusterSize(api, organization, databaseName, props.defaultBranch || "main", data.kind, clusterSize);
|
|
186
|
+
// Sync PostgreSQL extensions on update
|
|
187
|
+
if (props.kind === "postgresql") {
|
|
188
|
+
const previousExtensions = this.output?.kind === "postgresql"
|
|
189
|
+
? this.output.extensions
|
|
190
|
+
: undefined;
|
|
191
|
+
const desiredExtensions = props.extensions;
|
|
192
|
+
const diff = diffExtensions(previousExtensions, desiredExtensions);
|
|
193
|
+
if (diff.hasChanges) {
|
|
194
|
+
const branch = props.defaultBranch || "main";
|
|
195
|
+
await waitForBranchReady(api, organization, databaseName, branch);
|
|
196
|
+
await updateExtensions(desiredExtensions ?? {}, {
|
|
197
|
+
...props,
|
|
198
|
+
organization,
|
|
199
|
+
database: databaseName,
|
|
200
|
+
branch,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
153
204
|
return {
|
|
154
205
|
...props,
|
|
155
206
|
id: data.id,
|
|
@@ -161,6 +212,7 @@ export const Database = Resource("planetscale::Database", async function (id, pr
|
|
|
161
212
|
updatedAt: data.updated_at,
|
|
162
213
|
htmlUrl: data.html_url,
|
|
163
214
|
organization,
|
|
215
|
+
region: { slug: data.region.slug },
|
|
164
216
|
};
|
|
165
217
|
}
|
|
166
218
|
if (getResponse.data) {
|
|
@@ -241,6 +293,16 @@ export const Database = Resource("planetscale::Database", async function (id, pr
|
|
|
241
293
|
default_branch: props.defaultBranch,
|
|
242
294
|
},
|
|
243
295
|
});
|
|
296
|
+
// Enable PostgreSQL extensions on the new default branch
|
|
297
|
+
if (props.kind === "postgresql" && props.extensions) {
|
|
298
|
+
await waitForBranchReady(api, organization, databaseName, props.defaultBranch);
|
|
299
|
+
await updateExtensions(props.extensions, {
|
|
300
|
+
...props,
|
|
301
|
+
organization,
|
|
302
|
+
database: databaseName,
|
|
303
|
+
branch: props.defaultBranch,
|
|
304
|
+
});
|
|
305
|
+
}
|
|
244
306
|
return {
|
|
245
307
|
...props,
|
|
246
308
|
id: data.id,
|
|
@@ -252,9 +314,21 @@ export const Database = Resource("planetscale::Database", async function (id, pr
|
|
|
252
314
|
updatedAt: updatedData.updated_at,
|
|
253
315
|
htmlUrl: updatedData.html_url,
|
|
254
316
|
organization,
|
|
317
|
+
region: { slug: updatedData.region.slug },
|
|
255
318
|
};
|
|
256
319
|
}
|
|
257
320
|
}
|
|
321
|
+
// Enable PostgreSQL extensions on the default branch (main)
|
|
322
|
+
if (props.kind === "postgresql" && props.extensions) {
|
|
323
|
+
const branch = props.defaultBranch || "main";
|
|
324
|
+
await waitForBranchReady(api, organization, databaseName, branch);
|
|
325
|
+
await updateExtensions(props.extensions, {
|
|
326
|
+
...props,
|
|
327
|
+
organization,
|
|
328
|
+
database: databaseName,
|
|
329
|
+
branch,
|
|
330
|
+
});
|
|
331
|
+
}
|
|
258
332
|
return {
|
|
259
333
|
...props,
|
|
260
334
|
id: data.id,
|
|
@@ -266,6 +340,7 @@ export const Database = Resource("planetscale::Database", async function (id, pr
|
|
|
266
340
|
updatedAt: data.updated_at,
|
|
267
341
|
htmlUrl: data.html_url,
|
|
268
342
|
organization,
|
|
343
|
+
region: { slug: data.region.slug },
|
|
269
344
|
};
|
|
270
345
|
});
|
|
271
346
|
//# sourceMappingURL=database.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/planetscale/database.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EACL,iCAAiC,EAEjC,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/planetscale/database.ts"],"names":[],"mappings":"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"}
|