@intentius/chant-lexicon-gcp 0.124.33 → 0.124.35

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 (47) hide show
  1. package/dist/api/read-client.d.ts +7 -3
  2. package/dist/api/read-client.d.ts.map +1 -1
  3. package/dist/api/read-client.js +36 -15
  4. package/dist/composites/cloud-run-service.d.ts +2 -0
  5. package/dist/composites/cloud-run-service.d.ts.map +1 -1
  6. package/dist/composites/cloud-run-service.js +4 -1
  7. package/dist/deep-observe.d.ts.map +1 -1
  8. package/dist/deep-observe.js +125 -1
  9. package/dist/describe-resources.d.ts +4 -3
  10. package/dist/describe-resources.d.ts.map +1 -1
  11. package/dist/describe-resources.js +8 -7
  12. package/dist/health.js +1 -1
  13. package/dist/integrity.json +2 -2
  14. package/dist/manifest.json +1 -1
  15. package/dist/op/activities/gcp-apply.d.ts +62 -18
  16. package/dist/op/activities/gcp-apply.d.ts.map +1 -1
  17. package/dist/op/activities/gcp-apply.js +118 -18
  18. package/dist/op/activities/gcp-compute.d.ts +56 -0
  19. package/dist/op/activities/gcp-compute.d.ts.map +1 -0
  20. package/dist/op/activities/gcp-compute.js +313 -0
  21. package/dist/op/activities/gcp-iam.d.ts +82 -0
  22. package/dist/op/activities/gcp-iam.d.ts.map +1 -0
  23. package/dist/op/activities/gcp-iam.js +215 -0
  24. package/dist/op/activities/index.d.ts +1 -1
  25. package/dist/op/activities/index.d.ts.map +1 -1
  26. package/dist/op/activities/index.js +1 -1
  27. package/dist/serializer.d.ts.map +1 -1
  28. package/dist/serializer.js +36 -1
  29. package/package.json +2 -2
  30. package/src/api/read-client.ts +35 -16
  31. package/src/composites/cloud-run-service.ts +6 -0
  32. package/src/composites/composites.test.ts +7 -0
  33. package/src/deep-observe.test.ts +16 -1
  34. package/src/deep-observe.ts +125 -1
  35. package/src/describe-resources.test.ts +1 -1
  36. package/src/describe-resources.ts +8 -6
  37. package/src/health.ts +1 -1
  38. package/src/op/activities/gcp-apply.test.ts +53 -0
  39. package/src/op/activities/gcp-apply.ts +157 -24
  40. package/src/op/activities/gcp-compute.test.ts +212 -0
  41. package/src/op/activities/gcp-compute.ts +319 -0
  42. package/src/op/activities/gcp-iam.test.ts +152 -0
  43. package/src/op/activities/gcp-iam.ts +284 -0
  44. package/src/op/activities/index.ts +1 -0
  45. package/src/project-resolution.test.ts +41 -0
  46. package/src/serializer-pseudo.test.ts +38 -0
  47. package/src/serializer.ts +43 -3
@@ -22,7 +22,11 @@
22
22
  *
23
23
  * Coverage is exactly the applier's dispatch table (`MAPPERS`) — StorageBucket,
24
24
  * PubSubTopic, PubSubSubscription, SecretManagerSecret, IAMServiceAccount,
25
- * RunService. The kubectl path could fetch any CNRM kind the cluster knew
25
+ * RunService, IAMPolicyMember and the Cloud Run load balancer kinds
26
+ * (ComputeAddress, ComputeRegionNetworkEndpointGroup, ComputeBackendService,
27
+ * ComputeURLMap, ComputeTargetHTTPProxy, ComputeForwardingRule; #4233). An
28
+ * IAMPolicyMember is read through its target's policy and is present when the
29
+ * policy grants its member the role. The kubectl path could fetch any CNRM kind the cluster knew
26
30
  * about, so this is narrower on paper. It is not narrower in practice for
27
31
  * anything chant can act on: a kind with no mapper cannot be applied either, so
28
32
  * observing it produced a live tree nothing could ever reconcile against.
@@ -42,8 +46,8 @@ export interface GcpReadClientOptions {
42
46
  /** Injectable HTTP, so tests never touch the network. */
43
47
  http?: GcpReadHttp;
44
48
  }
45
- /** Injectable HTTP client — mirrors the applier's `GcpHttp`. */
46
- export type GcpReadHttp = (method: string, url: string) => Promise<{
49
+ /** Injectable HTTP client — mirrors the applier's `GcpHttp`. A body is sent only for a POST read (`:getIamPolicy`). */
50
+ export type GcpReadHttp = (method: string, url: string, body?: unknown) => Promise<{
47
51
  status: number;
48
52
  text: string;
49
53
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"read-client.d.ts","sourceRoot":"","sources":["../../src/api/read-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,EAA6B,KAAK,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5F,kCAAkC;AAClC,MAAM,WAAW,oBAAoB;IACnC,+FAA+F;IAC/F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED,gEAAgE;AAChE,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAOrG;;;;GAIG;AACH,qBAAa,YAAa,SAAQ,KAAK;IAGnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM;IAF1B,YACE,OAAO,EAAE,MAAM,EACN,MAAM,CAAC,EAAE,MAAM,YAAA,EAIzB;CACF;AAED,mFAAmF;AACnF,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAEhD;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEtE;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,oBAAoB,EAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAqClC"}
1
+ {"version":3,"file":"read-client.d.ts","sourceRoot":"","sources":["../../src/api/read-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,OAAO,EAA6B,KAAK,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5F,kCAAkC;AAClC,MAAM,WAAW,oBAAoB;IACnC,+FAA+F;IAC/F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED,uHAAuH;AACvH,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAUrH;;;;GAIG;AACH,qBAAa,YAAa,SAAQ,KAAK;IAGnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM;IAF1B,YACE,OAAO,EAAE,MAAM,EACN,MAAM,CAAC,EAAE,MAAM,YAAA,EAIzB;CACF;AAED,mFAAmF;AACnF,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAEhD;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEtE;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,oBAAoB,EAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAiDlC"}
@@ -22,7 +22,11 @@
22
22
  *
23
23
  * Coverage is exactly the applier's dispatch table (`MAPPERS`) — StorageBucket,
24
24
  * PubSubTopic, PubSubSubscription, SecretManagerSecret, IAMServiceAccount,
25
- * RunService. The kubectl path could fetch any CNRM kind the cluster knew
25
+ * RunService, IAMPolicyMember and the Cloud Run load balancer kinds
26
+ * (ComputeAddress, ComputeRegionNetworkEndpointGroup, ComputeBackendService,
27
+ * ComputeURLMap, ComputeTargetHTTPProxy, ComputeForwardingRule; #4233). An
28
+ * IAMPolicyMember is read through its target's policy and is present when the
29
+ * policy grants its member the role. The kubectl path could fetch any CNRM kind the cluster knew
26
30
  * about, so this is narrower on paper. It is not narrower in practice for
27
31
  * anything chant can act on: a kind with no mapper cannot be applied either, so
28
32
  * observing it produced a live tree nothing could ever reconcile against.
@@ -33,8 +37,11 @@
33
37
  * non-goal and belongs with the applier.
34
38
  */
35
39
  import { MAPPERS } from "../op/activities/gcp-apply.js";
36
- const defaultHttp = async (method, url) => {
37
- const res = await fetch(url, { method });
40
+ const defaultHttp = async (method, url, body) => {
41
+ const res = await fetch(url, {
42
+ method,
43
+ ...(body === undefined ? {} : { headers: { "content-type": "application/json" }, body: JSON.stringify(body) }),
44
+ });
38
45
  return { status: res.status, text: await res.text() };
39
46
  };
40
47
  /**
@@ -74,22 +81,36 @@ export async function getResource(client, kind, name, declared) {
74
81
  metadata: { name },
75
82
  spec: declared?.spec ?? declared ?? {},
76
83
  };
77
- let getUrl;
78
- try {
79
- getUrl = mapper.plan(resource, { base, project: client.project }).getUrl;
80
- }
81
- catch (err) {
82
- // A mapper that cannot plan from the declared spec cannot produce a URL, so
83
- // there is nothing to read — a hole, never an absence.
84
- throw new GcpReadError(`could not build a read URL for ${kind}/${name}: ${err instanceof Error ? err.message : String(err)}`);
84
+ const ctx = { base, project: client.project };
85
+ if (mapper.accepts && !mapper.accepts(resource, ctx)) {
86
+ throw new GcpReadError(`no REST read for ${kind}/${name}: its target has no endpoint chant can read`);
85
87
  }
86
88
  const http = client.http ?? defaultHttp;
87
89
  let res;
88
- try {
89
- res = await http("GET", getUrl);
90
+ if (mapper.custom) {
91
+ try {
92
+ res = await mapper.custom.read(resource, ctx, (method, url, body) => http(method, url, body));
93
+ }
94
+ catch (err) {
95
+ throw new GcpReadError(`could not read ${kind}/${name}: ${err instanceof Error ? err.message : String(err)}`);
96
+ }
90
97
  }
91
- catch (err) {
92
- throw new GcpReadError(err instanceof Error ? err.message : String(err));
98
+ else {
99
+ let getUrl;
100
+ try {
101
+ getUrl = mapper.plan(resource, ctx).getUrl;
102
+ }
103
+ catch (err) {
104
+ // A mapper that cannot plan from the declared spec cannot produce a URL, so
105
+ // there is nothing to read — a hole, never an absence.
106
+ throw new GcpReadError(`could not build a read URL for ${kind}/${name}: ${err instanceof Error ? err.message : String(err)}`);
107
+ }
108
+ try {
109
+ res = await http("GET", getUrl);
110
+ }
111
+ catch (err) {
112
+ throw new GcpReadError(err instanceof Error ? err.message : String(err));
113
+ }
93
114
  }
94
115
  if (res.status === 404)
95
116
  throw new GcpReadError(`${kind}/${name} not found`, 404);
@@ -30,6 +30,8 @@ export interface CloudRunServiceProps {
30
30
  name: string;
31
31
  value: string;
32
32
  }>;
33
+ /** Service account the service runs as: an email, or the account id of an IAMServiceAccount in the project. */
34
+ serviceAccount?: string;
33
35
  /** Additional labels. */
34
36
  labels?: Record<string, string>;
35
37
  /** Namespace for all resources. */
@@ -1 +1 @@
1
- {"version":3,"file":"cloud-run-service.d.ts","sourceRoot":"","sources":["../../src/composites/cloud-run-service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,eAAe,IAAI,uBAAuB,EAC1C,eAAe,EAChB,MAAM,cAAc,CAAC;AAGtB,MAAM,WAAW,oBAAoB;IACnC,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iIAAiI;IACjI,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,sCAAsC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,+DAA+D;IAC/D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,6BAA6B;IAC7B,GAAG,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7C,yBAAyB;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,QAAQ,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,OAAO,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,SAAS,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KACvE,CAAC;CACH;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,wBAAwB,2FA0EP,CAAC"}
1
+ {"version":3,"file":"cloud-run-service.d.ts","sourceRoot":"","sources":["../../src/composites/cloud-run-service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,eAAe,IAAI,uBAAuB,EAC1C,eAAe,EAChB,MAAM,cAAc,CAAC;AAGtB,MAAM,WAAW,oBAAoB;IACnC,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iIAAiI;IACjI,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,sCAAsC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,+DAA+D;IAC/D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,6BAA6B;IAC7B,GAAG,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7C,+GAA+G;IAC/G,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yBAAyB;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,QAAQ,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,OAAO,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,SAAS,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KACvE,CAAC;CACH;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,wBAAwB,2FA8EP,CAAC"}
@@ -21,7 +21,7 @@ import { GCP } from "../pseudo.js";
21
21
  * ```
22
22
  */
23
23
  export const CloudRunServiceComposite = Composite((props) => {
24
- const { name, image, location, projectId, port = 8080, cpuLimit = "1000m", memoryLimit = "512Mi", maxInstanceRequestConcurrency = 80, minInstanceCount = 0, maxInstanceCount = 100, publicAccess = false, env, labels: extraLabels = {}, namespace, defaults: defs, } = props;
24
+ const { name, image, location, projectId, port = 8080, cpuLimit = "1000m", memoryLimit = "512Mi", maxInstanceRequestConcurrency = 80, minInstanceCount = 0, maxInstanceCount = 100, publicAccess = false, env, serviceAccount, labels: extraLabels = {}, namespace, defaults: defs, } = props;
25
25
  const commonLabels = {
26
26
  "app.kubernetes.io/name": name,
27
27
  "app.kubernetes.io/managed-by": "chant",
@@ -52,6 +52,9 @@ export const CloudRunServiceComposite = Composite((props) => {
52
52
  maxInstanceCount,
53
53
  },
54
54
  containers,
55
+ ...(serviceAccount && {
56
+ serviceAccountRef: serviceAccount.includes("@") ? { external: serviceAccount } : { name: serviceAccount },
57
+ }),
55
58
  },
56
59
  }, defs?.service));
57
60
  const result = { service };
@@ -1 +1 @@
1
- {"version":3,"file":"deep-observe.d.ts","sourceRoot":"","sources":["../src/deep-observe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AAEH,OAAO,KAAK,EACV,qBAAqB,EAGtB,MAAM,0BAA0B,CAAC;AAKlC,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAajE,OAAO,EAAE,yBAAyB,EAAE,CAAC;AAErC,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAWtF;AAUD;6EAC6E;AAC7E,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA+DD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASnH;AAED;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA8F5G"}
1
+ {"version":3,"file":"deep-observe.d.ts","sourceRoot":"","sources":["../src/deep-observe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AAEH,OAAO,KAAK,EACV,qBAAqB,EAGtB,MAAM,0BAA0B,CAAC;AAKlC,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAajE,OAAO,EAAE,yBAAyB,EAAE,CAAC;AAErC,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAWtF;AAUD;6EAC6E;AAC7E,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA2LD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASnH;AAED;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA8F5G"}
@@ -157,8 +157,132 @@ const CNRM_REFINERS = {
157
157
  const m = ctx.restName ? /\/locations\/([^/]+)\//.exec(ctx.restName) : null;
158
158
  if (m)
159
159
  tree.location = m[1];
160
+ // #4240: v2 returns the account as an email; the declared side writes a
161
+ // `serviceAccountRef`, `name` for an account in the project.
162
+ const template = tree.template;
163
+ if (template && typeof template.serviceAccount === "string") {
164
+ const email = template.serviceAccount;
165
+ const suffix = `@${ctx.project}.iam.gserviceaccount.com`;
166
+ template.serviceAccountRef = email.endsWith(suffix) ? { name: email.slice(0, -suffix.length) } : { external: email };
167
+ delete template.serviceAccount;
168
+ }
169
+ },
170
+ // #4233: the inverse of gcp-compute.ts's body builders. Compute returns refs
171
+ // as full URLs and a region as a URL; CNRM writes `*Ref: { name }` and a
172
+ // bare `location` (`"global"` when the resource has no region).
173
+ IAMPolicyMember(tree) {
174
+ delete tree.etag;
175
+ delete tree.resource;
176
+ },
177
+ ComputeAddress(tree) {
178
+ computeLocation(tree);
179
+ },
180
+ ComputeRegionNetworkEndpointGroup(tree) {
181
+ if (typeof tree.region === "string")
182
+ tree.region = lastSegment(tree.region);
183
+ const cloudRun = tree.cloudRun;
184
+ if (cloudRun && typeof cloudRun.service === "string") {
185
+ cloudRun.serviceRef = { name: cloudRun.service };
186
+ delete cloudRun.service;
187
+ }
188
+ },
189
+ ComputeBackendService(tree) {
190
+ computeLocation(tree);
191
+ if (tree.enableCDN !== undefined) {
192
+ tree.enableCdn = tree.enableCDN;
193
+ delete tree.enableCDN;
194
+ }
195
+ const draining = tree.connectionDraining;
196
+ if (draining) {
197
+ if (draining.drainingTimeoutSec !== undefined)
198
+ tree.connectionDrainingTimeoutSec = draining.drainingTimeoutSec;
199
+ delete tree.connectionDraining;
200
+ }
201
+ if (Array.isArray(tree.backends)) {
202
+ tree.backend = tree.backends.map((b) => {
203
+ const { group, ...rest } = b;
204
+ return { ...rest, ...(typeof group === "string" ? { group: refOf(group) } : {}) };
205
+ });
206
+ delete tree.backends;
207
+ }
208
+ if (Array.isArray(tree.healthChecks)) {
209
+ tree.healthChecks = tree.healthChecks.map((h) => (typeof h === "string" ? { healthCheckRef: { name: lastSegment(h) } } : h));
210
+ }
211
+ if (typeof tree.securityPolicy === "string") {
212
+ tree.securityPolicyRef = { name: lastSegment(tree.securityPolicy) };
213
+ delete tree.securityPolicy;
214
+ }
215
+ },
216
+ ComputeURLMap(tree) {
217
+ computeLocation(tree);
218
+ if (typeof tree.defaultService === "string")
219
+ tree.defaultService = refOf(tree.defaultService);
220
+ if (Array.isArray(tree.hostRules)) {
221
+ tree.hostRule = tree.hostRules;
222
+ delete tree.hostRules;
223
+ }
224
+ if (Array.isArray(tree.pathMatchers)) {
225
+ tree.pathMatcher = tree.pathMatchers.map((m) => {
226
+ const { defaultService, pathRules, ...rest } = m;
227
+ return {
228
+ ...rest,
229
+ ...(typeof defaultService === "string" ? { defaultService: refOf(defaultService) } : {}),
230
+ ...(Array.isArray(pathRules)
231
+ ? {
232
+ pathRule: pathRules.map(({ service, ...r }) => ({
233
+ ...r,
234
+ ...(typeof service === "string" ? { service: refOf(service) } : {}),
235
+ })),
236
+ }
237
+ : {}),
238
+ };
239
+ });
240
+ delete tree.pathMatchers;
241
+ }
242
+ },
243
+ ComputeTargetHTTPProxy(tree) {
244
+ computeLocation(tree);
245
+ if (typeof tree.urlMap === "string") {
246
+ tree.urlMapRef = { name: lastSegment(tree.urlMap) };
247
+ delete tree.urlMap;
248
+ }
249
+ },
250
+ ComputeForwardingRule(tree) {
251
+ computeLocation(tree);
252
+ if (tree.IPProtocol !== undefined) {
253
+ tree.ipProtocol = tree.IPProtocol;
254
+ delete tree.IPProtocol;
255
+ }
256
+ if (typeof tree.target === "string")
257
+ tree.target = refOf(tree.target);
258
+ if (typeof tree.backendService === "string") {
259
+ tree.backendServiceRef = { name: lastSegment(tree.backendService) };
260
+ delete tree.backendService;
261
+ }
160
262
  },
161
263
  };
264
+ function lastSegment(url) {
265
+ return url.slice(url.lastIndexOf("/") + 1);
266
+ }
267
+ /** Compute's `region` URL as CNRM's `location`; no region means a global resource. */
268
+ function computeLocation(tree) {
269
+ tree.location = typeof tree.region === "string" ? lastSegment(tree.region) : "global";
270
+ delete tree.region;
271
+ }
272
+ /** The `*Ref` a compute URL names, by its collection (`.../backendServices/web` -> `{ backendServiceRef: { name: "web" } }`). */
273
+ const REF_KEY_BY_COLLECTION = {
274
+ networkEndpointGroups: "networkEndpointGroupRef",
275
+ backendServices: "backendServiceRef",
276
+ backendBuckets: "backendBucketRef",
277
+ targetHttpProxies: "targetHTTPProxyRef",
278
+ targetHttpsProxies: "targetHTTPSProxyRef",
279
+ instanceGroups: "instanceGroupRef",
280
+ };
281
+ function refOf(url) {
282
+ const parts = url.split("/");
283
+ const key = REF_KEY_BY_COLLECTION[parts[parts.length - 2] ?? ""];
284
+ return key ? { [key]: { name: parts[parts.length - 1] } } : url;
285
+ }
162
286
  /**
163
287
  * A REST payload as a CNRM-shaped property tree, in the declared side's
164
288
  * vocabulary. The generic reshape runs first, then the full resource path is
@@ -213,7 +337,7 @@ export async function observeResourcesDeepGcp(options) {
213
337
  let client;
214
338
  try {
215
339
  client = {
216
- project: resolveReadProject(gvk.kind, name, metadata, manifestProjects),
340
+ project: resolveReadProject(gvk.kind, name, metadata, manifestProjects, props),
217
341
  ...(endpoint ? { endpoint } : {}),
218
342
  };
219
343
  }
@@ -82,14 +82,15 @@ export declare function deriveGVK(entityType: string): {
82
82
  */
83
83
  export declare function manifestProjectAnnotations(buildOutput: string | undefined): Map<string, string>;
84
84
  /**
85
- * The project a read should target: `GOOGLE_CLOUD_PROJECT` / the entity's own
86
- * annotation (via `resolveGcpProject`, the applier's rule), then the built
85
+ * The project a read should target: the entity's `projectRef.external`,
86
+ * `GOOGLE_CLOUD_PROJECT`, the entity's own annotation (via
87
+ * `resolveGcpProject`, the applier's rule), then the built
87
88
  * manifest's merged annotation. Throws the applier's own error when nothing
88
89
  * resolves, so the `no-binding` detail names both knobs.
89
90
  */
90
91
  export declare function resolveReadProject(kind: string, name: string, metadata: {
91
92
  annotations?: Record<string, string>;
92
- } | undefined, manifestProjects: Map<string, string>): string;
93
+ } | undefined, manifestProjects: Map<string, string>, props?: Record<string, unknown>): string;
93
94
  /**
94
95
  * Status from a REST payload.
95
96
  *
@@ -1 +1 @@
1
- {"version":3,"file":"describe-resources.d.ts","sourceRoot":"","sources":["../src/describe-resources.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAsC,MAAM,0BAA0B,CAAC;AAsBtG;;gCAEgC;AAChC,UAAU,eAAe;IACvB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE;QACP,UAAU,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACxF,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;KACtB,CAAC;CACH;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAIpF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAgB/F;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,SAAS,EAC9D,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC,MAAM,CAQR;AAUD;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAY3D;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IAC9E,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAwH7B"}
1
+ {"version":3,"file":"describe-resources.d.ts","sourceRoot":"","sources":["../src/describe-resources.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAsC,MAAM,0BAA0B,CAAC;AAsBtG;;gCAEgC;AAChC,UAAU,eAAe;IACvB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE;QACP,UAAU,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACxF,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;KACtB,CAAC;CACH;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAIpF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAgB/F;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,SAAS,EAC9D,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EACrC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,CAQR;AAUD;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAY3D;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IAC9E,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAwH7B"}
@@ -38,7 +38,7 @@
38
38
  import { observation } from "@intentius/chant/observation";
39
39
  import { hasOwnershipMarker, classifyOwnership, readOwnership } from "@intentius/chant/ownership";
40
40
  import { getResource, mapperForKind, GcpReadError, isNotFound } from "./api/read-client.js";
41
- import { resolveGcpProject, parseManifest } from "./op/activities/gcp-apply.js";
41
+ import { resolveGcpProject, parseManifest, projectRefProject } from "./op/activities/gcp-apply.js";
42
42
  import { resolveGVK } from "./serializer.js";
43
43
  /**
44
44
  * chant's ownership marker as GCP labels.
@@ -85,7 +85,7 @@ export function manifestProjectAnnotations(buildOutput) {
85
85
  return out;
86
86
  try {
87
87
  for (const doc of parseManifest(buildOutput, "<build output>")) {
88
- const project = doc.metadata?.annotations?.["cnrm.cloud.google.com/project-id"];
88
+ const project = projectRefProject(doc.spec) ?? doc.metadata?.annotations?.["cnrm.cloud.google.com/project-id"];
89
89
  if (doc.kind && doc.metadata?.name && typeof project === "string") {
90
90
  out.set(`${doc.kind}/${doc.metadata.name}`, project);
91
91
  }
@@ -99,14 +99,15 @@ export function manifestProjectAnnotations(buildOutput) {
99
99
  return out;
100
100
  }
101
101
  /**
102
- * The project a read should target: `GOOGLE_CLOUD_PROJECT` / the entity's own
103
- * annotation (via `resolveGcpProject`, the applier's rule), then the built
102
+ * The project a read should target: the entity's `projectRef.external`,
103
+ * `GOOGLE_CLOUD_PROJECT`, the entity's own annotation (via
104
+ * `resolveGcpProject`, the applier's rule), then the built
104
105
  * manifest's merged annotation. Throws the applier's own error when nothing
105
106
  * resolves, so the `no-binding` detail names both knobs.
106
107
  */
107
- export function resolveReadProject(kind, name, metadata, manifestProjects) {
108
+ export function resolveReadProject(kind, name, metadata, manifestProjects, props) {
108
109
  try {
109
- return resolveGcpProject({ kind, metadata });
110
+ return resolveGcpProject({ kind, metadata, ...(props ? { spec: props } : {}) });
110
111
  }
111
112
  catch (err) {
112
113
  const fromManifest = manifestProjects.get(`${kind}/${name}`);
@@ -195,7 +196,7 @@ export async function describeResources(options) {
195
196
  let client;
196
197
  try {
197
198
  client = {
198
- project: resolveReadProject(gvk.kind, name, metadata, manifestProjects),
199
+ project: resolveReadProject(gvk.kind, name, metadata, manifestProjects, props),
199
200
  ...(endpoint ? { endpoint } : {}),
200
201
  };
201
202
  }
package/dist/health.js CHANGED
@@ -60,7 +60,7 @@ export async function observeHealthGcp(options) {
60
60
  }
61
61
  let project;
62
62
  try {
63
- project = resolveReadProject(gvk.kind, name, metadata, manifestProjects);
63
+ project = resolveReadProject(gvk.kind, name, metadata, manifestProjects, props);
64
64
  }
65
65
  catch (err) {
66
66
  unobserved[entityName] = { type: entityType, reason: "no-binding", detail: err instanceof Error ? err.message : String(err) };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "algorithm": "sha256",
3
3
  "artifacts": {
4
- "manifest.json": "257df817d4b1ad04f71ff75c28b578dcff2a2921fe07100da54974937b645941",
4
+ "manifest.json": "1df258f1ce42c92a75d16af8bb02fb96e2b8a35903feafb3991be4162737103f",
5
5
  "meta.json": "75643660010c044c6f465bef2688a864ab30cc96fd9b68111969749748ac64ca",
6
6
  "types/index.d.ts": "da1ebc6bcf83e1a018a773b59714194aeeb74ae1d5c1252b737b7e730ca98bd5",
7
7
  "rules/hardcoded-project.ts": "6d5ae9efa74d73800eebe1a0a0d43c619ee0fdebe3347195df93fcbe63b34f0d",
@@ -40,5 +40,5 @@
40
40
  "skills/chant-gcp-patterns.md": "4c6809fc7c37fa1879379ad4c0e2d114dec9497bc6eb9d1bca4e79fddea4f509",
41
41
  "skills/chant-gcp-gke.md": "be277019da9a722c851e47cd2dfb9c9536668948c3535fb20db7697e934c4e2b"
42
42
  },
43
- "composite": "2947c3fa4c9b3e3407d761cb6302036cbdc49736886f5bb16407aac326ff42d9"
43
+ "composite": "8f56e528b666ee71c8dde34f63317337bb6183280e11dd1925ac7c1e4117ca89"
44
44
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gcp",
3
- "version": "0.124.33",
3
+ "version": "0.124.35",
4
4
  "chantVersion": ">=0.1.0",
5
5
  "namespace": "GCP",
6
6
  "intrinsics": [],
@@ -119,6 +119,33 @@ export interface ListSpec {
119
119
  labels?: Record<string, string> | null;
120
120
  }>;
121
121
  }
122
+ /**
123
+ * Where a mapper works: the API base, the project, and the rest of the applied
124
+ * manifest, so a `*Ref` to a resource declared alongside can take that
125
+ * resource's scope. The read path has no manifest.
126
+ */
127
+ export interface MapperCtx {
128
+ base: string;
129
+ project: string;
130
+ manifest?: readonly GcpResource[];
131
+ }
132
+ /**
133
+ * A kind whose apply is not GET-then-create (#4233). IAMPolicyMember is a
134
+ * member inside another resource's policy, so it reads, merges and writes that
135
+ * policy instead. `read` answers like a GET: 200 with a body when present, 404
136
+ * when not.
137
+ */
138
+ export interface CustomOps {
139
+ apply(resource: GcpResource, ctx: MapperCtx, http: GcpHttp, signal?: AbortSignal): Promise<{
140
+ created: boolean;
141
+ updated: boolean;
142
+ }>;
143
+ delete(resource: GcpResource, ctx: MapperCtx, http: GcpHttp, signal?: AbortSignal): Promise<boolean>;
144
+ read(resource: GcpResource, ctx: MapperCtx, http: GcpHttp, signal?: AbortSignal): Promise<{
145
+ status: number;
146
+ text: string;
147
+ }>;
148
+ }
122
149
  /** Maps one CNRM kind to its GCP REST operations. The unit of the dispatch table. */
123
150
  export interface ResourceMapper {
124
151
  /** CNRM kind this handles. */
@@ -126,10 +153,11 @@ export interface ResourceMapper {
126
153
  /** Real-GCP API host, used when no `endpoint` override is given. */
127
154
  defaultHost: string;
128
155
  /** Build the GET + create plan for one resource against `base`. */
129
- plan(resource: GcpResource, ctx: {
130
- base: string;
131
- project: string;
132
- }): ApplyPlan;
156
+ plan(resource: GcpResource, ctx: MapperCtx): ApplyPlan;
157
+ /** False for a resource of this kind chant cannot act on (an IAM binding on a target with no policy endpoint): reported, not attempted. */
158
+ accepts?(resource: GcpResource, ctx: MapperCtx): boolean;
159
+ /** Present when apply, delete and read are not the plan's GET-then-create. */
160
+ custom?: CustomOps;
133
161
  /** Present for async resources whose create returns a long-running operation. */
134
162
  operation?: OperationSpec;
135
163
  /** Present when the kind can be pruned (list live → delete chant-owned orphans). */
@@ -153,10 +181,23 @@ export declare function bucketInsertBody(cnrm: CnrmStorageBucket): BucketInsertB
153
181
  export declare function pubSubTopicBody(resource: GcpResource): PubSubTopicBody;
154
182
  export declare const storageBucketMapper: ResourceMapper;
155
183
  export declare const pubSubTopicMapper: ResourceMapper;
156
- /** Map a CNRM RunService to a Cloud Run v2 Service body. Pure. */
157
- export declare function cloudRunServiceBody(resource: GcpResource): {
184
+ /**
185
+ * Map a CNRM RunService to a Cloud Run v2 Service body. Pure. CNRM names the
186
+ * service account with `template.serviceAccountRef`; v2 takes
187
+ * `template.serviceAccount` as an email (#4240).
188
+ */
189
+ export declare function cloudRunServiceBody(resource: GcpResource, project?: string): {
158
190
  template?: unknown;
159
191
  };
192
+ /**
193
+ * The email a CNRM `serviceAccountRef` names: `external` as given (an email,
194
+ * or a `projects/<p>/serviceAccounts/<email>` path), `name` as an account id
195
+ * in the project.
196
+ */
197
+ export declare function serviceAccountEmail(ref: {
198
+ name?: string;
199
+ external?: string;
200
+ } | undefined, project?: string): string | undefined;
160
201
  export declare const cloudRunServiceMapper: ResourceMapper;
161
202
  /**
162
203
  * Map a CNRM PubSubSubscription to a Pub/Sub Subscription body, resolving the
@@ -178,6 +219,11 @@ export declare const MAPPERS: Record<string, ResourceMapper>;
178
219
  * refs point outside the manifest and are ignored for ordering. Pure.
179
220
  */
180
221
  export declare function referencedNames(resource: GcpResource): string[];
222
+ /** The local resources this resource references via `*Ref` fields, each with its kind when known. Pure. */
223
+ export declare function referencedResources(resource: GcpResource): Array<{
224
+ name: string;
225
+ kind?: string;
226
+ }>;
181
227
  /**
182
228
  * Topologically order resources so a referenced resource comes before the
183
229
  * resource that references it (apply order; reverse for delete). Refs to names
@@ -197,6 +243,13 @@ export declare function resolveGcpEndpoint(args?: {
197
243
  endpoint?: string;
198
244
  }, env?: NodeJS.ProcessEnv): string | undefined;
199
245
  /** Resolve the project: `GOOGLE_CLOUD_PROJECT` env, else the CNRM project-id annotation. Pure. */
246
+ /**
247
+ * The project a resource names in `spec.projectRef.external` (#4201): a
248
+ * project id or `projects/<id>`. A `GCP.ProjectId` pseudo-parameter there
249
+ * (`{ Ref: "GCP::ProjectId" }`, unresolved in discovery output) reads
250
+ * `GCP_PROJECT_ID`, as the serializer does.
251
+ */
252
+ export declare function projectRefProject(spec: Record<string, unknown> | undefined, env?: NodeJS.ProcessEnv): string | undefined;
200
253
  export declare function resolveGcpProject(resource: GcpResource, env?: NodeJS.ProcessEnv): string;
201
254
  /** Injectable HTTP client — mirrors argo's injectable fetcher so tests avoid the network. */
202
255
  export type GcpHttp = (method: string, url: string, body?: unknown, signal?: AbortSignal) => Promise<{
@@ -209,10 +262,7 @@ export type GcpHttp = (method: string, url: string, body?: unknown, signal?: Abo
209
262
  * create it. Async create/update return an operation that is polled to
210
263
  * completion. `http` is injectable for tests.
211
264
  */
212
- export declare function applyResource(mapper: ResourceMapper, resource: GcpResource, ctx: {
213
- base: string;
214
- project: string;
215
- }, http?: GcpHttp, signal?: AbortSignal): Promise<{
265
+ export declare function applyResource(mapper: ResourceMapper, resource: GcpResource, ctx: MapperCtx, http?: GcpHttp, signal?: AbortSignal): Promise<{
216
266
  kind: string;
217
267
  name: string;
218
268
  created: boolean;
@@ -308,10 +358,7 @@ export interface GcpNotPrunable {
308
358
  * Returns what it could not consider alongside what it deleted — a kind with no
309
359
  * `list`, or whose list call failed, is reported rather than dropped (#1447).
310
360
  */
311
- export declare function pruneOrphans(desired: GcpResource[], resolve: (mapper: ResourceMapper, resource?: GcpResource) => {
312
- base: string;
313
- project: string;
314
- }, http?: GcpHttp, signal?: AbortSignal): Promise<{
361
+ export declare function pruneOrphans(desired: GcpResource[], resolve: (mapper: ResourceMapper, resource?: GcpResource) => MapperCtx, http?: GcpHttp, signal?: AbortSignal): Promise<{
315
362
  pruned: Array<{
316
363
  kind: string;
317
364
  name: string;
@@ -354,10 +401,7 @@ export declare function gcpApply(args: GcpApplyArgs, signal?: AbortSignal, http?
354
401
  * already gone. For async resources, `DELETE` returns a long-running operation
355
402
  * that is polled to completion. `http` is injectable for tests.
356
403
  */
357
- export declare function deleteResource(mapper: ResourceMapper, resource: GcpResource, ctx: {
358
- base: string;
359
- project: string;
360
- }, http?: GcpHttp, signal?: AbortSignal): Promise<{
404
+ export declare function deleteResource(mapper: ResourceMapper, resource: GcpResource, ctx: MapperCtx, http?: GcpHttp, signal?: AbortSignal): Promise<{
361
405
  kind: string;
362
406
  name: string;
363
407
  deleted: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"gcp-apply.d.ts","sourceRoot":"","sources":["../../../src/op/activities/gcp-apply.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gcp-apply.d.ts","sourceRoot":"","sources":["../../../src/op/activities/gcp-apply.ts"],"names":[],"mappings":"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"}