@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.
- package/CHANGELOG.md +28 -0
- package/LICENSE +21 -0
- package/README.md +87 -0
- package/dist/admin/admin-routes.d.ts +42 -0
- package/dist/admin/admin-routes.d.ts.map +1 -0
- package/dist/admin/admin-routes.js +472 -0
- package/dist/admin/admin-routes.js.map +1 -0
- package/dist/admin/admin-types.d.ts +170 -0
- package/dist/admin/admin-types.d.ts.map +1 -0
- package/dist/admin/admin-types.js +30 -0
- package/dist/admin/admin-types.js.map +1 -0
- package/dist/admin/banner.d.ts +11 -0
- package/dist/admin/banner.d.ts.map +1 -0
- package/dist/admin/banner.js +5 -0
- package/dist/admin/banner.js.map +1 -0
- package/dist/admin/header-parser.d.ts +14 -0
- package/dist/admin/header-parser.d.ts.map +1 -0
- package/dist/admin/header-parser.js +171 -0
- package/dist/admin/header-parser.js.map +1 -0
- package/dist/admin/inject.d.ts +48 -0
- package/dist/admin/inject.d.ts.map +1 -0
- package/dist/admin/inject.js +167 -0
- package/dist/admin/inject.js.map +1 -0
- package/dist/admin/overrides-store.d.ts +18 -0
- package/dist/admin/overrides-store.d.ts.map +1 -0
- package/dist/admin/overrides-store.js +100 -0
- package/dist/admin/overrides-store.js.map +1 -0
- package/dist/admin/resolve-cors.d.ts +22 -0
- package/dist/admin/resolve-cors.d.ts.map +1 -0
- package/dist/admin/resolve-cors.js +28 -0
- package/dist/admin/resolve-cors.js.map +1 -0
- package/dist/admin/scenarios-store.d.ts +15 -0
- package/dist/admin/scenarios-store.d.ts.map +1 -0
- package/dist/admin/scenarios-store.js +109 -0
- package/dist/admin/scenarios-store.js.map +1 -0
- package/dist/admin/ui.css +2 -0
- package/dist/admin/ui.html +13 -0
- package/dist/admin/ui.js +240 -0
- package/dist/bin-helpers.d.ts +46 -0
- package/dist/bin-helpers.d.ts.map +1 -0
- package/dist/bin-helpers.js +61 -0
- package/dist/bin-helpers.js.map +1 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +57 -0
- package/dist/bin.js.map +1 -0
- package/dist/cors.d.ts +57 -0
- package/dist/cors.d.ts.map +1 -0
- package/dist/cors.js +167 -0
- package/dist/cors.js.map +1 -0
- package/dist/define.d.ts +26 -0
- package/dist/define.d.ts.map +1 -0
- package/dist/define.js +55 -0
- package/dist/define.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/json-config.d.ts +170 -0
- package/dist/json-config.d.ts.map +1 -0
- package/dist/json-config.js +684 -0
- package/dist/json-config.js.map +1 -0
- package/dist/jsonc.d.ts +24 -0
- package/dist/jsonc.d.ts.map +1 -0
- package/dist/jsonc.js +125 -0
- package/dist/jsonc.js.map +1 -0
- package/dist/log.d.ts +57 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +103 -0
- package/dist/log.js.map +1 -0
- package/dist/middleware/request-validation.d.ts +58 -0
- package/dist/middleware/request-validation.d.ts.map +1 -0
- package/dist/middleware/request-validation.js +328 -0
- package/dist/middleware/request-validation.js.map +1 -0
- package/dist/mock-mode.d.ts +95 -0
- package/dist/mock-mode.d.ts.map +1 -0
- package/dist/mock-mode.js +95 -0
- package/dist/mock-mode.js.map +1 -0
- package/dist/openapi/auto-schema.d.ts +83 -0
- package/dist/openapi/auto-schema.d.ts.map +1 -0
- package/dist/openapi/auto-schema.js +232 -0
- package/dist/openapi/auto-schema.js.map +1 -0
- package/dist/openapi/generate.d.ts +20 -0
- package/dist/openapi/generate.d.ts.map +1 -0
- package/dist/openapi/generate.js +121 -0
- package/dist/openapi/generate.js.map +1 -0
- package/dist/openapi/loader.d.ts +18 -0
- package/dist/openapi/loader.d.ts.map +1 -0
- package/dist/openapi/loader.js +25 -0
- package/dist/openapi/loader.js.map +1 -0
- package/dist/openapi/register.d.ts +58 -0
- package/dist/openapi/register.d.ts.map +1 -0
- package/dist/openapi/register.js +166 -0
- package/dist/openapi/register.js.map +1 -0
- package/dist/openapi/seed.d.ts +16 -0
- package/dist/openapi/seed.d.ts.map +1 -0
- package/dist/openapi/seed.js +58 -0
- package/dist/openapi/seed.js.map +1 -0
- package/dist/openapi/translate.d.ts +55 -0
- package/dist/openapi/translate.d.ts.map +1 -0
- package/dist/openapi/translate.js +319 -0
- package/dist/openapi/translate.js.map +1 -0
- package/dist/openapi/walker.d.ts +44 -0
- package/dist/openapi/walker.d.ts.map +1 -0
- package/dist/openapi/walker.js +15 -0
- package/dist/openapi/walker.js.map +1 -0
- package/dist/request.d.ts +19 -0
- package/dist/request.d.ts.map +1 -0
- package/dist/request.js +66 -0
- package/dist/request.js.map +1 -0
- package/dist/response.d.ts +13 -0
- package/dist/response.d.ts.map +1 -0
- package/dist/response.js +43 -0
- package/dist/response.js.map +1 -0
- package/dist/route-key.d.ts +60 -0
- package/dist/route-key.d.ts.map +1 -0
- package/dist/route-key.js +105 -0
- package/dist/route-key.js.map +1 -0
- package/dist/run.d.ts +27 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +87 -0
- package/dist/run.js.map +1 -0
- package/dist/server.d.ts +60 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +497 -0
- package/dist/server.js.map +1 -0
- package/dist/types.d.ts +274 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/validation/validate.d.ts +38 -0
- package/dist/validation/validate.d.ts.map +1 -0
- package/dist/validation/validate.js +372 -0
- package/dist/validation/validate.js.map +1 -0
- package/docs/admin/error-mode.md +14 -0
- package/docs/admin/headers.md +63 -0
- package/docs/admin/index.md +111 -0
- package/docs/admin/overrides.md +23 -0
- package/docs/admin/rest-api.md +90 -0
- package/docs/admin/scenarios.md +28 -0
- package/docs/cli.md +76 -0
- package/docs/config/admin.md +62 -0
- package/docs/config/cors.md +72 -0
- package/docs/config/endpoints.md +162 -0
- package/docs/config/index.md +107 -0
- package/docs/config/log.md +43 -0
- package/docs/config/mock-mode.md +84 -0
- package/docs/config/openapi.md +8 -0
- package/docs/config/schema.md +34 -0
- package/docs/config/server.md +32 -0
- package/docs/config/validation.md +161 -0
- package/docs/design.md +517 -0
- package/docs/errors.md +192 -0
- package/docs/getting-started.md +146 -0
- package/docs/index.md +23 -0
- package/docs/openapi/auto-schema.md +146 -0
- package/docs/openapi/fallback.md +242 -0
- package/docs/openapi/keywords.md +78 -0
- package/docs/recipes.md +258 -0
- package/docs/stability.md +118 -0
- package/docs/troubleshooting.md +191 -0
- 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"}
|
package/dist/request.js
ADDED
|
@@ -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"}
|
package/dist/response.js
ADDED
|
@@ -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
|
package/dist/run.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -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"}
|