@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,217 @@
1
+ /**
2
+ * LinkLab Fastify Plugin
3
+ *
4
+ * Transforme automatiquement chaque requête HTTP en Trail,
5
+ * résout la navigation via le graphe, et retourne une réponse
6
+ * HATEOAS Level 3 — liens générés automatiquement depuis le graphe.
7
+ *
8
+ * Usage minimal :
9
+ * ```typescript
10
+ * import Fastify from 'fastify'
11
+ * import { linklabPlugin } from '@linklab/http'
12
+ *
13
+ * const fastify = Fastify()
14
+ * await fastify.register(linklabPlugin, {
15
+ * graph: compiledGraph,
16
+ * prefix: '/api'
17
+ * })
18
+ * await fastify.listen({ port: 3000 })
19
+ * ```
20
+ *
21
+ * Toutes ces routes fonctionnent sans configuration supplémentaire :
22
+ * GET /api/people
23
+ * GET /api/people/Nolan
24
+ * GET /api/people/Nolan/movies
25
+ * GET /api/people/Nolan/movies/1/actors
26
+ *
27
+ * Hooks disponibles sur chaque requête :
28
+ * ```typescript
29
+ * fastify.register(linklabPlugin, {
30
+ * graph,
31
+ * onEngine: (engine, req) => {
32
+ * engine.hooks.on('access.check', async (ctx) => {
33
+ * if (!ctx.trail.user.userId) {
34
+ * return { cancelled: true, reason: 'unauthenticated' }
35
+ * }
36
+ * })
37
+ * }
38
+ * })
39
+ * ```
40
+ */
41
+ import fp from 'fastify-plugin';
42
+ import { TrailParser } from '../navigation/TrailParser.js';
43
+ import { NavigationEngine } from '../navigation/NavigationEngine.js';
44
+ import { LinkBuilder } from './LinkBuilder.js';
45
+ import { DataLoader } from '../runtime/DataLoader.js';
46
+ import { defaultUserExtractor, } from './TrailRequest.js';
47
+ // ── Helper — vérifie qu'un node est exposé ───────────────────
48
+ // Un node sans flag exposed (graphe ancien) est considéré exposé
49
+ // pour assurer la rétrocompatibilité.
50
+ // Un node avec exposed: false est bloqué.
51
+ function isExposed(graph, entity) {
52
+ const node = graph.nodes.find(n => n.id === entity);
53
+ if (!node)
54
+ return false;
55
+ // Rétrocompatibilité : si exposed n'est pas défini, on expose
56
+ if (node.exposed === undefined)
57
+ return true;
58
+ return node.exposed === true;
59
+ }
60
+ // ── Plugin ────────────────────────────────────────────────────
61
+ const linklabPluginImpl = async (fastify, options) => {
62
+ const { graph, prefix = '', global = {}, extractUser = defaultUserExtractor, onEngine, dataLoader, transformData, } = options;
63
+ const linkBuilder = new LinkBuilder(graph, { prefix });
64
+ // compiledGraph peut être passé séparément (semantic graph + compiled graph distincts)
65
+ // ou graph peut lui-même être un CompiledGraph (avec .routes)
66
+ const effectiveCompiled = options.compiledGraph
67
+ ?? ('routes' in graph && Array.isArray(graph.routes) ? graph : null);
68
+ const loader = (dataLoader && effectiveCompiled)
69
+ ? new DataLoader(effectiveCompiled, dataLoader)
70
+ : null;
71
+ if (dataLoader && !effectiveCompiled) {
72
+ fastify.log.warn('[LinkLab] dataLoader ignoré : graph doit être un CompiledGraph (avec .routes)');
73
+ }
74
+ // ── Décorer chaque request avec trail + linkBuilder ─────────
75
+ fastify.decorateRequest('trail', null);
76
+ fastify.decorateRequest('linkBuilder', null);
77
+ // ── Hook preHandler — parse le Trail avant chaque requête ───
78
+ fastify.addHook('preHandler', async (req) => {
79
+ const userCtx = await extractUser(req);
80
+ const rawPath = req.url.split('?')[0];
81
+ const path = prefix ? rawPath.replace(new RegExp(`^${prefix}`), '') : rawPath;
82
+ const trail = TrailParser.fromPath(path, {
83
+ global: { ...global },
84
+ user: userCtx,
85
+ });
86
+ req.trail = trail;
87
+ req.linkBuilder = linkBuilder;
88
+ });
89
+ // ── Routes génériques — capture tous les paths ─────────────
90
+ const routePath = prefix ? `${prefix}/*` : '/*';
91
+ const rootPath = prefix || '/';
92
+ // Route pour le prefix exact ex: GET /api
93
+ fastify.get(rootPath, async (req, reply) => {
94
+ const links = buildRootLinks(graph, prefix);
95
+ return { data: null, _links: links, _trail: '', _meta: { entity: 'root', depth: 0, resolved: 0, timing: 0 } };
96
+ });
97
+ fastify.get(routePath, async (req, reply) => {
98
+ const trail = req.trail;
99
+ const start = Date.now();
100
+ // Trail vide = index — retourner les nœuds racines du graphe
101
+ if (trail.depth === 0) {
102
+ const rootLinks = buildRootLinks(graph, prefix);
103
+ return {
104
+ data: null,
105
+ _links: rootLinks,
106
+ _trail: '',
107
+ _meta: { entity: 'root', depth: 0, resolved: 0, timing: Date.now() - start },
108
+ };
109
+ }
110
+ // ── Vérifier que toutes les frames du Trail pointent vers des nodes exposés
111
+ // On vérifie chaque entité du Trail — si l'une est non exposée → 404.
112
+ // Cela couvre aussi les vues sémantiques : leur entité cible résolue
113
+ // est vérifiée au moment de la résolution du Trail.
114
+ for (const frame of trail.frames) {
115
+ if (!isExposed(graph, frame.entity)) {
116
+ reply.code(404);
117
+ return reply.send({
118
+ error: 'NOT_FOUND',
119
+ reason: `Entity '${frame.entity}' is not exposed`,
120
+ _trail: TrailParser.toFluent(trail),
121
+ });
122
+ }
123
+ }
124
+ // ── Créer le moteur de navigation ─────────────────────────
125
+ const engine = NavigationEngine.forNavigation(graph, { trail });
126
+ // Laisser Netflix (ou tout autre app) brancher ses hooks
127
+ if (onEngine) {
128
+ await onEngine(engine, req);
129
+ }
130
+ // ── Résoudre le Trail ─────────────────────────────────────
131
+ const results = await engine.run(trail.depth + 1);
132
+ const lastResult = results[results.length - 1];
133
+ // ── Gérer les erreurs de navigation ───────────────────────
134
+ if (lastResult?.result?.type === 'FAIL') {
135
+ const reason = lastResult.result.reason ?? 'Navigation failed';
136
+ if (reason.includes('notfound') || reason.includes('Aucun chemin')) {
137
+ reply.code(404);
138
+ return reply.send({
139
+ error: 'NOT_FOUND',
140
+ reason,
141
+ _trail: TrailParser.toFluent(trail),
142
+ });
143
+ }
144
+ if (reason.includes('forbidden') || reason.includes('denied') || reason.includes('unauthenticated')) {
145
+ reply.code(403);
146
+ return reply.send({
147
+ error: 'FORBIDDEN',
148
+ reason,
149
+ _trail: TrailParser.toFluent(trail),
150
+ });
151
+ }
152
+ reply.code(400);
153
+ return reply.send({
154
+ error: 'BAD_REQUEST',
155
+ reason,
156
+ _trail: TrailParser.toFluent(trail),
157
+ });
158
+ }
159
+ // ── Charger les données via DataLoader ───────────────────
160
+ if (loader) {
161
+ await loader.load(engine.trail);
162
+ }
163
+ // ── Récupérer les données de la frame courante ────────────
164
+ const current = engine.trail.current;
165
+ const rawData = current?.data ?? null;
166
+ const data = transformData ? transformData(rawData, engine.trail) : rawData;
167
+ // ── Générer les liens HATEOAS ─────────────────────────────
168
+ const links = linkBuilder.from(engine.trail);
169
+ // Si data est une liste, enrichir chaque item avec ses liens
170
+ const isCollection = Array.isArray(data);
171
+ let responseData = data;
172
+ if (isCollection && data.length > 0) {
173
+ const itemLinks = linkBuilder.forItems(engine.trail, data);
174
+ responseData = data.map((item, i) => ({
175
+ ...item,
176
+ _links: itemLinks[i],
177
+ }));
178
+ }
179
+ // ── Construire la réponse ─────────────────────────────────
180
+ const resolved = engine.trail.frames.filter(f => f.state === 'RESOLVED').length;
181
+ return {
182
+ data: responseData,
183
+ _links: links,
184
+ _trail: TrailParser.toFluent(engine.trail),
185
+ _meta: {
186
+ entity: current?.entity ?? '',
187
+ depth: engine.trail.depth,
188
+ resolved,
189
+ timing: Date.now() - start,
190
+ count: isCollection ? data.length : undefined,
191
+ },
192
+ };
193
+ });
194
+ };
195
+ // ── Helper — liens racines ────────────────────────────────────
196
+ // Filtre les nodes non exposés des liens racines.
197
+ function buildRootLinks(graph, prefix) {
198
+ const hasIncoming = new Set(graph.edges.map(e => e.to));
199
+ const roots = graph.nodes.filter(n => !hasIncoming.has(n.id) && isExposed(graph, n.id));
200
+ const links = {
201
+ self: { href: prefix || '/', method: 'GET' }
202
+ };
203
+ for (const node of roots) {
204
+ links[node.id] = {
205
+ href: `${prefix}/${node.id}`,
206
+ method: 'GET',
207
+ rel: node.id,
208
+ };
209
+ }
210
+ return links;
211
+ }
212
+ // ── Export avec fastify-plugin (preserve encapsulation) ───────
213
+ export const linklabPlugin = fp(linklabPluginImpl, {
214
+ fastify: '4.x || 5.x',
215
+ name: 'linklab',
216
+ });
217
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/http/plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * @linklab/core — Point d'entrée public
3
+ *
4
+ * Trois zones d'export, du plus utilisé au plus technique :
5
+ *
6
+ * ┌─────────────────────────────────────────────────────────┐
7
+ * │ API — ce que 80% des utilisateurs importent │
8
+ * │ BUILD — pipeline schema → graph (setup, CI) │
9
+ * │ HTTP — plugin Fastify HATEOAS (optionnel) │
10
+ * │ ADVANCED — internals pour extensions et tests │
11
+ * └─────────────────────────────────────────────────────────┘
12
+ *
13
+ * Usage typique :
14
+ *
15
+ * import { Graph, Strategy } from '@linklab/core'
16
+ *
17
+ * const cinema = new Graph(graphJson, { compiled, dataset }).domain()
18
+ * const cast = await cinema.movies(278).people
19
+ * const route = cinema.from('Pigalle').to('Alesia').path(Strategy.Comfort())
20
+ */
21
+ export { Graph } from './api/Graph.js';
22
+ export { Strategy } from './api/types.js';
23
+ export type { PathResult, ResolvedPath, PathStep, QueryResult, PathBuilderOptions } from './api/types.js';
24
+ export { PathBuilder } from './api/PathBuilder.js';
25
+ export { SchemaExtractor } from './schema/SchemaExtractor.js';
26
+ export { JsonSchemaExtractor } from './schema/JsonSchemaExtractor.js';
27
+ export { SchemaAnalyzer } from './schema/SchemaAnalyzer.js';
28
+ export { GraphBuilder } from './schema/GraphBuilder.js';
29
+ export { GraphAssembler } from './graph/GraphAssembler.js';
30
+ export { GraphCompiler } from './graph/GraphCompiler.js';
31
+ export { GraphTrainer } from './graph/GraphTrainer.js';
32
+ export { GraphOptimizer } from './graph/GraphOptimizer.js';
33
+ export { GraphExtractor } from './graph/GraphExtractor.js';
34
+ export { linklabPlugin } from './http/plugin.js';
35
+ export { LinkBuilder } from './http/LinkBuilder.js';
36
+ export type { LinklabPluginOptions } from './http/plugin.js';
37
+ export { NavigationEngine } from './navigation/NavigationEngine.js';
38
+ export { Resolver } from './navigation/Resolver.js';
39
+ export { Scheduler } from './navigation/Scheduler.js';
40
+ export { Trail } from './navigation/Trail.js';
41
+ export { TrailParser } from './navigation/TrailParser.js';
42
+ export { QueryEngine } from './runtime/QueryEngine.js';
43
+ export { Engine } from './runtime/Engine.js';
44
+ export { DataLoader } from './runtime/DataLoader.js';
45
+ export { PostgresProvider } from './providers/PostgresProvider.js';
46
+ export { MockProvider } from './providers/MockProvider.js';
47
+ export type { PathFormatter } from './formatters/BaseFormatter.js';
48
+ export { PathFinder } from './core/PathFinder.js';
49
+ export type { Graph as GraphData, // renommé pour éviter le conflit avec la classe Graph
50
+ GraphNode, GraphEdge, CompiledGraph, RouteInfo, Dictionary, Frame, Path, PathQuery } from './types/index.js';
51
+ export type { MetricsMap, TrainingMetrics, UseCase } from './types/index.js';
52
+ export { injectTelemetry, resetTelemetry, preloadTelemetry, shim } from './instrumentation/TelemetryShim.js';
53
+ export type { TelemetryModule } from './instrumentation/TelemetryShim.js';
54
+ export type { ExposeConfig } from './types/index.js';
55
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAOH,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,YAAY,EACV,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,kBAAkB,EACnB,MAAM,gBAAgB,CAAA;AAGvB,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAQlD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAA;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAQ1D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,YAAY,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAQ5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAGzD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAGpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAG1D,YAAY,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAGlE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAOjD,YAAY,EACV,KAAK,IAAI,SAAS,EAAE,sDAAsD;AAC1E,SAAS,EACT,SAAS,EACT,aAAa,EACb,SAAS,EACT,UAAU,EACV,KAAK,EACL,IAAI,EACJ,SAAS,EACV,MAAM,kBAAkB,CAAA;AAEzB,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAG5E,OAAO,EACL,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,IAAI,EACL,MAAM,oCAAoC,CAAA;AAC3C,YAAY,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAA;AAEzE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,71 @@
1
+ /**
2
+ * @linklab/core — Point d'entrée public
3
+ *
4
+ * Trois zones d'export, du plus utilisé au plus technique :
5
+ *
6
+ * ┌─────────────────────────────────────────────────────────┐
7
+ * │ API — ce que 80% des utilisateurs importent │
8
+ * │ BUILD — pipeline schema → graph (setup, CI) │
9
+ * │ HTTP — plugin Fastify HATEOAS (optionnel) │
10
+ * │ ADVANCED — internals pour extensions et tests │
11
+ * └─────────────────────────────────────────────────────────┘
12
+ *
13
+ * Usage typique :
14
+ *
15
+ * import { Graph, Strategy } from '@linklab/core'
16
+ *
17
+ * const cinema = new Graph(graphJson, { compiled, dataset }).domain()
18
+ * const cast = await cinema.movies(278).people
19
+ * const route = cinema.from('Pigalle').to('Alesia').path(Strategy.Comfort())
20
+ */
21
+ // ══════════════════════════════════════════════════════════════
22
+ // API — Surface publique principale
23
+ // import { Graph, Strategy } from '@linklab/core'
24
+ // ══════════════════════════════════════════════════════════════
25
+ export { Graph } from './api/Graph.js';
26
+ export { Strategy } from './api/types.js';
27
+ // PathBuilder est retourné par graph.from() — exposé pour le typage
28
+ export { PathBuilder } from './api/PathBuilder.js';
29
+ // ══════════════════════════════════════════════════════════════
30
+ // BUILD — Pipeline schema → graph
31
+ // Usage : scripts de génération, CI, pipeline.ts
32
+ // import { SchemaExtractor, GraphCompiler } from '@linklab/core/build'
33
+ // ══════════════════════════════════════════════════════════════
34
+ export { SchemaExtractor } from './schema/SchemaExtractor.js';
35
+ export { JsonSchemaExtractor } from './schema/JsonSchemaExtractor.js';
36
+ export { SchemaAnalyzer } from './schema/SchemaAnalyzer.js';
37
+ export { GraphBuilder } from './schema/GraphBuilder.js';
38
+ export { GraphAssembler } from './graph/GraphAssembler.js';
39
+ export { GraphCompiler } from './graph/GraphCompiler.js';
40
+ export { GraphTrainer } from './graph/GraphTrainer.js';
41
+ export { GraphOptimizer } from './graph/GraphOptimizer.js';
42
+ export { GraphExtractor } from './graph/GraphExtractor.js';
43
+ // ══════════════════════════════════════════════════════════════
44
+ // HTTP — Plugin Fastify HATEOAS
45
+ // Usage : apps serveur
46
+ // import { linklabPlugin } from '@linklab/core'
47
+ // ══════════════════════════════════════════════════════════════
48
+ export { linklabPlugin } from './http/plugin.js';
49
+ export { LinkBuilder } from './http/LinkBuilder.js';
50
+ // ══════════════════════════════════════════════════════════════
51
+ // ADVANCED — Internals pour extensions, providers, tests
52
+ // Stable mais sans garantie de compatibilité entre versions
53
+ // ══════════════════════════════════════════════════════════════
54
+ // Moteur de navigation bas niveau
55
+ export { NavigationEngine } from './navigation/NavigationEngine.js';
56
+ export { Resolver } from './navigation/Resolver.js';
57
+ export { Scheduler } from './navigation/Scheduler.js';
58
+ export { Trail } from './navigation/Trail.js';
59
+ export { TrailParser } from './navigation/TrailParser.js';
60
+ // Runtime
61
+ export { QueryEngine } from './runtime/QueryEngine.js';
62
+ export { Engine } from './runtime/Engine.js';
63
+ export { DataLoader } from './runtime/DataLoader.js';
64
+ // Providers
65
+ export { PostgresProvider } from './providers/PostgresProvider.js';
66
+ export { MockProvider } from './providers/MockProvider.js';
67
+ // PathFinder — algorithme Dijkstra brut
68
+ export { PathFinder } from './core/PathFinder.js';
69
+ // ── Instrumentation — opt-in telemetry bridge ─────────────────────────────
70
+ export { injectTelemetry, resetTelemetry, preloadTelemetry, shim } from './instrumentation/TelemetryShim.js';
71
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,iEAAiE;AACjE,qCAAqC;AACrC,mDAAmD;AACnD,iEAAiE;AAEjE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AASzC,oEAAoE;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAElD,iEAAiE;AACjE,mCAAmC;AACnC,kDAAkD;AAClD,wEAAwE;AACxE,iEAAiE;AAEjE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAA;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAE1D,iEAAiE;AACjE,iCAAiC;AACjC,wBAAwB;AACxB,iDAAiD;AACjD,iEAAiE;AAEjE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAGnD,iEAAiE;AACjE,0DAA0D;AAC1D,6DAA6D;AAC7D,iEAAiE;AAEjE,kCAAkC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAEzD,UAAU;AACV,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAEpD,YAAY;AACZ,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAK1D,wCAAwC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAqBjD,6EAA6E;AAC7E,OAAO,EACL,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,IAAI,EACL,MAAM,oCAAoC,CAAA"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * TelemetryShim.ts — Pont opt-in entre @linklab/core et @linklab/telemetry
3
+ *
4
+ * @linklab/core ne dépend PAS de @linklab/telemetry.
5
+ *
6
+ * Deux modes d'activation :
7
+ *
8
+ * 1. INJECTION (recommandé, toujours fiable) :
9
+ * L'appelant qui connaît les deux packages injecte les modules directement.
10
+ * Utilisé dans les tests (@linklab/telemetry) et en production (Netflix-backend).
11
+ *
12
+ * import { injectTelemetry } from '@linklab/core'
13
+ * import { SpanBuilder, traceBus } from '@linklab/telemetry'
14
+ * injectTelemetry({ SpanBuilder, traceBus })
15
+ *
16
+ * 2. PRELOAD (production uniquement) :
17
+ * Import dynamique — fonctionne si @linklab/telemetry est installé ET
18
+ * accessible depuis le même module resolver que @linklab/core.
19
+ * Ne pas utiliser dans les tests (résolution cross-package impossible sous Vitest).
20
+ *
21
+ * import { preloadTelemetry } from '@linklab/core'
22
+ * await preloadTelemetry()
23
+ *
24
+ * Sans activation → toutes les opérations sont des no-ops silencieux.
25
+ */
26
+ interface MinimalSpanBuilder {
27
+ stepStart(step: string): this;
28
+ stepEnd(step: string): this;
29
+ addCacheEvent(event: {
30
+ level: 'L1' | 'L2' | 'MISS';
31
+ hit: boolean;
32
+ entity?: string;
33
+ promoted: boolean;
34
+ yoyo?: boolean;
35
+ }): this;
36
+ end(opts: {
37
+ rowCount: number;
38
+ }): MinimalSpan;
39
+ endWithError(err: Error, state: MinimalEngineState): MinimalSpan;
40
+ withPath?(path: string[]): this;
41
+ withFilters?(filters: Record<string, any>): this;
42
+ readonly routeKey: string;
43
+ }
44
+ interface MinimalSpan {
45
+ spanId: string;
46
+ traceId: string;
47
+ timestamp: number;
48
+ trail: string;
49
+ from: string;
50
+ to: string;
51
+ path: string[];
52
+ filters: Record<string, any>;
53
+ timings: any[];
54
+ totalMs: number;
55
+ cacheEvents: any[];
56
+ rowCount: number;
57
+ error?: any;
58
+ metrics?: any;
59
+ }
60
+ interface MinimalEngineState {
61
+ compiledGraphHash: string;
62
+ weights: Record<string, number>;
63
+ cacheState: {
64
+ l1HitRate: number;
65
+ l2HitRate: number;
66
+ globalHitRate: number;
67
+ yoyoEvents: number;
68
+ };
69
+ }
70
+ export interface TelemetryModule {
71
+ SpanBuilder: {
72
+ start(opts: {
73
+ trail: string;
74
+ from: string;
75
+ to: string;
76
+ traceId?: string;
77
+ }): MinimalSpanBuilder;
78
+ };
79
+ traceBus: {
80
+ emit(event: 'span:end' | 'span:error', span: MinimalSpan): void;
81
+ };
82
+ }
83
+ /**
84
+ * Injecte les composants de @linklab/telemetry dans le shim.
85
+ * Méthode universelle — fonctionne dans tous les contextes (tests, prod).
86
+ * Prend effet immédiatement et de manière synchrone.
87
+ */
88
+ export declare function injectTelemetry(module: TelemetryModule): void;
89
+ /**
90
+ * Réinitialise le shim — utile pour les tests d'isolation.
91
+ */
92
+ export declare function resetTelemetry(): void;
93
+ /**
94
+ * Précharge le module telemetry via import dynamique.
95
+ * Uniquement pour la production (Netflix-backend) où les deux packages
96
+ * partagent le même module resolver Node.js.
97
+ * Ne pas utiliser dans les tests — préférer injectTelemetry().
98
+ */
99
+ export declare function preloadTelemetry(): Promise<void>;
100
+ export declare const shim: {
101
+ startSpan(opts: {
102
+ trail: string;
103
+ from: string;
104
+ to: string;
105
+ traceId?: string;
106
+ path?: string[];
107
+ filters?: Record<string, any>;
108
+ }): MinimalSpanBuilder | null;
109
+ emitEnd(span: MinimalSpan): void;
110
+ emitError(span: MinimalSpan): void;
111
+ readonly active: boolean;
112
+ };
113
+ export type { MinimalSpanBuilder, MinimalSpan, MinimalEngineState };
114
+ //# sourceMappingURL=TelemetryShim.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TelemetryShim.d.ts","sourceRoot":"","sources":["../../src/instrumentation/TelemetryShim.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * TelemetryShim.ts — Pont opt-in entre @linklab/core et @linklab/telemetry
3
+ *
4
+ * @linklab/core ne dépend PAS de @linklab/telemetry.
5
+ *
6
+ * Deux modes d'activation :
7
+ *
8
+ * 1. INJECTION (recommandé, toujours fiable) :
9
+ * L'appelant qui connaît les deux packages injecte les modules directement.
10
+ * Utilisé dans les tests (@linklab/telemetry) et en production (Netflix-backend).
11
+ *
12
+ * import { injectTelemetry } from '@linklab/core'
13
+ * import { SpanBuilder, traceBus } from '@linklab/telemetry'
14
+ * injectTelemetry({ SpanBuilder, traceBus })
15
+ *
16
+ * 2. PRELOAD (production uniquement) :
17
+ * Import dynamique — fonctionne si @linklab/telemetry est installé ET
18
+ * accessible depuis le même module resolver que @linklab/core.
19
+ * Ne pas utiliser dans les tests (résolution cross-package impossible sous Vitest).
20
+ *
21
+ * import { preloadTelemetry } from '@linklab/core'
22
+ * await preloadTelemetry()
23
+ *
24
+ * Sans activation → toutes les opérations sont des no-ops silencieux.
25
+ */
26
+ // ── Registre interne ──────────────────────────────────────────────────────────
27
+ let _module = null;
28
+ let _attempted = false;
29
+ // ── API d'injection ───────────────────────────────────────────────────────────
30
+ /**
31
+ * Injecte les composants de @linklab/telemetry dans le shim.
32
+ * Méthode universelle — fonctionne dans tous les contextes (tests, prod).
33
+ * Prend effet immédiatement et de manière synchrone.
34
+ */
35
+ export function injectTelemetry(module) {
36
+ _module = module;
37
+ _attempted = true; // bloquer tout preloadTelemetry() ultérieur
38
+ }
39
+ /**
40
+ * Réinitialise le shim — utile pour les tests d'isolation.
41
+ */
42
+ export function resetTelemetry() {
43
+ _module = null;
44
+ _attempted = false;
45
+ }
46
+ /**
47
+ * Précharge le module telemetry via import dynamique.
48
+ * Uniquement pour la production (Netflix-backend) où les deux packages
49
+ * partagent le même module resolver Node.js.
50
+ * Ne pas utiliser dans les tests — préférer injectTelemetry().
51
+ */
52
+ export async function preloadTelemetry() {
53
+ if (_attempted)
54
+ return;
55
+ _attempted = true;
56
+ try {
57
+ const specifier = '@linklab/telemetry';
58
+ const mod = await new Function('s', 'return import(s)')(specifier);
59
+ _module = mod;
60
+ }
61
+ catch {
62
+ _module = null;
63
+ }
64
+ }
65
+ // ── API du shim ───────────────────────────────────────────────────────────────
66
+ export const shim = {
67
+ startSpan(opts) {
68
+ if (!_module)
69
+ return null;
70
+ try {
71
+ const builder = _module.SpanBuilder.start({
72
+ trail: opts.trail,
73
+ from: opts.from,
74
+ to: opts.to,
75
+ traceId: opts.traceId
76
+ });
77
+ if (opts.path)
78
+ builder.withPath?.(opts.path);
79
+ if (opts.filters)
80
+ builder.withFilters?.(opts.filters);
81
+ return builder;
82
+ }
83
+ catch {
84
+ return null;
85
+ }
86
+ },
87
+ emitEnd(span) {
88
+ if (!_module)
89
+ return;
90
+ try {
91
+ _module.traceBus.emit('span:end', span);
92
+ }
93
+ catch { }
94
+ },
95
+ emitError(span) {
96
+ if (!_module)
97
+ return;
98
+ try {
99
+ _module.traceBus.emit('span:error', span);
100
+ }
101
+ catch { }
102
+ },
103
+ get active() {
104
+ return _module !== null;
105
+ }
106
+ };
107
+ //# sourceMappingURL=TelemetryShim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TelemetryShim.js","sourceRoot":"","sources":["../../src/instrumentation/TelemetryShim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AA0DH,iFAAiF;AAEjF,IAAI,OAAO,GAA2B,IAAI,CAAA;AAC1C,IAAI,UAAU,GAAG,KAAK,CAAA;AAEtB,iFAAiF;AAEjF;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,MAAuB;IACrD,OAAO,GAAG,MAAM,CAAA;IAChB,UAAU,GAAG,IAAI,CAAA,CAAC,4CAA4C;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,GAAG,IAAI,CAAA;IACd,UAAU,GAAG,KAAK,CAAA;AACpB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,UAAU;QAAE,OAAM;IACtB,UAAU,GAAG,IAAI,CAAA;IACjB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,oBAAoB,CAAA;QACtC,MAAM,GAAG,GAAG,MAAM,IAAI,QAAQ,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,SAAS,CAAC,CAAA;QAClE,OAAO,GAAG,GAAsB,CAAA;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,IAAI,CAAA;IAChB,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,SAAS,CAAC,IAOT;QACC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAA;QACzB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC;gBACxC,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC,CAAA;YACF,IAAI,IAAI,CAAC,IAAI;gBAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC5C,IAAI,IAAI,CAAC,OAAO;gBAAE,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACrD,OAAO,OAAO,CAAA;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED,OAAO,CAAC,IAAiB;QACvB,IAAI,CAAC,OAAO;YAAE,OAAM;QACpB,IAAI,CAAC;YACH,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;QACzC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IAED,SAAS,CAAC,IAAiB;QACzB,IAAI,CAAC,OAAO;YAAE,OAAM;QACpB,IAAI,CAAC;YACH,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;QAC3C,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IAED,IAAI,MAAM;QACR,OAAO,OAAO,KAAK,IAAI,CAAA;IACzB,CAAC;CACF,CAAA"}