@linklabjs/core 0.1.0 → 0.1.2
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/api/DomainNode.d.ts +154 -0
- package/dist/api/DomainNode.d.ts.map +1 -0
- package/dist/api/DomainNode.js +1157 -0
- package/dist/api/DomainNode.js.map +1 -0
- package/dist/api/Graph.d.ts +117 -0
- package/dist/api/Graph.d.ts.map +1 -0
- package/dist/api/Graph.js +212 -0
- package/dist/api/Graph.js.map +1 -0
- package/dist/api/PathBuilder.d.ts +76 -0
- package/dist/api/PathBuilder.d.ts.map +1 -0
- package/dist/api/PathBuilder.js +182 -0
- package/dist/api/PathBuilder.js.map +1 -0
- package/dist/api/index.d.ts +8 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +7 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/loadGraph.d.ts +57 -0
- package/dist/api/loadGraph.d.ts.map +1 -0
- package/dist/api/loadGraph.js +153 -0
- package/dist/api/loadGraph.js.map +1 -0
- package/dist/api/test-api.d.ts +9 -0
- package/dist/api/test-api.d.ts.map +1 -0
- package/dist/api/test-api.js +133 -0
- package/dist/api/test-api.js.map +1 -0
- package/dist/api/test-domain.d.ts +13 -0
- package/dist/api/test-domain.d.ts.map +1 -0
- package/dist/api/test-domain.js +105 -0
- package/dist/api/test-domain.js.map +1 -0
- package/dist/api/types.d.ts +69 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +22 -0
- package/dist/api/types.js.map +1 -0
- package/dist/config/synonyms.json +25 -0
- package/dist/core/EventBus.d.ts +56 -0
- package/dist/core/EventBus.d.ts.map +1 -0
- package/dist/core/EventBus.js +147 -0
- package/dist/core/EventBus.js.map +1 -0
- package/dist/core/GraphEvents.d.ts +118 -0
- package/dist/core/GraphEvents.d.ts.map +1 -0
- package/dist/core/GraphEvents.js +23 -0
- package/dist/core/GraphEvents.js.map +1 -0
- package/dist/core/PathFinder.d.ts +43 -0
- package/dist/core/PathFinder.d.ts.map +1 -0
- package/dist/core/PathFinder.js +264 -0
- package/dist/core/PathFinder.js.map +1 -0
- package/dist/formatters/BaseFormatter.d.ts +15 -0
- package/dist/formatters/BaseFormatter.d.ts.map +1 -0
- package/dist/formatters/BaseFormatter.js +9 -0
- package/dist/formatters/BaseFormatter.js.map +1 -0
- package/dist/graph/GraphAssembler.d.ts +14 -0
- package/dist/graph/GraphAssembler.d.ts.map +1 -0
- package/dist/graph/GraphAssembler.js +44 -0
- package/dist/graph/GraphAssembler.js.map +1 -0
- package/dist/graph/GraphCompiler.d.ts +37 -0
- package/dist/graph/GraphCompiler.d.ts.map +1 -0
- package/dist/graph/GraphCompiler.js +355 -0
- package/dist/graph/GraphCompiler.js.map +1 -0
- package/dist/graph/GraphExtractor.d.ts +21 -0
- package/dist/graph/GraphExtractor.d.ts.map +1 -0
- package/dist/graph/GraphExtractor.js +145 -0
- package/dist/graph/GraphExtractor.js.map +1 -0
- package/dist/graph/GraphOptimizer.d.ts +104 -0
- package/dist/graph/GraphOptimizer.d.ts.map +1 -0
- package/dist/graph/GraphOptimizer.js +306 -0
- package/dist/graph/GraphOptimizer.js.map +1 -0
- package/dist/graph/GraphTrainer.d.ts +52 -0
- package/dist/graph/GraphTrainer.d.ts.map +1 -0
- package/dist/graph/GraphTrainer.js +188 -0
- package/dist/graph/GraphTrainer.js.map +1 -0
- package/dist/http/LinkBuilder.d.ts +82 -0
- package/dist/http/LinkBuilder.d.ts.map +1 -0
- package/dist/http/LinkBuilder.js +190 -0
- package/dist/http/LinkBuilder.js.map +1 -0
- package/dist/http/TrailRequest.d.ts +39 -0
- package/dist/http/TrailRequest.d.ts.map +1 -0
- package/dist/http/TrailRequest.js +22 -0
- package/dist/http/TrailRequest.js.map +1 -0
- package/dist/http/example-netflix.d.ts +6 -0
- package/dist/http/example-netflix.d.ts.map +1 -0
- package/dist/http/example-netflix.js +52 -0
- package/dist/http/example-netflix.js.map +1 -0
- package/dist/http/index.d.ts +32 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +27 -0
- package/dist/http/index.js.map +1 -0
- package/dist/http/plugin.d.ts +110 -0
- package/dist/http/plugin.d.ts.map +1 -0
- package/dist/http/plugin.js +217 -0
- package/dist/http/plugin.js.map +1 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +71 -0
- package/dist/index.js.map +1 -0
- package/dist/instrumentation/TelemetryShim.d.ts +114 -0
- package/dist/instrumentation/TelemetryShim.d.ts.map +1 -0
- package/dist/instrumentation/TelemetryShim.js +107 -0
- package/dist/instrumentation/TelemetryShim.js.map +1 -0
- package/dist/navigation/NavigationEngine.d.ts +69 -0
- package/dist/navigation/NavigationEngine.d.ts.map +1 -0
- package/dist/navigation/NavigationEngine.js +361 -0
- package/dist/navigation/NavigationEngine.js.map +1 -0
- package/dist/navigation/Resolver.d.ts +35 -0
- package/dist/navigation/Resolver.d.ts.map +1 -0
- package/dist/navigation/Resolver.js +113 -0
- package/dist/navigation/Resolver.js.map +1 -0
- package/dist/navigation/Scheduler.d.ts +36 -0
- package/dist/navigation/Scheduler.d.ts.map +1 -0
- package/dist/navigation/Scheduler.js +107 -0
- package/dist/navigation/Scheduler.js.map +1 -0
- package/dist/navigation/Trail.d.ts +129 -0
- package/dist/navigation/Trail.d.ts.map +1 -0
- package/dist/navigation/Trail.js +202 -0
- package/dist/navigation/Trail.js.map +1 -0
- package/dist/navigation/TrailParser.d.ts +96 -0
- package/dist/navigation/TrailParser.d.ts.map +1 -0
- package/dist/navigation/TrailParser.js +180 -0
- package/dist/navigation/TrailParser.js.map +1 -0
- package/dist/navigation/index.d.ts +10 -0
- package/dist/navigation/index.d.ts.map +1 -0
- package/dist/navigation/index.js +9 -0
- package/dist/navigation/index.js.map +1 -0
- package/dist/providers/MockProvider.d.ts +29 -0
- package/dist/providers/MockProvider.d.ts.map +1 -0
- package/dist/providers/MockProvider.js +55 -0
- package/dist/providers/MockProvider.js.map +1 -0
- package/dist/providers/PostgresProvider.d.ts +46 -0
- package/dist/providers/PostgresProvider.d.ts.map +1 -0
- package/dist/providers/PostgresProvider.js +152 -0
- package/dist/providers/PostgresProvider.js.map +1 -0
- package/dist/runtime/CompiledGraphEngine.d.ts +74 -0
- package/dist/runtime/CompiledGraphEngine.d.ts.map +1 -0
- package/dist/runtime/CompiledGraphEngine.js +211 -0
- package/dist/runtime/CompiledGraphEngine.js.map +1 -0
- package/dist/runtime/DataLoader.d.ts +90 -0
- package/dist/runtime/DataLoader.d.ts.map +1 -0
- package/dist/runtime/DataLoader.js +178 -0
- package/dist/runtime/DataLoader.js.map +1 -0
- package/dist/runtime/Engine.d.ts +36 -0
- package/dist/runtime/Engine.d.ts.map +1 -0
- package/dist/runtime/Engine.js +128 -0
- package/dist/runtime/Engine.js.map +1 -0
- package/dist/runtime/QueryEngine.d.ts +80 -0
- package/dist/runtime/QueryEngine.d.ts.map +1 -0
- package/dist/runtime/QueryEngine.js +188 -0
- package/dist/runtime/QueryEngine.js.map +1 -0
- package/dist/scenarios/test-metro-paris/config.json +6 -0
- package/dist/scenarios/test-metro-paris/graph.json +16325 -0
- package/dist/scenarios/test-metro-paris/queries.d.ts +22 -0
- package/dist/scenarios/test-metro-paris/queries.d.ts.map +1 -0
- package/dist/scenarios/test-metro-paris/queries.js +128 -0
- package/dist/scenarios/test-metro-paris/queries.js.map +1 -0
- package/dist/scenarios/test-metro-paris/stack.json +1 -0
- package/dist/scenarios/test-musicians/config.json +10 -0
- package/dist/scenarios/test-musicians/graph.json +20 -0
- package/dist/scenarios/test-musicians/stack.json +1 -0
- package/dist/scenarios/test-netflix/actions.d.ts +14 -0
- package/dist/scenarios/test-netflix/actions.d.ts.map +1 -0
- package/dist/scenarios/test-netflix/actions.js +86 -0
- package/dist/scenarios/test-netflix/actions.js.map +1 -0
- package/dist/scenarios/test-netflix/config.json +6 -0
- package/dist/scenarios/test-netflix/data/categories.json +1 -0
- package/dist/scenarios/test-netflix/data/companies.json +1 -0
- package/dist/scenarios/test-netflix/data/credits.json +19797 -0
- package/dist/scenarios/test-netflix/data/departments.json +18 -0
- package/dist/scenarios/test-netflix/data/jobs.json +142 -0
- package/dist/scenarios/test-netflix/data/movies.json +3497 -0
- package/dist/scenarios/test-netflix/data/people.json +1 -0
- package/dist/scenarios/test-netflix/data/synonyms.json +7 -0
- package/dist/scenarios/test-netflix/data/users.json +70 -0
- package/dist/scenarios/test-netflix/graph.json +1017 -0
- package/dist/scenarios/test-netflix/queries.d.ts +29 -0
- package/dist/scenarios/test-netflix/queries.d.ts.map +1 -0
- package/dist/scenarios/test-netflix/queries.js +134 -0
- package/dist/scenarios/test-netflix/queries.js.map +1 -0
- package/dist/scenarios/test-netflix/stack.json +14 -0
- package/dist/schema/GraphBuilder.d.ts +9 -0
- package/dist/schema/GraphBuilder.d.ts.map +1 -0
- package/dist/schema/GraphBuilder.js +90 -0
- package/dist/schema/GraphBuilder.js.map +1 -0
- package/dist/schema/JsonSchemaExtractor.d.ts +21 -0
- package/dist/schema/JsonSchemaExtractor.d.ts.map +1 -0
- package/dist/schema/JsonSchemaExtractor.js +88 -0
- package/dist/schema/JsonSchemaExtractor.js.map +1 -0
- package/dist/schema/SchemaAnalyzer.d.ts +41 -0
- package/dist/schema/SchemaAnalyzer.d.ts.map +1 -0
- package/dist/schema/SchemaAnalyzer.js +144 -0
- package/dist/schema/SchemaAnalyzer.js.map +1 -0
- package/dist/schema/SchemaExtractor.d.ts +10 -0
- package/dist/schema/SchemaExtractor.d.ts.map +1 -0
- package/dist/schema/SchemaExtractor.js +90 -0
- package/dist/schema/SchemaExtractor.js.map +1 -0
- package/dist/schema/SynonymResolver.d.ts +55 -0
- package/dist/schema/SynonymResolver.d.ts.map +1 -0
- package/dist/schema/SynonymResolver.js +121 -0
- package/dist/schema/SynonymResolver.js.map +1 -0
- package/dist/scripts/dictionary.json +796 -0
- package/dist/scripts/graph.json +664 -0
- package/dist/scripts/regenerate.d.ts +23 -0
- package/dist/scripts/regenerate.d.ts.map +1 -0
- package/dist/scripts/regenerate.js +206 -0
- package/dist/scripts/regenerate.js.map +1 -0
- package/dist/types/index.d.ts +394 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +21 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TrailParser — Désérialise des représentations externes vers un Trail
|
|
3
|
+
*
|
|
4
|
+
* Trois sources supportées :
|
|
5
|
+
*
|
|
6
|
+
* URL path → /cinema/people/Nolan/movies/Interstellar/actors
|
|
7
|
+
* URL fluent → cinema.people(Nolan).movies(Interstellar).actors
|
|
8
|
+
* JSON → SerializedTrail (via Trail.from)
|
|
9
|
+
*
|
|
10
|
+
* Le parser est stateless — toutes les méthodes sont statiques.
|
|
11
|
+
* Il ne valide pas les entités contre le graphe — c'est le rôle du moteur.
|
|
12
|
+
*/
|
|
13
|
+
import { Trail } from './Trail.js';
|
|
14
|
+
export class TrailParser {
|
|
15
|
+
// ── URL Path ───────────────────────────────────────────────
|
|
16
|
+
/**
|
|
17
|
+
* Parse un path HTTP en Trail.
|
|
18
|
+
*
|
|
19
|
+
* Convention :
|
|
20
|
+
* /entity → Frame(entity, UNRESOLVED)
|
|
21
|
+
* /entity/id → Frame(entity, id, RESOLVED)
|
|
22
|
+
* /entity/id/other → Frame(entity, id) + Frame(other, UNRESOLVED)
|
|
23
|
+
*
|
|
24
|
+
* Exemples :
|
|
25
|
+
* /people → [people?]
|
|
26
|
+
* /people/Nolan → [people(Nolan)]
|
|
27
|
+
* /people/Nolan/movies → [people(Nolan)] → [movies?]
|
|
28
|
+
* /people/Nolan/movies/2 → [people(Nolan)] → [movies(2)]
|
|
29
|
+
* /cinema/people/Nolan/movies → [cinema] → [people(Nolan)] → [movies?]
|
|
30
|
+
*
|
|
31
|
+
* @param path - URL path, avec ou sans slash initial
|
|
32
|
+
* @param init - Contextes global/user à injecter
|
|
33
|
+
*/
|
|
34
|
+
static fromPath(path, init = {}) {
|
|
35
|
+
const trail = Trail.create(init);
|
|
36
|
+
const parts = path.replace(/^\/+|\/+$/g, '').split('/').filter(Boolean);
|
|
37
|
+
let i = 0;
|
|
38
|
+
while (i < parts.length) {
|
|
39
|
+
const entity = parts[i];
|
|
40
|
+
const next = parts[i + 1];
|
|
41
|
+
// Si le prochain segment existe et n'est pas une entité connue
|
|
42
|
+
// (heuristique : commence par une lettre minuscule = entité, sinon = id)
|
|
43
|
+
const nextIsId = next !== undefined && !TrailParser.looksLikeEntity(next);
|
|
44
|
+
if (nextIsId) {
|
|
45
|
+
trail.push({ entity, id: TrailParser.coerceId(next), state: 'RESOLVED' });
|
|
46
|
+
i += 2;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
trail.push({ entity, state: 'UNRESOLVED' });
|
|
50
|
+
i += 1;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return trail;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Parse une expression fluente en Trail.
|
|
57
|
+
*
|
|
58
|
+
* Syntaxe :
|
|
59
|
+
* entity → Frame(entity, UNRESOLVED)
|
|
60
|
+
* entity(id) → Frame(entity, id, RESOLVED)
|
|
61
|
+
* entity.other → Frame(entity) + Frame(other)
|
|
62
|
+
* entity(id).other(id2) → Frame(entity,id) + Frame(other,id2)
|
|
63
|
+
*
|
|
64
|
+
* Exemples :
|
|
65
|
+
* people → [people?]
|
|
66
|
+
* people(Nolan) → [people(Nolan)]
|
|
67
|
+
* people(Nolan).movies → [people(Nolan)] → [movies?]
|
|
68
|
+
* cinema.people(Nolan).movies(2) → [cinema] → [people(Nolan)] → [movies(2)]
|
|
69
|
+
*
|
|
70
|
+
* @param expr - Expression fluente
|
|
71
|
+
* @param init - Contextes global/user à injecter
|
|
72
|
+
*/
|
|
73
|
+
static fromFluent(expr, init = {}) {
|
|
74
|
+
const trail = Trail.create(init);
|
|
75
|
+
// Tokenise : split sur les points, mais pas ceux dans les parenthèses
|
|
76
|
+
const tokens = TrailParser.tokenizeFluent(expr);
|
|
77
|
+
for (const token of tokens) {
|
|
78
|
+
const frame = TrailParser.parseToken(token);
|
|
79
|
+
trail.push(frame);
|
|
80
|
+
}
|
|
81
|
+
return trail;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Sérialise un Trail en path HTTP.
|
|
85
|
+
*
|
|
86
|
+
* Exemple :
|
|
87
|
+
* Trail([people(Nolan)][movies?]) → /people/Nolan/movies
|
|
88
|
+
*/
|
|
89
|
+
static toPath(trail) {
|
|
90
|
+
const parts = [];
|
|
91
|
+
for (const frame of trail.frames) {
|
|
92
|
+
parts.push(frame.entity);
|
|
93
|
+
if (frame.id !== undefined) {
|
|
94
|
+
parts.push(String(frame.id));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return '/' + parts.join('/');
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Sérialise un Trail en expression fluente.
|
|
101
|
+
*
|
|
102
|
+
* Exemple :
|
|
103
|
+
* Trail([people(Nolan)][movies?]) → people(Nolan).movies
|
|
104
|
+
*/
|
|
105
|
+
static toFluent(trail) {
|
|
106
|
+
return trail.frames
|
|
107
|
+
.map(f => f.id !== undefined ? `${f.entity}(${f.id})` : f.entity)
|
|
108
|
+
.join('.');
|
|
109
|
+
}
|
|
110
|
+
// ── Helpers privés ─────────────────────────────────────────
|
|
111
|
+
/**
|
|
112
|
+
* Heuristique : un segment ressemble-t-il à un nom d'entité ?
|
|
113
|
+
* Les entités commencent par une lettre minuscule et ne contiennent
|
|
114
|
+
* que des lettres, chiffres et tirets.
|
|
115
|
+
*/
|
|
116
|
+
static looksLikeEntity(segment) {
|
|
117
|
+
return /^[a-z][a-zA-Z0-9-_]*$/.test(segment);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Essaie de convertir un id en nombre, sinon garde la string.
|
|
121
|
+
*/
|
|
122
|
+
static coerceId(value) {
|
|
123
|
+
const n = Number(value);
|
|
124
|
+
return Number.isFinite(n) && value.trim() !== '' ? n : value;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Tokenise une expression fluente en segments.
|
|
128
|
+
* Préserve le contenu des parenthèses (les ids peuvent contenir des points).
|
|
129
|
+
*
|
|
130
|
+
* ex: "cinema.people(Nolan.Jr).movies"
|
|
131
|
+
* → ["cinema", "people(Nolan.Jr)", "movies"]
|
|
132
|
+
*/
|
|
133
|
+
static tokenizeFluent(expr) {
|
|
134
|
+
const tokens = [];
|
|
135
|
+
let current = '';
|
|
136
|
+
let depth = 0;
|
|
137
|
+
for (const ch of expr) {
|
|
138
|
+
if (ch === '(') {
|
|
139
|
+
depth++;
|
|
140
|
+
current += ch;
|
|
141
|
+
}
|
|
142
|
+
else if (ch === ')') {
|
|
143
|
+
depth--;
|
|
144
|
+
current += ch;
|
|
145
|
+
}
|
|
146
|
+
else if (ch === '.' && depth === 0) {
|
|
147
|
+
if (current)
|
|
148
|
+
tokens.push(current);
|
|
149
|
+
current = '';
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
current += ch;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (current)
|
|
156
|
+
tokens.push(current);
|
|
157
|
+
return tokens;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Parse un token "entity" ou "entity(id)" en Frame.
|
|
161
|
+
*/
|
|
162
|
+
static parseToken(token) {
|
|
163
|
+
const match = token.match(/^([^(]+)(?:\(([^)]*)\))?$/);
|
|
164
|
+
if (!match) {
|
|
165
|
+
// Token malformé — on le traite comme une entité sans id
|
|
166
|
+
return { entity: token, state: 'UNRESOLVED' };
|
|
167
|
+
}
|
|
168
|
+
const entity = match[1].trim();
|
|
169
|
+
const rawId = match[2];
|
|
170
|
+
if (rawId === undefined || rawId === '') {
|
|
171
|
+
return { entity, state: 'UNRESOLVED' };
|
|
172
|
+
}
|
|
173
|
+
return {
|
|
174
|
+
entity,
|
|
175
|
+
id: TrailParser.coerceId(rawId),
|
|
176
|
+
state: 'RESOLVED',
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=TrailParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TrailParser.js","sourceRoot":"","sources":["../../src/navigation/TrailParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* navigation — Exports du module de navigation
|
|
3
|
+
*/
|
|
4
|
+
export { Trail } from './Trail.js';
|
|
5
|
+
export { TrailParser } from './TrailParser.js';
|
|
6
|
+
export { NavigationEngine } from './NavigationEngine.js';
|
|
7
|
+
export { Resolver } from './Resolver.js';
|
|
8
|
+
export { Scheduler } from './Scheduler.js';
|
|
9
|
+
export type { TrailInit, SerializedTrail } from './Trail.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/navigation/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAY,YAAY,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAS,eAAe,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAQ,gBAAgB,CAAA;AAE5C,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* navigation — Exports du module de navigation
|
|
3
|
+
*/
|
|
4
|
+
export { Trail } from './Trail.js';
|
|
5
|
+
export { TrailParser } from './TrailParser.js';
|
|
6
|
+
export { NavigationEngine } from './NavigationEngine.js';
|
|
7
|
+
export { Resolver } from './Resolver.js';
|
|
8
|
+
export { Scheduler } from './Scheduler.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/navigation/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAY,YAAY,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAS,eAAe,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAQ,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MockProvider - In-memory provider for testing
|
|
3
|
+
*/
|
|
4
|
+
import type { Provider } from '../types/index.js';
|
|
5
|
+
export declare class MockProvider implements Provider {
|
|
6
|
+
private data;
|
|
7
|
+
constructor();
|
|
8
|
+
/**
|
|
9
|
+
* Set mock data for a table
|
|
10
|
+
*/
|
|
11
|
+
setData(table: string, rows: any[]): void;
|
|
12
|
+
/**
|
|
13
|
+
* Execute query (simplified parsing)
|
|
14
|
+
*/
|
|
15
|
+
query<T = any>(sql: string, params?: any[]): Promise<T[]>;
|
|
16
|
+
/**
|
|
17
|
+
* Close (no-op for mock)
|
|
18
|
+
*/
|
|
19
|
+
close(): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Clear all data
|
|
22
|
+
*/
|
|
23
|
+
clear(): void;
|
|
24
|
+
/**
|
|
25
|
+
* Get data for a table
|
|
26
|
+
*/
|
|
27
|
+
getData(table: string): any[] | undefined;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=MockProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MockProvider.d.ts","sourceRoot":"","sources":["../../src/providers/MockProvider.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAEjD,qBAAa,YAAa,YAAW,QAAQ;IAC3C,OAAO,CAAC,IAAI,CAAoB;;IAMhC;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAIzC;;OAEG;IACG,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,GAAG,EAAO,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAwBnE;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE,GAAG,SAAS;CAG1C"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MockProvider - In-memory provider for testing
|
|
3
|
+
*/
|
|
4
|
+
export class MockProvider {
|
|
5
|
+
data;
|
|
6
|
+
constructor() {
|
|
7
|
+
this.data = new Map();
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Set mock data for a table
|
|
11
|
+
*/
|
|
12
|
+
setData(table, rows) {
|
|
13
|
+
this.data.set(table, rows);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Execute query (simplified parsing)
|
|
17
|
+
*/
|
|
18
|
+
async query(sql, params = []) {
|
|
19
|
+
// Parse table name
|
|
20
|
+
const selectMatch = sql.match(/SELECT .* FROM (\w+)/i);
|
|
21
|
+
if (!selectMatch) {
|
|
22
|
+
return [];
|
|
23
|
+
}
|
|
24
|
+
const tableName = selectMatch[1];
|
|
25
|
+
const data = this.data.get(tableName) || [];
|
|
26
|
+
// Apply WHERE clause (simplified)
|
|
27
|
+
let filtered = data;
|
|
28
|
+
const whereMatch = sql.match(/WHERE (\w+) = \?/i);
|
|
29
|
+
if (whereMatch && params.length > 0) {
|
|
30
|
+
const column = whereMatch[1];
|
|
31
|
+
const value = params[0];
|
|
32
|
+
filtered = data.filter((row) => row[column] === value);
|
|
33
|
+
}
|
|
34
|
+
return filtered;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Close (no-op for mock)
|
|
38
|
+
*/
|
|
39
|
+
async close() {
|
|
40
|
+
// No-op
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Clear all data
|
|
44
|
+
*/
|
|
45
|
+
clear() {
|
|
46
|
+
this.data.clear();
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get data for a table
|
|
50
|
+
*/
|
|
51
|
+
getData(table) {
|
|
52
|
+
return this.data.get(table);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=MockProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MockProvider.js","sourceRoot":"","sources":["../../src/providers/MockProvider.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,OAAO,YAAY;IACf,IAAI,CAAoB;IAEhC;QACE,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAA;IACvB,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,KAAa,EAAE,IAAW;QAChC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IAC5B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAU,GAAW,EAAE,SAAgB,EAAE;QAClD,mBAAmB;QACnB,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAA;QACtD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,EAAE,CAAA;QACX,CAAC;QAED,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;QAE3C,kCAAkC;QAClC,IAAI,QAAQ,GAAG,IAAI,CAAA;QAEnB,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAA;QACjD,IAAI,UAAU,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA;YAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;YAEvB,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,CAAA;QAC7D,CAAC;QAED,OAAO,QAAe,CAAA;IACxB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,QAAQ;IACV,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA;IACnB,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,KAAa;QACnB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAC7B,CAAC;CACF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgresProvider - PostgreSQL database provider with JSON fallback
|
|
3
|
+
*
|
|
4
|
+
* Dual-mode: real PostgreSQL or mock JSON files
|
|
5
|
+
*/
|
|
6
|
+
import type { Provider, ProviderConfig } from '../types/index.js';
|
|
7
|
+
interface PostgresConfig extends ProviderConfig {
|
|
8
|
+
host?: string;
|
|
9
|
+
port?: number;
|
|
10
|
+
user?: string;
|
|
11
|
+
password?: string;
|
|
12
|
+
connectionString?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare class PostgresProvider implements Provider {
|
|
15
|
+
private useMock;
|
|
16
|
+
private pool;
|
|
17
|
+
private dbPath;
|
|
18
|
+
private tables;
|
|
19
|
+
constructor(config: PostgresConfig);
|
|
20
|
+
/**
|
|
21
|
+
* Load tables from JSON files (mock mode)
|
|
22
|
+
*/
|
|
23
|
+
private loadTables;
|
|
24
|
+
/**
|
|
25
|
+
* Execute query
|
|
26
|
+
*/
|
|
27
|
+
query<T = any>(sql: string, params?: any[]): Promise<T[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Execute query in mock mode
|
|
30
|
+
*/
|
|
31
|
+
private queryMock;
|
|
32
|
+
/**
|
|
33
|
+
* Close connection
|
|
34
|
+
*/
|
|
35
|
+
close(): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Save data (mock mode only)
|
|
38
|
+
*/
|
|
39
|
+
save(tableName: string, data: any[]): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Get table data (mock mode only)
|
|
42
|
+
*/
|
|
43
|
+
getTable(tableName: string): any[] | undefined;
|
|
44
|
+
}
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=PostgresProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PostgresProvider.d.ts","sourceRoot":"","sources":["../../src/providers/PostgresProvider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAMjE,UAAU,cAAe,SAAQ,cAAc;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,qBAAa,gBAAiB,YAAW,QAAQ;IAC/C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,IAAI,CAAmB;IAC/B,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,MAAM,CAAoB;gBAEtB,MAAM,EAAE,cAAc;IAiClC;;OAEG;IACH,OAAO,CAAC,UAAU;IAiBlB;;OAEG;IACG,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,GAAG,EAAO,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IA6BnE;;OAEG;YACW,SAAS;IAgCvB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B;;OAEG;IACG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAezD;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,GAAG,EAAE,GAAG,SAAS;CAO/C"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgresProvider - PostgreSQL database provider with JSON fallback
|
|
3
|
+
*
|
|
4
|
+
* Dual-mode: real PostgreSQL or mock JSON files
|
|
5
|
+
*/
|
|
6
|
+
import { ProviderError } from '../types/index.js';
|
|
7
|
+
import * as fs from 'fs';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import { Pool } from 'pg';
|
|
10
|
+
export class PostgresProvider {
|
|
11
|
+
useMock;
|
|
12
|
+
pool = null;
|
|
13
|
+
dbPath;
|
|
14
|
+
tables;
|
|
15
|
+
constructor(config) {
|
|
16
|
+
this.useMock = config.mock ?? false;
|
|
17
|
+
console.log(' useMock: ', this.useMock);
|
|
18
|
+
this.dbPath = config.database ? `./db/postgres/${config.database}` : './db/postgres';
|
|
19
|
+
this.tables = new Map();
|
|
20
|
+
if (!this.useMock) {
|
|
21
|
+
try {
|
|
22
|
+
// Try to load pg module
|
|
23
|
+
// const { Pool } = require('pg')
|
|
24
|
+
this.pool = new Pool({
|
|
25
|
+
host: config.host ?? 'localhost',
|
|
26
|
+
port: config.port ?? 5432,
|
|
27
|
+
database: config.database,
|
|
28
|
+
user: config.user ?? 'postgres',
|
|
29
|
+
password: config.password,
|
|
30
|
+
connectionString: config.connectionString
|
|
31
|
+
});
|
|
32
|
+
console.log(`🐘 Postgres connected: ${config.database}`);
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
console.warn('⚠️ pg module not found, falling back to mock mode');
|
|
36
|
+
this.useMock = true;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (this.useMock) {
|
|
40
|
+
console.log(`🐘 Postgres connected (MOCK mode): ${config.database}`);
|
|
41
|
+
this.loadTables();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Load tables from JSON files (mock mode)
|
|
46
|
+
*/
|
|
47
|
+
loadTables() {
|
|
48
|
+
if (!fs.existsSync(this.dbPath)) {
|
|
49
|
+
this.tables = new Map();
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const files = fs.readdirSync(this.dbPath);
|
|
53
|
+
for (const file of files) {
|
|
54
|
+
if (file.endsWith('.json')) {
|
|
55
|
+
const tableName = file.replace('.json', '');
|
|
56
|
+
const content = fs.readFileSync(path.join(this.dbPath, file), 'utf-8');
|
|
57
|
+
this.tables.set(tableName, JSON.parse(content));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Execute query
|
|
63
|
+
*/
|
|
64
|
+
async query(sql, params = []) {
|
|
65
|
+
if (this.useMock) {
|
|
66
|
+
return this.queryMock(sql, params);
|
|
67
|
+
}
|
|
68
|
+
if (!this.pool) {
|
|
69
|
+
throw new ProviderError('PostgreSQL pool not initialized');
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
console.log('🐘 Postgres:', sql);
|
|
73
|
+
if (params.length > 0) {
|
|
74
|
+
console.log(' Params:', params);
|
|
75
|
+
}
|
|
76
|
+
const result = await this.pool.query(sql, params);
|
|
77
|
+
console.log(`✅ Postgres result: ${result.rows.length} rows`);
|
|
78
|
+
return result.rows;
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
throw new ProviderError(`PostgreSQL query failed: ${err.message}`, {
|
|
82
|
+
sql,
|
|
83
|
+
params,
|
|
84
|
+
error: err
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Execute query in mock mode
|
|
90
|
+
*/
|
|
91
|
+
async queryMock(sql, params) {
|
|
92
|
+
console.log('🐘 Postgres:', sql);
|
|
93
|
+
if (params.length > 0) {
|
|
94
|
+
console.log(' Params:', params);
|
|
95
|
+
}
|
|
96
|
+
// Parse SQL (simplified)
|
|
97
|
+
const selectMatch = sql.match(/SELECT .* FROM (\w+)/i);
|
|
98
|
+
if (!selectMatch) {
|
|
99
|
+
console.log('✅ Postgres result (MOCK): 0 rows');
|
|
100
|
+
return [];
|
|
101
|
+
}
|
|
102
|
+
const tableName = selectMatch[1];
|
|
103
|
+
const data = this.tables.get(tableName) || [];
|
|
104
|
+
// Apply WHERE clause (simplified)
|
|
105
|
+
let filtered = data;
|
|
106
|
+
const whereMatch = sql.match(/WHERE (\w+)\.(\w+) = \$(\d+)/i);
|
|
107
|
+
if (whereMatch && params.length > 0) {
|
|
108
|
+
const column = whereMatch[2];
|
|
109
|
+
const paramIndex = parseInt(whereMatch[3]) - 1;
|
|
110
|
+
const value = params[paramIndex];
|
|
111
|
+
filtered = data.filter((row) => row[column] === value);
|
|
112
|
+
}
|
|
113
|
+
console.log(`✅ Postgres result (MOCK): ${filtered.length} rows`);
|
|
114
|
+
return filtered;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Close connection
|
|
118
|
+
*/
|
|
119
|
+
async close() {
|
|
120
|
+
if (this.pool) {
|
|
121
|
+
await this.pool.end();
|
|
122
|
+
console.log('🐘 Postgres closed');
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
console.log('🐘 Postgres closed');
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Save data (mock mode only)
|
|
130
|
+
*/
|
|
131
|
+
async save(tableName, data) {
|
|
132
|
+
if (!this.useMock) {
|
|
133
|
+
throw new ProviderError('Save only available in mock mode');
|
|
134
|
+
}
|
|
135
|
+
if (!fs.existsSync(this.dbPath)) {
|
|
136
|
+
fs.mkdirSync(this.dbPath, { recursive: true });
|
|
137
|
+
}
|
|
138
|
+
const filepath = path.join(this.dbPath, `${tableName}.json`);
|
|
139
|
+
fs.writeFileSync(filepath, JSON.stringify(data, null, 2));
|
|
140
|
+
this.tables.set(tableName, data);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Get table data (mock mode only)
|
|
144
|
+
*/
|
|
145
|
+
getTable(tableName) {
|
|
146
|
+
if (!this.useMock) {
|
|
147
|
+
throw new ProviderError('getTable only available in mock mode');
|
|
148
|
+
}
|
|
149
|
+
return this.tables.get(tableName);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=PostgresProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PostgresProvider.js","sourceRoot":"","sources":["../../src/providers/PostgresProvider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAUzB,MAAM,OAAO,gBAAgB;IACnB,OAAO,CAAS;IAChB,IAAI,GAAe,IAAI,CAAA;IACvB,MAAM,CAAQ;IACd,MAAM,CAAoB;IAElC,YAAY,MAAsB;QAChC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,IAAI,IAAI,KAAK,CAAA;QACnC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QACvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,iBAAiB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,eAAe,CAAA;QACpF,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,EAAE,CAAA;QAEvB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,wBAAwB;gBACxB,iCAAiC;gBAEjC,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC;oBACnB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,WAAW;oBAChC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI;oBACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,UAAU;oBAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;iBAC1C,CAAC,CAAA;gBAEF,OAAO,CAAC,GAAG,CAAC,0BAA0B,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;YAC1D,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAA;gBAClE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;YACrB,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,sCAAsC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;YACpE,IAAI,CAAC,UAAU,EAAE,CAAA;QACnB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,UAAU;QAChB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,EAAE,CAAA;YACvB,OAAM;QACR,CAAC;QAED,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAEzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;gBAC3C,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAA;gBACtE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAA;YACjD,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAU,GAAW,EAAE,SAAgB,EAAE;QAClD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC,SAAS,CAAI,GAAG,EAAE,MAAM,CAAC,CAAA;QACvC,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,aAAa,CAAC,iCAAiC,CAAC,CAAA;QAC5D,CAAC;QAED,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,CAAA;YAChC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;YACnC,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;YAEjD,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,CAAA;YAE5D,OAAO,MAAM,CAAC,IAAW,CAAA;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,aAAa,CAAC,4BAA6B,GAAa,CAAC,OAAO,EAAE,EAAE;gBAC5E,GAAG;gBACH,MAAM;gBACN,KAAK,EAAE,GAAG;aACX,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,SAAS,CAAU,GAAW,EAAE,MAAa;QACzD,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,CAAA;QAChC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;QACnC,CAAC;QAED,yBAAyB;QACzB,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAA;QACtD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAA;YAC/C,OAAO,EAAE,CAAA;QACX,CAAC;QAED,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;QAE7C,kCAAkC;QAClC,IAAI,QAAQ,GAAG,IAAI,CAAA;QAEnB,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAA;QAC7D,IAAI,UAAU,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA;YAC5B,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;YAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,CAAA;YAEhC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,CAAA;QAC7D,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,6BAA6B,QAAQ,CAAC,MAAM,OAAO,CAAC,CAAA;QAChE,OAAO,QAAe,CAAA;IACxB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAA;YACrB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;QACnC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;QACnC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,SAAiB,EAAE,IAAW;QACvC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,aAAa,CAAC,kCAAkC,CAAC,CAAA;QAC7D,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAChD,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,SAAS,OAAO,CAAC,CAAA;QAC5D,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QAEzD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;IAClC,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,SAAiB;QACxB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,aAAa,CAAC,sCAAsC,CAAC,CAAA;QACjE,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACnC,CAAC;CACF"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CompiledGraphEngine - Production engine using precompiled graph
|
|
3
|
+
*
|
|
4
|
+
* - O(1) route lookup
|
|
5
|
+
* - Automatic fallback
|
|
6
|
+
* - Live metrics
|
|
7
|
+
* - Hot reload support
|
|
8
|
+
*/
|
|
9
|
+
import type { CompiledGraph, Provider } from '../types/index.js';
|
|
10
|
+
interface LiveMetrics {
|
|
11
|
+
path: string[];
|
|
12
|
+
executions: number;
|
|
13
|
+
successes: number;
|
|
14
|
+
failures: number;
|
|
15
|
+
totalTime: number;
|
|
16
|
+
avgTime: number;
|
|
17
|
+
}
|
|
18
|
+
export declare class CompiledGraphEngine {
|
|
19
|
+
private compiled;
|
|
20
|
+
private provider;
|
|
21
|
+
private liveMetrics;
|
|
22
|
+
private routeCache;
|
|
23
|
+
constructor(compiled: CompiledGraph, provider: Provider);
|
|
24
|
+
/**
|
|
25
|
+
* Build fast lookup cache
|
|
26
|
+
*/
|
|
27
|
+
private buildRouteCache;
|
|
28
|
+
/**
|
|
29
|
+
* Execute query from -> to
|
|
30
|
+
*/
|
|
31
|
+
query(from: string, to: string, data?: Record<string, any>): Promise<any[]>;
|
|
32
|
+
/**
|
|
33
|
+
* Execute path with JOINs
|
|
34
|
+
*/
|
|
35
|
+
private executePath;
|
|
36
|
+
/**
|
|
37
|
+
* Find edge between nodes
|
|
38
|
+
*/
|
|
39
|
+
private findEdge;
|
|
40
|
+
/**
|
|
41
|
+
* Fallback to alternative paths
|
|
42
|
+
*/
|
|
43
|
+
private fallback;
|
|
44
|
+
/**
|
|
45
|
+
* Update live metrics
|
|
46
|
+
*/
|
|
47
|
+
private updateMetrics;
|
|
48
|
+
/**
|
|
49
|
+
* Consider promoting a fallback to primary
|
|
50
|
+
*/
|
|
51
|
+
private considerPromotion;
|
|
52
|
+
/**
|
|
53
|
+
* Get live statistics
|
|
54
|
+
*/
|
|
55
|
+
getStats(): {
|
|
56
|
+
totalExecutions: number;
|
|
57
|
+
totalSuccesses: number;
|
|
58
|
+
successRate: string;
|
|
59
|
+
avgTime: string;
|
|
60
|
+
uniquePaths: number;
|
|
61
|
+
fastest?: LiveMetrics;
|
|
62
|
+
slowest?: LiveMetrics;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Export metrics for recompilation
|
|
66
|
+
*/
|
|
67
|
+
exportMetrics(): Map<string, LiveMetrics>;
|
|
68
|
+
/**
|
|
69
|
+
* Hot reload compiled graph
|
|
70
|
+
*/
|
|
71
|
+
reload(compiled: CompiledGraph): void;
|
|
72
|
+
}
|
|
73
|
+
export {};
|
|
74
|
+
//# sourceMappingURL=CompiledGraphEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CompiledGraphEngine.d.ts","sourceRoot":"","sources":["../../src/runtime/CompiledGraphEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAA0B,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAExF,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,WAAW,CAA0B;IAC7C,OAAO,CAAC,UAAU,CAAwB;gBAE9B,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ;IAWvD;;OAEG;IACH,OAAO,CAAC,eAAe;IAWvB;;OAEG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IA4BrF;;OAEG;YACW,WAAW;IA4BzB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAKhB;;OAEG;YACW,QAAQ;IA4BtB;;OAEG;IACH,OAAO,CAAC,aAAa;IA0BrB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA4BzB;;OAEG;IACH,QAAQ,IAAI;QACV,eAAe,EAAE,MAAM,CAAA;QACvB,cAAc,EAAE,MAAM,CAAA;QACtB,WAAW,EAAE,MAAM,CAAA;QACnB,OAAO,EAAE,MAAM,CAAA;QACf,WAAW,EAAE,MAAM,CAAA;QACnB,OAAO,CAAC,EAAE,WAAW,CAAA;QACrB,OAAO,CAAC,EAAE,WAAW,CAAA;KACtB;IAgCD;;OAEG;IACH,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC;IAIzC;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;CAQtC"}
|