@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,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* api/PathBuilder.ts — Niveau 2 : exploration algorithmique
|
|
3
|
+
*
|
|
4
|
+
* Point d'entrée : graph.from(a).to(b)
|
|
5
|
+
*
|
|
6
|
+
* Surface publique :
|
|
7
|
+
* .path(strategy?) → meilleur chemin (PathResult)
|
|
8
|
+
* .paths(strategy?) → tous les chemins ordonnés (PathResult)
|
|
9
|
+
* .links → graphe de relations entre les deux nodes
|
|
10
|
+
* .execute(filters) → traversée avec hydratation de données
|
|
11
|
+
*
|
|
12
|
+
* Compile vers PathFinder (Dijkstra) + QueryEngine (données).
|
|
13
|
+
* Ne connaît pas le domaine — c'est le niveau 1 (DomainProxy) qui traduit
|
|
14
|
+
* les noms sémantiques en IDs de nodes avant d'appeler PathBuilder.
|
|
15
|
+
*/
|
|
16
|
+
import { PathFinder } from '../core/PathFinder.js';
|
|
17
|
+
import { QueryEngine } from '../runtime/QueryEngine.js';
|
|
18
|
+
import { Strategy as S } from './types.js';
|
|
19
|
+
export class PathBuilder {
|
|
20
|
+
_from;
|
|
21
|
+
_to = null;
|
|
22
|
+
_opts;
|
|
23
|
+
_graph;
|
|
24
|
+
_compiled;
|
|
25
|
+
_dataset;
|
|
26
|
+
_provider;
|
|
27
|
+
constructor(from, graph, compiled = null, dataset = null, opts = {}, provider = null) {
|
|
28
|
+
this._from = from;
|
|
29
|
+
this._graph = graph;
|
|
30
|
+
this._compiled = compiled;
|
|
31
|
+
this._dataset = dataset;
|
|
32
|
+
this._opts = opts;
|
|
33
|
+
this._provider = provider;
|
|
34
|
+
}
|
|
35
|
+
// ── Builder ────────────────────────────────────────────────────────────────
|
|
36
|
+
to(node) {
|
|
37
|
+
this._to = node;
|
|
38
|
+
return this;
|
|
39
|
+
}
|
|
40
|
+
maxPaths(n) {
|
|
41
|
+
this._opts = { ...this._opts, maxPaths: n };
|
|
42
|
+
return this;
|
|
43
|
+
}
|
|
44
|
+
via(edgeTypes) {
|
|
45
|
+
this._opts = { ...this._opts, via: edgeTypes };
|
|
46
|
+
return this;
|
|
47
|
+
}
|
|
48
|
+
minHops(n) {
|
|
49
|
+
this._opts = { ...this._opts, minHops: n };
|
|
50
|
+
return this;
|
|
51
|
+
}
|
|
52
|
+
// ── Résultats ──────────────────────────────────────────────────────────────
|
|
53
|
+
/**
|
|
54
|
+
* path(strategy?) — meilleur chemin selon la stratégie.
|
|
55
|
+
* Stratégie par défaut : Shortest (poids brut).
|
|
56
|
+
*
|
|
57
|
+
* metro: graph.from('Pigalle').to('Alesia').path(Strategy.Comfort())
|
|
58
|
+
* musicians: graph.from('Jackson').to('West').path()
|
|
59
|
+
*/
|
|
60
|
+
path(strategy) {
|
|
61
|
+
return this._findPaths(1, strategy);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* paths(strategy?) — tous les chemins ordonnés par poids.
|
|
65
|
+
*
|
|
66
|
+
* metro: graph.from('Chatelet').to('Nation').paths(Strategy.Shortest())
|
|
67
|
+
* musicians: graph.from('Pharrell').to('Kanye').paths()
|
|
68
|
+
*/
|
|
69
|
+
paths(strategy) {
|
|
70
|
+
const maxPaths = this._opts.maxPaths ?? 5;
|
|
71
|
+
return this._findPaths(maxPaths, strategy);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* links — graphe de relations entre from et to.
|
|
75
|
+
* Retourne toutes les arêtes qui participent aux chemins possibles,
|
|
76
|
+
* sans les ordonner — vue structurelle, pas navigationnelle.
|
|
77
|
+
*
|
|
78
|
+
* musicians: graph.from('Jackson').to('West').links
|
|
79
|
+
*/
|
|
80
|
+
get links() {
|
|
81
|
+
const result = this._findPaths(this._opts.maxPaths ?? 10);
|
|
82
|
+
// Collecter toutes les arêtes participant aux chemins trouvés
|
|
83
|
+
const nodeSet = new Set(result.paths.flatMap(p => p.nodes));
|
|
84
|
+
const edges = this._graph.edges.filter(e => nodeSet.has(e.from) && nodeSet.has(e.to));
|
|
85
|
+
return { ...result, edges };
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* execute(filters) — traversée avec hydratation de données.
|
|
89
|
+
* Uniquement disponible si un dataset ou provider est configuré.
|
|
90
|
+
*
|
|
91
|
+
* netflix: graph.from('movies').to('people').execute({ id: 278 })
|
|
92
|
+
* dvdrental: graph.from('customer').to('actor').execute({ id: 1 })
|
|
93
|
+
*/
|
|
94
|
+
async execute(filters = {}) {
|
|
95
|
+
if (!this._to)
|
|
96
|
+
throw new Error(`PathBuilder : .to(node) requis avant execute()`);
|
|
97
|
+
const to = this._to;
|
|
98
|
+
const start = Date.now();
|
|
99
|
+
if (!this._compiled || !this._dataset) {
|
|
100
|
+
throw new Error(`execute() nécessite un compiledGraph et un dataset.\n` +
|
|
101
|
+
`Utilisez new Graph(graphJson, { compiled, dataset }) pour activer la traversée de données.`);
|
|
102
|
+
}
|
|
103
|
+
const engine = new QueryEngine(this._compiled);
|
|
104
|
+
const data = engine.executeInMemory({ from: this._from, to, filters }, this._dataset);
|
|
105
|
+
let path = [this._from, to];
|
|
106
|
+
try {
|
|
107
|
+
const route = engine.getRoute(this._from, to);
|
|
108
|
+
path = route.primary.path;
|
|
109
|
+
}
|
|
110
|
+
catch { /* route inconnue — chemin direct */ }
|
|
111
|
+
return {
|
|
112
|
+
from: this._from,
|
|
113
|
+
to,
|
|
114
|
+
filters,
|
|
115
|
+
data,
|
|
116
|
+
path,
|
|
117
|
+
timing: Date.now() - start,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
// ── Interne ────────────────────────────────────────────────────────────────
|
|
121
|
+
_assertTo() {
|
|
122
|
+
if (!this._to)
|
|
123
|
+
throw new Error(`PathBuilder : .to(node) requis avant cette opération`);
|
|
124
|
+
}
|
|
125
|
+
_findPaths(maxPaths, strategy) {
|
|
126
|
+
if (!this._to)
|
|
127
|
+
throw new Error(`PathBuilder : .to(node) requis avant path()/paths()`);
|
|
128
|
+
const to = this._to;
|
|
129
|
+
const penalty = S.toPenalty(strategy ?? this._opts.strategy ?? S.Shortest());
|
|
130
|
+
const finder = new PathFinder(this._graph);
|
|
131
|
+
const rawPaths = finder.findAllPaths(this._from, to, maxPaths, 50, penalty, this._opts.via, this._opts.minHops ?? 0);
|
|
132
|
+
if (rawPaths.length === 0) {
|
|
133
|
+
return { from: this._from, to, found: false, paths: [] };
|
|
134
|
+
}
|
|
135
|
+
const paths = rawPaths.map(nodes => ({
|
|
136
|
+
nodes,
|
|
137
|
+
steps: this._resolveSteps(nodes),
|
|
138
|
+
weight: this._computeWeight(nodes, penalty),
|
|
139
|
+
hops: nodes.length - 1,
|
|
140
|
+
}));
|
|
141
|
+
return { from: this._from, to, found: true, paths };
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Enrichit les nodes avec labels et arêtes empruntées.
|
|
145
|
+
*/
|
|
146
|
+
_resolveSteps(nodes) {
|
|
147
|
+
const nodeMap = new Map(this._graph.nodes.map(n => [n.id, n]));
|
|
148
|
+
return nodes.map((nodeId, i) => {
|
|
149
|
+
const node = nodeMap.get(nodeId);
|
|
150
|
+
const step = {
|
|
151
|
+
node: nodeId,
|
|
152
|
+
label: node?.label ?? node?.name ?? nodeId,
|
|
153
|
+
};
|
|
154
|
+
if (i > 0) {
|
|
155
|
+
// Arête qui mène à ce node depuis le précédent
|
|
156
|
+
step.via = this._graph.edges.find(e => e.from === nodes[i - 1] && e.to === nodeId) ?? this._graph.edges.find(e => e.from === nodeId && e.to === nodes[i - 1]);
|
|
157
|
+
}
|
|
158
|
+
return step;
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Calcule le poids total d'un chemin en tenant compte de la pénalité
|
|
163
|
+
* de correspondance (changement de ligne/type d'arête).
|
|
164
|
+
*/
|
|
165
|
+
_computeWeight(nodes, transferPenalty) {
|
|
166
|
+
let weight = 0;
|
|
167
|
+
let prevEdgeType;
|
|
168
|
+
for (let i = 0; i < nodes.length - 1; i++) {
|
|
169
|
+
const edge = this._graph.edges.find(e => e.from === nodes[i] && e.to === nodes[i + 1]);
|
|
170
|
+
const w = edge ? Number(edge.weight) || 1 : 1;
|
|
171
|
+
const type = edge?.metadata?.type ?? edge?.via;
|
|
172
|
+
// Pénalité si changement de type d'arête (correspondance)
|
|
173
|
+
if (transferPenalty > 0 && prevEdgeType && type !== prevEdgeType) {
|
|
174
|
+
weight += transferPenalty;
|
|
175
|
+
}
|
|
176
|
+
weight += w;
|
|
177
|
+
prevEdgeType = type;
|
|
178
|
+
}
|
|
179
|
+
return weight;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=PathBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PathBuilder.js","sourceRoot":"","sources":["../../src/api/PathBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* api/index.ts — Re-exports du dossier api/
|
|
3
|
+
*/
|
|
4
|
+
export { Graph } from './Graph.js';
|
|
5
|
+
export { PathBuilder } from './PathBuilder.js';
|
|
6
|
+
export { Strategy, } from './types.js';
|
|
7
|
+
export type { PathResult, ResolvedPath, PathStep, QueryResult, PathBuilderOptions, } from './types.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,KAAK,EAAE,MAAa,YAAY,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAO,kBAAkB,CAAA;AAC/C,OAAO,EACL,QAAQ,GACT,MAA4B,YAAY,CAAA;AACzC,YAAY,EACV,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,kBAAkB,GACnB,MAA4B,YAAY,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,KAAK,EAAE,MAAa,YAAY,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAO,kBAAkB,CAAA;AAC/C,OAAO,EACL,QAAQ,GACT,MAA4B,YAAY,CAAA"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* loadGraph.ts — Factory universelle pour charger un graphe LinkLab
|
|
3
|
+
*
|
|
4
|
+
* Point d'entrée recommandé pour 80% des cas.
|
|
5
|
+
* Déduit le mode de chargement depuis le paramètre source et l'environnement.
|
|
6
|
+
*
|
|
7
|
+
* Usage :
|
|
8
|
+
* // Node — fichier local
|
|
9
|
+
* const cinema = await loadGraph('./cinema.json', { provider })
|
|
10
|
+
*
|
|
11
|
+
* // Browser ou Node — URL HTTP
|
|
12
|
+
* const cinema = await loadGraph('https://cdn.example.com/cinema.json', { provider })
|
|
13
|
+
*
|
|
14
|
+
* // Données déjà en mémoire (tests, browser, injection)
|
|
15
|
+
* const cinema = await loadGraph({ compiled }, { provider })
|
|
16
|
+
*
|
|
17
|
+
* Convention fichiers (Node) :
|
|
18
|
+
* cinema.json ← graphe compilé (requis)
|
|
19
|
+
* cinema.reference.json ← graphe brut (optionnel — chargé automatiquement)
|
|
20
|
+
* cinema.override.json ← surcharges dev (optionnel — chargé automatiquement)
|
|
21
|
+
*
|
|
22
|
+
* new Graph() reste disponible pour les niveaux 2/3 et les tests unitaires.
|
|
23
|
+
*/
|
|
24
|
+
import { Graph } from './Graph.js';
|
|
25
|
+
import type { GraphOptions } from './Graph.js';
|
|
26
|
+
import type { Graph as GraphData, CompiledGraph } from '../types/index.js';
|
|
27
|
+
/** Source du graphe compilé */
|
|
28
|
+
export type GraphSource = string | GraphSourceObject;
|
|
29
|
+
export interface GraphSourceObject {
|
|
30
|
+
compiled: CompiledGraph;
|
|
31
|
+
reference?: GraphData;
|
|
32
|
+
overrides?: Record<string, any>;
|
|
33
|
+
}
|
|
34
|
+
/** Options de loadGraph — étend GraphOptions */
|
|
35
|
+
export interface LoadGraphOptions extends Omit<GraphOptions, 'compiled'> {
|
|
36
|
+
/** Surcharge le chemin du graphe de référence (optionnel) */
|
|
37
|
+
reference?: string;
|
|
38
|
+
/** Surcharge le chemin des overrides (optionnel) */
|
|
39
|
+
overrides?: string;
|
|
40
|
+
/** Dossier contenant les fichiers JSON de données {entity}.json (mode local) */
|
|
41
|
+
dataDir?: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* loadGraph — charge un graphe LinkLab depuis n'importe quelle source.
|
|
45
|
+
*
|
|
46
|
+
* Retourne directement le proxy sémantique (niveau 1) — prêt à naviguer.
|
|
47
|
+
* Pour accéder au Graph sous-jacent (niveaux 2/3/4) : domain.graph
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* const cinema = await loadGraph('./cinema.json', { provider })
|
|
51
|
+
* await cinema.directors('Nolan').movies
|
|
52
|
+
* cinema.graph.from('movies').to('people').path() // niveau 2
|
|
53
|
+
*/
|
|
54
|
+
export declare function loadGraph(source: GraphSource, options?: LoadGraphOptions): Promise<ReturnType<Graph['domain']>>;
|
|
55
|
+
/** Alias — même API, nom plus court pour les imports fréquents */
|
|
56
|
+
export { loadGraph as graph };
|
|
57
|
+
//# sourceMappingURL=loadGraph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadGraph.d.ts","sourceRoot":"","sources":["../../src/api/loadGraph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,KAAK,EAAE,KAAK,IAAI,SAAS,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAI1E,+BAA+B;AAC/B,MAAM,MAAM,WAAW,GACnB,MAAM,GACN,iBAAiB,CAAA;AAErB,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAI,aAAa,CAAA;IACzB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAChC;AAED,gDAAgD;AAChD,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC;IACtE,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gFAAgF;IAChF,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAwDD;;;;;;;;;;GAUG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAG,WAAW,EACpB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAkFtC;AAID,kEAAkE;AAClE,OAAO,EAAE,SAAS,IAAI,KAAK,EAAE,CAAA"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* loadGraph.ts — Factory universelle pour charger un graphe LinkLab
|
|
3
|
+
*
|
|
4
|
+
* Point d'entrée recommandé pour 80% des cas.
|
|
5
|
+
* Déduit le mode de chargement depuis le paramètre source et l'environnement.
|
|
6
|
+
*
|
|
7
|
+
* Usage :
|
|
8
|
+
* // Node — fichier local
|
|
9
|
+
* const cinema = await loadGraph('./cinema.json', { provider })
|
|
10
|
+
*
|
|
11
|
+
* // Browser ou Node — URL HTTP
|
|
12
|
+
* const cinema = await loadGraph('https://cdn.example.com/cinema.json', { provider })
|
|
13
|
+
*
|
|
14
|
+
* // Données déjà en mémoire (tests, browser, injection)
|
|
15
|
+
* const cinema = await loadGraph({ compiled }, { provider })
|
|
16
|
+
*
|
|
17
|
+
* Convention fichiers (Node) :
|
|
18
|
+
* cinema.json ← graphe compilé (requis)
|
|
19
|
+
* cinema.reference.json ← graphe brut (optionnel — chargé automatiquement)
|
|
20
|
+
* cinema.override.json ← surcharges dev (optionnel — chargé automatiquement)
|
|
21
|
+
*
|
|
22
|
+
* new Graph() reste disponible pour les niveaux 2/3 et les tests unitaires.
|
|
23
|
+
*/
|
|
24
|
+
import { Graph } from './Graph.js';
|
|
25
|
+
// ── Détection environnement ────────────────────────────────────────────────────
|
|
26
|
+
const IS_NODE = typeof process !== 'undefined' && !!process.versions?.node;
|
|
27
|
+
const IS_BROWSER = typeof globalThis.window !== 'undefined';
|
|
28
|
+
// ── Chargement JSON ────────────────────────────────────────────────────────────
|
|
29
|
+
async function loadJSON(source) {
|
|
30
|
+
// URL HTTP/HTTPS → fetch (universel)
|
|
31
|
+
if (source.startsWith('http://') || source.startsWith('https://')) {
|
|
32
|
+
const res = await fetch(source);
|
|
33
|
+
if (!res.ok)
|
|
34
|
+
throw new Error(`loadGraph: HTTP ${res.status} — ${source}`);
|
|
35
|
+
return res.json();
|
|
36
|
+
}
|
|
37
|
+
// Chemin fichier → Node uniquement
|
|
38
|
+
if (IS_NODE) {
|
|
39
|
+
const { createRequire } = await import('module');
|
|
40
|
+
const { fileURLToPath } = await import('url');
|
|
41
|
+
const pathModule = await import('path');
|
|
42
|
+
const fsModule = await import('fs');
|
|
43
|
+
// Résoudre le chemin depuis cwd
|
|
44
|
+
const resolved = pathModule.default.resolve(source);
|
|
45
|
+
if (!fsModule.default.existsSync(resolved))
|
|
46
|
+
return null;
|
|
47
|
+
// createRequire depuis cwd pour les JSON
|
|
48
|
+
const req = createRequire(pathModule.default.join(process.cwd(), 'noop.js'));
|
|
49
|
+
return req(resolved);
|
|
50
|
+
}
|
|
51
|
+
throw new Error(`loadGraph: chemin fichier non supporté dans ce contexte — utiliser une URL HTTP`);
|
|
52
|
+
}
|
|
53
|
+
/** Derive les chemins convention depuis un chemin de base */
|
|
54
|
+
function deriveConventionPaths(basePath) {
|
|
55
|
+
// './cinema.json' → base = './cinema'
|
|
56
|
+
// './cinema' → base = './cinema'
|
|
57
|
+
const base = basePath.replace(/\.json$/i, '');
|
|
58
|
+
return {
|
|
59
|
+
compiled: `${base}.json`,
|
|
60
|
+
reference: `${base}.reference.gen.json`,
|
|
61
|
+
overrides: `${base}.override.json`,
|
|
62
|
+
dictionary: `${base}.dictionary.gen.json`,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
// ── Factory principale ────────────────────────────────────────────────────────
|
|
66
|
+
/**
|
|
67
|
+
* loadGraph — charge un graphe LinkLab depuis n'importe quelle source.
|
|
68
|
+
*
|
|
69
|
+
* Retourne directement le proxy sémantique (niveau 1) — prêt à naviguer.
|
|
70
|
+
* Pour accéder au Graph sous-jacent (niveaux 2/3/4) : domain.graph
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* const cinema = await loadGraph('./cinema.json', { provider })
|
|
74
|
+
* await cinema.directors('Nolan').movies
|
|
75
|
+
* cinema.graph.from('movies').to('people').path() // niveau 2
|
|
76
|
+
*/
|
|
77
|
+
export async function loadGraph(source, options = {}) {
|
|
78
|
+
let compiled;
|
|
79
|
+
let reference = null;
|
|
80
|
+
let overrides = null;
|
|
81
|
+
let dictionary = null;
|
|
82
|
+
// ── Source objet en mémoire ────────────────────────────────────────────────
|
|
83
|
+
if (typeof source === 'object') {
|
|
84
|
+
compiled = source.compiled;
|
|
85
|
+
reference = source.reference ?? null;
|
|
86
|
+
overrides = source.overrides ?? null;
|
|
87
|
+
}
|
|
88
|
+
// ── Source string (chemin ou URL) ─────────────────────────────────────────
|
|
89
|
+
else {
|
|
90
|
+
const isURL = source.startsWith('http://') || source.startsWith('https://');
|
|
91
|
+
if (isURL) {
|
|
92
|
+
// URL directe — pas de convention (on ne peut pas deviner les URLs sœurs)
|
|
93
|
+
compiled = await loadJSON(source);
|
|
94
|
+
if (!compiled)
|
|
95
|
+
throw new Error(`loadGraph: impossible de charger ${source}`);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
// Chemin fichier — convention {name}.json + {name}.reference.json + {name}.override.json
|
|
99
|
+
const paths = deriveConventionPaths(source);
|
|
100
|
+
compiled = await loadJSON(options.reference ? source : paths.compiled);
|
|
101
|
+
if (!compiled)
|
|
102
|
+
throw new Error(`loadGraph: graphe introuvable — ${paths.compiled}`);
|
|
103
|
+
// Référence (optionnel — chargé silencieusement)
|
|
104
|
+
const refPath = options.reference ?? paths.reference;
|
|
105
|
+
reference = await loadJSON(refPath); // null si absent
|
|
106
|
+
// Overrides (optionnel — chargé silencieusement)
|
|
107
|
+
const ovPath = options.overrides ?? paths.overrides;
|
|
108
|
+
overrides = await loadJSON(ovPath); // null si absent
|
|
109
|
+
// Dictionnaire résolu (optionnel — labels humains des routes)
|
|
110
|
+
dictionary = await loadJSON(paths.dictionary); // null si absent
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// ── Charger dataset depuis dataDir ────────────────────────────────────────
|
|
114
|
+
let dataset = options.dataset ?? null;
|
|
115
|
+
if (!dataset && options.dataDir && IS_NODE) {
|
|
116
|
+
const pathModule = await import('path');
|
|
117
|
+
const fsModule = await import('fs');
|
|
118
|
+
const { createRequire } = await import('module');
|
|
119
|
+
const req = createRequire(pathModule.default.join(process.cwd(), 'noop.js'));
|
|
120
|
+
const dataDirAbs = pathModule.default.resolve(options.dataDir);
|
|
121
|
+
dataset = {};
|
|
122
|
+
for (const node of compiled.nodes) {
|
|
123
|
+
const file = pathModule.default.join(dataDirAbs, `${node.id}.json`);
|
|
124
|
+
if (fsModule.default.existsSync(file))
|
|
125
|
+
dataset[node.id] = req(file);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// ── Appliquer les overrides sur le compilé ─────────────────────────────────
|
|
129
|
+
// TODO : deepMerge(compiled, overrides) quand ADR-0008 sera implémenté
|
|
130
|
+
if (overrides && IS_NODE && process.env.LINKLAB_DEBUG) {
|
|
131
|
+
console.warn('[loadGraph] overrides chargés mais pas encore appliqués (ADR-0008 pending)');
|
|
132
|
+
}
|
|
133
|
+
// ── Construire le Graph (niveau bas) ──────────────────────────────────────
|
|
134
|
+
const rawGraph = reference ?? {
|
|
135
|
+
nodes: compiled.nodes,
|
|
136
|
+
edges: [],
|
|
137
|
+
};
|
|
138
|
+
const { compiled: _c, reference: _r, overrides: _o, dataDir: _d, dataset: _ds, ...graphOptions } = options;
|
|
139
|
+
const graph = new Graph(rawGraph, {
|
|
140
|
+
...graphOptions,
|
|
141
|
+
compiled,
|
|
142
|
+
...(dataset ? { dataset } : {}),
|
|
143
|
+
...(dictionary ? { dictionary } : {}),
|
|
144
|
+
});
|
|
145
|
+
// ── Retourner le domain directement ───────────────────────────────────────
|
|
146
|
+
// loadGraph() retourne le proxy sémantique (niveau 1) — pas le Graph brut.
|
|
147
|
+
// Accès au Graph sous-jacent via : const g = domain.graph
|
|
148
|
+
return graph.domain();
|
|
149
|
+
}
|
|
150
|
+
// ── Export de commodité ────────────────────────────────────────────────────────
|
|
151
|
+
/** Alias — même API, nom plus court pour les imports fréquents */
|
|
152
|
+
export { loadGraph as graph };
|
|
153
|
+
//# sourceMappingURL=loadGraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadGraph.js","sourceRoot":"","sources":["../../src/api/loadGraph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* test-api.ts — Validation niveau 2 sur les 3 exemples
|
|
3
|
+
*
|
|
4
|
+
* Couvre les deux familles :
|
|
5
|
+
* A) Pathfinding pur — metro, musicians (pas de données)
|
|
6
|
+
* B) Navigation data — netflix (compiled + dataset)
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=test-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-api.d.ts","sourceRoot":"","sources":["../../src/api/test-api.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* test-api.ts — Validation niveau 2 sur les 3 exemples
|
|
3
|
+
*
|
|
4
|
+
* Couvre les deux familles :
|
|
5
|
+
* A) Pathfinding pur — metro, musicians (pas de données)
|
|
6
|
+
* B) Navigation data — netflix (compiled + dataset)
|
|
7
|
+
*/
|
|
8
|
+
import { createRequire } from 'module';
|
|
9
|
+
import { fileURLToPath } from 'url';
|
|
10
|
+
import path from 'path';
|
|
11
|
+
import { Graph, Strategy } from './index.js';
|
|
12
|
+
const require = createRequire(import.meta.url);
|
|
13
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
14
|
+
const root = path.join(__dirname, '..');
|
|
15
|
+
// ── Helpers ──────────────────────────────────────────────────────────────────
|
|
16
|
+
const ok = (label) => console.log(` ✅ ${label}`);
|
|
17
|
+
const err = (label, e) => console.log(` ❌ ${label}: ${e?.message ?? e}`);
|
|
18
|
+
const sep = (title) => console.log(`\n${'─'.repeat(50)}\n${title}`);
|
|
19
|
+
// ── Famille A : Pathfinding pur ───────────────────────────────────────────────
|
|
20
|
+
sep('METRO — Pathfinding pur');
|
|
21
|
+
try {
|
|
22
|
+
const metro = new Graph(require(`${root}/examples/metro/graph.json`));
|
|
23
|
+
// Chemin optimal (Shortest)
|
|
24
|
+
const r1 = metro.from('Station-chatelet').to('Station-opera').path();
|
|
25
|
+
r1.found && r1.paths[0].hops > 0
|
|
26
|
+
? ok(`Châtelet→Opéra : ${r1.paths[0].hops} saut(s), poids=${r1.paths[0].weight}`)
|
|
27
|
+
: err('Châtelet→Opéra', 'chemin non trouvé');
|
|
28
|
+
// Mode confort — pénalise les correspondances
|
|
29
|
+
const r2 = metro.from('Station-republique').to('Station-bastille')
|
|
30
|
+
.paths(Strategy.Comfort());
|
|
31
|
+
r2.found
|
|
32
|
+
? ok(`République→Bastille Comfort : ${r2.paths.length} chemins`)
|
|
33
|
+
: err('République→Bastille', 'non trouvé');
|
|
34
|
+
// Mode LeastHops
|
|
35
|
+
const r3 = metro.from('Station-gare-du-nord').to('Station-montparnasse-bienvenue')
|
|
36
|
+
.path(Strategy.LeastHops());
|
|
37
|
+
r3.found
|
|
38
|
+
? ok(`GdN→Montparnasse LeastHops : ${r3.paths[0].hops} sauts`)
|
|
39
|
+
: err('GdN→Montparnasse', 'non trouvé');
|
|
40
|
+
// Introspection
|
|
41
|
+
console.log(`\n graph.entities : ${metro.entities.length} nodes`);
|
|
42
|
+
console.log(` graph.relations : ${metro.relations.length} arêtes`);
|
|
43
|
+
const types = Object.keys(metro.schema);
|
|
44
|
+
console.log(` graph.schema : types = [${types.join(', ')}]`);
|
|
45
|
+
}
|
|
46
|
+
catch (e) {
|
|
47
|
+
err('Metro init', e);
|
|
48
|
+
}
|
|
49
|
+
sep('MUSICIANS — Pathfinding avec via + minHops');
|
|
50
|
+
try {
|
|
51
|
+
const music = new Graph(require(`${root}/examples/musicians/graph.json`));
|
|
52
|
+
// Chaîne sampling Will Smith → Manu Dibango
|
|
53
|
+
const r1 = music.from('artist-will-smith').to('artist-manu-dibango')
|
|
54
|
+
.paths();
|
|
55
|
+
r1.found
|
|
56
|
+
? ok(`Will Smith→Manu Dibango : ${r1.paths.length} chemin(s), meilleur=${r1.paths[0].hops} sauts`)
|
|
57
|
+
: err('Will Smith→Manu Dibango', 'non trouvé');
|
|
58
|
+
// Chemin d'influence James Brown → Kanye avec minHops
|
|
59
|
+
const builder = music.from('artist-james-brown', { minHops: 1 })
|
|
60
|
+
.to('artist-kanye-west');
|
|
61
|
+
const r2 = builder.paths();
|
|
62
|
+
r2.found
|
|
63
|
+
? ok(`James Brown→Kanye (minHops=1) : ${r2.paths.length} chemin(s)`)
|
|
64
|
+
: err('James Brown→Kanye', 'non trouvé');
|
|
65
|
+
// .links — vue structurelle
|
|
66
|
+
const l = music.from('artist-daft-punk').to('artist-kanye-west').links;
|
|
67
|
+
l.found
|
|
68
|
+
? ok(`.links Daft Punk↔Kanye : ${l.edges.length} arêtes dans le sous-graphe`)
|
|
69
|
+
: err('.links', 'non trouvé');
|
|
70
|
+
// Steps enrichis — labels lisibles
|
|
71
|
+
if (r1.found && r1.paths[0].steps.length > 0) {
|
|
72
|
+
const labels = r1.paths[0].steps.map(s => s.label ?? s.node).join(' → ');
|
|
73
|
+
ok(`Steps : ${labels}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch (e) {
|
|
77
|
+
err('Musicians init', e);
|
|
78
|
+
}
|
|
79
|
+
sep('NETFLIX — Navigation avec données');
|
|
80
|
+
try {
|
|
81
|
+
const compiled = require(`${root}/examples/netflix/compiled-graph.json`);
|
|
82
|
+
const movies = require(`${root}/scenarios/test-netflix/data/movies.json`);
|
|
83
|
+
const credits = require(`${root}/scenarios/test-netflix/data/credits.json`);
|
|
84
|
+
const people = require(`${root}/scenarios/test-netflix/data/people.json`);
|
|
85
|
+
const netflix = new Graph(require(`${root}/scenarios/test-netflix/graph.json`), { compiled, dataset: { movies, credits, people } });
|
|
86
|
+
// Traversée movies → people via execute()
|
|
87
|
+
const r1 = await netflix.from('movies').to('people').execute({ id: 278 });
|
|
88
|
+
r1.data.length > 0
|
|
89
|
+
? ok(`movies(278)→people : ${r1.data.length} personnes en ${r1.timing}ms, path=${r1.path.join('→')}`)
|
|
90
|
+
: err('movies→people', 'data vide');
|
|
91
|
+
// Traversée people → movies
|
|
92
|
+
const r2 = await netflix.from('people').to('movies').execute({ id: 4027 });
|
|
93
|
+
r2.data.length > 0
|
|
94
|
+
? ok(`people(4027)→movies : ${r2.data.length} films (${r2.data.map((m) => m.title).join(', ')})`)
|
|
95
|
+
: err('people→movies', 'data vide');
|
|
96
|
+
// path() fonctionne aussi (sans données)
|
|
97
|
+
const r3 = netflix.from('movies').to('people').path();
|
|
98
|
+
r3.found
|
|
99
|
+
? ok(`path() movies→people : ${r3.paths[0].nodes.join('→')}`)
|
|
100
|
+
: err('path() movies→people', 'non trouvé');
|
|
101
|
+
// Introspection
|
|
102
|
+
console.log(`\n graph.entities : ${netflix.entities.length} nodes`);
|
|
103
|
+
console.log(` graph.weights : ${Object.keys(netflix.weights).length} arêtes pondérées`);
|
|
104
|
+
}
|
|
105
|
+
catch (e) {
|
|
106
|
+
err('Netflix init', e);
|
|
107
|
+
}
|
|
108
|
+
sep('NIVEAU 4 — Maintenance');
|
|
109
|
+
try {
|
|
110
|
+
const music = new Graph(require(`${root}/examples/musicians/graph.json`));
|
|
111
|
+
// weight().set()
|
|
112
|
+
const edge = music.relations.find(e => e.name);
|
|
113
|
+
const g2 = music.weight(edge.name).set(99);
|
|
114
|
+
const before = music.weights[edge.name];
|
|
115
|
+
const after = g2.weights[edge.name];
|
|
116
|
+
before !== after && after === 99
|
|
117
|
+
? ok(`weight('${edge.name}').set(99) : ${before} → ${after}`)
|
|
118
|
+
: err('weight.set', `${before} → ${after}`);
|
|
119
|
+
// Immuabilité — le graph original n'est pas modifié
|
|
120
|
+
music.weights[edge.name] === before
|
|
121
|
+
? ok(`Immuabilité préservée : original = ${before}`)
|
|
122
|
+
: err('Immuabilité', 'graph original modifié');
|
|
123
|
+
// snapshot()
|
|
124
|
+
const snap = music.snapshot();
|
|
125
|
+
snap.graph && !snap.compiled
|
|
126
|
+
? ok(`snapshot() : graph OK, compiled=null (pas de compile())`)
|
|
127
|
+
: err('snapshot', JSON.stringify(snap));
|
|
128
|
+
}
|
|
129
|
+
catch (e) {
|
|
130
|
+
err('Niveau 4', e);
|
|
131
|
+
}
|
|
132
|
+
console.log('\n' + '─'.repeat(50));
|
|
133
|
+
//# sourceMappingURL=test-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-api.js","sourceRoot":"","sources":["../../src/api/test-api.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,IAAI,MAAmB,MAAM,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,OAAO,GAAK,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAChD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAC9D,MAAM,IAAI,GAAQ,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;AAE5C,gFAAgF;AAEhF,MAAM,EAAE,GAAI,CAAC,KAAa,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,EAAE,CAAC,CAAA;AAC1D,MAAM,GAAG,GAAG,CAAC,KAAa,EAAE,CAAM,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,KAAK,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC,CAAA;AACtF,MAAM,GAAG,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,CAAA;AAE3E,iFAAiF;AAEjF,GAAG,CAAC,yBAAyB,CAAC,CAAA;AAC9B,IAAI,CAAC;IACH,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,IAAI,4BAA4B,CAAC,CAAC,CAAA;IAErE,4BAA4B;IAC5B,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,IAAI,EAAE,CAAA;IACpE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;QAC9B,CAAC,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,mBAAmB,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACjF,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,CAAA;IAE9C,8CAA8C;IAC9C,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,kBAAkB,CAAC;SACpD,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;IACvC,EAAE,CAAC,KAAK;QACN,CAAC,CAAC,EAAE,CAAC,iCAAiC,EAAE,CAAC,KAAK,CAAC,MAAM,UAAU,CAAC;QAChE,CAAC,CAAC,GAAG,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAAA;IAE5C,iBAAiB;IACjB,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,gCAAgC,CAAC;SACpE,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAA;IACxC,EAAE,CAAC,KAAK;QACN,CAAC,CAAC,EAAE,CAAC,gCAAgC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;QAC9D,CAAC,CAAC,GAAG,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAA;IAEzC,gBAAgB;IAChB,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,CAAC,QAAQ,CAAC,MAAM,QAAQ,CAAC,CAAA;IACnE,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,CAAC,SAAS,CAAC,MAAM,SAAS,CAAC,CAAA;IACnE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IACvC,OAAO,CAAC,GAAG,CAAC,gCAAgC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAElE,CAAC;AAAC,OAAM,CAAC,EAAE,CAAC;IAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAA;AAAC,CAAC;AAEnC,GAAG,CAAC,4CAA4C,CAAC,CAAA;AACjD,IAAI,CAAC;IACH,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,IAAI,gCAAgC,CAAC,CAAC,CAAA;IAEzE,4CAA4C;IAC5C,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,qBAAqB,CAAC;SACtD,KAAK,EAAE,CAAA;IACrB,EAAE,CAAC,KAAK;QACN,CAAC,CAAC,EAAE,CAAC,6BAA6B,EAAE,CAAC,KAAK,CAAC,MAAM,wBAAwB,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;QAClG,CAAC,CAAC,GAAG,CAAC,yBAAyB,EAAE,YAAY,CAAC,CAAA;IAEhD,sDAAsD;IACtD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;SAC1C,EAAE,CAAC,mBAAmB,CAAC,CAAA;IAC7C,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAA;IAC1B,EAAE,CAAC,KAAK;QACN,CAAC,CAAC,EAAE,CAAC,mCAAmC,EAAE,CAAC,KAAK,CAAC,MAAM,YAAY,CAAC;QACpE,CAAC,CAAC,GAAG,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAA;IAE1C,4BAA4B;IAC5B,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,KAAK,CAAA;IACtE,CAAC,CAAC,KAAK;QACL,CAAC,CAAC,EAAE,CAAC,4BAA4B,CAAC,CAAC,KAAK,CAAC,MAAM,6BAA6B,CAAC;QAC7E,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;IAE/B,mCAAmC;IACnC,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACxE,EAAE,CAAC,WAAW,MAAM,EAAE,CAAC,CAAA;IACzB,CAAC;AAEH,CAAC;AAAC,OAAM,CAAC,EAAE,CAAC;IAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAA;AAAC,CAAC;AAEvC,GAAG,CAAC,mCAAmC,CAAC,CAAA;AACxC,IAAI,CAAC;IACH,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,IAAI,uCAAuC,CAAC,CAAA;IACxE,MAAM,MAAM,GAAK,OAAO,CAAC,GAAG,IAAI,0CAA0C,CAAC,CAAA;IAC3E,MAAM,OAAO,GAAI,OAAO,CAAC,GAAG,IAAI,2CAA2C,CAAC,CAAA;IAC5E,MAAM,MAAM,GAAK,OAAO,CAAC,GAAG,IAAI,0CAA0C,CAAC,CAAA;IAE3E,MAAM,OAAO,GAAG,IAAI,KAAK,CACvB,OAAO,CAAC,GAAG,IAAI,oCAAoC,CAAC,EACpD,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CACnD,CAAA;IAED,0CAA0C;IAC1C,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;IACzE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;QAChB,CAAC,CAAC,EAAE,CAAC,wBAAwB,EAAE,CAAC,IAAI,CAAC,MAAM,iBAAiB,EAAE,CAAC,MAAM,YAAY,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACrG,CAAC,CAAC,GAAG,CAAC,eAAe,EAAE,WAAW,CAAC,CAAA;IAErC,4BAA4B;IAC5B,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IAC1E,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;QAChB,CAAC,CAAC,EAAE,CAAC,yBAAyB,EAAE,CAAC,IAAI,CAAC,MAAM,WAAY,EAAE,CAAC,IAAc,CAAC,GAAG,CAAC,CAAC,CAAK,EAAC,EAAE,CAAA,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QAC9G,CAAC,CAAC,GAAG,CAAC,eAAe,EAAE,WAAW,CAAC,CAAA;IAErC,yCAAyC;IACzC,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAA;IACrD,EAAE,CAAC,KAAK;QACN,CAAC,CAAC,EAAE,CAAC,0BAA0B,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7D,CAAC,CAAC,GAAG,CAAC,sBAAsB,EAAE,YAAY,CAAC,CAAA;IAE7C,gBAAgB;IAChB,OAAO,CAAC,GAAG,CAAC,yBAAyB,OAAO,CAAC,QAAQ,CAAC,MAAM,QAAQ,CAAC,CAAA;IACrE,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,mBAAmB,CAAC,CAAA;AAE5F,CAAC;AAAC,OAAM,CAAC,EAAE,CAAC;IAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,CAAA;AAAC,CAAC;AAErC,GAAG,CAAC,wBAAwB,CAAC,CAAA;AAC7B,IAAI,CAAC;IACH,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,IAAI,gCAAgC,CAAC,CAAC,CAAA;IAEzE,iBAAiB;IACjB,MAAM,IAAI,GAAK,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAE,CAAA;IACjD,MAAM,EAAE,GAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC/C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAK,CAAC,CAAA;IACxC,MAAM,KAAK,GAAI,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAK,CAAC,CAAA;IACrC,MAAM,KAAK,KAAK,IAAI,KAAK,KAAK,EAAE;QAC9B,CAAC,CAAC,EAAE,CAAC,WAAW,IAAI,CAAC,IAAI,gBAAgB,MAAM,MAAM,KAAK,EAAE,CAAC;QAC7D,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,MAAM,MAAM,KAAK,EAAE,CAAC,CAAA;IAE7C,oDAAoD;IACpD,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAK,CAAC,KAAK,MAAM;QAClC,CAAC,CAAC,EAAE,CAAC,sCAAsC,MAAM,EAAE,CAAC;QACpD,CAAC,CAAC,GAAG,CAAC,aAAa,EAAE,wBAAwB,CAAC,CAAA;IAEhD,aAAa;IACb,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAA;IAC7B,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ;QAC1B,CAAC,CAAC,EAAE,CAAC,yDAAyD,CAAC;QAC/D,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;AAE3C,CAAC;AAAC,OAAM,CAAC,EAAE,CAAC;IAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;AAAC,CAAC;AAEjC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* test-domain.ts — Validation niveau 1 : DomainProxy
|
|
3
|
+
*
|
|
4
|
+
* Couvre :
|
|
5
|
+
* - Accès propriété simple cinema.movies
|
|
6
|
+
* - Filtre par ID (number) cinema.people(278)
|
|
7
|
+
* - Filtre par objet cinema.people({ id: 278 })
|
|
8
|
+
* - Traversée thenable await cinema.people(278).movies
|
|
9
|
+
* - Fetch direct await cinema.movies
|
|
10
|
+
* - Chaînage profond await cinema.people(278).movies (depth 2)
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=test-domain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-domain.d.ts","sourceRoot":"","sources":["../../src/api/test-domain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|