alchemy 0.63.1 → 0.65.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 +7664 -5857
- package/bin/commands/init.ts +130 -9
- package/bin/constants.ts +4 -0
- package/bin/services/cdp-manager/cdp-proxy.ts +69 -0
- package/bin/services/cdp-manager/server.ts +173 -0
- package/bin/services/execute-alchemy.ts +83 -4
- package/bin/types.ts +1 -0
- package/lib/alchemy.d.ts +4 -0
- package/lib/alchemy.d.ts.map +1 -1
- package/lib/alchemy.js +10 -4
- package/lib/alchemy.js.map +1 -1
- package/lib/apply.d.ts +3 -0
- package/lib/apply.d.ts.map +1 -1
- package/lib/apply.js +11 -1
- package/lib/apply.js.map +1 -1
- package/lib/cloudflare/bindings.d.ts +3 -1
- package/lib/cloudflare/bindings.d.ts.map +1 -1
- package/lib/cloudflare/bucket.d.ts +2 -1
- package/lib/cloudflare/bucket.d.ts.map +1 -1
- package/lib/cloudflare/bucket.js.map +1 -1
- package/lib/cloudflare/bundle/cloudflare-internal.d.ts +6 -0
- package/lib/cloudflare/bundle/cloudflare-internal.d.ts.map +1 -0
- package/lib/cloudflare/bundle/cloudflare-internal.js +39 -0
- package/lib/cloudflare/bundle/cloudflare-internal.js.map +1 -0
- package/lib/cloudflare/bundle/nodejs-builtin-modules.d.ts +2 -0
- package/lib/cloudflare/bundle/nodejs-builtin-modules.d.ts.map +1 -0
- package/lib/cloudflare/bundle/nodejs-builtin-modules.js +9 -0
- package/lib/cloudflare/bundle/nodejs-builtin-modules.js.map +1 -0
- package/lib/cloudflare/bundle/plugin-als-external.d.ts +6 -0
- package/lib/cloudflare/bundle/plugin-als-external.d.ts.map +1 -0
- package/lib/cloudflare/bundle/plugin-als-external.js +12 -0
- package/lib/cloudflare/bundle/plugin-als-external.js.map +1 -0
- package/lib/cloudflare/bundle/plugin-hybrid-node-compat.d.ts +4 -1
- package/lib/cloudflare/bundle/plugin-hybrid-node-compat.d.ts.map +1 -1
- package/lib/cloudflare/bundle/plugin-hybrid-node-compat.js +23 -23
- package/lib/cloudflare/bundle/plugin-hybrid-node-compat.js.map +1 -1
- package/lib/cloudflare/bundle/plugin-node-compat.d.ts +11 -0
- package/lib/cloudflare/bundle/plugin-node-compat.d.ts.map +1 -0
- package/lib/cloudflare/bundle/plugin-node-compat.js +93 -0
- package/lib/cloudflare/bundle/plugin-node-compat.js.map +1 -0
- package/lib/cloudflare/bundle/plugin-wasm.d.ts.map +1 -1
- package/lib/cloudflare/bundle/plugin-wasm.js +20 -11
- package/lib/cloudflare/bundle/plugin-wasm.js.map +1 -1
- package/lib/cloudflare/compatibility-date.gen.d.ts +1 -1
- package/lib/cloudflare/compatibility-date.gen.js +1 -1
- package/lib/cloudflare/d1-local-migrations.js.map +1 -1
- package/lib/cloudflare/durable-object-namespace.d.ts +1 -0
- package/lib/cloudflare/durable-object-namespace.d.ts.map +1 -1
- package/lib/cloudflare/durable-object-namespace.js.map +1 -1
- package/lib/cloudflare/hyperdrive.d.ts +7 -2
- package/lib/cloudflare/hyperdrive.d.ts.map +1 -1
- package/lib/cloudflare/hyperdrive.js +39 -57
- package/lib/cloudflare/hyperdrive.js.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/next.d.ts +13 -0
- package/lib/cloudflare/next.d.ts.map +1 -0
- package/lib/cloudflare/next.js +91 -0
- package/lib/cloudflare/next.js.map +1 -0
- package/lib/cloudflare/website.d.ts.map +1 -1
- package/lib/cloudflare/website.js +80 -82
- package/lib/cloudflare/website.js.map +1 -1
- package/lib/cloudflare/worker-assets.d.ts +3 -3
- package/lib/cloudflare/worker-assets.d.ts.map +1 -1
- package/lib/cloudflare/worker-assets.js +22 -47
- package/lib/cloudflare/worker-assets.js.map +1 -1
- package/lib/cloudflare/worker-bundle.d.ts +6 -0
- package/lib/cloudflare/worker-bundle.d.ts.map +1 -1
- package/lib/cloudflare/worker-bundle.js +34 -10
- package/lib/cloudflare/worker-bundle.js.map +1 -1
- package/lib/cloudflare/worker-metadata.d.ts.map +1 -1
- package/lib/cloudflare/worker-metadata.js +1 -0
- package/lib/cloudflare/worker-metadata.js.map +1 -1
- package/lib/cloudflare/worker.d.ts.map +1 -1
- package/lib/cloudflare/worker.js +24 -6
- package/lib/cloudflare/worker.js.map +1 -1
- package/lib/cloudflare/wrangler.json.d.ts +4 -6
- package/lib/cloudflare/wrangler.json.d.ts.map +1 -1
- package/lib/cloudflare/wrangler.json.js +20 -15
- package/lib/cloudflare/wrangler.json.js.map +1 -1
- package/lib/context.d.ts +3 -1
- package/lib/context.d.ts.map +1 -1
- package/lib/context.js +2 -2
- package/lib/context.js.map +1 -1
- package/lib/destroy.d.ts +8 -0
- package/lib/destroy.d.ts.map +1 -1
- package/lib/destroy.js +20 -4
- package/lib/destroy.js.map +1 -1
- package/lib/planetscale/api/client.gen.d.ts +1750 -0
- package/lib/planetscale/api/client.gen.d.ts.map +1 -0
- package/lib/planetscale/api/client.gen.js +2401 -0
- package/lib/planetscale/api/client.gen.js.map +1 -0
- package/lib/planetscale/api/index.d.ts +3 -0
- package/lib/planetscale/api/index.d.ts.map +1 -0
- package/lib/planetscale/api/index.js +4 -0
- package/lib/planetscale/api/index.js.map +1 -0
- package/lib/planetscale/api/types.gen.d.ts +12156 -0
- package/lib/planetscale/api/types.gen.d.ts.map +1 -0
- package/lib/planetscale/api/types.gen.js +2 -0
- package/lib/planetscale/api/types.gen.js.map +1 -0
- package/lib/planetscale/branch.d.ts +5 -8
- package/lib/planetscale/branch.d.ts.map +1 -1
- package/lib/planetscale/branch.js +122 -97
- package/lib/planetscale/branch.js.map +1 -1
- package/lib/planetscale/database.d.ts +24 -11
- package/lib/planetscale/database.d.ts.map +1 -1
- package/lib/planetscale/database.js +163 -118
- package/lib/planetscale/database.js.map +1 -1
- package/lib/planetscale/index.d.ts +2 -1
- package/lib/planetscale/index.d.ts.map +1 -1
- package/lib/planetscale/index.js +2 -1
- package/lib/planetscale/index.js.map +1 -1
- package/lib/planetscale/password.d.ts +7 -8
- package/lib/planetscale/password.d.ts.map +1 -1
- package/lib/planetscale/password.js +74 -57
- package/lib/planetscale/password.js.map +1 -1
- package/lib/planetscale/role.d.ts +126 -0
- package/lib/planetscale/role.d.ts.map +1 -0
- package/lib/planetscale/role.js +144 -0
- package/lib/planetscale/role.js.map +1 -0
- package/lib/planetscale/utils.d.ts +23 -7
- package/lib/planetscale/utils.d.ts.map +1 -1
- package/lib/planetscale/utils.js +169 -75
- package/lib/planetscale/utils.js.map +1 -1
- package/lib/scope.d.ts +5 -1
- package/lib/scope.d.ts.map +1 -1
- package/lib/scope.js +11 -3
- package/lib/scope.js.map +1 -1
- package/lib/secret.d.ts +0 -3
- package/lib/secret.d.ts.map +1 -1
- package/lib/secret.js +0 -2
- package/lib/secret.js.map +1 -1
- package/lib/state/cloudflare-state-store.js +3 -3
- package/lib/state/cloudflare-state-store.js.map +1 -1
- package/lib/test/bun.d.ts +2 -2
- package/lib/test/bun.d.ts.map +1 -1
- package/lib/test/vitest.d.ts +2 -2
- package/lib/test/vitest.d.ts.map +1 -1
- package/lib/test/vitest.js +4 -4
- package/lib/test/vitest.js.map +1 -1
- package/lib/util/content-type.js +2 -2
- package/lib/util/content-type.js.map +1 -1
- package/lib/util/dedent.d.ts +3 -14
- package/lib/util/dedent.d.ts.map +1 -1
- package/lib/util/dedent.js +33 -45
- package/lib/util/dedent.js.map +1 -1
- package/lib/util/memoize.d.ts.map +1 -1
- package/lib/util/memoize.js +11 -1
- package/lib/util/memoize.js.map +1 -1
- package/package.json +8 -3
- package/src/alchemy.ts +14 -6
- package/src/apply.ts +13 -1
- package/src/cloudflare/bindings.ts +3 -1
- package/src/cloudflare/bucket.ts +3 -1
- package/src/cloudflare/bundle/cloudflare-internal.ts +42 -0
- package/src/cloudflare/bundle/nodejs-builtin-modules.ts +14 -0
- package/src/cloudflare/bundle/plugin-als-external.ts +13 -0
- package/src/cloudflare/bundle/plugin-hybrid-node-compat.ts +29 -28
- package/src/cloudflare/bundle/plugin-node-compat.ts +114 -0
- package/src/cloudflare/bundle/plugin-wasm.ts +34 -14
- package/src/cloudflare/compatibility-date.gen.ts +1 -1
- package/src/cloudflare/d1-local-migrations.ts +2 -2
- package/src/cloudflare/durable-object-namespace.ts +1 -0
- package/src/cloudflare/hyperdrive.ts +136 -95
- package/src/cloudflare/index.ts +1 -0
- package/src/cloudflare/next.ts +123 -0
- package/src/cloudflare/website.ts +88 -89
- package/src/cloudflare/worker-assets.ts +43 -105
- package/src/cloudflare/worker-bundle.ts +46 -9
- package/src/cloudflare/worker-metadata.ts +2 -0
- package/src/cloudflare/worker.ts +35 -7
- package/src/cloudflare/wrangler.json.ts +114 -113
- package/src/context.ts +5 -3
- package/src/destroy.ts +26 -8
- package/src/planetscale/api/client.gen.ts +2882 -0
- package/src/planetscale/api/index.ts +4 -0
- package/src/planetscale/api/types.gen.ts +13041 -0
- package/src/planetscale/branch.ts +170 -162
- package/src/planetscale/database.ts +263 -243
- package/src/planetscale/index.ts +2 -1
- package/src/planetscale/password.ts +89 -86
- package/src/planetscale/role.ts +278 -0
- package/src/planetscale/utils.ts +289 -128
- package/src/scope.ts +12 -3
- package/src/secret.ts +0 -4
- package/src/state/cloudflare-state-store.ts +4 -4
- package/src/test/bun.ts +2 -2
- package/src/test/vitest.ts +6 -6
- package/src/util/content-type.ts +2 -2
- package/src/util/dedent.ts +34 -50
- package/src/util/memoize.ts +13 -1
- package/templates/astro/alchemy.run.ts +1 -3
- package/templates/hono/alchemy.run.ts +0 -1
- package/templates/nextjs/README.md +85 -0
- package/templates/nextjs/_env +1 -0
- package/templates/nextjs/_env.example +1 -0
- package/templates/nextjs/_gitignore +46 -0
- package/templates/nextjs/alchemy.run.ts +16 -0
- package/templates/nextjs/eslint.config.mjs +16 -0
- package/templates/nextjs/next-env.d.ts +5 -0
- package/templates/nextjs/next.config.ts +10 -0
- package/templates/nextjs/open-next.config.ts +5 -0
- package/templates/nextjs/package.json +31 -0
- package/templates/nextjs/src/app/api/hello/route.ts +19 -0
- package/templates/nextjs/src/app/favicon.ico +0 -0
- package/templates/nextjs/src/app/globals.css +72 -0
- package/templates/nextjs/src/app/layout.tsx +19 -0
- package/templates/nextjs/src/app/page.tsx +55 -0
- package/templates/nextjs/tsconfig.json +33 -0
- package/templates/nextjs/types/env.d.ts +14 -0
- package/templates/nuxt/alchemy.run.ts +1 -3
- package/templates/react-router/alchemy.run.ts +1 -3
- package/templates/rwsdk/alchemy.run.ts +0 -2
- package/templates/sveltekit/alchemy.run.ts +1 -3
- package/templates/tanstack-start/alchemy.run.ts +1 -3
- package/templates/typescript/alchemy.run.ts +0 -1
- package/templates/vite/alchemy.run.ts +0 -1
- package/workers/cloudflare-state-store.js +58 -58
- package/lib/cloudflare/bundle/externals.d.ts +0 -3
- package/lib/cloudflare/bundle/externals.d.ts.map +0 -1
- package/lib/cloudflare/bundle/externals.js +0 -35
- package/lib/cloudflare/bundle/externals.js.map +0 -1
- package/lib/cloudflare/bundle/plugin-compat-warning.d.ts +0 -10
- package/lib/cloudflare/bundle/plugin-compat-warning.d.ts.map +0 -1
- package/lib/cloudflare/bundle/plugin-compat-warning.js +0 -67
- package/lib/cloudflare/bundle/plugin-compat-warning.js.map +0 -1
- package/lib/planetscale/api.d.ts +0 -53
- package/lib/planetscale/api.d.ts.map +0 -1
- package/lib/planetscale/api.js +0 -84
- package/lib/planetscale/api.js.map +0 -1
- package/src/cloudflare/bundle/externals.ts +0 -36
- package/src/cloudflare/bundle/plugin-compat-warning.ts +0 -94
- package/src/planetscale/api.ts +0 -115
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Resource } from "../resource.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { PlanetScaleClient } from "./api/client.gen.js";
|
|
3
|
+
import { ensureProductionBranchClusterSize, sanitizeClusterSize, waitForBranchReady, } from "./utils.js";
|
|
4
4
|
/**
|
|
5
5
|
* Create or manage a PlanetScale database branch
|
|
6
6
|
*
|
|
@@ -42,126 +42,151 @@ import { fixClusterSize, waitForDatabaseReady, } from "./utils.js";
|
|
|
42
42
|
*/
|
|
43
43
|
export const Branch = Resource("planetscale::Branch", async function (id, props) {
|
|
44
44
|
const adopt = props.adopt ?? this.scope.adopt;
|
|
45
|
-
const
|
|
46
|
-
if (!apiKey) {
|
|
47
|
-
throw new Error("PLANETSCALE_API_TOKEN environment variable is required");
|
|
48
|
-
}
|
|
49
|
-
const api = new PlanetScaleApi({ apiKey });
|
|
45
|
+
const api = new PlanetScaleClient(props);
|
|
50
46
|
const branchName = props.name ?? this.output?.name ?? this.scope.createPhysicalName(id);
|
|
47
|
+
const parentBranchName = !props.parentBranch
|
|
48
|
+
? "main"
|
|
49
|
+
: typeof props.parentBranch === "string"
|
|
50
|
+
? props.parentBranch
|
|
51
|
+
: props.parentBranch.name;
|
|
51
52
|
if (this.phase === "update" && this.output.name !== branchName) {
|
|
52
53
|
// TODO(sam): maybe we don't need to replace? just branch again? or rename?
|
|
53
54
|
this.replace();
|
|
54
55
|
}
|
|
55
56
|
if (this.phase === "delete") {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
57
|
+
if (this.output?.name) {
|
|
58
|
+
const response = await api.organizations.databases.branches.delete({
|
|
59
|
+
path: {
|
|
60
|
+
organization: props.organizationId,
|
|
61
|
+
database: props.databaseName,
|
|
62
|
+
name: this.output.name,
|
|
63
|
+
},
|
|
64
|
+
result: "full",
|
|
65
|
+
});
|
|
66
|
+
if (response.error && response.error.status !== 404) {
|
|
67
|
+
throw new Error(`Failed to delete branch: ${response.error.message}`, {
|
|
68
|
+
cause: response.error,
|
|
69
|
+
});
|
|
62
70
|
}
|
|
63
71
|
}
|
|
64
|
-
catch (error) {
|
|
65
|
-
console.error("Error deleting branch:", error);
|
|
66
|
-
throw error;
|
|
67
|
-
}
|
|
68
72
|
return this.destroy();
|
|
69
73
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
74
|
+
if (typeof props.parentBranch !== "string" && props.parentBranch) {
|
|
75
|
+
await waitForBranchReady(api, props.organizationId, props.databaseName, props.parentBranch.name);
|
|
76
|
+
}
|
|
77
|
+
// Check if branch exists
|
|
78
|
+
const getResponse = await api.organizations.databases.branches.get({
|
|
79
|
+
path: {
|
|
80
|
+
organization: props.organizationId,
|
|
81
|
+
database: props.databaseName,
|
|
82
|
+
name: branchName,
|
|
83
|
+
},
|
|
84
|
+
result: "full",
|
|
85
|
+
});
|
|
86
|
+
if (getResponse.error && getResponse.error.status !== 404) {
|
|
87
|
+
// Error getting branch
|
|
88
|
+
throw new Error(`Failed to get branch: ${getResponse.error.message}`, {
|
|
89
|
+
cause: getResponse.error,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
if (getResponse.data) {
|
|
93
|
+
// Branch exists
|
|
94
|
+
if (!adopt) {
|
|
95
|
+
throw new Error(`Branch ${branchName} already exists and adopt is false`);
|
|
78
96
|
}
|
|
79
|
-
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
throw new Error(`
|
|
97
|
+
const data = getResponse.data;
|
|
98
|
+
const currentParentBranch = data.parent_branch || "main";
|
|
99
|
+
// Check immutable properties
|
|
100
|
+
if (props.parentBranch && parentBranchName !== currentParentBranch) {
|
|
101
|
+
throw new Error(`Cannot change parent branch from ${currentParentBranch} to ${parentBranchName}`);
|
|
84
102
|
}
|
|
85
|
-
if (
|
|
86
|
-
|
|
87
|
-
if (!adopt) {
|
|
88
|
-
throw new Error(`Branch ${branchName} already exists and adopt is false`);
|
|
89
|
-
}
|
|
90
|
-
const data = await getResponse.json();
|
|
91
|
-
const currentParentBranch = data.parent_branch || "main";
|
|
92
|
-
// Check immutable properties
|
|
93
|
-
if (props.parentBranch && parentBranchName !== currentParentBranch) {
|
|
94
|
-
throw new Error(`Cannot change parent branch from ${currentParentBranch} to ${parentBranchName}`);
|
|
95
|
-
}
|
|
96
|
-
if (this.output?.backupId) {
|
|
97
|
-
console.warn("BackupID is set, but branch already exists, so it will be ignored");
|
|
98
|
-
}
|
|
99
|
-
if (this.output?.seedData) {
|
|
100
|
-
console.warn("SeedData is set, but branch already exists, so it will be ignored");
|
|
101
|
-
}
|
|
102
|
-
// Update mutable properties if they've changed
|
|
103
|
-
if (props.safeMigrations !== undefined) {
|
|
104
|
-
const safeMigrationsResponse = await api[props.safeMigrations ? "post" : "delete"](`/organizations/${props.organizationId}/databases/${props.databaseName}/branches/${branchName}/safe-migrations`);
|
|
105
|
-
if (!safeMigrationsResponse.ok) {
|
|
106
|
-
throw new Error(`Failed to ${props.safeMigrations ? "enable" : "disable"} safe migrations: ${safeMigrationsResponse.statusText}`);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
if (props.clusterSize && data.cluster_size !== props.clusterSize) {
|
|
110
|
-
const clusterResponse = await api.patch(`/organizations/${props.organizationId}/databases/${props.databaseName}/branches/${branchName}/cluster`, {
|
|
111
|
-
cluster_size: props.clusterSize,
|
|
112
|
-
});
|
|
113
|
-
if (!clusterResponse.ok) {
|
|
114
|
-
throw new Error(`Failed to update cluster size: ${clusterResponse.statusText}`);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
return this({
|
|
118
|
-
...props,
|
|
119
|
-
name: branchName,
|
|
120
|
-
parentBranch: currentParentBranch,
|
|
121
|
-
createdAt: data.created_at,
|
|
122
|
-
updatedAt: data.updated_at,
|
|
123
|
-
htmlUrl: data.html_url,
|
|
124
|
-
});
|
|
103
|
+
if (this.output?.backupId) {
|
|
104
|
+
console.warn("BackupID is set, but branch already exists, so it will be ignored");
|
|
125
105
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
const createResponse = await api.post(`/organizations/${props.organizationId}/databases/${props.databaseName}/branches`, {
|
|
129
|
-
name: branchName,
|
|
130
|
-
parent_branch: parentBranchName,
|
|
131
|
-
backup_id: props.backupId,
|
|
132
|
-
seed_data: props.seedData,
|
|
133
|
-
cluster_size: props.clusterSize,
|
|
134
|
-
});
|
|
135
|
-
if (!createResponse.ok) {
|
|
136
|
-
throw new Error(`Failed to create branch: ${createResponse.statusText} ${await createResponse.text()}`);
|
|
106
|
+
if (this.output?.seedData) {
|
|
107
|
+
console.warn("SeedData is set, but branch already exists, so it will be ignored");
|
|
137
108
|
}
|
|
138
|
-
|
|
139
|
-
// Handle safe migrations if specified
|
|
109
|
+
// Update mutable properties if they've changed
|
|
140
110
|
if (props.safeMigrations !== undefined) {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
111
|
+
await api.organizations.databases.branches.safeMigrations[props.safeMigrations ? "post" : "delete"]({
|
|
112
|
+
path: {
|
|
113
|
+
organization: props.organizationId,
|
|
114
|
+
database: props.databaseName,
|
|
115
|
+
name: branchName,
|
|
116
|
+
},
|
|
117
|
+
});
|
|
147
118
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
119
|
+
const clusterSize = props.clusterSize
|
|
120
|
+
? sanitizeClusterSize({
|
|
121
|
+
size: props.clusterSize,
|
|
122
|
+
kind: data.kind,
|
|
123
|
+
arch: data.cluster_architecture === "aarch64" ? "arm" : "x86",
|
|
124
|
+
region: data.region.slug,
|
|
125
|
+
})
|
|
126
|
+
: undefined;
|
|
127
|
+
if (clusterSize && data.cluster_name !== clusterSize) {
|
|
128
|
+
if (!props.isProduction) {
|
|
129
|
+
throw new Error(`Cannot change cluster size of non-production branch ${branchName}`);
|
|
130
|
+
}
|
|
131
|
+
await ensureProductionBranchClusterSize(api, props.organizationId, props.databaseName, branchName, data.kind, clusterSize);
|
|
152
132
|
}
|
|
153
133
|
return this({
|
|
154
134
|
...props,
|
|
155
135
|
name: branchName,
|
|
156
|
-
parentBranch:
|
|
136
|
+
parentBranch: currentParentBranch,
|
|
157
137
|
createdAt: data.created_at,
|
|
158
138
|
updatedAt: data.updated_at,
|
|
159
139
|
htmlUrl: data.html_url,
|
|
160
140
|
});
|
|
161
141
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
142
|
+
let clusterSize;
|
|
143
|
+
const parent = await waitForBranchReady(api, props.organizationId, props.databaseName, parentBranchName);
|
|
144
|
+
if (props.clusterSize) {
|
|
145
|
+
clusterSize = sanitizeClusterSize({
|
|
146
|
+
size: props.clusterSize,
|
|
147
|
+
kind: parent.kind,
|
|
148
|
+
arch: parent.cluster_architecture === "aarch64" ? "arm" : "x86",
|
|
149
|
+
region: parent.region.slug,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
// Branch doesn't exist, create it
|
|
153
|
+
const data = await api.organizations.databases.branches.post({
|
|
154
|
+
path: {
|
|
155
|
+
organization: props.organizationId,
|
|
156
|
+
database: props.databaseName,
|
|
157
|
+
},
|
|
158
|
+
body: {
|
|
159
|
+
name: branchName,
|
|
160
|
+
parent_branch: parentBranchName,
|
|
161
|
+
backup_id: props.backupId,
|
|
162
|
+
seed_data: props.seedData,
|
|
163
|
+
// This is ignored unless props.backupId is provided
|
|
164
|
+
cluster_size: clusterSize,
|
|
165
|
+
},
|
|
166
|
+
});
|
|
167
|
+
// Handle safe migrations if specified
|
|
168
|
+
if (props.safeMigrations !== undefined) {
|
|
169
|
+
// We can't change the migrations mode if the branch is not ready
|
|
170
|
+
await waitForBranchReady(api, props.organizationId, props.databaseName, branchName);
|
|
171
|
+
await api.organizations.databases.branches.safeMigrations[props.safeMigrations ? "post" : "delete"]({
|
|
172
|
+
path: {
|
|
173
|
+
organization: props.organizationId,
|
|
174
|
+
database: props.databaseName,
|
|
175
|
+
name: branchName,
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
// Handle cluster size update if specified
|
|
180
|
+
if (clusterSize) {
|
|
181
|
+
await ensureProductionBranchClusterSize(api, props.organizationId, props.databaseName, branchName, data.kind, clusterSize);
|
|
165
182
|
}
|
|
183
|
+
return this({
|
|
184
|
+
...props,
|
|
185
|
+
name: branchName,
|
|
186
|
+
parentBranch: data.parent_branch,
|
|
187
|
+
createdAt: data.created_at,
|
|
188
|
+
updatedAt: data.updated_at,
|
|
189
|
+
htmlUrl: data.html_url,
|
|
190
|
+
});
|
|
166
191
|
});
|
|
167
192
|
//# sourceMappingURL=branch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"branch.js","sourceRoot":"","sources":["../../src/planetscale/branch.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"branch.js","sourceRoot":"","sources":["../../src/planetscale/branch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import type { Context } from "../context.ts";
|
|
2
2
|
import { Resource } from "../resource.ts";
|
|
3
|
-
import type {
|
|
3
|
+
import type { PlanetScaleProps } from "./api/client.gen.ts";
|
|
4
4
|
import { type PlanetScaleClusterSize } from "./utils.ts";
|
|
5
|
-
|
|
6
|
-
* Properties for creating or updating a PlanetScale Database
|
|
7
|
-
*/
|
|
8
|
-
export interface DatabaseProps {
|
|
5
|
+
interface BaseDatabaseProps extends PlanetScaleProps {
|
|
9
6
|
/**
|
|
10
7
|
* The name of the database
|
|
11
8
|
*
|
|
@@ -16,10 +13,6 @@ export interface DatabaseProps {
|
|
|
16
13
|
* The organization ID where the database will be created
|
|
17
14
|
*/
|
|
18
15
|
organizationId: string;
|
|
19
|
-
/**
|
|
20
|
-
* PlanetScale API token (overrides environment variable)
|
|
21
|
-
*/
|
|
22
|
-
apiKey?: Secret;
|
|
23
16
|
/**
|
|
24
17
|
* Whether to adopt the database if it already exists in Planetscale
|
|
25
18
|
*/
|
|
@@ -73,11 +66,30 @@ export interface DatabaseProps {
|
|
|
73
66
|
* The database cluster size (required)
|
|
74
67
|
*/
|
|
75
68
|
clusterSize: PlanetScaleClusterSize;
|
|
69
|
+
/**
|
|
70
|
+
* The engine kind for the database
|
|
71
|
+
* @default "mysql"
|
|
72
|
+
*/
|
|
73
|
+
kind?: "mysql" | "postgresql";
|
|
74
|
+
/**
|
|
75
|
+
* The CPU architecture for the database. Only available for PostgreSQL databases.
|
|
76
|
+
*/
|
|
77
|
+
arch?: "x86" | "arm";
|
|
76
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* Properties for creating or updating a PlanetScale Database
|
|
81
|
+
*/
|
|
82
|
+
export type DatabaseProps = BaseDatabaseProps & ({
|
|
83
|
+
kind?: "mysql";
|
|
84
|
+
arch?: undefined;
|
|
85
|
+
} | {
|
|
86
|
+
kind: "postgresql";
|
|
87
|
+
arch?: "x86" | "arm";
|
|
88
|
+
});
|
|
77
89
|
/**
|
|
78
90
|
* Represents a PlanetScale Database
|
|
79
91
|
*/
|
|
80
|
-
export
|
|
92
|
+
export type Database = Resource<"planetscale::Database"> & DatabaseProps & {
|
|
81
93
|
/**
|
|
82
94
|
* The unique identifier of the database
|
|
83
95
|
*/
|
|
@@ -110,7 +122,7 @@ export interface Database extends Resource<"planetscale::Database">, DatabasePro
|
|
|
110
122
|
* HTML URL to access the database
|
|
111
123
|
*/
|
|
112
124
|
htmlUrl: string;
|
|
113
|
-
}
|
|
125
|
+
};
|
|
114
126
|
/**
|
|
115
127
|
* Create, manage and delete PlanetScale databases
|
|
116
128
|
*
|
|
@@ -146,4 +158,5 @@ export interface Database extends Resource<"planetscale::Database">, DatabasePro
|
|
|
146
158
|
* });
|
|
147
159
|
*/
|
|
148
160
|
export declare const Database: (((this: any, id: string, props?: {}) => never) & (new (_: never) => never)) | ((this: Context<Database>, id: string, props: DatabaseProps) => Promise<Database>);
|
|
161
|
+
export {};
|
|
149
162
|
//# sourceMappingURL=database.d.ts.map
|
|
@@ -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;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/planetscale/database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,EAEL,KAAK,sBAAsB,EAG5B,MAAM,YAAY,CAAC;AAEpB,UAAU,iBAAkB,SAAQ,gBAAgB;IAClD;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,MAAM,CAAC,EAAE;QACP;;WAEG;QACH,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IAEF;;OAEG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;IAEnC;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAE/B;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;OAEG;IACH,0BAA0B,CAAC,EAAE,OAAO,CAAC;IAErC;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,WAAW,EAAE,sBAAsB,CAAC;IAEpC;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,GAAG,YAAY,CAAC;IAE9B;;OAEG;IACH,IAAI,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,iBAAiB,GAC3C,CACI;IACE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB,GACD;IACE,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;CACtB,CACJ,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC,uBAAuB,CAAC,GACtD,aAAa,GAAG;IACd;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,QAAQ,yFAGX,OAAO,CAAC,QAAQ,CAAC,MACnB,MAAM,SACH,aAAa,KACnB,OAAO,CAAC,QAAQ,CAAC,CAwOrB,CAAC"}
|