@vyuhlabs/dxkit 2.19.0 → 2.21.0
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/CHANGELOG.md +68 -0
- package/dist/allowlist/categories.d.ts.map +1 -1
- package/dist/allowlist/categories.js +4 -0
- package/dist/allowlist/categories.js.map +1 -1
- package/dist/allowlist/hint.d.ts.map +1 -1
- package/dist/allowlist/hint.js +6 -0
- package/dist/allowlist/hint.js.map +1 -1
- package/dist/analyzers/flow/config.d.ts +37 -0
- package/dist/analyzers/flow/config.d.ts.map +1 -0
- package/dist/analyzers/flow/config.js +84 -0
- package/dist/analyzers/flow/config.js.map +1 -0
- package/dist/analyzers/flow/contract.d.ts +93 -0
- package/dist/analyzers/flow/contract.d.ts.map +1 -0
- package/dist/analyzers/flow/contract.js +176 -0
- package/dist/analyzers/flow/contract.js.map +1 -0
- package/dist/analyzers/flow/gate.d.ts +64 -0
- package/dist/analyzers/flow/gate.d.ts.map +1 -0
- package/dist/analyzers/flow/gate.js +84 -0
- package/dist/analyzers/flow/gate.js.map +1 -0
- package/dist/analyzers/flow/gather.d.ts +11 -0
- package/dist/analyzers/flow/gather.d.ts.map +1 -1
- package/dist/analyzers/flow/gather.js +10 -9
- package/dist/analyzers/flow/gather.js.map +1 -1
- package/dist/analyzers/flow/model.d.ts +12 -0
- package/dist/analyzers/flow/model.d.ts.map +1 -1
- package/dist/analyzers/flow/model.js +25 -3
- package/dist/analyzers/flow/model.js.map +1 -1
- package/dist/analyzers/tools/fingerprint.d.ts +32 -0
- package/dist/analyzers/tools/fingerprint.d.ts.map +1 -1
- package/dist/analyzers/tools/fingerprint.js +37 -1
- package/dist/analyzers/tools/fingerprint.js.map +1 -1
- package/dist/baseline/check-renderers.d.ts +21 -0
- package/dist/baseline/check-renderers.d.ts.map +1 -1
- package/dist/baseline/check-renderers.js +93 -3
- package/dist/baseline/check-renderers.js.map +1 -1
- package/dist/baseline/check.d.ts +18 -0
- package/dist/baseline/check.d.ts.map +1 -1
- package/dist/baseline/check.js +21 -2
- package/dist/baseline/check.js.map +1 -1
- package/dist/baseline/entry-to-located.d.ts.map +1 -1
- package/dist/baseline/entry-to-located.js +7 -0
- package/dist/baseline/entry-to-located.js.map +1 -1
- package/dist/baseline/finding-identity.d.ts.map +1 -1
- package/dist/baseline/finding-identity.js +5 -0
- package/dist/baseline/finding-identity.js.map +1 -1
- package/dist/baseline/flow-gate-check.d.ts +60 -0
- package/dist/baseline/flow-gate-check.d.ts.map +1 -0
- package/dist/baseline/flow-gate-check.js +171 -0
- package/dist/baseline/flow-gate-check.js.map +1 -0
- package/dist/baseline/migrate.d.ts.map +1 -1
- package/dist/baseline/migrate.js +3 -0
- package/dist/baseline/migrate.js.map +1 -1
- package/dist/baseline/producers/index.d.ts.map +1 -1
- package/dist/baseline/producers/index.js +9 -0
- package/dist/baseline/producers/index.js.map +1 -1
- package/dist/baseline/show.js +2 -0
- package/dist/baseline/show.js.map +1 -1
- package/dist/baseline/types.d.ts +32 -2
- package/dist/baseline/types.d.ts.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +46 -13
- package/dist/cli.js.map +1 -1
- package/dist/dashboard/graph-adapter.d.ts.map +1 -1
- package/dist/dashboard/graph-adapter.js +1 -4
- package/dist/dashboard/graph-adapter.js.map +1 -1
- package/dist/explore/flow-graph.d.ts +62 -0
- package/dist/explore/flow-graph.d.ts.map +1 -0
- package/dist/explore/flow-graph.js +194 -0
- package/dist/explore/flow-graph.js.map +1 -0
- package/dist/explore/flow-view.d.ts +33 -0
- package/dist/explore/flow-view.d.ts.map +1 -0
- package/dist/explore/flow-view.js +85 -0
- package/dist/explore/flow-view.js.map +1 -0
- package/dist/explore/load.d.ts.map +1 -1
- package/dist/explore/load.js +16 -3
- package/dist/explore/load.js.map +1 -1
- package/dist/explore/queries.d.ts +92 -1
- package/dist/explore/queries.d.ts.map +1 -1
- package/dist/explore/queries.js +142 -0
- package/dist/explore/queries.js.map +1 -1
- package/dist/explore/types.d.ts +56 -3
- package/dist/explore/types.d.ts.map +1 -1
- package/dist/explore/types.js +10 -2
- package/dist/explore/types.js.map +1 -1
- package/dist/flow-cli.d.ts +32 -0
- package/dist/flow-cli.d.ts.map +1 -1
- package/dist/flow-cli.js +168 -21
- package/dist/flow-cli.js.map +1 -1
- package/dist/languages/index.d.ts +21 -0
- package/dist/languages/index.d.ts.map +1 -1
- package/dist/languages/index.js +41 -0
- package/dist/languages/index.js.map +1 -1
- package/dist/loop/policy.d.ts +4 -1
- package/dist/loop/policy.d.ts.map +1 -1
- package/dist/loop/policy.js +3 -0
- package/dist/loop/policy.js.map +1 -1
- package/dist/loop/stop-gate.d.ts.map +1 -1
- package/dist/loop/stop-gate.js +8 -2
- package/dist/loop/stop-gate.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Flow → graph composition (the writer side of the v2 overlay). Turns a
|
|
4
|
+
* `FlowModel` (the consumed/served join) into the `http-endpoint` nodes +
|
|
5
|
+
* `calls-endpoint` edges that ride on top of the structural graph, then
|
|
6
|
+
* merges them onto whatever graphify already wrote and persists the result.
|
|
7
|
+
*
|
|
8
|
+
* The two producers stay decoupled per §10 of the design: graphify owns the
|
|
9
|
+
* structural nodes/edges and writes a v1 artifact unaware of flow; this module
|
|
10
|
+
* owns the flow overlay and composes ON TOP of graphify's output without
|
|
11
|
+
* graphify importing it (or vice versa). When graphify is absent the overlay
|
|
12
|
+
* still writes — a minimal v2 skeleton whose `calls-endpoint` edges carry the
|
|
13
|
+
* consuming call site's coordinates directly (Rule: the flow layer is
|
|
14
|
+
* graphify-independent, so the map degrades to "endpoints + who calls them by
|
|
15
|
+
* file", never to nothing).
|
|
16
|
+
*
|
|
17
|
+
* Graph reads/writes stay in the explore layer (Rule 12): the base is loaded
|
|
18
|
+
* via `tryLoadGraph`, endpoint anchoring resolves through the `queries.ts`
|
|
19
|
+
* primitive `enclosingNodeIdFor`, and this module is the flow overlay's single
|
|
20
|
+
* writer — the mirror of graphify's `writeGraphArtifact`.
|
|
21
|
+
*/
|
|
22
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
23
|
+
if (k2 === undefined) k2 = k;
|
|
24
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
25
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
26
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
27
|
+
}
|
|
28
|
+
Object.defineProperty(o, k2, desc);
|
|
29
|
+
}) : (function(o, m, k, k2) {
|
|
30
|
+
if (k2 === undefined) k2 = k;
|
|
31
|
+
o[k2] = m[k];
|
|
32
|
+
}));
|
|
33
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
34
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
35
|
+
}) : function(o, v) {
|
|
36
|
+
o["default"] = v;
|
|
37
|
+
});
|
|
38
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
39
|
+
var ownKeys = function(o) {
|
|
40
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
41
|
+
var ar = [];
|
|
42
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
43
|
+
return ar;
|
|
44
|
+
};
|
|
45
|
+
return ownKeys(o);
|
|
46
|
+
};
|
|
47
|
+
return function (mod) {
|
|
48
|
+
if (mod && mod.__esModule) return mod;
|
|
49
|
+
var result = {};
|
|
50
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
51
|
+
__setModuleDefault(result, mod);
|
|
52
|
+
return result;
|
|
53
|
+
};
|
|
54
|
+
})();
|
|
55
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
56
|
+
exports.buildFlowContribution = buildFlowContribution;
|
|
57
|
+
exports.mergeFlowIntoGraph = mergeFlowIntoGraph;
|
|
58
|
+
exports.writeFlowGraph = writeFlowGraph;
|
|
59
|
+
const fs = __importStar(require("fs"));
|
|
60
|
+
const path = __importStar(require("path"));
|
|
61
|
+
const model_1 = require("../analyzers/flow/model");
|
|
62
|
+
const load_1 = require("./load");
|
|
63
|
+
const queries_1 = require("./queries");
|
|
64
|
+
const types_1 = require("./types");
|
|
65
|
+
/** The `${method} ${path}` join key an endpoint / call reduces to. */
|
|
66
|
+
function endpointKey(method, routePath) {
|
|
67
|
+
return `${method} ${routePath}`;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Build the flow overlay from a model. One `http-endpoint` node per distinct
|
|
71
|
+
* served `(method, path)` (deduped — a route surfaced by both a spec and static
|
|
72
|
+
* extraction collapses to one endpoint, spec winning as the authoritative
|
|
73
|
+
* provenance), and one `calls-endpoint` edge per RESOLVED binding (a call that
|
|
74
|
+
* matched a served route).
|
|
75
|
+
*
|
|
76
|
+
* `base` is the structural graph when available: the edge's `from` anchors onto
|
|
77
|
+
* the enclosing structural node so the UI→API edge composes with the real call
|
|
78
|
+
* graph. Without a base (or when a call sits outside any known symbol) `from` is
|
|
79
|
+
* empty and the call site lives on the edge's `fromFile` / `fromLine` — enough
|
|
80
|
+
* to answer "who calls this endpoint" by file. Pure over its inputs.
|
|
81
|
+
*/
|
|
82
|
+
function buildFlowContribution(model, base) {
|
|
83
|
+
// Dedup routes → endpoint nodes, one per normalized join key (spec wins).
|
|
84
|
+
const endpoints = [];
|
|
85
|
+
const endpointIdByKey = new Map();
|
|
86
|
+
let idx = 0;
|
|
87
|
+
for (const route of (0, model_1.dedupeServedRoutes)(model.routes)) {
|
|
88
|
+
const id = `ep${idx++}`;
|
|
89
|
+
endpointIdByKey.set(endpointKey(route.method, route.path), id);
|
|
90
|
+
endpoints.push({
|
|
91
|
+
id,
|
|
92
|
+
kind: 'http-endpoint',
|
|
93
|
+
label: `${route.method} ${route.path}`,
|
|
94
|
+
method: route.method,
|
|
95
|
+
path: route.path,
|
|
96
|
+
via: route.via,
|
|
97
|
+
handler: route.handler,
|
|
98
|
+
sourceFile: route.file,
|
|
99
|
+
line: route.line,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
// One calls-endpoint edge per resolved binding. Unresolved bindings
|
|
103
|
+
// (external / no-route) have no endpoint to point at — they are the map's
|
|
104
|
+
// "dangling call" set, surfaced by queries, not as edges.
|
|
105
|
+
const edges = [];
|
|
106
|
+
for (const binding of model.bindings) {
|
|
107
|
+
if (!binding.route)
|
|
108
|
+
continue;
|
|
109
|
+
const key = endpointKey(binding.route.method, binding.route.path);
|
|
110
|
+
const endpointId = endpointIdByKey.get(key);
|
|
111
|
+
if (!endpointId)
|
|
112
|
+
continue;
|
|
113
|
+
const from = base ? ((0, queries_1.enclosingNodeIdFor)(base, binding.call.file, binding.call.line) ?? '') : '';
|
|
114
|
+
edges.push({
|
|
115
|
+
from,
|
|
116
|
+
to: endpointId,
|
|
117
|
+
relation: 'calls-endpoint',
|
|
118
|
+
fromFile: binding.call.file,
|
|
119
|
+
fromLine: binding.call.line,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
return { endpoints, edges };
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Compose a full v2 `GraphJson` from a (possibly absent) structural base and a
|
|
126
|
+
* flow model. With a base, the structural nodes/edges/communities/symbolIndex
|
|
127
|
+
* are preserved verbatim and the flow overlay is appended (edges into the
|
|
128
|
+
* shared `edges` array, endpoints into the new `endpoints` array); the schema
|
|
129
|
+
* version is stamped to v2. Without a base, a minimal skeleton carries the
|
|
130
|
+
* overlay alone, so `vyuh-dxkit flow` produces a map even where graphify never
|
|
131
|
+
* ran (a pure-frontend repo, a CI job without Python).
|
|
132
|
+
*/
|
|
133
|
+
function mergeFlowIntoGraph(base, model) {
|
|
134
|
+
const contribution = buildFlowContribution(model, base);
|
|
135
|
+
if (base) {
|
|
136
|
+
// The overlay is REGENERATED each run, never accumulated: strip any
|
|
137
|
+
// calls-endpoint edges a previous flow run left on the base (endpoints are
|
|
138
|
+
// already replaced wholesale below), then append this run's fresh edges.
|
|
139
|
+
// Without this, re-running `flow` stacks duplicate bindings.
|
|
140
|
+
const structuralEdges = base.edges.filter((e) => e.relation !== 'calls-endpoint');
|
|
141
|
+
return {
|
|
142
|
+
schemaVersion: types_1.GRAPH_SCHEMA_VERSION,
|
|
143
|
+
meta: base.meta,
|
|
144
|
+
nodes: base.nodes,
|
|
145
|
+
edges: [...structuralEdges, ...contribution.edges],
|
|
146
|
+
communities: base.communities,
|
|
147
|
+
symbolIndex: base.symbolIndex,
|
|
148
|
+
endpoints: contribution.endpoints,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
schemaVersion: types_1.GRAPH_SCHEMA_VERSION,
|
|
153
|
+
meta: {
|
|
154
|
+
tool: 'graphify',
|
|
155
|
+
graphifyVersion: '',
|
|
156
|
+
dxkitVersion: '',
|
|
157
|
+
generatedAt: '',
|
|
158
|
+
sourceFilesInGraph: 0,
|
|
159
|
+
excludedFileCount: 0,
|
|
160
|
+
packs: [],
|
|
161
|
+
truncated: false,
|
|
162
|
+
truncatedReason: '',
|
|
163
|
+
},
|
|
164
|
+
nodes: [],
|
|
165
|
+
edges: contribution.edges,
|
|
166
|
+
communities: [],
|
|
167
|
+
symbolIndex: {},
|
|
168
|
+
endpoints: contribution.endpoints,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Persist the flow-augmented graph to its canonical disk location, composing
|
|
173
|
+
* onto graphify's base when one exists. Returns the merged graph so an
|
|
174
|
+
* in-memory caller (the `flow` CLI) can render without a disk round-trip.
|
|
175
|
+
*
|
|
176
|
+
* Mirror of graphify's `writeGraphArtifact`: a failed write is a warning, not a
|
|
177
|
+
* throw — the graph is a convenience artifact, and the CLI already has the
|
|
178
|
+
* model in hand for its terminal output.
|
|
179
|
+
*/
|
|
180
|
+
function writeFlowGraph(cwd, model) {
|
|
181
|
+
const base = (0, load_1.tryLoadGraph)(cwd);
|
|
182
|
+
const merged = mergeFlowIntoGraph(base, model);
|
|
183
|
+
const absPath = path.join(cwd, types_1.GRAPH_REPORT_PATH);
|
|
184
|
+
try {
|
|
185
|
+
fs.mkdirSync(path.dirname(absPath), { recursive: true });
|
|
186
|
+
fs.writeFileSync(absPath, JSON.stringify(merged));
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
190
|
+
process.stderr.write(`dxkit: failed to write ${types_1.GRAPH_REPORT_PATH}: ${msg}\n`);
|
|
191
|
+
}
|
|
192
|
+
return merged;
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=flow-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow-graph.js","sourceRoot":"","sources":["../../src/explore/flow-graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flow read-side orchestration for the `vyuh-dxkit flow` CLI. Composes the
|
|
3
|
+
* three explore primitives the CLI is not allowed to touch directly (Rule 12
|
|
4
|
+
* confines graph load + query to the explore layer): write the overlay
|
|
5
|
+
* (`flow-graph.ts`), reload the indexed graph (`load.ts`), run the pure query
|
|
6
|
+
* (`queries.ts`). The CLI consumes the returned view and renders — it never
|
|
7
|
+
* loads or traverses the graph itself.
|
|
8
|
+
*/
|
|
9
|
+
import { type FlowMap, type FlowTrace } from './queries';
|
|
10
|
+
import type { FlowModel } from '../analyzers/flow/model';
|
|
11
|
+
/**
|
|
12
|
+
* Build the flow map: persist the overlay onto graph.json, then read it back
|
|
13
|
+
* and run `flowMapQuery`. Reloading (rather than indexing the merged json
|
|
14
|
+
* in-memory) keeps the on-disk artifact and the rendered view guaranteed
|
|
15
|
+
* consistent, and the graph.json is a small file. Degrades to an empty map if
|
|
16
|
+
* the write+reload fails (never throws for the CLI).
|
|
17
|
+
*/
|
|
18
|
+
export declare function buildFlowMap(cwd: string, model: FlowModel): FlowMap;
|
|
19
|
+
/** Not-found trace carries the candidate endpoint labels so the CLI can print a
|
|
20
|
+
* "did you mean" list keyed off the same graph. */
|
|
21
|
+
export interface FlowTraceView {
|
|
22
|
+
trace: FlowTrace;
|
|
23
|
+
candidates: string[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Build the trace for one endpoint. `target` resolves against the freshly
|
|
27
|
+
* written graph by, in order: exact endpoint id (`ep3`), exact join key
|
|
28
|
+
* (`GET /articles/{var}`), then the method-uppercased key — so a user can paste
|
|
29
|
+
* the label shown by `flow map` verbatim. On no match, `trace.found` is false
|
|
30
|
+
* and `candidates` lists every endpoint label for a "did you mean" hint.
|
|
31
|
+
*/
|
|
32
|
+
export declare function buildFlowTrace(cwd: string, model: FlowModel, target: string): FlowTraceView;
|
|
33
|
+
//# sourceMappingURL=flow-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow-view.d.ts","sourceRoot":"","sources":["../../src/explore/flow-view.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAA2B,KAAK,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAClF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAUzD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAInE;AAED;oDACoD;AACpD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,SAAS,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CAc3F"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Flow read-side orchestration for the `vyuh-dxkit flow` CLI. Composes the
|
|
4
|
+
* three explore primitives the CLI is not allowed to touch directly (Rule 12
|
|
5
|
+
* confines graph load + query to the explore layer): write the overlay
|
|
6
|
+
* (`flow-graph.ts`), reload the indexed graph (`load.ts`), run the pure query
|
|
7
|
+
* (`queries.ts`). The CLI consumes the returned view and renders — it never
|
|
8
|
+
* loads or traverses the graph itself.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.buildFlowMap = buildFlowMap;
|
|
12
|
+
exports.buildFlowTrace = buildFlowTrace;
|
|
13
|
+
const flow_graph_1 = require("./flow-graph");
|
|
14
|
+
const load_1 = require("./load");
|
|
15
|
+
const queries_1 = require("./queries");
|
|
16
|
+
const EMPTY_MAP = {
|
|
17
|
+
endpoints: [],
|
|
18
|
+
unconsumedEndpoints: [],
|
|
19
|
+
totalEndpoints: 0,
|
|
20
|
+
totalBindings: 0,
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Build the flow map: persist the overlay onto graph.json, then read it back
|
|
24
|
+
* and run `flowMapQuery`. Reloading (rather than indexing the merged json
|
|
25
|
+
* in-memory) keeps the on-disk artifact and the rendered view guaranteed
|
|
26
|
+
* consistent, and the graph.json is a small file. Degrades to an empty map if
|
|
27
|
+
* the write+reload fails (never throws for the CLI).
|
|
28
|
+
*/
|
|
29
|
+
function buildFlowMap(cwd, model) {
|
|
30
|
+
(0, flow_graph_1.writeFlowGraph)(cwd, model);
|
|
31
|
+
const graph = (0, load_1.tryLoadGraph)(cwd);
|
|
32
|
+
return graph ? (0, queries_1.flowMapQuery)(graph) : EMPTY_MAP;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Build the trace for one endpoint. `target` resolves against the freshly
|
|
36
|
+
* written graph by, in order: exact endpoint id (`ep3`), exact join key
|
|
37
|
+
* (`GET /articles/{var}`), then the method-uppercased key — so a user can paste
|
|
38
|
+
* the label shown by `flow map` verbatim. On no match, `trace.found` is false
|
|
39
|
+
* and `candidates` lists every endpoint label for a "did you mean" hint.
|
|
40
|
+
*/
|
|
41
|
+
function buildFlowTrace(cwd, model, target) {
|
|
42
|
+
(0, flow_graph_1.writeFlowGraph)(cwd, model);
|
|
43
|
+
const graph = (0, load_1.tryLoadGraph)(cwd);
|
|
44
|
+
if (!graph) {
|
|
45
|
+
return { trace: notFoundTrace(target), candidates: [] };
|
|
46
|
+
}
|
|
47
|
+
const endpoint = resolveEndpoint(graph, target);
|
|
48
|
+
if (!endpoint) {
|
|
49
|
+
return {
|
|
50
|
+
trace: notFoundTrace(target),
|
|
51
|
+
candidates: graph.endpoints.map((e) => e.label).sort(),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
return { trace: (0, queries_1.flowTrace)(graph, endpoint.id), candidates: [] };
|
|
55
|
+
}
|
|
56
|
+
function resolveEndpoint(graph, target) {
|
|
57
|
+
const t = target.trim();
|
|
58
|
+
const byId = graph.endpointById.get(t);
|
|
59
|
+
if (byId)
|
|
60
|
+
return byId;
|
|
61
|
+
const byKey = graph.endpointByKey.get(t);
|
|
62
|
+
if (byKey)
|
|
63
|
+
return byKey;
|
|
64
|
+
const space = t.indexOf(' ');
|
|
65
|
+
if (space > 0) {
|
|
66
|
+
const upper = `${t.slice(0, space).toUpperCase()} ${t.slice(space + 1)}`;
|
|
67
|
+
return graph.endpointByKey.get(upper);
|
|
68
|
+
}
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
function notFoundTrace(_target) {
|
|
72
|
+
return {
|
|
73
|
+
found: false,
|
|
74
|
+
handler: null,
|
|
75
|
+
consumers: [],
|
|
76
|
+
blastRadius: {
|
|
77
|
+
endpointId: '',
|
|
78
|
+
directConsumers: 0,
|
|
79
|
+
consumerFiles: 0,
|
|
80
|
+
upstreamCallers: 0,
|
|
81
|
+
upstreamFiles: 0,
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=flow-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow-view.js","sourceRoot":"","sources":["../../src/explore/flow-view.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAsBH,oCAIC;AAgBD,wCAcC;AAtDD,6CAA8C;AAC9C,iCAAsC;AACtC,uCAAkF;AAIlF,MAAM,SAAS,GAAY;IACzB,SAAS,EAAE,EAAE;IACb,mBAAmB,EAAE,EAAE;IACvB,cAAc,EAAE,CAAC;IACjB,aAAa,EAAE,CAAC;CACjB,CAAC;AAEF;;;;;;GAMG;AACH,SAAgB,YAAY,CAAC,GAAW,EAAE,KAAgB;IACxD,IAAA,2BAAc,EAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC3B,MAAM,KAAK,GAAG,IAAA,mBAAY,EAAC,GAAG,CAAC,CAAC;IAChC,OAAO,KAAK,CAAC,CAAC,CAAC,IAAA,sBAAY,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACjD,CAAC;AASD;;;;;;GAMG;AACH,SAAgB,cAAc,CAAC,GAAW,EAAE,KAAgB,EAAE,MAAc;IAC1E,IAAA,2BAAc,EAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC3B,MAAM,KAAK,GAAG,IAAA,mBAAY,EAAC,GAAG,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAC1D,CAAC;IACD,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC;YAC5B,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE;SACvD,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAA,mBAAS,EAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;AAClE,CAAC;AAED,SAAS,eAAe,CAAC,KAAY,EAAE,MAAc;IACnD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IACxB,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACvC,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACzC,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;QACzE,OAAO,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,aAAa,CAAC,OAAe;IACpC,OAAO;QACL,KAAK,EAAE,KAAK;QACZ,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,EAAE;QACb,WAAW,EAAE;YACX,UAAU,EAAE,EAAE;YACd,eAAe,EAAE,CAAC;YAClB,aAAa,EAAE,CAAC;YAChB,eAAe,EAAE,CAAC;YAClB,aAAa,EAAE,CAAC;SACjB;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/explore/load.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EACL,iBAAiB,EAGjB,KAAK,KAAK,
|
|
1
|
+
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/explore/load.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EACL,iBAAiB,EAGjB,KAAK,KAAK,EAKX,MAAM,SAAS,CAAC;AAIjB,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAE7B,qBAAa,kBAAmB,SAAQ,KAAK;aACf,OAAO,EAAE,MAAM;gBAAf,OAAO,EAAE,MAAM;CAM5C;AAED,qBAAa,uBAAwB,SAAQ,KAAK;aAE9B,OAAO,EAAE,MAAM;aACf,KAAK,EAAE,OAAO;aACd,QAAQ,EAAE,MAAM;gBAFhB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,MAAM;CAOnC;AAED,qBAAa,iBAAkB,SAAQ,KAAK;aAExB,OAAO,EAAE,MAAM;aACf,MAAM,EAAE,MAAM;gBADd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM;CAKjC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAa5C;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAM3D"}
|
package/dist/explore/load.js
CHANGED
|
@@ -138,8 +138,6 @@ function validateAndUpgrade(absPath, raw) {
|
|
|
138
138
|
if (v > types_1.GRAPH_SCHEMA_VERSION) {
|
|
139
139
|
throw new GraphSchemaVersionError(absPath, v, types_1.GRAPH_SCHEMA_VERSION);
|
|
140
140
|
}
|
|
141
|
-
// Future migrations: switch on v here when v2+ lands. Today v === 1
|
|
142
|
-
// is the only supported version; no migration needed.
|
|
143
141
|
for (const key of ['meta', 'nodes', 'edges', 'communities', 'symbolIndex']) {
|
|
144
142
|
if (!(key in obj)) {
|
|
145
143
|
throw new GraphCorruptError(absPath, `missing required top-level field "${key}"`);
|
|
@@ -154,8 +152,15 @@ function validateAndUpgrade(absPath, raw) {
|
|
|
154
152
|
if (!Array.isArray(obj.communities)) {
|
|
155
153
|
throw new GraphCorruptError(absPath, '"communities" is not an array');
|
|
156
154
|
}
|
|
155
|
+
// v1 → v2 migration: the flow overlay is purely additive, so a v1
|
|
156
|
+
// artifact (no `endpoints` field) migrates forward to an empty
|
|
157
|
+
// endpoint set. A v2 artifact must carry an array when present.
|
|
158
|
+
if ('endpoints' in obj && !Array.isArray(obj.endpoints)) {
|
|
159
|
+
throw new GraphCorruptError(absPath, '"endpoints" is not an array');
|
|
160
|
+
}
|
|
161
|
+
const endpoints = Array.isArray(obj.endpoints) ? obj.endpoints : [];
|
|
157
162
|
// Trust the rest; runtime errors in queries surface deeper issues.
|
|
158
|
-
return raw;
|
|
163
|
+
return { ...raw, endpoints: endpoints };
|
|
159
164
|
}
|
|
160
165
|
function indexGraph(json) {
|
|
161
166
|
const nodeById = new Map();
|
|
@@ -184,6 +189,12 @@ function indexGraph(json) {
|
|
|
184
189
|
for (const nid of c.nodeIds)
|
|
185
190
|
communityByNode.set(nid, c);
|
|
186
191
|
}
|
|
192
|
+
const endpointById = new Map();
|
|
193
|
+
const endpointByKey = new Map();
|
|
194
|
+
for (const ep of json.endpoints) {
|
|
195
|
+
endpointById.set(ep.id, ep);
|
|
196
|
+
endpointByKey.set(`${ep.method} ${ep.path}`, ep);
|
|
197
|
+
}
|
|
187
198
|
return {
|
|
188
199
|
...json,
|
|
189
200
|
nodeById,
|
|
@@ -192,6 +203,8 @@ function indexGraph(json) {
|
|
|
192
203
|
nodesByFile,
|
|
193
204
|
communityById,
|
|
194
205
|
communityByNode,
|
|
206
|
+
endpointById,
|
|
207
|
+
endpointByKey,
|
|
195
208
|
};
|
|
196
209
|
}
|
|
197
210
|
//# sourceMappingURL=load.js.map
|
package/dist/explore/load.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/explore/load.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/explore/load.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* level.
|
|
15
15
|
*/
|
|
16
16
|
import type { DetectedStack } from '../types';
|
|
17
|
-
import type { Graph, GraphNode } from './types';
|
|
17
|
+
import type { Graph, GraphNode, HttpEndpointNode } from './types';
|
|
18
18
|
/** Nodes that call into the given nodeId (predecessors via `calls` edges). */
|
|
19
19
|
export declare function callersOf(graph: Graph, nodeId: string): GraphNode[];
|
|
20
20
|
/** Nodes that the given nodeId calls into (successors via `calls` edges). */
|
|
@@ -427,6 +427,23 @@ export declare function findingContextQuery(graph: Graph, sourceFile: string, li
|
|
|
427
427
|
* line number, and `undefined` cleanly degrades to the file-level anchor.
|
|
428
428
|
*/
|
|
429
429
|
export declare function enclosingSymbolFor(graph: Graph, sourceFile: string, line: number): string | undefined;
|
|
430
|
+
/**
|
|
431
|
+
* Resolve the id of the structural node enclosing a source location —
|
|
432
|
+
* the node-id sibling of {@link enclosingSymbolFor}. Used by the flow
|
|
433
|
+
* writer to anchor the `from` end of a `calls-endpoint` edge onto the
|
|
434
|
+
* real call graph when graphify is present (so a UI→API edge composes
|
|
435
|
+
* with the structural `calls` edges for multi-hop blast radius). Returns
|
|
436
|
+
* `undefined` when the file declares no symbol at-or-above `line` AND has
|
|
437
|
+
* no module node (the writer then leaves `from` empty and relies on the
|
|
438
|
+
* edge's fromFile / fromLine coordinates, keeping the map
|
|
439
|
+
* graphify-independent).
|
|
440
|
+
*
|
|
441
|
+
* Prefers the nearest non-module declaration at-or-above `line`; falls
|
|
442
|
+
* back to the file's module node (a top-level call outside any symbol
|
|
443
|
+
* still anchors to its file). Graph traversal stays in this module
|
|
444
|
+
* (Rule 12).
|
|
445
|
+
*/
|
|
446
|
+
export declare function enclosingNodeIdFor(graph: Graph, sourceFile: string, line: number): string | undefined;
|
|
430
447
|
/**
|
|
431
448
|
* Structural context for one source location, resolved by POSITION
|
|
432
449
|
* rather than by symbol name (the `context <file:line>` surface; its
|
|
@@ -498,4 +515,78 @@ export interface FileLineContext {
|
|
|
498
515
|
export declare function fileLineContextQuery(graph: Graph, sourceFile: string, line: number, opts?: {
|
|
499
516
|
maxList?: number;
|
|
500
517
|
}): FileLineContext;
|
|
518
|
+
/**
|
|
519
|
+
* One consumer of an endpoint — a client call site that binds to it. `nodeId` /
|
|
520
|
+
* `symbol` are present when the call was anchored onto a structural node (a base
|
|
521
|
+
* graph existed); otherwise only the source coordinates are known (the flow map
|
|
522
|
+
* is graphify-independent, so `file` + `line` are always populated from the
|
|
523
|
+
* `calls-endpoint` edge).
|
|
524
|
+
*/
|
|
525
|
+
export interface EndpointCaller {
|
|
526
|
+
file: string;
|
|
527
|
+
line?: number;
|
|
528
|
+
nodeId?: string;
|
|
529
|
+
symbol?: string;
|
|
530
|
+
}
|
|
531
|
+
/**
|
|
532
|
+
* Every UI surface that hits an endpoint — the `calls-endpoint` in-edges of the
|
|
533
|
+
* endpoint node, mapped to their consuming call sites. The core cross-boundary
|
|
534
|
+
* query the graph could not previously answer. Rule 12: relation-filtered edge
|
|
535
|
+
* traversal lives here, never re-walked by a consumer.
|
|
536
|
+
*/
|
|
537
|
+
export declare function endpointCallers(graph: Graph, endpointId: string): EndpointCaller[];
|
|
538
|
+
/**
|
|
539
|
+
* Blast radius of an endpoint: the surface a change to it (delete, rename,
|
|
540
|
+
* verb-change) would touch. `directConsumers` / `consumerFiles` count the
|
|
541
|
+
* immediate UI call sites; `upstreamCallers` / `upstreamFiles` extend that
|
|
542
|
+
* transitively through the structural `calls` graph (which functions call the
|
|
543
|
+
* consuming ones), bounded by a visited set. Upstream counts are only as
|
|
544
|
+
* complete as the base graph — zero when graphify never ran, so consumers label
|
|
545
|
+
* them as best-effort.
|
|
546
|
+
*/
|
|
547
|
+
export interface FlowBlastRadius {
|
|
548
|
+
endpointId: string;
|
|
549
|
+
directConsumers: number;
|
|
550
|
+
consumerFiles: number;
|
|
551
|
+
upstreamCallers: number;
|
|
552
|
+
upstreamFiles: number;
|
|
553
|
+
}
|
|
554
|
+
export declare function flowBlastRadius(graph: Graph, endpointId: string): FlowBlastRadius;
|
|
555
|
+
/**
|
|
556
|
+
* The full trace for one endpoint: its served-side identity (handler +
|
|
557
|
+
* provenance) plus the consumed side (every UI call site). The UI→API→handler
|
|
558
|
+
* path in one object; the deeper handler→model hop is left to a future pass
|
|
559
|
+
* (the graph does not yet carry data-model edges). `found: false` when no
|
|
560
|
+
* endpoint has that id.
|
|
561
|
+
*/
|
|
562
|
+
export interface FlowTrace {
|
|
563
|
+
found: boolean;
|
|
564
|
+
endpoint?: HttpEndpointNode;
|
|
565
|
+
handler: string | null;
|
|
566
|
+
consumers: EndpointCaller[];
|
|
567
|
+
blastRadius: FlowBlastRadius;
|
|
568
|
+
}
|
|
569
|
+
export declare function flowTrace(graph: Graph, endpointId: string): FlowTrace;
|
|
570
|
+
/** One endpoint row of the flow map: the served route + how many UI surfaces
|
|
571
|
+
* consume it. */
|
|
572
|
+
export interface FlowMapEndpoint {
|
|
573
|
+
endpoint: HttpEndpointNode;
|
|
574
|
+
consumerCount: number;
|
|
575
|
+
consumerFiles: string[];
|
|
576
|
+
}
|
|
577
|
+
/**
|
|
578
|
+
* The whole flow map read from the graph: every served endpoint ranked by
|
|
579
|
+
* consumer count, plus the served-but-unconsumed set (endpoints no UI in this
|
|
580
|
+
* graph calls — a candidate dead route OR a cross-repo consumer not scanned, so
|
|
581
|
+
* surfaced separately, not as a defect). `totalBindings` counts the
|
|
582
|
+
* `calls-endpoint` edges. The integration-test-gap signal (endpoints with
|
|
583
|
+
* consumers but no covering test) composes on top of this in a later phase.
|
|
584
|
+
*/
|
|
585
|
+
export interface FlowMap {
|
|
586
|
+
endpoints: FlowMapEndpoint[];
|
|
587
|
+
unconsumedEndpoints: HttpEndpointNode[];
|
|
588
|
+
totalEndpoints: number;
|
|
589
|
+
totalBindings: number;
|
|
590
|
+
}
|
|
591
|
+
export declare function flowMapQuery(graph: Graph): FlowMap;
|
|
501
592
|
//# sourceMappingURL=queries.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/explore/queries.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,KAAK,EAAa,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/explore/queries.ts"],"names":[],"mappings":"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"}
|