@linklabjs/core 0.1.0 → 0.1.1
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,105 @@
|
|
|
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
|
+
import { createRequire } from 'module';
|
|
13
|
+
import { fileURLToPath } from 'url';
|
|
14
|
+
import path from 'path';
|
|
15
|
+
import { Graph } from './index.js';
|
|
16
|
+
const require = createRequire(import.meta.url);
|
|
17
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
18
|
+
const root = path.join(__dirname, '..');
|
|
19
|
+
const ok = (label) => console.log(` ✅ ${label}`);
|
|
20
|
+
const err = (label, detail) => console.log(` ❌ ${label}: ${detail?.message ?? JSON.stringify(detail)}`);
|
|
21
|
+
const sep = (t) => console.log(`\n${'─'.repeat(50)}\n${t}`);
|
|
22
|
+
// ── Setup Netflix ─────────────────────────────────────────────────────────────
|
|
23
|
+
const compiled = require(`${root}/examples/netflix/compiled-graph.json`);
|
|
24
|
+
const movies = require(`${root}/scenarios/test-netflix/data/movies.json`);
|
|
25
|
+
const credits = require(`${root}/scenarios/test-netflix/data/credits.json`);
|
|
26
|
+
const people = require(`${root}/scenarios/test-netflix/data/people.json`);
|
|
27
|
+
const cinema = new Graph(require(`${root}/scenarios/test-netflix/graph.json`), { compiled, dataset: { movies, credits, people } }).domain();
|
|
28
|
+
sep('NIVEAU 1 — Fetch direct (depth 1)');
|
|
29
|
+
try {
|
|
30
|
+
// await cinema.movies → tous les films
|
|
31
|
+
const r1 = await cinema.movies;
|
|
32
|
+
r1.data.length > 0
|
|
33
|
+
? ok(`await cinema.movies → ${r1.data.length} films`)
|
|
34
|
+
: err('cinema.movies', 'vide');
|
|
35
|
+
// await cinema.people → toutes les personnes
|
|
36
|
+
const r2 = await cinema.people;
|
|
37
|
+
r2.data.length > 0
|
|
38
|
+
? ok(`await cinema.people → ${r2.data.length} personnes`)
|
|
39
|
+
: err('cinema.people', 'vide');
|
|
40
|
+
// await cinema.movies(278) → un seul film
|
|
41
|
+
const r3 = await cinema.movies(278);
|
|
42
|
+
r3.data.length === 1 && r3.data[0].title === 'Les Évadés'
|
|
43
|
+
? ok(`await cinema.movies(278) → "${r3.data[0].title}"`)
|
|
44
|
+
: err('cinema.movies(278)', r3.data);
|
|
45
|
+
// await cinema.people(4027) → Frank Darabont
|
|
46
|
+
const r4 = await cinema.people(4027);
|
|
47
|
+
r4.data.length === 1 && r4.data[0].name === 'Frank Darabont'
|
|
48
|
+
? ok(`await cinema.people(4027) → "${r4.data[0].name}"`)
|
|
49
|
+
: err('cinema.people(4027)', r4.data);
|
|
50
|
+
// Filtre par objet
|
|
51
|
+
const r5 = await cinema.people({ id: 4027 });
|
|
52
|
+
r5.data.length === 1
|
|
53
|
+
? ok(`await cinema.people({ id: 4027 }) → "${r5.data[0].name}"`)
|
|
54
|
+
: err('cinema.people({id:4027})', r5.data);
|
|
55
|
+
}
|
|
56
|
+
catch (e) {
|
|
57
|
+
err('Depth 1', e);
|
|
58
|
+
}
|
|
59
|
+
sep('NIVEAU 1 — Traversée (depth 2)');
|
|
60
|
+
try {
|
|
61
|
+
// await cinema.people(4027).movies → filmographie Darabont
|
|
62
|
+
const r1 = await cinema.people(4027).movies;
|
|
63
|
+
r1.data.length >= 2
|
|
64
|
+
? ok(`await cinema.people(4027).movies → ${r1.data.length} films : ${r1.data.map((m) => m.title).join(', ')}`)
|
|
65
|
+
: err('cinema.people(4027).movies', `${r1.data.length} films`);
|
|
66
|
+
// await cinema.movies(278).people → cast des Évadés
|
|
67
|
+
const r2 = await cinema.movies(278).people;
|
|
68
|
+
r2.data.length >= 10
|
|
69
|
+
? ok(`await cinema.movies(278).people → ${r2.data.length} personnes`)
|
|
70
|
+
: err('cinema.movies(278).people', `${r2.data.length}`);
|
|
71
|
+
// Trail path
|
|
72
|
+
r1.path.length > 1
|
|
73
|
+
? ok(`path: ${r1.path.join('→')}`)
|
|
74
|
+
: err('path', r1.path);
|
|
75
|
+
}
|
|
76
|
+
catch (e) {
|
|
77
|
+
err('Depth 2', e);
|
|
78
|
+
}
|
|
79
|
+
sep('NIVEAU 1 — Clé sémantique (string filter)');
|
|
80
|
+
try {
|
|
81
|
+
// await cinema.movies('Les Évadés') → via title
|
|
82
|
+
// Le semantic_key pour movies devrait être 'title'
|
|
83
|
+
const r1 = await cinema.movies({ title: 'Les Évadés' });
|
|
84
|
+
r1.data.length === 1
|
|
85
|
+
? ok(`await cinema.movies({ title: 'Les Évadés' }) → id=${r1.data[0].id}`)
|
|
86
|
+
: err('cinema.movies({title})', `${r1.data.length} résultats`);
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
err('Semantic key', e);
|
|
90
|
+
}
|
|
91
|
+
sep('NIVEAU 1 — Musicians (nodes par type)');
|
|
92
|
+
try {
|
|
93
|
+
const music = new Graph(require(`${root}/examples/musicians/graph.json`)).domain();
|
|
94
|
+
// Les musicians ont type='artist' — pas de données, juste des nodes
|
|
95
|
+
// cinema.artists → devrait résoudre le type 'artist'
|
|
96
|
+
const node = music.artists;
|
|
97
|
+
node !== undefined
|
|
98
|
+
? ok(`cinema.artists → DomainNode résolu (entity=${node.entity})`)
|
|
99
|
+
: err('cinema.artists', 'undefined');
|
|
100
|
+
}
|
|
101
|
+
catch (e) {
|
|
102
|
+
err('Musicians domain', e);
|
|
103
|
+
}
|
|
104
|
+
console.log('\n' + '─'.repeat(50));
|
|
105
|
+
//# sourceMappingURL=test-domain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-domain.js","sourceRoot":"","sources":["../../src/api/test-domain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* api/types.ts — Types publics de l'API LinkLab niveau 2+
|
|
3
|
+
*
|
|
4
|
+
* Ces types sont la surface visible pour les utilisateurs du moteur.
|
|
5
|
+
* Les types internes (CompiledGraph, RouteInfo, etc.) restent dans types/index.ts.
|
|
6
|
+
*/
|
|
7
|
+
import type { GraphEdge } from '../types/index.js';
|
|
8
|
+
/**
|
|
9
|
+
* Strategy — comment Dijkstra pondère les chemins.
|
|
10
|
+
*
|
|
11
|
+
* Shortest : poids brut des arêtes — temps pur, distance minimale
|
|
12
|
+
* Comfort : pénalité par correspondance (+8 unités) — moins de changements
|
|
13
|
+
* LeastHops : favorise les chemins avec peu d'étapes
|
|
14
|
+
* Custom(n) : pénalité explicite par correspondance
|
|
15
|
+
*/
|
|
16
|
+
export type Strategy = {
|
|
17
|
+
type: 'Shortest';
|
|
18
|
+
} | {
|
|
19
|
+
type: 'Comfort';
|
|
20
|
+
} | {
|
|
21
|
+
type: 'LeastHops';
|
|
22
|
+
} | {
|
|
23
|
+
type: 'Custom';
|
|
24
|
+
transferPenalty: number;
|
|
25
|
+
};
|
|
26
|
+
export declare const Strategy: {
|
|
27
|
+
readonly Shortest: () => Strategy;
|
|
28
|
+
readonly Comfort: () => Strategy;
|
|
29
|
+
readonly LeastHops: () => Strategy;
|
|
30
|
+
readonly Custom: (transferPenalty: number) => Strategy;
|
|
31
|
+
readonly toPenalty: (s: Strategy) => number;
|
|
32
|
+
};
|
|
33
|
+
export interface PathStep {
|
|
34
|
+
node: string;
|
|
35
|
+
label?: string;
|
|
36
|
+
via?: GraphEdge;
|
|
37
|
+
}
|
|
38
|
+
export interface ResolvedPath {
|
|
39
|
+
nodes: string[];
|
|
40
|
+
steps: PathStep[];
|
|
41
|
+
weight: number;
|
|
42
|
+
hops: number;
|
|
43
|
+
}
|
|
44
|
+
export interface PathResult {
|
|
45
|
+
from: string;
|
|
46
|
+
to: string;
|
|
47
|
+
found: boolean;
|
|
48
|
+
paths: ResolvedPath[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* QueryResult — retourné par PathBuilder.execute()
|
|
52
|
+
* Uniquement en mode données (netflix, dvdrental) — pas pour metro/musicians.
|
|
53
|
+
*/
|
|
54
|
+
export interface QueryResult<T = Record<string, any>> {
|
|
55
|
+
from: string;
|
|
56
|
+
to: string;
|
|
57
|
+
filters: Record<string, any>;
|
|
58
|
+
data: T[];
|
|
59
|
+
path: string[];
|
|
60
|
+
timing: number;
|
|
61
|
+
}
|
|
62
|
+
export interface PathBuilderOptions {
|
|
63
|
+
maxPaths?: number;
|
|
64
|
+
minHops?: number;
|
|
65
|
+
maxHops?: number;
|
|
66
|
+
via?: string[];
|
|
67
|
+
strategy?: Strategy;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAIlD;;;;;;;GAOG;AACH,MAAM,MAAM,QAAQ,GAChB;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CAAA;AAG/C,eAAO,MAAM,QAAQ;6BACJ,QAAQ;4BACR,QAAQ;8BACR,QAAQ;uCACM,MAAM,KAAG,QAAQ;4BAEjC,QAAQ,KAAG,MAAM;CAQtB,CAAA;AAIV,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAI,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAI,SAAS,CAAA;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAG,MAAM,EAAE,CAAA;IAChB,KAAK,EAAG,QAAQ,EAAE,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAI,MAAM,CAAA;CACf;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAG,MAAM,CAAA;IACb,EAAE,EAAK,MAAM,CAAA;IACb,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,EAAE,YAAY,EAAE,CAAA;CACtB;AAID;;;GAGG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAClD,IAAI,EAAK,MAAM,CAAA;IACf,EAAE,EAAO,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC5B,IAAI,EAAK,CAAC,EAAE,CAAA;IACZ,IAAI,EAAK,MAAM,EAAE,CAAA;IACjB,MAAM,EAAG,MAAM,CAAA;CAChB;AAID,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAG,MAAM,CAAA;IAClB,OAAO,CAAC,EAAI,MAAM,CAAA;IAClB,OAAO,CAAC,EAAI,MAAM,CAAA;IAClB,GAAG,CAAC,EAAQ,MAAM,EAAE,CAAA;IACpB,QAAQ,CAAC,EAAG,QAAQ,CAAA;CACrB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* api/types.ts — Types publics de l'API LinkLab niveau 2+
|
|
3
|
+
*
|
|
4
|
+
* Ces types sont la surface visible pour les utilisateurs du moteur.
|
|
5
|
+
* Les types internes (CompiledGraph, RouteInfo, etc.) restent dans types/index.ts.
|
|
6
|
+
*/
|
|
7
|
+
// Factories — évitent les objets littéraux à l'usage
|
|
8
|
+
export const Strategy = {
|
|
9
|
+
Shortest: () => ({ type: 'Shortest' }),
|
|
10
|
+
Comfort: () => ({ type: 'Comfort' }),
|
|
11
|
+
LeastHops: () => ({ type: 'LeastHops' }),
|
|
12
|
+
Custom: (transferPenalty) => ({ type: 'Custom', transferPenalty }),
|
|
13
|
+
toPenalty(s) {
|
|
14
|
+
switch (s.type) {
|
|
15
|
+
case 'Shortest': return 0;
|
|
16
|
+
case 'Comfort': return 8;
|
|
17
|
+
case 'LeastHops': return 50;
|
|
18
|
+
case 'Custom': return s.transferPenalty;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoBH,qDAAqD;AACrD,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,QAAQ,EAAG,GAAa,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IACjD,OAAO,EAAI,GAAa,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAChD,SAAS,EAAE,GAAa,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAClD,MAAM,EAAK,CAAC,eAAuB,EAAY,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;IAEvF,SAAS,CAAC,CAAW;QACnB,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;YACf,KAAK,UAAU,CAAC,CAAE,OAAO,CAAC,CAAA;YAC1B,KAAK,SAAS,CAAC,CAAG,OAAO,CAAC,CAAA;YAC1B,KAAK,WAAW,CAAC,CAAC,OAAO,EAAE,CAAA;YAC3B,KAAK,QAAQ,CAAC,CAAI,OAAO,CAAC,CAAC,eAAe,CAAA;QAC5C,CAAC;IACH,CAAC;CACO,CAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": "Singular → plural irregular mappings for FK resolution. Used by JsonSchemaExtractor to resolve *Id columns to their target table. Add project-specific synonyms in examples/<project>/synonyms.json.",
|
|
3
|
+
"person": "people",
|
|
4
|
+
"man": "men",
|
|
5
|
+
"woman": "women",
|
|
6
|
+
"child": "children",
|
|
7
|
+
"company": "companies",
|
|
8
|
+
"category": "categories",
|
|
9
|
+
"country": "countries",
|
|
10
|
+
"city": "cities",
|
|
11
|
+
"currency": "currencies",
|
|
12
|
+
"industry": "industries",
|
|
13
|
+
"activity": "activities",
|
|
14
|
+
"facility": "facilities",
|
|
15
|
+
"capability": "capabilities",
|
|
16
|
+
"authority": "authorities",
|
|
17
|
+
"community": "communities",
|
|
18
|
+
"datum": "data",
|
|
19
|
+
"medium": "media",
|
|
20
|
+
"criterion": "criteria",
|
|
21
|
+
"phenomenon": "phenomena",
|
|
22
|
+
"analysis": "analyses",
|
|
23
|
+
"basis": "bases",
|
|
24
|
+
"thesis": "theses"
|
|
25
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EventBus — Bus générique pour hooks, events et errors
|
|
3
|
+
*
|
|
4
|
+
* Trois bus distincts, trois contrats clairs :
|
|
5
|
+
*
|
|
6
|
+
* HookBus — awaitable, peut modifier/annuler le flux
|
|
7
|
+
* EventBus — fire-and-forget, observationnel, ne bloque pas
|
|
8
|
+
* ErrorBus — synchrone, jamais silencieux
|
|
9
|
+
*
|
|
10
|
+
* Usage :
|
|
11
|
+
* const bus = new EventBus<MyEvents>()
|
|
12
|
+
* bus.on('traversal.complete', handler)
|
|
13
|
+
* bus.emit('traversal.complete', data)
|
|
14
|
+
* bus.off('traversal.complete', handler)
|
|
15
|
+
*/
|
|
16
|
+
export type Handler<T = any> = (data: T) => void;
|
|
17
|
+
export type AsyncHandler<T = any, R = T | void> = (data: T) => Promise<R> | R;
|
|
18
|
+
export declare class EventBus<TEvents extends Record<string, any> = Record<string, any>> {
|
|
19
|
+
private handlers;
|
|
20
|
+
on<K extends keyof TEvents & string>(event: K, handler: Handler<TEvents[K]>): () => void;
|
|
21
|
+
off<K extends keyof TEvents & string>(event: K, handler: Handler<TEvents[K]>): void;
|
|
22
|
+
emit<K extends keyof TEvents & string>(event: K, data: TEvents[K]): void;
|
|
23
|
+
clear(event?: string): void;
|
|
24
|
+
listenerCount(event: string): number;
|
|
25
|
+
}
|
|
26
|
+
export interface HookResult<T> {
|
|
27
|
+
value: T;
|
|
28
|
+
cancelled?: boolean;
|
|
29
|
+
reason?: string;
|
|
30
|
+
}
|
|
31
|
+
export declare class HookBus<THooks extends Record<string, any> = Record<string, any>> {
|
|
32
|
+
private handlers;
|
|
33
|
+
on<K extends keyof THooks & string>(hook: K, handler: AsyncHandler<THooks[K]>): () => void;
|
|
34
|
+
off<K extends keyof THooks & string>(hook: K, handler: AsyncHandler<THooks[K]>): void;
|
|
35
|
+
/**
|
|
36
|
+
* Appelle les handlers en séquence.
|
|
37
|
+
* Chaque handler peut retourner une valeur modifiée — elle est passée au suivant.
|
|
38
|
+
* Si un handler retourne { cancelled: true }, la chaîne s'arrête.
|
|
39
|
+
*/
|
|
40
|
+
call<K extends keyof THooks & string>(hook: K, data: THooks[K]): Promise<HookResult<THooks[K]>>;
|
|
41
|
+
listenerCount(hook: string): number;
|
|
42
|
+
}
|
|
43
|
+
export declare class ErrorBus<TErrors extends Record<string, any> = Record<string, any>> {
|
|
44
|
+
private handlers;
|
|
45
|
+
private fallback?;
|
|
46
|
+
/**
|
|
47
|
+
* Handler de fallback si aucun handler n'est enregistré pour cette erreur.
|
|
48
|
+
* Par défaut : console.error.
|
|
49
|
+
*/
|
|
50
|
+
setFallback(fn: (event: string, data: any) => void): void;
|
|
51
|
+
on<K extends keyof TErrors & string>(event: K, handler: Handler<TErrors[K]>): () => void;
|
|
52
|
+
off<K extends keyof TErrors & string>(event: K, handler: Handler<TErrors[K]>): void;
|
|
53
|
+
emit<K extends keyof TErrors & string>(event: K, data: TErrors[K]): void;
|
|
54
|
+
listenerCount(event: string): number;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=EventBus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventBus.d.ts","sourceRoot":"","sources":["../../src/core/EventBus.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EventBus — Bus générique pour hooks, events et errors
|
|
3
|
+
*
|
|
4
|
+
* Trois bus distincts, trois contrats clairs :
|
|
5
|
+
*
|
|
6
|
+
* HookBus — awaitable, peut modifier/annuler le flux
|
|
7
|
+
* EventBus — fire-and-forget, observationnel, ne bloque pas
|
|
8
|
+
* ErrorBus — synchrone, jamais silencieux
|
|
9
|
+
*
|
|
10
|
+
* Usage :
|
|
11
|
+
* const bus = new EventBus<MyEvents>()
|
|
12
|
+
* bus.on('traversal.complete', handler)
|
|
13
|
+
* bus.emit('traversal.complete', data)
|
|
14
|
+
* bus.off('traversal.complete', handler)
|
|
15
|
+
*/
|
|
16
|
+
// ── EventBus — fire-and-forget ────────────────────────────────
|
|
17
|
+
export class EventBus {
|
|
18
|
+
handlers = new Map();
|
|
19
|
+
on(event, handler) {
|
|
20
|
+
if (!this.handlers.has(event)) {
|
|
21
|
+
this.handlers.set(event, new Set());
|
|
22
|
+
}
|
|
23
|
+
this.handlers.get(event).add(handler);
|
|
24
|
+
// Retourne une fonction de désinscription
|
|
25
|
+
return () => this.off(event, handler);
|
|
26
|
+
}
|
|
27
|
+
off(event, handler) {
|
|
28
|
+
this.handlers.get(event)?.delete(handler);
|
|
29
|
+
}
|
|
30
|
+
emit(event, data) {
|
|
31
|
+
const handlers = this.handlers.get(event);
|
|
32
|
+
if (!handlers?.size)
|
|
33
|
+
return;
|
|
34
|
+
// Fire-and-forget — les erreurs dans les handlers ne propagent pas
|
|
35
|
+
for (const handler of handlers) {
|
|
36
|
+
try {
|
|
37
|
+
handler(data);
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
console.error(`[EventBus] Handler error on "${event}":`, err);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
clear(event) {
|
|
45
|
+
if (event) {
|
|
46
|
+
this.handlers.delete(event);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
this.handlers.clear();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
listenerCount(event) {
|
|
53
|
+
return this.handlers.get(event)?.size ?? 0;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export class HookBus {
|
|
57
|
+
handlers = new Map();
|
|
58
|
+
on(hook, handler) {
|
|
59
|
+
if (!this.handlers.has(hook)) {
|
|
60
|
+
this.handlers.set(hook, []);
|
|
61
|
+
}
|
|
62
|
+
this.handlers.get(hook).push(handler);
|
|
63
|
+
return () => this.off(hook, handler);
|
|
64
|
+
}
|
|
65
|
+
off(hook, handler) {
|
|
66
|
+
const list = this.handlers.get(hook);
|
|
67
|
+
if (!list)
|
|
68
|
+
return;
|
|
69
|
+
const idx = list.indexOf(handler);
|
|
70
|
+
if (idx !== -1)
|
|
71
|
+
list.splice(idx, 1);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Appelle les handlers en séquence.
|
|
75
|
+
* Chaque handler peut retourner une valeur modifiée — elle est passée au suivant.
|
|
76
|
+
* Si un handler retourne { cancelled: true }, la chaîne s'arrête.
|
|
77
|
+
*/
|
|
78
|
+
async call(hook, data) {
|
|
79
|
+
const handlers = this.handlers.get(hook);
|
|
80
|
+
if (!handlers?.length)
|
|
81
|
+
return { value: data };
|
|
82
|
+
let current = data;
|
|
83
|
+
for (const handler of handlers) {
|
|
84
|
+
const result = await handler(current);
|
|
85
|
+
// Si le handler retourne un objet avec cancelled, on stoppe
|
|
86
|
+
if (result && typeof result === 'object' && 'cancelled' in result && result.cancelled) {
|
|
87
|
+
return { value: current, cancelled: true, reason: result.reason };
|
|
88
|
+
}
|
|
89
|
+
// Si le handler retourne une valeur, elle remplace le contexte courant
|
|
90
|
+
if (result !== undefined && result !== null) {
|
|
91
|
+
current = result;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return { value: current };
|
|
95
|
+
}
|
|
96
|
+
listenerCount(hook) {
|
|
97
|
+
return this.handlers.get(hook)?.length ?? 0;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// ── ErrorBus — synchrone, jamais silencieux ──────────────────
|
|
101
|
+
export class ErrorBus {
|
|
102
|
+
handlers = new Map();
|
|
103
|
+
fallback;
|
|
104
|
+
/**
|
|
105
|
+
* Handler de fallback si aucun handler n'est enregistré pour cette erreur.
|
|
106
|
+
* Par défaut : console.error.
|
|
107
|
+
*/
|
|
108
|
+
setFallback(fn) {
|
|
109
|
+
this.fallback = fn;
|
|
110
|
+
}
|
|
111
|
+
on(event, handler) {
|
|
112
|
+
if (!this.handlers.has(event)) {
|
|
113
|
+
this.handlers.set(event, new Set());
|
|
114
|
+
}
|
|
115
|
+
this.handlers.get(event).add(handler);
|
|
116
|
+
return () => this.off(event, handler);
|
|
117
|
+
}
|
|
118
|
+
off(event, handler) {
|
|
119
|
+
this.handlers.get(event)?.delete(handler);
|
|
120
|
+
}
|
|
121
|
+
emit(event, data) {
|
|
122
|
+
const handlers = this.handlers.get(event);
|
|
123
|
+
if (!handlers?.size) {
|
|
124
|
+
// Jamais silencieux — fallback ou console.error
|
|
125
|
+
if (this.fallback) {
|
|
126
|
+
this.fallback(event, data);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
console.error(`[LinkLab Error] ${event}:`, data);
|
|
130
|
+
}
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
for (const handler of handlers) {
|
|
134
|
+
try {
|
|
135
|
+
handler(data);
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
// Les erreurs dans les error handlers ne doivent jamais être avalées
|
|
139
|
+
console.error(`[ErrorBus] Handler threw on "${event}":`, err);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
listenerCount(event) {
|
|
144
|
+
return this.handlers.get(event)?.size ?? 0;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=EventBus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventBus.js","sourceRoot":"","sources":["../../src/core/EventBus.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphEvents — Catalogue des événements LinkLab
|
|
3
|
+
*
|
|
4
|
+
* Trois bus, trois contrats :
|
|
5
|
+
*
|
|
6
|
+
* graph.hooks — awaitable, enrichit ou annule le flux
|
|
7
|
+
* graph.events — fire-and-forget, observation pure
|
|
8
|
+
* graph.errors — synchrone, jamais silencieux
|
|
9
|
+
*
|
|
10
|
+
* Conventions de nommage :
|
|
11
|
+
* hooks : <sujet>.<moment> ex: traversal.before, access.check
|
|
12
|
+
* events : <sujet>.<résultat> ex: traversal.complete, cache.miss
|
|
13
|
+
* errors : <sujet>.<type> ex: route.notfound, traversal.failed
|
|
14
|
+
*/
|
|
15
|
+
import { HookBus, EventBus, ErrorBus } from './EventBus.js';
|
|
16
|
+
import type { Frame, GraphEdge, NavigationPath, Graph } from '../types/index.js';
|
|
17
|
+
export interface TraversalBeforePayload {
|
|
18
|
+
from: string;
|
|
19
|
+
to: string;
|
|
20
|
+
stack: Frame[];
|
|
21
|
+
graph: Graph;
|
|
22
|
+
}
|
|
23
|
+
export interface TraversalStepPayload {
|
|
24
|
+
node: string;
|
|
25
|
+
edge: GraphEdge;
|
|
26
|
+
stack: Frame[];
|
|
27
|
+
depth: number;
|
|
28
|
+
}
|
|
29
|
+
export interface AccessCheckPayload {
|
|
30
|
+
node: string;
|
|
31
|
+
stack: Frame[];
|
|
32
|
+
context?: Record<string, any>;
|
|
33
|
+
}
|
|
34
|
+
export interface StackPushPayload {
|
|
35
|
+
frame: Frame;
|
|
36
|
+
stack: Frame[];
|
|
37
|
+
}
|
|
38
|
+
export interface StackPopPayload {
|
|
39
|
+
frame: Frame;
|
|
40
|
+
stack: Frame[];
|
|
41
|
+
}
|
|
42
|
+
export interface TraversalCompletePayload {
|
|
43
|
+
from: string;
|
|
44
|
+
to: string;
|
|
45
|
+
path: NavigationPath;
|
|
46
|
+
durationMs: number;
|
|
47
|
+
stackDepth: number;
|
|
48
|
+
routeUsed: string;
|
|
49
|
+
routeWeight: number;
|
|
50
|
+
resultCount?: number;
|
|
51
|
+
}
|
|
52
|
+
export interface CacheMissPayload {
|
|
53
|
+
key: string;
|
|
54
|
+
requestedAt: number;
|
|
55
|
+
}
|
|
56
|
+
export interface CacheHitPayload {
|
|
57
|
+
key: string;
|
|
58
|
+
accessCount: number;
|
|
59
|
+
cachedAt?: number;
|
|
60
|
+
}
|
|
61
|
+
export interface WeightUpdatedPayload {
|
|
62
|
+
edge: string;
|
|
63
|
+
previousWeight: number;
|
|
64
|
+
newWeight: number;
|
|
65
|
+
reason?: string;
|
|
66
|
+
}
|
|
67
|
+
export interface StackCompactedPayload {
|
|
68
|
+
before: Frame[];
|
|
69
|
+
after: Frame[];
|
|
70
|
+
removedCount: number;
|
|
71
|
+
}
|
|
72
|
+
export interface RouteNotFoundPayload {
|
|
73
|
+
from: string;
|
|
74
|
+
to: string;
|
|
75
|
+
stack: Frame[];
|
|
76
|
+
}
|
|
77
|
+
export interface TraversalFailedPayload {
|
|
78
|
+
from: string;
|
|
79
|
+
to: string;
|
|
80
|
+
reason: string;
|
|
81
|
+
error?: Error;
|
|
82
|
+
}
|
|
83
|
+
export interface HookTimeoutPayload {
|
|
84
|
+
hook: string;
|
|
85
|
+
timeoutMs: number;
|
|
86
|
+
}
|
|
87
|
+
export interface AccessDeniedPayload {
|
|
88
|
+
node: string;
|
|
89
|
+
reason: string;
|
|
90
|
+
stack: Frame[];
|
|
91
|
+
}
|
|
92
|
+
export interface GraphHooks {
|
|
93
|
+
'traversal.before': TraversalBeforePayload;
|
|
94
|
+
'traversal.step': TraversalStepPayload;
|
|
95
|
+
'access.check': AccessCheckPayload;
|
|
96
|
+
'stack.push': StackPushPayload;
|
|
97
|
+
'stack.pop': StackPopPayload;
|
|
98
|
+
}
|
|
99
|
+
export interface GraphEventMap {
|
|
100
|
+
'traversal.complete': TraversalCompletePayload;
|
|
101
|
+
'cache.miss': CacheMissPayload;
|
|
102
|
+
'cache.hit': CacheHitPayload;
|
|
103
|
+
'weight.updated': WeightUpdatedPayload;
|
|
104
|
+
'stack.compacted': StackCompactedPayload;
|
|
105
|
+
}
|
|
106
|
+
export interface GraphErrors {
|
|
107
|
+
'route.notfound': RouteNotFoundPayload;
|
|
108
|
+
'traversal.failed': TraversalFailedPayload;
|
|
109
|
+
'hook.timeout': HookTimeoutPayload;
|
|
110
|
+
'access.denied': AccessDeniedPayload;
|
|
111
|
+
}
|
|
112
|
+
export interface GraphBuses {
|
|
113
|
+
hooks: HookBus<GraphHooks>;
|
|
114
|
+
events: EventBus<GraphEventMap>;
|
|
115
|
+
errors: ErrorBus<GraphErrors>;
|
|
116
|
+
}
|
|
117
|
+
export declare function createGraphBuses(): GraphBuses;
|
|
118
|
+
//# sourceMappingURL=GraphEvents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GraphEvents.d.ts","sourceRoot":"","sources":["../../src/core/GraphEvents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphEvents — Catalogue des événements LinkLab
|
|
3
|
+
*
|
|
4
|
+
* Trois bus, trois contrats :
|
|
5
|
+
*
|
|
6
|
+
* graph.hooks — awaitable, enrichit ou annule le flux
|
|
7
|
+
* graph.events — fire-and-forget, observation pure
|
|
8
|
+
* graph.errors — synchrone, jamais silencieux
|
|
9
|
+
*
|
|
10
|
+
* Conventions de nommage :
|
|
11
|
+
* hooks : <sujet>.<moment> ex: traversal.before, access.check
|
|
12
|
+
* events : <sujet>.<résultat> ex: traversal.complete, cache.miss
|
|
13
|
+
* errors : <sujet>.<type> ex: route.notfound, traversal.failed
|
|
14
|
+
*/
|
|
15
|
+
import { HookBus, EventBus, ErrorBus } from './EventBus.js';
|
|
16
|
+
export function createGraphBuses() {
|
|
17
|
+
return {
|
|
18
|
+
hooks: new HookBus(),
|
|
19
|
+
events: new EventBus(),
|
|
20
|
+
errors: new ErrorBus(),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=GraphEvents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GraphEvents.js","sourceRoot":"","sources":["../../src/core/GraphEvents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAmI3D,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,KAAK,EAAG,IAAI,OAAO,EAAc;QACjC,MAAM,EAAE,IAAI,QAAQ,EAAiB;QACrC,MAAM,EAAE,IAAI,QAAQ,EAAe;KACpC,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PathFinder - Dijkstra + DFS limité
|
|
3
|
+
*
|
|
4
|
+
* Deux algorithmes selon l'usage :
|
|
5
|
+
*
|
|
6
|
+
* findShortestPath() → Dijkstra (chemin optimal garanti, performant)
|
|
7
|
+
* findAllPaths() → DFS limité (N meilleurs chemins alternatifs)
|
|
8
|
+
*
|
|
9
|
+
* Sur un graphe de métro (300+ stations, 900+ arêtes),
|
|
10
|
+
* le DFS pur explose. Dijkstra est l'algorithme correct.
|
|
11
|
+
*/
|
|
12
|
+
import type { Graph, Path, PathDetails } from '../types/index.js';
|
|
13
|
+
export declare class PathFinder {
|
|
14
|
+
private graph;
|
|
15
|
+
private adjacencyList;
|
|
16
|
+
constructor(graph: Graph);
|
|
17
|
+
/**
|
|
18
|
+
* Chemin le plus court par poids (Dijkstra).
|
|
19
|
+
* Garanti optimal. Performant sur grands graphes.
|
|
20
|
+
*/
|
|
21
|
+
findShortestPath(from: string, to: string): PathDetails | null;
|
|
22
|
+
/**
|
|
23
|
+
* N meilleurs chemins (Yen's K-shortest paths simplifié).
|
|
24
|
+
* Trouve le plus court via Dijkstra, puis des alternatives
|
|
25
|
+
* en pénalisant les arêtes du chemin précédent.
|
|
26
|
+
*/
|
|
27
|
+
findAllPaths(from: string, to: string, maxPaths?: number, _maxDepth?: number, transferPenalty?: number, allowedVia?: string[], minHops?: number): Path[];
|
|
28
|
+
/**
|
|
29
|
+
* Dijkstra avec exclusion d'arêtes (pour les chemins alternatifs)
|
|
30
|
+
*/
|
|
31
|
+
private dijkstraWithExclusions;
|
|
32
|
+
getPathWeight(path: Path): number;
|
|
33
|
+
getPathDetails(path: Path): PathDetails;
|
|
34
|
+
hasPath(from: string, to: string): boolean;
|
|
35
|
+
getReachableNodes(from: string, maxDepth?: number): Set<string>;
|
|
36
|
+
private buildAdjacencyList;
|
|
37
|
+
getStats(): {
|
|
38
|
+
nodes: number;
|
|
39
|
+
edges: number;
|
|
40
|
+
avgDegree: number;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=PathFinder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PathFinder.d.ts","sourceRoot":"","sources":["../../src/core/PathFinder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAa,IAAI,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE5E,qBAAa,UAAU;IAGT,OAAO,CAAC,KAAK;IAFzB,OAAO,CAAC,aAAa,CAAqD;gBAEtD,KAAK,EAAE,KAAK;IAMhC;;;OAGG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IA0E9D;;;;OAIG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,SAAI,EAAE,SAAS,SAAK,EAAE,eAAe,SAAI,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,SAAI,GAAG,IAAI,EAAE;IAoBrI;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA4F9B,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM;IASjC,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW;IAevC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO;IAI1C,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAK,GAAG,GAAG,CAAC,MAAM,CAAC;IAc3D,OAAO,CAAC,kBAAkB;IAU1B,QAAQ;;;;;CAST"}
|