@grafema/types 0.1.0-alpha.5 → 0.2.0-beta
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/branded.d.ts +61 -0
- package/dist/branded.d.ts.map +1 -0
- package/dist/branded.js +34 -0
- package/dist/edges.d.ts +49 -1
- package/dist/edges.d.ts.map +1 -1
- package/dist/edges.js +24 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/nodes.d.ts +47 -2
- package/dist/nodes.d.ts.map +1 -1
- package/dist/nodes.js +8 -0
- package/dist/plugins.d.ts +117 -1
- package/dist/plugins.d.ts.map +1 -1
- package/dist/plugins.js +2 -2
- package/dist/rfdb.d.ts +12 -1
- package/dist/rfdb.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/branded.ts +74 -0
- package/src/edges.ts +64 -1
- package/src/index.ts +3 -0
- package/src/nodes.ts +68 -1
- package/src/plugins.ts +131 -3
- package/src/rfdb.ts +14 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Branded Types - Type-safe node creation enforcement
|
|
3
|
+
*
|
|
4
|
+
* Branded types ensure that nodes can only be created through NodeFactory,
|
|
5
|
+
* preventing inline object creation that bypasses validation.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* // This compiles:
|
|
9
|
+
* const node = NodeFactory.createFunction(...);
|
|
10
|
+
* graph.addNode(node); // OK - node is BrandedNode
|
|
11
|
+
*
|
|
12
|
+
* // This fails to compile:
|
|
13
|
+
* const inline = { type: 'FUNCTION', ... };
|
|
14
|
+
* graph.addNode(inline); // ERROR - not a BrandedNode
|
|
15
|
+
*/
|
|
16
|
+
import type { BaseNodeRecord, NodeRecord } from './nodes.js';
|
|
17
|
+
/**
|
|
18
|
+
* Unique symbol for branding nodes.
|
|
19
|
+
* Declared but never actually exists at runtime - purely for type checking.
|
|
20
|
+
*/
|
|
21
|
+
declare const NODE_BRAND: unique symbol;
|
|
22
|
+
/**
|
|
23
|
+
* A branded node type that can only be created through NodeFactory.
|
|
24
|
+
*
|
|
25
|
+
* The brand is a phantom type - it exists only in TypeScript's type system
|
|
26
|
+
* and has no runtime representation. This makes it impossible to create
|
|
27
|
+
* a BrandedNode without going through a function that returns one.
|
|
28
|
+
*
|
|
29
|
+
* @template T - The specific node record type (e.g., FunctionNodeRecord)
|
|
30
|
+
*/
|
|
31
|
+
export type BrandedNode<T extends BaseNodeRecord> = T & {
|
|
32
|
+
readonly [NODE_BRAND]: true;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Union type for any branded node.
|
|
36
|
+
* Use this when you need to accept any valid node type.
|
|
37
|
+
*/
|
|
38
|
+
export type AnyBrandedNode = BrandedNode<NodeRecord>;
|
|
39
|
+
/**
|
|
40
|
+
* Helper type to extract the underlying record type from a branded node.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* type FnNode = BrandedNode<FunctionNodeRecord>;
|
|
44
|
+
* type FnRecord = UnbrandedNode<FnNode>; // FunctionNodeRecord
|
|
45
|
+
*/
|
|
46
|
+
export type UnbrandedNode<T> = T extends BrandedNode<infer U> ? U : never;
|
|
47
|
+
/**
|
|
48
|
+
* Type guard to check if a value is branded.
|
|
49
|
+
* Note: This always returns true at runtime since branding is purely type-level.
|
|
50
|
+
* It's useful for type narrowing in conditional logic.
|
|
51
|
+
*/
|
|
52
|
+
export declare function isBrandedNode<T extends BaseNodeRecord>(node: T | BrandedNode<T>): node is BrandedNode<T>;
|
|
53
|
+
/**
|
|
54
|
+
* Internal helper for NodeFactory to brand a node.
|
|
55
|
+
* This should ONLY be used inside NodeFactory methods.
|
|
56
|
+
*
|
|
57
|
+
* @internal
|
|
58
|
+
*/
|
|
59
|
+
export declare function brandNode<T extends BaseNodeRecord>(node: T): BrandedNode<T>;
|
|
60
|
+
export {};
|
|
61
|
+
//# sourceMappingURL=branded.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branded.d.ts","sourceRoot":"","sources":["../src/branded.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7D;;;GAGG;AACH,OAAO,CAAC,MAAM,UAAU,EAAE,OAAO,MAAM,CAAC;AAExC;;;;;;;;GAQG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,cAAc,IAAI,CAAC,GAAG;IACtD,QAAQ,CAAC,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC;CAC7B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;AAErD;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAE1E;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,cAAc,EACpD,IAAI,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,GACvB,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,CAIxB;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,cAAc,EAAE,IAAI,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAE3E"}
|
package/dist/branded.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Branded Types - Type-safe node creation enforcement
|
|
3
|
+
*
|
|
4
|
+
* Branded types ensure that nodes can only be created through NodeFactory,
|
|
5
|
+
* preventing inline object creation that bypasses validation.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* // This compiles:
|
|
9
|
+
* const node = NodeFactory.createFunction(...);
|
|
10
|
+
* graph.addNode(node); // OK - node is BrandedNode
|
|
11
|
+
*
|
|
12
|
+
* // This fails to compile:
|
|
13
|
+
* const inline = { type: 'FUNCTION', ... };
|
|
14
|
+
* graph.addNode(inline); // ERROR - not a BrandedNode
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Type guard to check if a value is branded.
|
|
18
|
+
* Note: This always returns true at runtime since branding is purely type-level.
|
|
19
|
+
* It's useful for type narrowing in conditional logic.
|
|
20
|
+
*/
|
|
21
|
+
export function isBrandedNode(node) {
|
|
22
|
+
// At runtime, all nodes from NodeFactory are considered branded.
|
|
23
|
+
// The actual enforcement happens at compile time.
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Internal helper for NodeFactory to brand a node.
|
|
28
|
+
* This should ONLY be used inside NodeFactory methods.
|
|
29
|
+
*
|
|
30
|
+
* @internal
|
|
31
|
+
*/
|
|
32
|
+
export function brandNode(node) {
|
|
33
|
+
return node;
|
|
34
|
+
}
|
package/dist/edges.d.ts
CHANGED
|
@@ -5,6 +5,17 @@ export declare const EDGE_TYPE: {
|
|
|
5
5
|
readonly CONTAINS: "CONTAINS";
|
|
6
6
|
readonly DEPENDS_ON: "DEPENDS_ON";
|
|
7
7
|
readonly HAS_SCOPE: "HAS_SCOPE";
|
|
8
|
+
readonly HAS_CONDITION: "HAS_CONDITION";
|
|
9
|
+
readonly HAS_CASE: "HAS_CASE";
|
|
10
|
+
readonly HAS_DEFAULT: "HAS_DEFAULT";
|
|
11
|
+
readonly HAS_BODY: "HAS_BODY";
|
|
12
|
+
readonly ITERATES_OVER: "ITERATES_OVER";
|
|
13
|
+
readonly HAS_INIT: "HAS_INIT";
|
|
14
|
+
readonly HAS_UPDATE: "HAS_UPDATE";
|
|
15
|
+
readonly HAS_CONSEQUENT: "HAS_CONSEQUENT";
|
|
16
|
+
readonly HAS_ALTERNATE: "HAS_ALTERNATE";
|
|
17
|
+
readonly HAS_CATCH: "HAS_CATCH";
|
|
18
|
+
readonly HAS_FINALLY: "HAS_FINALLY";
|
|
8
19
|
readonly CALLS: "CALLS";
|
|
9
20
|
readonly HAS_CALLBACK: "HAS_CALLBACK";
|
|
10
21
|
readonly PASSES_ARGUMENT: "PASSES_ARGUMENT";
|
|
@@ -25,20 +36,27 @@ export declare const EDGE_TYPE: {
|
|
|
25
36
|
readonly ASSIGNED_FROM: "ASSIGNED_FROM";
|
|
26
37
|
readonly READS_FROM: "READS_FROM";
|
|
27
38
|
readonly WRITES_TO: "WRITES_TO";
|
|
39
|
+
readonly DERIVES_FROM: "DERIVES_FROM";
|
|
40
|
+
readonly FLOWS_INTO: "FLOWS_INTO";
|
|
41
|
+
readonly HAS_PROPERTY: "HAS_PROPERTY";
|
|
42
|
+
readonly HAS_ELEMENT: "HAS_ELEMENT";
|
|
28
43
|
readonly ROUTES_TO: "ROUTES_TO";
|
|
29
44
|
readonly HANDLED_BY: "HANDLED_BY";
|
|
30
45
|
readonly MAKES_REQUEST: "MAKES_REQUEST";
|
|
31
46
|
readonly MOUNTS: "MOUNTS";
|
|
32
47
|
readonly EXPOSES: "EXPOSES";
|
|
48
|
+
readonly RESPONDS_WITH: "RESPONDS_WITH";
|
|
33
49
|
readonly LISTENS_TO: "LISTENS_TO";
|
|
34
50
|
readonly EMITS_EVENT: "EMITS_EVENT";
|
|
35
51
|
readonly JOINS_ROOM: "JOINS_ROOM";
|
|
36
52
|
readonly CALLS_API: "CALLS_API";
|
|
37
53
|
readonly INTERACTS_WITH: "INTERACTS_WITH";
|
|
54
|
+
readonly HTTP_RECEIVES: "HTTP_RECEIVES";
|
|
38
55
|
readonly REGISTERS_VIEW: "REGISTERS_VIEW";
|
|
39
56
|
readonly THROWS: "THROWS";
|
|
40
57
|
readonly GOVERNS: "GOVERNS";
|
|
41
58
|
readonly VIOLATES: "VIOLATES";
|
|
59
|
+
readonly AFFECTS: "AFFECTS";
|
|
42
60
|
readonly UNKNOWN: "UNKNOWN";
|
|
43
61
|
};
|
|
44
62
|
export type EdgeType = typeof EDGE_TYPE[keyof typeof EDGE_TYPE] | string;
|
|
@@ -66,12 +84,42 @@ export interface ExportsEdge extends EdgeRecord {
|
|
|
66
84
|
exportedName?: string;
|
|
67
85
|
}
|
|
68
86
|
export interface DataFlowEdge extends EdgeRecord {
|
|
69
|
-
type: 'ASSIGNED_FROM' | 'READS_FROM' | 'WRITES_TO' | 'PASSES_ARGUMENT';
|
|
87
|
+
type: 'ASSIGNED_FROM' | 'READS_FROM' | 'WRITES_TO' | 'PASSES_ARGUMENT' | 'DERIVES_FROM' | 'FLOWS_INTO';
|
|
70
88
|
dataType?: string;
|
|
71
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* Edge representing data flowing INTO a container (array, collection)
|
|
92
|
+
* Source: the value being added
|
|
93
|
+
* Destination: the container receiving the value
|
|
94
|
+
*
|
|
95
|
+
* Example: arr.push(obj) creates edge obj --FLOWS_INTO--> arr
|
|
96
|
+
*/
|
|
97
|
+
export interface FlowsIntoEdge extends EdgeRecord {
|
|
98
|
+
type: 'FLOWS_INTO';
|
|
99
|
+
mutationMethod?: 'push' | 'unshift' | 'splice' | 'indexed';
|
|
100
|
+
argIndex?: number;
|
|
101
|
+
isSpread?: boolean;
|
|
102
|
+
}
|
|
103
|
+
export interface ObjectStructureEdge extends EdgeRecord {
|
|
104
|
+
type: 'HAS_PROPERTY' | 'HAS_ELEMENT';
|
|
105
|
+
propertyName?: string;
|
|
106
|
+
elementIndex?: number;
|
|
107
|
+
}
|
|
72
108
|
export interface RouteEdge extends EdgeRecord {
|
|
73
109
|
type: 'ROUTES_TO' | 'HANDLED_BY';
|
|
74
110
|
method?: string;
|
|
75
111
|
path?: string;
|
|
76
112
|
}
|
|
113
|
+
/**
|
|
114
|
+
* Edge from LOOP to iterated collection (for-in/for-of loops)
|
|
115
|
+
* Source: LOOP node
|
|
116
|
+
* Destination: VARIABLE or PARAMETER being iterated
|
|
117
|
+
*/
|
|
118
|
+
export interface IteratesOverEdge extends EdgeRecord {
|
|
119
|
+
type: 'ITERATES_OVER';
|
|
120
|
+
metadata?: {
|
|
121
|
+
/** What the loop iterates over: 'keys' for for-in, 'values' for for-of */
|
|
122
|
+
iterates: 'keys' | 'values';
|
|
123
|
+
};
|
|
124
|
+
}
|
|
77
125
|
//# sourceMappingURL=edges.d.ts.map
|
package/dist/edges.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edges.d.ts","sourceRoot":"","sources":["../src/edges.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,eAAO,MAAM,SAAS
|
|
1
|
+
{"version":3,"file":"edges.d.ts","sourceRoot":"","sources":["../src/edges.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4FZ,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,OAAO,SAAS,CAAC,MAAM,OAAO,SAAS,CAAC,GAAG,MAAM,CAAC;AAGzE,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAGD,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC9C,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,MAAM,WAAW,SAAU,SAAQ,UAAU;IAC3C,IAAI,EAAE,OAAO,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAY,SAAQ,UAAU;IAC7C,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,WAAY,SAAQ,UAAU;IAC7C,IAAI,EAAE,SAAS,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC9C,IAAI,EAAE,eAAe,GAAG,YAAY,GAAG,WAAW,GAAG,iBAAiB,GAAG,cAAc,GAAG,YAAY,CAAC;IACvG,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,aAAc,SAAQ,UAAU;IAC/C,IAAI,EAAE,YAAY,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,mBAAoB,SAAQ,UAAU;IACrD,IAAI,EAAE,cAAc,GAAG,aAAa,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,SAAU,SAAQ,UAAU;IAC3C,IAAI,EAAE,WAAW,GAAG,YAAY,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IAClD,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,CAAC,EAAE;QACT,0EAA0E;QAC1E,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC;KAC7B,CAAC;CACH"}
|
package/dist/edges.js
CHANGED
|
@@ -7,6 +7,21 @@ export const EDGE_TYPE = {
|
|
|
7
7
|
CONTAINS: 'CONTAINS',
|
|
8
8
|
DEPENDS_ON: 'DEPENDS_ON',
|
|
9
9
|
HAS_SCOPE: 'HAS_SCOPE',
|
|
10
|
+
// Branching
|
|
11
|
+
HAS_CONDITION: 'HAS_CONDITION',
|
|
12
|
+
HAS_CASE: 'HAS_CASE',
|
|
13
|
+
HAS_DEFAULT: 'HAS_DEFAULT',
|
|
14
|
+
// Loop edges
|
|
15
|
+
HAS_BODY: 'HAS_BODY', // LOOP -> body SCOPE
|
|
16
|
+
ITERATES_OVER: 'ITERATES_OVER', // LOOP -> collection VARIABLE (for-in/for-of)
|
|
17
|
+
HAS_INIT: 'HAS_INIT', // LOOP (for) -> init VARIABLE (let i = 0)
|
|
18
|
+
HAS_UPDATE: 'HAS_UPDATE', // LOOP (for) -> update EXPRESSION (i++)
|
|
19
|
+
// If statement edges
|
|
20
|
+
HAS_CONSEQUENT: 'HAS_CONSEQUENT', // BRANCH -> then SCOPE
|
|
21
|
+
HAS_ALTERNATE: 'HAS_ALTERNATE', // BRANCH -> else SCOPE
|
|
22
|
+
// Try/catch/finally edges
|
|
23
|
+
HAS_CATCH: 'HAS_CATCH', // TRY_BLOCK -> CATCH_BLOCK
|
|
24
|
+
HAS_FINALLY: 'HAS_FINALLY', // TRY_BLOCK -> FINALLY_BLOCK
|
|
10
25
|
// Calls
|
|
11
26
|
CALLS: 'CALLS',
|
|
12
27
|
HAS_CALLBACK: 'HAS_CALLBACK',
|
|
@@ -31,12 +46,18 @@ export const EDGE_TYPE = {
|
|
|
31
46
|
ASSIGNED_FROM: 'ASSIGNED_FROM',
|
|
32
47
|
READS_FROM: 'READS_FROM',
|
|
33
48
|
WRITES_TO: 'WRITES_TO',
|
|
49
|
+
DERIVES_FROM: 'DERIVES_FROM',
|
|
50
|
+
FLOWS_INTO: 'FLOWS_INTO',
|
|
51
|
+
// Object/Array structure
|
|
52
|
+
HAS_PROPERTY: 'HAS_PROPERTY', // OBJECT_LITERAL -> property value
|
|
53
|
+
HAS_ELEMENT: 'HAS_ELEMENT', // ARRAY_LITERAL -> element
|
|
34
54
|
// HTTP/Routing
|
|
35
55
|
ROUTES_TO: 'ROUTES_TO',
|
|
36
56
|
HANDLED_BY: 'HANDLED_BY',
|
|
37
57
|
MAKES_REQUEST: 'MAKES_REQUEST',
|
|
38
58
|
MOUNTS: 'MOUNTS',
|
|
39
59
|
EXPOSES: 'EXPOSES',
|
|
60
|
+
RESPONDS_WITH: 'RESPONDS_WITH',
|
|
40
61
|
// Events/Sockets
|
|
41
62
|
LISTENS_TO: 'LISTENS_TO',
|
|
42
63
|
EMITS_EVENT: 'EMITS_EVENT',
|
|
@@ -44,6 +65,7 @@ export const EDGE_TYPE = {
|
|
|
44
65
|
// External
|
|
45
66
|
CALLS_API: 'CALLS_API',
|
|
46
67
|
INTERACTS_WITH: 'INTERACTS_WITH',
|
|
68
|
+
HTTP_RECEIVES: 'HTTP_RECEIVES',
|
|
47
69
|
// Views
|
|
48
70
|
REGISTERS_VIEW: 'REGISTERS_VIEW',
|
|
49
71
|
// Errors
|
|
@@ -51,6 +73,8 @@ export const EDGE_TYPE = {
|
|
|
51
73
|
// Guarantees/Invariants
|
|
52
74
|
GOVERNS: 'GOVERNS',
|
|
53
75
|
VIOLATES: 'VIOLATES',
|
|
76
|
+
// Issues
|
|
77
|
+
AFFECTS: 'AFFECTS',
|
|
54
78
|
// Unknown/fallback
|
|
55
79
|
UNKNOWN: 'UNKNOWN',
|
|
56
80
|
};
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,cAAc,YAAY,CAAC;AAG3B,cAAc,YAAY,CAAC;AAG3B,cAAc,cAAc,CAAC;AAG7B,cAAc,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,cAAc,YAAY,CAAC;AAG3B,cAAc,cAAc,CAAC;AAG7B,cAAc,YAAY,CAAC;AAG3B,cAAc,cAAc,CAAC;AAG7B,cAAc,WAAW,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/nodes.d.ts
CHANGED
|
@@ -18,6 +18,12 @@ export declare const NODE_TYPE: {
|
|
|
18
18
|
readonly SERVICE: "SERVICE";
|
|
19
19
|
readonly FILE: "FILE";
|
|
20
20
|
readonly SCOPE: "SCOPE";
|
|
21
|
+
readonly BRANCH: "BRANCH";
|
|
22
|
+
readonly CASE: "CASE";
|
|
23
|
+
readonly LOOP: "LOOP";
|
|
24
|
+
readonly TRY_BLOCK: "TRY_BLOCK";
|
|
25
|
+
readonly CATCH_BLOCK: "CATCH_BLOCK";
|
|
26
|
+
readonly FINALLY_BLOCK: "FINALLY_BLOCK";
|
|
21
27
|
readonly EXTERNAL: "EXTERNAL";
|
|
22
28
|
readonly EXTERNAL_MODULE: "EXTERNAL_MODULE";
|
|
23
29
|
readonly SIDE_EFFECT: "SIDE_EFFECT";
|
|
@@ -46,10 +52,10 @@ export type NamespacedNodeType = typeof NAMESPACED_TYPE[keyof typeof NAMESPACED_
|
|
|
46
52
|
export type NodeType = BaseNodeType | NamespacedNodeType | string;
|
|
47
53
|
export interface BaseNodeRecord {
|
|
48
54
|
id: string;
|
|
49
|
-
stableId?: string;
|
|
50
55
|
type: NodeType;
|
|
51
56
|
name: string;
|
|
52
57
|
file: string;
|
|
58
|
+
exported?: boolean;
|
|
53
59
|
line?: number;
|
|
54
60
|
column?: number;
|
|
55
61
|
metadata?: Record<string, unknown>;
|
|
@@ -65,6 +71,10 @@ export interface FunctionNodeRecord extends BaseNodeRecord {
|
|
|
65
71
|
isClassMethod?: boolean;
|
|
66
72
|
className?: string;
|
|
67
73
|
params?: string[];
|
|
74
|
+
paramTypes?: string[];
|
|
75
|
+
returnType?: string;
|
|
76
|
+
signature?: string;
|
|
77
|
+
jsdocSummary?: string;
|
|
68
78
|
}
|
|
69
79
|
export interface ClassNodeRecord extends BaseNodeRecord {
|
|
70
80
|
type: 'CLASS';
|
|
@@ -124,6 +134,41 @@ export interface ScopeNodeRecord extends BaseNodeRecord {
|
|
|
124
134
|
scopeType: 'function' | 'block' | 'class' | 'module' | 'global';
|
|
125
135
|
parentScopeId?: string;
|
|
126
136
|
}
|
|
137
|
+
export interface BranchNodeRecord extends BaseNodeRecord {
|
|
138
|
+
type: 'BRANCH';
|
|
139
|
+
branchType: 'switch' | 'if' | 'ternary';
|
|
140
|
+
parentScopeId?: string;
|
|
141
|
+
}
|
|
142
|
+
export interface CaseNodeRecord extends BaseNodeRecord {
|
|
143
|
+
type: 'CASE';
|
|
144
|
+
value: unknown;
|
|
145
|
+
isDefault: boolean;
|
|
146
|
+
fallsThrough: boolean;
|
|
147
|
+
isEmpty: boolean;
|
|
148
|
+
}
|
|
149
|
+
export interface LoopNodeRecord extends BaseNodeRecord {
|
|
150
|
+
type: 'LOOP';
|
|
151
|
+
loopType: 'for' | 'for-in' | 'for-of' | 'while' | 'do-while';
|
|
152
|
+
parentScopeId?: string;
|
|
153
|
+
bodyScopeId?: string;
|
|
154
|
+
async?: boolean;
|
|
155
|
+
}
|
|
156
|
+
export interface TryBlockNodeRecord extends BaseNodeRecord {
|
|
157
|
+
type: 'TRY_BLOCK';
|
|
158
|
+
parentScopeId?: string;
|
|
159
|
+
bodyScopeId?: string;
|
|
160
|
+
}
|
|
161
|
+
export interface CatchBlockNodeRecord extends BaseNodeRecord {
|
|
162
|
+
type: 'CATCH_BLOCK';
|
|
163
|
+
parentScopeId?: string;
|
|
164
|
+
parameterName?: string;
|
|
165
|
+
bodyScopeId?: string;
|
|
166
|
+
}
|
|
167
|
+
export interface FinallyBlockNodeRecord extends BaseNodeRecord {
|
|
168
|
+
type: 'FINALLY_BLOCK';
|
|
169
|
+
parentScopeId?: string;
|
|
170
|
+
bodyScopeId?: string;
|
|
171
|
+
}
|
|
127
172
|
export interface HttpRouteNodeRecord extends BaseNodeRecord {
|
|
128
173
|
type: 'http:route';
|
|
129
174
|
method: string;
|
|
@@ -153,7 +198,7 @@ export interface GuaranteeNodeRecord extends BaseNodeRecord {
|
|
|
153
198
|
createdAt?: number;
|
|
154
199
|
updatedAt?: number;
|
|
155
200
|
}
|
|
156
|
-
export type NodeRecord = FunctionNodeRecord | ClassNodeRecord | MethodNodeRecord | ModuleNodeRecord | ImportNodeRecord | ExportNodeRecord | VariableNodeRecord | CallNodeRecord | ServiceNodeRecord | ScopeNodeRecord | HttpRouteNodeRecord | DbQueryNodeRecord | EventListenerNodeRecord | GuaranteeNodeRecord | BaseNodeRecord;
|
|
201
|
+
export type NodeRecord = FunctionNodeRecord | ClassNodeRecord | MethodNodeRecord | ModuleNodeRecord | ImportNodeRecord | ExportNodeRecord | VariableNodeRecord | CallNodeRecord | ServiceNodeRecord | ScopeNodeRecord | BranchNodeRecord | CaseNodeRecord | LoopNodeRecord | TryBlockNodeRecord | CatchBlockNodeRecord | FinallyBlockNodeRecord | HttpRouteNodeRecord | DbQueryNodeRecord | EventListenerNodeRecord | GuaranteeNodeRecord | BaseNodeRecord;
|
|
157
202
|
export declare function isNamespacedType(nodeType: string): boolean;
|
|
158
203
|
export declare function getNamespace(nodeType: string): string | null;
|
|
159
204
|
export declare function getBaseName(nodeType: string): string;
|
package/dist/nodes.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../src/nodes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,eAAO,MAAM,SAAS
|
|
1
|
+
{"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../src/nodes.ts"],"names":[],"mappings":"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"}
|
package/dist/nodes.js
CHANGED
|
@@ -23,6 +23,14 @@ export const NODE_TYPE = {
|
|
|
23
23
|
SERVICE: 'SERVICE',
|
|
24
24
|
FILE: 'FILE',
|
|
25
25
|
SCOPE: 'SCOPE',
|
|
26
|
+
// Branching
|
|
27
|
+
BRANCH: 'BRANCH',
|
|
28
|
+
CASE: 'CASE',
|
|
29
|
+
// Control flow
|
|
30
|
+
LOOP: 'LOOP',
|
|
31
|
+
TRY_BLOCK: 'TRY_BLOCK',
|
|
32
|
+
CATCH_BLOCK: 'CATCH_BLOCK',
|
|
33
|
+
FINALLY_BLOCK: 'FINALLY_BLOCK',
|
|
26
34
|
// External dependencies
|
|
27
35
|
EXTERNAL: 'EXTERNAL',
|
|
28
36
|
EXTERNAL_MODULE: 'EXTERNAL_MODULE',
|
package/dist/plugins.d.ts
CHANGED
|
@@ -3,6 +3,22 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import type { NodeType, NodeRecord } from './nodes.js';
|
|
5
5
|
import type { EdgeType, EdgeRecord } from './edges.js';
|
|
6
|
+
/**
|
|
7
|
+
* Log level for controlling verbosity.
|
|
8
|
+
* Levels are ordered by verbosity: silent < errors < warnings < info < debug
|
|
9
|
+
*/
|
|
10
|
+
export type LogLevel = 'silent' | 'errors' | 'warnings' | 'info' | 'debug';
|
|
11
|
+
/**
|
|
12
|
+
* Logger interface for structured logging.
|
|
13
|
+
* Plugins should use context.logger instead of console.log for controllable output.
|
|
14
|
+
*/
|
|
15
|
+
export interface Logger {
|
|
16
|
+
error(message: string, context?: Record<string, unknown>): void;
|
|
17
|
+
warn(message: string, context?: Record<string, unknown>): void;
|
|
18
|
+
info(message: string, context?: Record<string, unknown>): void;
|
|
19
|
+
debug(message: string, context?: Record<string, unknown>): void;
|
|
20
|
+
trace(message: string, context?: Record<string, unknown>): void;
|
|
21
|
+
}
|
|
6
22
|
export declare const PLUGIN_PHASE: {
|
|
7
23
|
readonly DISCOVERY: "DISCOVERY";
|
|
8
24
|
readonly INDEXING: "INDEXING";
|
|
@@ -21,6 +37,28 @@ export interface PluginMetadata {
|
|
|
21
37
|
};
|
|
22
38
|
dependencies?: string[];
|
|
23
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* Specification for creating an issue node via reportIssue().
|
|
42
|
+
* Used by validation plugins to persist detected problems in the graph.
|
|
43
|
+
*/
|
|
44
|
+
export interface IssueSpec {
|
|
45
|
+
/** Issue category (e.g., 'security', 'performance', 'style', 'smell') */
|
|
46
|
+
category: string;
|
|
47
|
+
/** Severity level */
|
|
48
|
+
severity: 'error' | 'warning' | 'info';
|
|
49
|
+
/** Human-readable description of the issue */
|
|
50
|
+
message: string;
|
|
51
|
+
/** File where the issue was detected */
|
|
52
|
+
file: string;
|
|
53
|
+
/** Line number */
|
|
54
|
+
line: number;
|
|
55
|
+
/** Column number (optional, defaults to 0) */
|
|
56
|
+
column?: number;
|
|
57
|
+
/** ID of the node that this issue affects (creates AFFECTS edge) */
|
|
58
|
+
targetNodeId?: string;
|
|
59
|
+
/** Additional context data for the issue */
|
|
60
|
+
context?: Record<string, unknown>;
|
|
61
|
+
}
|
|
24
62
|
export interface PluginContext {
|
|
25
63
|
manifest?: unknown;
|
|
26
64
|
graph: GraphBackend;
|
|
@@ -30,6 +68,29 @@ export interface PluginContext {
|
|
|
30
68
|
onProgress?: (info: Record<string, unknown>) => void;
|
|
31
69
|
forceAnalysis?: boolean;
|
|
32
70
|
workerCount?: number;
|
|
71
|
+
/**
|
|
72
|
+
* Set of file paths already processed ("touched") in this analysis run.
|
|
73
|
+
* Used for idempotent re-analysis: first touch clears all nodes for that file,
|
|
74
|
+
* subsequent touches are no-ops. Only populated when forceAnalysis=true.
|
|
75
|
+
*/
|
|
76
|
+
touchedFiles?: Set<string>;
|
|
77
|
+
/**
|
|
78
|
+
* Logger instance for structured logging.
|
|
79
|
+
* Use this instead of console.log for controllable verbosity via CLI flags.
|
|
80
|
+
*/
|
|
81
|
+
logger?: Logger;
|
|
82
|
+
/**
|
|
83
|
+
* Report an issue to persist in the graph (VALIDATION phase only).
|
|
84
|
+
* Creates an issue:* node and optionally an AFFECTS edge to targetNodeId.
|
|
85
|
+
* @returns The ID of the created issue node
|
|
86
|
+
*/
|
|
87
|
+
reportIssue?(issue: IssueSpec): Promise<string>;
|
|
88
|
+
/**
|
|
89
|
+
* Strict mode flag. When true, enrichers should report unresolved
|
|
90
|
+
* references as fatal errors instead of silently continuing.
|
|
91
|
+
* Default: false (graceful degradation).
|
|
92
|
+
*/
|
|
93
|
+
strictMode?: boolean;
|
|
33
94
|
}
|
|
34
95
|
export interface PluginResult {
|
|
35
96
|
success: boolean;
|
|
@@ -66,6 +127,60 @@ export interface OrchestratorConfig {
|
|
|
66
127
|
parallel?: boolean;
|
|
67
128
|
maxWorkers?: number;
|
|
68
129
|
verbose?: boolean;
|
|
130
|
+
/**
|
|
131
|
+
* Log level for controlling verbosity.
|
|
132
|
+
* Defaults to 'info'. Use 'silent' to suppress all output, 'debug' for verbose.
|
|
133
|
+
*/
|
|
134
|
+
logLevel?: LogLevel;
|
|
135
|
+
/**
|
|
136
|
+
* Optional explicit service definitions to bypass auto-discovery.
|
|
137
|
+
* If provided and non-empty, discovery plugins are skipped.
|
|
138
|
+
* Services are resolved relative to projectPath.
|
|
139
|
+
*/
|
|
140
|
+
services?: ServiceDefinition[];
|
|
141
|
+
/**
|
|
142
|
+
* Glob patterns for files to include during indexing.
|
|
143
|
+
* If specified, only files matching at least one pattern are processed.
|
|
144
|
+
* Patterns are matched against relative paths from project root.
|
|
145
|
+
* Uses minimatch syntax (e.g., "src/**.ts", "lib/**.js").
|
|
146
|
+
*
|
|
147
|
+
* Default: undefined (process all files reachable from entrypoint)
|
|
148
|
+
*/
|
|
149
|
+
include?: string[];
|
|
150
|
+
/**
|
|
151
|
+
* Glob patterns for files to exclude during indexing.
|
|
152
|
+
* Files matching any pattern are skipped (not processed, imports not followed).
|
|
153
|
+
* Patterns are matched against relative paths from project root.
|
|
154
|
+
* Uses minimatch syntax.
|
|
155
|
+
*
|
|
156
|
+
* Default: undefined (no exclusions beyond npm packages)
|
|
157
|
+
*
|
|
158
|
+
* Note: node_modules is already excluded by default in JSModuleIndexer.
|
|
159
|
+
*/
|
|
160
|
+
exclude?: string[];
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Explicit service definition for configuration.
|
|
164
|
+
* Allows users to manually specify services when auto-discovery doesn't work.
|
|
165
|
+
*
|
|
166
|
+
* @example
|
|
167
|
+
* ```yaml
|
|
168
|
+
* services:
|
|
169
|
+
* - name: "backend"
|
|
170
|
+
* path: "apps/backend"
|
|
171
|
+
* entryPoint: "src/index.ts"
|
|
172
|
+
* ```
|
|
173
|
+
*/
|
|
174
|
+
export interface ServiceDefinition {
|
|
175
|
+
/** Unique service identifier (used for graph node ID) */
|
|
176
|
+
name: string;
|
|
177
|
+
/** Service directory path relative to project root */
|
|
178
|
+
path: string;
|
|
179
|
+
/**
|
|
180
|
+
* Optional entry point file path relative to service path.
|
|
181
|
+
* If omitted, auto-detected via resolveSourceEntrypoint() or package.json.main
|
|
182
|
+
*/
|
|
183
|
+
entryPoint?: string;
|
|
69
184
|
}
|
|
70
185
|
export interface InputNode {
|
|
71
186
|
id: string;
|
|
@@ -103,6 +218,7 @@ export interface GraphBackend {
|
|
|
103
218
|
checkGuarantee?(query: string): unknown[] | Promise<unknown[]>;
|
|
104
219
|
deleteNode?(id: string): Promise<void>;
|
|
105
220
|
deleteEdge?(src: string, dst: string, type: string): Promise<void>;
|
|
221
|
+
clear(): Promise<void>;
|
|
106
222
|
flush?(): Promise<void>;
|
|
107
223
|
close?(): Promise<void>;
|
|
108
224
|
}
|
|
@@ -123,7 +239,7 @@ export interface IPlugin {
|
|
|
123
239
|
export declare function createSuccessResult(created?: {
|
|
124
240
|
nodes: number;
|
|
125
241
|
edges: number;
|
|
126
|
-
}, metadata?: Record<string, unknown
|
|
242
|
+
}, metadata?: Record<string, unknown>, errors?: Error[]): PluginResult;
|
|
127
243
|
export declare function createErrorResult(error: Error, created?: {
|
|
128
244
|
nodes: number;
|
|
129
245
|
edges: number;
|
package/dist/plugins.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGvD,eAAO,MAAM,YAAY;;;;;;CAMf,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,OAAO,YAAY,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAGzE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;QACnB,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;KACpB,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAKD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACrD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAGD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAGD,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAClC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAGD,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"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"}
|
package/dist/plugins.js
CHANGED
|
@@ -10,11 +10,11 @@ export const PLUGIN_PHASE = {
|
|
|
10
10
|
VALIDATION: 'VALIDATION',
|
|
11
11
|
};
|
|
12
12
|
// === HELPER FUNCTIONS ===
|
|
13
|
-
export function createSuccessResult(created = { nodes: 0, edges: 0 }, metadata = {}) {
|
|
13
|
+
export function createSuccessResult(created = { nodes: 0, edges: 0 }, metadata = {}, errors = []) {
|
|
14
14
|
return {
|
|
15
15
|
success: true,
|
|
16
16
|
created,
|
|
17
|
-
errors
|
|
17
|
+
errors,
|
|
18
18
|
warnings: [],
|
|
19
19
|
metadata,
|
|
20
20
|
};
|
package/dist/rfdb.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import type { NodeType } from './nodes.js';
|
|
5
5
|
import type { EdgeType } from './edges.js';
|
|
6
|
-
export type RFDBCommand = 'addNodes' | 'addEdges' | 'deleteNode' | 'deleteEdge' | 'clear' | 'updateNodeVersion' | 'getNode' | 'nodeExists' | 'findByType' | 'findByAttr' | 'queryNodes' | 'getAllNodes' | 'getAllEdges' | 'isEndpoint' | 'getNodeIdentifier' | 'neighbors' | 'bfs' | 'dfs' | 'getOutgoingEdges' | 'getIncomingEdges' | 'nodeCount' | 'edgeCount' | 'countNodesByType' | 'countEdgesByType' | 'flush' | 'compact' | 'ping' | 'shutdown' | 'datalogLoadRules' | 'datalogClearRules' | 'datalogQuery' | 'checkGuarantee';
|
|
6
|
+
export type RFDBCommand = 'addNodes' | 'addEdges' | 'deleteNode' | 'deleteEdge' | 'clear' | 'updateNodeVersion' | 'getNode' | 'nodeExists' | 'findByType' | 'findByAttr' | 'queryNodes' | 'getAllNodes' | 'getAllEdges' | 'isEndpoint' | 'getNodeIdentifier' | 'neighbors' | 'bfs' | 'dfs' | 'reachability' | 'getOutgoingEdges' | 'getIncomingEdges' | 'nodeCount' | 'edgeCount' | 'countNodesByType' | 'countEdgesByType' | 'flush' | 'compact' | 'ping' | 'shutdown' | 'datalogLoadRules' | 'datalogClearRules' | 'datalogQuery' | 'checkGuarantee';
|
|
7
7
|
export interface WireNode {
|
|
8
8
|
id: string;
|
|
9
9
|
nodeType: NodeType;
|
|
@@ -68,6 +68,13 @@ export interface BfsRequest extends RFDBRequest {
|
|
|
68
68
|
maxDepth: number;
|
|
69
69
|
edgeTypes?: EdgeType[];
|
|
70
70
|
}
|
|
71
|
+
export interface ReachabilityRequest extends RFDBRequest {
|
|
72
|
+
cmd: 'reachability';
|
|
73
|
+
startIds: string[];
|
|
74
|
+
maxDepth: number;
|
|
75
|
+
edgeTypes?: EdgeType[];
|
|
76
|
+
backward: boolean;
|
|
77
|
+
}
|
|
71
78
|
export interface GetOutgoingEdgesRequest extends RFDBRequest {
|
|
72
79
|
cmd: 'getOutgoingEdges';
|
|
73
80
|
id: string;
|
|
@@ -114,6 +121,9 @@ export interface NeighborsResponse extends RFDBResponse {
|
|
|
114
121
|
export interface BfsResponse extends RFDBResponse {
|
|
115
122
|
ids: string[];
|
|
116
123
|
}
|
|
124
|
+
export interface ReachabilityResponse extends RFDBResponse {
|
|
125
|
+
ids: string[];
|
|
126
|
+
}
|
|
117
127
|
export interface GetEdgesResponse extends RFDBResponse {
|
|
118
128
|
edges: WireEdge[];
|
|
119
129
|
}
|
|
@@ -167,6 +177,7 @@ export interface IRFDBClient {
|
|
|
167
177
|
neighbors(id: string, edgeTypes?: EdgeType[]): Promise<string[]>;
|
|
168
178
|
bfs(startIds: string[], maxDepth: number, edgeTypes?: EdgeType[]): Promise<string[]>;
|
|
169
179
|
dfs(startIds: string[], maxDepth: number, edgeTypes?: EdgeType[]): Promise<string[]>;
|
|
180
|
+
reachability(startIds: string[], maxDepth: number, edgeTypes?: EdgeType[], backward?: boolean): Promise<string[]>;
|
|
170
181
|
getOutgoingEdges(id: string, edgeTypes?: EdgeType[] | null): Promise<WireEdge[]>;
|
|
171
182
|
getIncomingEdges(id: string, edgeTypes?: EdgeType[] | null): Promise<WireEdge[]>;
|
|
172
183
|
nodeCount(): Promise<number>;
|
package/dist/rfdb.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rfdb.d.ts","sourceRoot":"","sources":["../src/rfdb.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rfdb.d.ts","sourceRoot":"","sources":["../src/rfdb.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/branded.ts
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Branded Types - Type-safe node creation enforcement
|
|
3
|
+
*
|
|
4
|
+
* Branded types ensure that nodes can only be created through NodeFactory,
|
|
5
|
+
* preventing inline object creation that bypasses validation.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* // This compiles:
|
|
9
|
+
* const node = NodeFactory.createFunction(...);
|
|
10
|
+
* graph.addNode(node); // OK - node is BrandedNode
|
|
11
|
+
*
|
|
12
|
+
* // This fails to compile:
|
|
13
|
+
* const inline = { type: 'FUNCTION', ... };
|
|
14
|
+
* graph.addNode(inline); // ERROR - not a BrandedNode
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import type { BaseNodeRecord, NodeRecord } from './nodes.js';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Unique symbol for branding nodes.
|
|
21
|
+
* Declared but never actually exists at runtime - purely for type checking.
|
|
22
|
+
*/
|
|
23
|
+
declare const NODE_BRAND: unique symbol;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* A branded node type that can only be created through NodeFactory.
|
|
27
|
+
*
|
|
28
|
+
* The brand is a phantom type - it exists only in TypeScript's type system
|
|
29
|
+
* and has no runtime representation. This makes it impossible to create
|
|
30
|
+
* a BrandedNode without going through a function that returns one.
|
|
31
|
+
*
|
|
32
|
+
* @template T - The specific node record type (e.g., FunctionNodeRecord)
|
|
33
|
+
*/
|
|
34
|
+
export type BrandedNode<T extends BaseNodeRecord> = T & {
|
|
35
|
+
readonly [NODE_BRAND]: true;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Union type for any branded node.
|
|
40
|
+
* Use this when you need to accept any valid node type.
|
|
41
|
+
*/
|
|
42
|
+
export type AnyBrandedNode = BrandedNode<NodeRecord>;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Helper type to extract the underlying record type from a branded node.
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* type FnNode = BrandedNode<FunctionNodeRecord>;
|
|
49
|
+
* type FnRecord = UnbrandedNode<FnNode>; // FunctionNodeRecord
|
|
50
|
+
*/
|
|
51
|
+
export type UnbrandedNode<T> = T extends BrandedNode<infer U> ? U : never;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Type guard to check if a value is branded.
|
|
55
|
+
* Note: This always returns true at runtime since branding is purely type-level.
|
|
56
|
+
* It's useful for type narrowing in conditional logic.
|
|
57
|
+
*/
|
|
58
|
+
export function isBrandedNode<T extends BaseNodeRecord>(
|
|
59
|
+
node: T | BrandedNode<T>
|
|
60
|
+
): node is BrandedNode<T> {
|
|
61
|
+
// At runtime, all nodes from NodeFactory are considered branded.
|
|
62
|
+
// The actual enforcement happens at compile time.
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Internal helper for NodeFactory to brand a node.
|
|
68
|
+
* This should ONLY be used inside NodeFactory methods.
|
|
69
|
+
*
|
|
70
|
+
* @internal
|
|
71
|
+
*/
|
|
72
|
+
export function brandNode<T extends BaseNodeRecord>(node: T): BrandedNode<T> {
|
|
73
|
+
return node as BrandedNode<T>;
|
|
74
|
+
}
|
package/src/edges.ts
CHANGED
|
@@ -9,6 +9,25 @@ export const EDGE_TYPE = {
|
|
|
9
9
|
DEPENDS_ON: 'DEPENDS_ON',
|
|
10
10
|
HAS_SCOPE: 'HAS_SCOPE',
|
|
11
11
|
|
|
12
|
+
// Branching
|
|
13
|
+
HAS_CONDITION: 'HAS_CONDITION',
|
|
14
|
+
HAS_CASE: 'HAS_CASE',
|
|
15
|
+
HAS_DEFAULT: 'HAS_DEFAULT',
|
|
16
|
+
|
|
17
|
+
// Loop edges
|
|
18
|
+
HAS_BODY: 'HAS_BODY', // LOOP -> body SCOPE
|
|
19
|
+
ITERATES_OVER: 'ITERATES_OVER', // LOOP -> collection VARIABLE (for-in/for-of)
|
|
20
|
+
HAS_INIT: 'HAS_INIT', // LOOP (for) -> init VARIABLE (let i = 0)
|
|
21
|
+
HAS_UPDATE: 'HAS_UPDATE', // LOOP (for) -> update EXPRESSION (i++)
|
|
22
|
+
|
|
23
|
+
// If statement edges
|
|
24
|
+
HAS_CONSEQUENT: 'HAS_CONSEQUENT', // BRANCH -> then SCOPE
|
|
25
|
+
HAS_ALTERNATE: 'HAS_ALTERNATE', // BRANCH -> else SCOPE
|
|
26
|
+
|
|
27
|
+
// Try/catch/finally edges
|
|
28
|
+
HAS_CATCH: 'HAS_CATCH', // TRY_BLOCK -> CATCH_BLOCK
|
|
29
|
+
HAS_FINALLY: 'HAS_FINALLY', // TRY_BLOCK -> FINALLY_BLOCK
|
|
30
|
+
|
|
12
31
|
// Calls
|
|
13
32
|
CALLS: 'CALLS',
|
|
14
33
|
HAS_CALLBACK: 'HAS_CALLBACK',
|
|
@@ -36,6 +55,12 @@ export const EDGE_TYPE = {
|
|
|
36
55
|
ASSIGNED_FROM: 'ASSIGNED_FROM',
|
|
37
56
|
READS_FROM: 'READS_FROM',
|
|
38
57
|
WRITES_TO: 'WRITES_TO',
|
|
58
|
+
DERIVES_FROM: 'DERIVES_FROM',
|
|
59
|
+
FLOWS_INTO: 'FLOWS_INTO',
|
|
60
|
+
|
|
61
|
+
// Object/Array structure
|
|
62
|
+
HAS_PROPERTY: 'HAS_PROPERTY', // OBJECT_LITERAL -> property value
|
|
63
|
+
HAS_ELEMENT: 'HAS_ELEMENT', // ARRAY_LITERAL -> element
|
|
39
64
|
|
|
40
65
|
// HTTP/Routing
|
|
41
66
|
ROUTES_TO: 'ROUTES_TO',
|
|
@@ -43,6 +68,7 @@ export const EDGE_TYPE = {
|
|
|
43
68
|
MAKES_REQUEST: 'MAKES_REQUEST',
|
|
44
69
|
MOUNTS: 'MOUNTS',
|
|
45
70
|
EXPOSES: 'EXPOSES',
|
|
71
|
+
RESPONDS_WITH: 'RESPONDS_WITH',
|
|
46
72
|
|
|
47
73
|
// Events/Sockets
|
|
48
74
|
LISTENS_TO: 'LISTENS_TO',
|
|
@@ -52,6 +78,7 @@ export const EDGE_TYPE = {
|
|
|
52
78
|
// External
|
|
53
79
|
CALLS_API: 'CALLS_API',
|
|
54
80
|
INTERACTS_WITH: 'INTERACTS_WITH',
|
|
81
|
+
HTTP_RECEIVES: 'HTTP_RECEIVES',
|
|
55
82
|
|
|
56
83
|
// Views
|
|
57
84
|
REGISTERS_VIEW: 'REGISTERS_VIEW',
|
|
@@ -63,6 +90,9 @@ export const EDGE_TYPE = {
|
|
|
63
90
|
GOVERNS: 'GOVERNS',
|
|
64
91
|
VIOLATES: 'VIOLATES',
|
|
65
92
|
|
|
93
|
+
// Issues
|
|
94
|
+
AFFECTS: 'AFFECTS',
|
|
95
|
+
|
|
66
96
|
// Unknown/fallback
|
|
67
97
|
UNKNOWN: 'UNKNOWN',
|
|
68
98
|
} as const;
|
|
@@ -100,12 +130,45 @@ export interface ExportsEdge extends EdgeRecord {
|
|
|
100
130
|
}
|
|
101
131
|
|
|
102
132
|
export interface DataFlowEdge extends EdgeRecord {
|
|
103
|
-
type: 'ASSIGNED_FROM' | 'READS_FROM' | 'WRITES_TO' | 'PASSES_ARGUMENT';
|
|
133
|
+
type: 'ASSIGNED_FROM' | 'READS_FROM' | 'WRITES_TO' | 'PASSES_ARGUMENT' | 'DERIVES_FROM' | 'FLOWS_INTO';
|
|
104
134
|
dataType?: string;
|
|
105
135
|
}
|
|
106
136
|
|
|
137
|
+
/**
|
|
138
|
+
* Edge representing data flowing INTO a container (array, collection)
|
|
139
|
+
* Source: the value being added
|
|
140
|
+
* Destination: the container receiving the value
|
|
141
|
+
*
|
|
142
|
+
* Example: arr.push(obj) creates edge obj --FLOWS_INTO--> arr
|
|
143
|
+
*/
|
|
144
|
+
export interface FlowsIntoEdge extends EdgeRecord {
|
|
145
|
+
type: 'FLOWS_INTO';
|
|
146
|
+
mutationMethod?: 'push' | 'unshift' | 'splice' | 'indexed';
|
|
147
|
+
argIndex?: number;
|
|
148
|
+
isSpread?: boolean;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export interface ObjectStructureEdge extends EdgeRecord {
|
|
152
|
+
type: 'HAS_PROPERTY' | 'HAS_ELEMENT';
|
|
153
|
+
propertyName?: string; // For HAS_PROPERTY
|
|
154
|
+
elementIndex?: number; // For HAS_ELEMENT
|
|
155
|
+
}
|
|
156
|
+
|
|
107
157
|
export interface RouteEdge extends EdgeRecord {
|
|
108
158
|
type: 'ROUTES_TO' | 'HANDLED_BY';
|
|
109
159
|
method?: string;
|
|
110
160
|
path?: string;
|
|
111
161
|
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Edge from LOOP to iterated collection (for-in/for-of loops)
|
|
165
|
+
* Source: LOOP node
|
|
166
|
+
* Destination: VARIABLE or PARAMETER being iterated
|
|
167
|
+
*/
|
|
168
|
+
export interface IteratesOverEdge extends EdgeRecord {
|
|
169
|
+
type: 'ITERATES_OVER';
|
|
170
|
+
metadata?: {
|
|
171
|
+
/** What the loop iterates over: 'keys' for for-in, 'values' for for-of */
|
|
172
|
+
iterates: 'keys' | 'values';
|
|
173
|
+
};
|
|
174
|
+
}
|
package/src/index.ts
CHANGED
package/src/nodes.ts
CHANGED
|
@@ -28,6 +28,16 @@ export const NODE_TYPE = {
|
|
|
28
28
|
FILE: 'FILE',
|
|
29
29
|
SCOPE: 'SCOPE',
|
|
30
30
|
|
|
31
|
+
// Branching
|
|
32
|
+
BRANCH: 'BRANCH',
|
|
33
|
+
CASE: 'CASE',
|
|
34
|
+
|
|
35
|
+
// Control flow
|
|
36
|
+
LOOP: 'LOOP',
|
|
37
|
+
TRY_BLOCK: 'TRY_BLOCK',
|
|
38
|
+
CATCH_BLOCK: 'CATCH_BLOCK',
|
|
39
|
+
FINALLY_BLOCK: 'FINALLY_BLOCK',
|
|
40
|
+
|
|
31
41
|
// External dependencies
|
|
32
42
|
EXTERNAL: 'EXTERNAL',
|
|
33
43
|
EXTERNAL_MODULE: 'EXTERNAL_MODULE',
|
|
@@ -81,10 +91,10 @@ export type NodeType = BaseNodeType | NamespacedNodeType | string;
|
|
|
81
91
|
// Base interface for all nodes
|
|
82
92
|
export interface BaseNodeRecord {
|
|
83
93
|
id: string;
|
|
84
|
-
stableId?: string;
|
|
85
94
|
type: NodeType;
|
|
86
95
|
name: string;
|
|
87
96
|
file: string;
|
|
97
|
+
exported?: boolean; // Optional - some nodes may not have export status
|
|
88
98
|
line?: number; // Optional - not always available
|
|
89
99
|
column?: number;
|
|
90
100
|
metadata?: Record<string, unknown>;
|
|
@@ -103,6 +113,10 @@ export interface FunctionNodeRecord extends BaseNodeRecord {
|
|
|
103
113
|
isClassMethod?: boolean;
|
|
104
114
|
className?: string;
|
|
105
115
|
params?: string[];
|
|
116
|
+
paramTypes?: string[]; // Types for each param
|
|
117
|
+
returnType?: string; // Return type
|
|
118
|
+
signature?: string; // Full signature: "(a: T) => R"
|
|
119
|
+
jsdocSummary?: string; // First line of JSDoc
|
|
106
120
|
}
|
|
107
121
|
|
|
108
122
|
// Class node
|
|
@@ -182,6 +196,53 @@ export interface ScopeNodeRecord extends BaseNodeRecord {
|
|
|
182
196
|
parentScopeId?: string;
|
|
183
197
|
}
|
|
184
198
|
|
|
199
|
+
// Branch node (switch, future: if/ternary)
|
|
200
|
+
export interface BranchNodeRecord extends BaseNodeRecord {
|
|
201
|
+
type: 'BRANCH';
|
|
202
|
+
branchType: 'switch' | 'if' | 'ternary'; // For future expansion
|
|
203
|
+
parentScopeId?: string;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Case node (switch case clause)
|
|
207
|
+
export interface CaseNodeRecord extends BaseNodeRecord {
|
|
208
|
+
type: 'CASE';
|
|
209
|
+
value: unknown; // Case test value ('ADD', 1, etc.) or null for default
|
|
210
|
+
isDefault: boolean; // true for default case
|
|
211
|
+
fallsThrough: boolean; // true if no break/return
|
|
212
|
+
isEmpty: boolean; // true if case has no statements (intentional fall-through)
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// Loop node (for, for-in, for-of, while, do-while)
|
|
216
|
+
export interface LoopNodeRecord extends BaseNodeRecord {
|
|
217
|
+
type: 'LOOP';
|
|
218
|
+
loopType: 'for' | 'for-in' | 'for-of' | 'while' | 'do-while';
|
|
219
|
+
parentScopeId?: string;
|
|
220
|
+
bodyScopeId?: string; // ID of SCOPE node containing loop body
|
|
221
|
+
async?: boolean; // true for for-await-of loops
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Try block node
|
|
225
|
+
export interface TryBlockNodeRecord extends BaseNodeRecord {
|
|
226
|
+
type: 'TRY_BLOCK';
|
|
227
|
+
parentScopeId?: string;
|
|
228
|
+
bodyScopeId?: string; // ID of SCOPE node containing try body
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Catch block node
|
|
232
|
+
export interface CatchBlockNodeRecord extends BaseNodeRecord {
|
|
233
|
+
type: 'CATCH_BLOCK';
|
|
234
|
+
parentScopeId?: string;
|
|
235
|
+
parameterName?: string; // Error parameter name (e.g., 'e' in catch(e))
|
|
236
|
+
bodyScopeId?: string; // ID of SCOPE node containing catch body
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// Finally block node
|
|
240
|
+
export interface FinallyBlockNodeRecord extends BaseNodeRecord {
|
|
241
|
+
type: 'FINALLY_BLOCK';
|
|
242
|
+
parentScopeId?: string;
|
|
243
|
+
bodyScopeId?: string; // ID of SCOPE node containing finally body
|
|
244
|
+
}
|
|
245
|
+
|
|
185
246
|
// HTTP Route node
|
|
186
247
|
export interface HttpRouteNodeRecord extends BaseNodeRecord {
|
|
187
248
|
type: 'http:route';
|
|
@@ -235,6 +296,12 @@ export type NodeRecord =
|
|
|
235
296
|
| CallNodeRecord
|
|
236
297
|
| ServiceNodeRecord
|
|
237
298
|
| ScopeNodeRecord
|
|
299
|
+
| BranchNodeRecord
|
|
300
|
+
| CaseNodeRecord
|
|
301
|
+
| LoopNodeRecord
|
|
302
|
+
| TryBlockNodeRecord
|
|
303
|
+
| CatchBlockNodeRecord
|
|
304
|
+
| FinallyBlockNodeRecord
|
|
238
305
|
| HttpRouteNodeRecord
|
|
239
306
|
| DbQueryNodeRecord
|
|
240
307
|
| EventListenerNodeRecord
|
package/src/plugins.ts
CHANGED
|
@@ -5,6 +5,26 @@
|
|
|
5
5
|
import type { NodeType, NodeRecord } from './nodes.js';
|
|
6
6
|
import type { EdgeType, EdgeRecord } from './edges.js';
|
|
7
7
|
|
|
8
|
+
// === LOG LEVEL ===
|
|
9
|
+
/**
|
|
10
|
+
* Log level for controlling verbosity.
|
|
11
|
+
* Levels are ordered by verbosity: silent < errors < warnings < info < debug
|
|
12
|
+
*/
|
|
13
|
+
export type LogLevel = 'silent' | 'errors' | 'warnings' | 'info' | 'debug';
|
|
14
|
+
|
|
15
|
+
// === LOGGER INTERFACE ===
|
|
16
|
+
/**
|
|
17
|
+
* Logger interface for structured logging.
|
|
18
|
+
* Plugins should use context.logger instead of console.log for controllable output.
|
|
19
|
+
*/
|
|
20
|
+
export interface Logger {
|
|
21
|
+
error(message: string, context?: Record<string, unknown>): void;
|
|
22
|
+
warn(message: string, context?: Record<string, unknown>): void;
|
|
23
|
+
info(message: string, context?: Record<string, unknown>): void;
|
|
24
|
+
debug(message: string, context?: Record<string, unknown>): void;
|
|
25
|
+
trace(message: string, context?: Record<string, unknown>): void;
|
|
26
|
+
}
|
|
27
|
+
|
|
8
28
|
// === PLUGIN PHASES ===
|
|
9
29
|
export const PLUGIN_PHASE = {
|
|
10
30
|
DISCOVERY: 'DISCOVERY',
|
|
@@ -28,6 +48,30 @@ export interface PluginMetadata {
|
|
|
28
48
|
dependencies?: string[];
|
|
29
49
|
}
|
|
30
50
|
|
|
51
|
+
// === ISSUE SPEC ===
|
|
52
|
+
/**
|
|
53
|
+
* Specification for creating an issue node via reportIssue().
|
|
54
|
+
* Used by validation plugins to persist detected problems in the graph.
|
|
55
|
+
*/
|
|
56
|
+
export interface IssueSpec {
|
|
57
|
+
/** Issue category (e.g., 'security', 'performance', 'style', 'smell') */
|
|
58
|
+
category: string;
|
|
59
|
+
/** Severity level */
|
|
60
|
+
severity: 'error' | 'warning' | 'info';
|
|
61
|
+
/** Human-readable description of the issue */
|
|
62
|
+
message: string;
|
|
63
|
+
/** File where the issue was detected */
|
|
64
|
+
file: string;
|
|
65
|
+
/** Line number */
|
|
66
|
+
line: number;
|
|
67
|
+
/** Column number (optional, defaults to 0) */
|
|
68
|
+
column?: number;
|
|
69
|
+
/** ID of the node that this issue affects (creates AFFECTS edge) */
|
|
70
|
+
targetNodeId?: string;
|
|
71
|
+
/** Additional context data for the issue */
|
|
72
|
+
context?: Record<string, unknown>;
|
|
73
|
+
}
|
|
74
|
+
|
|
31
75
|
// === PLUGIN CONTEXT ===
|
|
32
76
|
// Manifest varies by phase (UnitManifest, DiscoveryManifest, or full Manifest)
|
|
33
77
|
// Using unknown to allow all manifest types
|
|
@@ -40,6 +84,29 @@ export interface PluginContext {
|
|
|
40
84
|
onProgress?: (info: Record<string, unknown>) => void;
|
|
41
85
|
forceAnalysis?: boolean;
|
|
42
86
|
workerCount?: number;
|
|
87
|
+
/**
|
|
88
|
+
* Set of file paths already processed ("touched") in this analysis run.
|
|
89
|
+
* Used for idempotent re-analysis: first touch clears all nodes for that file,
|
|
90
|
+
* subsequent touches are no-ops. Only populated when forceAnalysis=true.
|
|
91
|
+
*/
|
|
92
|
+
touchedFiles?: Set<string>;
|
|
93
|
+
/**
|
|
94
|
+
* Logger instance for structured logging.
|
|
95
|
+
* Use this instead of console.log for controllable verbosity via CLI flags.
|
|
96
|
+
*/
|
|
97
|
+
logger?: Logger;
|
|
98
|
+
/**
|
|
99
|
+
* Report an issue to persist in the graph (VALIDATION phase only).
|
|
100
|
+
* Creates an issue:* node and optionally an AFFECTS edge to targetNodeId.
|
|
101
|
+
* @returns The ID of the created issue node
|
|
102
|
+
*/
|
|
103
|
+
reportIssue?(issue: IssueSpec): Promise<string>;
|
|
104
|
+
/**
|
|
105
|
+
* Strict mode flag. When true, enrichers should report unresolved
|
|
106
|
+
* references as fatal errors instead of silently continuing.
|
|
107
|
+
* Default: false (graceful degradation).
|
|
108
|
+
*/
|
|
109
|
+
strictMode?: boolean;
|
|
43
110
|
}
|
|
44
111
|
|
|
45
112
|
// === PLUGIN RESULT ===
|
|
@@ -84,6 +151,65 @@ export interface OrchestratorConfig {
|
|
|
84
151
|
parallel?: boolean;
|
|
85
152
|
maxWorkers?: number;
|
|
86
153
|
verbose?: boolean;
|
|
154
|
+
/**
|
|
155
|
+
* Log level for controlling verbosity.
|
|
156
|
+
* Defaults to 'info'. Use 'silent' to suppress all output, 'debug' for verbose.
|
|
157
|
+
*/
|
|
158
|
+
logLevel?: LogLevel;
|
|
159
|
+
/**
|
|
160
|
+
* Optional explicit service definitions to bypass auto-discovery.
|
|
161
|
+
* If provided and non-empty, discovery plugins are skipped.
|
|
162
|
+
* Services are resolved relative to projectPath.
|
|
163
|
+
*/
|
|
164
|
+
services?: ServiceDefinition[];
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Glob patterns for files to include during indexing.
|
|
168
|
+
* If specified, only files matching at least one pattern are processed.
|
|
169
|
+
* Patterns are matched against relative paths from project root.
|
|
170
|
+
* Uses minimatch syntax (e.g., "src/**.ts", "lib/**.js").
|
|
171
|
+
*
|
|
172
|
+
* Default: undefined (process all files reachable from entrypoint)
|
|
173
|
+
*/
|
|
174
|
+
include?: string[];
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Glob patterns for files to exclude during indexing.
|
|
178
|
+
* Files matching any pattern are skipped (not processed, imports not followed).
|
|
179
|
+
* Patterns are matched against relative paths from project root.
|
|
180
|
+
* Uses minimatch syntax.
|
|
181
|
+
*
|
|
182
|
+
* Default: undefined (no exclusions beyond npm packages)
|
|
183
|
+
*
|
|
184
|
+
* Note: node_modules is already excluded by default in JSModuleIndexer.
|
|
185
|
+
*/
|
|
186
|
+
exclude?: string[];
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Explicit service definition for configuration.
|
|
191
|
+
* Allows users to manually specify services when auto-discovery doesn't work.
|
|
192
|
+
*
|
|
193
|
+
* @example
|
|
194
|
+
* ```yaml
|
|
195
|
+
* services:
|
|
196
|
+
* - name: "backend"
|
|
197
|
+
* path: "apps/backend"
|
|
198
|
+
* entryPoint: "src/index.ts"
|
|
199
|
+
* ```
|
|
200
|
+
*/
|
|
201
|
+
export interface ServiceDefinition {
|
|
202
|
+
/** Unique service identifier (used for graph node ID) */
|
|
203
|
+
name: string;
|
|
204
|
+
|
|
205
|
+
/** Service directory path relative to project root */
|
|
206
|
+
path: string;
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Optional entry point file path relative to service path.
|
|
210
|
+
* If omitted, auto-detected via resolveSourceEntrypoint() or package.json.main
|
|
211
|
+
*/
|
|
212
|
+
entryPoint?: string;
|
|
87
213
|
}
|
|
88
214
|
|
|
89
215
|
// === GRAPH BACKEND INTERFACE ===
|
|
@@ -133,9 +259,10 @@ export interface GraphBackend {
|
|
|
133
259
|
runDatalogQuery?(query: string): Promise<unknown[]>;
|
|
134
260
|
checkGuarantee?(query: string): unknown[] | Promise<unknown[]>;
|
|
135
261
|
|
|
136
|
-
//
|
|
262
|
+
// Delete methods
|
|
137
263
|
deleteNode?(id: string): Promise<void>;
|
|
138
264
|
deleteEdge?(src: string, dst: string, type: string): Promise<void>;
|
|
265
|
+
clear(): Promise<void>;
|
|
139
266
|
|
|
140
267
|
// Optional persistence
|
|
141
268
|
flush?(): Promise<void>;
|
|
@@ -162,12 +289,13 @@ export interface IPlugin {
|
|
|
162
289
|
// === HELPER FUNCTIONS ===
|
|
163
290
|
export function createSuccessResult(
|
|
164
291
|
created: { nodes: number; edges: number } = { nodes: 0, edges: 0 },
|
|
165
|
-
metadata: Record<string, unknown> = {}
|
|
292
|
+
metadata: Record<string, unknown> = {},
|
|
293
|
+
errors: Error[] = []
|
|
166
294
|
): PluginResult {
|
|
167
295
|
return {
|
|
168
296
|
success: true,
|
|
169
297
|
created,
|
|
170
|
-
errors
|
|
298
|
+
errors,
|
|
171
299
|
warnings: [],
|
|
172
300
|
metadata,
|
|
173
301
|
};
|
package/src/rfdb.ts
CHANGED
|
@@ -28,6 +28,7 @@ export type RFDBCommand =
|
|
|
28
28
|
| 'neighbors'
|
|
29
29
|
| 'bfs'
|
|
30
30
|
| 'dfs'
|
|
31
|
+
| 'reachability'
|
|
31
32
|
| 'getOutgoingEdges'
|
|
32
33
|
| 'getIncomingEdges'
|
|
33
34
|
// Stats
|
|
@@ -127,6 +128,14 @@ export interface BfsRequest extends RFDBRequest {
|
|
|
127
128
|
edgeTypes?: EdgeType[];
|
|
128
129
|
}
|
|
129
130
|
|
|
131
|
+
export interface ReachabilityRequest extends RFDBRequest {
|
|
132
|
+
cmd: 'reachability';
|
|
133
|
+
startIds: string[];
|
|
134
|
+
maxDepth: number;
|
|
135
|
+
edgeTypes?: EdgeType[];
|
|
136
|
+
backward: boolean;
|
|
137
|
+
}
|
|
138
|
+
|
|
130
139
|
export interface GetOutgoingEdgesRequest extends RFDBRequest {
|
|
131
140
|
cmd: 'getOutgoingEdges';
|
|
132
141
|
id: string;
|
|
@@ -187,6 +196,10 @@ export interface BfsResponse extends RFDBResponse {
|
|
|
187
196
|
ids: string[];
|
|
188
197
|
}
|
|
189
198
|
|
|
199
|
+
export interface ReachabilityResponse extends RFDBResponse {
|
|
200
|
+
ids: string[];
|
|
201
|
+
}
|
|
202
|
+
|
|
190
203
|
export interface GetEdgesResponse extends RFDBResponse {
|
|
191
204
|
edges: WireEdge[];
|
|
192
205
|
}
|
|
@@ -258,6 +271,7 @@ export interface IRFDBClient {
|
|
|
258
271
|
neighbors(id: string, edgeTypes?: EdgeType[]): Promise<string[]>;
|
|
259
272
|
bfs(startIds: string[], maxDepth: number, edgeTypes?: EdgeType[]): Promise<string[]>;
|
|
260
273
|
dfs(startIds: string[], maxDepth: number, edgeTypes?: EdgeType[]): Promise<string[]>;
|
|
274
|
+
reachability(startIds: string[], maxDepth: number, edgeTypes?: EdgeType[], backward?: boolean): Promise<string[]>;
|
|
261
275
|
getOutgoingEdges(id: string, edgeTypes?: EdgeType[] | null): Promise<WireEdge[]>;
|
|
262
276
|
getIncomingEdges(id: string, edgeTypes?: EdgeType[] | null): Promise<WireEdge[]>;
|
|
263
277
|
|