@databehave/server 0.1.0

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 (162) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/LICENSE +21 -0
  3. package/README.md +87 -0
  4. package/dist/admin/admin-routes.d.ts +42 -0
  5. package/dist/admin/admin-routes.d.ts.map +1 -0
  6. package/dist/admin/admin-routes.js +472 -0
  7. package/dist/admin/admin-routes.js.map +1 -0
  8. package/dist/admin/admin-types.d.ts +170 -0
  9. package/dist/admin/admin-types.d.ts.map +1 -0
  10. package/dist/admin/admin-types.js +30 -0
  11. package/dist/admin/admin-types.js.map +1 -0
  12. package/dist/admin/banner.d.ts +11 -0
  13. package/dist/admin/banner.d.ts.map +1 -0
  14. package/dist/admin/banner.js +5 -0
  15. package/dist/admin/banner.js.map +1 -0
  16. package/dist/admin/header-parser.d.ts +14 -0
  17. package/dist/admin/header-parser.d.ts.map +1 -0
  18. package/dist/admin/header-parser.js +171 -0
  19. package/dist/admin/header-parser.js.map +1 -0
  20. package/dist/admin/inject.d.ts +48 -0
  21. package/dist/admin/inject.d.ts.map +1 -0
  22. package/dist/admin/inject.js +167 -0
  23. package/dist/admin/inject.js.map +1 -0
  24. package/dist/admin/overrides-store.d.ts +18 -0
  25. package/dist/admin/overrides-store.d.ts.map +1 -0
  26. package/dist/admin/overrides-store.js +100 -0
  27. package/dist/admin/overrides-store.js.map +1 -0
  28. package/dist/admin/resolve-cors.d.ts +22 -0
  29. package/dist/admin/resolve-cors.d.ts.map +1 -0
  30. package/dist/admin/resolve-cors.js +28 -0
  31. package/dist/admin/resolve-cors.js.map +1 -0
  32. package/dist/admin/scenarios-store.d.ts +15 -0
  33. package/dist/admin/scenarios-store.d.ts.map +1 -0
  34. package/dist/admin/scenarios-store.js +109 -0
  35. package/dist/admin/scenarios-store.js.map +1 -0
  36. package/dist/admin/ui.css +2 -0
  37. package/dist/admin/ui.html +13 -0
  38. package/dist/admin/ui.js +240 -0
  39. package/dist/bin-helpers.d.ts +46 -0
  40. package/dist/bin-helpers.d.ts.map +1 -0
  41. package/dist/bin-helpers.js +61 -0
  42. package/dist/bin-helpers.js.map +1 -0
  43. package/dist/bin.d.ts +3 -0
  44. package/dist/bin.d.ts.map +1 -0
  45. package/dist/bin.js +57 -0
  46. package/dist/bin.js.map +1 -0
  47. package/dist/cors.d.ts +57 -0
  48. package/dist/cors.d.ts.map +1 -0
  49. package/dist/cors.js +167 -0
  50. package/dist/cors.js.map +1 -0
  51. package/dist/define.d.ts +26 -0
  52. package/dist/define.d.ts.map +1 -0
  53. package/dist/define.js +55 -0
  54. package/dist/define.js.map +1 -0
  55. package/dist/index.d.ts +21 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +19 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/json-config.d.ts +170 -0
  60. package/dist/json-config.d.ts.map +1 -0
  61. package/dist/json-config.js +684 -0
  62. package/dist/json-config.js.map +1 -0
  63. package/dist/jsonc.d.ts +24 -0
  64. package/dist/jsonc.d.ts.map +1 -0
  65. package/dist/jsonc.js +125 -0
  66. package/dist/jsonc.js.map +1 -0
  67. package/dist/log.d.ts +57 -0
  68. package/dist/log.d.ts.map +1 -0
  69. package/dist/log.js +103 -0
  70. package/dist/log.js.map +1 -0
  71. package/dist/middleware/request-validation.d.ts +58 -0
  72. package/dist/middleware/request-validation.d.ts.map +1 -0
  73. package/dist/middleware/request-validation.js +328 -0
  74. package/dist/middleware/request-validation.js.map +1 -0
  75. package/dist/mock-mode.d.ts +95 -0
  76. package/dist/mock-mode.d.ts.map +1 -0
  77. package/dist/mock-mode.js +95 -0
  78. package/dist/mock-mode.js.map +1 -0
  79. package/dist/openapi/auto-schema.d.ts +83 -0
  80. package/dist/openapi/auto-schema.d.ts.map +1 -0
  81. package/dist/openapi/auto-schema.js +232 -0
  82. package/dist/openapi/auto-schema.js.map +1 -0
  83. package/dist/openapi/generate.d.ts +20 -0
  84. package/dist/openapi/generate.d.ts.map +1 -0
  85. package/dist/openapi/generate.js +121 -0
  86. package/dist/openapi/generate.js.map +1 -0
  87. package/dist/openapi/loader.d.ts +18 -0
  88. package/dist/openapi/loader.d.ts.map +1 -0
  89. package/dist/openapi/loader.js +25 -0
  90. package/dist/openapi/loader.js.map +1 -0
  91. package/dist/openapi/register.d.ts +58 -0
  92. package/dist/openapi/register.d.ts.map +1 -0
  93. package/dist/openapi/register.js +166 -0
  94. package/dist/openapi/register.js.map +1 -0
  95. package/dist/openapi/seed.d.ts +16 -0
  96. package/dist/openapi/seed.d.ts.map +1 -0
  97. package/dist/openapi/seed.js +58 -0
  98. package/dist/openapi/seed.js.map +1 -0
  99. package/dist/openapi/translate.d.ts +55 -0
  100. package/dist/openapi/translate.d.ts.map +1 -0
  101. package/dist/openapi/translate.js +319 -0
  102. package/dist/openapi/translate.js.map +1 -0
  103. package/dist/openapi/walker.d.ts +44 -0
  104. package/dist/openapi/walker.d.ts.map +1 -0
  105. package/dist/openapi/walker.js +15 -0
  106. package/dist/openapi/walker.js.map +1 -0
  107. package/dist/request.d.ts +19 -0
  108. package/dist/request.d.ts.map +1 -0
  109. package/dist/request.js +66 -0
  110. package/dist/request.js.map +1 -0
  111. package/dist/response.d.ts +13 -0
  112. package/dist/response.d.ts.map +1 -0
  113. package/dist/response.js +43 -0
  114. package/dist/response.js.map +1 -0
  115. package/dist/route-key.d.ts +60 -0
  116. package/dist/route-key.d.ts.map +1 -0
  117. package/dist/route-key.js +105 -0
  118. package/dist/route-key.js.map +1 -0
  119. package/dist/run.d.ts +27 -0
  120. package/dist/run.d.ts.map +1 -0
  121. package/dist/run.js +87 -0
  122. package/dist/run.js.map +1 -0
  123. package/dist/server.d.ts +60 -0
  124. package/dist/server.d.ts.map +1 -0
  125. package/dist/server.js +497 -0
  126. package/dist/server.js.map +1 -0
  127. package/dist/types.d.ts +274 -0
  128. package/dist/types.d.ts.map +1 -0
  129. package/dist/types.js +9 -0
  130. package/dist/types.js.map +1 -0
  131. package/dist/validation/validate.d.ts +38 -0
  132. package/dist/validation/validate.d.ts.map +1 -0
  133. package/dist/validation/validate.js +372 -0
  134. package/dist/validation/validate.js.map +1 -0
  135. package/docs/admin/error-mode.md +14 -0
  136. package/docs/admin/headers.md +63 -0
  137. package/docs/admin/index.md +111 -0
  138. package/docs/admin/overrides.md +23 -0
  139. package/docs/admin/rest-api.md +90 -0
  140. package/docs/admin/scenarios.md +28 -0
  141. package/docs/cli.md +76 -0
  142. package/docs/config/admin.md +62 -0
  143. package/docs/config/cors.md +72 -0
  144. package/docs/config/endpoints.md +162 -0
  145. package/docs/config/index.md +107 -0
  146. package/docs/config/log.md +43 -0
  147. package/docs/config/mock-mode.md +84 -0
  148. package/docs/config/openapi.md +8 -0
  149. package/docs/config/schema.md +34 -0
  150. package/docs/config/server.md +32 -0
  151. package/docs/config/validation.md +161 -0
  152. package/docs/design.md +517 -0
  153. package/docs/errors.md +192 -0
  154. package/docs/getting-started.md +146 -0
  155. package/docs/index.md +23 -0
  156. package/docs/openapi/auto-schema.md +146 -0
  157. package/docs/openapi/fallback.md +242 -0
  158. package/docs/openapi/keywords.md +78 -0
  159. package/docs/recipes.md +258 -0
  160. package/docs/stability.md +118 -0
  161. package/docs/troubleshooting.md +191 -0
  162. package/package.json +80 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translate.js","sourceRoot":"","sources":["../../src/openapi/translate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * OpenAPI structural types consumed by the in-server mock generator.
3
+ *
4
+ * Kept as a types-only module so the actual generation logic lives
5
+ * in a single place (`./generate.ts`) and consumers — including the
6
+ * route registrar (`./register.ts`) — can refer to a stable shape
7
+ * without pulling the generator in just for its types.
8
+ *
9
+ * Only the fields the generator and registrar actually read are
10
+ * declared. Unknown OAS keywords pass through as structural casts
11
+ * inside `register.ts` and are surfaced as walk errors when the
12
+ * generator hits them.
13
+ */
14
+ export type OasNode = {
15
+ $ref?: string;
16
+ type?: string | string[];
17
+ format?: string;
18
+ enum?: unknown[];
19
+ const?: unknown;
20
+ example?: unknown;
21
+ examples?: unknown[];
22
+ properties?: Record<string, OasNode>;
23
+ required?: string[];
24
+ items?: OasNode;
25
+ additionalProperties?: boolean | OasNode;
26
+ nullable?: boolean;
27
+ allOf?: OasNode[];
28
+ oneOf?: OasNode[];
29
+ anyOf?: OasNode[];
30
+ minimum?: number;
31
+ maximum?: number;
32
+ minLength?: number;
33
+ maxLength?: number;
34
+ minItems?: number;
35
+ maxItems?: number;
36
+ pattern?: string;
37
+ title?: string;
38
+ };
39
+ export type OasDoc = {
40
+ components?: {
41
+ schemas?: Record<string, OasNode>;
42
+ };
43
+ };
44
+ //# sourceMappingURL=walker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walker.d.ts","sourceRoot":"","sources":["../../src/openapi/walker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,OAAO,EAAE,CAAA;IAChB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,oBAAoB,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAA;IACjB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAA;IACjB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,MAAM,GAAG;IACnB,UAAU,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAA;CACnD,CAAA"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * OpenAPI structural types consumed by the in-server mock generator.
3
+ *
4
+ * Kept as a types-only module so the actual generation logic lives
5
+ * in a single place (`./generate.ts`) and consumers — including the
6
+ * route registrar (`./register.ts`) — can refer to a stable shape
7
+ * without pulling the generator in just for its types.
8
+ *
9
+ * Only the fields the generator and registrar actually read are
10
+ * declared. Unknown OAS keywords pass through as structural casts
11
+ * inside `register.ts` and are surfaced as walk errors when the
12
+ * generator hits them.
13
+ */
14
+ export {};
15
+ //# sourceMappingURL=walker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walker.js","sourceRoot":"","sources":["../../src/openapi/walker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
@@ -0,0 +1,19 @@
1
+ import type { MockRequest } from './types.js';
2
+ /**
3
+ * Build a `MockRequest` from a web standard `Request`.
4
+ *
5
+ * Headers are lower-cased. Query keys are deduplicated for the
6
+ * `query` map (last value wins) but kept whole in `queryAll`.
7
+ * `params` is supplied by the router after a successful pattern
8
+ * match; for static routes the caller passes `{}`.
9
+ *
10
+ * `json()` / `text()` share one lazy body read across **every facade
11
+ * built from the same web `Request`** — calling either twice does not
12
+ * re-clone the underlying web `Request`, and the router rebuilding
13
+ * the facade for a parameterised route doesn't trigger a second clone.
14
+ * `raw()` returns the underlying web `Request`; consuming its body
15
+ * directly and then calling `json()` / `text()` will throw, matching
16
+ * the web standard.
17
+ */
18
+ export declare const buildRequest: (req: globalThis.Request, params?: Readonly<Record<string, string>>) => MockRequest;
19
+ //# sourceMappingURL=request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,WAAW,EAAE,MAAM,YAAY,CAAA;AAa7D;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,YAAY,GACvB,KAAK,UAAU,CAAC,OAAO,EACvB,SAAQ,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM,KAC5C,WAuCF,CAAA"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Per-request body cache shared across every `MockRequest` facade
3
+ * built from the same underlying web `Request`. Routing may rebuild
4
+ * the facade (e.g. once for the dispatch probe with empty `params`,
5
+ * then again with the resolved path params), and we want
6
+ * `req.json()` / `req.text()` to read the body once across all of
7
+ * them. Keyed on the underlying web `Request` so it gets GC'd when
8
+ * the request ends.
9
+ */
10
+ const bodyCache = new WeakMap();
11
+ /**
12
+ * Build a `MockRequest` from a web standard `Request`.
13
+ *
14
+ * Headers are lower-cased. Query keys are deduplicated for the
15
+ * `query` map (last value wins) but kept whole in `queryAll`.
16
+ * `params` is supplied by the router after a successful pattern
17
+ * match; for static routes the caller passes `{}`.
18
+ *
19
+ * `json()` / `text()` share one lazy body read across **every facade
20
+ * built from the same web `Request`** — calling either twice does not
21
+ * re-clone the underlying web `Request`, and the router rebuilding
22
+ * the facade for a parameterised route doesn't trigger a second clone.
23
+ * `raw()` returns the underlying web `Request`; consuming its body
24
+ * directly and then calling `json()` / `text()` will throw, matching
25
+ * the web standard.
26
+ */
27
+ export const buildRequest = (req, params = {}) => {
28
+ const url = new URL(req.url);
29
+ const method = req.method.toLowerCase();
30
+ const queryAll = {};
31
+ for (const [k, v] of url.searchParams.entries()) {
32
+ ;
33
+ (queryAll[k] ??= []).push(v);
34
+ }
35
+ const query = {};
36
+ for (const [k, vs] of Object.entries(queryAll)) {
37
+ const last = vs[vs.length - 1];
38
+ if (last !== undefined)
39
+ query[k] = last;
40
+ }
41
+ const headers = {};
42
+ req.headers.forEach((value, key) => {
43
+ headers[key.toLowerCase()] = value;
44
+ });
45
+ const text = () => {
46
+ const cached = bodyCache.get(req);
47
+ if (cached)
48
+ return cached;
49
+ const fresh = req.clone().text();
50
+ bodyCache.set(req, fresh);
51
+ return fresh;
52
+ };
53
+ return {
54
+ method,
55
+ url: req.url,
56
+ path: url.pathname,
57
+ query,
58
+ queryAll,
59
+ params,
60
+ headers,
61
+ json: () => text().then((t) => JSON.parse(t)),
62
+ text,
63
+ raw: () => req,
64
+ };
65
+ };
66
+ //# sourceMappingURL=request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.js","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,SAAS,GAAG,IAAI,OAAO,EAAuC,CAAA;AAEpE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,GAAuB,EACvB,SAA2C,EAAE,EAChC,EAAE;IACf,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC5B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,EAAoB,CAAA;IAEzD,MAAM,QAAQ,GAA6B,EAAE,CAAA;IAC7C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;QAChD,CAAC;QAAA,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC/B,CAAC;IACD,MAAM,KAAK,GAA2B,EAAE,CAAA;IACxC,KAAK,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QAC9B,IAAI,IAAI,KAAK,SAAS;YAAE,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;IACzC,CAAC;IAED,MAAM,OAAO,GAA2B,EAAE,CAAA;IAC1C,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACjC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,MAAM,IAAI,GAAG,GAAoB,EAAE;QACjC,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACjC,IAAI,MAAM;YAAE,OAAO,MAAM,CAAA;QACzB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAA;QAChC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACzB,OAAO,KAAK,CAAA;IACd,CAAC,CAAA;IAED,OAAO;QACL,MAAM;QACN,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,IAAI,EAAE,GAAG,CAAC,QAAQ;QAClB,KAAK;QACL,QAAQ;QACR,MAAM;QACN,OAAO;QACP,IAAI,EAAE,GAAgB,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAM,CAAC;QAC/D,IAAI;QACJ,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG;KACf,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,13 @@
1
+ import type { MockResponse } from './types.js';
2
+ /**
3
+ * Serialize a `MockResponse` POJO into a web standard `Response`.
4
+ *
5
+ * Body variant selection is exhaustive — TypeScript will catch a
6
+ * missing branch if a new variant is added to `MockResponseBody`.
7
+ *
8
+ * User-supplied `headers` are merged on top of the defaults derived
9
+ * from the body variant (e.g. `Content-Type: application/json`), so
10
+ * a handler can override `Content-Type` when needed.
11
+ */
12
+ export declare const buildResponse: (res: MockResponse) => globalThis.Response;
13
+ //# sourceMappingURL=response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../src/response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,GAAI,KAAK,YAAY,KAAG,UAAU,CAAC,QAgC5D,CAAA"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Serialize a `MockResponse` POJO into a web standard `Response`.
3
+ *
4
+ * Body variant selection is exhaustive — TypeScript will catch a
5
+ * missing branch if a new variant is added to `MockResponseBody`.
6
+ *
7
+ * User-supplied `headers` are merged on top of the defaults derived
8
+ * from the body variant (e.g. `Content-Type: application/json`), so
9
+ * a handler can override `Content-Type` when needed.
10
+ */
11
+ export const buildResponse = (res) => {
12
+ const status = res.status ?? 200;
13
+ const headers = new Headers();
14
+ let body;
15
+ if ('empty' in res && res.empty === true) {
16
+ body = null;
17
+ }
18
+ else if ('json' in res && res.json !== undefined) {
19
+ headers.set('content-type', 'application/json; charset=utf-8');
20
+ body = JSON.stringify(res.json);
21
+ }
22
+ else if ('text' in res && res.text !== undefined) {
23
+ headers.set('content-type', 'text/plain; charset=utf-8');
24
+ body = res.text;
25
+ }
26
+ else if ('html' in res && res.html !== undefined) {
27
+ headers.set('content-type', 'text/html; charset=utf-8');
28
+ body = res.html;
29
+ }
30
+ else if ('raw' in res && res.raw !== undefined) {
31
+ body = res.raw;
32
+ }
33
+ else {
34
+ throw new Error('@databehave/server: response body variant missing — set one of json / text / html / raw / empty');
35
+ }
36
+ if (res.headers) {
37
+ for (const [k, v] of Object.entries(res.headers)) {
38
+ headers.set(k.toLowerCase(), v);
39
+ }
40
+ }
41
+ return new Response(body, { status, headers });
42
+ };
43
+ //# sourceMappingURL=response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response.js","sourceRoot":"","sources":["../src/response.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAiB,EAAuB,EAAE;IACtE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAA;IAChC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;IAE7B,IAAI,IAAqB,CAAA;IAEzB,IAAI,OAAO,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QACzC,IAAI,GAAG,IAAI,CAAA;IACb,CAAC;SAAM,IAAI,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,iCAAiC,CAAC,CAAA;QAC9D,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACjC,CAAC;SAAM,IAAI,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,2BAA2B,CAAC,CAAA;QACxD,IAAI,GAAG,GAAG,CAAC,IAAI,CAAA;IACjB,CAAC;SAAM,IAAI,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAA;QACvD,IAAI,GAAG,GAAG,CAAC,IAAI,CAAA;IACjB,CAAC;SAAM,IAAI,KAAK,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QACjD,IAAI,GAAG,GAAG,CAAC,GAAG,CAAA;IAChB,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CACb,iGAAiG,CAClG,CAAA;IACH,CAAC;IAED,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAA;QACjC,CAAC;IACH,CAAC;IAED,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;AAChD,CAAC,CAAA"}
@@ -0,0 +1,60 @@
1
+ import type { Method, RouteKey } from './types.js';
2
+ export interface ParsedRouteKey {
3
+ readonly method: Method;
4
+ readonly path: string;
5
+ }
6
+ /**
7
+ * A single path segment of a parsed pattern.
8
+ *
9
+ * `static` segments must match the request segment literally;
10
+ * `param` segments capture into `Record<string,string>`.
11
+ */
12
+ export type PatternSegment = {
13
+ readonly kind: 'static';
14
+ readonly value: string;
15
+ } | {
16
+ readonly kind: 'param';
17
+ readonly name: string;
18
+ };
19
+ export interface RoutePattern {
20
+ /** Original path string as declared (post-trim). */
21
+ readonly path: string;
22
+ /** Ordered segments between `/`. Empty array means the root `/`. */
23
+ readonly segments: readonly PatternSegment[];
24
+ /** `true` when no segment is a `:param`. Enables O(1) Map lookup. */
25
+ readonly isStatic: boolean;
26
+ }
27
+ /**
28
+ * Parse a `'METHOD /path'` key.
29
+ *
30
+ * Errors out with a precise message on:
31
+ * - missing space between method and path
32
+ * - unsupported method (lower-case method names included — the
33
+ * `RouteKey` template literal requires `Uppercase<…>`,
34
+ * so silently accepting `'get /x'` would mean the type and runtime
35
+ * disagree and JSON-config typos slip through unnoticed)
36
+ * - path that does not start with `/`
37
+ *
38
+ * Whitespace around the path is trimmed; trailing slashes are kept
39
+ * as-is so the consumer's intent (e.g. matching `/foo/`) is honoured.
40
+ */
41
+ export declare const parseRouteKey: (key: RouteKey) => ParsedRouteKey;
42
+ /**
43
+ * Split a path into segments and classify each as `static` or `param`.
44
+ *
45
+ * A segment of just `:` (empty param name) is rejected. Duplicate
46
+ * param names within one pattern are rejected — they would silently
47
+ * overwrite each other in the captured map.
48
+ */
49
+ export declare const parseRoutePattern: (path: string) => RoutePattern;
50
+ /**
51
+ * Try to match `requestPath` against `pattern`. Returns the captured
52
+ * params on success, `null` on no match.
53
+ *
54
+ * Segment counts must be equal. `static` segments use strict string
55
+ * equality (case-sensitive, no URL-decoding beyond what the URL
56
+ * already gave us). `param` values are URL-decoded so a handler sees
57
+ * `/users/%C3%A9` as `{ id: 'é' }`.
58
+ */
59
+ export declare const matchPattern: (pattern: RoutePattern, requestPath: string) => Record<string, string> | null;
60
+ //# sourceMappingURL=route-key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-key.d.ts","sourceRoot":"","sources":["../src/route-key.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAUlD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAErD,MAAM,WAAW,YAAY;IAC3B,oDAAoD;IACpD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,oEAAoE;IACpE,QAAQ,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAA;IAC5C,qEAAqE;IACrE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAC3B;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,aAAa,GAAI,KAAK,QAAQ,KAAG,cA6B7C,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,KAAG,YAwBhD,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,GACvB,SAAS,YAAY,EACrB,aAAa,MAAM,KAClB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAmB3B,CAAA"}
@@ -0,0 +1,105 @@
1
+ const SUPPORTED_METHODS = new Set([
2
+ 'get',
3
+ 'post',
4
+ 'put',
5
+ 'delete',
6
+ 'patch',
7
+ ]);
8
+ /**
9
+ * Parse a `'METHOD /path'` key.
10
+ *
11
+ * Errors out with a precise message on:
12
+ * - missing space between method and path
13
+ * - unsupported method (lower-case method names included — the
14
+ * `RouteKey` template literal requires `Uppercase<…>`,
15
+ * so silently accepting `'get /x'` would mean the type and runtime
16
+ * disagree and JSON-config typos slip through unnoticed)
17
+ * - path that does not start with `/`
18
+ *
19
+ * Whitespace around the path is trimmed; trailing slashes are kept
20
+ * as-is so the consumer's intent (e.g. matching `/foo/`) is honoured.
21
+ */
22
+ export const parseRouteKey = (key) => {
23
+ const idx = key.indexOf(' ');
24
+ if (idx < 0) {
25
+ throw new Error(`@databehave/server: invalid route key (missing space): ${JSON.stringify(key)}`);
26
+ }
27
+ const rawMethod = key.slice(0, idx);
28
+ if (rawMethod !== rawMethod.toUpperCase()) {
29
+ throw new Error(`@databehave/server: method must be upper-case in key ${JSON.stringify(key)} ` +
30
+ `(got ${JSON.stringify(rawMethod)}; e.g. 'GET /users')`);
31
+ }
32
+ const method = rawMethod.toLowerCase();
33
+ const path = key.slice(idx + 1).trim();
34
+ if (!SUPPORTED_METHODS.has(method)) {
35
+ throw new Error(`@databehave/server: unsupported method in key ${JSON.stringify(key)} (got ${JSON.stringify(rawMethod)})`);
36
+ }
37
+ if (!path.startsWith('/')) {
38
+ throw new Error(`@databehave/server: path must start with '/' in key ${JSON.stringify(key)} (got ${JSON.stringify(path)})`);
39
+ }
40
+ return { method, path };
41
+ };
42
+ /**
43
+ * Split a path into segments and classify each as `static` or `param`.
44
+ *
45
+ * A segment of just `:` (empty param name) is rejected. Duplicate
46
+ * param names within one pattern are rejected — they would silently
47
+ * overwrite each other in the captured map.
48
+ */
49
+ export const parseRoutePattern = (path) => {
50
+ // Drop leading '/'; split on '/'. A trailing '/' produces an empty
51
+ // final segment that we keep — it lets a pattern `/foo/` only match
52
+ // requests ending in `/`.
53
+ const raw = path.slice(1).split('/');
54
+ const seen = new Set();
55
+ const segments = raw.map((s) => {
56
+ if (s.startsWith(':')) {
57
+ const name = s.slice(1);
58
+ if (name.length === 0) {
59
+ throw new Error(`@databehave/server: empty param name in path ${JSON.stringify(path)}`);
60
+ }
61
+ if (seen.has(name)) {
62
+ throw new Error(`@databehave/server: duplicate param ':${name}' in path ${JSON.stringify(path)}`);
63
+ }
64
+ seen.add(name);
65
+ return { kind: 'param', name };
66
+ }
67
+ return { kind: 'static', value: s };
68
+ });
69
+ const isStatic = segments.every((s) => s.kind === 'static');
70
+ return { path, segments, isStatic };
71
+ };
72
+ /**
73
+ * Try to match `requestPath` against `pattern`. Returns the captured
74
+ * params on success, `null` on no match.
75
+ *
76
+ * Segment counts must be equal. `static` segments use strict string
77
+ * equality (case-sensitive, no URL-decoding beyond what the URL
78
+ * already gave us). `param` values are URL-decoded so a handler sees
79
+ * `/users/%C3%A9` as `{ id: 'é' }`.
80
+ */
81
+ export const matchPattern = (pattern, requestPath) => {
82
+ const reqSegments = requestPath.slice(1).split('/');
83
+ if (reqSegments.length !== pattern.segments.length)
84
+ return null;
85
+ const params = {};
86
+ for (let i = 0; i < pattern.segments.length; i++) {
87
+ const seg = pattern.segments[i];
88
+ const part = reqSegments[i];
89
+ if (seg.kind === 'static') {
90
+ if (seg.value !== part)
91
+ return null;
92
+ }
93
+ else {
94
+ try {
95
+ params[seg.name] = decodeURIComponent(part);
96
+ }
97
+ catch {
98
+ // Malformed %-escape — treat as no match rather than throwing.
99
+ return null;
100
+ }
101
+ }
102
+ }
103
+ return params;
104
+ };
105
+ //# sourceMappingURL=route-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-key.js","sourceRoot":"","sources":["../src/route-key.ts"],"names":[],"mappings":"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"}
package/dist/run.d.ts ADDED
@@ -0,0 +1,27 @@
1
+ /** Options accepted by `run()`. */
2
+ export interface RunOptions {
3
+ /** Path to the databehave config (JSONC). Resolved relative to `process.cwd()`. */
4
+ config: string;
5
+ /**
6
+ * After the server emits `listening`, open the admin URL in the
7
+ * default browser. No-op (with a log line) when `admin` is
8
+ * absent or `admin.enabled !== true`. Default: `false`.
9
+ *
10
+ * ORed with `admin.openBrowserOnStart` from the resolved
11
+ * config — either trigger launches the browser exactly once.
12
+ */
13
+ open?: boolean;
14
+ }
15
+ /** Handle returned by `run()`. */
16
+ export interface RunHandle {
17
+ /** The bound HTTP URL, e.g. `"http://127.0.0.1:8000"`. */
18
+ url: string;
19
+ /** Stop the server. Idempotent: a second call is a no-op. Resolves once the port is free. */
20
+ close(): Promise<void>;
21
+ }
22
+ /**
23
+ * Programmatic entry. Resolves AFTER the server has emitted
24
+ * `listening`.
25
+ */
26
+ export declare const run: (opts: RunOptions) => Promise<RunHandle>;
27
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAuBA,mCAAmC;AACnC,MAAM,WAAW,UAAU;IACzB,mFAAmF;IACnF,MAAM,EAAE,MAAM,CAAA;IACd;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED,kCAAkC;AAClC,MAAM,WAAW,SAAS;IACxB,0DAA0D;IAC1D,GAAG,EAAE,MAAM,CAAA;IACX,6FAA6F;IAC7F,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AA8CD;;;GAGG;AACH,eAAO,MAAM,GAAG,GAAU,MAAM,UAAU,KAAG,OAAO,CAAC,SAAS,CAsB7D,CAAA"}
package/dist/run.js ADDED
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Programmatic `run()` entry — boots the kit's HTTP server from a
3
+ * JSONC config file and optionally opens the admin UI in the default
4
+ * browser after `listening` is observed.
5
+ *
6
+ * This is the implementation that both `bin.ts` (CLI) and direct
7
+ * library consumers route through. Keeping a single code path here
8
+ * means the binary and the `import { run } from '@databehave/server'`
9
+ * surface behave identically (same log lines, same error model).
10
+ *
11
+ * `RunHandle.close()` is idempotent.
12
+ *
13
+ * The kit ships no watcher. Use `tsx watch server.ts` (or any
14
+ * process supervisor) in dev — see README.
15
+ */
16
+ import { spawn } from 'node:child_process';
17
+ import { isAbsolute, resolve } from 'node:path';
18
+ import { composeAdminUrl, resolveOpener } from './bin-helpers.js';
19
+ import { loadConfig } from './json-config.js';
20
+ import { createServer } from './server.js';
21
+ /** Spawn the platform browser opener detached, log on failure. */
22
+ const openInBrowser = (url) => {
23
+ const { cmd, args } = resolveOpener(process.platform, url);
24
+ try {
25
+ const child = spawn(cmd, args, { detached: true, stdio: 'ignore' });
26
+ child.on('error', (err) => {
27
+ const msg = err instanceof Error ? err.message : String(err);
28
+ console.warn(`[@databehave/server] could not open browser (${cmd}): ${msg}`);
29
+ });
30
+ child.unref();
31
+ }
32
+ catch (err) {
33
+ const msg = err instanceof Error ? err.message : String(err);
34
+ console.warn(`[@databehave/server] could not open browser (${cmd}): ${msg}`);
35
+ }
36
+ };
37
+ /**
38
+ * Boot a single server instance from the JSONC config at `configPath`.
39
+ * Logs the standard `listening on …` line and, when `open` is set,
40
+ * the `--open: …` URL (or the admin-disabled skip line).
41
+ */
42
+ const bootOnce = async (configPath, open) => {
43
+ const { config, server: listenOpts } = await loadConfig(configPath);
44
+ const server = createServer(config);
45
+ const handle = await server.listen(listenOpts);
46
+ console.info(`[@databehave/server] listening on http://${handle.host}:${handle.port}`);
47
+ const shouldOpen = open || config.admin?.openBrowserOnStart === true;
48
+ if (shouldOpen) {
49
+ const url = composeAdminUrl(handle, config.admin);
50
+ if (url === null) {
51
+ console.info('[@databehave/server] --open: admin is not enabled — not opening browser');
52
+ }
53
+ else {
54
+ console.info(`[@databehave/server] --open: ${url}`);
55
+ openInBrowser(url);
56
+ }
57
+ }
58
+ return handle;
59
+ };
60
+ /**
61
+ * Programmatic entry. Resolves AFTER the server has emitted
62
+ * `listening`.
63
+ */
64
+ export const run = async (opts) => {
65
+ const configPath = isAbsolute(opts.config)
66
+ ? opts.config
67
+ : resolve(process.cwd(), opts.config);
68
+ const open = opts.open === true;
69
+ const handle = await bootOnce(configPath, open);
70
+ const url = `http://${handle.host}:${handle.port}`;
71
+ let closed = false;
72
+ return {
73
+ url,
74
+ async close() {
75
+ if (closed)
76
+ return;
77
+ closed = true;
78
+ try {
79
+ await handle.close();
80
+ }
81
+ catch {
82
+ // best-effort during shutdown
83
+ }
84
+ },
85
+ };
86
+ };
87
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import { type AdminModeConfig } from './admin/admin-types.js';
2
+ import type { Config, MockRequest, MockResponse, Server } from './types.js';
3
+ /**
4
+ * Resolve admin config defaults + validate inputs that don't
5
+ * depend on listen() host. Returns `null` when admin is absent or
6
+ * `enabled !== true`. Pure — no side effects.
7
+ */
8
+ export declare const resolveAdminMode: (cfg: AdminModeConfig | undefined) => {
9
+ path: string;
10
+ ui: boolean;
11
+ headers: boolean;
12
+ bind: "loopback-only" | "any";
13
+ cors: NonNullable<AdminModeConfig["cors"]>;
14
+ allowDestroy: boolean;
15
+ openapiBody: string | undefined;
16
+ scenariosDir: string;
17
+ } | null;
18
+ /**
19
+ * Compose two onRequest hooks (user-first per spec H13): if the user
20
+ * hook returned a response, skip the admin inject hook; else call
21
+ * inject. Exported for unit testability.
22
+ */
23
+ export declare const composeAdminOnRequest: (userHook: ((req: MockRequest) => MockResponse | void | Promise<MockResponse | void>) | undefined, adminHook: (req: MockRequest) => Promise<MockResponse | void>) => ((req: MockRequest) => Promise<MockResponse | void>);
24
+ /**
25
+ * Build a @databehave/server server.
26
+ *
27
+ * Construction validates every route key and pre-computes a dispatch
28
+ * index (static lookups are O(1), `:param` patterns are linear). The
29
+ * returned object exposes:
30
+ *
31
+ * - `fetch(Request)` for in-process testing — no socket is opened.
32
+ * - `listen({port, host})` to bind a Node HTTP server. Port `0`
33
+ * asks the OS for a free port; the resolved port/host come back in
34
+ * the handle.
35
+ *
36
+ * Request flow per call:
37
+ * 1. CORS preflight (OPTIONS) → short-circuit when `cors` is set
38
+ * 2. `hooks.onRequest` → may short-circuit
39
+ * 3. Route dispatch → handler / OAS walker / 404
40
+ * 4. `hooks.onResponse` → may replace the result
41
+ * 5. CORS response headers merged on top (don't override the user)
42
+ * 6. Handler errors funnel through `hooks.onError` or fall back
43
+ * to a 500 JSON envelope.
44
+ */
45
+ /**
46
+ * Route a runtime `'error'` event from a bound Node `http.Server` to
47
+ * the user-supplied `onServerError` hook (when present), with a
48
+ * `console.error` fallback. Exported so the branching is unit-testable
49
+ * without standing up a real socket and provoking EMFILE/EACCES.
50
+ *
51
+ * Branch contract:
52
+ * - no hook → log via `console.error`
53
+ * - hook returns → silent (hook owns reporting)
54
+ * - hook itself throws → log the *hook* failure AND the original
55
+ * error, so a misbehaving logger never
56
+ * silently swallows a real server fault.
57
+ */
58
+ export declare const handleRuntimeServerError: (err: Error, onServerError: ((err: Error) => void) | undefined) => void;
59
+ export declare const createServer: (config: Config) => Server;
60
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAUA,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,wBAAwB,CAAA;AAmB/B,OAAO,KAAK,EACV,MAAM,EAKN,WAAW,EACX,YAAY,EAGZ,MAAM,EACP,MAAM,YAAY,CAAA;AAInB;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAC3B,KAAK,eAAe,GAAG,SAAS,KAC/B;IACD,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,OAAO,CAAA;IACX,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,eAAe,GAAG,KAAK,CAAA;IAC7B,IAAI,EAAE,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAA;IAC1C,YAAY,EAAE,OAAO,CAAA;IACrB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,YAAY,EAAE,MAAM,CAAA;CACrB,GAAG,IAkBH,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAChC,UACI,CAAC,CACC,GAAG,EAAE,WAAW,KACb,YAAY,GAAG,IAAI,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,GACxD,SAAS,EACb,WAAW,CACT,GAAG,EAAE,WAAW,KACb,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,KAChC,CAAC,CACF,GAAG,EAAE,WAAW,KACb,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAOhC,CAAA;AA+FD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,wBAAwB,GACnC,KAAK,KAAK,EACV,eAAe,CAAC,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,SAAS,KAChD,IAYF,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,KAAG,MA2W7C,CAAA"}