@alchemy.run/planetscale 0.0.0 → 2.0.0-beta.84
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/LICENSE +201 -0
- package/README.md +83 -4
- package/lib/AuthProvider.d.ts +64 -0
- package/lib/AuthProvider.d.ts.map +1 -0
- package/lib/AuthProvider.js +384 -0
- package/lib/AuthProvider.js.map +1 -0
- package/lib/Branch.d.ts +128 -0
- package/lib/Branch.d.ts.map +1 -0
- package/lib/Branch.js +420 -0
- package/lib/Branch.js.map +1 -0
- package/lib/Contributions.d.ts +7 -0
- package/lib/Contributions.d.ts.map +1 -0
- package/lib/Contributions.js +6 -0
- package/lib/Contributions.js.map +1 -0
- package/lib/Credentials.d.ts +33 -0
- package/lib/Credentials.d.ts.map +1 -0
- package/lib/Credentials.js +65 -0
- package/lib/Credentials.js.map +1 -0
- package/lib/Database.d.ts +138 -0
- package/lib/Database.d.ts.map +1 -0
- package/lib/Database.js +1 -0
- package/lib/Database.js.map +1 -0
- package/lib/MySQL/MySQLBranch.d.ts +87 -0
- package/lib/MySQL/MySQLBranch.d.ts.map +1 -0
- package/lib/MySQL/MySQLBranch.js +15 -0
- package/lib/MySQL/MySQLBranch.js.map +1 -0
- package/lib/MySQL/MySQLClusterSize.d.ts +32 -0
- package/lib/MySQL/MySQLClusterSize.d.ts.map +1 -0
- package/lib/MySQL/MySQLClusterSize.js +111 -0
- package/lib/MySQL/MySQLClusterSize.js.map +1 -0
- package/lib/MySQL/MySQLDatabase.d.ts +141 -0
- package/lib/MySQL/MySQLDatabase.d.ts.map +1 -0
- package/lib/MySQL/MySQLDatabase.js +294 -0
- package/lib/MySQL/MySQLDatabase.js.map +1 -0
- package/lib/MySQL/MySQLMigrations.d.ts +24 -0
- package/lib/MySQL/MySQLMigrations.d.ts.map +1 -0
- package/lib/MySQL/MySQLMigrations.js +106 -0
- package/lib/MySQL/MySQLMigrations.js.map +1 -0
- package/lib/MySQL/MySQLOrigin.d.ts +15 -0
- package/lib/MySQL/MySQLOrigin.d.ts.map +1 -0
- package/lib/MySQL/MySQLOrigin.js +2 -0
- package/lib/MySQL/MySQLOrigin.js.map +1 -0
- package/lib/MySQL/MySQLPassword.d.ts +116 -0
- package/lib/MySQL/MySQLPassword.d.ts.map +1 -0
- package/lib/MySQL/MySQLPassword.js +212 -0
- package/lib/MySQL/MySQLPassword.js.map +1 -0
- package/lib/MySQL/index.d.ts +6 -0
- package/lib/MySQL/index.d.ts.map +1 -0
- package/lib/MySQL/index.js +6 -0
- package/lib/MySQL/index.js.map +1 -0
- package/lib/OAuthClient.d.ts +32 -0
- package/lib/OAuthClient.d.ts.map +1 -0
- package/lib/OAuthClient.js +52 -0
- package/lib/OAuthClient.js.map +1 -0
- package/lib/Postgres/PostgresBranch.d.ts +75 -0
- package/lib/Postgres/PostgresBranch.d.ts.map +1 -0
- package/lib/Postgres/PostgresBranch.js +15 -0
- package/lib/Postgres/PostgresBranch.js.map +1 -0
- package/lib/Postgres/PostgresClusterSize.d.ts +77 -0
- package/lib/Postgres/PostgresClusterSize.d.ts.map +1 -0
- package/lib/Postgres/PostgresClusterSize.js +89 -0
- package/lib/Postgres/PostgresClusterSize.js.map +1 -0
- package/lib/Postgres/PostgresDatabase.d.ts +95 -0
- package/lib/Postgres/PostgresDatabase.d.ts.map +1 -0
- package/lib/Postgres/PostgresDatabase.js +294 -0
- package/lib/Postgres/PostgresDatabase.js.map +1 -0
- package/lib/Postgres/PostgresDefaultRole.d.ts +94 -0
- package/lib/Postgres/PostgresDefaultRole.d.ts.map +1 -0
- package/lib/Postgres/PostgresDefaultRole.js +187 -0
- package/lib/Postgres/PostgresDefaultRole.js.map +1 -0
- package/lib/Postgres/PostgresMigrations.d.ts +24 -0
- package/lib/Postgres/PostgresMigrations.d.ts.map +1 -0
- package/lib/Postgres/PostgresMigrations.js +116 -0
- package/lib/Postgres/PostgresMigrations.js.map +1 -0
- package/lib/Postgres/PostgresOrigin.d.ts +15 -0
- package/lib/Postgres/PostgresOrigin.d.ts.map +1 -0
- package/lib/Postgres/PostgresOrigin.js +2 -0
- package/lib/Postgres/PostgresOrigin.js.map +1 -0
- package/lib/Postgres/PostgresRole.d.ts +142 -0
- package/lib/Postgres/PostgresRole.d.ts.map +1 -0
- package/lib/Postgres/PostgresRole.js +268 -0
- package/lib/Postgres/PostgresRole.js.map +1 -0
- package/lib/Postgres/index.d.ts +7 -0
- package/lib/Postgres/index.d.ts.map +1 -0
- package/lib/Postgres/index.js +7 -0
- package/lib/Postgres/index.js.map +1 -0
- package/lib/Providers.d.ts +24 -0
- package/lib/Providers.d.ts.map +1 -0
- package/lib/Providers.js +40 -0
- package/lib/Providers.js.map +1 -0
- package/lib/Util.d.ts +93 -0
- package/lib/Util.d.ts.map +1 -0
- package/lib/Util.js +135 -0
- package/lib/Util.js.map +1 -0
- package/lib/index.d.ts +9 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +9 -0
- package/lib/index.js.map +1 -0
- package/package.json +79 -3
- package/src/AuthProvider.ts +571 -0
- package/src/Branch.ts +657 -0
- package/src/Contributions.ts +9 -0
- package/src/Credentials.ts +116 -0
- package/src/Database.ts +152 -0
- package/src/MySQL/MySQLBranch.ts +109 -0
- package/src/MySQL/MySQLClusterSize.ts +185 -0
- package/src/MySQL/MySQLDatabase.ts +521 -0
- package/src/MySQL/MySQLMigrations.ts +182 -0
- package/src/MySQL/MySQLOrigin.ts +15 -0
- package/src/MySQL/MySQLPassword.ts +428 -0
- package/src/MySQL/index.ts +5 -0
- package/src/OAuthClient.ts +59 -0
- package/src/Postgres/PostgresBranch.ts +97 -0
- package/src/Postgres/PostgresClusterSize.ts +262 -0
- package/src/Postgres/PostgresDatabase.ts +469 -0
- package/src/Postgres/PostgresDefaultRole.ts +340 -0
- package/src/Postgres/PostgresMigrations.ts +193 -0
- package/src/Postgres/PostgresOrigin.ts +15 -0
- package/src/Postgres/PostgresRole.ts +547 -0
- package/src/Postgres/index.ts +6 -0
- package/src/Providers.ts +67 -0
- package/src/Util.ts +205 -0
- package/src/index.ts +14 -0
package/lib/Branch.js
ADDED
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
import { classifyMigrationHistory, describeRewrittenHistory, migrationsAttrs, migrationsInputOf, RewrittenMigrationHistoryError, stampedOf, } from "@alchemy.run/sql/Migrations";
|
|
2
|
+
import { hashImports } from "@alchemy.run/sql/SqlFile";
|
|
3
|
+
import * as planetscale from "@distilled.cloud/planetscale";
|
|
4
|
+
import { Credentials } from "@distilled.cloud/planetscale/Credentials";
|
|
5
|
+
import { Unowned } from "alchemy/AdoptPolicy";
|
|
6
|
+
import { havePropsChanged, isResolved } from "alchemy/Diff";
|
|
7
|
+
import { createPhysicalName } from "alchemy/PhysicalName";
|
|
8
|
+
import * as Provider from "alchemy/Provider";
|
|
9
|
+
import { recordsEqual } from "alchemy/Util/equal";
|
|
10
|
+
import * as Effect from "effect/Effect";
|
|
11
|
+
import * as Schedule from "effect/Schedule";
|
|
12
|
+
import * as Stream from "effect/Stream";
|
|
13
|
+
import { ensureMySQLProductionBranchClusterSize } from "./MySQL/MySQLClusterSize.js";
|
|
14
|
+
import { ensurePostgresProductionBranchClusterSize, toPostgresClusterArch, toPostgresClusterSku, waitForPendingPostgresChanges, } from "./Postgres/PostgresClusterSize.js";
|
|
15
|
+
import { PlanetscaleConflict, isKnownError, waitForBranchReady } from "./Util.js";
|
|
16
|
+
const resolveDatabase = (database) => {
|
|
17
|
+
const ref = database;
|
|
18
|
+
if (!ref)
|
|
19
|
+
return { name: "" };
|
|
20
|
+
return typeof ref === "string"
|
|
21
|
+
? { name: ref }
|
|
22
|
+
: { name: ref.name, organization: ref.organization };
|
|
23
|
+
};
|
|
24
|
+
const resolveParent = (parent) => {
|
|
25
|
+
const ref = parent;
|
|
26
|
+
return !ref ? "main" : typeof ref === "string" ? ref : ref.name;
|
|
27
|
+
};
|
|
28
|
+
const createBranchName = (id, name) => Effect.gen(function* () {
|
|
29
|
+
return name ?? (yield* createPhysicalName({ id, lowercase: true, maxLength: 63 }));
|
|
30
|
+
});
|
|
31
|
+
const rootDir = Effect.sync(() => process.cwd());
|
|
32
|
+
/**
|
|
33
|
+
* Matches the UnprocessableEntity errors PlanetScale returns when a
|
|
34
|
+
* branch promotion/demotion races an in-flight cluster resize, e.g.
|
|
35
|
+
* "Branches with a cluster resize in progress cannot be demoted."
|
|
36
|
+
*/
|
|
37
|
+
const isResizeInProgress = (error) => typeof error === "object" &&
|
|
38
|
+
error !== null &&
|
|
39
|
+
error._tag === "UnprocessableEntity" &&
|
|
40
|
+
typeof error.message === "string" &&
|
|
41
|
+
error.message.includes("cluster resize in progress");
|
|
42
|
+
/**
|
|
43
|
+
* Build a branch provider for a specific PlanetScale engine. The
|
|
44
|
+
* caller supplies the typed `Resource` token and the engine's migration
|
|
45
|
+
* runners; everything else (observe / ensure / sync / delete) is shared.
|
|
46
|
+
*/
|
|
47
|
+
export const makeBranchProvider = (opts) => Provider.succeed(opts.resource, {
|
|
48
|
+
stables: ["organization", "database"],
|
|
49
|
+
// PARENT FAN-OUT: PlanetScale branches are nested under a database within
|
|
50
|
+
// an organization, so there is no flat per-org branch enumeration API.
|
|
51
|
+
// Enumerate every database in the credentialed org, then list each
|
|
52
|
+
// database's branches concurrently (bounded), exhaustively paginating
|
|
53
|
+
// both levels, and keep only the branches whose engine kind matches this
|
|
54
|
+
// resource. Each item is hydrated into the exact `read` Attributes shape.
|
|
55
|
+
list: Effect.fn(function* () {
|
|
56
|
+
const { organization } = yield* yield* Credentials;
|
|
57
|
+
const databases = yield* planetscale.listDatabases.pages({ organization }).pipe(Stream.runCollect, Effect.map((chunk) => Array.from(chunk).flatMap((page) => page.data)));
|
|
58
|
+
const rows = yield* Effect.forEach(databases, (db) => planetscale.listBranches.pages({ organization, database: db.name }).pipe(Stream.runCollect, Effect.map((chunk) => Array.from(chunk).flatMap((page) => page.data
|
|
59
|
+
.filter((branch) => branch.kind === opts.expectedKind)
|
|
60
|
+
.map((branch) => ({
|
|
61
|
+
name: branch.name,
|
|
62
|
+
organization,
|
|
63
|
+
database: db.name,
|
|
64
|
+
parentBranch: branch.parent_branch ?? "main",
|
|
65
|
+
production: branch.production,
|
|
66
|
+
createdAt: branch.created_at,
|
|
67
|
+
updatedAt: branch.updated_at,
|
|
68
|
+
htmlUrl: branch.html_url,
|
|
69
|
+
region: { slug: branch.region.slug },
|
|
70
|
+
migrationsDir: undefined,
|
|
71
|
+
migrationsTable: undefined,
|
|
72
|
+
migrationsHashes: {},
|
|
73
|
+
importHashes: {},
|
|
74
|
+
desiredReplicas: undefined,
|
|
75
|
+
hasReplicas: branch.has_replicas,
|
|
76
|
+
hasReadOnlyReplicas: branch.has_read_only_replicas,
|
|
77
|
+
})))),
|
|
78
|
+
// A database can be deleted between enumeration and the
|
|
79
|
+
// per-database branch list — skip it rather than fail.
|
|
80
|
+
Effect.catchTag("NotFound", () => Effect.succeed([]))), { concurrency: 10 });
|
|
81
|
+
return rows.flat();
|
|
82
|
+
}),
|
|
83
|
+
diff: Effect.fn(function* ({ news, olds, output }) {
|
|
84
|
+
if (!isResolved(news))
|
|
85
|
+
return undefined;
|
|
86
|
+
// Branch names are rename-mutable (reconcile syncs `news.name` in
|
|
87
|
+
// place), so `name` cannot live in the provider-level stables. But
|
|
88
|
+
// almost no update is a rename — for those, advertise `name` as
|
|
89
|
+
// stable on the update so downstream consumers referencing this
|
|
90
|
+
// branch still resolve `branch.name` at plan time. Without it, a
|
|
91
|
+
// metadata-only update (e.g. an embedded database ref whose
|
|
92
|
+
// `migrationsHashes` moved) resolves consumer refs to just
|
|
93
|
+
// `{ organization, database }`, and identity-sensitive consumers
|
|
94
|
+
// (PostgresRole) falsely plan a replacement against `name: undefined`.
|
|
95
|
+
//
|
|
96
|
+
// The name only changes when the `name` prop itself changes: an
|
|
97
|
+
// explicit name renames iff it differs from the observed name, and
|
|
98
|
+
// an omitted name is engine-generated deterministically (stable
|
|
99
|
+
// across updates — the instance id only rotates on replacement).
|
|
100
|
+
const nameIsStable = output?.name !== undefined &&
|
|
101
|
+
(news.name !== undefined ? news.name === output.name : olds?.name === undefined);
|
|
102
|
+
const stables = nameIsStable ? ["organization", "database", "name"] : undefined;
|
|
103
|
+
const newDb = resolveDatabase(news.database).name;
|
|
104
|
+
const oldDbRef = output?.database ?? olds.database;
|
|
105
|
+
if (oldDbRef) {
|
|
106
|
+
const oldDb = resolveDatabase(oldDbRef).name;
|
|
107
|
+
if (newDb !== oldDb) {
|
|
108
|
+
return { action: "replace" };
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const newParent = resolveParent(news.parentBranch);
|
|
112
|
+
const oldParent = output?.parentBranch ?? resolveParent(olds.parentBranch);
|
|
113
|
+
if (newParent !== oldParent) {
|
|
114
|
+
return { action: "replace" };
|
|
115
|
+
}
|
|
116
|
+
if (news.region?.slug && output?.region?.slug && news.region.slug !== output.region.slug) {
|
|
117
|
+
return { action: "replace" };
|
|
118
|
+
}
|
|
119
|
+
if (news.replicas !== undefined) {
|
|
120
|
+
if (output?.desiredReplicas !== news.replicas) {
|
|
121
|
+
return { action: "update", stables };
|
|
122
|
+
}
|
|
123
|
+
const desiredHasReplicas = news.replicas > 0;
|
|
124
|
+
if (output?.hasReplicas !== undefined && output.hasReplicas !== desiredHasReplicas) {
|
|
125
|
+
return { action: "update", stables };
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const migrationChange = yield* classifyMigrationHistory({
|
|
129
|
+
news,
|
|
130
|
+
output,
|
|
131
|
+
});
|
|
132
|
+
if (migrationChange.kind === "rewritten") {
|
|
133
|
+
// Editing or deleting an already-applied file cannot be replayed
|
|
134
|
+
// in place (apply is name-keyed). Development branches re-fork
|
|
135
|
+
// from the parent and apply from scratch; production must add a
|
|
136
|
+
// forward migration instead.
|
|
137
|
+
const production = output?.production === true || news.isProduction === true;
|
|
138
|
+
if (production) {
|
|
139
|
+
return yield* new RewrittenMigrationHistoryError({
|
|
140
|
+
changed: migrationChange.changed,
|
|
141
|
+
removed: migrationChange.removed,
|
|
142
|
+
message: `Cannot rewrite applied migration history on production PlanetScale branch ` +
|
|
143
|
+
`"${output?.name ?? news.name ?? "unknown"}" ` +
|
|
144
|
+
`(${describeRewrittenHistory(migrationChange)}). ` +
|
|
145
|
+
"Add a new forward migration instead of editing or deleting already-applied files.",
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
return { action: "replace" };
|
|
149
|
+
}
|
|
150
|
+
if (migrationChange.kind === "pending") {
|
|
151
|
+
return { action: "update", stables };
|
|
152
|
+
}
|
|
153
|
+
if (news.importFiles?.length) {
|
|
154
|
+
const newHashes = yield* hashImports(news.importFiles, yield* rootDir);
|
|
155
|
+
if (!recordsEqual(newHashes, output?.importHashes ?? {})) {
|
|
156
|
+
return { action: "update", stables };
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Remaining prop changes (rename, safeMigrations, clusterSize,
|
|
160
|
+
// metadata embedded in resource refs) are all in-place updates.
|
|
161
|
+
// Decide them here instead of falling back to the engine's default
|
|
162
|
+
// deep-compare so the conditional `name` stable above is attached —
|
|
163
|
+
// the default path uses the provider-level stables, which strip
|
|
164
|
+
// `name` from downstream plan resolution.
|
|
165
|
+
if (havePropsChanged(olds, news)) {
|
|
166
|
+
return { action: "update", stables };
|
|
167
|
+
}
|
|
168
|
+
// Nothing changed. Still advertise the conditional `name` stable so
|
|
169
|
+
// a `--force` deploy (which upgrades this noop to an update) keeps
|
|
170
|
+
// `name` resolvable downstream instead of falsely replacing
|
|
171
|
+
// consumers such as roles and passwords (#1832).
|
|
172
|
+
return stables ? { action: "noop", stables } : undefined;
|
|
173
|
+
}),
|
|
174
|
+
read: Effect.fn(function* ({ id, olds, output }) {
|
|
175
|
+
// If we have neither a cached output nor a usable `olds.database`
|
|
176
|
+
// there's no way to identify which branch to refresh — most often
|
|
177
|
+
// this is destroy of a partially-created resource whose props
|
|
178
|
+
// never got fully persisted. Return `undefined` so the engine
|
|
179
|
+
// treats it as already-gone and drops the state entry.
|
|
180
|
+
if (!output && !olds?.database) {
|
|
181
|
+
return undefined;
|
|
182
|
+
}
|
|
183
|
+
const dbInfo = output
|
|
184
|
+
? { name: output.database, organization: output.organization }
|
|
185
|
+
: resolveDatabase(olds.database);
|
|
186
|
+
const { organization: envOrg } = yield* yield* Credentials;
|
|
187
|
+
const organization = output?.organization ?? dbInfo.organization ?? envOrg;
|
|
188
|
+
const databaseName = output?.database ?? dbInfo.name;
|
|
189
|
+
const branchName = output?.name ?? (yield* createBranchName(id, olds.name));
|
|
190
|
+
return yield* planetscale
|
|
191
|
+
.getBranch({
|
|
192
|
+
organization,
|
|
193
|
+
database: databaseName,
|
|
194
|
+
branch: branchName,
|
|
195
|
+
})
|
|
196
|
+
.pipe(Effect.map((data) => {
|
|
197
|
+
const attrs = {
|
|
198
|
+
name: data.name,
|
|
199
|
+
organization,
|
|
200
|
+
database: databaseName,
|
|
201
|
+
parentBranch: data.parent_branch ?? "main",
|
|
202
|
+
production: data.production,
|
|
203
|
+
createdAt: data.created_at,
|
|
204
|
+
// PlanetScale bumps `updated_at` asynchronously (e.g. seconds
|
|
205
|
+
// after a deploy, on role creation, maintenance) without any
|
|
206
|
+
// config change, so the observed value is volatile. Keep the
|
|
207
|
+
// value recorded by the last reconcile so drift detection only
|
|
208
|
+
// flags real configuration changes (#1955).
|
|
209
|
+
updatedAt: output?.updatedAt ?? data.updated_at,
|
|
210
|
+
htmlUrl: data.html_url,
|
|
211
|
+
region: { slug: data.region.slug },
|
|
212
|
+
migrationsDir: output?.migrationsDir ?? olds?.migrationsDir,
|
|
213
|
+
migrationsTable: output?.migrationsTable ?? olds?.migrationsTable,
|
|
214
|
+
migrationsHashes: output?.migrationsHashes ?? {},
|
|
215
|
+
importHashes: output?.importHashes ?? {},
|
|
216
|
+
desiredReplicas: output?.desiredReplicas ?? olds?.desiredReplicas ?? olds?.replicas,
|
|
217
|
+
hasReplicas: data.has_replicas,
|
|
218
|
+
hasReadOnlyReplicas: data.has_read_only_replicas,
|
|
219
|
+
};
|
|
220
|
+
return output ? attrs : Unowned(attrs);
|
|
221
|
+
}), Effect.catchTag("NotFound", () => Effect.succeed(undefined)));
|
|
222
|
+
}),
|
|
223
|
+
reconcile: Effect.fn(function* ({ id, news, output, session }) {
|
|
224
|
+
const { organization: envOrg } = yield* yield* Credentials;
|
|
225
|
+
const dbInfo = resolveDatabase(news.database);
|
|
226
|
+
const organization = output?.organization ?? dbInfo.organization ?? envOrg;
|
|
227
|
+
const databaseName = output?.database ?? dbInfo.name;
|
|
228
|
+
const desiredBranchName = yield* createBranchName(id, news.name);
|
|
229
|
+
const observedBranchName = output?.name ?? desiredBranchName;
|
|
230
|
+
const parentBranchName = resolveParent(news.parentBranch);
|
|
231
|
+
// If parentBranch is a plain string (an unmanaged branch reference),
|
|
232
|
+
// wait for it to be ready before we touch the child branch. When it
|
|
233
|
+
// is a Branch resource, Alchemy's resource graph already guarantees
|
|
234
|
+
// readiness before this resource's inputs are resolved.
|
|
235
|
+
if (news.parentBranch && typeof news.parentBranch === "string") {
|
|
236
|
+
yield* waitForBranchReady(organization, databaseName, parentBranchName, session);
|
|
237
|
+
}
|
|
238
|
+
// Observe — fetch the live branch state.
|
|
239
|
+
let current = yield* planetscale
|
|
240
|
+
.getBranch({
|
|
241
|
+
organization,
|
|
242
|
+
database: databaseName,
|
|
243
|
+
branch: observedBranchName,
|
|
244
|
+
})
|
|
245
|
+
.pipe(Effect.catchTag("NotFound", () => Effect.succeed(undefined)));
|
|
246
|
+
// Ensure — if missing, create. The parent must be ready before
|
|
247
|
+
// the child can fork from it. PostgreSQL short cluster sizes need
|
|
248
|
+
// to be expanded against the parent's region so the API call lands
|
|
249
|
+
// with a valid sku.
|
|
250
|
+
if (!current) {
|
|
251
|
+
const parent = yield* waitForBranchReady(organization, databaseName, parentBranchName, session);
|
|
252
|
+
const parentClusterSize = news.clusterSize
|
|
253
|
+
? parent.kind === "postgresql"
|
|
254
|
+
? toPostgresClusterSku({
|
|
255
|
+
size: news.clusterSize,
|
|
256
|
+
arch: toPostgresClusterArch(parent.cluster_architecture),
|
|
257
|
+
region: parent.region.slug,
|
|
258
|
+
})
|
|
259
|
+
: news.clusterSize
|
|
260
|
+
: undefined;
|
|
261
|
+
yield* session.note("Creating branch...");
|
|
262
|
+
current = yield* planetscale.createBranch({
|
|
263
|
+
organization,
|
|
264
|
+
database: databaseName,
|
|
265
|
+
name: desiredBranchName,
|
|
266
|
+
parent_branch: parentBranchName,
|
|
267
|
+
backup_id: news.backupId,
|
|
268
|
+
seed_data: news.seedData,
|
|
269
|
+
region: news.region?.slug,
|
|
270
|
+
cluster_size: parentClusterSize,
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
if (current.kind !== opts.expectedKind) {
|
|
274
|
+
return yield* new PlanetscaleConflict({
|
|
275
|
+
message: `Planetscale branch "${current.name}" (database "${databaseName}") has kind ` +
|
|
276
|
+
`"${current.kind}" but this resource is a ${opts.engineLabel}. ` +
|
|
277
|
+
`Use the matching ${current.kind === "mysql" ? "MySQLBranch" : "PostgresBranch"} ` +
|
|
278
|
+
`resource instead.`,
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
yield* waitForBranchReady(organization, databaseName, current.name, session);
|
|
282
|
+
// Sync name — branch names are mutable. Continue subsequent syncs
|
|
283
|
+
// under the name returned by the API.
|
|
284
|
+
if (current.name !== desiredBranchName) {
|
|
285
|
+
current = yield* planetscale.updateBranch({
|
|
286
|
+
organization,
|
|
287
|
+
database: databaseName,
|
|
288
|
+
branch: current.name,
|
|
289
|
+
new_name: desiredBranchName,
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
const branchName = current.name;
|
|
293
|
+
// Sync production status before branch settings that depend on it.
|
|
294
|
+
// PlanetScale only supports explicit branch promotion/demotion for MySQL.
|
|
295
|
+
if (opts.expectedKind === "mysql") {
|
|
296
|
+
const desiredProduction = news.isProduction ?? false;
|
|
297
|
+
if (current.production !== desiredProduction) {
|
|
298
|
+
// A keyspace can report `resizing: false` while the resize
|
|
299
|
+
// workflow is still finalizing, during which promote/demote is
|
|
300
|
+
// rejected with an UnprocessableEntity. Retry until it clears.
|
|
301
|
+
const retryWhileResizing = Effect.retry({
|
|
302
|
+
while: isResizeInProgress,
|
|
303
|
+
schedule: Schedule.max([Schedule.spaced("5 seconds"), Schedule.recurs(120)]),
|
|
304
|
+
});
|
|
305
|
+
current = desiredProduction
|
|
306
|
+
? yield* planetscale
|
|
307
|
+
.promoteBranch({
|
|
308
|
+
organization,
|
|
309
|
+
database: databaseName,
|
|
310
|
+
branch: branchName,
|
|
311
|
+
})
|
|
312
|
+
.pipe(retryWhileResizing)
|
|
313
|
+
: yield* planetscale
|
|
314
|
+
.demoteBranch({
|
|
315
|
+
organization,
|
|
316
|
+
database: databaseName,
|
|
317
|
+
branch: branchName,
|
|
318
|
+
})
|
|
319
|
+
.pipe(retryWhileResizing);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
// Sync safeMigrations — observed via `current.safe_migrations`,
|
|
323
|
+
// skip the API call entirely on no-op.
|
|
324
|
+
if (news.safeMigrations !== undefined && current.safe_migrations !== news.safeMigrations) {
|
|
325
|
+
if (news.safeMigrations) {
|
|
326
|
+
yield* planetscale.enableSafeMigrations({
|
|
327
|
+
organization,
|
|
328
|
+
database: databaseName,
|
|
329
|
+
branch: branchName,
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
yield* planetscale.disableSafeMigrations({
|
|
334
|
+
organization,
|
|
335
|
+
database: databaseName,
|
|
336
|
+
branch: branchName,
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
if (opts.expectedKind === "postgresql" && news.replicas !== undefined) {
|
|
341
|
+
const desiredReplicas = news.replicas;
|
|
342
|
+
const desiredHasReplicas = desiredReplicas > 0;
|
|
343
|
+
const shouldApplyReplicaChange = current.has_replicas !== desiredHasReplicas ||
|
|
344
|
+
(desiredHasReplicas && output?.desiredReplicas !== desiredReplicas);
|
|
345
|
+
if (shouldApplyReplicaChange) {
|
|
346
|
+
yield* waitForPendingPostgresChanges(organization, databaseName, branchName);
|
|
347
|
+
const change = yield* planetscale.updateBranchChangeRequest({
|
|
348
|
+
organization,
|
|
349
|
+
database: databaseName,
|
|
350
|
+
branch: branchName,
|
|
351
|
+
replicas: desiredReplicas,
|
|
352
|
+
});
|
|
353
|
+
yield* waitForPendingPostgresChanges(organization, databaseName, branchName, change.id);
|
|
354
|
+
current = yield* planetscale.getBranch({
|
|
355
|
+
organization,
|
|
356
|
+
database: databaseName,
|
|
357
|
+
branch: branchName,
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
// Sync clusterSize — only meaningful on production branches.
|
|
362
|
+
if (news.clusterSize) {
|
|
363
|
+
if (current.kind === "postgresql") {
|
|
364
|
+
yield* ensurePostgresProductionBranchClusterSize(organization, databaseName, branchName, news.clusterSize);
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
yield* ensureMySQLProductionBranchClusterSize(organization, databaseName, branchName, news.clusterSize);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
// Re-read so the returned attributes reflect any mutation.
|
|
371
|
+
const updated = yield* planetscale.getBranch({
|
|
372
|
+
organization,
|
|
373
|
+
database: databaseName,
|
|
374
|
+
branch: branchName,
|
|
375
|
+
});
|
|
376
|
+
const migrationTarget = {
|
|
377
|
+
organization,
|
|
378
|
+
database: databaseName,
|
|
379
|
+
branch: updated.name,
|
|
380
|
+
};
|
|
381
|
+
const migrationsInput = migrationsInputOf(news);
|
|
382
|
+
const migrations = migrationsInput
|
|
383
|
+
? yield* opts.runners.runMigrations(migrationTarget, migrationsInput, stampedOf(output))
|
|
384
|
+
: undefined;
|
|
385
|
+
const importHashes = news.importFiles?.length
|
|
386
|
+
? yield* opts.runners.runImports(migrationTarget, news.importFiles, yield* rootDir, output?.importHashes ?? {})
|
|
387
|
+
: {};
|
|
388
|
+
return {
|
|
389
|
+
name: updated.name,
|
|
390
|
+
organization,
|
|
391
|
+
database: databaseName,
|
|
392
|
+
parentBranch: updated.parent_branch ?? parentBranchName,
|
|
393
|
+
production: updated.production,
|
|
394
|
+
createdAt: updated.created_at,
|
|
395
|
+
updatedAt: updated.updated_at,
|
|
396
|
+
htmlUrl: updated.html_url,
|
|
397
|
+
region: { slug: updated.region.slug },
|
|
398
|
+
...migrationsAttrs({ input: migrationsInput, run: migrations, output }),
|
|
399
|
+
importHashes,
|
|
400
|
+
desiredReplicas: news.replicas ?? output?.desiredReplicas,
|
|
401
|
+
hasReplicas: updated.has_replicas,
|
|
402
|
+
hasReadOnlyReplicas: updated.has_read_only_replicas,
|
|
403
|
+
};
|
|
404
|
+
}),
|
|
405
|
+
delete: Effect.fn(function* ({ output }) {
|
|
406
|
+
// If `read` returned undefined (e.g. destroy of a partially-
|
|
407
|
+
// created branch whose props never finished persisting), there
|
|
408
|
+
// is nothing addressable to delete. Drop the state entry.
|
|
409
|
+
if (!output)
|
|
410
|
+
return;
|
|
411
|
+
yield* planetscale
|
|
412
|
+
.deleteBranch({
|
|
413
|
+
organization: output.organization,
|
|
414
|
+
database: output.database,
|
|
415
|
+
branch: output.name,
|
|
416
|
+
})
|
|
417
|
+
.pipe(Effect.catchTag("NotFound", () => Effect.void), Effect.catchIf(isKnownError("UnprocessableEntity", "The default branch cannot be deleted."), () => Effect.void));
|
|
418
|
+
}),
|
|
419
|
+
});
|
|
420
|
+
//# sourceMappingURL=Branch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Branch.js","sourceRoot":"","sources":["../src/Branch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as Contributions from "alchemy/Contributions";
|
|
2
|
+
declare const _default: {
|
|
3
|
+
readonly name: "planetscale";
|
|
4
|
+
readonly auth: Contributions.Lazy<import("effect/Layer").Layer<never, never, import("alchemy/Auth/AuthProvider").AuthProviders | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("effect/Crypto").Crypto | import("effect/FileSystem").FileSystem | import("effect/Path").Path>>;
|
|
5
|
+
};
|
|
6
|
+
export default _default;
|
|
7
|
+
//# sourceMappingURL=Contributions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Contributions.d.ts","sourceRoot":"","sources":["../src/Contributions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,aAAa,MAAM,uBAAuB,CAAC;;;;;AAEvD,wBAMG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Contributions.js","sourceRoot":"","sources":["../src/Contributions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,aAAa,MAAM,uBAAuB,CAAC;AAEvD,eAAe,aAAa,CAAC,IAAI,CAAC;IAChC,IAAI,EAAE,aAAa;IACnB,IAAI,EAAE,aAAa,CAAC,IAAI,CACtB,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,EACjC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,eAAe,CACnC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Credentials } from "@distilled.cloud/planetscale/Credentials";
|
|
2
|
+
import * as Config from "effect/Config";
|
|
3
|
+
import * as Layer from "effect/Layer";
|
|
4
|
+
import * as Redacted from "effect/Redacted";
|
|
5
|
+
export { Credentials, CredentialsFromEnv, DEFAULT_API_BASE_URL, } from "@distilled.cloud/planetscale/Credentials";
|
|
6
|
+
/**
|
|
7
|
+
* Build a PlanetScale `Credentials` Layer from an explicit token. Useful for
|
|
8
|
+
* tests or when the caller already has credentials in hand.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* Effect.provide(
|
|
13
|
+
* Planetscale.fromToken({
|
|
14
|
+
* tokenId: "abcd1234",
|
|
15
|
+
* token: "api-token-secret",
|
|
16
|
+
* organization: "my-org",
|
|
17
|
+
* }),
|
|
18
|
+
* )
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare const fromToken: (input: {
|
|
22
|
+
tokenId: string | Redacted.Redacted<string>;
|
|
23
|
+
token: string | Redacted.Redacted<string>;
|
|
24
|
+
organization: string;
|
|
25
|
+
apiBaseUrl?: string;
|
|
26
|
+
}) => Layer.Layer<Credentials, never, never>;
|
|
27
|
+
/**
|
|
28
|
+
* Build a PlanetScale `Credentials` Layer that resolves credentials via the
|
|
29
|
+
* Alchemy AuthProvider using the configured profile (defaults to "default",
|
|
30
|
+
* selected by the current Alchemy profile).
|
|
31
|
+
*/
|
|
32
|
+
export declare const fromAuthProvider: () => Layer.Layer<Credentials, Config.ConfigError, import("alchemy/Auth/AuthProvider").AuthProviders | import("alchemy/Auth/Profile").ProfileStore>;
|
|
33
|
+
//# sourceMappingURL=Credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Credentials.d.ts","sourceRoot":"","sources":["../src/Credentials.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,WAAW,EAEZ,MAAM,0CAA0C,CAAC;AAOlD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAO5C,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,0CAA0C,CAAC;AAElD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,SAAS,UAAW;IAC/B,OAAO,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5C,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,2CASE,CAAC;AAEJ;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,qJAmD1B,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { ConfigError } from "@distilled.cloud/core/errors";
|
|
2
|
+
import { Credentials, DEFAULT_API_BASE_URL, } from "@distilled.cloud/planetscale/Credentials";
|
|
3
|
+
import * as CredentialsCache from "alchemy/Auth/CredentialsCache";
|
|
4
|
+
import { deferUntilFirstUse, orDieCredentialsUnavailable, resolveProviderConfig, } from "alchemy/Auth/Resolve";
|
|
5
|
+
import * as Config from "effect/Config";
|
|
6
|
+
import * as Effect from "effect/Effect";
|
|
7
|
+
import * as Layer from "effect/Layer";
|
|
8
|
+
import * as Redacted from "effect/Redacted";
|
|
9
|
+
import { PLANETSCALE_AUTH_PROVIDER_NAME, } from "./AuthProvider.js";
|
|
10
|
+
export { Credentials, CredentialsFromEnv, DEFAULT_API_BASE_URL, } from "@distilled.cloud/planetscale/Credentials";
|
|
11
|
+
/**
|
|
12
|
+
* Build a PlanetScale `Credentials` Layer from an explicit token. Useful for
|
|
13
|
+
* tests or when the caller already has credentials in hand.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* Effect.provide(
|
|
18
|
+
* Planetscale.fromToken({
|
|
19
|
+
* tokenId: "abcd1234",
|
|
20
|
+
* token: "api-token-secret",
|
|
21
|
+
* organization: "my-org",
|
|
22
|
+
* }),
|
|
23
|
+
* )
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export const fromToken = (input) => Layer.succeed(Credentials, Effect.succeed({
|
|
27
|
+
tokenId: typeof input.tokenId === "string" ? Redacted.make(input.tokenId) : input.tokenId,
|
|
28
|
+
token: typeof input.token === "string" ? Redacted.make(input.token) : input.token,
|
|
29
|
+
organization: input.organization,
|
|
30
|
+
apiBaseUrl: input.apiBaseUrl ?? DEFAULT_API_BASE_URL,
|
|
31
|
+
}));
|
|
32
|
+
/**
|
|
33
|
+
* Build a PlanetScale `Credentials` Layer that resolves credentials via the
|
|
34
|
+
* Alchemy AuthProvider using the configured profile (defaults to "default",
|
|
35
|
+
* selected by the current Alchemy profile).
|
|
36
|
+
*/
|
|
37
|
+
export const fromAuthProvider = () => Layer.effect(Credentials, Effect.gen(function* () {
|
|
38
|
+
const apiBaseUrl = yield* Config.String("PLANETSCALE_API_BASE_URL").pipe(Config.withDefault(DEFAULT_API_BASE_URL));
|
|
39
|
+
// Defer profile lookup and credential resolution until first use, so
|
|
40
|
+
// building the provider layers never requires a configured profile.
|
|
41
|
+
const resolve = yield* resolveProviderConfig(PLANETSCALE_AUTH_PROVIDER_NAME).pipe(Effect.flatMap(({ profileName, resolve }) => Effect.mapError(resolve, (e) => ConfigError.make({
|
|
42
|
+
message: `Failed to resolve Planetscale credentials from ${profileName === undefined ? "the CI environment" : `profile '${profileName}'`}: ${e.message}`,
|
|
43
|
+
}))), deferUntilFirstUse);
|
|
44
|
+
// Cache until shortly before the OAuth token expires (service tokens
|
|
45
|
+
// never expire) so a long `alchemy dev` session re-resolves — and
|
|
46
|
+
// thereby refreshes — the token instead of keeping the first, by then
|
|
47
|
+
// dead, resolution forever. The cache wraps `resolve` (not the mapped
|
|
48
|
+
// client config) because the mapping drops the `expires` timestamp.
|
|
49
|
+
const cached = yield* CredentialsCache.cacheUntilExpiry(resolve, (creds) => creds.type === "oauth" ? creds.expires : undefined);
|
|
50
|
+
return cached.pipe(Effect.map((creds) => creds.type === "oauth"
|
|
51
|
+
? {
|
|
52
|
+
type: "oauth",
|
|
53
|
+
accessToken: creds.accessToken,
|
|
54
|
+
organization: creds.organization,
|
|
55
|
+
apiBaseUrl,
|
|
56
|
+
}
|
|
57
|
+
: {
|
|
58
|
+
type: "serviceToken",
|
|
59
|
+
tokenId: creds.tokenId,
|
|
60
|
+
token: creds.token,
|
|
61
|
+
organization: creds.organization,
|
|
62
|
+
apiBaseUrl,
|
|
63
|
+
}), orDieCredentialsUnavailable(PLANETSCALE_AUTH_PROVIDER_NAME));
|
|
64
|
+
}));
|
|
65
|
+
//# sourceMappingURL=Credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Credentials.js","sourceRoot":"","sources":["../src/Credentials.ts"],"names":[],"mappings":"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"}
|