@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
package/README.md ADDED
@@ -0,0 +1,49 @@
1
+ # @zmdb/web
2
+
3
+ `@zmdb/web` is the HTTP framework for zmdb applications. It composes controllers, typed request contexts, middleware, OpenAPI, gateways, testing utilities, and runtime adapters over the
4
+ protocol-neutral `@zmdb/app` kernel. It does not use `reflect-metadata` or runtime type reflection.
5
+
6
+ It is part of [zmdb](https://github.com/ambasta/zmdb), where one TypeScript schema drives validation, serialization, SQL, OpenAPI, and CRUD.
7
+
8
+ Applications normally install `zmdb` and use `zmdb/web`; see the [server journey](https://ambasta.github.io/zmdb/docs/web-overview.html). Select this package directly when an advanced dependency
9
+ boundary needs HTTP without the full product facade.
10
+
11
+ ## Advanced: install HTTP alone
12
+
13
+ ```bash
14
+ yarn add @zmdb/web@1.0.0-beta.1
15
+ ```
16
+
17
+ > **Prerelease** (`1.0.0-beta.1`). Requires **Node.js 26+** and is **ESM-only**. Ships built ESM `.js` + `.d.ts` under `./dist`.
18
+
19
+ ## Entry points
20
+
21
+ The package root contains the common HTTP APIs. Its complete feature entry set is `/app`, `/compression`, `/context`, `/contract`, `/contract/compiler`, `/csrf`, `/data`, `/devtools`, `/dto-pipes`,
22
+ `/gateways`, `/health`, `/integrations`, `/middleware`, `/openapi`, `/pipeline`, `/routing`, `/static`, `/testing`, `/upload`, and `/versioning`.
23
+
24
+ `@zmdb/web/contract` contains inert HTTP declarations and serialisable `HttpContractIR`. The build-time `@zmdb/web/contract/compiler` entry compiles those declarations and emits deterministic typed
25
+ client modules whose runtime imports are limited to `@zmdb/client`. `zmdb client generate` projects the same compiled IR into sibling OpenAPI and client artifacts; it does not derive one from the
26
+ other.
27
+
28
+ Typed gRPC servers and clients ship from `@zmdb/transport-grpc`, core NATS ships from `@zmdb/transport-nats`, RabbitMQ ships from `@zmdb/transport-rabbitmq`, and Redis Pub/Sub ships from
29
+ `@zmdb/transport-redis`; none of their old web subpaths forwards. The transport-neutral strategy, dispatcher, decorators, and typed clients live at `@zmdb/app/messaging`. Queues, workers, scheduling,
30
+ and leases live in `@zmdb/jobs`; SQLite durable and memory storage lives in the separately selected `@zmdb/jobs-sqlite`. The removed web paths do not forward. Install
31
+ `@zmdb/jobs-postgres@1.0.0-beta.1` with `pg@^8.23.0` when those jobs use a caller-owned PostgreSQL pool or client.
32
+
33
+ Stage-3 metadata, dependency injection, modules, lifecycle, messaging, commands, events, CQRS, state machines, health contracts, and dependency-free observability ports live in `@zmdb/app`. Install
34
+ `@zmdb/otel@1.0.0-beta.1` with `@opentelemetry/api@^1.9.1` to adapt caller-owned tracers and meters; web has no OpenTelemetry peer or forwarding subpath.
35
+
36
+ `@zmdb/web/versioning` provides version decorators and the path, header, and media-type strategies used by the router and OpenAPI generator.
37
+
38
+ Install each selected transport package with its required peer: grpc-js `^1.14.4`, the Node NATS transport `^3.4.0`, amqplib `^2.0.1`, or redis `^6.2.1`. `@zmdb/web` declares no third-party runtime
39
+ peer and publishes no broker or benchmark-helper subpath. Its optional TypeScript peer is reached only by the build-time `/contract/compiler` entry.
40
+
41
+ ## Documentation
42
+
43
+ Generated-client journey: **https://ambasta.github.io/zmdb/docs/generated-client.html**
44
+
45
+ Full docs: **https://ambasta.github.io/zmdb/**
46
+
47
+ ## License
48
+
49
+ GNU General Public License v3.0 or later (GPL-3.0-or-later) — see [LICENSE](./LICENSE).
@@ -0,0 +1,12 @@
1
+ import type { Application, ApplicationOptions, CompiledModule, Constructor } from '@zmdb/app';
2
+ export type CompiledController = {
3
+ readonly kind: 'eager';
4
+ readonly controller: object;
5
+ } | {
6
+ readonly kind: 'deferred';
7
+ readonly controller: Constructor<object>;
8
+ readonly instance: () => Promise<object>;
9
+ };
10
+ export declare function applicationControllersOf(application: Application): readonly CompiledController[];
11
+ export declare function withCompiledApplication(options: ApplicationOptions, compiled: CompiledModule): ApplicationOptions;
12
+ //# sourceMappingURL=bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/app/bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAK9F,MAAM,MAAM,kBAAkB,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACvD;IACE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CAC1C,CAAC;AAcN,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS,kBAAkB,EAAE,CAOhG;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,cAAc,GAAG,kBAAkB,CAIjH"}
@@ -0,0 +1,16 @@
1
+ const APPLICATION_BRIDGE = Symbol.for('@zmdb/app.application-bridge');
2
+ const COMPILED_APPLICATION = Symbol.for('@zmdb/app.compiled-application');
3
+ export function applicationControllersOf(application) {
4
+ const carrier = application;
5
+ const bridge = carrier[APPLICATION_BRIDGE];
6
+ if (bridge === undefined) {
7
+ throw new Error('@zmdb/web: application omitted its controller graph');
8
+ }
9
+ return bridge.controllers;
10
+ }
11
+ export function withCompiledApplication(options, compiled) {
12
+ const carrier = { ...options };
13
+ Object.defineProperty(carrier, COMPILED_APPLICATION, { value: compiled });
14
+ return carrier;
15
+ }
16
+ //# sourceMappingURL=bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../src/app/bridge.ts"],"names":[],"mappings":"AAEA,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;AACtE,MAAM,oBAAoB,GAAG,MAAM,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;AAsB1E,MAAM,UAAU,wBAAwB,CAAC,WAAwB;IAC/D,MAAM,OAAO,GAAuB,WAAW,CAAC;IAChD,MAAM,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC3C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,MAAM,CAAC,WAAW,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAA2B,EAAE,QAAwB;IAC3F,MAAM,OAAO,GAAoD,EAAE,GAAG,OAAO,EAAE,CAAC;IAChF,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,oBAAoB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC1E,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { type Application, type ApplicationOptions, type ModuleClass } from '@zmdb/app';
2
+ import { type GuardRegistry, type WebRequest, type WebResponse } from '../pipeline/index.js';
3
+ import type { VersionStrategy } from '../versioning/index.js';
4
+ export type { OnApplicationBootstrap, OnModuleInit, OnShutdown } from '@zmdb/app/lifecycle';
5
+ /**
6
+ * Protocol integrations attach through `ApplicationOptions.extensions`.
7
+ */
8
+ export interface WebApplicationOptions extends ApplicationOptions {
9
+ readonly guardRegistry?: GuardRegistry;
10
+ readonly versioning?: VersionStrategy;
11
+ }
12
+ /** A protocol-neutral application with one HTTP router attached. */
13
+ export interface WebApplication extends Application {
14
+ handle(req: WebRequest): Promise<WebResponse>;
15
+ fetch(request: Request): Promise<Response>;
16
+ }
17
+ /**
18
+ * Compose one router over one application graph. The container, lazy handles,
19
+ * init function and async-dispose function are the app-owned members by
20
+ * identity; no second lifecycle or construction ledger exists here.
21
+ */
22
+ export declare function createApp(rootModule: ModuleClass, options?: WebApplicationOptions): WebApplication;
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/app/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAqB,KAAK,WAAW,EAAE,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAE3G,OAAO,EAGL,KAAK,aAAa,EAGlB,KAAK,UAAU,EACf,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG9D,YAAY,EAAE,sBAAsB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE5F;;GAEG;AACH,MAAM,WAAW,qBAAsB,SAAQ,kBAAkB;IAC/D,QAAQ,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC;IACvC,QAAQ,CAAC,UAAU,CAAC,EAAE,eAAe,CAAC;CACvC;AAED,oEAAoE;AACpE,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9C,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC5C;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,WAAW,EAAE,OAAO,GAAE,qBAA0B,GAAG,cAAc,CA2BtG"}
@@ -0,0 +1,47 @@
1
+ // @zmdb/web — HTTP application composition over the protocol-neutral kernel.
2
+ // One @zmdb/app graph owns construction, lazy loading and lifecycle; this file
3
+ // adds one startup-built router; protocol integrations remain explicit app extensions.
4
+ import { createApplication } from '@zmdb/app';
5
+ import { createRouter, toFetchHandler, } from '../pipeline/index.js';
6
+ import { applicationControllersOf } from './bridge.js';
7
+ /**
8
+ * Compose one router over one application graph. The container, lazy handles,
9
+ * init function and async-dispose function are the app-owned members by
10
+ * identity; no second lifecycle or construction ledger exists here.
11
+ */
12
+ export function createApp(rootModule, options = {}) {
13
+ const applicationOptions = {
14
+ ...(options.graceMs === undefined ? {} : { graceMs: options.graceMs }),
15
+ ...(options.observability === undefined ? {} : { observability: options.observability }),
16
+ ...(options.extensions === undefined ? {} : { extensions: options.extensions }),
17
+ };
18
+ const application = createApplication(rootModule, applicationOptions);
19
+ const controllerBindings = applicationControllersOf(application);
20
+ const router = createRouter(routerOptions(options));
21
+ for (const binding of controllerBindings) {
22
+ if (binding.kind === 'eager') {
23
+ router.register(binding.controller);
24
+ }
25
+ else {
26
+ router.registerDeferred(binding.controller, binding.instance);
27
+ }
28
+ }
29
+ const fetchHandler = toFetchHandler(router);
30
+ return {
31
+ container: application.container,
32
+ lazy: application.lazy,
33
+ handle: req => router.handle(req),
34
+ fetch: request => fetchHandler(request),
35
+ init: application.init,
36
+ [Symbol.asyncDispose]: application[Symbol.asyncDispose],
37
+ };
38
+ }
39
+ function routerOptions(options) {
40
+ const observability = options.observability ?? {};
41
+ return {
42
+ ...observability,
43
+ ...(options.guardRegistry === undefined ? {} : { guardRegistry: options.guardRegistry }),
44
+ ...(options.versioning === undefined ? {} : { versioning: options.versioning }),
45
+ };
46
+ }
47
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/app/index.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,+EAA+E;AAC/E,uFAAuF;AAEvF,OAAO,EAAE,iBAAiB,EAA+D,MAAM,WAAW,CAAC;AAE3G,OAAO,EACL,YAAY,EACZ,cAAc,GAMf,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,wBAAwB,EAA2B,MAAM,aAAa,CAAC;AAkBhF;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,UAAuB,EAAE,OAAO,GAA0B,EAAE;IACpF,MAAM,kBAAkB,GAAuB;QAC7C,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;QACtE,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;QACxF,GAAG,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;KAChF,CAAC;IACF,MAAM,WAAW,GAAG,iBAAiB,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;IACtE,MAAM,kBAAkB,GAAkC,wBAAwB,CAAC,WAAW,CAAC,CAAC;IAEhG,MAAM,MAAM,GAAW,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5D,KAAK,MAAM,OAAO,IAAI,kBAAkB,EAAE,CAAC;QACzC,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC7B,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IACD,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAE5C,OAAO;QACL,SAAS,EAAE,WAAW,CAAC,SAAS;QAChC,IAAI,EAAE,WAAW,CAAC,IAAI;QACtB,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;QACjC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC;QACvC,IAAI,EAAE,WAAW,CAAC,IAAI;QACtB,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,YAAY,CAAC;KACxD,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,OAA8B;IACnD,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;IAClD,OAAO;QACL,GAAG,aAAa;QAChB,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;QACxF,GAAG,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;KAChF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,68 @@
1
+ import '@zmdb/app';
2
+ import type { ModuleClass } from '@zmdb/app/modules';
3
+ import { type Observability } from '@zmdb/app/observability';
4
+ import { type VersionStrategy } from '../versioning/index.js';
5
+ /** A probe that counts reads of a class's Symbol.metadata. */
6
+ export interface MetadataReadCounter {
7
+ count(): number;
8
+ restore(): void;
9
+ }
10
+ /**
11
+ * Instrument a class so reads of its `Symbol.metadata` are counted. Replaces the
12
+ * own property with a counting getter over the original value; `restore` puts
13
+ * the original descriptor back. Test-only helper for the regression guard.
14
+ */
15
+ export declare function countMetadataReads(target: object): MetadataReadCounter;
16
+ interface BenchmarkBaseOptions {
17
+ readonly routes: number;
18
+ readonly iters: number;
19
+ }
20
+ /** Options for the router microbench, including one exact versioned route table. */
21
+ export type BenchmarkOptions = (BenchmarkBaseOptions & {
22
+ readonly versioning?: undefined;
23
+ readonly version?: undefined;
24
+ }) | (BenchmarkBaseOptions & {
25
+ readonly versioning: VersionStrategy;
26
+ readonly version: string;
27
+ });
28
+ /** Honest microbench result — raw timings, no scoring. */
29
+ export interface BenchmarkResult {
30
+ readonly iters: number;
31
+ readonly totalMs: number;
32
+ readonly opsPerSec: number;
33
+ }
34
+ /** The three tracing configurations measured by the operability benchmark. */
35
+ export type ObservabilityBenchmarkMode = 'off' | 'noop' | 'recording-exporter';
36
+ /** The independently timed observability hot paths. */
37
+ export type ObservabilityBenchmarkWorkload = 'request' | 'query';
38
+ /** Options for one independently orderable observability sample. */
39
+ export interface ObservabilityBenchmarkOptions {
40
+ readonly mode: ObservabilityBenchmarkMode;
41
+ readonly workload: ObservabilityBenchmarkWorkload;
42
+ readonly iters: number;
43
+ readonly observability?: Observability;
44
+ }
45
+ /** One raw workload timing. The checksum makes the loop's result observable. */
46
+ export interface ObservabilityBenchmarkResult extends BenchmarkResult {
47
+ readonly mode: ObservabilityBenchmarkMode;
48
+ readonly workload: ObservabilityBenchmarkWorkload;
49
+ readonly checksum: number;
50
+ }
51
+ /** Measure repeated eager application creation with raw timings. */
52
+ export declare function benchmarkAppStartup(rootModule: ModuleClass, iters: number): BenchmarkResult;
53
+ /**
54
+ * Build a router with `routes` GET routes and time `iters` `handle` calls
55
+ * against a matching path. Returns raw timings — no averaging into a score.
56
+ */
57
+ export declare function benchmarkRouter(options: BenchmarkOptions): Promise<BenchmarkResult>;
58
+ /**
59
+ * Measure one request or driver hot path under an injected tracing configuration.
60
+ *
61
+ * Tracer construction belongs to the top-level benchmark runner: this shipped
62
+ * helper depends only on the framework's narrow observability port, never on an
63
+ * SDK. The runner calls the same function for elapsed-time warmup and for every
64
+ * raw sample, flushing an exporter only after this timer has stopped.
65
+ */
66
+ export declare function benchmarkObservability(options: ObservabilityBenchmarkOptions): Promise<ObservabilityBenchmarkResult>;
67
+ export {};
68
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bench/index.ts"],"names":[],"mappings":"AAIA,OAAO,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAsC,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAKjG,OAAO,EAAW,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGvE,8DAA8D;AAC9D,MAAM,WAAW,mBAAmB;IAClC,KAAK,IAAI,MAAM,CAAC;IAChB,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,mBAAmB,CAsBtE;AAED,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,oFAAoF;AACpF,MAAM,MAAM,gBAAgB,GACxB,CAAC,oBAAoB,GAAG;IAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC,GAC1F,CAAC,oBAAoB,GAAG;IAAE,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEhG,0DAA0D;AAC1D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,8EAA8E;AAC9E,MAAM,MAAM,0BAA0B,GAAG,KAAK,GAAG,MAAM,GAAG,oBAAoB,CAAC;AAE/E,uDAAuD;AACvD,MAAM,MAAM,8BAA8B,GAAG,SAAS,GAAG,OAAO,CAAC;AAEjE,oEAAoE;AACpE,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,IAAI,EAAE,0BAA0B,CAAC;IAC1C,QAAQ,CAAC,QAAQ,EAAE,8BAA8B,CAAC;IAClD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC;CACxC;AAED,gFAAgF;AAChF,MAAM,WAAW,4BAA6B,SAAQ,eAAe;IACnE,QAAQ,CAAC,IAAI,EAAE,0BAA0B,CAAC;IAC1C,QAAQ,CAAC,QAAQ,EAAE,8BAA8B,CAAC;IAClD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,oEAAoE;AACpE,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,CAQ3F;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAwBzF;AAED;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,4BAA4B,CAAC,CAEvC"}
@@ -0,0 +1,250 @@
1
+ // @zmdb/web — router benchmark & perf verification (epic #317, spec ./SPEC.md).
2
+ // An honest microbench + an init-time-resolution probe proving route resolution
3
+ // does not re-read metadata per request. No `as` on the consumer surface.
4
+ import '@zmdb/app';
5
+ import { tracedDriver } from '@zmdb/app/observability';
6
+ import { createApp } from '../app/index.js';
7
+ import { createRouter } from '../pipeline/index.js';
8
+ import { Controller, Get } from '../routing/index.js';
9
+ import { Version } from '../versioning/index.js';
10
+ import { pathForVersion } from '../versioning/runtime.js';
11
+ /**
12
+ * Instrument a class so reads of its `Symbol.metadata` are counted. Replaces the
13
+ * own property with a counting getter over the original value; `restore` puts
14
+ * the original descriptor back. Test-only helper for the regression guard.
15
+ */
16
+ export function countMetadataReads(target) {
17
+ const original = Object.getOwnPropertyDescriptor(target, Symbol.metadata);
18
+ const stored = original?.value;
19
+ let reads = 0;
20
+ Object.defineProperty(target, Symbol.metadata, {
21
+ configurable: true,
22
+ enumerable: original?.enumerable ?? false,
23
+ get() {
24
+ reads += 1;
25
+ return stored;
26
+ },
27
+ });
28
+ return {
29
+ count: () => reads,
30
+ restore: () => {
31
+ if (original === undefined) {
32
+ Reflect.deleteProperty(target, Symbol.metadata);
33
+ }
34
+ else {
35
+ Object.defineProperty(target, Symbol.metadata, original);
36
+ }
37
+ },
38
+ };
39
+ }
40
+ /** Measure repeated eager application creation with raw timings. */
41
+ export function benchmarkAppStartup(rootModule, iters) {
42
+ const start = performance.now();
43
+ for (let index = 0; index < iters; index += 1) {
44
+ createApp(rootModule);
45
+ }
46
+ const totalMs = performance.now() - start;
47
+ const opsPerSec = totalMs > 0 ? (iters / totalMs) * 1000 : iters;
48
+ return { iters, totalMs, opsPerSec };
49
+ }
50
+ /**
51
+ * Build a router with `routes` GET routes and time `iters` `handle` calls
52
+ * against a matching path. Returns raw timings — no averaging into a score.
53
+ */
54
+ export async function benchmarkRouter(options) {
55
+ const controller = makeController(options.routes, options.version);
56
+ const router = createRouter(options.versioning === undefined ? {} : { versioning: options.versioning });
57
+ router.register(controller);
58
+ const routePath = `/bench/r${Math.max(0, options.routes - 1)}`;
59
+ let path = routePath;
60
+ let headers = {};
61
+ if (options.versioning !== undefined) {
62
+ if (options.versioning.kind === 'path') {
63
+ path = pathForVersion(options.versioning.prefix, options.version, routePath);
64
+ }
65
+ else if (options.versioning.kind === 'header') {
66
+ headers = { [options.versioning.name.toLowerCase()]: options.version };
67
+ }
68
+ else {
69
+ headers = { accept: `application/json; ${options.versioning.key}=${options.version}` };
70
+ }
71
+ }
72
+ const start = performance.now();
73
+ for (let i = 0; i < options.iters; i += 1) {
74
+ await router.handle({ method: 'GET', path, headers });
75
+ }
76
+ const totalMs = performance.now() - start;
77
+ const opsPerSec = totalMs > 0 ? (options.iters / totalMs) * 1000 : options.iters;
78
+ return { iters: options.iters, totalMs, opsPerSec };
79
+ }
80
+ /**
81
+ * Measure one request or driver hot path under an injected tracing configuration.
82
+ *
83
+ * Tracer construction belongs to the top-level benchmark runner: this shipped
84
+ * helper depends only on the framework's narrow observability port, never on an
85
+ * SDK. The runner calls the same function for elapsed-time warmup and for every
86
+ * raw sample, flushing an exporter only after this timer has stopped.
87
+ */
88
+ export async function benchmarkObservability(options) {
89
+ return options.workload === 'request' ? benchmarkRequest(options) : benchmarkQuery(options);
90
+ }
91
+ async function benchmarkRequest(options) {
92
+ const observability = options.observability ?? {};
93
+ const router = createRouter(observability);
94
+ router.register(makeController(1));
95
+ const request = Object.freeze({ method: 'GET', path: '/bench/r0', headers: Object.freeze({}) });
96
+ let checksum = 0;
97
+ const start = performance.now();
98
+ for (let i = 0; i < options.iters; i += 1) {
99
+ const response = await router.handle(request);
100
+ checksum = (checksum + response.status + responseBodySize(response.body)) >>> 0;
101
+ }
102
+ return observabilityResult(options, performance.now() - start, checksum);
103
+ }
104
+ async function benchmarkQuery(options) {
105
+ const observability = options.observability ?? {};
106
+ const driver = tracedDriver({
107
+ execute: query => {
108
+ const id = query.parameters[0];
109
+ return Promise.resolve(typeof id === 'number' && id % 2 === 0 ? TWO_ROWS : ONE_ROW);
110
+ },
111
+ }, observability);
112
+ let checksum = 0;
113
+ const start = performance.now();
114
+ for (let i = 0; i < options.iters; i += 1) {
115
+ const rows = await driver.execute(benchQuery(i));
116
+ checksum = (checksum + rows.length) >>> 0;
117
+ }
118
+ return observabilityResult(options, performance.now() - start, checksum);
119
+ }
120
+ function observabilityResult(options, totalMs, checksum) {
121
+ return {
122
+ mode: options.mode,
123
+ workload: options.workload,
124
+ ...result(options.iters, totalMs),
125
+ checksum,
126
+ };
127
+ }
128
+ const QUERY_TELEMETRY = Object.freeze({
129
+ system: 'postgresql',
130
+ operation: 'SELECT',
131
+ collection: 'bench',
132
+ });
133
+ const BENCH_QUERIES = Object.freeze(Array.from({ length: 8 }, (_, index) => Object.freeze({
134
+ text: 'SELECT "id" FROM "bench" WHERE "id" = $1',
135
+ parameters: Object.freeze([index + 1]),
136
+ telemetry: QUERY_TELEMETRY,
137
+ })));
138
+ const ONE_ROW = Object.freeze([Object.freeze({ id: 1 })]);
139
+ const TWO_ROWS = Object.freeze([
140
+ Object.freeze({ id: 1 }),
141
+ Object.freeze({ id: 2 }),
142
+ ]);
143
+ function benchQuery(index) {
144
+ const query = BENCH_QUERIES[index % BENCH_QUERIES.length];
145
+ if (query === undefined) {
146
+ throw new Error('observability benchmark query pool is empty');
147
+ }
148
+ return query;
149
+ }
150
+ function responseBodySize(body) {
151
+ if (typeof body.value === 'string') {
152
+ return body.value.length;
153
+ }
154
+ if (body.value instanceof Uint8Array) {
155
+ return body.value.byteLength;
156
+ }
157
+ return 'length' in body ? (body.length ?? 0) : 0;
158
+ }
159
+ // Build a controller instance with `count` GET routes /bench/r0../bench/r{n-1}.
160
+ // Defined via a factory so each benchmark gets a fresh class + metadata.
161
+ function makeController(count, version) {
162
+ class BenchController {
163
+ // Every route resolves to this one method, aliased under `count` names below. A benchmark
164
+ // that allocated a fresh closure per route would be measuring that instead of the router.
165
+ ok() {
166
+ return { ok: true };
167
+ }
168
+ }
169
+ // `@Controller('/bench')` in decorator position instead, except that decorators are real
170
+ // syntax rather than types, so a file containing one cannot be loaded by Node's type
171
+ // stripping — and this package ships its `src`. A single decorator here was enough to make
172
+ // `import '@zmdb/web'` a SyntaxError, because the root index re-exports this module. Applied
173
+ // programmatically it costs a synthesised context; the routing decorators only ever touch
174
+ // `context.metadata`, which is what makes the substitution exact.
175
+ Controller('/bench')(BenchController, classContext(BenchController));
176
+ if (version !== undefined) {
177
+ Version(version)(BenchController, classContext(BenchController));
178
+ }
179
+ // Attach `count` routes by decorating dynamically-added methods. Since Stage-3
180
+ // method decorators can't be applied dynamically, we register handlers on the
181
+ // prototype and record routes through a single re-decoration pass: simplest is
182
+ // to define a fixed handler and add route metadata via the Get decorator on
183
+ // named prototype methods.
184
+ const proto = BenchController.prototype;
185
+ for (let i = 0; i < count; i += 1) {
186
+ const name = `r${i}`;
187
+ Object.defineProperty(proto, name, {
188
+ configurable: true,
189
+ writable: true,
190
+ value: proto.ok,
191
+ });
192
+ const decorate = Get(`/r${i}`);
193
+ const context = methodContext(name, BenchController);
194
+ decorate(readProtoMethod(proto, name), context);
195
+ }
196
+ return new BenchController();
197
+ }
198
+ function result(iters, totalMs) {
199
+ return {
200
+ iters,
201
+ totalMs,
202
+ opsPerSec: totalMs > 0 ? (iters / totalMs) * 1000 : iters,
203
+ };
204
+ }
205
+ // A minimal ClassDecoratorContext, for the same reason. Controller reads `metadata` and nothing
206
+ // else; `name` and `addInitializer` are here to satisfy the type.
207
+ function classContext(cls) {
208
+ return {
209
+ kind: 'class',
210
+ name: cls.name,
211
+ metadata: ensureMetadata(cls),
212
+ addInitializer: () => undefined,
213
+ };
214
+ }
215
+ // A minimal ClassMethodDecoratorContext for programmatic decoration. The Get
216
+ // decorator only reads `name` + `metadata`; the rest satisfies the type.
217
+ function methodContext(name, cls) {
218
+ const metadata = ensureMetadata(cls);
219
+ const noop = () => undefined;
220
+ return {
221
+ kind: 'method',
222
+ name,
223
+ static: false,
224
+ private: false,
225
+ access: { has: () => true, get: obj => Reflect.get(Object(obj), name) },
226
+ metadata,
227
+ addInitializer: noop,
228
+ };
229
+ }
230
+ function ensureMetadata(cls) {
231
+ const existing = cls[Symbol.metadata];
232
+ if (existing !== undefined && existing !== null) {
233
+ return existing;
234
+ }
235
+ const created = Object.create(null);
236
+ Object.defineProperty(cls, Symbol.metadata, {
237
+ value: created,
238
+ configurable: true,
239
+ enumerable: false,
240
+ writable: false,
241
+ });
242
+ return created;
243
+ }
244
+ // boundary: reading a just-defined prototype method by name to hand to the Get
245
+ // decorator; it is a function by construction (§2.1).
246
+ function readProtoMethod(proto, name) {
247
+ const value = Reflect.get(proto, name);
248
+ return value;
249
+ }
250
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bench/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { AnyCtx, Interceptor } from '../middleware/index.js';
2
+ import type { WebResponse } from '../pipeline/index.js';
3
+ export type ContentCoding = 'gzip' | 'deflate';
4
+ export interface CompressionOptions {
5
+ readonly minBytes?: number;
6
+ readonly types?: readonly string[];
7
+ readonly skip?: (response: WebResponse, ctx: AnyCtx) => boolean;
8
+ }
9
+ /** Negotiate and incrementally compress one response. */
10
+ export declare function compress(response: WebResponse, ctx: AnyCtx, options?: CompressionOptions): WebResponse;
11
+ /** The middleware form is deliberately a thin wrapper around the pure function. */
12
+ export declare function compressionInterceptor(options?: CompressionOptions): Interceptor;
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/compression/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAgB,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEtE,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,CAAC;AAE/C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;CACjE;AAoBD,yDAAyD;AACzD,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,WAAW,CAmC1G;AAED,mFAAmF;AACnF,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,kBAAuB,GAAG,WAAW,CAOpF"}