@caelo-cms/provisioning 0.10.29 → 0.10.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin-domain.d.ts +54 -0
- package/dist/admin-domain.d.ts.map +1 -0
- package/dist/admin-domain.js +122 -0
- package/dist/admin-domain.js.map +1 -0
- package/dist/cli.js +65 -6
- package/dist/cli.js.map +1 -1
- package/dist/compose.d.ts +7 -9
- package/dist/compose.d.ts.map +1 -1
- package/dist/compose.js +17 -1
- package/dist/compose.js.map +1 -1
- package/dist/deployed-release.d.ts +67 -0
- package/dist/deployed-release.d.ts.map +1 -0
- package/dist/deployed-release.js +144 -0
- package/dist/deployed-release.js.map +1 -0
- package/dist/gcloud-retry.d.ts +16 -0
- package/dist/gcloud-retry.d.ts.map +1 -0
- package/dist/gcloud-retry.js +17 -0
- package/dist/gcloud-retry.js.map +1 -0
- package/dist/gcloud.d.ts.map +1 -1
- package/dist/gcloud.js +2 -0
- package/dist/gcloud.js.map +1 -1
- package/dist/gcp-names.d.ts +58 -0
- package/dist/gcp-names.d.ts.map +1 -0
- package/dist/gcp-names.js +88 -0
- package/dist/gcp-names.js.map +1 -0
- package/dist/install-state.d.ts +31 -0
- package/dist/install-state.d.ts.map +1 -1
- package/dist/install-state.js +38 -0
- package/dist/install-state.js.map +1 -1
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/lifecycle.js +314 -46
- package/dist/lifecycle.js.map +1 -1
- package/dist/mcp-iap.d.ts +5 -26
- package/dist/mcp-iap.d.ts.map +1 -1
- package/dist/mcp-iap.js +6 -18
- package/dist/mcp-iap.js.map +1 -1
- package/dist/migration-runner.d.ts +25 -0
- package/dist/migration-runner.d.ts.map +1 -1
- package/dist/migration-runner.js +60 -19
- package/dist/migration-runner.js.map +1 -1
- package/dist/operator-access.d.ts +83 -0
- package/dist/operator-access.d.ts.map +1 -0
- package/dist/operator-access.js +562 -0
- package/dist/operator-access.js.map +1 -0
- package/dist/runtime-secrets.d.ts +128 -0
- package/dist/runtime-secrets.d.ts.map +1 -0
- package/dist/runtime-secrets.js +444 -0
- package/dist/runtime-secrets.js.map +1 -0
- package/dist/stack-contract.d.ts +231 -0
- package/dist/stack-contract.d.ts.map +1 -0
- package/dist/stack-contract.js +455 -0
- package/dist/stack-contract.js.map +1 -0
- package/dist/stack-converge.d.ts +183 -0
- package/dist/stack-converge.d.ts.map +1 -0
- package/dist/stack-converge.js +513 -0
- package/dist/stack-converge.js.map +1 -0
- package/dist/wizard.d.ts.map +1 -1
- package/dist/wizard.js +8 -1
- package/dist/wizard.js.map +1 -1
- package/dist/wizards/gcp-cost.d.ts +6 -10
- package/dist/wizards/gcp-cost.d.ts.map +1 -1
- package/dist/wizards/gcp-cost.js +34 -2
- package/dist/wizards/gcp-cost.js.map +1 -1
- package/dist/wizards/gcp-pulumi.d.ts +32 -1
- package/dist/wizards/gcp-pulumi.d.ts.map +1 -1
- package/dist/wizards/gcp-pulumi.js +60 -5
- package/dist/wizards/gcp-pulumi.js.map +1 -1
- package/dist/wizards/gcp.d.ts.map +1 -1
- package/dist/wizards/gcp.js +79 -16
- package/dist/wizards/gcp.js.map +1 -1
- package/package.json +3 -3
- package/stacks/aws/Pulumi.yaml +4 -0
- package/stacks/aws/index.ts +11 -0
- package/stacks/azure/Pulumi.yaml +4 -0
- package/stacks/azure/index.ts +10 -1
- package/stacks/gcp/Pulumi.yaml +4 -3
- package/stacks/gcp/README.md +13 -2
- package/stacks/gcp/index.ts +200 -140
- package/stacks/gcp-firebase/Pulumi.yaml +4 -0
- package/stacks/gcp-firebase/index.ts +165 -75
- package/stacks/self-hosted/Pulumi.yaml +4 -0
- package/stacks/self-hosted/index.ts +3 -0
package/dist/mcp-iap.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-iap.d.ts","sourceRoot":"","sources":["../src/mcp-iap.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mcp-iap.d.ts","sourceRoot":"","sources":["../src/mcp-iap.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,KAAK,YAAY,EAA2B,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAG3F,kEAAkE;AAClE,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACjF;IAAE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpE,+DAA+D;AAC/D,wBAAgB,eAAe,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,EAAE,CAI/D;AAED,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAQzD;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,WAAW,CAAC;IACtB,GAAG,CAAC,EAAE,YAAY,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,GAAG,OAAO,CACT;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CACzF,CAwEA"}
|
package/dist/mcp-iap.js
CHANGED
|
@@ -21,11 +21,10 @@
|
|
|
21
21
|
* `claude mcp add` command.
|
|
22
22
|
*/
|
|
23
23
|
import { gcloud as defaultGcloud } from "./gcloud.js";
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
function iapResourceArgs(resource) {
|
|
24
|
+
import { realSleep, runWithRetry } from "./gcloud-retry.js";
|
|
25
|
+
import { MCP_IAP_SERVICE_ACCOUNT_ID, mcpIapServiceAccountEmail } from "./gcp-names.js";
|
|
26
|
+
/** `gcloud iap web …` flags addressing {@link IapResource}. */
|
|
27
|
+
export function iapResourceArgs(resource) {
|
|
29
28
|
return resource.kind === "cloud-run"
|
|
30
29
|
? ["--resource-type=cloud-run", `--service=${resource.service}`, `--region=${resource.region}`]
|
|
31
30
|
: ["--resource-type=backend-services", `--service=${resource.service}`];
|
|
@@ -38,24 +37,13 @@ export function iapOperators(policyJson) {
|
|
|
38
37
|
.flatMap((b) => b.members ?? []);
|
|
39
38
|
return [...new Set(members.filter((m) => m.startsWith("user:") || m.startsWith("group:")))];
|
|
40
39
|
}
|
|
41
|
-
const SA_NOT_YET_VISIBLE = /does not exist|not found|NOT_FOUND/i;
|
|
42
|
-
const RETRY_DELAYS_MS = [2_000, 4_000, 8_000, 16_000];
|
|
43
40
|
export async function ensureMcpIapAccess(opts) {
|
|
44
41
|
const run = opts.run ?? defaultGcloud;
|
|
45
|
-
const sleep = opts.sleep ??
|
|
42
|
+
const sleep = opts.sleep ?? realSleep;
|
|
46
43
|
const project = `--project=${opts.projectId}`;
|
|
47
44
|
const sa = mcpIapServiceAccountEmail(opts.projectId);
|
|
48
45
|
// A freshly created SA takes a few seconds to become bindable.
|
|
49
|
-
const withRetry =
|
|
50
|
-
let r = await run(args);
|
|
51
|
-
for (const delay of RETRY_DELAYS_MS) {
|
|
52
|
-
if (r.ok || !SA_NOT_YET_VISIBLE.test(r.stderr))
|
|
53
|
-
break;
|
|
54
|
-
await sleep(delay);
|
|
55
|
-
r = await run(args);
|
|
56
|
-
}
|
|
57
|
-
return r;
|
|
58
|
-
};
|
|
46
|
+
const withRetry = (args) => runWithRetry(run, sleep, args);
|
|
59
47
|
const describe = await run([
|
|
60
48
|
"iam",
|
|
61
49
|
"service-accounts",
|
package/dist/mcp-iap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-iap.js","sourceRoot":"","sources":["../src/mcp-iap.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,MAAM,IAAI,aAAa,
|
|
1
|
+
{"version":3,"file":"mcp-iap.js","sourceRoot":"","sources":["../src/mcp-iap.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,31 @@ interface MigrationRunnerOpts {
|
|
|
2
2
|
readonly projectId: string;
|
|
3
3
|
readonly region: string;
|
|
4
4
|
}
|
|
5
|
+
interface AdminConfig {
|
|
6
|
+
readonly imageRef: string;
|
|
7
|
+
/** Cloud SQL private IP, from the admin's ADMIN_DATABASE_URL. */
|
|
8
|
+
readonly databaseHost: string;
|
|
9
|
+
readonly networkRef: string;
|
|
10
|
+
readonly subnetRef: string;
|
|
11
|
+
/**
|
|
12
|
+
* Whether the admin already reads the database password from Secret
|
|
13
|
+
* Manager. If not, its image may predate `databaseUrlFromEnv` and can't
|
|
14
|
+
* run a job with password-less URLs.
|
|
15
|
+
*/
|
|
16
|
+
readonly secretEnv: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The database env of a migration/truncate job: the admin's URLs (no
|
|
20
|
+
* password) as plain vars, the password vars as Secret Manager references
|
|
21
|
+
* — the same pairs the admin service carries. The job runs as the admin's
|
|
22
|
+
* run SA, which can read them.
|
|
23
|
+
*/
|
|
24
|
+
export declare function migrationJobEnvArgs(databaseHost: string, env?: string): string[];
|
|
25
|
+
/**
|
|
26
|
+
* The job config from the admin service (`gcloud run services describe
|
|
27
|
+
* --format=json`), or null when something the job needs is missing.
|
|
28
|
+
*/
|
|
29
|
+
export declare function parseAdminConfig(serviceJson: string): AdminConfig | null;
|
|
5
30
|
/**
|
|
6
31
|
* Run admin + public migrations against Cloud SQL. Returns `{ok}` so
|
|
7
32
|
* callers can decide what to do on failure (the wizard exits the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migration-runner.d.ts","sourceRoot":"","sources":["../src/migration-runner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"migration-runner.d.ts","sourceRoot":"","sources":["../src/migration-runner.ts"],"names":[],"mappings":"AA4BA,UAAU,mBAAmB;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,UAAU,WAAW;IACnB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,iEAAiE;IACjE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAMD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,SAAgB,GAAG,MAAM,EAAE,CAavF;AAwCD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CA8CxE;AAED;;;;GAIG;AACH;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA0E1C;AAED,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,mBAAmB,GAAG;IAC1B;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC,GACA,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAuF1C"}
|
package/dist/migration-runner.js
CHANGED
|
@@ -8,7 +8,9 @@
|
|
|
8
8
|
* `bun /app/packages/migrations/src/migrate.ts <target>` against the
|
|
9
9
|
* private-IP Cloud SQL instance. The job inherits the running admin
|
|
10
10
|
* Cloud Run's image (so it always carries the matching migration set)
|
|
11
|
-
* + its
|
|
11
|
+
* + its database host + its network/subnet. Its database env follows the
|
|
12
|
+
* env contract (stack-contract.ts): password-less URLs plus the password
|
|
13
|
+
* as a Secret Manager reference, so the job spec never holds a password.
|
|
12
14
|
*
|
|
13
15
|
* Idempotent: drizzle's `__drizzle_migrations` table tracks applied
|
|
14
16
|
* versions, so re-runs only apply NEW migrations. Returns `{ok}` so
|
|
@@ -18,8 +20,32 @@
|
|
|
18
20
|
import { spinner } from "@clack/prompts";
|
|
19
21
|
import { green, red } from "kleur/colors";
|
|
20
22
|
import { gcloud } from "./gcloud.js";
|
|
23
|
+
import { GCP_STACK_ENV, gcpSecretId, runServiceAccountEmail } from "./gcp-names.js";
|
|
24
|
+
import { databaseUrls, SERVICE_SECRET_ENV } from "./stack-contract.js";
|
|
25
|
+
import { liveContainerEnv, liveDatabaseHost } from "./stack-converge.js";
|
|
26
|
+
/** Why a job on the installed admin image would fail, for an install `upgrade` hasn't moved over. */
|
|
27
|
+
const NEEDS_UPGRADE = "the admin still reads the database password from its plain env, so its image may predate Secret Manager runtime secrets and can't run a job with password-less URLs. Run `upgrade` first.";
|
|
21
28
|
/**
|
|
22
|
-
*
|
|
29
|
+
* The database env of a migration/truncate job: the admin's URLs (no
|
|
30
|
+
* password) as plain vars, the password vars as Secret Manager references
|
|
31
|
+
* — the same pairs the admin service carries. The job runs as the admin's
|
|
32
|
+
* run SA, which can read them.
|
|
33
|
+
*/
|
|
34
|
+
export function migrationJobEnvArgs(databaseHost, env = GCP_STACK_ENV) {
|
|
35
|
+
const urls = databaseUrls(databaseHost);
|
|
36
|
+
const passwords = ["ADMIN_DATABASE_PASSWORD", "PUBLIC_ADMIN_DATABASE_PASSWORD"].map((name) => {
|
|
37
|
+
const secret = SERVICE_SECRET_ENV.admin[name];
|
|
38
|
+
if (!secret)
|
|
39
|
+
throw new Error(`the admin env contract has no ${name}`);
|
|
40
|
+
return `${name}=${gcpSecretId(env, secret)}:latest`;
|
|
41
|
+
});
|
|
42
|
+
return [
|
|
43
|
+
`--set-env-vars=ADMIN_DATABASE_URL=${urls.admin},PUBLIC_ADMIN_DATABASE_URL=${urls.publicAdmin}`,
|
|
44
|
+
`--set-secrets=${passwords.join(",")}`,
|
|
45
|
+
];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Resolve the running admin Cloud Run service's image + database host +
|
|
23
49
|
* VPC config. Returns null on any failure; caller surfaces the error.
|
|
24
50
|
*/
|
|
25
51
|
async function readAdminConfig(opts) {
|
|
@@ -55,18 +81,19 @@ async function readAdminConfig(opts) {
|
|
|
55
81
|
]);
|
|
56
82
|
if (!descr.ok)
|
|
57
83
|
return null;
|
|
84
|
+
return parseAdminConfig(descr.stdout);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* The job config from the admin service (`gcloud run services describe
|
|
88
|
+
* --format=json`), or null when something the job needs is missing.
|
|
89
|
+
*/
|
|
90
|
+
export function parseAdminConfig(serviceJson) {
|
|
58
91
|
try {
|
|
59
|
-
const d = JSON.parse(
|
|
92
|
+
const d = JSON.parse(serviceJson);
|
|
60
93
|
const c = d.spec.template.spec.containers[0];
|
|
61
94
|
const imageRef = c?.image ?? "";
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
for (const e of c?.env ?? []) {
|
|
65
|
-
if (e.name === "ADMIN_DATABASE_URL")
|
|
66
|
-
adminUrl = e.value ?? "";
|
|
67
|
-
if (e.name === "PUBLIC_ADMIN_DATABASE_URL")
|
|
68
|
-
publicUrl = e.value ?? "";
|
|
69
|
-
}
|
|
95
|
+
const liveEnv = liveContainerEnv(serviceJson);
|
|
96
|
+
const host = liveDatabaseHost(liveEnv);
|
|
70
97
|
let networkRef = "";
|
|
71
98
|
let subnetRef = "";
|
|
72
99
|
const niAnnotation = d.spec.template.metadata?.annotations?.["run.googleapis.com/network-interfaces"];
|
|
@@ -85,9 +112,15 @@ async function readAdminConfig(opts) {
|
|
|
85
112
|
networkRef ||= ni?.network ?? "";
|
|
86
113
|
subnetRef ||= ni?.subnetwork ?? "";
|
|
87
114
|
}
|
|
88
|
-
if (!imageRef || !
|
|
115
|
+
if (!imageRef || !host.ok || !networkRef || !subnetRef)
|
|
89
116
|
return null;
|
|
90
|
-
return {
|
|
117
|
+
return {
|
|
118
|
+
imageRef,
|
|
119
|
+
databaseHost: host.host,
|
|
120
|
+
networkRef,
|
|
121
|
+
subnetRef,
|
|
122
|
+
secretEnv: liveEnv.get("ADMIN_DATABASE_PASSWORD")?.kind === "secret",
|
|
123
|
+
};
|
|
91
124
|
}
|
|
92
125
|
catch {
|
|
93
126
|
return null;
|
|
@@ -116,6 +149,10 @@ export async function truncateViaCloudRunJob(opts) {
|
|
|
116
149
|
sAdmin.stop(red("Couldn't resolve admin config — admin may not be deployed yet"));
|
|
117
150
|
return { ok: false, error: "admin-config-unresolved" };
|
|
118
151
|
}
|
|
152
|
+
if (!cfg.secretEnv) {
|
|
153
|
+
sAdmin.stop(red(`Not truncating: ${NEEDS_UPGRADE}`));
|
|
154
|
+
return { ok: false, error: NEEDS_UPGRADE };
|
|
155
|
+
}
|
|
119
156
|
sAdmin.stop(green(`Admin config resolved (${cfg.imageRef.slice(-19)})`));
|
|
120
157
|
for (const target of ["admin", "public"]) {
|
|
121
158
|
const s = spinner();
|
|
@@ -142,7 +179,7 @@ export async function truncateViaCloudRunJob(opts) {
|
|
|
142
179
|
"--project",
|
|
143
180
|
opts.projectId,
|
|
144
181
|
"--service-account",
|
|
145
|
-
|
|
182
|
+
runServiceAccountEmail(opts.projectId, GCP_STACK_ENV),
|
|
146
183
|
"--network",
|
|
147
184
|
cfg.networkRef.split("/").pop() ?? cfg.networkRef,
|
|
148
185
|
"--subnet",
|
|
@@ -150,8 +187,7 @@ export async function truncateViaCloudRunJob(opts) {
|
|
|
150
187
|
"--vpc-egress=private-ranges-only",
|
|
151
188
|
"--command=bun",
|
|
152
189
|
`--args=--bun,/app/packages/migrations/src/truncate.ts,${target}`,
|
|
153
|
-
|
|
154
|
-
`ADMIN_DATABASE_URL=${cfg.adminUrl},PUBLIC_ADMIN_DATABASE_URL=${cfg.publicUrl}`,
|
|
190
|
+
...migrationJobEnvArgs(cfg.databaseHost),
|
|
155
191
|
"--max-retries=0",
|
|
156
192
|
"--task-timeout=5m",
|
|
157
193
|
"--quiet",
|
|
@@ -187,6 +223,12 @@ export async function runMigrationsViaCloudRunJob(opts) {
|
|
|
187
223
|
sAdmin.stop(red("Couldn't resolve admin config — admin may not be deployed yet"));
|
|
188
224
|
return { ok: false, error: "admin-config-unresolved" };
|
|
189
225
|
}
|
|
226
|
+
// With an override (upgrade) the job runs the NEW release, which reads
|
|
227
|
+
// the split env; without one it runs the installed image.
|
|
228
|
+
if (!opts.imageOverride && !cfg.secretEnv) {
|
|
229
|
+
sAdmin.stop(red(`Not migrating: ${NEEDS_UPGRADE}`));
|
|
230
|
+
return { ok: false, error: NEEDS_UPGRADE };
|
|
231
|
+
}
|
|
190
232
|
const migrationImage = opts.imageOverride ?? cfg.imageRef;
|
|
191
233
|
if (opts.imageOverride && opts.imageOverride !== cfg.imageRef) {
|
|
192
234
|
sAdmin.stop(green(`Admin config resolved; migrating against NEW image (${migrationImage.slice(-19)}) instead of current (${cfg.imageRef.slice(-19)})`));
|
|
@@ -221,7 +263,7 @@ export async function runMigrationsViaCloudRunJob(opts) {
|
|
|
221
263
|
"--project",
|
|
222
264
|
opts.projectId,
|
|
223
265
|
"--service-account",
|
|
224
|
-
|
|
266
|
+
runServiceAccountEmail(opts.projectId, GCP_STACK_ENV),
|
|
225
267
|
"--network",
|
|
226
268
|
cfg.networkRef.split("/").pop() ?? cfg.networkRef,
|
|
227
269
|
"--subnet",
|
|
@@ -229,8 +271,7 @@ export async function runMigrationsViaCloudRunJob(opts) {
|
|
|
229
271
|
"--vpc-egress=private-ranges-only",
|
|
230
272
|
"--command=bun",
|
|
231
273
|
`--args=--bun,/app/packages/migrations/src/migrate.ts,${target}`,
|
|
232
|
-
|
|
233
|
-
`ADMIN_DATABASE_URL=${cfg.adminUrl},PUBLIC_ADMIN_DATABASE_URL=${cfg.publicUrl}`,
|
|
274
|
+
...migrationJobEnvArgs(cfg.databaseHost),
|
|
234
275
|
"--max-retries=0",
|
|
235
276
|
"--task-timeout=10m",
|
|
236
277
|
"--quiet",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migration-runner.js","sourceRoot":"","sources":["../src/migration-runner.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC
|
|
1
|
+
{"version":3,"file":"migration-runner.js","sourceRoot":"","sources":["../src/migration-runner.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAqBzE,qGAAqG;AACrG,MAAM,aAAa,GACjB,2LAA2L,CAAC;AAE9L;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,YAAoB,EAAE,GAAG,GAAG,aAAa;IAC3E,MAAM,IAAI,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IACxC,MAAM,SAAS,GAAI,CAAC,yBAAyB,EAAE,gCAAgC,CAAW,CAAC,GAAG,CAC5F,CAAC,IAAI,EAAE,EAAE;QACP,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC;QACtE,OAAO,GAAG,IAAI,IAAI,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC;IACtD,CAAC,CACF,CAAC;IACF,OAAO;QACL,qCAAqC,IAAI,CAAC,KAAK,8BAA8B,IAAI,CAAC,WAAW,EAAE;QAC/F,iBAAiB,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;KACvC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,eAAe,CAAC,IAAyB;IACtD,iEAAiE;IACjE,0CAA0C;IAC1C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC;QACxB,KAAK;QACL,UAAU;QACV,MAAM;QACN,UAAU;QACV,IAAI,CAAC,MAAM;QACX,WAAW;QACX,IAAI,CAAC,SAAS;QACd,UAAU;QACV,uCAAuC;QACvC,+BAA+B;KAChC,CAAC,CAAC;IACH,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IAC9D,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAE9B,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC;QACzB,KAAK;QACL,UAAU;QACV,UAAU;QACV,WAAW;QACX,UAAU;QACV,IAAI,CAAC,MAAM;QACX,WAAW;QACX,IAAI,CAAC,SAAS;QACd,eAAe;KAChB,CAAC,CAAC;IACH,IAAI,CAAC,KAAK,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAC3B,OAAO,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAU/B,CAAC;QACF,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,MAAM,YAAY,GAChB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,uCAAuC,CAAC,CAAC;QACnF,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAgD,CAAC;gBACvF,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;gBACtC,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC;YAC1C,CAAC;YAAC,MAAM,CAAC;gBACP,eAAe;YACjB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS,EAAE,CAAC;YAC9B,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC;YAClE,UAAU,KAAK,EAAE,EAAE,OAAO,IAAI,EAAE,CAAC;YACjC,SAAS,KAAK,EAAE,EAAE,UAAU,IAAI,EAAE,CAAC;QACrC,CAAC;QACD,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QACpE,OAAO;YACL,QAAQ;YACR,YAAY,EAAE,IAAI,CAAC,IAAI;YACvB,UAAU;YACV,SAAS;YACT,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,IAAI,KAAK,QAAQ;SACrE,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAAyB;IAEzB,MAAM,MAAM,GAAG,OAAO,EAAE,CAAC;IACzB,MAAM,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACnE,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC,CAAC;QAClF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC;IACzD,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,aAAa,EAAE,CAAC,CAAC,CAAC;QACrD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;IAC7C,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,0BAA0B,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAEzE,KAAK,MAAM,MAAM,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAU,EAAE,CAAC;QAClD,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;QACpB,CAAC,CAAC,KAAK,CAAC,eAAe,MAAM,uCAAuC,CAAC,CAAC;QACtE,MAAM,MAAM,CAAC;YACX,KAAK;YACL,MAAM;YACN,QAAQ;YACR,kBAAkB,MAAM,EAAE;YAC1B,UAAU;YACV,IAAI,CAAC,MAAM;YACX,WAAW;YACX,IAAI,CAAC,SAAS;YACd,SAAS;SACV,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;YAC1B,KAAK;YACL,MAAM;YACN,QAAQ;YACR,kBAAkB,MAAM,EAAE;YAC1B,WAAW,GAAG,CAAC,QAAQ,EAAE;YACzB,UAAU;YACV,IAAI,CAAC,MAAM;YACX,WAAW;YACX,IAAI,CAAC,SAAS;YACd,mBAAmB;YACnB,sBAAsB,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC;YACrD,WAAW;YACX,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,UAAU;YACjD,UAAU;YACV,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,SAAS;YAC/C,kCAAkC;YAClC,eAAe;YACf,yDAAyD,MAAM,EAAE;YACjE,GAAG,mBAAmB,CAAC,GAAG,CAAC,YAAY,CAAC;YACxC,iBAAiB;YACjB,mBAAmB;YACnB,SAAS;SACV,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;YAC1D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,MAAM,YAAY,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;QACpF,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC;YACxB,KAAK;YACL,MAAM;YACN,SAAS;YACT,kBAAkB,MAAM,EAAE;YAC1B,UAAU;YACV,IAAI,CAAC,MAAM;YACX,WAAW;YACX,IAAI,CAAC,SAAS;YACd,QAAQ;SACT,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,qBAAqB,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;YAChE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,MAAM,UAAU,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;QAChF,CAAC;QACD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,YAAY,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,IAaC;IAED,MAAM,MAAM,GAAG,OAAO,EAAE,CAAC;IACzB,MAAM,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACpE,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC,CAAC;QAClF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC;IACzD,CAAC;IACD,uEAAuE;IACvE,0DAA0D;IAC1D,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,aAAa,EAAE,CAAC,CAAC,CAAC;QACpD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;IAC7C,CAAC;IACD,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,IAAI,GAAG,CAAC,QAAQ,CAAC;IAC1D,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,KAAK,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9D,MAAM,CAAC,IAAI,CACT,KAAK,CACH,uDAAuD,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,yBAAyB,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CACpI,CACF,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,0BAA0B,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAU,EAAE,CAAC;QAClD,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;QACpB,CAAC,CAAC,KAAK,CAAC,YAAY,MAAM,2CAA2C,CAAC,CAAC;QACvE,+DAA+D;QAC/D,oCAAoC;QACpC,MAAM,MAAM,CAAC;YACX,KAAK;YACL,MAAM;YACN,QAAQ;YACR,iBAAiB,MAAM,EAAE;YACzB,UAAU;YACV,IAAI,CAAC,MAAM;YACX,WAAW;YACX,IAAI,CAAC,SAAS;YACd,SAAS;SACV,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;YAC1B,KAAK;YACL,MAAM;YACN,QAAQ;YACR,iBAAiB,MAAM,EAAE;YACzB,WAAW,cAAc,EAAE;YAC3B,UAAU;YACV,IAAI,CAAC,MAAM;YACX,WAAW;YACX,IAAI,CAAC,SAAS;YACd,mBAAmB;YACnB,sBAAsB,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC;YACrD,WAAW;YACX,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,UAAU;YACjD,UAAU;YACV,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,SAAS;YAC/C,kCAAkC;YAClC,eAAe;YACf,wDAAwD,MAAM,EAAE;YAChE,GAAG,mBAAmB,CAAC,GAAG,CAAC,YAAY,CAAC;YACxC,iBAAiB;YACjB,oBAAoB;YACpB,SAAS;SACV,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;YAC1D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,MAAM,YAAY,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;QACnF,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC;YACxB,KAAK;YACL,MAAM;YACN,SAAS;YACT,iBAAiB,MAAM,EAAE;YACzB,UAAU;YACV,IAAI,CAAC,MAAM;YACX,WAAW;YACX,IAAI,CAAC,SAAS;YACd,QAAQ;SACT,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,uBAAuB,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;YAClE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,MAAM,UAAU,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;QAC/E,CAAC;QACD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,qBAAqB,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { type GcloudRunner, type Sleep } from "./gcloud-retry.js";
|
|
2
|
+
import { type IapResource } from "./mcp-iap.js";
|
|
3
|
+
/** A project-level custom role, created by the CLI (never declared in the stacks). */
|
|
4
|
+
export interface CustomRoleSpec {
|
|
5
|
+
readonly roleId: string;
|
|
6
|
+
readonly title: string;
|
|
7
|
+
readonly description: string;
|
|
8
|
+
readonly permissions: readonly string[];
|
|
9
|
+
}
|
|
10
|
+
/** The only IAM-writing rights in this feature, held by the sync job's SA alone. */
|
|
11
|
+
export declare const OPERATOR_ACCESS_ROLE: CustomRoleSpec;
|
|
12
|
+
/** `projects/<project>/roles/<roleId>` — the name IAM bindings reference. */
|
|
13
|
+
export declare function customRoleName(projectId: string, roleId: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* The install's IAP allowlist: who passes IAP regardless of the user list.
|
|
16
|
+
* The wizard passes the same list to the stacks (`iapAllowlist`), and the
|
|
17
|
+
* job keeps these members instead of removing them, so `pulumi up` and the
|
|
18
|
+
* job never fight.
|
|
19
|
+
*/
|
|
20
|
+
export declare function installIapAllowlist(ownerEmail: string): string[];
|
|
21
|
+
/** Database role migration 0239 creates for the job. */
|
|
22
|
+
export declare const OPERATOR_ACCESS_DB_ROLE = "operator_access_reader";
|
|
23
|
+
/** The `iap_web` path of an IAP resource, as the IAP REST API names it. */
|
|
24
|
+
export declare function iapWebPath(resource: IapResource): string;
|
|
25
|
+
/** The flags of a Cloud SQL instance with `cloudsql.iam_authentication` on. */
|
|
26
|
+
export declare function withIamAuthFlag(flags: readonly {
|
|
27
|
+
name: string;
|
|
28
|
+
value: string;
|
|
29
|
+
}[]): {
|
|
30
|
+
name: string;
|
|
31
|
+
value: string;
|
|
32
|
+
}[] | null;
|
|
33
|
+
export interface OperatorAccessSyncTarget {
|
|
34
|
+
readonly projectId: string;
|
|
35
|
+
readonly region: string;
|
|
36
|
+
/** Pulumi stack name (`production`). */
|
|
37
|
+
readonly env: string;
|
|
38
|
+
readonly ownerEmail: string;
|
|
39
|
+
/** The admin's IAP resource (resolved by the caller). */
|
|
40
|
+
readonly resource: IapResource;
|
|
41
|
+
/** Image the job runs: the admin image being deployed. */
|
|
42
|
+
readonly imageRef: string;
|
|
43
|
+
/** VPC the admin uses to reach Cloud SQL's private IP. */
|
|
44
|
+
readonly network: string;
|
|
45
|
+
readonly subnet: string;
|
|
46
|
+
readonly databaseHost: string;
|
|
47
|
+
}
|
|
48
|
+
export type OperatorAccessSyncResult = {
|
|
49
|
+
readonly ok: true;
|
|
50
|
+
readonly done: string[];
|
|
51
|
+
} | {
|
|
52
|
+
readonly ok: false;
|
|
53
|
+
readonly done: string[];
|
|
54
|
+
readonly error: string;
|
|
55
|
+
};
|
|
56
|
+
/** Ensure the operator-access sync job and everything it needs. Never throws for a gcloud failure. */
|
|
57
|
+
export declare function ensureOperatorAccessSync(target: OperatorAccessSyncTarget, deps?: {
|
|
58
|
+
run?: GcloudRunner;
|
|
59
|
+
sleep?: Sleep;
|
|
60
|
+
}): Promise<OperatorAccessSyncResult>;
|
|
61
|
+
/**
|
|
62
|
+
* Everything {@link ensureOperatorAccessSync} needs, read from the deployed
|
|
63
|
+
* admin service: its network, the database host, and its IAP resource (the
|
|
64
|
+
* service itself on gcp-firebase, the LB backend service on gcp). `imageRef`
|
|
65
|
+
* overrides the image the job runs (upgrade passes the release it rolls to).
|
|
66
|
+
*/
|
|
67
|
+
export declare function resolveOperatorAccessTarget(opts: {
|
|
68
|
+
readonly provider: "gcp" | "gcp-firebase";
|
|
69
|
+
readonly projectId: string;
|
|
70
|
+
readonly region: string;
|
|
71
|
+
readonly env: string;
|
|
72
|
+
readonly ownerEmail: string;
|
|
73
|
+
readonly imageRef?: string;
|
|
74
|
+
}, deps?: {
|
|
75
|
+
run?: GcloudRunner;
|
|
76
|
+
}): Promise<{
|
|
77
|
+
ok: true;
|
|
78
|
+
target: OperatorAccessSyncTarget;
|
|
79
|
+
} | {
|
|
80
|
+
ok: false;
|
|
81
|
+
error: string;
|
|
82
|
+
}>;
|
|
83
|
+
//# sourceMappingURL=operator-access.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operator-access.d.ts","sourceRoot":"","sources":["../src/operator-access.ts"],"names":[],"mappings":"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"}
|