@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.
Files changed (206) hide show
  1. package/dist/api/DomainNode.d.ts +154 -0
  2. package/dist/api/DomainNode.d.ts.map +1 -0
  3. package/dist/api/DomainNode.js +1157 -0
  4. package/dist/api/DomainNode.js.map +1 -0
  5. package/dist/api/Graph.d.ts +117 -0
  6. package/dist/api/Graph.d.ts.map +1 -0
  7. package/dist/api/Graph.js +212 -0
  8. package/dist/api/Graph.js.map +1 -0
  9. package/dist/api/PathBuilder.d.ts +76 -0
  10. package/dist/api/PathBuilder.d.ts.map +1 -0
  11. package/dist/api/PathBuilder.js +182 -0
  12. package/dist/api/PathBuilder.js.map +1 -0
  13. package/dist/api/index.d.ts +8 -0
  14. package/dist/api/index.d.ts.map +1 -0
  15. package/dist/api/index.js +7 -0
  16. package/dist/api/index.js.map +1 -0
  17. package/dist/api/loadGraph.d.ts +57 -0
  18. package/dist/api/loadGraph.d.ts.map +1 -0
  19. package/dist/api/loadGraph.js +153 -0
  20. package/dist/api/loadGraph.js.map +1 -0
  21. package/dist/api/test-api.d.ts +9 -0
  22. package/dist/api/test-api.d.ts.map +1 -0
  23. package/dist/api/test-api.js +133 -0
  24. package/dist/api/test-api.js.map +1 -0
  25. package/dist/api/test-domain.d.ts +13 -0
  26. package/dist/api/test-domain.d.ts.map +1 -0
  27. package/dist/api/test-domain.js +105 -0
  28. package/dist/api/test-domain.js.map +1 -0
  29. package/dist/api/types.d.ts +69 -0
  30. package/dist/api/types.d.ts.map +1 -0
  31. package/dist/api/types.js +22 -0
  32. package/dist/api/types.js.map +1 -0
  33. package/dist/config/synonyms.json +25 -0
  34. package/dist/core/EventBus.d.ts +56 -0
  35. package/dist/core/EventBus.d.ts.map +1 -0
  36. package/dist/core/EventBus.js +147 -0
  37. package/dist/core/EventBus.js.map +1 -0
  38. package/dist/core/GraphEvents.d.ts +118 -0
  39. package/dist/core/GraphEvents.d.ts.map +1 -0
  40. package/dist/core/GraphEvents.js +23 -0
  41. package/dist/core/GraphEvents.js.map +1 -0
  42. package/dist/core/PathFinder.d.ts +43 -0
  43. package/dist/core/PathFinder.d.ts.map +1 -0
  44. package/dist/core/PathFinder.js +264 -0
  45. package/dist/core/PathFinder.js.map +1 -0
  46. package/dist/formatters/BaseFormatter.d.ts +15 -0
  47. package/dist/formatters/BaseFormatter.d.ts.map +1 -0
  48. package/dist/formatters/BaseFormatter.js +9 -0
  49. package/dist/formatters/BaseFormatter.js.map +1 -0
  50. package/dist/graph/GraphAssembler.d.ts +14 -0
  51. package/dist/graph/GraphAssembler.d.ts.map +1 -0
  52. package/dist/graph/GraphAssembler.js +44 -0
  53. package/dist/graph/GraphAssembler.js.map +1 -0
  54. package/dist/graph/GraphCompiler.d.ts +37 -0
  55. package/dist/graph/GraphCompiler.d.ts.map +1 -0
  56. package/dist/graph/GraphCompiler.js +355 -0
  57. package/dist/graph/GraphCompiler.js.map +1 -0
  58. package/dist/graph/GraphExtractor.d.ts +21 -0
  59. package/dist/graph/GraphExtractor.d.ts.map +1 -0
  60. package/dist/graph/GraphExtractor.js +145 -0
  61. package/dist/graph/GraphExtractor.js.map +1 -0
  62. package/dist/graph/GraphOptimizer.d.ts +104 -0
  63. package/dist/graph/GraphOptimizer.d.ts.map +1 -0
  64. package/dist/graph/GraphOptimizer.js +306 -0
  65. package/dist/graph/GraphOptimizer.js.map +1 -0
  66. package/dist/graph/GraphTrainer.d.ts +52 -0
  67. package/dist/graph/GraphTrainer.d.ts.map +1 -0
  68. package/dist/graph/GraphTrainer.js +188 -0
  69. package/dist/graph/GraphTrainer.js.map +1 -0
  70. package/dist/http/LinkBuilder.d.ts +82 -0
  71. package/dist/http/LinkBuilder.d.ts.map +1 -0
  72. package/dist/http/LinkBuilder.js +190 -0
  73. package/dist/http/LinkBuilder.js.map +1 -0
  74. package/dist/http/TrailRequest.d.ts +39 -0
  75. package/dist/http/TrailRequest.d.ts.map +1 -0
  76. package/dist/http/TrailRequest.js +22 -0
  77. package/dist/http/TrailRequest.js.map +1 -0
  78. package/dist/http/example-netflix.d.ts +6 -0
  79. package/dist/http/example-netflix.d.ts.map +1 -0
  80. package/dist/http/example-netflix.js +52 -0
  81. package/dist/http/example-netflix.js.map +1 -0
  82. package/dist/http/index.d.ts +32 -0
  83. package/dist/http/index.d.ts.map +1 -0
  84. package/dist/http/index.js +27 -0
  85. package/dist/http/index.js.map +1 -0
  86. package/dist/http/plugin.d.ts +110 -0
  87. package/dist/http/plugin.d.ts.map +1 -0
  88. package/dist/http/plugin.js +217 -0
  89. package/dist/http/plugin.js.map +1 -0
  90. package/dist/index.d.ts +55 -0
  91. package/dist/index.d.ts.map +1 -0
  92. package/dist/index.js +71 -0
  93. package/dist/index.js.map +1 -0
  94. package/dist/instrumentation/TelemetryShim.d.ts +114 -0
  95. package/dist/instrumentation/TelemetryShim.d.ts.map +1 -0
  96. package/dist/instrumentation/TelemetryShim.js +107 -0
  97. package/dist/instrumentation/TelemetryShim.js.map +1 -0
  98. package/dist/navigation/NavigationEngine.d.ts +69 -0
  99. package/dist/navigation/NavigationEngine.d.ts.map +1 -0
  100. package/dist/navigation/NavigationEngine.js +361 -0
  101. package/dist/navigation/NavigationEngine.js.map +1 -0
  102. package/dist/navigation/Resolver.d.ts +35 -0
  103. package/dist/navigation/Resolver.d.ts.map +1 -0
  104. package/dist/navigation/Resolver.js +113 -0
  105. package/dist/navigation/Resolver.js.map +1 -0
  106. package/dist/navigation/Scheduler.d.ts +36 -0
  107. package/dist/navigation/Scheduler.d.ts.map +1 -0
  108. package/dist/navigation/Scheduler.js +107 -0
  109. package/dist/navigation/Scheduler.js.map +1 -0
  110. package/dist/navigation/Trail.d.ts +129 -0
  111. package/dist/navigation/Trail.d.ts.map +1 -0
  112. package/dist/navigation/Trail.js +202 -0
  113. package/dist/navigation/Trail.js.map +1 -0
  114. package/dist/navigation/TrailParser.d.ts +96 -0
  115. package/dist/navigation/TrailParser.d.ts.map +1 -0
  116. package/dist/navigation/TrailParser.js +180 -0
  117. package/dist/navigation/TrailParser.js.map +1 -0
  118. package/dist/navigation/index.d.ts +10 -0
  119. package/dist/navigation/index.d.ts.map +1 -0
  120. package/dist/navigation/index.js +9 -0
  121. package/dist/navigation/index.js.map +1 -0
  122. package/dist/providers/MockProvider.d.ts +29 -0
  123. package/dist/providers/MockProvider.d.ts.map +1 -0
  124. package/dist/providers/MockProvider.js +55 -0
  125. package/dist/providers/MockProvider.js.map +1 -0
  126. package/dist/providers/PostgresProvider.d.ts +46 -0
  127. package/dist/providers/PostgresProvider.d.ts.map +1 -0
  128. package/dist/providers/PostgresProvider.js +152 -0
  129. package/dist/providers/PostgresProvider.js.map +1 -0
  130. package/dist/runtime/CompiledGraphEngine.d.ts +74 -0
  131. package/dist/runtime/CompiledGraphEngine.d.ts.map +1 -0
  132. package/dist/runtime/CompiledGraphEngine.js +211 -0
  133. package/dist/runtime/CompiledGraphEngine.js.map +1 -0
  134. package/dist/runtime/DataLoader.d.ts +90 -0
  135. package/dist/runtime/DataLoader.d.ts.map +1 -0
  136. package/dist/runtime/DataLoader.js +178 -0
  137. package/dist/runtime/DataLoader.js.map +1 -0
  138. package/dist/runtime/Engine.d.ts +36 -0
  139. package/dist/runtime/Engine.d.ts.map +1 -0
  140. package/dist/runtime/Engine.js +128 -0
  141. package/dist/runtime/Engine.js.map +1 -0
  142. package/dist/runtime/QueryEngine.d.ts +80 -0
  143. package/dist/runtime/QueryEngine.d.ts.map +1 -0
  144. package/dist/runtime/QueryEngine.js +188 -0
  145. package/dist/runtime/QueryEngine.js.map +1 -0
  146. package/dist/scenarios/test-metro-paris/config.json +6 -0
  147. package/dist/scenarios/test-metro-paris/graph.json +16325 -0
  148. package/dist/scenarios/test-metro-paris/queries.d.ts +22 -0
  149. package/dist/scenarios/test-metro-paris/queries.d.ts.map +1 -0
  150. package/dist/scenarios/test-metro-paris/queries.js +128 -0
  151. package/dist/scenarios/test-metro-paris/queries.js.map +1 -0
  152. package/dist/scenarios/test-metro-paris/stack.json +1 -0
  153. package/dist/scenarios/test-musicians/config.json +10 -0
  154. package/dist/scenarios/test-musicians/graph.json +20 -0
  155. package/dist/scenarios/test-musicians/stack.json +1 -0
  156. package/dist/scenarios/test-netflix/actions.d.ts +14 -0
  157. package/dist/scenarios/test-netflix/actions.d.ts.map +1 -0
  158. package/dist/scenarios/test-netflix/actions.js +86 -0
  159. package/dist/scenarios/test-netflix/actions.js.map +1 -0
  160. package/dist/scenarios/test-netflix/config.json +6 -0
  161. package/dist/scenarios/test-netflix/data/categories.json +1 -0
  162. package/dist/scenarios/test-netflix/data/companies.json +1 -0
  163. package/dist/scenarios/test-netflix/data/credits.json +19797 -0
  164. package/dist/scenarios/test-netflix/data/departments.json +18 -0
  165. package/dist/scenarios/test-netflix/data/jobs.json +142 -0
  166. package/dist/scenarios/test-netflix/data/movies.json +3497 -0
  167. package/dist/scenarios/test-netflix/data/people.json +1 -0
  168. package/dist/scenarios/test-netflix/data/synonyms.json +7 -0
  169. package/dist/scenarios/test-netflix/data/users.json +70 -0
  170. package/dist/scenarios/test-netflix/graph.json +1017 -0
  171. package/dist/scenarios/test-netflix/queries.d.ts +29 -0
  172. package/dist/scenarios/test-netflix/queries.d.ts.map +1 -0
  173. package/dist/scenarios/test-netflix/queries.js +134 -0
  174. package/dist/scenarios/test-netflix/queries.js.map +1 -0
  175. package/dist/scenarios/test-netflix/stack.json +14 -0
  176. package/dist/schema/GraphBuilder.d.ts +9 -0
  177. package/dist/schema/GraphBuilder.d.ts.map +1 -0
  178. package/dist/schema/GraphBuilder.js +90 -0
  179. package/dist/schema/GraphBuilder.js.map +1 -0
  180. package/dist/schema/JsonSchemaExtractor.d.ts +21 -0
  181. package/dist/schema/JsonSchemaExtractor.d.ts.map +1 -0
  182. package/dist/schema/JsonSchemaExtractor.js +88 -0
  183. package/dist/schema/JsonSchemaExtractor.js.map +1 -0
  184. package/dist/schema/SchemaAnalyzer.d.ts +41 -0
  185. package/dist/schema/SchemaAnalyzer.d.ts.map +1 -0
  186. package/dist/schema/SchemaAnalyzer.js +144 -0
  187. package/dist/schema/SchemaAnalyzer.js.map +1 -0
  188. package/dist/schema/SchemaExtractor.d.ts +10 -0
  189. package/dist/schema/SchemaExtractor.d.ts.map +1 -0
  190. package/dist/schema/SchemaExtractor.js +90 -0
  191. package/dist/schema/SchemaExtractor.js.map +1 -0
  192. package/dist/schema/SynonymResolver.d.ts +55 -0
  193. package/dist/schema/SynonymResolver.d.ts.map +1 -0
  194. package/dist/schema/SynonymResolver.js +121 -0
  195. package/dist/schema/SynonymResolver.js.map +1 -0
  196. package/dist/scripts/dictionary.json +796 -0
  197. package/dist/scripts/graph.json +664 -0
  198. package/dist/scripts/regenerate.d.ts +23 -0
  199. package/dist/scripts/regenerate.d.ts.map +1 -0
  200. package/dist/scripts/regenerate.js +206 -0
  201. package/dist/scripts/regenerate.js.map +1 -0
  202. package/dist/types/index.d.ts +394 -0
  203. package/dist/types/index.d.ts.map +1 -0
  204. package/dist/types/index.js +21 -0
  205. package/dist/types/index.js.map +1 -0
  206. 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":"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"}
@@ -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"}