@intentius/chant 0.124.45 → 0.124.46
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/capabilities/aws.paths +148 -0
- package/dist/capabilities/base-mappings.json +122 -0
- package/dist/capabilities/catalog.d.ts +89 -0
- package/dist/capabilities/catalog.d.ts.map +1 -0
- package/dist/capabilities/catalog.js +204 -0
- package/dist/capabilities/language.d.ts +103 -0
- package/dist/capabilities/language.d.ts.map +1 -0
- package/dist/capabilities/language.js +335 -0
- package/dist/capabilities/matcher.d.ts +65 -0
- package/dist/capabilities/matcher.d.ts.map +1 -0
- package/dist/capabilities/matcher.js +299 -0
- package/dist/capabilities/view.d.ts +207 -0
- package/dist/capabilities/view.d.ts.map +1 -0
- package/dist/capabilities/view.js +484 -0
- package/dist/cli/commands/lint.d.ts.map +1 -1
- package/dist/cli/commands/lint.js +1 -0
- package/dist/cli/handlers/declared-graph.d.ts +44 -0
- package/dist/cli/handlers/declared-graph.d.ts.map +1 -0
- package/dist/cli/handlers/declared-graph.js +87 -0
- package/dist/cli/handlers/graph.d.ts +25 -0
- package/dist/cli/handlers/graph.d.ts.map +1 -1
- package/dist/cli/handlers/graph.js +93 -87
- package/dist/cli/handlers/pr-env.d.ts.map +1 -1
- package/dist/cli/handlers/pr-env.js +2 -1
- package/dist/cli/handlers/search-count.d.ts +89 -0
- package/dist/cli/handlers/search-count.d.ts.map +1 -0
- package/dist/cli/handlers/search-count.js +132 -0
- package/dist/cli/handlers/search.d.ts +358 -6
- package/dist/cli/handlers/search.d.ts.map +1 -1
- package/dist/cli/handlers/search.js +1065 -155
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +23 -3
- package/dist/cli/mcp/server.d.ts.map +1 -1
- package/dist/cli/mcp/server.js +3 -0
- package/dist/cli/mcp/tools/capabilities.d.ts +7 -0
- package/dist/cli/mcp/tools/capabilities.d.ts.map +1 -0
- package/dist/cli/mcp/tools/capabilities.js +27 -0
- package/dist/cli/mcp/workspace-tools.d.ts +3 -1
- package/dist/cli/mcp/workspace-tools.d.ts.map +1 -1
- package/dist/cli/mcp/workspace-tools.js +47 -2
- package/dist/cli/parse-args.d.ts.map +1 -1
- package/dist/cli/parse-args.js +64 -17
- package/dist/cli/registry.d.ts +22 -0
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/components/pr-env-ports.d.ts +29 -0
- package/dist/components/pr-env-ports.d.ts.map +1 -0
- package/dist/components/pr-env-ports.js +77 -0
- package/dist/components/pr-env-run.d.ts +5 -21
- package/dist/components/pr-env-run.d.ts.map +1 -1
- package/dist/components/pr-env-run.js +6 -70
- package/dist/components/pr-environment.d.ts +2 -1
- package/dist/components/pr-environment.d.ts.map +1 -1
- package/dist/components/pr-environment.js +1 -1
- package/dist/config-environments.d.ts +92 -0
- package/dist/config-environments.d.ts.map +1 -0
- package/dist/config-environments.js +102 -0
- package/dist/config.d.ts +24 -84
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +9 -96
- package/dist/graph-detail.d.ts.map +1 -1
- package/dist/graph-detail.js +15 -3
- package/dist/graph-effective.d.ts +33 -2
- package/dist/graph-effective.d.ts.map +1 -1
- package/dist/graph-effective.js +215 -68
- package/dist/graph-ir.d.ts +23 -0
- package/dist/graph-ir.d.ts.map +1 -1
- package/dist/graph-ir.js +130 -0
- package/dist/graph-sub-template.d.ts +11 -0
- package/dist/graph-sub-template.d.ts.map +1 -0
- package/dist/graph-sub-template.js +19 -0
- package/dist/lexicon.d.ts +9 -0
- package/dist/lexicon.d.ts.map +1 -1
- package/dist/lifecycle/observe.d.ts +28 -0
- package/dist/lifecycle/observe.d.ts.map +1 -1
- package/dist/lifecycle/observe.js +23 -1
- package/dist/lint/rule.d.ts +6 -0
- package/dist/lint/rule.d.ts.map +1 -1
- package/dist/live-endpoint.d.ts +1 -1
- package/dist/live-endpoint.d.ts.map +1 -1
- package/dist/live-endpoint.js +1 -1
- package/dist/observation.d.ts +48 -1
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +21 -5
- package/dist/op/activities/activity-contracts.d.ts +4 -4
- package/dist/wave-runtime.mjs +250 -249
- package/dist/workspace/capabilities-contract.d.ts +66 -0
- package/dist/workspace/capabilities-contract.d.ts.map +1 -0
- package/dist/workspace/capabilities-contract.js +107 -0
- package/dist/workspace/capabilities.schema.json +229 -0
- package/dist/workspace/compose-graph.d.ts +9 -0
- package/dist/workspace/compose-graph.d.ts.map +1 -1
- package/dist/workspace/compose-graph.js +3 -1
- package/dist/workspace/conformance/index.d.ts +1 -1
- package/dist/workspace/conformance/index.d.ts.map +1 -1
- package/dist/workspace/conformance/index.js +39 -2
- package/dist/workspace/graph-cache.d.ts +8 -0
- package/dist/workspace/graph-cache.d.ts.map +1 -1
- package/dist/workspace/graph-cache.js +27 -3
- package/dist/workspace/graph-cli.d.ts +39 -2
- package/dist/workspace/graph-cli.d.ts.map +1 -1
- package/dist/workspace/graph-cli.js +66 -24
- package/dist/workspace/graph.schema.json +148 -0
- package/dist/workspace/kind-readers.d.ts +3 -0
- package/dist/workspace/kind-readers.d.ts.map +1 -1
- package/dist/workspace/kind-readers.js +7 -1
- package/dist/workspace/member-commands.d.ts +10 -1
- package/dist/workspace/member-commands.d.ts.map +1 -1
- package/dist/workspace/member-commands.js +17 -1
- package/dist/workspace/nested-graph.d.ts +2 -0
- package/dist/workspace/nested-graph.d.ts.map +1 -1
- package/dist/workspace/nested-graph.js +32 -1
- package/dist/workspace/reason-codes.d.ts +10 -0
- package/dist/workspace/reason-codes.d.ts.map +1 -1
- package/dist/workspace/reason-codes.js +12 -0
- package/dist/workspace/search-cli.d.ts +204 -0
- package/dist/workspace/search-cli.d.ts.map +1 -0
- package/dist/workspace/search-cli.js +466 -0
- package/dist/workspace/search-contract.d.ts +56 -0
- package/dist/workspace/search-contract.d.ts.map +1 -0
- package/dist/workspace/search-contract.js +70 -0
- package/dist/workspace/search.schema.json +822 -0
- package/package.json +1 -1
- package/src/__snapshots__/okf.test.ts.snap +10 -0
- package/src/capabilities/aws.paths +148 -0
- package/src/capabilities/base-mappings.json +122 -0
- package/src/capabilities/catalog.ts +230 -0
- package/src/capabilities/language.test.ts +191 -0
- package/src/capabilities/language.ts +373 -0
- package/src/capabilities/matcher.ts +315 -0
- package/src/capabilities/view-compose.test.ts +76 -0
- package/src/capabilities/view.ts +631 -0
- package/src/cli/commands/lint.ts +1 -0
- package/src/cli/handlers/declared-graph.ts +99 -0
- package/src/cli/handlers/graph.test.ts +94 -3
- package/src/cli/handlers/graph.ts +123 -96
- package/src/cli/handlers/pr-env.ts +1 -2
- package/src/cli/handlers/search-build-roots.test.ts +144 -0
- package/src/cli/handlers/search-count.test.ts +191 -0
- package/src/cli/handlers/search-count.ts +165 -0
- package/src/cli/handlers/search-json.test.ts +333 -0
- package/src/cli/handlers/search-live.test.ts +387 -0
- package/src/cli/handlers/search-paths.test.ts +235 -0
- package/src/cli/handlers/search.ts +1312 -166
- package/src/cli/main.test.ts +28 -3
- package/src/cli/main.ts +23 -3
- package/src/cli/mcp/server.test.ts +3 -3
- package/src/cli/mcp/server.ts +3 -0
- package/src/cli/mcp/tools/capabilities.ts +32 -0
- package/src/cli/mcp/workspace-tools.e2e.test.ts +21 -1
- package/src/cli/mcp/workspace-tools.ts +47 -2
- package/src/cli/parse-args.ts +52 -13
- package/src/cli/registry.ts +22 -0
- package/src/components/pr-env-ports.ts +89 -0
- package/src/components/pr-env-run-bundle.test.ts +54 -0
- package/src/components/pr-env-run.ts +5 -76
- package/src/components/pr-environment.ts +2 -1
- package/src/config-environments.ts +133 -0
- package/src/config.ts +37 -124
- package/src/graph-detail.ts +15 -3
- package/src/graph-effective.ts +226 -75
- package/src/graph-ir.test.ts +163 -0
- package/src/graph-ir.ts +147 -0
- package/src/graph-sub-template.ts +22 -0
- package/src/lexicon.ts +10 -0
- package/src/lifecycle/observe.test.ts +27 -1
- package/src/lifecycle/observe.ts +43 -1
- package/src/lint/rule.ts +6 -0
- package/src/live-endpoint.ts +1 -1
- package/src/observation.test.ts +25 -0
- package/src/observation.ts +69 -5
- package/src/workspace/capabilities-contract.test.ts +88 -0
- package/src/workspace/capabilities-contract.ts +132 -0
- package/src/workspace/capabilities.schema.json +229 -0
- package/src/workspace/compose-graph.ts +10 -1
- package/src/workspace/conformance/conformance.e2e.test.ts +14 -1
- package/src/workspace/conformance/index.ts +31 -2
- package/src/workspace/graph-cache.ts +27 -3
- package/src/workspace/graph-cli.ts +96 -24
- package/src/workspace/graph.schema.json +148 -0
- package/src/workspace/kind-readers.e2e.test.ts +28 -0
- package/src/workspace/kind-readers.test.ts +1 -1
- package/src/workspace/kind-readers.ts +7 -1
- package/src/workspace/member-commands.ts +22 -1
- package/src/workspace/nested-graph.ts +32 -1
- package/src/workspace/reason-codes.test.ts +7 -0
- package/src/workspace/reason-codes.ts +12 -0
- package/src/workspace/search-cli.e2e.test.ts +305 -0
- package/src/workspace/search-cli.ts +591 -0
- package/src/workspace/search-contract.ts +95 -0
- package/src/workspace/search.schema.json +822 -0
package/dist/config.js
CHANGED
|
@@ -7,86 +7,11 @@ import { evaluateProjectConfig } from "./config-sandbox.js";
|
|
|
7
7
|
import { lexiconNames, pathLexiconRoot, registerLexiconDeclarations } from "./lexicon-module.js";
|
|
8
8
|
import { decideConfigSchema } from "./op/decide-config.js";
|
|
9
9
|
import { PublishDeclarationSchema } from "./lifecycle/publish-declaration.js";
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
* Every declared environment's name, in `environments` order. `undefined` in,
|
|
16
|
-
* `undefined` out — mirrors the field itself being optional, so a caller that
|
|
17
|
-
* already writes `config.environments?.something` can keep doing so:
|
|
18
|
-
* `environmentNames(config.environments)?.includes(name)`.
|
|
19
|
-
*/
|
|
20
|
-
export function environmentNames(environments) {
|
|
21
|
-
return environments?.map(environmentName);
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Whether a declared environment name is a glob pattern rather than a literal
|
|
25
|
-
* (#1221) — it contains at least one `*`.
|
|
26
|
-
*/
|
|
27
|
-
export function isEnvironmentPattern(declaredName) {
|
|
28
|
-
return declaredName.includes("*");
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Anchored `*`-glob match (#1221): each `*` in `pattern` matches any run of
|
|
32
|
-
* characters (possibly empty); everything else matches itself. Deliberately
|
|
33
|
-
* the whole surface — no `?`, no character classes, no regex. A pattern with
|
|
34
|
-
* no `*` degenerates to string equality.
|
|
35
|
-
*/
|
|
36
|
-
export function matchesEnvironmentPattern(pattern, name) {
|
|
37
|
-
const parts = pattern.split("*");
|
|
38
|
-
if (parts.length === 1)
|
|
39
|
-
return pattern === name;
|
|
40
|
-
const first = parts[0];
|
|
41
|
-
const last = parts[parts.length - 1];
|
|
42
|
-
if (!name.startsWith(first))
|
|
43
|
-
return false;
|
|
44
|
-
let cursor = first.length;
|
|
45
|
-
for (let i = 1; i < parts.length - 1; i++) {
|
|
46
|
-
const part = parts[i];
|
|
47
|
-
if (part === "")
|
|
48
|
-
continue;
|
|
49
|
-
const at = name.indexOf(part, cursor);
|
|
50
|
-
if (at === -1)
|
|
51
|
-
return false;
|
|
52
|
-
cursor = at + part.length;
|
|
53
|
-
}
|
|
54
|
-
return name.length - cursor >= last.length && name.endsWith(last);
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Environment-membership test (#1221): is `name` covered by this project's
|
|
58
|
-
* declared `environments`? A literal entry matches by equality; an entry
|
|
59
|
-
* containing `*` matches as a glob pattern (`"pr-*"` covers `pr-42`).
|
|
60
|
-
* Literals are checked first across the whole list, then patterns — so a
|
|
61
|
-
* name that is declared outright never depends on pattern order. `undefined`
|
|
62
|
-
* / empty `environments` returns `false`; callers that treat "no declared
|
|
63
|
-
* environments" as "anything goes" (e.g. {@link unknownEnvError} in
|
|
64
|
-
* `./env.ts`) guard that case themselves.
|
|
65
|
-
*/
|
|
66
|
-
export function matchesDeclaredEnvironment(environments, name) {
|
|
67
|
-
const names = environmentNames(environments) ?? [];
|
|
68
|
-
if (names.includes(name))
|
|
69
|
-
return true;
|
|
70
|
-
return names.some((declared) => isEnvironmentPattern(declared) && matchesEnvironmentPattern(declared, name));
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* The endpoint `name` declares (chant #1166) — `undefined` for a bare-string
|
|
74
|
-
* entry, an entry with no `endpoint` set, or a name this project doesn't
|
|
75
|
-
* declare at all. `./live-endpoint.ts`'s `applyLiveEndpoint` is the consumer:
|
|
76
|
-
* it injects this into the ambient env var each observing lexicon's CLI
|
|
77
|
-
* shell-out reads (e.g. `AWS_ENDPOINT_URL`), unless that var is already set —
|
|
78
|
-
* ambient always wins.
|
|
79
|
-
*
|
|
80
|
-
* A pattern entry (#1221) can carry an endpoint too: `{ name: "pr-*",
|
|
81
|
-
* endpoint }` supplies the endpoint for every `pr-<n>` environment. A literal
|
|
82
|
-
* entry always wins over a pattern — declaring `pr-special` alongside
|
|
83
|
-
* `pr-*` resolves `pr-special` to the literal entry's endpoint (or none).
|
|
84
|
-
*/
|
|
85
|
-
export function environmentEndpoint(environments, name) {
|
|
86
|
-
const found = environments?.find((e) => environmentName(e) === name) ??
|
|
87
|
-
environments?.find((e) => isEnvironmentPattern(environmentName(e)) && matchesEnvironmentPattern(environmentName(e), name));
|
|
88
|
-
return found && typeof found !== "string" ? found.endpoint : undefined;
|
|
89
|
-
}
|
|
10
|
+
// The environment and ownership helpers that read a config already loaded
|
|
11
|
+
// live in ./config-environments.ts, which loads nothing, so a bundle that
|
|
12
|
+
// needs only them stays clear of the loader below (#4356 follow-up).
|
|
13
|
+
export { environmentEndpoint, environmentName, environmentNames, isEnvironmentPattern, isOwnershipParamRef, matchesDeclaredEnvironment, matchesEnvironmentPattern, resolveOwnershipStack, } from "./config-environments.js";
|
|
14
|
+
import { isOwnershipParamRef, resolveOwnershipStack } from "./config-environments.js";
|
|
90
15
|
/**
|
|
91
16
|
* Zod schema for ChantConfig validation.
|
|
92
17
|
*/
|
|
@@ -120,6 +45,10 @@ export const ChantConfigSchema = z.object({
|
|
|
120
45
|
build: z.object({
|
|
121
46
|
fold: z.boolean().optional(),
|
|
122
47
|
}).optional(),
|
|
48
|
+
// Strict like `run`: a misspelt `lint` would leave the gate on with nothing said.
|
|
49
|
+
graph: z.object({
|
|
50
|
+
lint: z.enum(["gate", "report"]).optional(),
|
|
51
|
+
}).strict().optional(),
|
|
123
52
|
buildParams: z.record(z.string(), z.object({
|
|
124
53
|
type: z.enum(["string", "number", "boolean"]),
|
|
125
54
|
default: z.union([z.string(), z.number(), z.boolean()]).optional(),
|
|
@@ -358,22 +287,6 @@ function warnIfFragmentShadowsProjectConfig(configPath) {
|
|
|
358
287
|
}
|
|
359
288
|
/** Top-level keys that make a config a *project* config rather than a lint fragment. */
|
|
360
289
|
const PROJECT_CONFIG_KEYS = new Set(Object.keys(ChantConfigSchema.shape).filter((k) => k !== "lint"));
|
|
361
|
-
/** Whether an `ownership.env` entry is a build-parameter reference rather than a literal. */
|
|
362
|
-
export function isOwnershipParamRef(env) {
|
|
363
|
-
return typeof env === "object" && env !== null && typeof env.param === "string";
|
|
364
|
-
}
|
|
365
|
-
/**
|
|
366
|
-
* The ownership stack identity alone — `ownership.stack` when marking is on
|
|
367
|
-
* (no `stack`, or `enabled: false`, means off). For callers that need the
|
|
368
|
-
* stack and nothing else (a field manager, a prune selector) and so have no
|
|
369
|
-
* build parameters to resolve `env` against.
|
|
370
|
-
*/
|
|
371
|
-
export function resolveOwnershipStack(config) {
|
|
372
|
-
const o = config.ownership;
|
|
373
|
-
if (!o || !o.stack || o.enabled === false)
|
|
374
|
-
return undefined;
|
|
375
|
-
return o.stack;
|
|
376
|
-
}
|
|
377
290
|
/**
|
|
378
291
|
* Resolve the `env` half of the ownership marker (#1396). A literal is
|
|
379
292
|
* returned as-is. A `{ param }` reference is looked up in this build's resolved
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph-detail.d.ts","sourceRoot":"","sources":["../src/graph-detail.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAkB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"graph-detail.d.ts","sourceRoot":"","sources":["../src/graph-detail.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAkB,MAAM,YAAY,CAAC;AAG1D;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAExC,eAAO,MAAM,MAAM;aACjB,MAAM,EAAE,CAAC;aACT,UAAU,EAAE,CAAC;aACb,WAAW,EAAE,CAAC;aACd,UAAU,EAAE,CAAC;CACL,CAAC;AAEX,6DAA6D;AAC7D,wBAAgB,WAAW,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAYpE;AAgQD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAYtF"}
|
package/dist/graph-detail.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { subTemplateRefs } from "./graph-sub-template.js";
|
|
1
2
|
export const DETAIL = {
|
|
2
3
|
STACKS: 0,
|
|
3
4
|
COMPOSITES: 1,
|
|
@@ -28,12 +29,12 @@ function paintAttrs(attrs) {
|
|
|
28
29
|
out[k] = v;
|
|
29
30
|
return out;
|
|
30
31
|
}
|
|
31
|
-
/** A `{ $ref: "producer.attribute" }` envelope — a reference, not a property tree. */
|
|
32
|
+
/** A `{ $ref: "producer.attribute" }` or `{ $sub: "..." }` (#4373) envelope — a reference, not a property tree. */
|
|
32
33
|
function isRefEnvelope(v) {
|
|
33
34
|
return (typeof v === "object" &&
|
|
34
35
|
v !== null &&
|
|
35
36
|
!Array.isArray(v) &&
|
|
36
|
-
typeof v.$ref === "string");
|
|
37
|
+
(typeof v.$ref === "string" || typeof v.$sub === "string"));
|
|
37
38
|
}
|
|
38
39
|
/** T2's resource view of a node's attrs: overlay paint, scalar fields
|
|
39
40
|
* (identity, status-relevant values), and top-level reference envelopes.
|
|
@@ -235,7 +236,8 @@ function toAttributes(ir) {
|
|
|
235
236
|
});
|
|
236
237
|
return { ...ir, edges };
|
|
237
238
|
}
|
|
238
|
-
/** Find the attribute in a `{ $ref: "producer.attribute" }` envelope under attrs
|
|
239
|
+
/** Find the attribute in a `{ $ref: "producer.attribute" }` envelope under attrs,
|
|
240
|
+
* or in a `{ $sub }` envelope's `${producer.attribute}` (#4373). */
|
|
239
241
|
function findRefAttr(attrs, producer) {
|
|
240
242
|
let found;
|
|
241
243
|
const visit = (v) => {
|
|
@@ -254,6 +256,16 @@ function findRefAttr(attrs, producer) {
|
|
|
254
256
|
return;
|
|
255
257
|
}
|
|
256
258
|
}
|
|
259
|
+
const sub = v.$sub;
|
|
260
|
+
if (typeof sub === "string") {
|
|
261
|
+
const vars = v.$vars;
|
|
262
|
+
const bound = new Set(vars && typeof vars === "object" ? Object.keys(vars) : []);
|
|
263
|
+
const hit = subTemplateRefs(sub, bound).find((r) => r.name === producer && r.attr);
|
|
264
|
+
if (hit) {
|
|
265
|
+
found = hit.attr;
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
257
269
|
for (const val of Object.values(v))
|
|
258
270
|
visit(val);
|
|
259
271
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { GraphIR } from "./graph-ir.js";
|
|
1
|
+
import type { GraphIR, IRNode } from "./graph-ir.js";
|
|
2
|
+
import { type CapabilityPack } from "./capabilities/view.js";
|
|
2
3
|
/**
|
|
3
4
|
* Fold DERIVED reachability facts onto EC2 instance nodes so a single-node query
|
|
4
5
|
* can answer questions that are otherwise a multi-hop join with a union (#1139).
|
|
@@ -20,6 +21,36 @@ import type { GraphIR } from "./graph-ir.js";
|
|
|
20
21
|
* With these, "instances SSH-reachable from the internet" is one predicate:
|
|
21
22
|
* `kind:EC2::Instance attr:internetFacing=true attr:effectiveIngress=tcp:22:0.0.0.0/0`
|
|
22
23
|
* — no hand-joined CLI sweep, no over/under-counting.
|
|
24
|
+
*
|
|
25
|
+
* Both are capability rules (#4375): `internet-facing`, `in-sg` and
|
|
26
|
+
* `ingress-of` in `capabilities/aws.paths`, over the lexicon-neutral view, so
|
|
27
|
+
* one rule serves CloudFormation kinds and Terraform's AWS types (#4362)
|
|
28
|
+
* alike. What stays here is the attribute surface: which nodes get the facts,
|
|
29
|
+
* and how a rule's evidence is spelled as `proto:port:cidr` and `...Via`.
|
|
30
|
+
*/
|
|
31
|
+
export declare function enrichEffectiveTopology(ir: GraphIR, packs?: CapabilityPack[]): GraphIR;
|
|
32
|
+
/**
|
|
33
|
+
* The Terraform type of a `resource` or `data` node: `aws_instance` for
|
|
34
|
+
* `aws_instance.web`, `data.aws_ami` for `data.aws_ami.ubuntu`. Undefined for
|
|
35
|
+
* any other node.
|
|
36
|
+
*
|
|
37
|
+
* This is the one reading of a terraform node's type. `chant search`'s `kind:`
|
|
38
|
+
* (#4366), its rows and `--explain` count, `--count-by kind` (#4360) and the
|
|
39
|
+
* effective-topology folds (#4362) all call it, so they cannot disagree.
|
|
40
|
+
*
|
|
41
|
+
* The terraform lexicon puts every resource on the IR as `Terraform::Resource`
|
|
42
|
+
* (and every data source as `Terraform::Data`) and carries the block's type
|
|
43
|
+
* label as `attrs.type` (#4366), which is read first. A node without one (an
|
|
44
|
+
* older producer, or a `chant graph --live` node built from state) falls back
|
|
45
|
+
* to the block's address (`aws_instance.web`, or `module.app.aws_instance.web`)
|
|
46
|
+
* in `attrs.address`, whose second-to-last segment is the type, and failing
|
|
47
|
+
* that to its id, whose last path segment is the address too. A data source
|
|
48
|
+
* keeps its `data.` prefix: `data.aws_ami` reads an AMI, it does not manage one.
|
|
49
|
+
*/
|
|
50
|
+
export declare function terraformType(n: IRNode | undefined): string | undefined;
|
|
51
|
+
/**
|
|
52
|
+
* The provider resource type of a terraform `resource` node (`aws_instance`),
|
|
53
|
+
* or undefined for any other node, data sources included. See {@link terraformType}.
|
|
23
54
|
*/
|
|
24
|
-
export declare function
|
|
55
|
+
export declare function terraformResourceType(n: IRNode | undefined): string | undefined;
|
|
25
56
|
//# sourceMappingURL=graph-effective.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph-effective.d.ts","sourceRoot":"","sources":["../src/graph-effective.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"graph-effective.d.ts","sourceRoot":"","sources":["../src/graph-effective.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAElD,OAAO,EAAa,KAAK,cAAc,EAAa,MAAM,qBAAqB,CAAC;AAGhF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,GAAE,cAAc,EAAO,GAAG,OAAO,CA4C1F;AAkGD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAUvE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAE/E"}
|
package/dist/graph-effective.js
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { CapabilityEngine } from "./capabilities/matcher.js";
|
|
2
|
+
import { buildView } from "./capabilities/view.js";
|
|
3
|
+
import { resolvePacks, shippedRules } from "./capabilities/catalog.js";
|
|
1
4
|
/**
|
|
2
5
|
* Fold DERIVED reachability facts onto EC2 instance nodes so a single-node query
|
|
3
6
|
* can answer questions that are otherwise a multi-hop join with a union (#1139).
|
|
@@ -19,89 +22,233 @@
|
|
|
19
22
|
* With these, "instances SSH-reachable from the internet" is one predicate:
|
|
20
23
|
* `kind:EC2::Instance attr:internetFacing=true attr:effectiveIngress=tcp:22:0.0.0.0/0`
|
|
21
24
|
* — no hand-joined CLI sweep, no over/under-counting.
|
|
25
|
+
*
|
|
26
|
+
* Both are capability rules (#4375): `internet-facing`, `in-sg` and
|
|
27
|
+
* `ingress-of` in `capabilities/aws.paths`, over the lexicon-neutral view, so
|
|
28
|
+
* one rule serves CloudFormation kinds and Terraform's AWS types (#4362)
|
|
29
|
+
* alike. What stays here is the attribute surface: which nodes get the facts,
|
|
30
|
+
* and how a rule's evidence is spelled as `proto:port:cidr` and `...Via`.
|
|
22
31
|
*/
|
|
23
|
-
export function enrichEffectiveTopology(ir) {
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
const
|
|
28
|
-
const via = (...names) => (v) => names.includes(v);
|
|
29
|
-
/** Out-neighbours of `id` (edges from → to), optionally filtered by viaAttr. */
|
|
30
|
-
const out = (id, pred) => edges
|
|
31
|
-
.filter((e) => e.from === id && (!pred || pred(e.viaAttr ?? e.kind ?? "")))
|
|
32
|
-
.map((e) => byId.get(e.to))
|
|
33
|
-
.filter((x) => !!x);
|
|
34
|
-
/** In-neighbours of `id` (edges to ← from), optionally filtered by viaAttr. */
|
|
35
|
-
const incoming = (id, pred) => edges
|
|
36
|
-
.filter((e) => e.to === id && (!pred || pred(e.viaAttr ?? e.kind ?? "")))
|
|
37
|
-
.map((e) => byId.get(e.from))
|
|
38
|
-
.filter((x) => !!x);
|
|
39
|
-
const normalizeIngress = (sg) => {
|
|
40
|
-
const rules = sg.attrs?.["SecurityGroupIngress"];
|
|
41
|
-
if (!Array.isArray(rules))
|
|
42
|
-
return [];
|
|
43
|
-
return rules.map((r) => {
|
|
44
|
-
const rule = r;
|
|
45
|
-
const proto = String(rule.IpProtocol ?? "-1");
|
|
46
|
-
const from = rule.FromPort;
|
|
47
|
-
const to = rule.ToPort;
|
|
48
|
-
const port = from == null ? "all" : from === to ? `${from}` : `${from}-${to}`;
|
|
49
|
-
const cidr = rule.CidrIp ??
|
|
50
|
-
rule.CidrIpv6 ??
|
|
51
|
-
(rule.SourceSecurityGroupId ? `sg:${String(rule.SourceSecurityGroupId)}` : "?");
|
|
52
|
-
return `${proto}:${port}:${cidr}`;
|
|
53
|
-
});
|
|
54
|
-
};
|
|
55
|
-
/** Security groups reachable from an instance — direct and via launch template. */
|
|
56
|
-
const effectiveSgs = (inst) => {
|
|
57
|
-
const direct = out(inst.id, via("SecurityGroupIds", "SecurityGroupId"));
|
|
58
|
-
const templates = out(inst.id, via("LaunchTemplate", "LaunchTemplateId"));
|
|
59
|
-
const viaTemplate = templates
|
|
60
|
-
.flatMap((lt) => out(lt.id, via("LaunchTemplateData", "SecurityGroupIds", "SecurityGroupId")))
|
|
61
|
-
.filter((n) => isKind(n, "SecurityGroup"));
|
|
62
|
-
const all = [...direct.filter((n) => isKind(n, "SecurityGroup")), ...viaTemplate];
|
|
63
|
-
return [...new Map(all.map((s) => [s.id, s])).values()];
|
|
64
|
-
};
|
|
65
|
-
/** The IGW an instance's subnet routes to (evidence), or undefined. */
|
|
66
|
-
const internetFacingVia = (inst) => {
|
|
67
|
-
for (const subnet of out(inst.id, via("SubnetId")).filter((n) => isKind(n, "Subnet"))) {
|
|
68
|
-
const assocs = incoming(subnet.id, via("SubnetId")).filter((a) => isKind(a, "SubnetRouteTableAssociation"));
|
|
69
|
-
const routeTables = assocs.flatMap((a) => out(a.id, via("RouteTableId")).filter((n) => isKind(n, "RouteTable")));
|
|
70
|
-
for (const rt of routeTables) {
|
|
71
|
-
const routes = incoming(rt.id, via("RouteTableId")).filter((n) => isKind(n, "Route"));
|
|
72
|
-
for (const route of routes) {
|
|
73
|
-
const dest = route.attrs?.["DestinationCidrBlock"];
|
|
74
|
-
const igw = out(route.id, via("GatewayId")).find((g) => isKind(g, "InternetGateway"));
|
|
75
|
-
if (igw && (dest == null || dest === "0.0.0.0/0")) {
|
|
76
|
-
const id = igw.id.includes("::") ? igw.id.slice(igw.id.lastIndexOf("::") + 2) : igw.id;
|
|
77
|
-
return `${rt.id.includes("::") ? rt.id.slice(rt.id.lastIndexOf("::") + 2) : rt.id} → ${id}`;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
return undefined;
|
|
83
|
-
};
|
|
32
|
+
export function enrichEffectiveTopology(ir, packs = []) {
|
|
33
|
+
const view = buildView(ir, resolvePacks(packs));
|
|
34
|
+
const engine = new CapabilityEngine(view, shippedRules().rules);
|
|
35
|
+
const facing = engine.set("internet-facing");
|
|
36
|
+
const groups = engine.relation("in-sg").out;
|
|
84
37
|
const nodes = ir.nodes.map((n) => {
|
|
85
|
-
|
|
38
|
+
const tf = terraformResourceType(n) === "aws_instance";
|
|
39
|
+
if (!tf && !isKind(n, "Instance"))
|
|
86
40
|
return n;
|
|
87
|
-
const
|
|
41
|
+
const attrs = (n.attrs ?? {});
|
|
42
|
+
const reached = [...(groups.get(n.id) ?? new Map())];
|
|
43
|
+
const ingress = reached.flatMap(([sg]) => ingressStrings(view, sg));
|
|
44
|
+
const effectiveIngress = tf ? [...new Set(ingress)] : ingress;
|
|
88
45
|
// A live enrichment may already have set internetFacing (+ its evidence) for
|
|
89
46
|
// a subnet chant doesn't model declaratively (e.g. the account's default
|
|
90
47
|
// VPC). Keep that truth; otherwise derive it from the declared route topology.
|
|
91
|
-
const attrs = (n.attrs ?? {});
|
|
92
48
|
const liveFacing = attrs["internetFacing"] === true;
|
|
93
|
-
const
|
|
49
|
+
const evidence = facing.get(n.id);
|
|
50
|
+
const declaredVia = evidence && evidence.hops.length > 0 ? facingVia(view, evidence, tf) : undefined;
|
|
94
51
|
const via = attrs["internetFacingVia"] ?? declaredVia;
|
|
52
|
+
const ingressVia = tf ? reached.map(([sg, ev]) => groupPath(view, ev, sg)).join(", ") : "";
|
|
95
53
|
return {
|
|
96
54
|
...n,
|
|
97
|
-
attrs: {
|
|
55
|
+
attrs: {
|
|
56
|
+
...attrs,
|
|
57
|
+
effectiveIngress,
|
|
58
|
+
internetFacing: liveFacing || !!declaredVia,
|
|
59
|
+
...(via ? { internetFacingVia: via } : {}),
|
|
60
|
+
...(ingressVia ? { effectiveIngressVia: `security groups ${ingressVia}` } : {}),
|
|
61
|
+
},
|
|
98
62
|
};
|
|
99
63
|
});
|
|
100
64
|
// Record what this pass computed, so a caller can report the graph's derived surface
|
|
101
65
|
// without hardcoding attribute names. Only kinds actually enriched are listed.
|
|
102
66
|
const enriched = nodes.some((n) => isKind(n, "Instance"));
|
|
103
|
-
const
|
|
104
|
-
|
|
67
|
+
const enrichedTf = nodes.some((n) => terraformResourceType(n) === "aws_instance");
|
|
68
|
+
const derivedAttrs = enriched || enrichedTf
|
|
69
|
+
? {
|
|
70
|
+
...(ir.derivedAttrs ?? {}),
|
|
71
|
+
...(enriched ? { Instance: ["internetFacing", "effectiveIngress"] } : {}),
|
|
72
|
+
...(enrichedTf ? { aws_instance: ["internetFacing", "effectiveIngress"] } : {}),
|
|
73
|
+
}
|
|
105
74
|
: ir.derivedAttrs;
|
|
106
75
|
return { ...ir, nodes, ...(derivedAttrs ? { derivedAttrs } : {}) };
|
|
107
76
|
}
|
|
77
|
+
function isKind(n, suffix) {
|
|
78
|
+
const kind = n?.kind ?? "";
|
|
79
|
+
return !!n && (kind === suffix || kind.endsWith("::" + suffix));
|
|
80
|
+
}
|
|
81
|
+
function bare(id) {
|
|
82
|
+
return id.includes("::") ? id.slice(id.lastIndexOf("::") + 2) : id;
|
|
83
|
+
}
|
|
84
|
+
/** A node's name in a fold's evidence: a terraform address, or a bare logical id. */
|
|
85
|
+
function display(view, id) {
|
|
86
|
+
const v = view.nodes.get(id);
|
|
87
|
+
if (v && v.lexicon === "terraform")
|
|
88
|
+
return id.slice(id.lastIndexOf("/") + 1);
|
|
89
|
+
return bare(id);
|
|
90
|
+
}
|
|
91
|
+
/** The ids an evidence path visits, in walk order. */
|
|
92
|
+
function visited(ev, start) {
|
|
93
|
+
const out = start ? [start] : [];
|
|
94
|
+
let at = start;
|
|
95
|
+
for (const h of ev.hops) {
|
|
96
|
+
const next = at === undefined ? h.to : h.from === at ? h.to : h.from;
|
|
97
|
+
if (at === undefined)
|
|
98
|
+
out.push(h.from === next ? h.to : h.from);
|
|
99
|
+
out.push(next);
|
|
100
|
+
at = next;
|
|
101
|
+
}
|
|
102
|
+
return out;
|
|
103
|
+
}
|
|
104
|
+
/** `internetFacingVia`, as each fold always spelled it. */
|
|
105
|
+
function facingVia(view, ev, tf) {
|
|
106
|
+
const ids = visited(ev);
|
|
107
|
+
const of = (label) => ids.find((id) => view.nodes.get(id)?.label === label);
|
|
108
|
+
const rt = of("RouteTable");
|
|
109
|
+
const igw = of("InternetGateway");
|
|
110
|
+
if (!rt || !igw)
|
|
111
|
+
return undefined;
|
|
112
|
+
if (!tf)
|
|
113
|
+
return `${bare(rt)} → ${bare(igw)}`;
|
|
114
|
+
const subnet = of("Subnet");
|
|
115
|
+
const route = of("Route");
|
|
116
|
+
const how = route && view.nodes.get(route)?.attrs.block ? "inline route" : route ? display(view, route) : "route";
|
|
117
|
+
return `subnet route ${subnet ? display(view, subnet) : "?"} -> ${display(view, rt)} -> ${display(view, igw)} (${how})`;
|
|
118
|
+
}
|
|
119
|
+
/** One reached group, as `effectiveIngressVia` names it: the group, or the template it came through. */
|
|
120
|
+
function groupPath(view, ev, sg) {
|
|
121
|
+
const lt = visited(ev).find((id) => view.nodes.get(id)?.label === "LaunchTemplate");
|
|
122
|
+
return lt ? `${display(view, lt)} -> ${display(view, sg)}` : display(view, sg);
|
|
123
|
+
}
|
|
124
|
+
const STYLE_ORDER = ["cfn", "tf-inline", "tf-sg-rule", "tf-vpc-rule"];
|
|
125
|
+
/** A group's ingress rules as `proto:port:source` strings, inline rules first. */
|
|
126
|
+
function ingressStrings(view, sg) {
|
|
127
|
+
const rules = view.edges
|
|
128
|
+
.filter((e) => e.from === sg && e.name === "ingress")
|
|
129
|
+
.map((e) => view.nodes.get(e.to))
|
|
130
|
+
.filter((r) => r && r.label === "IngressRule");
|
|
131
|
+
const order = (r) => (r.attrs.block ? -1 : STYLE_ORDER.indexOf(String(r.attrs.style)));
|
|
132
|
+
return [...rules]
|
|
133
|
+
.sort((a, b) => order(a) - order(b))
|
|
134
|
+
.flatMap((r) => {
|
|
135
|
+
const raw = (r.body ?? {});
|
|
136
|
+
switch (r.attrs.style) {
|
|
137
|
+
case "tf-inline":
|
|
138
|
+
return terraformIngress(raw, { proto: "protocol", cidrs: ["cidr_blocks", "ipv6_cidr_blocks", "prefix_list_ids"], groups: ["security_groups"] });
|
|
139
|
+
case "tf-sg-rule":
|
|
140
|
+
return terraformIngress(raw, { proto: "protocol", cidrs: ["cidr_blocks", "ipv6_cidr_blocks", "prefix_list_ids"], groups: ["source_security_group_id"] });
|
|
141
|
+
case "tf-vpc-rule":
|
|
142
|
+
return terraformIngress(raw, { proto: "ip_protocol", cidrs: ["cidr_ipv4", "cidr_ipv6", "prefix_list_id"], groups: ["referenced_security_group_id"] });
|
|
143
|
+
default:
|
|
144
|
+
return [cloudFormationIngress(raw)];
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
/** One CloudFormation ingress rule as `proto:port:source`. */
|
|
149
|
+
function cloudFormationIngress(rule) {
|
|
150
|
+
const proto = String(rule.IpProtocol ?? "-1");
|
|
151
|
+
const from = rule.FromPort;
|
|
152
|
+
const to = rule.ToPort;
|
|
153
|
+
const port = from == null ? "all" : from === to ? `${from}` : `${from}-${to}`;
|
|
154
|
+
const source = rule.SourceSecurityGroupId;
|
|
155
|
+
const group = source && typeof source === "object" && typeof source.$ref === "string"
|
|
156
|
+
? String(source.$ref).replace(/\.[A-Za-z]+$/, "")
|
|
157
|
+
: source;
|
|
158
|
+
const cidr = rule.CidrIp ??
|
|
159
|
+
rule.CidrIpv6 ??
|
|
160
|
+
(group ? `sg:${String(group)}` : "?");
|
|
161
|
+
return `${proto}:${port}:${cidr}`;
|
|
162
|
+
}
|
|
163
|
+
/** The chant entity types every terraform `resource` and `data` block carries. */
|
|
164
|
+
const TERRAFORM_RESOURCE = "Terraform::Resource";
|
|
165
|
+
const TERRAFORM_DATA = "Terraform::Data";
|
|
166
|
+
/**
|
|
167
|
+
* The Terraform type of a `resource` or `data` node: `aws_instance` for
|
|
168
|
+
* `aws_instance.web`, `data.aws_ami` for `data.aws_ami.ubuntu`. Undefined for
|
|
169
|
+
* any other node.
|
|
170
|
+
*
|
|
171
|
+
* This is the one reading of a terraform node's type. `chant search`'s `kind:`
|
|
172
|
+
* (#4366), its rows and `--explain` count, `--count-by kind` (#4360) and the
|
|
173
|
+
* effective-topology folds (#4362) all call it, so they cannot disagree.
|
|
174
|
+
*
|
|
175
|
+
* The terraform lexicon puts every resource on the IR as `Terraform::Resource`
|
|
176
|
+
* (and every data source as `Terraform::Data`) and carries the block's type
|
|
177
|
+
* label as `attrs.type` (#4366), which is read first. A node without one (an
|
|
178
|
+
* older producer, or a `chant graph --live` node built from state) falls back
|
|
179
|
+
* to the block's address (`aws_instance.web`, or `module.app.aws_instance.web`)
|
|
180
|
+
* in `attrs.address`, whose second-to-last segment is the type, and failing
|
|
181
|
+
* that to its id, whose last path segment is the address too. A data source
|
|
182
|
+
* keeps its `data.` prefix: `data.aws_ami` reads an AMI, it does not manage one.
|
|
183
|
+
*/
|
|
184
|
+
export function terraformType(n) {
|
|
185
|
+
if (!n || (n.kind !== TERRAFORM_RESOURCE && n.kind !== TERRAFORM_DATA))
|
|
186
|
+
return undefined;
|
|
187
|
+
const label = n.attrs?.["type"];
|
|
188
|
+
let type = typeof label === "string" && label.length > 0 ? label : undefined;
|
|
189
|
+
if (type === undefined) {
|
|
190
|
+
const parts = terraformAddress(n).split(".");
|
|
191
|
+
type = parts.length >= 2 ? parts[parts.length - 2] : undefined;
|
|
192
|
+
}
|
|
193
|
+
if (type === undefined)
|
|
194
|
+
return undefined;
|
|
195
|
+
return n.kind === TERRAFORM_DATA ? `data.${type}` : type;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* The provider resource type of a terraform `resource` node (`aws_instance`),
|
|
199
|
+
* or undefined for any other node, data sources included. See {@link terraformType}.
|
|
200
|
+
*/
|
|
201
|
+
export function terraformResourceType(n) {
|
|
202
|
+
return n?.kind === TERRAFORM_RESOURCE ? terraformType(n) : undefined;
|
|
203
|
+
}
|
|
204
|
+
function terraformAddress(n) {
|
|
205
|
+
const address = n.attrs?.["address"];
|
|
206
|
+
if (typeof address === "string" && address.length > 0)
|
|
207
|
+
return address;
|
|
208
|
+
return n.id.slice(n.id.lastIndexOf("/") + 1).replace(/~\d+$/, "");
|
|
209
|
+
}
|
|
210
|
+
function bodyOf(n) {
|
|
211
|
+
const body = n.attrs?.["body"];
|
|
212
|
+
return body && typeof body === "object" && !Array.isArray(body) ? body : {};
|
|
213
|
+
}
|
|
214
|
+
/** A block-or-list attribute as a list: hcl2json renders nested blocks as arrays. */
|
|
215
|
+
function list(value) {
|
|
216
|
+
if (value == null)
|
|
217
|
+
return [];
|
|
218
|
+
return Array.isArray(value) ? value : [value];
|
|
219
|
+
}
|
|
220
|
+
/** `${aws_security_group.x.id}` -> `aws_security_group.x`; anything else unchanged. */
|
|
221
|
+
function sourceRef(value) {
|
|
222
|
+
const s = String(value);
|
|
223
|
+
const m = /^\$\{([A-Za-z0-9_.-]+?)(?:\.(?:id|arn|name))?\}$/.exec(s);
|
|
224
|
+
return m ? m[1] : s;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* One terraform ingress rule, in any of its three spellings, normalized to the
|
|
228
|
+
* `proto:port:source` strings the CloudFormation fold produces. A rule with
|
|
229
|
+
* several CIDRs or sources yields one string per source, so each is queryable
|
|
230
|
+
* on its own.
|
|
231
|
+
*/
|
|
232
|
+
function terraformIngress(rule, fields) {
|
|
233
|
+
const rawProto = String(rule[fields.proto] ?? "-1").toLowerCase();
|
|
234
|
+
const proto = rawProto === "all" ? "-1" : rawProto;
|
|
235
|
+
const from = rule["from_port"];
|
|
236
|
+
const to = rule["to_port"];
|
|
237
|
+
const port = proto === "-1" || from == null
|
|
238
|
+
? "all"
|
|
239
|
+
: String(from) === String(to ?? from)
|
|
240
|
+
? `${from}`
|
|
241
|
+
: `${from}-${to}`;
|
|
242
|
+
const sources = [];
|
|
243
|
+
for (const f of fields.cidrs)
|
|
244
|
+
for (const c of list(rule[f]))
|
|
245
|
+
sources.push(String(c));
|
|
246
|
+
for (const f of fields.groups)
|
|
247
|
+
for (const g of list(rule[f]))
|
|
248
|
+
sources.push(`sg:${sourceRef(g)}`);
|
|
249
|
+
if (rule["self"] === true)
|
|
250
|
+
sources.push("sg:self");
|
|
251
|
+
if (sources.length === 0)
|
|
252
|
+
sources.push("?");
|
|
253
|
+
return sources.map((src) => `${proto}:${port}:${src}`);
|
|
254
|
+
}
|
package/dist/graph-ir.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { type Declarable } from "./declarable.js";
|
|
2
|
+
import { subTemplateRefs } from "./graph-sub-template.js";
|
|
2
3
|
import type { ResourceMetadata } from "./lexicon.js";
|
|
3
4
|
import type { UnobservedEntity } from "./observation.js";
|
|
5
|
+
export { subTemplateRefs };
|
|
4
6
|
/**
|
|
5
7
|
* Graph IR — the engine-neutral, lint-gated representation of a project's
|
|
6
8
|
* resolved infrastructure graph. Painters (mermaid, graphviz, custom SVG) and
|
|
@@ -25,6 +27,20 @@ export interface SourceLoc {
|
|
|
25
27
|
export interface AttrRefEnvelope {
|
|
26
28
|
$ref: string;
|
|
27
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* A CloudFormation `Fn::Sub` in an attribute projection (#4373), in place of
|
|
32
|
+
* `{ $intrinsic: true }`. `$sub` is the template exactly as it serializes, so
|
|
33
|
+
* `${assets.Arn}/*` names the producer and attribute a reader would otherwise
|
|
34
|
+
* have to guess. `$vars` is the two-argument form's variable map, each value
|
|
35
|
+
* projected like any other attr. Every `${Name}` or `${Name.Attr}` in the
|
|
36
|
+
* template that names a node, and every reference in `$vars`, is also an edge.
|
|
37
|
+
* `${!Literal}` (CloudFormation's escape), pseudo-parameters (`${AWS::Region}`)
|
|
38
|
+
* and names `$vars` binds are not.
|
|
39
|
+
*/
|
|
40
|
+
export interface SubEnvelope {
|
|
41
|
+
$sub: string;
|
|
42
|
+
$vars?: Record<string, unknown>;
|
|
43
|
+
}
|
|
28
44
|
/** One resource in the graph. */
|
|
29
45
|
export interface IRNode {
|
|
30
46
|
/** Logical name (the export name, or composite-expanded name). */
|
|
@@ -420,6 +436,13 @@ export interface GraphIR {
|
|
|
420
436
|
* the passes produced, not a list maintained by hand.
|
|
421
437
|
*/
|
|
422
438
|
derivedAttrs?: Record<string, string[]>;
|
|
439
|
+
/**
|
|
440
|
+
* With `chant graph --format ir --capability-view` (#4378): the
|
|
441
|
+
* lexicon-neutral view capability rules read, built by this chant through
|
|
442
|
+
* the project's own lexicon mappings and adapters. A `ViewDocument`
|
|
443
|
+
* (`capabilities/view.ts`). Absent unless asked for.
|
|
444
|
+
*/
|
|
445
|
+
capabilityView?: unknown;
|
|
423
446
|
}
|
|
424
447
|
/**
|
|
425
448
|
* Build the graph IR from resolved entities (the output of `discover`). Pure and
|
package/dist/graph-ir.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph-ir.d.ts","sourceRoot":"","sources":["../src/graph-ir.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"graph-ir.d.ts","sourceRoot":"","sources":["../src/graph-ir.ts"],"names":[],"mappings":"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"}
|