@zmdb/web 1.0.0-beta.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 (179) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +49 -0
  3. package/dist/app/bridge.d.ts +12 -0
  4. package/dist/app/bridge.d.ts.map +1 -0
  5. package/dist/app/bridge.js +16 -0
  6. package/dist/app/bridge.js.map +1 -0
  7. package/dist/app/index.d.ts +23 -0
  8. package/dist/app/index.d.ts.map +1 -0
  9. package/dist/app/index.js +47 -0
  10. package/dist/app/index.js.map +1 -0
  11. package/dist/bench/index.d.ts +68 -0
  12. package/dist/bench/index.d.ts.map +1 -0
  13. package/dist/bench/index.js +250 -0
  14. package/dist/bench/index.js.map +1 -0
  15. package/dist/compression/index.d.ts +13 -0
  16. package/dist/compression/index.d.ts.map +1 -0
  17. package/dist/compression/index.js +211 -0
  18. package/dist/compression/index.js.map +1 -0
  19. package/dist/context/index.d.ts +74 -0
  20. package/dist/context/index.d.ts.map +1 -0
  21. package/dist/context/index.js +118 -0
  22. package/dist/context/index.js.map +1 -0
  23. package/dist/contract/__fixtures__/http-client.generated.d.ts +70 -0
  24. package/dist/contract/__fixtures__/http-client.generated.d.ts.map +1 -0
  25. package/dist/contract/__fixtures__/http-client.generated.js +86 -0
  26. package/dist/contract/__fixtures__/http-client.generated.js.map +1 -0
  27. package/dist/contract/__fixtures__/http-convergence.d.ts +396 -0
  28. package/dist/contract/__fixtures__/http-convergence.d.ts.map +1 -0
  29. package/dist/contract/__fixtures__/http-convergence.js +425 -0
  30. package/dist/contract/__fixtures__/http-convergence.js.map +1 -0
  31. package/dist/contract/compiler/client.d.ts +12 -0
  32. package/dist/contract/compiler/client.d.ts.map +1 -0
  33. package/dist/contract/compiler/client.js +1293 -0
  34. package/dist/contract/compiler/client.js.map +1 -0
  35. package/dist/contract/compiler/index.d.ts +18 -0
  36. package/dist/contract/compiler/index.d.ts.map +1 -0
  37. package/dist/contract/compiler/index.js +1058 -0
  38. package/dist/contract/compiler/index.js.map +1 -0
  39. package/dist/contract/index.d.ts +237 -0
  40. package/dist/contract/index.d.ts.map +1 -0
  41. package/dist/contract/index.js +22 -0
  42. package/dist/contract/index.js.map +1 -0
  43. package/dist/csrf/index.d.ts +15 -0
  44. package/dist/csrf/index.d.ts.map +1 -0
  45. package/dist/csrf/index.js +218 -0
  46. package/dist/csrf/index.js.map +1 -0
  47. package/dist/data/index.d.ts +35 -0
  48. package/dist/data/index.d.ts.map +1 -0
  49. package/dist/data/index.js +58 -0
  50. package/dist/data/index.js.map +1 -0
  51. package/dist/devtools/index.d.ts +74 -0
  52. package/dist/devtools/index.d.ts.map +1 -0
  53. package/dist/devtools/index.js +552 -0
  54. package/dist/devtools/index.js.map +1 -0
  55. package/dist/dto-pipes/index.d.ts +45 -0
  56. package/dist/dto-pipes/index.d.ts.map +1 -0
  57. package/dist/dto-pipes/index.js +78 -0
  58. package/dist/dto-pipes/index.js.map +1 -0
  59. package/dist/gateways/index.d.ts +31 -0
  60. package/dist/gateways/index.d.ts.map +1 -0
  61. package/dist/gateways/index.js +138 -0
  62. package/dist/gateways/index.js.map +1 -0
  63. package/dist/health/index.d.ts +20 -0
  64. package/dist/health/index.d.ts.map +1 -0
  65. package/dist/health/index.js +148 -0
  66. package/dist/health/index.js.map +1 -0
  67. package/dist/http-token.d.ts +2 -0
  68. package/dist/http-token.d.ts.map +1 -0
  69. package/dist/http-token.js +21 -0
  70. package/dist/http-token.js.map +1 -0
  71. package/dist/index.d.ts +18 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +40 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/integrations/index.d.ts +11 -0
  76. package/dist/integrations/index.d.ts.map +1 -0
  77. package/dist/integrations/index.js +39 -0
  78. package/dist/integrations/index.js.map +1 -0
  79. package/dist/middleware/errors.d.ts +14 -0
  80. package/dist/middleware/errors.d.ts.map +1 -0
  81. package/dist/middleware/errors.js +18 -0
  82. package/dist/middleware/errors.js.map +1 -0
  83. package/dist/middleware/index.d.ts +46 -0
  84. package/dist/middleware/index.d.ts.map +1 -0
  85. package/dist/middleware/index.js +64 -0
  86. package/dist/middleware/index.js.map +1 -0
  87. package/dist/modules/__fixtures__/large-graph.d.ts +239 -0
  88. package/dist/modules/__fixtures__/large-graph.d.ts.map +1 -0
  89. package/dist/modules/__fixtures__/large-graph.js +483 -0
  90. package/dist/modules/__fixtures__/large-graph.js.map +1 -0
  91. package/dist/openapi/__fixtures__/entities.d.ts +8 -0
  92. package/dist/openapi/__fixtures__/entities.d.ts.map +1 -0
  93. package/dist/openapi/__fixtures__/entities.js +4 -0
  94. package/dist/openapi/__fixtures__/entities.js.map +1 -0
  95. package/dist/openapi/__fixtures__/openapi-tools.fixture.d.ts +38 -0
  96. package/dist/openapi/__fixtures__/openapi-tools.fixture.d.ts.map +1 -0
  97. package/dist/openapi/__fixtures__/openapi-tools.fixture.js +172 -0
  98. package/dist/openapi/__fixtures__/openapi-tools.fixture.js.map +1 -0
  99. package/dist/openapi/__fixtures__/route-schemas.d.ts +2 -0
  100. package/dist/openapi/__fixtures__/route-schemas.d.ts.map +1 -0
  101. package/dist/openapi/__fixtures__/route-schemas.js +17 -0
  102. package/dist/openapi/__fixtures__/route-schemas.js.map +1 -0
  103. package/dist/openapi/index.d.ts +61 -0
  104. package/dist/openapi/index.d.ts.map +1 -0
  105. package/dist/openapi/index.js +314 -0
  106. package/dist/openapi/index.js.map +1 -0
  107. package/dist/pipeline/guards.d.ts +9 -0
  108. package/dist/pipeline/guards.d.ts.map +1 -0
  109. package/dist/pipeline/guards.js +11 -0
  110. package/dist/pipeline/guards.js.map +1 -0
  111. package/dist/pipeline/index.d.ts +141 -0
  112. package/dist/pipeline/index.d.ts.map +1 -0
  113. package/dist/pipeline/index.js +1624 -0
  114. package/dist/pipeline/index.js.map +1 -0
  115. package/dist/routing/index.d.ts +40 -0
  116. package/dist/routing/index.d.ts.map +1 -0
  117. package/dist/routing/index.js +162 -0
  118. package/dist/routing/index.js.map +1 -0
  119. package/dist/static/index.d.ts +14 -0
  120. package/dist/static/index.d.ts.map +1 -0
  121. package/dist/static/index.js +348 -0
  122. package/dist/static/index.js.map +1 -0
  123. package/dist/testing/index.d.ts +20 -0
  124. package/dist/testing/index.d.ts.map +1 -0
  125. package/dist/testing/index.js +32 -0
  126. package/dist/testing/index.js.map +1 -0
  127. package/dist/traced-router.d.ts +5 -0
  128. package/dist/traced-router.d.ts.map +1 -0
  129. package/dist/traced-router.js +6 -0
  130. package/dist/traced-router.js.map +1 -0
  131. package/dist/upload/index.d.ts +28 -0
  132. package/dist/upload/index.d.ts.map +1 -0
  133. package/dist/upload/index.js +410 -0
  134. package/dist/upload/index.js.map +1 -0
  135. package/dist/versioning/index.d.ts +35 -0
  136. package/dist/versioning/index.d.ts.map +1 -0
  137. package/dist/versioning/index.js +66 -0
  138. package/dist/versioning/index.js.map +1 -0
  139. package/dist/versioning/runtime.d.ts +5 -0
  140. package/dist/versioning/runtime.d.ts.map +1 -0
  141. package/dist/versioning/runtime.js +34 -0
  142. package/dist/versioning/runtime.js.map +1 -0
  143. package/package.json +143 -0
  144. package/src/app/bridge.ts +39 -0
  145. package/src/app/index.ts +76 -0
  146. package/src/bench/index.ts +329 -0
  147. package/src/compression/index.ts +255 -0
  148. package/src/context/index.ts +181 -0
  149. package/src/contract/__fixtures__/http-client.generated.ts +73 -0
  150. package/src/contract/__fixtures__/http-client.generated.ts.map +1 -0
  151. package/src/contract/__fixtures__/http-convergence.ts +564 -0
  152. package/src/contract/compiler/client.ts +1518 -0
  153. package/src/contract/compiler/index.ts +1457 -0
  154. package/src/contract/index.ts +266 -0
  155. package/src/csrf/index.ts +264 -0
  156. package/src/data/index.ts +65 -0
  157. package/src/devtools/index.ts +727 -0
  158. package/src/dto-pipes/index.ts +93 -0
  159. package/src/gateways/index.ts +180 -0
  160. package/src/health/index.ts +198 -0
  161. package/src/http-token.ts +22 -0
  162. package/src/index.ts +167 -0
  163. package/src/integrations/index.ts +50 -0
  164. package/src/middleware/errors.ts +17 -0
  165. package/src/middleware/index.ts +108 -0
  166. package/src/modules/__fixtures__/large-graph.ts +540 -0
  167. package/src/openapi/__fixtures__/entities.ts +19 -0
  168. package/src/openapi/__fixtures__/openapi-tools.fixture.ts +212 -0
  169. package/src/openapi/__fixtures__/route-schemas.ts +27 -0
  170. package/src/openapi/index.ts +483 -0
  171. package/src/pipeline/guards.ts +23 -0
  172. package/src/pipeline/index.ts +2041 -0
  173. package/src/routing/index.ts +201 -0
  174. package/src/static/index.ts +443 -0
  175. package/src/testing/index.ts +58 -0
  176. package/src/traced-router.ts +8 -0
  177. package/src/upload/index.ts +489 -0
  178. package/src/versioning/index.ts +106 -0
  179. package/src/versioning/runtime.ts +38 -0
@@ -0,0 +1,552 @@
1
+ // @zmdb/web/devtools — an on-demand description of the declared module graph.
2
+ //
3
+ // This entry point is deliberately separate from the runtime package roots. It
4
+ // reconstructs the graph from decorator metadata only when called; WebApplication,
5
+ // CompiledModule and Container retain no inspector-specific state.
6
+ import { injectionsOf } from '@zmdb/app/di';
7
+ import { moduleDefOf } from '@zmdb/app/modules';
8
+ import { getRoutes } from '../routing/index.js';
9
+ /** A visible marker that reverse factory edges cannot be derived from declarations. */
10
+ const UNKNOWN_FACTORY_DEPENDENTS = '<factory dependencies unknown>';
11
+ const DEFAULT_DEPTH = 2;
12
+ const MAX_UNFILTERED_PROVIDERS = 50;
13
+ /**
14
+ * Reconstruct the declared graph without constructing a provider or controller.
15
+ *
16
+ * A cycle is returned as a finding instead of thrown, so this remains useful for
17
+ * the graphs that `compileModule` correctly refuses to boot.
18
+ */
19
+ export function describeGraph(rootModule) {
20
+ const records = new Map();
21
+ const order = [];
22
+ const visited = new Set();
23
+ const active = new Set();
24
+ const stack = [];
25
+ const cyclePaths = [];
26
+ const visit = (moduleClass) => {
27
+ if (active.has(moduleClass)) {
28
+ const repeatedAt = stack.indexOf(moduleClass);
29
+ cyclePaths.push([...stack.slice(repeatedAt), moduleClass]);
30
+ return;
31
+ }
32
+ if (visited.has(moduleClass)) {
33
+ return;
34
+ }
35
+ active.add(moduleClass);
36
+ stack.push(moduleClass);
37
+ const definition = moduleDefOf(moduleClass);
38
+ const imports = (definition?.imports ?? []).flatMap(declared => {
39
+ const edge = importEdgeOf(declared);
40
+ return edge === null ? [] : [edge];
41
+ });
42
+ records.set(moduleClass, { module: moduleClass, definition, imports });
43
+ order.push(moduleClass);
44
+ for (const imported of imports) {
45
+ visit(imported.module);
46
+ }
47
+ stack.pop();
48
+ active.delete(moduleClass);
49
+ visited.add(moduleClass);
50
+ };
51
+ visit(rootModule);
52
+ const moduleIds = idsFor(order, 'module', module => module.name, '<anonymous>');
53
+ const eager = eagerModules(rootModule, records);
54
+ const providerRecords = [];
55
+ const controllerRecords = [];
56
+ for (const moduleClass of order) {
57
+ const definition = records.get(moduleClass)?.definition;
58
+ for (const provider of definition?.providers ?? []) {
59
+ providerRecords.push({ definition: provider, module: moduleClass });
60
+ }
61
+ for (const controller of definition?.controllers ?? []) {
62
+ controllerRecords.push({
63
+ controller,
64
+ module: moduleClass,
65
+ injections: injectionsOf(controller),
66
+ });
67
+ }
68
+ }
69
+ const allTokens = [
70
+ ...providerRecords.map(record => record.definition.token),
71
+ ...controllerRecords.flatMap(record => record.injections.map(injection => injection.token)),
72
+ ];
73
+ const tokenIds = idsFor(allTokens, 'provider', token => token.description, '<anonymous-token>');
74
+ const modules = order.map(moduleClass => ({
75
+ id: idOf(moduleIds, moduleClass),
76
+ name: moduleClass.name,
77
+ lazy: !eager.has(moduleClass),
78
+ imports: (records.get(moduleClass)?.imports ?? []).map(edge => idOf(moduleIds, edge.module)),
79
+ }));
80
+ const providers = providerRecords.map(record => {
81
+ const provider = record.definition;
82
+ const common = {
83
+ id: idOf(tokenIds, provider.token),
84
+ token: provider.token.description,
85
+ module: idOf(moduleIds, record.module),
86
+ };
87
+ if ('useValue' in provider) {
88
+ return { kind: 'value', ...common };
89
+ }
90
+ return {
91
+ kind: 'factory',
92
+ ...common,
93
+ scope: provider.scope ?? 'singleton',
94
+ dependencies: null,
95
+ };
96
+ });
97
+ const controllers = controllerRecords.map(record => {
98
+ const moduleId = idOf(moduleIds, record.module);
99
+ return {
100
+ id: `controller:${moduleId.slice('module:'.length)}.${stableName(record.controller.name, '<anonymous>')}`,
101
+ name: record.controller.name,
102
+ module: moduleId,
103
+ routes: getRoutes(record.controller).map(route => ({
104
+ method: route.method,
105
+ path: route.path,
106
+ handler: route.handlerName,
107
+ })),
108
+ dependencies: record.injections.map(injection => idOf(tokenIds, injection.token)),
109
+ };
110
+ });
111
+ const findings = [];
112
+ const seenCycles = new Set();
113
+ for (const path of cyclePaths) {
114
+ const ids = path.map(moduleClass => idOf(moduleIds, moduleClass));
115
+ const key = ids.join('\0');
116
+ if (seenCycles.has(key)) {
117
+ continue;
118
+ }
119
+ seenCycles.add(key);
120
+ findings.push({
121
+ kind: 'cycle',
122
+ severity: 'error',
123
+ message: `Import cycle: ${ids.join(' -> ')}`,
124
+ subject: ids[0] ?? 'module:<unknown>',
125
+ path: ids,
126
+ });
127
+ }
128
+ const providersByToken = groupBy(providerRecords, record => record.definition.token);
129
+ for (const [token, registrations] of providersByToken) {
130
+ const modulesForToken = unique(registrations.map(record => record.module));
131
+ if (modulesForToken.length > 1) {
132
+ findings.push({
133
+ kind: 'duplicate-provider',
134
+ severity: 'error',
135
+ message: `Token "${token.description}" is registered by ` +
136
+ modulesForToken.map(moduleClass => moduleClass.name || '<anonymous>').join(' and '),
137
+ subject: idOf(tokenIds, token),
138
+ });
139
+ }
140
+ }
141
+ for (const record of controllerRecords) {
142
+ const controllerId = controllerIdOf(controllers, record, moduleIds);
143
+ for (const injection of record.injections) {
144
+ const registrations = providersByToken.get(injection.token) ?? [];
145
+ if (registrations.length === 0) {
146
+ findings.push({
147
+ kind: 'unresolved-token',
148
+ severity: 'error',
149
+ message: `${record.controller.name || '<anonymous>'}.${String(injection.field)} injects ` +
150
+ `"${injection.token.description}", but no module registers it`,
151
+ subject: controllerId,
152
+ });
153
+ continue;
154
+ }
155
+ if (eager.has(record.module) && registrations.every(registration => !eager.has(registration.module))) {
156
+ findings.push({
157
+ kind: 'eager-depends-on-lazy',
158
+ severity: 'error',
159
+ message: `Eager controller ${record.controller.name || '<anonymous>'} injects lazy-only token ` +
160
+ `"${injection.token.description}"`,
161
+ subject: controllerId,
162
+ });
163
+ }
164
+ }
165
+ }
166
+ const routes = new Map();
167
+ for (const controller of controllers) {
168
+ for (const route of controller.routes) {
169
+ const key = `${route.method}\0${route.path}`;
170
+ const first = routes.get(key);
171
+ if (first === undefined) {
172
+ routes.set(key, controller.id);
173
+ }
174
+ else {
175
+ findings.push({
176
+ kind: 'shadowed-route',
177
+ severity: 'error',
178
+ message: `${route.method} ${route.path} on ${controller.id} is shadowed by ${first}`,
179
+ subject: controller.id,
180
+ });
181
+ }
182
+ }
183
+ }
184
+ const tokensByDescription = groupBy(unique(allTokens), token => token.description);
185
+ for (const [description, tokens] of tokensByDescription) {
186
+ if (tokens.length < 2) {
187
+ continue;
188
+ }
189
+ for (const token of tokens) {
190
+ findings.push({
191
+ kind: 'duplicate-token-description',
192
+ severity: 'warning',
193
+ message: `Distinct tokens share the description "${description}"`,
194
+ subject: idOf(tokenIds, token),
195
+ });
196
+ }
197
+ }
198
+ for (const moduleClass of order) {
199
+ if (moduleClass.name.length === 0) {
200
+ findings.push({
201
+ kind: 'anonymous-class',
202
+ severity: 'warning',
203
+ message: 'A module has no stable class name',
204
+ subject: idOf(moduleIds, moduleClass),
205
+ });
206
+ }
207
+ }
208
+ for (const controller of controllers) {
209
+ if (controller.name.length === 0) {
210
+ findings.push({
211
+ kind: 'anonymous-class',
212
+ severity: 'warning',
213
+ message: 'A controller has no stable class name',
214
+ subject: controller.id,
215
+ });
216
+ }
217
+ }
218
+ for (const token of unique(allTokens)) {
219
+ if (token.description.length === 0) {
220
+ findings.push({
221
+ kind: 'anonymous-class',
222
+ severity: 'warning',
223
+ message: 'A provider token has no stable description',
224
+ subject: idOf(tokenIds, token),
225
+ });
226
+ }
227
+ }
228
+ return { modules, providers, controllers, findings };
229
+ }
230
+ /**
231
+ * Return known direct reverse edges.
232
+ *
233
+ * Factory provider bodies are opaque. For a provider query, the sentinel keeps
234
+ * that incompleteness visible instead of returning an unsafe "nothing else".
235
+ */
236
+ export function dependentsOf(graph, id) {
237
+ const known = [
238
+ ...graph.providers.flatMap(provider => provider.kind === 'factory' && provider.dependencies?.includes(id) ? [provider.id] : []),
239
+ ...graph.controllers.flatMap(controller => (controller.dependencies.includes(id) ? [controller.id] : [])),
240
+ ];
241
+ const asksAboutProvider = graph.providers.some(provider => provider.id === id);
242
+ const hasOpaqueFactory = graph.providers.some(provider => provider.kind === 'factory' && provider.dependencies === null);
243
+ return asksAboutProvider && hasOpaqueFactory ? [...unique(known), UNKNOWN_FACTORY_DEPENDENTS] : unique(known);
244
+ }
245
+ /** Render a deterministic, readable module tree. */
246
+ export function renderTree(graph, filter) {
247
+ const projection = project(graph, filter);
248
+ const lines = [];
249
+ for (const module of graph.modules) {
250
+ if (!projection.modules.has(module.id)) {
251
+ continue;
252
+ }
253
+ lines.push(`${module.name || '<anonymous>'}${module.lazy ? ' [lazy]' : ''}`);
254
+ const imports = module.imports.filter(id => projection.modules.has(id)).map(id => displayId(id));
255
+ if (imports.length > 0) {
256
+ lines.push(` imports: ${imports.join(', ')}`);
257
+ }
258
+ if (!projection.details) {
259
+ continue;
260
+ }
261
+ for (const provider of graph.providers) {
262
+ if (provider.module !== module.id || !projection.providers.has(provider.id)) {
263
+ continue;
264
+ }
265
+ const detail = provider.kind === 'value'
266
+ ? 'value'
267
+ : `${provider.scope}; ${provider.dependencies === null ? 'dependencies unknown' : 'no dependencies'}`;
268
+ lines.push(` provider ${provider.token} (${detail})`);
269
+ }
270
+ for (const controller of graph.controllers) {
271
+ if (controller.module !== module.id || !projection.controllers.has(controller.id)) {
272
+ continue;
273
+ }
274
+ lines.push(` controller ${controller.name || '<anonymous>'}`);
275
+ for (const route of controller.routes) {
276
+ lines.push(` ${route.method.padEnd(6)} ${route.path.padEnd(30)} ${controller.name || '<anonymous>'}.${route.handler}`);
277
+ }
278
+ }
279
+ }
280
+ if (graph.findings.length > 0) {
281
+ lines.push('findings');
282
+ for (const finding of graph.findings) {
283
+ lines.push(` ${finding.severity.toUpperCase()} ${finding.kind}: ${finding.message}`);
284
+ }
285
+ }
286
+ return `${lines.join('\n')}\n`;
287
+ }
288
+ /** Render Graphviz DOT with every id and label quoted. */
289
+ export function renderDot(graph, filter) {
290
+ const projection = project(graph, filter);
291
+ const lines = ['digraph zmdb {', ' rankdir="LR";'];
292
+ for (const module of graph.modules) {
293
+ if (projection.modules.has(module.id)) {
294
+ lines.push(` ${quote(module.id)} [shape="box", label=${quote(`${module.name || '<anonymous>'}${module.lazy ? ' [lazy]' : ''}`)}];`);
295
+ }
296
+ }
297
+ for (const module of graph.modules) {
298
+ if (!projection.modules.has(module.id)) {
299
+ continue;
300
+ }
301
+ for (const imported of module.imports) {
302
+ if (projection.modules.has(imported)) {
303
+ lines.push(` ${quote(module.id)} -> ${quote(imported)} [label="imports"];`);
304
+ }
305
+ }
306
+ }
307
+ if (projection.details) {
308
+ for (const provider of graph.providers) {
309
+ if (!projection.providers.has(provider.id)) {
310
+ continue;
311
+ }
312
+ const unknown = provider.kind === 'factory' && provider.dependencies === null;
313
+ const attributes = [
314
+ 'shape="ellipse"',
315
+ `label=${quote(provider.kind === 'value'
316
+ ? `${provider.token}\nvalue`
317
+ : `${provider.token}\n${provider.scope}${unknown ? '\ndependencies unknown' : ''}`)}`,
318
+ ...(unknown ? ['style="dashed"'] : []),
319
+ ];
320
+ lines.push(` ${quote(provider.id)} [${attributes.join(', ')}];`);
321
+ if (projection.modules.has(provider.module)) {
322
+ lines.push(` ${quote(provider.module)} -> ${quote(provider.id)} [label="provides"];`);
323
+ }
324
+ if (provider.kind === 'factory' && provider.dependencies !== null) {
325
+ for (const dependency of provider.dependencies) {
326
+ if (projection.providers.has(dependency)) {
327
+ lines.push(` ${quote(provider.id)} -> ${quote(dependency)} [label="depends on"];`);
328
+ }
329
+ }
330
+ }
331
+ }
332
+ for (const controller of graph.controllers) {
333
+ if (!projection.controllers.has(controller.id)) {
334
+ continue;
335
+ }
336
+ const routes = controller.routes.map(route => `${route.method} ${route.path} ${route.handler}`).join('\n');
337
+ lines.push(` ${quote(controller.id)} [shape="component", label=${quote(routes.length === 0 ? controller.name || '<anonymous>' : `${controller.name || '<anonymous>'}\n${routes}`)}];`);
338
+ if (projection.modules.has(controller.module)) {
339
+ lines.push(` ${quote(controller.module)} -> ${quote(controller.id)} [label="controller"];`);
340
+ }
341
+ for (const dependency of controller.dependencies) {
342
+ if (projection.providers.has(dependency)) {
343
+ lines.push(` ${quote(controller.id)} -> ${quote(dependency)} [label="injects"];`);
344
+ }
345
+ }
346
+ }
347
+ }
348
+ lines.push('}');
349
+ return `${lines.join('\n')}\n`;
350
+ }
351
+ function importEdgeOf(declared) {
352
+ if (isModuleClass(declared)) {
353
+ return { module: declared, lazy: false };
354
+ }
355
+ if (typeof declared !== 'object' || declared === null) {
356
+ return null;
357
+ }
358
+ const candidate = declared;
359
+ return candidate.kind === 'lazy' && isModuleClass(candidate.module) ? { module: candidate.module, lazy: true } : null;
360
+ }
361
+ function isModuleClass(value) {
362
+ return typeof value === 'function';
363
+ }
364
+ function eagerModules(root, records) {
365
+ const eager = new Set();
366
+ const mark = (moduleClass) => {
367
+ if (eager.has(moduleClass)) {
368
+ return;
369
+ }
370
+ eager.add(moduleClass);
371
+ for (const imported of records.get(moduleClass)?.imports ?? []) {
372
+ if (!imported.lazy) {
373
+ mark(imported.module);
374
+ }
375
+ }
376
+ };
377
+ mark(root);
378
+ return eager;
379
+ }
380
+ function idsFor(values, namespace, describe, anonymous) {
381
+ const distinct = unique(values);
382
+ const groups = groupBy(distinct, value => stableName(describe(value), anonymous));
383
+ const ids = new Map();
384
+ const used = new Set();
385
+ for (const [description, group] of groups) {
386
+ group.forEach((value, index) => {
387
+ const base = `${namespace}:${description}${group.length > 1 ? `#${String(index + 1)}` : ''}`;
388
+ let candidate = base;
389
+ let disambiguator = 2;
390
+ while (used.has(candidate)) {
391
+ candidate = `${base}#${String(disambiguator)}`;
392
+ disambiguator += 1;
393
+ }
394
+ used.add(candidate);
395
+ ids.set(value, candidate);
396
+ });
397
+ }
398
+ return ids;
399
+ }
400
+ function idOf(ids, value) {
401
+ return ids.get(value) ?? '<unknown>';
402
+ }
403
+ function controllerIdOf(controllers, record, moduleIds) {
404
+ const expected = `controller:${idOf(moduleIds, record.module).slice('module:'.length)}.${stableName(record.controller.name, '<anonymous>')}`;
405
+ return controllers.find(controller => controller.id === expected)?.id ?? expected;
406
+ }
407
+ function stableName(name, fallback) {
408
+ return name.length === 0 ? fallback : name;
409
+ }
410
+ function groupBy(values, keyOf) {
411
+ const groups = new Map();
412
+ for (const value of values) {
413
+ const key = keyOf(value);
414
+ const group = groups.get(key);
415
+ if (group === undefined) {
416
+ groups.set(key, [value]);
417
+ }
418
+ else {
419
+ group.push(value);
420
+ }
421
+ }
422
+ return groups;
423
+ }
424
+ function unique(values) {
425
+ return [...new Set(values)];
426
+ }
427
+ function project(graph, filter = {}) {
428
+ const depth = filter.depth ?? DEFAULT_DEPTH;
429
+ if (!Number.isInteger(depth) || depth < 0) {
430
+ throw new Error(`depth must be a non-negative integer, received ${String(depth)}`);
431
+ }
432
+ const details = filter.providers === true || filter.module !== undefined || filter.token !== undefined;
433
+ if (details &&
434
+ filter.module === undefined &&
435
+ filter.token === undefined &&
436
+ graph.providers.length > MAX_UNFILTERED_PROVIDERS) {
437
+ const moduleNames = graph.modules.map(module => module.name || '<anonymous>').join(', ');
438
+ throw new Error(`refusing an unfiltered graph with ${String(graph.providers.length)} provider nodes; ` +
439
+ `filter with module or token (${moduleNames})`);
440
+ }
441
+ const modules = new Set();
442
+ const providers = new Set();
443
+ const controllers = new Set();
444
+ if (filter.module !== undefined) {
445
+ const root = graph.modules.find(module => module.name === filter.module || module.id === filter.module);
446
+ if (root === undefined) {
447
+ throw new Error(`no module named "${filter.module}"`);
448
+ }
449
+ const queue = [{ id: root.id, distance: 0 }];
450
+ while (queue.length > 0) {
451
+ const current = queue.shift();
452
+ if (current === undefined || modules.has(current.id) || current.distance > depth) {
453
+ continue;
454
+ }
455
+ modules.add(current.id);
456
+ const node = graph.modules.find(module => module.id === current.id);
457
+ for (const imported of node?.imports ?? []) {
458
+ queue.push({ id: imported, distance: current.distance + 1 });
459
+ }
460
+ }
461
+ }
462
+ else if (filter.token === undefined) {
463
+ for (const module of graph.modules) {
464
+ modules.add(module.id);
465
+ }
466
+ }
467
+ if (filter.token !== undefined) {
468
+ const seeds = graph.providers.filter(provider => provider.token === filter.token || provider.id === filter.token);
469
+ if (seeds.length === 0) {
470
+ throw new Error(`no token named "${filter.token}"`);
471
+ }
472
+ const adjacency = dependencyAdjacency(graph);
473
+ const queue = seeds.map(provider => ({
474
+ id: provider.id,
475
+ distance: 0,
476
+ }));
477
+ const seen = new Set();
478
+ while (queue.length > 0) {
479
+ const current = queue.shift();
480
+ if (current === undefined || seen.has(current.id) || current.distance > depth) {
481
+ continue;
482
+ }
483
+ seen.add(current.id);
484
+ const provider = graph.providers.find(node => node.id === current.id);
485
+ if (provider !== undefined) {
486
+ providers.add(provider.id);
487
+ modules.add(provider.module);
488
+ }
489
+ const controller = graph.controllers.find(node => node.id === current.id);
490
+ if (controller !== undefined) {
491
+ controllers.add(controller.id);
492
+ modules.add(controller.module);
493
+ }
494
+ for (const neighbour of adjacency.get(current.id) ?? []) {
495
+ queue.push({ id: neighbour, distance: current.distance + 1 });
496
+ }
497
+ }
498
+ }
499
+ if (details && filter.token === undefined) {
500
+ for (const provider of graph.providers) {
501
+ if (modules.has(provider.module)) {
502
+ providers.add(provider.id);
503
+ }
504
+ }
505
+ for (const controller of graph.controllers) {
506
+ if (modules.has(controller.module)) {
507
+ controllers.add(controller.id);
508
+ }
509
+ }
510
+ }
511
+ return { modules, providers, controllers, details };
512
+ }
513
+ function dependencyAdjacency(graph) {
514
+ const adjacency = new Map();
515
+ const connect = (left, right) => {
516
+ const fromLeft = adjacency.get(left);
517
+ if (fromLeft === undefined) {
518
+ adjacency.set(left, new Set([right]));
519
+ }
520
+ else {
521
+ fromLeft.add(right);
522
+ }
523
+ const fromRight = adjacency.get(right);
524
+ if (fromRight === undefined) {
525
+ adjacency.set(right, new Set([left]));
526
+ }
527
+ else {
528
+ fromRight.add(left);
529
+ }
530
+ };
531
+ for (const provider of graph.providers) {
532
+ if (provider.kind === 'factory' && provider.dependencies !== null) {
533
+ for (const dependency of provider.dependencies) {
534
+ connect(provider.id, dependency);
535
+ }
536
+ }
537
+ }
538
+ for (const controller of graph.controllers) {
539
+ for (const dependency of controller.dependencies) {
540
+ connect(controller.id, dependency);
541
+ }
542
+ }
543
+ return adjacency;
544
+ }
545
+ function displayId(id) {
546
+ const separator = id.indexOf(':');
547
+ return separator === -1 ? id : id.slice(separator + 1);
548
+ }
549
+ function quote(value) {
550
+ return `"${value.replaceAll('\\', '\\\\').replaceAll('"', '\\"').replaceAll('\n', '\\n')}"`;
551
+ }
552
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/devtools/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { Chain, Pipe, Interceptor } from '../middleware/index.js';
2
+ import { type Multipart, type UploadLimits } from '../upload/index.js';
3
+ /**
4
+ * A validation pipe: runs `validator` (e.g. `assert<CreateDTO<S>>`) on the body,
5
+ * yielding the typed value. A throw becomes the chain's 400. The framework
6
+ * embeds no parser — validation is the consumer's AOT `assert`.
7
+ */
8
+ export declare function validationPipe<T>(validator: (raw: unknown) => T): Pipe<unknown, T>;
9
+ /**
10
+ * A pipe that only converts: the wire→app decode at the boundary (plan D3).
11
+ *
12
+ * Separate from `validationPipe` because the two do different jobs and the order matters.
13
+ * `wireDecoder(Schema)` turns the ISO string JSON carries into the `Date` a `CreateDTO`
14
+ * asks for; the validator then checks the app type. Decoding after validation would mean
15
+ * validating the wrong layer, and doing both in one function is how a validator ends up
16
+ * accepting `Date | string` and checking neither.
17
+ */
18
+ export declare function decodePipe<In = unknown, Out = unknown>(decode: (value: In) => Out): Pipe<In, Out>;
19
+ /**
20
+ * Parse the exact request bytes as multipart at the ordinary pipe boundary.
21
+ *
22
+ * The returned `Multipart` remains available to later validation pipes, so form
23
+ * fields use the same validation path as JSON bodies.
24
+ */
25
+ export declare function multipartPipe(limits?: Partial<UploadLimits>): Pipe<unknown, Multipart>;
26
+ /**
27
+ * A serialization interceptor: transforms the handler's result via `serialize`
28
+ * (default: identity — the pipeline JSON-encodes downstream). Pass an entity
29
+ * serializer to shape the response from `Entity<S>`.
30
+ */
31
+ export declare function serializationInterceptor(serialize?: (result: unknown) => unknown): Interceptor;
32
+ /** Options for `dtoChain`. */
33
+ export interface DtoChainOptions<T> {
34
+ /** The wire→app decode, e.g. `wireDecoder(Schema, 'create')`. Runs before `validate`. */
35
+ readonly decode?: (raw: unknown) => unknown;
36
+ readonly validate: (raw: unknown) => T;
37
+ readonly serialize?: (result: unknown) => unknown;
38
+ }
39
+ /**
40
+ * Compose a Chain with the validation pipe (+ optional decode pipe and
41
+ * serialization interceptor), so a route adopts DTO validation/serialization in
42
+ * one call.
43
+ */
44
+ export declare function dtoChain<T>(options: DtoChainOptions<T>): Chain;
45
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dto-pipes/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAkB,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAMlF;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,GAAG,OAAO,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAMjG;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,GAAE,OAAO,CAAC,YAAY,CAAM,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAO1F;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,GAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAgB,GAAG,WAAW,CAOtG;AAED,8BAA8B;AAC9B,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,yFAAyF;IACzF,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,CAAC,CAAC;IACvC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;CACnD;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,KAAK,CAY9D"}