@caelo-cms/provisioning 0.10.46 → 0.10.48

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 (342) hide show
  1. package/dist/adc-impersonation.d.ts.map +1 -1
  2. package/dist/adc-impersonation.js +23 -1
  3. package/dist/adc-impersonation.js.map +1 -1
  4. package/dist/agent/apply.d.ts +45 -0
  5. package/dist/agent/apply.d.ts.map +1 -0
  6. package/dist/agent/apply.js +83 -0
  7. package/dist/agent/apply.js.map +1 -0
  8. package/dist/agent/cli-provenance.d.ts +42 -0
  9. package/dist/agent/cli-provenance.d.ts.map +1 -0
  10. package/dist/agent/cli-provenance.js +138 -0
  11. package/dist/agent/cli-provenance.js.map +1 -0
  12. package/dist/agent/command.d.ts +79 -0
  13. package/dist/agent/command.d.ts.map +1 -0
  14. package/dist/agent/command.js +454 -0
  15. package/dist/agent/command.js.map +1 -0
  16. package/dist/agent/config.d.ts +30 -0
  17. package/dist/agent/config.d.ts.map +1 -0
  18. package/dist/agent/config.js +60 -0
  19. package/dist/agent/config.js.map +1 -0
  20. package/dist/agent/lock.d.ts +13 -0
  21. package/dist/agent/lock.d.ts.map +1 -0
  22. package/dist/agent/lock.js +100 -0
  23. package/dist/agent/lock.js.map +1 -0
  24. package/dist/agent/queue.d.ts +35 -0
  25. package/dist/agent/queue.d.ts.map +1 -0
  26. package/dist/agent/queue.js +50 -0
  27. package/dist/agent/queue.js.map +1 -0
  28. package/dist/agent/run.d.ts +97 -0
  29. package/dist/agent/run.d.ts.map +1 -0
  30. package/dist/agent/run.js +198 -0
  31. package/dist/agent/run.js.map +1 -0
  32. package/dist/agent/systemd.d.ts +55 -0
  33. package/dist/agent/systemd.d.ts.map +1 -0
  34. package/dist/agent/systemd.js +171 -0
  35. package/dist/agent/systemd.js.map +1 -0
  36. package/dist/agent/units.d.ts +44 -0
  37. package/dist/agent/units.d.ts.map +1 -0
  38. package/dist/agent/units.js +127 -0
  39. package/dist/agent/units.js.map +1 -0
  40. package/dist/agent-db.js +18362 -0
  41. package/dist/cli.js +122 -16
  42. package/dist/cli.js.map +1 -1
  43. package/dist/cloudsql-iam-user.d.ts +39 -0
  44. package/dist/cloudsql-iam-user.d.ts.map +1 -0
  45. package/dist/cloudsql-iam-user.js +119 -0
  46. package/dist/cloudsql-iam-user.js.map +1 -0
  47. package/dist/compose.d.ts +16 -0
  48. package/dist/compose.d.ts.map +1 -1
  49. package/dist/compose.js +26 -1
  50. package/dist/compose.js.map +1 -1
  51. package/dist/dns/index.d.ts +2 -0
  52. package/dist/dns/index.d.ts.map +1 -1
  53. package/dist/dns/index.js +3 -2
  54. package/dist/dns/index.js.map +1 -1
  55. package/dist/dns/manual.d.ts +5 -0
  56. package/dist/dns/manual.d.ts.map +1 -1
  57. package/dist/dns/manual.js +28 -12
  58. package/dist/dns/manual.js.map +1 -1
  59. package/dist/gcloud.d.ts +2 -0
  60. package/dist/gcloud.d.ts.map +1 -1
  61. package/dist/gcloud.js +1 -1
  62. package/dist/gcloud.js.map +1 -1
  63. package/dist/gcp-names.d.ts +15 -0
  64. package/dist/gcp-names.d.ts.map +1 -1
  65. package/dist/gcp-names.js +23 -0
  66. package/dist/gcp-names.js.map +1 -1
  67. package/dist/index.d.ts +6 -0
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +4 -0
  70. package/dist/index.js.map +1 -1
  71. package/dist/infra-contract.d.ts +1 -1
  72. package/dist/infra-contract.js +7 -1
  73. package/dist/infra-contract.js.map +1 -1
  74. package/dist/install-job-runner.d.ts +13 -0
  75. package/dist/install-job-runner.d.ts.map +1 -0
  76. package/dist/install-job-runner.js +155 -0
  77. package/dist/install-job-runner.js.map +1 -0
  78. package/dist/install-job.d.ts +210 -0
  79. package/dist/install-job.d.ts.map +1 -0
  80. package/dist/install-job.js +449 -0
  81. package/dist/install-job.js.map +1 -0
  82. package/dist/install-state.d.ts +19 -1
  83. package/dist/install-state.d.ts.map +1 -1
  84. package/dist/install-state.js +31 -3
  85. package/dist/install-state.js.map +1 -1
  86. package/dist/lifecycle.d.ts.map +1 -1
  87. package/dist/lifecycle.js +24 -5
  88. package/dist/lifecycle.js.map +1 -1
  89. package/dist/migration-runner.d.ts +5 -0
  90. package/dist/migration-runner.d.ts.map +1 -1
  91. package/dist/migration-runner.js +1 -1
  92. package/dist/migration-runner.js.map +1 -1
  93. package/dist/operator-access.d.ts +14 -8
  94. package/dist/operator-access.d.ts.map +1 -1
  95. package/dist/operator-access.js +16 -102
  96. package/dist/operator-access.js.map +1 -1
  97. package/dist/run-mode.d.ts +27 -0
  98. package/dist/run-mode.d.ts.map +1 -0
  99. package/dist/run-mode.js +22 -0
  100. package/dist/run-mode.js.map +1 -0
  101. package/dist/runtime-secrets.d.ts +19 -0
  102. package/dist/runtime-secrets.d.ts.map +1 -1
  103. package/dist/runtime-secrets.js +44 -0
  104. package/dist/runtime-secrets.js.map +1 -1
  105. package/dist/self-hosted-roles.d.ts +22 -1
  106. package/dist/self-hosted-roles.d.ts.map +1 -1
  107. package/dist/self-hosted-roles.js +81 -12
  108. package/dist/self-hosted-roles.js.map +1 -1
  109. package/dist/self-hosted-upgrade.d.ts +17 -0
  110. package/dist/self-hosted-upgrade.d.ts.map +1 -1
  111. package/dist/self-hosted-upgrade.js +16 -1
  112. package/dist/self-hosted-upgrade.js.map +1 -1
  113. package/dist/stack-contract.d.ts +6 -0
  114. package/dist/stack-contract.d.ts.map +1 -1
  115. package/dist/stack-contract.js +10 -1
  116. package/dist/stack-contract.js.map +1 -1
  117. package/dist/state-attach.d.ts +23 -0
  118. package/dist/state-attach.d.ts.map +1 -0
  119. package/dist/state-attach.js +112 -0
  120. package/dist/state-attach.js.map +1 -0
  121. package/dist/state-backend.d.ts +11 -0
  122. package/dist/state-backend.d.ts.map +1 -1
  123. package/dist/state-backend.js +20 -0
  124. package/dist/state-backend.js.map +1 -1
  125. package/dist/state-command.d.ts +20 -0
  126. package/dist/state-command.d.ts.map +1 -0
  127. package/dist/state-command.js +237 -0
  128. package/dist/state-command.js.map +1 -0
  129. package/dist/state-migrate.d.ts +121 -0
  130. package/dist/state-migrate.d.ts.map +1 -0
  131. package/dist/state-migrate.js +290 -0
  132. package/dist/state-migrate.js.map +1 -0
  133. package/dist/state-pulumi.d.ts +17 -0
  134. package/dist/state-pulumi.d.ts.map +1 -0
  135. package/dist/state-pulumi.js +218 -0
  136. package/dist/state-pulumi.js.map +1 -0
  137. package/dist/state-store.d.ts +27 -0
  138. package/dist/state-store.d.ts.map +1 -1
  139. package/dist/state-store.js +65 -0
  140. package/dist/state-store.js.map +1 -1
  141. package/dist/upgrade/converge.d.ts +6 -0
  142. package/dist/upgrade/converge.d.ts.map +1 -1
  143. package/dist/upgrade/converge.js +59 -2
  144. package/dist/upgrade/converge.js.map +1 -1
  145. package/dist/upgrade/gcp-lookup.d.ts +6 -0
  146. package/dist/upgrade/gcp-lookup.d.ts.map +1 -1
  147. package/dist/upgrade/gcp-lookup.js +25 -0
  148. package/dist/upgrade/gcp-lookup.js.map +1 -1
  149. package/dist/upgrade/release-images.d.ts +12 -0
  150. package/dist/upgrade/release-images.d.ts.map +1 -1
  151. package/dist/upgrade/release-images.js +31 -0
  152. package/dist/upgrade/release-images.js.map +1 -1
  153. package/dist/upgrade/upgrade.d.ts +5 -0
  154. package/dist/upgrade/upgrade.d.ts.map +1 -1
  155. package/dist/upgrade/upgrade.js +28 -1
  156. package/dist/upgrade/upgrade.js.map +1 -1
  157. package/dist/upgrader-assess.d.ts +82 -0
  158. package/dist/upgrader-assess.d.ts.map +1 -0
  159. package/dist/upgrader-assess.js +116 -0
  160. package/dist/upgrader-assess.js.map +1 -0
  161. package/dist/upgrader-gcp.d.ts +17 -0
  162. package/dist/upgrader-gcp.d.ts.map +1 -0
  163. package/dist/upgrader-gcp.js +87 -0
  164. package/dist/upgrader-gcp.js.map +1 -0
  165. package/dist/upgrader-job.d.ts +131 -0
  166. package/dist/upgrader-job.d.ts.map +1 -0
  167. package/dist/upgrader-job.js +259 -0
  168. package/dist/upgrader-job.js.map +1 -0
  169. package/dist/upgrader-reporter.d.ts +35 -0
  170. package/dist/upgrader-reporter.d.ts.map +1 -0
  171. package/dist/upgrader-reporter.js +79 -0
  172. package/dist/upgrader-reporter.js.map +1 -0
  173. package/dist/upgrader-setup.d.ts +59 -0
  174. package/dist/upgrader-setup.d.ts.map +1 -0
  175. package/dist/upgrader-setup.js +308 -0
  176. package/dist/upgrader-setup.js.map +1 -0
  177. package/dist/wizard.d.ts +6 -0
  178. package/dist/wizard.d.ts.map +1 -1
  179. package/dist/wizard.js +32 -4
  180. package/dist/wizard.js.map +1 -1
  181. package/dist/wizards/gcp-firebase.d.ts +3 -0
  182. package/dist/wizards/gcp-firebase.d.ts.map +1 -1
  183. package/dist/wizards/gcp-firebase.js +1 -0
  184. package/dist/wizards/gcp-firebase.js.map +1 -1
  185. package/dist/wizards/gcp-install-job.d.ts +74 -0
  186. package/dist/wizards/gcp-install-job.d.ts.map +1 -0
  187. package/dist/wizards/gcp-install-job.js +398 -0
  188. package/dist/wizards/gcp-install-job.js.map +1 -0
  189. package/dist/wizards/gcp-prompts.d.ts +3 -0
  190. package/dist/wizards/gcp-prompts.d.ts.map +1 -0
  191. package/dist/wizards/gcp-prompts.js +25 -0
  192. package/dist/wizards/gcp-prompts.js.map +1 -0
  193. package/dist/wizards/gcp-pulumi.d.ts +9 -2
  194. package/dist/wizards/gcp-pulumi.d.ts.map +1 -1
  195. package/dist/wizards/gcp-pulumi.js +8 -6
  196. package/dist/wizards/gcp-pulumi.js.map +1 -1
  197. package/dist/wizards/gcp.d.ts +40 -0
  198. package/dist/wizards/gcp.d.ts.map +1 -1
  199. package/dist/wizards/gcp.js +291 -83
  200. package/dist/wizards/gcp.js.map +1 -1
  201. package/package.json +6 -4
  202. package/src/adapter.ts +97 -0
  203. package/src/adc-impersonation.ts +176 -0
  204. package/src/admin-domain.test.ts +254 -0
  205. package/src/admin-domain.ts +245 -0
  206. package/src/admin-memory.test.ts +151 -0
  207. package/src/agent/apply.test.ts +185 -0
  208. package/src/agent/apply.ts +124 -0
  209. package/src/agent/cli-provenance.test.ts +159 -0
  210. package/src/agent/cli-provenance.ts +191 -0
  211. package/src/agent/command.test.ts +77 -0
  212. package/src/agent/command.ts +564 -0
  213. package/src/agent/config.ts +86 -0
  214. package/src/agent/lock-config.test.ts +97 -0
  215. package/src/agent/lock.ts +110 -0
  216. package/src/agent/queue.test.ts +10 -0
  217. package/src/agent/queue.ts +91 -0
  218. package/src/agent/run.test.ts +382 -0
  219. package/src/agent/run.ts +295 -0
  220. package/src/agent/systemd.ts +209 -0
  221. package/src/agent/units.test.ts +223 -0
  222. package/src/agent/units.ts +163 -0
  223. package/src/azure-front-door.test.ts +119 -0
  224. package/src/azure-front-door.ts +56 -0
  225. package/src/bootstrap-token.ts +20 -0
  226. package/src/caddy.ts +112 -0
  227. package/src/cdn-copy.ts +91 -0
  228. package/src/cert-wait.test.ts +194 -0
  229. package/src/cert-wait.ts +163 -0
  230. package/src/checkpoint-secrets.test.ts +380 -0
  231. package/src/checkpoint-secrets.ts +283 -0
  232. package/src/cli-routing.test.ts +45 -0
  233. package/src/cli-routing.ts +43 -0
  234. package/src/cli.ts +1491 -0
  235. package/src/cloudsql-iam-user.ts +147 -0
  236. package/src/compose.ts +334 -0
  237. package/src/default-firewall.test.ts +411 -0
  238. package/src/default-firewall.ts +342 -0
  239. package/src/deployed-release.test.ts +231 -0
  240. package/src/deployed-release.ts +220 -0
  241. package/src/dns/cloudflare.ts +182 -0
  242. package/src/dns/groups.test.ts +76 -0
  243. package/src/dns/groups.ts +86 -0
  244. package/src/dns/index.ts +56 -0
  245. package/src/dns/manual.ts +130 -0
  246. package/src/dns/types.ts +27 -0
  247. package/src/gateway-credentials.test.ts +180 -0
  248. package/src/gateway-credentials.ts +144 -0
  249. package/src/gcloud-components.test.ts +76 -0
  250. package/src/gcloud-components.ts +85 -0
  251. package/src/gcloud-retry.ts +41 -0
  252. package/src/gcloud-runner.test.ts +61 -0
  253. package/src/gcloud.test.ts +99 -0
  254. package/src/gcloud.ts +322 -0
  255. package/src/gcp-names.ts +135 -0
  256. package/src/index.test.ts +332 -0
  257. package/src/index.ts +114 -0
  258. package/src/infra-contract.ts +32 -0
  259. package/src/install-job-runner.ts +166 -0
  260. package/src/install-job.test.ts +566 -0
  261. package/src/install-job.ts +542 -0
  262. package/src/install-state.test.ts +239 -0
  263. package/src/install-state.ts +583 -0
  264. package/src/internal-token.ts +35 -0
  265. package/src/lifecycle.ts +900 -0
  266. package/src/mcp-iap-stacks.test.ts +58 -0
  267. package/src/mcp-iap.test.ts +149 -0
  268. package/src/mcp-iap.ts +131 -0
  269. package/src/media-volume.test.ts +296 -0
  270. package/src/migration-runner.ts +365 -0
  271. package/src/operator-access-stacks.test.ts +55 -0
  272. package/src/operator-access.test.ts +332 -0
  273. package/src/operator-access.ts +554 -0
  274. package/src/ops-backend.test.ts +320 -0
  275. package/src/ops-backend.ts +414 -0
  276. package/src/provisioner-identity.test.ts +482 -0
  277. package/src/provisioner-identity.ts +407 -0
  278. package/src/redirects-emit.ts +175 -0
  279. package/src/region-data.ts +428 -0
  280. package/src/regions.test.ts +277 -0
  281. package/src/regions.ts +370 -0
  282. package/src/release-contract.ts +57 -0
  283. package/src/release-manifest.test.ts +293 -0
  284. package/src/release-manifest.ts +430 -0
  285. package/src/run-mode.ts +40 -0
  286. package/src/runtime-secrets.test.ts +627 -0
  287. package/src/runtime-secrets.ts +754 -0
  288. package/src/self-command.test.ts +14 -0
  289. package/src/self-command.ts +21 -0
  290. package/src/self-hosted-compose.test.ts +177 -0
  291. package/src/self-hosted-release.ts +240 -0
  292. package/src/self-hosted-roles.integration.test.ts +161 -0
  293. package/src/self-hosted-roles.test.ts +124 -0
  294. package/src/self-hosted-roles.ts +203 -0
  295. package/src/self-hosted-upgrade.test.ts +394 -0
  296. package/src/self-hosted-upgrade.ts +548 -0
  297. package/src/stack-contract-parity.test.ts +199 -0
  298. package/src/stack-contract.test.ts +391 -0
  299. package/src/stack-contract.ts +888 -0
  300. package/src/stack-converge-secrets.test.ts +421 -0
  301. package/src/stack-converge.test.ts +833 -0
  302. package/src/stack-converge.ts +909 -0
  303. package/src/staging-admin.test.ts +246 -0
  304. package/src/staging-admin.ts +324 -0
  305. package/src/state-attach.test.ts +211 -0
  306. package/src/state-attach.ts +132 -0
  307. package/src/state-backend.test.ts +145 -0
  308. package/src/state-backend.ts +262 -0
  309. package/src/state-command.ts +293 -0
  310. package/src/state-migrate.test.ts +479 -0
  311. package/src/state-migrate.ts +434 -0
  312. package/src/state-pulumi.ts +289 -0
  313. package/src/state-store.test.ts +212 -0
  314. package/src/state-store.ts +243 -0
  315. package/src/upgrade/app-roll.ts +486 -0
  316. package/src/upgrade/backup.ts +109 -0
  317. package/src/upgrade/converge.ts +437 -0
  318. package/src/upgrade/gcp-lookup.ts +167 -0
  319. package/src/upgrade/health.test.ts +279 -0
  320. package/src/upgrade/health.ts +305 -0
  321. package/src/upgrade/release-images.test.ts +119 -0
  322. package/src/upgrade/release-images.ts +391 -0
  323. package/src/upgrade/reporter.ts +46 -0
  324. package/src/upgrade/upgrade.test.ts +626 -0
  325. package/src/upgrade/upgrade.ts +249 -0
  326. package/src/upgrader-assess.test.ts +265 -0
  327. package/src/upgrader-assess.ts +233 -0
  328. package/src/upgrader-gcp.ts +123 -0
  329. package/src/upgrader-job.test.ts +408 -0
  330. package/src/upgrader-job.ts +499 -0
  331. package/src/upgrader-reporter.test.ts +46 -0
  332. package/src/upgrader-reporter.ts +105 -0
  333. package/src/upgrader-setup.test.ts +169 -0
  334. package/src/upgrader-setup.ts +355 -0
  335. package/src/wizard.ts +425 -0
  336. package/src/wizards/gcp-cost.ts +188 -0
  337. package/src/wizards/gcp-firebase.ts +72 -0
  338. package/src/wizards/gcp-install-job.ts +506 -0
  339. package/src/wizards/gcp-prompts.ts +26 -0
  340. package/src/wizards/gcp-pulumi.test.ts +246 -0
  341. package/src/wizards/gcp-pulumi.ts +516 -0
  342. package/src/wizards/gcp.ts +1935 -0
@@ -0,0 +1,290 @@
1
+ // SPDX-License-Identifier: MPL-2.0
2
+ import { selfCommand } from "./self-command.js";
3
+ import { describeBackend, gcsBackendRecord, installBackend, } from "./state-backend.js";
4
+ /** First Pulumi CLI release with `pulumi stack migrate` between DIY backends. */
5
+ export const STACK_MIGRATE_MIN_VERSION = "3.254.0";
6
+ /** What the ops bucket + KMS key cost (wizards/gcp-cost.ts carries the same line). */
7
+ export const OPS_BACKEND_COST_NOTE = "Creates (if missing) a versioned Cloud Storage bucket + one Cloud KMS key in the install's project: < $0.10/mo (KMS key version $0.06/mo, a few MB of state).";
8
+ /** a >= b for dotted numeric versions (`3.254.0`). */
9
+ export function versionAtLeast(a, b) {
10
+ const pa = a.replace(/^v/, "").split(/[.+-]/).map(Number);
11
+ const pb = b.replace(/^v/, "").split(".").map(Number);
12
+ for (let i = 0; i < 3; i++) {
13
+ const x = pa[i] ?? 0;
14
+ const y = pb[i] ?? 0;
15
+ if (Number.isNaN(x))
16
+ return false;
17
+ if (x !== y)
18
+ return x > y;
19
+ }
20
+ return true;
21
+ }
22
+ const errorText = (e) => (e instanceof Error ? e.message : String(e));
23
+ /**
24
+ * Run the migration. Never throws for an expected failure: the result says
25
+ * what failed, and at every failure point the source backend is still the
26
+ * one install.json names.
27
+ */
28
+ export async function migrateState(meta, opts, deps) {
29
+ const { report, pulumi } = deps;
30
+ if (meta.provider !== "gcp" && meta.provider !== "gcp-firebase") {
31
+ return {
32
+ ok: false,
33
+ error: `${meta.provider} installs keep their state on the host; there is nothing to migrate.`,
34
+ };
35
+ }
36
+ if (!meta.projectId || !meta.region) {
37
+ return {
38
+ ok: false,
39
+ error: `install.json of ${meta.installId} has no projectId/region; re-run the installer first.`,
40
+ };
41
+ }
42
+ const projectId = meta.projectId;
43
+ const current = installBackend(meta);
44
+ const wantKind = opts.to === "remote" ? "gcs" : "local";
45
+ if (current.kind === wantKind) {
46
+ report.success(`Already ${opts.to}: ${describeBackend(meta, `~/.caelo-${meta.installId}`)}. Nothing to do.`);
47
+ return { ok: true, changed: false };
48
+ }
49
+ const remoteRecord = current.kind === "gcs" ? current : gcsBackendRecord(meta.projectId, meta.region);
50
+ const targetRecord = opts.to === "remote" ? remoteRecord : { kind: "local" };
51
+ // --- 1. Preflight (read-only) ------------------------------------------
52
+ if (opts.to === "remote") {
53
+ let recorded;
54
+ try {
55
+ recorded = deps.remoteRecordedBackend();
56
+ }
57
+ catch (e) {
58
+ return { ok: false, error: `${errorText(e)}. Nothing was changed.` };
59
+ }
60
+ if (recorded === "gcs") {
61
+ return {
62
+ ok: false,
63
+ error: `gs://${remoteRecord.bucket}/install/install.json says this install's state already lives in the bucket — another machine migrated it, so the local state here is out of date. Nothing was changed. Use the bucket instead: ${selfCommand("attach", "--project", projectId)} (after moving ~/.caelo-${meta.installId} aside).`,
64
+ };
65
+ }
66
+ }
67
+ const pre = report.step("Preflight: Pulumi CLI, source stack, pending operations, drift");
68
+ let from;
69
+ let mode;
70
+ let sourceDigest;
71
+ /** The source's checkpoint, to notice another run writing it meanwhile. */
72
+ let sourceState;
73
+ try {
74
+ const version = await pulumi.cliVersion();
75
+ if (!version) {
76
+ pre.failed("The pulumi CLI is not installed");
77
+ return {
78
+ ok: false,
79
+ error: "Install the Pulumi CLI (https://www.pulumi.com/docs/install/) and re-run.",
80
+ };
81
+ }
82
+ mode = versionAtLeast(version, STACK_MIGRATE_MIN_VERSION) ? "stack-migrate" : "export-import";
83
+ from = deps.resolve(current);
84
+ if (!(await pulumi.stackExists(from))) {
85
+ pre.failed("No stack in the source backend");
86
+ return {
87
+ ok: false,
88
+ error: `The install's stack is not in ${from.url}. Nothing was changed.`,
89
+ };
90
+ }
91
+ if (await pulumi.locked(from)) {
92
+ pre.failed("A Pulumi run holds the stack's lock");
93
+ return {
94
+ ok: false,
95
+ error: "A Pulumi run (installer) is updating this stack right now. Migrate once it has finished. Nothing was changed.",
96
+ };
97
+ }
98
+ const pending = await pulumi.pendingOperations(from);
99
+ if (pending > 0) {
100
+ pre.failed(`${pending} pending operation(s) from an interrupted run`);
101
+ return {
102
+ ok: false,
103
+ error: `The stack records ${pending} pending operation(s) from an interrupted Pulumi run. Run upgrade first, then re-run the installer (${selfCommand()}, pick this install) so the stack is refreshed, and migrate after that. Nothing was changed.`,
104
+ };
105
+ }
106
+ const drift = await pulumi.previewChanges(from);
107
+ if (drift > 0) {
108
+ pre.failed(`A preview shows ${drift} change(s)`);
109
+ return {
110
+ ok: false,
111
+ error: `The stack is not converged (a preview shows ${drift} change(s)), so a copy can't be proven identical. Run upgrade first, then re-run the installer (${selfCommand()}, pick this install) until it reports no changes, and migrate after that. Nothing was changed.`,
112
+ };
113
+ }
114
+ sourceDigest = await pulumi.outputsDigest(from);
115
+ sourceState = await pulumi.stateDigest(from);
116
+ pre.done(`Source ok: ${from.url}, no pending operations, no drift (Pulumi ${version}, ${mode === "stack-migrate" ? "pulumi stack migrate" : "export/import fallback"})`);
117
+ }
118
+ catch (e) {
119
+ pre.failed("Preflight failed");
120
+ return { ok: false, error: `${errorText(e)}. Nothing was changed.` };
121
+ }
122
+ // --- Dry run: report and stop -----------------------------------------
123
+ if (opts.dryRun) {
124
+ const plan = [`back up ~/.caelo-${meta.installId}/ (mode 600 archive)`];
125
+ if (opts.to === "remote") {
126
+ const r = await deps.ensureRemote(true);
127
+ if (!r.ok)
128
+ return { ok: false, error: r.error };
129
+ plan.push(...r.actions);
130
+ }
131
+ else {
132
+ if (!deps.localStateEmpty()) {
133
+ plan.push("would move the unused stack in ~/.caelo-<id>/state aside (state.migrated-<time>, kept) — a leftover of an interrupted migration");
134
+ }
135
+ plan.push("would create ~/.caelo-<id>/state and secrets/pulumi-passphrase if missing");
136
+ }
137
+ plan.push(`would copy the stack ${from.url} → ${opts.to === "remote" ? `gs://${remoteRecord.bucket}` : "~/.caelo-<id>/state"} (${mode}), re-encrypting its secrets`, "would verify: preview shows no changes, outputs hash identical", `would record stateBackend=${targetRecord.kind} in install.json${opts.to === "remote" ? " (locally and in the bucket)" : ""}`, ...(opts.to === "remote"
138
+ ? ["would rename ~/.caelo-<id>/state to state.migrated-<time> (kept)"]
139
+ : []));
140
+ report.info(["Dry run — nothing changed. The migration would:", ...plan.map((p) => ` ${p}`)].join("\n"));
141
+ return { ok: true, changed: false };
142
+ }
143
+ // --- 2. Backup -----------------------------------------------------------
144
+ const bk = report.step(`Backing up ~/.caelo-${meta.installId}/`);
145
+ try {
146
+ bk.done(`Backup: ${await deps.backup()} (mode 600; holds the passphrase — keep it private)`);
147
+ }
148
+ catch (e) {
149
+ bk.failed("Backup failed");
150
+ return { ok: false, error: `${errorText(e)}. Nothing was changed.` };
151
+ }
152
+ // --- 3a. Ops bucket + KMS key (remote), then the migration lock ----------
153
+ if (opts.to === "remote") {
154
+ // CLAUDE.md §11.C — nothing billable without the operator's yes.
155
+ if (!(await deps.confirmCost(OPS_BACKEND_COST_NOTE))) {
156
+ return { ok: false, error: "Cancelled at the cost confirmation. Only the backup was taken." };
157
+ }
158
+ const en = report.step(`Ensuring gs://${remoteRecord.bucket} + KMS key ${remoteRecord.kmsKey.split("/").slice(-3).join("/")}`);
159
+ const r = await deps.ensureRemote(false);
160
+ if (!r.ok) {
161
+ en.failed("Could not ensure the ops bucket + KMS key");
162
+ return { ok: false, error: `${r.error} Nothing else was changed.` };
163
+ }
164
+ en.done(`gs://${remoteRecord.bucket} + KMS key ready`);
165
+ }
166
+ // The install's state lock, shared with installer runs (`pulumi up`) and
167
+ // other migrations: held from the authority check through the flip, so
168
+ // nobody writes the source after it was copied, and no concurrent
169
+ // migration takes a copy the other just made authoritative for a leftover.
170
+ let release;
171
+ try {
172
+ release = await deps.lock();
173
+ }
174
+ catch (e) {
175
+ return { ok: false, error: `${errorText(e)}. Nothing else was changed.` };
176
+ }
177
+ try {
178
+ const recorded = deps.remoteRecordedBackend();
179
+ if (opts.to === "remote" && recorded === "gcs") {
180
+ return {
181
+ ok: false,
182
+ error: `Another machine just finished migrating this install into gs://${remoteRecord.bucket}; the local state here is out of date. Nothing else was changed. Use: ${selfCommand("attach", "--project", projectId)}`,
183
+ };
184
+ }
185
+ if (opts.to === "local" && recorded !== "gcs") {
186
+ return {
187
+ ok: false,
188
+ error: `gs://${remoteRecord.bucket}/install/install.json no longer names the bucket as this install's state (another machine moved it back to itself). Nothing else was changed; manage the install from that machine.`,
189
+ };
190
+ }
191
+ return await finish();
192
+ }
193
+ finally {
194
+ await release().catch((e) => report.warn(errorText(e)));
195
+ }
196
+ async function finish() {
197
+ // --- 3. Target -----------------------------------------------------------
198
+ const tg = report.step(opts.to === "remote" ? "Preparing the bucket target" : "Preparing the local state dir");
199
+ let to;
200
+ try {
201
+ if (opts.to === "local" && !deps.localStateEmpty()) {
202
+ // install.json names the bucket, so a stack here is not in use: the
203
+ // leftover of an interrupted `--to local`. Kept, never deleted.
204
+ const moved = deps.retireLocalState();
205
+ report.info(`Moved an unused local stack (interrupted migration?) aside to ${moved}`);
206
+ }
207
+ if (opts.to === "local")
208
+ deps.prepareLocalTarget();
209
+ to = deps.resolve(targetRecord);
210
+ // A remote stack here is not authoritative (checked in the preflight:
211
+ // the bucket's install.json doesn't name it), so it is the leftover of
212
+ // an interrupted migration or of an earlier `--to local`.
213
+ if (await pulumi.stackExists(to)) {
214
+ report.info(`Replacing an unused copy in ${to.url} (left by an earlier or interrupted migration)`);
215
+ await pulumi.removeStack(to);
216
+ }
217
+ tg.done(`Target ready: ${to.url}`);
218
+ }
219
+ catch (e) {
220
+ tg.failed("Could not prepare the target");
221
+ return { ok: false, error: `${errorText(e)}. The source is unchanged and still in use.` };
222
+ }
223
+ // --- 4 + 5. Copy and verify ----------------------------------------------
224
+ const cp = report.step(`Copying the stack to ${to.url} and verifying it`);
225
+ const abandon = async (why) => {
226
+ cp.failed(why);
227
+ try {
228
+ await pulumi.removeStack(to);
229
+ }
230
+ catch (e) {
231
+ report.warn(`Could not remove the partial copy in ${to.url}: ${errorText(e)}`);
232
+ }
233
+ return {
234
+ ok: false,
235
+ error: `${why}. The copy was discarded; install.json still names ${from.url}, which stays authoritative.`,
236
+ };
237
+ };
238
+ try {
239
+ if (mode === "stack-migrate")
240
+ await pulumi.stackMigrate(from, to);
241
+ else
242
+ await pulumi.exportImport(from, to);
243
+ }
244
+ catch (e) {
245
+ return abandon(`Copy failed: ${errorText(e)}`);
246
+ }
247
+ try {
248
+ const changes = await pulumi.previewChanges(to);
249
+ if (changes > 0)
250
+ return abandon(`Verification failed: a preview of the copy shows ${changes} change(s)`);
251
+ if ((await pulumi.outputsDigest(to)) !== sourceDigest) {
252
+ return abandon("Verification failed: the copy's outputs differ from the source's");
253
+ }
254
+ // An installer run elsewhere may have updated the source since the
255
+ // preflight (only migrations take the lock): the copy would then miss
256
+ // that update. Checked last, right before the switch.
257
+ if ((await pulumi.locked(from)) || (await pulumi.stateDigest(from)) !== sourceState) {
258
+ return abandon("The source stack changed during the migration (another run updated it); migrate again once it is idle");
259
+ }
260
+ }
261
+ catch (e) {
262
+ return abandon(`Verification failed: ${errorText(e)}`);
263
+ }
264
+ cp.done("Copied; preview shows no changes and the outputs match");
265
+ // --- 6. Flip ---------------------------------------------------------------
266
+ const fl = report.step("Recording the new backend in install.json");
267
+ try {
268
+ deps.adopt(targetRecord);
269
+ }
270
+ catch (e) {
271
+ fl.failed("Could not record the new backend");
272
+ return {
273
+ ok: false,
274
+ error: `${errorText(e)}. The copy in ${to.url} is complete, but install.json still names ${from.url}; re-run state migrate to finish.`,
275
+ };
276
+ }
277
+ fl.done(`install.json: stateBackend=${targetRecord.kind}`);
278
+ if (opts.to === "remote") {
279
+ const moved = deps.retireLocalState();
280
+ if (moved)
281
+ report.info(`Old local state kept at ${moved} (not used any more; delete it once you are confident)`);
282
+ report.success(`Done. Pulumi state + install metadata now live in gs://${remoteRecord.bucket}; secrets are encrypted with Cloud KMS. Other machines: ${selfCommand("attach", "--project", projectId)}`);
283
+ }
284
+ else {
285
+ report.success(`Done. Pulumi state is back in ~/.caelo-${meta.installId}/state (passphrase in secrets/). The copy in gs://${remoteRecord.bucket}/pulumi is no longer used; the bucket's install.json now says so.`);
286
+ }
287
+ return { ok: true, changed: true };
288
+ }
289
+ }
290
+ //# sourceMappingURL=state-migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-migrate.js","sourceRoot":"","sources":["../src/state-migrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { StatePulumiOps } from "./state-migrate.js";
2
+ import { type StackConfigInputs } from "./wizards/gcp-pulumi.js";
3
+ /** Canonical JSON (sorted keys) so equal outputs hash equally. */
4
+ export declare function canonicalJson(value: unknown): string;
5
+ /** Steps of a preview's change summary other than "same". */
6
+ export declare function changeCount(summary: Readonly<Record<string, number | undefined>>): number;
7
+ export interface RealPulumiOpsInputs {
8
+ readonly provider: "gcp" | "gcp-firebase";
9
+ readonly installRoot: string;
10
+ /** The service account the GCP provider impersonates during previews. */
11
+ readonly impersonateServiceAccount: string;
12
+ /** The config a wizard run sets, so a preview shows real drift only. */
13
+ readonly stackConfig: StackConfigInputs;
14
+ }
15
+ /** {@link StatePulumiOps} backed by the `pulumi` CLI + Automation API. */
16
+ export declare function realStatePulumiOps(inputs: RealPulumiOpsInputs): StatePulumiOps;
17
+ //# sourceMappingURL=state-pulumi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-pulumi.d.ts","sourceRoot":"","sources":["../src/state-pulumi.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAKL,KAAK,iBAAiB,EAGvB,MAAM,yBAAyB,CAAC;AASjC,kEAAkE;AAClE,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CASpD;AAED,6DAA6D;AAC7D,wBAAgB,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,GAAG,MAAM,CAIzF;AAWD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,KAAK,GAAG,cAAc,CAAC;IAC1C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,yEAAyE;IACzE,QAAQ,CAAC,yBAAyB,EAAE,MAAM,CAAC;IAC3C,wEAAwE;IACxE,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;CACzC;AAED,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,cAAc,CAmN9E"}
@@ -0,0 +1,218 @@
1
+ // SPDX-License-Identifier: MPL-2.0
2
+ /**
3
+ * The real {@link StatePulumiOps} for `state migrate` (#696): the Pulumi CLI
4
+ * (state operations) and the Automation API (previews), always in the
5
+ * install's stack dir and with exactly the backend's environment. The
6
+ * operator never runs `pulumi` by hand (CLAUDE.md §11.C).
7
+ *
8
+ * Secrets: outputs are read with `--show-secrets` only to hash them; the
9
+ * values never leave {@link outputsDigest}. The export/import fallback
10
+ * writes the deployment without `--show-secrets` (ciphertext only) to a
11
+ * mode-600 file in the install dir and deletes it afterwards.
12
+ */
13
+ import { createHash } from "node:crypto";
14
+ import { existsSync, readdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
15
+ import { join } from "node:path";
16
+ import * as automation from "@pulumi/pulumi/automation";
17
+ import { redactCredentials } from "./checkpoint-secrets.js";
18
+ import { GCP_STACK_ENV } from "./gcp-names.js";
19
+ import { alignStackSettingsFile, applyStackConfig, gcpStackWorkDir, pulumiGcpEnv, stateOnlyEnv, } from "./wizards/gcp-pulumi.js";
20
+ /** Every file below `dir`. */
21
+ function listFilesRecursive(dir) {
22
+ return readdirSync(dir, { recursive: true, withFileTypes: true })
23
+ .filter((e) => e.isFile())
24
+ .map((e) => e.name);
25
+ }
26
+ /** Canonical JSON (sorted keys) so equal outputs hash equally. */
27
+ export function canonicalJson(value) {
28
+ if (Array.isArray(value))
29
+ return `[${value.map(canonicalJson).join(",")}]`;
30
+ if (value !== null && typeof value === "object") {
31
+ const entries = Object.entries(value).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0);
32
+ return `{${entries.map(([k, v]) => `${JSON.stringify(k)}:${canonicalJson(v)}`).join(",")}}`;
33
+ }
34
+ return JSON.stringify(value);
35
+ }
36
+ /** Steps of a preview's change summary other than "same". */
37
+ export function changeCount(summary) {
38
+ return Object.entries(summary)
39
+ .filter(([op]) => op !== "same")
40
+ .reduce((n, [, c]) => n + (c ?? 0), 0);
41
+ }
42
+ /** {@link StatePulumiOps} backed by the `pulumi` CLI + Automation API. */
43
+ export function realStatePulumiOps(inputs) {
44
+ const workDir = gcpStackWorkDir(inputs.provider);
45
+ const cli = async (args, env) => {
46
+ const p = Bun.spawn(["pulumi", ...args, "--cwd", workDir, "--non-interactive"], {
47
+ env: { ...process.env, ...env, PULUMI_SKIP_UPDATE_CHECK: "true" },
48
+ stdout: "pipe",
49
+ stderr: "pipe",
50
+ });
51
+ const [stdout, stderr] = await Promise.all([
52
+ new Response(p.stdout).text(),
53
+ new Response(p.stderr).text(),
54
+ ]);
55
+ if ((await p.exited) !== 0) {
56
+ throw new Error(`pulumi ${args[0]} ${args[1] ?? ""} failed: ${redactCredentials(stderr.trim().split("\n").slice(-3).join(" "))}`);
57
+ }
58
+ return { stdout, stderr };
59
+ };
60
+ // The read-only steps (preflight, verification) align the package's
61
+ // stack settings file and may set config to run a preview; the file is
62
+ // put back exactly as it was afterwards, so a refused migration or a dry
63
+ // run leaves it untouched.
64
+ const settingsFile = join(workDir, `Pulumi.${GCP_STACK_ENV}.yaml`);
65
+ const preserved = async (fn) => {
66
+ // Read without a separate existence check (no check-then-use race), and
67
+ // put the file back atomically (temp file + rename).
68
+ let before;
69
+ try {
70
+ before = readFileSync(settingsFile);
71
+ }
72
+ catch (e) {
73
+ if (e.code !== "ENOENT")
74
+ throw e;
75
+ before = null;
76
+ }
77
+ try {
78
+ return await fn();
79
+ }
80
+ finally {
81
+ if (before === null)
82
+ rmSync(settingsFile, { force: true });
83
+ else {
84
+ const tmp = `${settingsFile}.restore-${process.pid}`;
85
+ writeFileSync(tmp, before, { flag: "w" });
86
+ renameSync(tmp, settingsFile);
87
+ }
88
+ }
89
+ };
90
+ const exportDeployment = async (b) => {
91
+ await alignStackSettingsFile(b, inputs.provider);
92
+ const { stdout } = await cli(["stack", "export", "--stack", GCP_STACK_ENV], stateOnlyEnv(b));
93
+ return (JSON.parse(stdout).deployment ?? {});
94
+ };
95
+ /** Env for an operation that reads one backend and writes another. */
96
+ const bothEnv = (from, to) => ({
97
+ ...stateOnlyEnv(from),
98
+ ...stateOnlyEnv(to),
99
+ });
100
+ const ops = {
101
+ async cliVersion() {
102
+ const p = Bun.spawnSync(["pulumi", "version"], { stdout: "pipe", stderr: "pipe" });
103
+ if (p.exitCode !== 0)
104
+ return null;
105
+ return new TextDecoder().decode(p.stdout).trim().replace(/^v/, "") || null;
106
+ },
107
+ async stackExists(b) {
108
+ const { stdout } = await cli(["stack", "ls", "--json"], stateOnlyEnv(b));
109
+ const stacks = JSON.parse(stdout || "[]");
110
+ return stacks.some((s) => s.name === GCP_STACK_ENV || s.name?.endsWith(`/${GCP_STACK_ENV}`));
111
+ },
112
+ async locked(b) {
113
+ // Pulumi's DIY backends keep one lock file per running operation under
114
+ // .pulumi/locks/ (file:// and gs:// alike).
115
+ if (b.url.startsWith("file://")) {
116
+ const dir = join(b.url.slice("file://".length), ".pulumi", "locks");
117
+ return existsSync(dir) && listFilesRecursive(dir).length > 0;
118
+ }
119
+ const r = Bun.spawnSync(["gcloud", "storage", "ls", `${b.url}/.pulumi/locks/**`], {
120
+ stdout: "pipe",
121
+ stderr: "pipe",
122
+ env: { ...process.env, CLOUDSDK_CORE_DISABLE_PROMPTS: "1" },
123
+ });
124
+ if (r.exitCode === 0)
125
+ return new TextDecoder().decode(r.stdout).trim().length > 0;
126
+ const err = new TextDecoder().decode(r.stderr);
127
+ if (/matched no objects|No URLs matched|NotFound|404/i.test(err))
128
+ return false;
129
+ throw new Error(`Could not check the stack lock in ${b.url}: ${err.trim()}`);
130
+ },
131
+ async stateDigest(b) {
132
+ const deployment = await exportDeployment(b);
133
+ return createHash("sha256").update(canonicalJson(deployment)).digest("hex");
134
+ },
135
+ async pendingOperations(b) {
136
+ return (await exportDeployment(b)).pending_operations?.length ?? 0;
137
+ },
138
+ async previewChanges(b) {
139
+ await alignStackSettingsFile(b, inputs.provider);
140
+ const stack = await automation.LocalWorkspace.selectStack({ stackName: GCP_STACK_ENV, workDir }, {
141
+ envVars: pulumiGcpEnv(process.env, {
142
+ backend: b,
143
+ impersonateServiceAccount: inputs.impersonateServiceAccount,
144
+ }),
145
+ });
146
+ // The stack's own config wins: an operator may have tuned a knob
147
+ // (`pulumi config set`), and resetting it would show as drift. Only a
148
+ // stack dir without the install's config (a fresh `bunx` version)
149
+ // gets what the wizard sets — as does one holding another install's
150
+ // config (installs of one provider share the package's stack dir).
151
+ const config = await stack.getAllConfig().catch(() => ({}));
152
+ if (config[`caelo-${inputs.provider}:project`]?.value !== inputs.stackConfig.projectId) {
153
+ const resources = ((await stack.exportStack()).deployment?.resources ??
154
+ []);
155
+ await applyStackConfig(stack, inputs.stackConfig, resources);
156
+ }
157
+ const r = await stack.preview({ refresh: true });
158
+ return changeCount(r.changeSummary);
159
+ },
160
+ async outputsDigest(b) {
161
+ await alignStackSettingsFile(b, inputs.provider);
162
+ const { stdout } = await cli(["stack", "output", "--stack", GCP_STACK_ENV, "--json", "--show-secrets"], stateOnlyEnv(b));
163
+ return createHash("sha256")
164
+ .update(canonicalJson(JSON.parse(stdout || "{}")))
165
+ .digest("hex");
166
+ },
167
+ async stackMigrate(from, to) {
168
+ await alignStackSettingsFile(from, inputs.provider);
169
+ await cli([
170
+ "stack",
171
+ "migrate",
172
+ from.url,
173
+ GCP_STACK_ENV,
174
+ "--secrets-provider",
175
+ to.secretsProvider,
176
+ "--yes",
177
+ ], bothEnv(from, to));
178
+ },
179
+ async exportImport(from, to) {
180
+ const deployment = await exportDeployment(from);
181
+ const file = join(inputs.installRoot, `.migrate-export-${process.pid}.json`);
182
+ try {
183
+ const { stdout } = await cli(["stack", "export", "--stack", GCP_STACK_ENV], stateOnlyEnv(from));
184
+ writeFileSync(file, stdout, { mode: 0o600 });
185
+ // The target stack starts with the source's secrets manager, so the
186
+ // imported ciphertext decrypts; change-secrets-provider re-encrypts.
187
+ const ws = await automation.LocalWorkspace.create({ workDir, envVars: stateOnlyEnv(to) });
188
+ const settings = await ws.stackSettings(GCP_STACK_ENV).catch(() => ({}));
189
+ const sp = deployment.secrets_providers;
190
+ const { secretsProvider: _p, encryptedKey: _k, encryptionSalt: _s, ...rest } = settings;
191
+ await ws.saveStackSettings(GCP_STACK_ENV, {
192
+ ...rest,
193
+ ...(sp?.type === "passphrase" && sp.state?.salt ? { encryptionSalt: sp.state.salt } : {}),
194
+ ...(sp?.type === "cloud" && sp.state?.url
195
+ ? { secretsProvider: sp.state.url, encryptedKey: sp.state.encryptedkey }
196
+ : {}),
197
+ });
198
+ await cli(["stack", "init", GCP_STACK_ENV, "--secrets-provider", from.secretsProvider], bothEnv(from, to));
199
+ await cli(["stack", "import", "--stack", GCP_STACK_ENV, "--file", file], bothEnv(from, to));
200
+ await cli(["stack", "change-secrets-provider", "--stack", GCP_STACK_ENV, to.secretsProvider], bothEnv(from, to));
201
+ }
202
+ finally {
203
+ rmSync(file, { force: true });
204
+ }
205
+ },
206
+ async removeStack(b) {
207
+ await cli(["stack", "rm", GCP_STACK_ENV, "--force", "--yes", "--preserve-config"], stateOnlyEnv(b));
208
+ },
209
+ };
210
+ return {
211
+ ...ops,
212
+ pendingOperations: (b) => preserved(() => ops.pendingOperations(b)),
213
+ stateDigest: (b) => preserved(() => ops.stateDigest(b)),
214
+ previewChanges: (b) => preserved(() => ops.previewChanges(b)),
215
+ outputsDigest: (b) => preserved(() => ops.outputsDigest(b)),
216
+ };
217
+ }
218
+ //# sourceMappingURL=state-pulumi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-pulumi.js","sourceRoot":"","sources":["../src/state-pulumi.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnG,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,UAAU,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG/C,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,eAAe,EACf,YAAY,EAGZ,YAAY,GACb,MAAM,yBAAyB,CAAC;AAEjC,8BAA8B;AAC9B,SAAS,kBAAkB,CAAC,GAAW;IACrC,OAAO,WAAW,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SAC9D,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACzB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAC3E,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACjF,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC3B,CAAC;QACF,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAC9F,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,WAAW,CAAC,OAAqD;IAC/E,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;SAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,MAAM,CAAC;SAC/B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC;AAoBD,0EAA0E;AAC1E,MAAM,UAAU,kBAAkB,CAAC,MAA2B;IAC5D,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEjD,MAAM,GAAG,GAAG,KAAK,EACf,IAAc,EACd,GAA2B,EACkB,EAAE;QAC/C,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,CAAC,EAAE;YAC9E,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,wBAAwB,EAAE,MAAM,EAAE;YACjE,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACzC,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE;YAC7B,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE;SAC9B,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACb,UAAU,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,YAAY,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CACjH,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC,CAAC;IAEF,oEAAoE;IACpE,uEAAuE;IACvE,yEAAyE;IACzE,2BAA2B;IAC3B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,aAAa,OAAO,CAAC,CAAC;IACnE,MAAM,SAAS,GAAG,KAAK,EAAK,EAAoB,EAAc,EAAE;QAC9D,wEAAwE;QACxE,qDAAqD;QACrD,IAAI,MAAqB,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAK,CAA2B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,CAAC,CAAC;YAC5D,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;QACD,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;gBAAS,CAAC;YACT,IAAI,MAAM,KAAK,IAAI;gBAAE,MAAM,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;iBACtD,CAAC;gBACJ,MAAM,GAAG,GAAG,GAAG,YAAY,YAAY,OAAO,CAAC,GAAG,EAAE,CAAC;gBACrD,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC1C,UAAU,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,KAAK,EAAE,CAAkB,EAAuB,EAAE;QACzE,MAAM,sBAAsB,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7F,OAAO,CAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAiC,CAAC,UAAU,IAAI,EAAE,CAAe,CAAC;IAC9F,CAAC,CAAC;IAEF,sEAAsE;IACtE,MAAM,OAAO,GAAG,CAAC,IAAqB,EAAE,EAAmB,EAA0B,EAAE,CAAC,CAAC;QACvF,GAAG,YAAY,CAAC,IAAI,CAAC;QACrB,GAAG,YAAY,CAAC,EAAE,CAAC;KACpB,CAAC,CAAC;IAEH,MAAM,GAAG,GAAmB;QAC1B,KAAK,CAAC,UAAU;YACd,MAAM,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YACnF,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YAClC,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC;QAC7E,CAAC;QAED,KAAK,CAAC,WAAW,CAAC,CAAC;YACjB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;YACzE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAwB,CAAC;YACjE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC,CAAC;QAC/F,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,CAAC;YACZ,uEAAuE;YACvE,4CAA4C;YAC5C,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAChC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;gBACpE,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YAC/D,CAAC;YACD,MAAM,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,mBAAmB,CAAC,EAAE;gBAChF,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE,MAAM;gBACd,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,6BAA6B,EAAE,GAAG,EAAE;aAC5D,CAAC,CAAC;YACH,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC;gBAAE,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;YAClF,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC/C,IAAI,kDAAkD,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC/E,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC/E,CAAC;QAED,KAAK,CAAC,WAAW,CAAC,CAAC;YACjB,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,CAAC,CAAC,CAAC;YAC7C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9E,CAAC;QAED,KAAK,CAAC,iBAAiB,CAAC,CAAC;YACvB,OAAO,CAAC,MAAM,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,EAAE,MAAM,IAAI,CAAC,CAAC;QACrE,CAAC;QAED,KAAK,CAAC,cAAc,CAAC,CAAC;YACpB,MAAM,sBAAsB,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,WAAW,CACvD,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,EACrC;gBACE,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE;oBACjC,OAAO,EAAE,CAAC;oBACV,yBAAyB,EAAE,MAAM,CAAC,yBAAyB;iBAC5D,CAAC;aACH,CACF,CAAC;YACF,iEAAiE;YACjE,sEAAsE;YACtE,kEAAkE;YAClE,oEAAoE;YACpE,mEAAmE;YACnE,MAAM,MAAM,GAAyB,MAAM,KAAK,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAClF,IAAI,MAAM,CAAC,SAAS,MAAM,CAAC,QAAQ,UAAU,CAAC,EAAE,KAAK,KAAK,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;gBACvF,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,UAAU,EAAE,SAAS;oBAClE,EAAE,CAAoB,CAAC;gBACzB,MAAM,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YAC/D,CAAC;YACD,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACjD,OAAO,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QACtC,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,CAAC;YACnB,MAAM,sBAAsB,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YACjD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAC1B,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,gBAAgB,CAAC,EACzE,YAAY,CAAC,CAAC,CAAC,CAChB,CAAC;YACF,OAAO,UAAU,CAAC,QAAQ,CAAC;iBACxB,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC;iBACjD,MAAM,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;QAED,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE;YACzB,MAAM,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YACpD,MAAM,GAAG,CACP;gBACE,OAAO;gBACP,SAAS;gBACT,IAAI,CAAC,GAAG;gBACR,aAAa;gBACb,oBAAoB;gBACpB,EAAE,CAAC,eAAe;gBAClB,OAAO;aACR,EACD,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAClB,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE;YACzB,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,mBAAmB,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;YAC7E,IAAI,CAAC;gBACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAC1B,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,CAAC,EAC7C,YAAY,CAAC,IAAI,CAAC,CACnB,CAAC;gBACF,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC7C,oEAAoE;gBACpE,qEAAqE;gBACrE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC1F,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzE,MAAM,EAAE,GAAG,UAAU,CAAC,iBAAiB,CAAC;gBACxC,MAAM,EACJ,eAAe,EAAE,EAAE,EACnB,YAAY,EAAE,EAAE,EAChB,cAAc,EAAE,EAAE,EAClB,GAAG,IAAI,EACR,GAAG,QAAoC,CAAC;gBACzC,MAAM,EAAE,CAAC,iBAAiB,CAAC,aAAa,EAAE;oBACxC,GAAG,IAAI;oBACP,GAAG,CAAC,EAAE,EAAE,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzF,GAAG,CAAC,EAAE,EAAE,IAAI,KAAK,OAAO,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG;wBACvC,CAAC,CAAC,EAAE,eAAe,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE;wBACxE,CAAC,CAAC,EAAE,CAAC;iBACR,CAAC,CAAC;gBACH,MAAM,GAAG,CACP,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,oBAAoB,EAAE,IAAI,CAAC,eAAe,CAAC,EAC5E,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAClB,CAAC;gBACF,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;gBAC5F,MAAM,GAAG,CACP,CAAC,OAAO,EAAE,yBAAyB,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE,CAAC,eAAe,CAAC,EAClF,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAClB,CAAC;YACJ,CAAC;oBAAS,CAAC;gBACT,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,KAAK,CAAC,WAAW,CAAC,CAAC;YACjB,MAAM,GAAG,CACP,CAAC,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,mBAAmB,CAAC,EACvE,YAAY,CAAC,CAAC,CAAC,CAChB,CAAC;QACJ,CAAC;KACF,CAAC;IACF,OAAO;QACL,GAAG,GAAG;QACN,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;QACnE,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QACvD,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QAC7D,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;KAC5D,CAAC;AACJ,CAAC"}
@@ -52,4 +52,31 @@ export declare class GcsStateStore implements StateStore {
52
52
  read(file: StateFile): string | null;
53
53
  write(file: StateFile, value: unknown): void;
54
54
  }
55
+ /** `gs://<bucket>/install/state.lock` — see {@link acquireBucketStateLock}. */
56
+ export declare function bucketStateLockUrl(bucket: string): string;
57
+ /**
58
+ * The install's state lock in its ops bucket, created only if absent
59
+ * (`--if-generation-match=0`). Held by every writer of a bucket-backed
60
+ * install's state — an installer run's `pulumi up`, `state migrate` — so
61
+ * none writes a backend another is switching away from. A lock left by a
62
+ * crashed run is reported with the command to remove it, never broken
63
+ * automatically.
64
+ *
65
+ * @returns the release function
66
+ */
67
+ export declare function acquireBucketStateLock(bucket: string, purpose: string, run?: SyncGcloud): () => void;
68
+ /**
69
+ * The same lock for an install whose state is on this machine:
70
+ * `~/.caelo-<id>/state.lock`, created exclusively.
71
+ *
72
+ * @returns the release function
73
+ */
74
+ export declare function acquireLocalStateLock(root: string, purpose: string): () => void;
75
+ /** The state lock for whichever backend `bucket` (gcs) or `root` (local) names. */
76
+ export declare function acquireStateLock(backend: {
77
+ readonly kind: "local";
78
+ } | {
79
+ readonly kind: "gcs";
80
+ readonly bucket: string;
81
+ }, root: string, purpose: string, run?: SyncGcloud): () => void;
55
82
  //# sourceMappingURL=state-store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"state-store.d.ts","sourceRoot":"","sources":["../src/state-store.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAE,KAAK,YAAY,EAAa,MAAM,aAAa,CAAC;AAG3D,uCAAuC;AACvC,MAAM,MAAM,SAAS,GAAG,cAAc,GAAG,eAAe,CAAC;AAEzD,wDAAwD;AACxD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,KAAK,CAAC;IAC/B,2DAA2D;IAC3D,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAAC;IACrC,qDAAqD;IACrD,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9C;AAED,mFAAmF;AACnF,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,YAAY,CAAC;AAE1E,mEAAmE;AACnE,eAAO,MAAM,cAAc,EAAE,UAc5B,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAIxE;AAcD,wDAAwD;AACxD,qBAAa,eAAgB,YAAW,UAAU;IAEpC,OAAO,CAAC,QAAQ,CAAC,IAAI;IADjC,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;gBACJ,IAAI,EAAE,MAAM;IAEzC,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI;IAKpC,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;CAG7C;AAKD;;;;;;GAMG;AACH,qBAAa,aAAc,YAAW,UAAU;IAK5C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,GAAG;IANtB,QAAQ,CAAC,IAAI,EAAG,KAAK,CAAU;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuC;gBAG1C,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,UAA2B;IAGnD,sCAAsC;IACtC,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAIlC;;;;OAIG;IACH,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI;IASpC,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI;IAQpC,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;CAc7C"}
1
+ {"version":3,"file":"state-store.d.ts","sourceRoot":"","sources":["../src/state-store.ts"],"names":[],"mappings":"AA4BA,OAAO,EAAE,KAAK,YAAY,EAAa,MAAM,aAAa,CAAC;AAG3D,uCAAuC;AACvC,MAAM,MAAM,SAAS,GAAG,cAAc,GAAG,eAAe,CAAC;AAEzD,wDAAwD;AACxD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,KAAK,CAAC;IAC/B,2DAA2D;IAC3D,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAAC;IACrC,qDAAqD;IACrD,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9C;AAED,mFAAmF;AACnF,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,YAAY,CAAC;AAE1E,mEAAmE;AACnE,eAAO,MAAM,cAAc,EAAE,UAc5B,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAIxE;AAcD,wDAAwD;AACxD,qBAAa,eAAgB,YAAW,UAAU;IAEpC,OAAO,CAAC,QAAQ,CAAC,IAAI;IADjC,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;gBACJ,IAAI,EAAE,MAAM;IAEzC,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI;IAKpC,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;CAG7C;AAKD;;;;;;GAMG;AACH,qBAAa,aAAc,YAAW,UAAU;IAK5C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,GAAG;IANtB,QAAQ,CAAC,IAAI,EAAG,KAAK,CAAU;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuC;gBAG1C,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,UAA2B;IAGnD,sCAAsC;IACtC,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAIlC;;;;OAIG;IACH,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI;IASpC,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI;IAQpC,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;CAc7C;AAED,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEzD;AAYD;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,GAAG,GAAE,UAA2B,GAC/B,MAAM,IAAI,CAgBZ;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,IAAI,CAa/E;AAED,mFAAmF;AACnF,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EACvF,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,GAAG,GAAE,UAA2B,GAC/B,MAAM,IAAI,CAIZ"}