@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.
Files changed (123) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +83 -4
  3. package/lib/AuthProvider.d.ts +64 -0
  4. package/lib/AuthProvider.d.ts.map +1 -0
  5. package/lib/AuthProvider.js +384 -0
  6. package/lib/AuthProvider.js.map +1 -0
  7. package/lib/Branch.d.ts +128 -0
  8. package/lib/Branch.d.ts.map +1 -0
  9. package/lib/Branch.js +420 -0
  10. package/lib/Branch.js.map +1 -0
  11. package/lib/Contributions.d.ts +7 -0
  12. package/lib/Contributions.d.ts.map +1 -0
  13. package/lib/Contributions.js +6 -0
  14. package/lib/Contributions.js.map +1 -0
  15. package/lib/Credentials.d.ts +33 -0
  16. package/lib/Credentials.d.ts.map +1 -0
  17. package/lib/Credentials.js +65 -0
  18. package/lib/Credentials.js.map +1 -0
  19. package/lib/Database.d.ts +138 -0
  20. package/lib/Database.d.ts.map +1 -0
  21. package/lib/Database.js +1 -0
  22. package/lib/Database.js.map +1 -0
  23. package/lib/MySQL/MySQLBranch.d.ts +87 -0
  24. package/lib/MySQL/MySQLBranch.d.ts.map +1 -0
  25. package/lib/MySQL/MySQLBranch.js +15 -0
  26. package/lib/MySQL/MySQLBranch.js.map +1 -0
  27. package/lib/MySQL/MySQLClusterSize.d.ts +32 -0
  28. package/lib/MySQL/MySQLClusterSize.d.ts.map +1 -0
  29. package/lib/MySQL/MySQLClusterSize.js +111 -0
  30. package/lib/MySQL/MySQLClusterSize.js.map +1 -0
  31. package/lib/MySQL/MySQLDatabase.d.ts +141 -0
  32. package/lib/MySQL/MySQLDatabase.d.ts.map +1 -0
  33. package/lib/MySQL/MySQLDatabase.js +294 -0
  34. package/lib/MySQL/MySQLDatabase.js.map +1 -0
  35. package/lib/MySQL/MySQLMigrations.d.ts +24 -0
  36. package/lib/MySQL/MySQLMigrations.d.ts.map +1 -0
  37. package/lib/MySQL/MySQLMigrations.js +106 -0
  38. package/lib/MySQL/MySQLMigrations.js.map +1 -0
  39. package/lib/MySQL/MySQLOrigin.d.ts +15 -0
  40. package/lib/MySQL/MySQLOrigin.d.ts.map +1 -0
  41. package/lib/MySQL/MySQLOrigin.js +2 -0
  42. package/lib/MySQL/MySQLOrigin.js.map +1 -0
  43. package/lib/MySQL/MySQLPassword.d.ts +116 -0
  44. package/lib/MySQL/MySQLPassword.d.ts.map +1 -0
  45. package/lib/MySQL/MySQLPassword.js +212 -0
  46. package/lib/MySQL/MySQLPassword.js.map +1 -0
  47. package/lib/MySQL/index.d.ts +6 -0
  48. package/lib/MySQL/index.d.ts.map +1 -0
  49. package/lib/MySQL/index.js +6 -0
  50. package/lib/MySQL/index.js.map +1 -0
  51. package/lib/OAuthClient.d.ts +32 -0
  52. package/lib/OAuthClient.d.ts.map +1 -0
  53. package/lib/OAuthClient.js +52 -0
  54. package/lib/OAuthClient.js.map +1 -0
  55. package/lib/Postgres/PostgresBranch.d.ts +75 -0
  56. package/lib/Postgres/PostgresBranch.d.ts.map +1 -0
  57. package/lib/Postgres/PostgresBranch.js +15 -0
  58. package/lib/Postgres/PostgresBranch.js.map +1 -0
  59. package/lib/Postgres/PostgresClusterSize.d.ts +77 -0
  60. package/lib/Postgres/PostgresClusterSize.d.ts.map +1 -0
  61. package/lib/Postgres/PostgresClusterSize.js +89 -0
  62. package/lib/Postgres/PostgresClusterSize.js.map +1 -0
  63. package/lib/Postgres/PostgresDatabase.d.ts +95 -0
  64. package/lib/Postgres/PostgresDatabase.d.ts.map +1 -0
  65. package/lib/Postgres/PostgresDatabase.js +294 -0
  66. package/lib/Postgres/PostgresDatabase.js.map +1 -0
  67. package/lib/Postgres/PostgresDefaultRole.d.ts +94 -0
  68. package/lib/Postgres/PostgresDefaultRole.d.ts.map +1 -0
  69. package/lib/Postgres/PostgresDefaultRole.js +187 -0
  70. package/lib/Postgres/PostgresDefaultRole.js.map +1 -0
  71. package/lib/Postgres/PostgresMigrations.d.ts +24 -0
  72. package/lib/Postgres/PostgresMigrations.d.ts.map +1 -0
  73. package/lib/Postgres/PostgresMigrations.js +116 -0
  74. package/lib/Postgres/PostgresMigrations.js.map +1 -0
  75. package/lib/Postgres/PostgresOrigin.d.ts +15 -0
  76. package/lib/Postgres/PostgresOrigin.d.ts.map +1 -0
  77. package/lib/Postgres/PostgresOrigin.js +2 -0
  78. package/lib/Postgres/PostgresOrigin.js.map +1 -0
  79. package/lib/Postgres/PostgresRole.d.ts +142 -0
  80. package/lib/Postgres/PostgresRole.d.ts.map +1 -0
  81. package/lib/Postgres/PostgresRole.js +268 -0
  82. package/lib/Postgres/PostgresRole.js.map +1 -0
  83. package/lib/Postgres/index.d.ts +7 -0
  84. package/lib/Postgres/index.d.ts.map +1 -0
  85. package/lib/Postgres/index.js +7 -0
  86. package/lib/Postgres/index.js.map +1 -0
  87. package/lib/Providers.d.ts +24 -0
  88. package/lib/Providers.d.ts.map +1 -0
  89. package/lib/Providers.js +40 -0
  90. package/lib/Providers.js.map +1 -0
  91. package/lib/Util.d.ts +93 -0
  92. package/lib/Util.d.ts.map +1 -0
  93. package/lib/Util.js +135 -0
  94. package/lib/Util.js.map +1 -0
  95. package/lib/index.d.ts +9 -0
  96. package/lib/index.d.ts.map +1 -0
  97. package/lib/index.js +9 -0
  98. package/lib/index.js.map +1 -0
  99. package/package.json +79 -3
  100. package/src/AuthProvider.ts +571 -0
  101. package/src/Branch.ts +657 -0
  102. package/src/Contributions.ts +9 -0
  103. package/src/Credentials.ts +116 -0
  104. package/src/Database.ts +152 -0
  105. package/src/MySQL/MySQLBranch.ts +109 -0
  106. package/src/MySQL/MySQLClusterSize.ts +185 -0
  107. package/src/MySQL/MySQLDatabase.ts +521 -0
  108. package/src/MySQL/MySQLMigrations.ts +182 -0
  109. package/src/MySQL/MySQLOrigin.ts +15 -0
  110. package/src/MySQL/MySQLPassword.ts +428 -0
  111. package/src/MySQL/index.ts +5 -0
  112. package/src/OAuthClient.ts +59 -0
  113. package/src/Postgres/PostgresBranch.ts +97 -0
  114. package/src/Postgres/PostgresClusterSize.ts +262 -0
  115. package/src/Postgres/PostgresDatabase.ts +469 -0
  116. package/src/Postgres/PostgresDefaultRole.ts +340 -0
  117. package/src/Postgres/PostgresMigrations.ts +193 -0
  118. package/src/Postgres/PostgresOrigin.ts +15 -0
  119. package/src/Postgres/PostgresRole.ts +547 -0
  120. package/src/Postgres/index.ts +6 -0
  121. package/src/Providers.ts +67 -0
  122. package/src/Util.ts +205 -0
  123. package/src/index.ts +14 -0
@@ -0,0 +1,95 @@
1
+ import * as planetscale from "@distilled.cloud/planetscale";
2
+ import * as Provider from "alchemy/Provider";
3
+ import { Resource } from "alchemy/Resource";
4
+ import type { BaseDatabaseAttributes, BaseDatabaseProps } from "../Database.ts";
5
+ import type { Providers } from "../Providers.ts";
6
+ import { type PostgresClusterSize } from "./PostgresClusterSize.ts";
7
+ /**
8
+ * Properties for creating or updating a PostgreSQL PlanetScale database.
9
+ */
10
+ export interface PostgresDatabaseProps extends BaseDatabaseProps {
11
+ /**
12
+ * The PostgreSQL database cluster size. Required.
13
+ *
14
+ * Short NAS sizes (`"PS_10"`) are expanded using the target region and
15
+ * architecture. [PlanetScale Metal](https://planetscale.com/docs/metal)
16
+ * requires the full SKU (e.g. `"M1_10_AWS_ARM_D_METAL_10"`) because
17
+ * Metal also encodes CPU series, architecture, and NVMe drive size.
18
+ *
19
+ * @see https://planetscale.com/docs/postgres/pricing
20
+ * @see {@link PostgresClusterSize}
21
+ */
22
+ clusterSize: PostgresClusterSize;
23
+ /**
24
+ * PostgreSQL major version. Defaults to the latest available major
25
+ * version.
26
+ */
27
+ majorVersion?: string;
28
+ /**
29
+ * CPU architecture. Cannot be changed after creation.
30
+ * @default "x86"
31
+ */
32
+ arch?: "x86" | "arm";
33
+ }
34
+ /**
35
+ * Output attributes of a deployed PostgreSQL PlanetScale database.
36
+ */
37
+ export interface PostgresDatabaseAttributes extends BaseDatabaseAttributes {
38
+ /** PostgreSQL CPU architecture. */
39
+ arch: "x86" | "arm";
40
+ }
41
+ /**
42
+ * A PostgreSQL PlanetScale database. For MySQL, use {@link MySQLDatabase}
43
+ * instead.
44
+ *
45
+ * ### Creating a PostgreSQL Database
46
+ * **Example:** Basic PostgreSQL database
47
+ * ```typescript
48
+ * const db = yield* Planetscale.PostgresDatabase("MyDb", {
49
+ * clusterSize: "PS_10",
50
+ * });
51
+ * ```
52
+ *
53
+ * **Example:** PlanetScale Metal (NVMe)
54
+ * ```typescript
55
+ * const db = yield* Planetscale.PostgresDatabase("MyDb", {
56
+ * clusterSize: "M1_10_AWS_ARM_D_METAL_10",
57
+ * arch: "arm",
58
+ * });
59
+ * ```
60
+ *
61
+ * ### Migrations and seed data
62
+ * **Example:** Apply migrations and seed files
63
+ * ```typescript
64
+ * const db = yield* Planetscale.PostgresDatabase("MyDb", {
65
+ * clusterSize: "PS_10",
66
+ * migrationsDir: "./migrations/postgres",
67
+ * importFiles: ["./seed/postgres.sql"],
68
+ * });
69
+ * ```
70
+ *
71
+ * ### Deletion protection
72
+ * **Example:** Refuse deletes of a production database
73
+ * ```typescript
74
+ * const db = yield* Planetscale.PostgresDatabase("MyDb", {
75
+ * clusterSize: "PS_10",
76
+ * deletionProtection: true,
77
+ * });
78
+ * ```
79
+ *
80
+ * ### Adoption
81
+ * **Example:** Adopting an existing database
82
+ * ```typescript
83
+ * import { adopt } from "alchemy/AdoptPolicy";
84
+ *
85
+ * const db = yield* Planetscale.PostgresDatabase("Existing", {
86
+ * name: "existing-db",
87
+ * clusterSize: "PS_10",
88
+ * }).pipe(adopt());
89
+ * ```
90
+ */
91
+ export type PostgresDatabase = Resource<"Planetscale.PostgresDatabase", PostgresDatabaseProps, PostgresDatabaseAttributes, never, Providers>;
92
+ /** @resource */
93
+ export declare const PostgresDatabase: import("alchemy/Resource").ResourceClass<PostgresDatabase>;
94
+ export declare const PostgresDatabaseProvider: () => import("effect/Layer").Layer<Provider.Provider<PostgresDatabase>, never, import("effect/FileSystem").FileSystem | import("effect/Path").Path | import("alchemy/Stack").Stack | import("alchemy/Stage").Stage | planetscale.PlanetScaleOpContext>;
95
+ //# sourceMappingURL=PostgresDatabase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostgresDatabase.d.ts","sourceRoot":"","sources":["../../src/Postgres/PostgresDatabase.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,WAAW,MAAM,8BAA8B,CAAC;AAI5D,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAI5C,OAAO,KAAK,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAQjD,OAAO,EAIL,KAAK,mBAAmB,EACzB,MAAM,0BAA0B,CAAC;AAGlC;;GAEG;AACH,MAAM,WAAW,qBAAsB,SAAQ,iBAAiB;IAC9D;;;;;;;;;;OAUG;IACH,WAAW,EAAE,mBAAmB,CAAC;IAEjC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,IAAI,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,0BAA2B,SAAQ,sBAAsB;IACxE,mCAAmC;IACnC,IAAI,EAAE,KAAK,GAAG,KAAK,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CACrC,8BAA8B,EAC9B,qBAAqB,EACrB,0BAA0B,EAC1B,KAAK,EACL,SAAS,CACV,CAAC;AAEF,gBAAgB;AAChB,eAAO,MAAM,gBAAgB,4DAA6D,CAAC;AAE3F,eAAO,MAAM,wBAAwB,wPAyUjC,CAAC"}
@@ -0,0 +1,294 @@
1
+ import { diffMigrations, migrationsAttrs, migrationsInputOf, 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 { havePropsChanged, isResolved } from "alchemy/Diff";
6
+ import { createPhysicalName } from "alchemy/PhysicalName";
7
+ import * as Provider from "alchemy/Provider";
8
+ import { Resource } from "alchemy/Resource";
9
+ import { recordsEqual } from "alchemy/Util/equal";
10
+ import * as Effect from "effect/Effect";
11
+ import * as Stream from "effect/Stream";
12
+ import { deleteUnprotectedDatabase, PlanetscaleConflict, replaceDatabase, waitForBranchReady, waitForDatabaseReady, } from "../Util.js";
13
+ import { ensurePostgresProductionBranchClusterSize, toPostgresClusterArch, toPostgresClusterSku, } from "./PostgresClusterSize.js";
14
+ import { runPostgresImports, runPostgresMigrations } from "./PostgresMigrations.js";
15
+ /** @resource */
16
+ export const PostgresDatabase = Resource("Planetscale.PostgresDatabase");
17
+ export const PostgresDatabaseProvider = () => Provider.succeed(PostgresDatabase, {
18
+ stables: ["id", "organization", "region"],
19
+ diff: Effect.fn(function* ({ news, olds, output }) {
20
+ if (!isResolved(news))
21
+ return undefined;
22
+ // Database names are rename-mutable (reconcile folds `new_name`
23
+ // into the settings sync), so `name` cannot live in the
24
+ // provider-level stables. Almost no update is a rename though —
25
+ // for those, advertise `name` as stable on the update so
26
+ // downstream consumers (branches, roles) still resolve
27
+ // `database.name` at plan time instead of seeing `undefined` and
28
+ // falsely planning a replacement. The name only changes when the
29
+ // `name` prop itself changes: an explicit name renames iff it
30
+ // differs from the observed name, and an omitted name is
31
+ // engine-generated deterministically (stable across updates).
32
+ const nameIsStable = output?.name !== undefined &&
33
+ (news.name !== undefined ? news.name === output.name : olds?.name === undefined);
34
+ const stables = nameIsStable ? ["id", "organization", "region", "name"] : undefined;
35
+ if (news.region?.slug && output?.region?.slug && news.region.slug !== output.region.slug) {
36
+ return yield* replaceDatabase(news, output, "region");
37
+ }
38
+ if (news.replicas !== olds.replicas) {
39
+ return yield* replaceDatabase(news, output, "replicas");
40
+ }
41
+ const oldArch = output?.arch ?? olds.arch ?? "x86";
42
+ if (news.arch && news.arch !== oldArch) {
43
+ return yield* replaceDatabase(news, output, "arch");
44
+ }
45
+ if (yield* diffMigrations({ news, output })) {
46
+ return { action: "update", stables };
47
+ }
48
+ if (news.importFiles?.length) {
49
+ const newHashes = yield* hashImports(news.importFiles, yield* rootDir);
50
+ if (!recordsEqual(newHashes, output?.importHashes ?? {})) {
51
+ return { action: "update", stables };
52
+ }
53
+ }
54
+ // Remaining prop changes (rename, settings, clusterSize, …) are
55
+ // in-place updates. Decide them here instead of falling back to
56
+ // the engine's default deep-compare so the conditional `name`
57
+ // stable above is attached — the default path uses the
58
+ // provider-level stables, which strip `name` from downstream plan
59
+ // resolution.
60
+ if (havePropsChanged(olds, news)) {
61
+ return { action: "update", stables };
62
+ }
63
+ // Nothing changed. Still advertise the conditional `name` stable so
64
+ // a `--force` deploy (which upgrades this noop to an update) keeps
65
+ // `name` resolvable downstream instead of falsely replacing
66
+ // consumers such as roles and passwords (#1832).
67
+ return stables ? { action: "noop", stables } : undefined;
68
+ }),
69
+ read: Effect.fn(function* ({ id, output, olds }) {
70
+ const { organization } = yield* yield* Credentials;
71
+ const databaseName = output?.name ?? (yield* createDatabaseName(id, olds?.name));
72
+ const data = yield* planetscale
73
+ .getDatabase({
74
+ organization,
75
+ database: databaseName,
76
+ })
77
+ .pipe(Effect.catchTag("NotFound", () => Effect.succeed(undefined)));
78
+ if (!data)
79
+ return undefined;
80
+ if (data.kind !== "postgresql") {
81
+ return yield* new PlanetscaleConflict({
82
+ message: `Planetscale database "${data.name}" has kind "${data.kind}" but this resource ` +
83
+ `is a PostgresDatabase. Use Planetscale.${data.kind === "mysql" ? "MySQLDatabase" : data.kind}() instead, ` +
84
+ `or delete the existing database and retry.`,
85
+ });
86
+ }
87
+ const defaultBranch = data.default_branch ?? "main";
88
+ // Observe `arch` and `clusterSize` from the default branch rather
89
+ // than echoing input.
90
+ const branch = yield* planetscale
91
+ .getBranch({
92
+ organization,
93
+ database: data.name,
94
+ branch: defaultBranch,
95
+ })
96
+ .pipe(Effect.catchTag("NotFound", () => Effect.succeed(undefined)));
97
+ const arch = toPostgresClusterArch(branch.cluster_architecture);
98
+ const clusterSize = branch.cluster_name;
99
+ return {
100
+ id: data.id,
101
+ name: data.name,
102
+ organization,
103
+ state: data.state,
104
+ defaultBranch,
105
+ plan: data.plan ?? "hobby",
106
+ createdAt: data.created_at,
107
+ updatedAt: data.updated_at,
108
+ htmlUrl: data.html_url,
109
+ region: { slug: data.region.slug },
110
+ migrationsDir: output?.migrationsDir ?? (olds && migrationsInputOf(olds))?.dir,
111
+ migrationsTable: output?.migrationsTable ?? (olds && migrationsInputOf(olds))?.table,
112
+ migrationsHashes: output?.migrationsHashes ?? {},
113
+ importHashes: output?.importHashes ?? {},
114
+ clusterSize,
115
+ arch,
116
+ requireApprovalForDeploy: data.require_approval_for_deploy ?? false,
117
+ restrictBranchRegion: data.restrict_branch_region ?? false,
118
+ productionBranchWebConsole: data.production_branch_web_console ?? false,
119
+ deletionProtection: data.deletion_protected ?? false,
120
+ };
121
+ }),
122
+ reconcile: Effect.fn(function* ({ id, news, output, session }) {
123
+ const { organization } = yield* yield* Credentials;
124
+ const newName = yield* createDatabaseName(id, news.name);
125
+ const clusterSize = toPostgresClusterSku({
126
+ size: news.clusterSize,
127
+ arch: news.arch,
128
+ region: news.region?.slug,
129
+ });
130
+ // Observe — read live state under either the cached name (rename
131
+ // / refresh) or the freshly-derived name (greenfield). Observing
132
+ // unconditionally absorbs the race between `read` and `reconcile`
133
+ // — if a foreign actor (or a previously-failed-to-persist
134
+ // create) produced a database under the desired name in the
135
+ // meantime, we'll find it here and skip the duplicate create.
136
+ // Adoption routing has already been gated by `read` returning
137
+ // `Unowned`, so by the time we reach reconcile any observed
138
+ // database is fair game.
139
+ const observedName = output?.name ?? newName;
140
+ let observed = yield* planetscale
141
+ .getDatabase({
142
+ organization,
143
+ database: observedName,
144
+ })
145
+ .pipe(Effect.catchTag("NotFound", () => Effect.succeed(undefined)));
146
+ // Ensure — if missing, create.
147
+ if (!observed) {
148
+ yield* session.note("Creating database...");
149
+ observed = yield* planetscale.createDatabase({
150
+ organization,
151
+ name: newName,
152
+ region: news.region?.slug,
153
+ kind: "postgresql",
154
+ cluster_size: clusterSize,
155
+ replicas: news.replicas,
156
+ major_version: news.majorVersion,
157
+ });
158
+ }
159
+ // Wait for the database to finish provisioning before any
160
+ // downstream sync runs. PlanetScale reports `state: "pending"`
161
+ // for a while after createDatabase returns, during which branch
162
+ // operations on this database (including our own settings PATCH)
163
+ // race against the provisioning fiber.
164
+ yield* waitForDatabaseReady(organization, observed.name, session);
165
+ if (observed.kind !== "postgresql") {
166
+ return yield* new PlanetscaleConflict({
167
+ message: `Planetscale database "${observed.name}" has kind "${observed.kind}" but this resource ` +
168
+ `is a PostgresDatabase. Use Planetscale.${observed.kind === "mysql" ? "MySQLDatabase" : observed.kind}() instead, ` +
169
+ `or delete the existing database and retry.`,
170
+ });
171
+ }
172
+ // Sync — ensure a non-`main` default branch exists before
173
+ // referencing it via `default_branch`. The branch is created
174
+ // empty (no cluster size yet); we'll size it below.
175
+ if (news.defaultBranch && news.defaultBranch !== "main") {
176
+ yield* waitForDatabaseReady(organization, observed.name, session);
177
+ const branchExists = yield* planetscale
178
+ .getBranch({
179
+ organization,
180
+ database: observed.name,
181
+ branch: news.defaultBranch,
182
+ })
183
+ .pipe(Effect.map(() => true), Effect.catchTag("NotFound", () => Effect.succeed(false)));
184
+ if (!branchExists) {
185
+ yield* planetscale.createBranch({
186
+ organization,
187
+ database: observed.name,
188
+ name: news.defaultBranch,
189
+ parent_branch: "main",
190
+ });
191
+ }
192
+ }
193
+ // Sync settings — `updateSettings` is upsert-shaped, so we can
194
+ // call it with the full desired payload on every reconcile.
195
+ // Folds the rename in via `new_name` so we don't pay for a
196
+ // separate PATCH.
197
+ const updated = yield* planetscale.updateDatabaseSettings({
198
+ organization,
199
+ database: observed.name,
200
+ new_name: newName !== observed.name ? newName : undefined,
201
+ require_approval_for_deploy: news.requireApprovalForDeploy,
202
+ restrict_branch_region: news.restrictBranchRegion,
203
+ production_branch_web_console: news.productionBranchWebConsole,
204
+ deletion_protected: news.deletionProtection,
205
+ default_branch: news.defaultBranch,
206
+ });
207
+ // Sync cluster size on the active default branch.
208
+ const branch = news.defaultBranch ?? updated.default_branch ?? "main";
209
+ yield* ensurePostgresProductionBranchClusterSize(organization, updated.name, branch, news.clusterSize);
210
+ const migrationTarget = {
211
+ organization,
212
+ database: updated.name,
213
+ branch,
214
+ };
215
+ const migrationsInput = migrationsInputOf(news);
216
+ if (migrationsInput || news.importFiles?.length) {
217
+ yield* waitForBranchReady(organization, updated.name, branch, session);
218
+ }
219
+ const migrations = migrationsInput
220
+ ? yield* runPostgresMigrations(migrationTarget, migrationsInput, stampedOf(output))
221
+ : undefined;
222
+ const importHashes = news.importFiles?.length
223
+ ? yield* runPostgresImports(migrationTarget, news.importFiles, yield* rootDir, output?.importHashes ?? {})
224
+ : {};
225
+ return {
226
+ id: updated.id,
227
+ name: updated.name,
228
+ organization,
229
+ state: updated.state,
230
+ defaultBranch: updated.default_branch ?? branch,
231
+ plan: updated.plan ?? output?.plan ?? "hobby",
232
+ createdAt: updated.created_at,
233
+ updatedAt: updated.updated_at,
234
+ htmlUrl: updated.html_url,
235
+ region: { slug: updated.region.slug },
236
+ clusterSize: clusterSize,
237
+ ...migrationsAttrs({ input: migrationsInput, run: migrations, output }),
238
+ importHashes,
239
+ arch: news.arch ?? output?.arch ?? "x86",
240
+ requireApprovalForDeploy: updated.require_approval_for_deploy ?? false,
241
+ restrictBranchRegion: updated.restrict_branch_region ?? false,
242
+ productionBranchWebConsole: updated.production_branch_web_console ?? false,
243
+ deletionProtection: updated.deletion_protected ?? false,
244
+ };
245
+ }),
246
+ delete: Effect.fn(function* ({ output }) {
247
+ yield* deleteUnprotectedDatabase(output.organization, output.name);
248
+ }),
249
+ list: Effect.fn(function* () {
250
+ const { organization } = yield* yield* Credentials;
251
+ const databases = yield* planetscale.listDatabases.pages({ organization }).pipe(Stream.runCollect, Effect.map((chunk) => Array.from(chunk).flatMap((page) => page.data.filter((db) => db.kind === "postgresql"))));
252
+ const rows = yield* Effect.forEach(databases, (data) => Effect.gen(function* () {
253
+ const defaultBranch = data.default_branch ?? "main";
254
+ const branch = yield* planetscale
255
+ .getBranch({
256
+ organization,
257
+ database: data.name,
258
+ branch: defaultBranch,
259
+ })
260
+ .pipe(Effect.catchTag("NotFound", () => Effect.succeed(undefined)));
261
+ const arch = toPostgresClusterArch(branch?.cluster_architecture);
262
+ const clusterSize = branch?.cluster_name ?? "";
263
+ const attrs = {
264
+ id: data.id,
265
+ name: data.name,
266
+ organization,
267
+ state: data.state,
268
+ defaultBranch,
269
+ plan: data.plan ?? "hobby",
270
+ createdAt: data.created_at,
271
+ updatedAt: data.updated_at,
272
+ htmlUrl: data.html_url,
273
+ region: { slug: data.region.slug },
274
+ clusterSize,
275
+ migrationsDir: undefined,
276
+ migrationsTable: undefined,
277
+ migrationsHashes: {},
278
+ importHashes: {},
279
+ arch,
280
+ requireApprovalForDeploy: data.require_approval_for_deploy ?? false,
281
+ restrictBranchRegion: data.restrict_branch_region ?? false,
282
+ productionBranchWebConsole: data.production_branch_web_console ?? false,
283
+ deletionProtection: data.deletion_protected ?? false,
284
+ };
285
+ return attrs;
286
+ }), { concurrency: 10 });
287
+ return rows;
288
+ }),
289
+ });
290
+ const createDatabaseName = (id, name) => Effect.gen(function* () {
291
+ return name ?? (yield* createPhysicalName({ id, lowercase: true, maxLength: 63 }));
292
+ });
293
+ const rootDir = Effect.sync(() => process.cwd());
294
+ //# sourceMappingURL=PostgresDatabase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostgresDatabase.js","sourceRoot":"","sources":["../../src/Postgres/PostgresDatabase.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,SAAS,GACV,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,WAAW,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,0CAA0C,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAGxC,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,yCAAyC,EACzC,qBAAqB,EACrB,oBAAoB,GAErB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAkGpF,gBAAgB;AAChB,MAAM,CAAC,MAAM,gBAAgB,GAAG,QAAQ,CAAmB,8BAA8B,CAAC,CAAC;AAE3F,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,EAAE,CAC3C,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE;IACjC,OAAO,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,CAAC;IACzC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE;QAC/C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,SAAS,CAAC;QAExC,gEAAgE;QAChE,wDAAwD;QACxD,gEAAgE;QAChE,yDAAyD;QACzD,uDAAuD;QACvD,iEAAiE;QACjE,iEAAiE;QACjE,8DAA8D;QAC9D,yDAAyD;QACzD,8DAA8D;QAC9D,MAAM,YAAY,GAChB,MAAM,EAAE,IAAI,KAAK,SAAS;YAC1B,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC;QACnF,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEpF,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,MAAM,EAAE,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACzF,OAAO,KAAK,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACxD,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,OAAO,KAAK,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC;QACnD,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACvC,OAAO,KAAK,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACtD,CAAC;QAED,IAAI,KAAK,CAAC,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;YAC5C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAW,CAAC;QAChD,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;YACvE,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,IAAI,EAAE,CAAC,EAAE,CAAC;gBACzD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAW,CAAC;YAChD,CAAC;QACH,CAAC;QAED,gEAAgE;QAChE,gEAAgE;QAChE,8DAA8D;QAC9D,uDAAuD;QACvD,kEAAkE;QAClE,cAAc;QACd,IAAI,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACjC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAW,CAAC;QAChD,CAAC;QAED,oEAAoE;QACpE,mEAAmE;QACnE,4DAA4D;QAC5D,iDAAiD;QACjD,OAAO,OAAO,CAAC,CAAC,CAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAY,CAAC,CAAC,CAAC,SAAS,CAAC;IACtE,CAAC,CAAC;IAEF,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;QAC7C,MAAM,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC;QACnD,MAAM,YAAY,GAAG,MAAM,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,kBAAkB,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAEjF,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,WAAW;aAC5B,WAAW,CAAC;YACX,YAAY;YACZ,QAAQ,EAAE,YAAY;SACvB,CAAC;aACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAEtE,IAAI,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC;QAE5B,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC/B,OAAO,KAAK,CAAC,CAAC,IAAI,mBAAmB,CAAC;gBACpC,OAAO,EACL,yBAAyB,IAAI,CAAC,IAAI,eAAe,IAAI,CAAC,IAAI,sBAAsB;oBAChF,0CAA0C,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,cAAc;oBAC3G,4CAA4C;aAC/C,CAAC,CAAC;QACL,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,IAAI,MAAM,CAAC;QAEpD,kEAAkE;QAClE,sBAAsB;QACtB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,WAAW;aAC9B,SAAS,CAAC;YACT,YAAY;YACZ,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,MAAM,EAAE,aAAa;SACtB,CAAC;aACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAEtE,MAAM,IAAI,GAAG,qBAAqB,CAAC,MAAO,CAAC,oBAAoB,CAAC,CAAC;QACjE,MAAM,WAAW,GAAG,MAAO,CAAC,YAAY,CAAC;QAEzC,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,YAAY;YACZ,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,aAAa;YACb,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,OAAO;YAC1B,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,OAAO,EAAE,IAAI,CAAC,QAAQ;YACtB,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YAClC,aAAa,EAAE,MAAM,EAAE,aAAa,IAAI,CAAC,IAAI,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG;YAC9E,eAAe,EAAE,MAAM,EAAE,eAAe,IAAI,CAAC,IAAI,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK;YACpF,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,IAAI,EAAE;YAChD,YAAY,EAAE,MAAM,EAAE,YAAY,IAAI,EAAE;YACxC,WAAW;YACX,IAAI;YACJ,wBAAwB,EAAE,IAAI,CAAC,2BAA2B,IAAI,KAAK;YACnE,oBAAoB,EAAE,IAAI,CAAC,sBAAsB,IAAI,KAAK;YAC1D,0BAA0B,EAAE,IAAI,CAAC,6BAA6B,IAAI,KAAK;YACvE,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,IAAI,KAAK;SACrD,CAAC;IACJ,CAAC,CAAC;IAEF,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;QAC3D,MAAM,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC;QACnD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,kBAAkB,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,WAAW,GAAG,oBAAoB,CAAC;YACvC,IAAI,EAAE,IAAI,CAAC,WAAW;YACtB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;SAC1B,CAAC,CAAC;QAEH,iEAAiE;QACjE,iEAAiE;QACjE,kEAAkE;QAClE,0DAA0D;QAC1D,4DAA4D;QAC5D,8DAA8D;QAC9D,8DAA8D;QAC9D,4DAA4D;QAC5D,yBAAyB;QACzB,MAAM,YAAY,GAAG,MAAM,EAAE,IAAI,IAAI,OAAO,CAAC;QAC7C,IAAI,QAAQ,GAAG,KAAK,CAAC,CAAC,WAAW;aAC9B,WAAW,CAAC;YACX,YAAY;YACZ,QAAQ,EAAE,YAAY;SACvB,CAAC;aACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAEtE,+BAA+B;QAC/B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YAC5C,QAAQ,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,cAAc,CAAC;gBAC3C,YAAY;gBACZ,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;gBACzB,IAAI,EAAE,YAAY;gBAClB,YAAY,EAAE,WAAW;gBACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,aAAa,EAAE,IAAI,CAAC,YAAY;aACjC,CAAC,CAAC;QACL,CAAC;QAED,0DAA0D;QAC1D,+DAA+D;QAC/D,gEAAgE;QAChE,iEAAiE;QACjE,uCAAuC;QACvC,KAAK,CAAC,CAAC,oBAAoB,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAElE,IAAI,QAAQ,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACnC,OAAO,KAAK,CAAC,CAAC,IAAI,mBAAmB,CAAC;gBACpC,OAAO,EACL,yBAAyB,QAAQ,CAAC,IAAI,eAAe,QAAQ,CAAC,IAAI,sBAAsB;oBACxF,0CAA0C,QAAQ,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,cAAc;oBACnH,4CAA4C;aAC/C,CAAC,CAAC;QACL,CAAC;QAED,0DAA0D;QAC1D,6DAA6D;QAC7D,oDAAoD;QACpD,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,KAAK,MAAM,EAAE,CAAC;YACxD,KAAK,CAAC,CAAC,oBAAoB,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAClE,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,WAAW;iBACpC,SAAS,CAAC;gBACT,YAAY;gBACZ,QAAQ,EAAE,QAAQ,CAAC,IAAI;gBACvB,MAAM,EAAE,IAAI,CAAC,aAAa;aAC3B,CAAC;iBACD,IAAI,CACH,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EACtB,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CACzD,CAAC;YACJ,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,KAAK,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC;oBAC9B,YAAY;oBACZ,QAAQ,EAAE,QAAQ,CAAC,IAAI;oBACvB,IAAI,EAAE,IAAI,CAAC,aAAa;oBACxB,aAAa,EAAE,MAAM;iBACtB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,+DAA+D;QAC/D,4DAA4D;QAC5D,2DAA2D;QAC3D,kBAAkB;QAClB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,sBAAsB,CAAC;YACxD,YAAY;YACZ,QAAQ,EAAE,QAAQ,CAAC,IAAI;YACvB,QAAQ,EAAE,OAAO,KAAK,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;YACzD,2BAA2B,EAAE,IAAI,CAAC,wBAAwB;YAC1D,sBAAsB,EAAE,IAAI,CAAC,oBAAoB;YACjD,6BAA6B,EAAE,IAAI,CAAC,0BAA0B;YAC9D,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,cAAc,EAAE,IAAI,CAAC,aAAa;SACnC,CAAC,CAAC;QAEH,kDAAkD;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,IAAI,OAAO,CAAC,cAAc,IAAI,MAAM,CAAC;QACtE,KAAK,CAAC,CAAC,yCAAyC,CAC9C,YAAY,EACZ,OAAO,CAAC,IAAI,EACZ,MAAM,EACN,IAAI,CAAC,WAAW,CACjB,CAAC;QAEF,MAAM,eAAe,GAAG;YACtB,YAAY;YACZ,QAAQ,EAAE,OAAO,CAAC,IAAI;YACtB,MAAM;SACP,CAAC;QACF,MAAM,eAAe,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,eAAe,IAAI,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;YAChD,KAAK,CAAC,CAAC,kBAAkB,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,UAAU,GAAG,eAAe;YAChC,CAAC,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,eAAe,EAAE,eAAe,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;YACnF,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM;YAC3C,CAAC,CAAC,KAAK,CAAC,CAAC,kBAAkB,CACvB,eAAe,EACf,IAAI,CAAC,WAAW,EAChB,KAAK,CAAC,CAAC,OAAO,EACd,MAAM,EAAE,YAAY,IAAI,EAAE,CAC3B;YACH,CAAC,CAAC,EAAE,CAAC;QAEP,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,YAAY;YACZ,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,aAAa,EAAE,OAAO,CAAC,cAAc,IAAI,MAAM;YAC/C,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,MAAM,EAAE,IAAI,IAAI,OAAO;YAC7C,SAAS,EAAE,OAAO,CAAC,UAAU;YAC7B,SAAS,EAAE,OAAO,CAAC,UAAU;YAC7B,OAAO,EAAE,OAAO,CAAC,QAAQ;YACzB,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE;YACrC,WAAW,EAAE,WAAW;YACxB,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;YACvE,YAAY;YACZ,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,MAAM,EAAE,IAAI,IAAI,KAAK;YACxC,wBAAwB,EAAE,OAAO,CAAC,2BAA2B,IAAI,KAAK;YACtE,oBAAoB,EAAE,OAAO,CAAC,sBAAsB,IAAI,KAAK;YAC7D,0BAA0B,EAAE,OAAO,CAAC,6BAA6B,IAAI,KAAK;YAC1E,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,IAAI,KAAK;SACnB,CAAC;IACzC,CAAC,CAAC;IAEF,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE;QACrC,KAAK,CAAC,CAAC,yBAAyB,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC,CAAC;IAEF,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC;QACvB,MAAM,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC;QAEnD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,IAAI,CAC7E,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACnB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CACxF,CACF,CAAC;QAEF,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAChC,SAAS,EACT,CAAC,IAAI,EAAE,EAAE,CACP,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,IAAI,MAAM,CAAC;YACpD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,WAAW;iBAC9B,SAAS,CAAC;gBACT,YAAY;gBACZ,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,MAAM,EAAE,aAAa;aACtB,CAAC;iBACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAEtE,MAAM,IAAI,GAAG,qBAAqB,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;YACjE,MAAM,WAAW,GAAG,MAAM,EAAE,YAAY,IAAI,EAAE,CAAC;YAE/C,MAAM,KAAK,GAAmC;gBAC5C,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,YAAY;gBACZ,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,aAAa;gBACb,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,OAAO;gBAC1B,SAAS,EAAE,IAAI,CAAC,UAAU;gBAC1B,SAAS,EAAE,IAAI,CAAC,UAAU;gBAC1B,OAAO,EAAE,IAAI,CAAC,QAAQ;gBACtB,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;gBAClC,WAAW;gBACX,aAAa,EAAE,SAAS;gBACxB,eAAe,EAAE,SAAS;gBAC1B,gBAAgB,EAAE,EAAE;gBACpB,YAAY,EAAE,EAAE;gBAChB,IAAI;gBACJ,wBAAwB,EAAE,IAAI,CAAC,2BAA2B,IAAI,KAAK;gBACnE,oBAAoB,EAAE,IAAI,CAAC,sBAAsB,IAAI,KAAK;gBAC1D,0BAA0B,EAAE,IAAI,CAAC,6BAA6B,IAAI,KAAK;gBACvE,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,IAAI,KAAK;aACrD,CAAC;YACF,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,EACJ,EAAE,WAAW,EAAE,EAAE,EAAE,CACpB,CAAC;QAEF,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;CACH,CAAC,CAAC;AAEL,MAAM,kBAAkB,GAAG,CAAC,EAAU,EAAE,IAAwB,EAAE,EAAE,CAClE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AACrF,CAAC,CAAC,CAAC;AAEL,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC"}
@@ -0,0 +1,94 @@
1
+ import * as planetscale from "@distilled.cloud/planetscale";
2
+ import * as Provider from "alchemy/Provider";
3
+ import { Resource } from "alchemy/Resource";
4
+ import * as Redacted from "effect/Redacted";
5
+ import type { Providers } from "../Providers.ts";
6
+ import type { PostgresBranch } from "./PostgresBranch.ts";
7
+ import type { PostgresDatabase } from "./PostgresDatabase.ts";
8
+ import type { InheritedRole } from "./PostgresRole.ts";
9
+ /**
10
+ * Properties for creating or updating the default PlanetScale PostgreSQL
11
+ * role for a branch.
12
+ *
13
+ * Default roles are only meant for PostgreSQL databases. For MySQL,
14
+ * use {@link MySQLPassword} instead.
15
+ */
16
+ export interface PostgresDefaultRoleProps {
17
+ /**
18
+ * PostgreSQL database — string name or {@link PostgresDatabase} resource.
19
+ */
20
+ database: string | PostgresDatabase;
21
+ /**
22
+ * Branch — string name or {@link PostgresBranch} resource.
23
+ * @default "main"
24
+ */
25
+ branch?: string | PostgresBranch;
26
+ /**
27
+ * Whether to force-reset the default role if it already exists.
28
+ * Adopting an existing default role is not supported because the
29
+ * password is only returned at create time.
30
+ * @default false
31
+ */
32
+ forceReset?: boolean;
33
+ }
34
+ /**
35
+ * Output attributes of a deployed PlanetScale default role.
36
+ */
37
+ export interface PostgresDefaultRoleAttributes {
38
+ /** Unique identifier for the role (stable). */
39
+ id: string;
40
+ /** The Postgres role name. */
41
+ name: string;
42
+ /** ISO 8601 timestamp at which the role expires. */
43
+ expiresAt: string | null;
44
+ /** Hostname for the database connection. */
45
+ host: string;
46
+ /** Username for database authentication. */
47
+ username: string;
48
+ /** Password for database authentication (Redacted). */
49
+ password: Redacted.Redacted<string>;
50
+ /** TTL in seconds (if set). */
51
+ ttl: number | null;
52
+ /** The database name. */
53
+ databaseName: string;
54
+ /** Direct connection URL for the database (Redacted). */
55
+ connectionUrl: Redacted.Redacted<string>;
56
+ /** Pooled connection URL via PSBouncer (Redacted). */
57
+ connectionUrlPooled: Redacted.Redacted<string>;
58
+ /**
59
+ * Private connection host or DNS zone for this branch, supplied by
60
+ * PlanetScale. GCP Private Service Connect requires an endpoint name before
61
+ * this DNS zone.
62
+ */
63
+ privateHost: string;
64
+ /** Service name for this branch supplied by PlanetScale to establish a private connection. */
65
+ privateConnectionServiceName: string;
66
+ /** Inherited roles. */
67
+ inheritedRoles: InheritedRole[];
68
+ /** Resolved organization slug. */
69
+ organization: string;
70
+ /** Resolved database name (for delete). */
71
+ database: string;
72
+ /** Resolved branch name. */
73
+ branch: string;
74
+ }
75
+ /**
76
+ * The default PlanetScale PostgreSQL role for a database branch.
77
+ *
78
+ * ### Creating a Default Role
79
+ * **Example:** Default role on the main branch
80
+ * ```typescript
81
+ * const db = yield* Planetscale.PostgresDatabase("MyDb", {
82
+ * clusterSize: "PS_10",
83
+ * });
84
+ * const defaultRole = yield* Planetscale.PostgresDefaultRole("MainRole", {
85
+ * database: db,
86
+ * forceReset: true,
87
+ * });
88
+ * ```
89
+ */
90
+ export type PostgresDefaultRole = Resource<"Planetscale.PostgresDefaultRole", PostgresDefaultRoleProps, PostgresDefaultRoleAttributes, never, Providers>;
91
+ /** @resource */
92
+ export declare const PostgresDefaultRole: import("alchemy/Resource").ResourceClass<PostgresDefaultRole>;
93
+ export declare const PostgresDefaultRoleProvider: () => import("effect/Layer").Layer<Provider.Provider<PostgresDefaultRole>, never, planetscale.PlanetScaleOpContext>;
94
+ //# sourceMappingURL=PostgresDefaultRole.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostgresDefaultRole.d.ts","sourceRoot":"","sources":["../../src/Postgres/PostgresDefaultRole.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,8BAA8B,CAAC;AAG5D,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAE5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAEpC;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC;IAEjC;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C,+CAA+C;IAC/C,EAAE,EAAE,MAAM,CAAC;IACX,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACpC,+BAA+B;IAC/B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,yBAAyB;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,aAAa,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzC,sDAAsD;IACtD,mBAAmB,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/C;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,8FAA8F;IAC9F,4BAA4B,EAAE,MAAM,CAAC;IACrC,uBAAuB;IACvB,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,kCAAkC;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CACxC,iCAAiC,EACjC,wBAAwB,EACxB,6BAA6B,EAC7B,KAAK,EACL,SAAS,CACV,CAAC;AAEF,gBAAgB;AAChB,eAAO,MAAM,mBAAmB,+DAAmE,CAAC;AAEpG,eAAO,MAAM,2BAA2B,qHAiNpC,CAAC"}