@databehave/server 0.1.4 → 0.3.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 +30 -0
- package/README.md +85 -83
- package/dist/cors.d.ts +1 -1
- package/dist/cors.js +1 -1
- package/dist/cors.js.map +1 -1
- package/dist/http.d.ts +94 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +23 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +10 -20
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -18
- package/dist/index.js.map +1 -1
- package/dist/log.d.ts +9 -49
- package/dist/log.d.ts.map +1 -1
- package/dist/log.js +16 -92
- package/dist/log.js.map +1 -1
- package/dist/node-authority.d.ts +12 -0
- package/dist/node-authority.d.ts.map +1 -0
- package/dist/node-authority.js +72 -0
- package/dist/node-authority.js.map +1 -0
- package/dist/node-body.d.ts +11 -0
- package/dist/node-body.d.ts.map +1 -0
- package/dist/node-body.js +61 -0
- package/dist/node-body.js.map +1 -0
- package/dist/node-http.d.ts +19 -0
- package/dist/node-http.d.ts.map +1 -0
- package/dist/node-http.js +210 -0
- package/dist/node-http.js.map +1 -0
- package/dist/plugins/access-log.d.ts +11 -0
- package/dist/plugins/access-log.d.ts.map +1 -0
- package/dist/plugins/access-log.js +27 -0
- package/dist/plugins/access-log.js.map +1 -0
- package/dist/plugins/cors.d.ts +5 -0
- package/dist/plugins/cors.d.ts.map +1 -0
- package/dist/plugins/cors.js +35 -0
- package/dist/plugins/cors.js.map +1 -0
- package/dist/plugins/routes.d.ts +5 -0
- package/dist/plugins/routes.d.ts.map +1 -0
- package/dist/plugins/routes.js +10 -0
- package/dist/plugins/routes.js.map +1 -0
- package/dist/request.d.ts +2 -2
- package/dist/request.d.ts.map +1 -1
- package/dist/request.js +6 -4
- package/dist/request.js.map +1 -1
- package/dist/route-key.d.ts +2 -0
- package/dist/route-key.d.ts.map +1 -1
- package/dist/route-key.js +5 -1
- package/dist/route-key.js.map +1 -1
- package/dist/server.d.ts +7 -59
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +289 -466
- package/dist/server.js.map +1 -1
- package/dist/types.d.ts +10 -156
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/package.json +11 -24
- package/dist/admin/admin-routes.d.ts +0 -42
- package/dist/admin/admin-routes.d.ts.map +0 -1
- package/dist/admin/admin-routes.js +0 -472
- package/dist/admin/admin-routes.js.map +0 -1
- package/dist/admin/admin-types.d.ts +0 -170
- package/dist/admin/admin-types.d.ts.map +0 -1
- package/dist/admin/admin-types.js +0 -30
- package/dist/admin/admin-types.js.map +0 -1
- package/dist/admin/banner.d.ts +0 -11
- package/dist/admin/banner.d.ts.map +0 -1
- package/dist/admin/banner.js +0 -5
- package/dist/admin/banner.js.map +0 -1
- package/dist/admin/header-parser.d.ts +0 -14
- package/dist/admin/header-parser.d.ts.map +0 -1
- package/dist/admin/header-parser.js +0 -171
- package/dist/admin/header-parser.js.map +0 -1
- package/dist/admin/inject.d.ts +0 -48
- package/dist/admin/inject.d.ts.map +0 -1
- package/dist/admin/inject.js +0 -167
- package/dist/admin/inject.js.map +0 -1
- package/dist/admin/overrides-store.d.ts +0 -18
- package/dist/admin/overrides-store.d.ts.map +0 -1
- package/dist/admin/overrides-store.js +0 -100
- package/dist/admin/overrides-store.js.map +0 -1
- package/dist/admin/resolve-cors.d.ts +0 -22
- package/dist/admin/resolve-cors.d.ts.map +0 -1
- package/dist/admin/resolve-cors.js +0 -28
- package/dist/admin/resolve-cors.js.map +0 -1
- package/dist/admin/scenarios-store.d.ts +0 -15
- package/dist/admin/scenarios-store.d.ts.map +0 -1
- package/dist/admin/scenarios-store.js +0 -109
- package/dist/admin/scenarios-store.js.map +0 -1
- package/dist/admin/ui.css +0 -1
- package/dist/admin/ui.html +0 -13
- package/dist/admin/ui.js +0 -240
- package/dist/bin-helpers.d.ts +0 -46
- package/dist/bin-helpers.d.ts.map +0 -1
- package/dist/bin-helpers.js +0 -61
- package/dist/bin-helpers.js.map +0 -1
- package/dist/bin.d.ts +0 -3
- package/dist/bin.d.ts.map +0 -1
- package/dist/bin.js +0 -86
- package/dist/bin.js.map +0 -1
- package/dist/define.d.ts +0 -26
- package/dist/define.d.ts.map +0 -1
- package/dist/define.js +0 -55
- package/dist/define.js.map +0 -1
- package/dist/json-config.d.ts +0 -170
- package/dist/json-config.d.ts.map +0 -1
- package/dist/json-config.js +0 -684
- package/dist/json-config.js.map +0 -1
- package/dist/jsonc.d.ts +0 -24
- package/dist/jsonc.d.ts.map +0 -1
- package/dist/jsonc.js +0 -125
- package/dist/jsonc.js.map +0 -1
- package/dist/middleware/request-validation.d.ts +0 -58
- package/dist/middleware/request-validation.d.ts.map +0 -1
- package/dist/middleware/request-validation.js +0 -328
- package/dist/middleware/request-validation.js.map +0 -1
- package/dist/mock-mode.d.ts +0 -95
- package/dist/mock-mode.d.ts.map +0 -1
- package/dist/mock-mode.js +0 -95
- package/dist/mock-mode.js.map +0 -1
- package/dist/openapi/auto-schema.d.ts +0 -83
- package/dist/openapi/auto-schema.d.ts.map +0 -1
- package/dist/openapi/auto-schema.js +0 -232
- package/dist/openapi/auto-schema.js.map +0 -1
- package/dist/openapi/generate.d.ts +0 -20
- package/dist/openapi/generate.d.ts.map +0 -1
- package/dist/openapi/generate.js +0 -121
- package/dist/openapi/generate.js.map +0 -1
- package/dist/openapi/loader.d.ts +0 -18
- package/dist/openapi/loader.d.ts.map +0 -1
- package/dist/openapi/loader.js +0 -25
- package/dist/openapi/loader.js.map +0 -1
- package/dist/openapi/register.d.ts +0 -58
- package/dist/openapi/register.d.ts.map +0 -1
- package/dist/openapi/register.js +0 -166
- package/dist/openapi/register.js.map +0 -1
- package/dist/openapi/seed.d.ts +0 -16
- package/dist/openapi/seed.d.ts.map +0 -1
- package/dist/openapi/seed.js +0 -58
- package/dist/openapi/seed.js.map +0 -1
- package/dist/openapi/translate.d.ts +0 -55
- package/dist/openapi/translate.d.ts.map +0 -1
- package/dist/openapi/translate.js +0 -319
- package/dist/openapi/translate.js.map +0 -1
- package/dist/openapi/walker.d.ts +0 -44
- package/dist/openapi/walker.d.ts.map +0 -1
- package/dist/openapi/walker.js +0 -15
- package/dist/openapi/walker.js.map +0 -1
- package/dist/run.d.ts +0 -27
- package/dist/run.d.ts.map +0 -1
- package/dist/run.js +0 -87
- package/dist/run.js.map +0 -1
- package/dist/validation/validate.d.ts +0 -38
- package/dist/validation/validate.d.ts.map +0 -1
- package/dist/validation/validate.js +0 -372
- package/dist/validation/validate.js.map +0 -1
package/dist/bin-helpers.js
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
export const HELP_TEXT = `Usage: databehave-server [options] <config>
|
|
2
|
-
|
|
3
|
-
Options:
|
|
4
|
-
--open After the server is listening, open the admin UI in
|
|
5
|
-
the default browser. No-op (with a log line) when
|
|
6
|
-
admin is absent or admin.enabled !== true.
|
|
7
|
-
-h, --help Show this help and exit.
|
|
8
|
-
`;
|
|
9
|
-
/**
|
|
10
|
-
* Parse argv (without `node` / script name). Unknown flags are
|
|
11
|
-
* collected into `unknown` for the entry point to reject — we never
|
|
12
|
-
* silently ignore an unrecognized option.
|
|
13
|
-
*/
|
|
14
|
-
export const parseCliArgs = (argv) => {
|
|
15
|
-
const opts = {
|
|
16
|
-
open: false,
|
|
17
|
-
help: false,
|
|
18
|
-
unknown: [],
|
|
19
|
-
};
|
|
20
|
-
for (const a of argv) {
|
|
21
|
-
if (a === '--open')
|
|
22
|
-
opts.open = true;
|
|
23
|
-
else if (a === '-h' || a === '--help')
|
|
24
|
-
opts.help = true;
|
|
25
|
-
else if (a.startsWith('-'))
|
|
26
|
-
opts.unknown.push(a);
|
|
27
|
-
else if (opts.configPath === undefined)
|
|
28
|
-
opts.configPath = a;
|
|
29
|
-
else
|
|
30
|
-
opts.unknown.push(a);
|
|
31
|
-
}
|
|
32
|
-
return opts;
|
|
33
|
-
};
|
|
34
|
-
/**
|
|
35
|
-
* Build the URL `--open` should hit. Returns `null` when the admin
|
|
36
|
-
* panel is not active (no `admin`, or `enabled !== true`) — the
|
|
37
|
-
* caller surfaces that as a skip-with-log message. Hosts bound to
|
|
38
|
-
* `0.0.0.0` / `::` are rewritten to the matching loopback so the
|
|
39
|
-
* browser doesn't try to dial the wildcard.
|
|
40
|
-
*/
|
|
41
|
-
export const composeAdminUrl = (handle, admin) => {
|
|
42
|
-
if (!admin || admin.enabled !== true)
|
|
43
|
-
return null;
|
|
44
|
-
const host = handle.host === '0.0.0.0' || handle.host === '::' || handle.host === ''
|
|
45
|
-
? '127.0.0.1'
|
|
46
|
-
: handle.host;
|
|
47
|
-
const path = typeof admin.path === 'string' && admin.path !== '' ? admin.path : '/databehave';
|
|
48
|
-
return `http://${host}:${handle.port}${path}`;
|
|
49
|
-
};
|
|
50
|
-
/** Platform-specific browser opener. Pure — returns the spawn args. */
|
|
51
|
-
export const resolveOpener = (platform, url) => {
|
|
52
|
-
if (platform === 'darwin')
|
|
53
|
-
return { cmd: 'open', args: [url] };
|
|
54
|
-
// On Windows, `start` is a `cmd.exe` builtin. The empty string is
|
|
55
|
-
// the (required) window title — without it `start` treats the URL
|
|
56
|
-
// as the title and opens nothing.
|
|
57
|
-
if (platform === 'win32')
|
|
58
|
-
return { cmd: 'cmd', args: ['/c', 'start', '', url] };
|
|
59
|
-
return { cmd: 'xdg-open', args: [url] };
|
|
60
|
-
};
|
|
61
|
-
//# sourceMappingURL=bin-helpers.js.map
|
package/dist/bin-helpers.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bin-helpers.js","sourceRoot":"","sources":["../src/bin-helpers.ts"],"names":[],"mappings":"AAgBA,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;CAOxB,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAuB,EAAc,EAAE;IAClE,MAAM,IAAI,GAAe;QACvB,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,EAAE;KACZ,CAAA;IACD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,KAAK,QAAQ;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;aAC/B,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,QAAQ;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;aAClD,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;aAC3C,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;YAAE,IAAI,CAAC,UAAU,GAAG,CAAC,CAAA;;YACtD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC3B,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAcD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,MAAkB,EAClB,KAA+B,EAChB,EAAE;IACjB,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IACjD,MAAM,IAAI,GACR,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,EAAE;QACrE,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,MAAM,CAAC,IAAI,CAAA;IACjB,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAA;IAC7F,OAAO,UAAU,IAAI,IAAI,MAAM,CAAC,IAAI,GAAG,IAAI,EAAE,CAAA;AAC/C,CAAC,CAAA;AAED,uEAAuE;AACvE,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,QAAyB,EACzB,GAAW,EACsB,EAAE;IACnC,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAA;IAC9D,kEAAkE;IAClE,kEAAkE;IAClE,kCAAkC;IAClC,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,CAAA;IAC/E,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAA;AACzC,CAAC,CAAA"}
|
package/dist/bin.d.ts
DELETED
package/dist/bin.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
|
package/dist/bin.js
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* `@databehave/server` CLI — thin wrapper around the programmatic
|
|
4
|
-
* `run()` entry. Parses argv, delegates lifecycle to `run()`, and
|
|
5
|
-
* wires `SIGINT` / `SIGTERM` to the returned `RunHandle.close()`.
|
|
6
|
-
*
|
|
7
|
-
* All server / opener wiring lives in `./run.ts`, so
|
|
8
|
-
* `import { run } from '@databehave/server'` and `npx @databehave/server …`
|
|
9
|
-
* are observationally equivalent (same log lines, same error model).
|
|
10
|
-
*
|
|
11
|
-
* Flags:
|
|
12
|
-
*
|
|
13
|
-
* --open After `listening`, open the admin URL.
|
|
14
|
-
* -h, --help Print usage and exit 0.
|
|
15
|
-
*
|
|
16
|
-
* Exit codes: 0 on clean shutdown, 1 on bootstrap failure, 2 on bad
|
|
17
|
-
* usage (unknown flag or missing config path).
|
|
18
|
-
*/
|
|
19
|
-
import { HELP_TEXT, parseCliArgs } from './bin-helpers.js';
|
|
20
|
-
import { run } from './run.js';
|
|
21
|
-
const isAbortLikeError = (err) => {
|
|
22
|
-
if (err instanceof Error && err.name === 'AbortError')
|
|
23
|
-
return true;
|
|
24
|
-
if (typeof err !== 'object' || err === null)
|
|
25
|
-
return false;
|
|
26
|
-
const maybeCode = err.code;
|
|
27
|
-
const maybeName = err.name;
|
|
28
|
-
return maybeCode === 'ABORT_ERR' || maybeName === 'AbortError';
|
|
29
|
-
};
|
|
30
|
-
const main = async () => {
|
|
31
|
-
const opts = parseCliArgs(process.argv.slice(2));
|
|
32
|
-
if (opts.help) {
|
|
33
|
-
process.stdout.write(HELP_TEXT);
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
if (opts.unknown.length > 0) {
|
|
37
|
-
console.error(`[@databehave/server] unknown option(s): ${opts.unknown.join(' ')}`);
|
|
38
|
-
process.stderr.write(HELP_TEXT);
|
|
39
|
-
process.exit(2);
|
|
40
|
-
}
|
|
41
|
-
if (!opts.configPath) {
|
|
42
|
-
process.stderr.write(HELP_TEXT);
|
|
43
|
-
process.exit(2);
|
|
44
|
-
}
|
|
45
|
-
let handle = null;
|
|
46
|
-
let pendingSignal = null;
|
|
47
|
-
let shuttingDown = false;
|
|
48
|
-
const shutdown = (signal) => {
|
|
49
|
-
if (shuttingDown)
|
|
50
|
-
return;
|
|
51
|
-
if (handle === null) {
|
|
52
|
-
pendingSignal = signal;
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
shuttingDown = true;
|
|
56
|
-
console.info(`[@databehave/server] shutting down (${signal})`);
|
|
57
|
-
handle
|
|
58
|
-
.close()
|
|
59
|
-
.then(() => process.exit(0))
|
|
60
|
-
.catch((err) => {
|
|
61
|
-
console.error('[@databehave/server] failed to close', err);
|
|
62
|
-
process.exit(1);
|
|
63
|
-
});
|
|
64
|
-
};
|
|
65
|
-
process.on('SIGINT', () => shutdown('SIGINT'));
|
|
66
|
-
process.on('SIGTERM', () => shutdown('SIGTERM'));
|
|
67
|
-
try {
|
|
68
|
-
handle = await run({
|
|
69
|
-
config: opts.configPath,
|
|
70
|
-
open: opts.open,
|
|
71
|
-
});
|
|
72
|
-
if (pendingSignal !== null)
|
|
73
|
-
shutdown(pendingSignal);
|
|
74
|
-
}
|
|
75
|
-
catch (err) {
|
|
76
|
-
if (pendingSignal !== null && isAbortLikeError(err)) {
|
|
77
|
-
process.exit(0);
|
|
78
|
-
}
|
|
79
|
-
throw err;
|
|
80
|
-
}
|
|
81
|
-
};
|
|
82
|
-
main().catch((err) => {
|
|
83
|
-
console.error('[@databehave/server] failed to start', err);
|
|
84
|
-
process.exit(1);
|
|
85
|
-
});
|
|
86
|
-
//# sourceMappingURL=bin.js.map
|
package/dist/bin.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
|
package/dist/define.d.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import type { Config } from './types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Identity helper providing TypeScript intellisense at the config
|
|
4
|
-
* call site. Equivalent to `(config: Config) => config`.
|
|
5
|
-
*
|
|
6
|
-
* In non-production environments the returned config is **deep**-frozen
|
|
7
|
-
* so accidental mutation — including `config.routes['GET /x'] = …`
|
|
8
|
-
* or pushing into `cors.allowMethods` — throws loudly in tests instead
|
|
9
|
-
* of corrupting the server silently. Production skips the freeze to
|
|
10
|
-
* avoid breaking callers that legitimately patch the object after
|
|
11
|
-
* `defineConfig()` for env-specific wiring.
|
|
12
|
-
*
|
|
13
|
-
* Handler functions inside `routes` are intentionally left mutable
|
|
14
|
-
* (they're rebuilt per call anyway) — freeze stops at function
|
|
15
|
-
* boundaries.
|
|
16
|
-
*
|
|
17
|
-
* Usage:
|
|
18
|
-
* ```ts
|
|
19
|
-
* import { defineConfig } from '@databehave/server'
|
|
20
|
-
* export default defineConfig({ routes: { ... } })
|
|
21
|
-
* ```
|
|
22
|
-
*/
|
|
23
|
-
export declare const defineConfig: (config: Config) => Config;
|
|
24
|
-
/** @internal exported for the JSON config loader to apply the same protection. */
|
|
25
|
-
export declare const _deepFreezeForDev: <T>(value: T) => T;
|
|
26
|
-
//# sourceMappingURL=define.d.ts.map
|
package/dist/define.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAoBxC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,KAAG,MAK7C,CAAA;AAED,kFAAkF;AAClF,eAAO,MAAM,iBAAiB,GAAI,CAAC,EAAE,OAAO,CAAC,KAAG,CAG/C,CAAA"}
|
package/dist/define.js
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Recursively freeze a value so mutation throws in strict mode.
|
|
3
|
-
* Skips functions (handlers stay callable, and freezing their
|
|
4
|
-
* own properties is rarely useful) and respects already-frozen
|
|
5
|
-
* branches to avoid revisiting cycles.
|
|
6
|
-
*/
|
|
7
|
-
const deepFreeze = (value, seen = new WeakSet()) => {
|
|
8
|
-
if (value === null || typeof value !== 'object')
|
|
9
|
-
return value;
|
|
10
|
-
if (seen.has(value))
|
|
11
|
-
return value;
|
|
12
|
-
seen.add(value);
|
|
13
|
-
if (Object.isFrozen(value))
|
|
14
|
-
return value;
|
|
15
|
-
for (const v of Object.values(value)) {
|
|
16
|
-
if (v !== null && typeof v === 'object')
|
|
17
|
-
deepFreeze(v, seen);
|
|
18
|
-
}
|
|
19
|
-
Object.freeze(value);
|
|
20
|
-
return value;
|
|
21
|
-
};
|
|
22
|
-
/**
|
|
23
|
-
* Identity helper providing TypeScript intellisense at the config
|
|
24
|
-
* call site. Equivalent to `(config: Config) => config`.
|
|
25
|
-
*
|
|
26
|
-
* In non-production environments the returned config is **deep**-frozen
|
|
27
|
-
* so accidental mutation — including `config.routes['GET /x'] = …`
|
|
28
|
-
* or pushing into `cors.allowMethods` — throws loudly in tests instead
|
|
29
|
-
* of corrupting the server silently. Production skips the freeze to
|
|
30
|
-
* avoid breaking callers that legitimately patch the object after
|
|
31
|
-
* `defineConfig()` for env-specific wiring.
|
|
32
|
-
*
|
|
33
|
-
* Handler functions inside `routes` are intentionally left mutable
|
|
34
|
-
* (they're rebuilt per call anyway) — freeze stops at function
|
|
35
|
-
* boundaries.
|
|
36
|
-
*
|
|
37
|
-
* Usage:
|
|
38
|
-
* ```ts
|
|
39
|
-
* import { defineConfig } from '@databehave/server'
|
|
40
|
-
* export default defineConfig({ routes: { ... } })
|
|
41
|
-
* ```
|
|
42
|
-
*/
|
|
43
|
-
export const defineConfig = (config) => {
|
|
44
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
45
|
-
deepFreeze(config);
|
|
46
|
-
}
|
|
47
|
-
return config;
|
|
48
|
-
};
|
|
49
|
-
/** @internal exported for the JSON config loader to apply the same protection. */
|
|
50
|
-
export const _deepFreezeForDev = (value) => {
|
|
51
|
-
if (process.env.NODE_ENV !== 'production')
|
|
52
|
-
deepFreeze(value);
|
|
53
|
-
return value;
|
|
54
|
-
};
|
|
55
|
-
//# sourceMappingURL=define.js.map
|
package/dist/define.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"define.js","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,UAAU,GAAG,CAAI,KAAQ,EAAE,OAAwB,IAAI,OAAO,EAAE,EAAK,EAAE;IAC3E,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC7D,IAAI,IAAI,CAAC,GAAG,CAAC,KAAe,CAAC;QAAE,OAAO,KAAK,CAAA;IAC3C,IAAI,CAAC,GAAG,CAAC,KAAe,CAAC,CAAA;IACzB,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IACxC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAgC,CAAC,EAAE,CAAC;QAChE,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;IAC9D,CAAC;IACD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACpB,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAc,EAAU,EAAE;IACrD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC1C,UAAU,CAAC,MAAM,CAAC,CAAA;IACpB,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,kFAAkF;AAClF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAI,KAAQ,EAAK,EAAE;IAClD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;QAAE,UAAU,CAAC,KAAK,CAAC,CAAA;IAC5D,OAAO,KAAK,CAAA;AACd,CAAC,CAAA"}
|
package/dist/json-config.d.ts
DELETED
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
import { type MockModeConfig } from './mock-mode.js';
|
|
2
|
-
import type { Config, CorsConfig, Handler } from './types.js';
|
|
3
|
-
/**
|
|
4
|
-
* Static response declarable per endpoint. Returned verbatim when the
|
|
5
|
-
* endpoint uses the `{ response }` form. Mirrors the JSON-safe subset
|
|
6
|
-
* of `MockResponse` (no `text` / `html` / `raw`).
|
|
7
|
-
*/
|
|
8
|
-
export interface EndpointResponse {
|
|
9
|
-
status: number;
|
|
10
|
-
json?: unknown;
|
|
11
|
-
empty?: boolean;
|
|
12
|
-
headers?: Record<string, string>;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Per-endpoint declaration. Three forms:
|
|
16
|
-
*
|
|
17
|
-
* - **string**: module path to a handler (shorthand for `{ handler }`)
|
|
18
|
-
* - **`{ handler, status? }`**: dynamic-import handler. Optional
|
|
19
|
-
* `status` registers an HTTP status override for this route in
|
|
20
|
-
* the mock-mode `pathOverrides` map (e.g. force 500 for that route).
|
|
21
|
-
* - **`{ response }`**: static response only — no handler module.
|
|
22
|
-
* The handler is synthesized to return the literal response.
|
|
23
|
-
*
|
|
24
|
-
* `handler` and `response` are mutually exclusive.
|
|
25
|
-
*/
|
|
26
|
-
export type EndpointSpec = string | {
|
|
27
|
-
handler: string;
|
|
28
|
-
status?: number;
|
|
29
|
-
response?: never;
|
|
30
|
-
} | {
|
|
31
|
-
response: EndpointResponse;
|
|
32
|
-
handler?: never;
|
|
33
|
-
status?: never;
|
|
34
|
-
};
|
|
35
|
-
/**
|
|
36
|
-
* Raw JSON shape declared inside `databehave.json`. Mirrors a
|
|
37
|
-
* narrow subset of `Config` plus the on-disk additions
|
|
38
|
-
* (`endpoints` map of route-key → `EndpointSpec`).
|
|
39
|
-
*/
|
|
40
|
-
export interface JsonConfig {
|
|
41
|
-
/** Path to the JSON OpenAPI document, relative to this file. */
|
|
42
|
-
openapi?: string;
|
|
43
|
-
/** Server listen options used by the CLI. */
|
|
44
|
-
server?: {
|
|
45
|
-
host?: string;
|
|
46
|
-
port?: number;
|
|
47
|
-
};
|
|
48
|
-
/**
|
|
49
|
-
* Prefix automatically prepended to every `endpoints` key.
|
|
50
|
-
* Lets callers write `"GET products/list"` instead of
|
|
51
|
-
* repeating the API prefix in every entry. Must start with `/` and
|
|
52
|
-
* must not end with `/` (e.g. `"/api/v1"`). OpenAPI paths are
|
|
53
|
-
* left untouched — they already carry their full path in the OAS document.
|
|
54
|
-
*/
|
|
55
|
-
basePath?: string;
|
|
56
|
-
/**
|
|
57
|
-
* CORS knobs. `origin` may be a single allowed origin string or an
|
|
58
|
-
* allowlist of strings (the function form on `CorsConfig`
|
|
59
|
-
* is reserved for the programmatic API). Anything off the allowlist
|
|
60
|
-
* is rejected (empty header) so misconfigured callers fail loudly
|
|
61
|
-
* instead of silently leaking `*`.
|
|
62
|
-
*/
|
|
63
|
-
cors?: Omit<CorsConfig, 'origin'> & {
|
|
64
|
-
origin?: string | readonly string[];
|
|
65
|
-
};
|
|
66
|
-
/** Built-in mock-mode behaviour. Disabled by default. */
|
|
67
|
-
mockMode?: MockModeConfig;
|
|
68
|
-
/**
|
|
69
|
-
* Opt-in admin / error-injection panel. Default: disabled.
|
|
70
|
-
* Pass-through to `Config.admin`. The JSON loader
|
|
71
|
-
* automatically supplements `openapiBody` from the resolved OpenAPI
|
|
72
|
-
* document so the UI route picker works without manual wiring.
|
|
73
|
-
*/
|
|
74
|
-
admin?: Config['admin'];
|
|
75
|
-
/**
|
|
76
|
-
* Opt-in per-request access logs. Pass-through to
|
|
77
|
-
* `Config.log`. Default: disabled. See README
|
|
78
|
-
* "Access logs" for the shape.
|
|
79
|
-
*/
|
|
80
|
-
log?: Config['log'];
|
|
81
|
-
/**
|
|
82
|
-
* Opt-in inbound request validation against the OpenAPI document.
|
|
83
|
-
* Pass-through to `Config.validation`. Default off
|
|
84
|
-
* (`{ request: false }`) — when omitted the runtime behaves
|
|
85
|
-
* byte-identical to a build without the validator.
|
|
86
|
-
*/
|
|
87
|
-
validation?: Config['validation'];
|
|
88
|
-
/**
|
|
89
|
-
* Opt-in auto-schema mode (Phase 2C). When `enabled: true`, every
|
|
90
|
-
* OAS path not covered by `endpoints` is served from data
|
|
91
|
-
* generated by `@databehave/schema`'s `mock()` engine, derived
|
|
92
|
-
* from the OpenAPI document. The peer is loaded via dynamic
|
|
93
|
-
* `import()` at server-creation time; install it separately with
|
|
94
|
-
* `npm i @databehave/schema`. See README "Auto-schema mode".
|
|
95
|
-
*
|
|
96
|
-
* Always an object — the legacy boolean shorthand
|
|
97
|
-
* (`schema: true`) was removed. Unknown keys throw at
|
|
98
|
-
* config-load time. Fields:
|
|
99
|
-
*
|
|
100
|
-
* - `enabled` — required boolean. `false` (or omitting the
|
|
101
|
-
* `schema` field entirely) keeps the default JSONC mock-only
|
|
102
|
-
* flow.
|
|
103
|
-
* - `seed` — `number` (fixed), `"stable"` (per-request hash),
|
|
104
|
-
* or `"random"` (fresh per request). Default `"stable"`.
|
|
105
|
-
* - `locale` — optional locale tag (forwarded as a future hint).
|
|
106
|
-
* - `arrayCount` — default array length when OAS lacks `minItems`.
|
|
107
|
-
*/
|
|
108
|
-
schema?: {
|
|
109
|
-
enabled: boolean;
|
|
110
|
-
seed?: number | 'stable' | 'random';
|
|
111
|
-
locale?: string;
|
|
112
|
-
arrayCount?: number;
|
|
113
|
-
};
|
|
114
|
-
/**
|
|
115
|
-
* Route-key → endpoint declaration map. Keys may be written
|
|
116
|
-
* relative to `basePath` (e.g. `"GET products/list"`); they
|
|
117
|
-
* may also be absolute (`"GET /health"`) — any key starting with
|
|
118
|
-
* `/` after the method is registered verbatim.
|
|
119
|
-
*/
|
|
120
|
-
endpoints?: Partial<Record<string, EndpointSpec>>;
|
|
121
|
-
}
|
|
122
|
-
/** Result of loading a JSON config from disk. */
|
|
123
|
-
export interface LoadedConfig {
|
|
124
|
-
/** Fully-assembled config ready for `createServer`. */
|
|
125
|
-
readonly config: Config;
|
|
126
|
-
/** Server listen options copied verbatim from the JSON. */
|
|
127
|
-
readonly server: {
|
|
128
|
-
host: string;
|
|
129
|
-
port: number;
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Options for `loadConfig`.
|
|
134
|
-
*/
|
|
135
|
-
export interface LoadConfigOptions {
|
|
136
|
-
/**
|
|
137
|
-
* Pre-resolved handler map. Keys may match the JSONC `endpoints`
|
|
138
|
-
* value either exactly (e.g. `./src/routes/health.js`) or in any
|
|
139
|
-
* canonically equivalent form — leading `./` and the file extension
|
|
140
|
-
* (`.js`/`.mjs`/`.cjs`/`.ts`/`.tsx`/`.mts`/`.cts`) are stripped
|
|
141
|
-
* before comparison. When a key matches, the handler is used
|
|
142
|
-
* directly and the dynamic `import()` for that route is skipped.
|
|
143
|
-
*
|
|
144
|
-
* Use case: test environments (vitest under plain Node 18) that cannot
|
|
145
|
-
* load `.ts` source files through native `import()`. Construct the map
|
|
146
|
-
* via static imports or `import.meta.glob('eager')`, then pass it in.
|
|
147
|
-
*
|
|
148
|
-
* Handlers not present in the map fall back to dynamic import. Values
|
|
149
|
-
* that are not functions raise an error at boot time.
|
|
150
|
-
*/
|
|
151
|
-
handlers?: Record<string, Handler>;
|
|
152
|
-
/**
|
|
153
|
-
* Sink for non-fatal warnings emitted while wiring the OpenAPI
|
|
154
|
-
* adapter (walk errors, empty schemas). Defaults to `console.warn`.
|
|
155
|
-
* Inject a no-op logger from tests to silence the output, or a
|
|
156
|
-
* structured logger in production to capture the messages.
|
|
157
|
-
*/
|
|
158
|
-
logger?: {
|
|
159
|
-
warn(message: string): void;
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Load and fully resolve a `databehave.json`.
|
|
164
|
-
*
|
|
165
|
-
* Returns a ready-to-run `Config` plus the listen options the
|
|
166
|
-
* CLI should bind to. Errors are thrown synchronously after parsing
|
|
167
|
-
* to fail fast on bad configs.
|
|
168
|
-
*/
|
|
169
|
-
export declare const loadConfig: (configPath: string, options?: LoadConfigOptions) => Promise<LoadedConfig>;
|
|
170
|
-
//# sourceMappingURL=json-config.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"json-config.d.ts","sourceRoot":"","sources":["../src/json-config.ts"],"names":[],"mappings":"AAoBA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAA;AAYvB,OAAO,KAAK,EACV,MAAM,EACN,UAAU,EACV,OAAO,EAGR,MAAM,YAAY,CAAA;AAEnB;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACjC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,YAAY,GACpB,MAAM,GACN;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,GACtD;IAAE,QAAQ,EAAE,gBAAgB,CAAC;IAAC,OAAO,CAAC,EAAE,KAAK,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAA;CAAE,CAAA;AAEnE;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,6CAA6C;IAC7C,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACzC;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG;QAClC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAA;KACpC,CAAA;IACD,yDAAyD;IACzD,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;IACvB;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IACnB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;IACjC;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CAAC,EAAE;QACP,OAAO,EAAE,OAAO,CAAA;QAChB,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAA;QACnC,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,UAAU,CAAC,EAAE,MAAM,CAAA;KACpB,CAAA;IACD;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAA;CAClD;AAED,iDAAiD;AACjD,MAAM,WAAW,YAAY;IAC3B,uDAAuD;IACvD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,2DAA2D;IAC3D,QAAQ,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAChD;AAybD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC;;;;;OAKG;IACH,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;CACzC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,GACrB,YAAY,MAAM,EAClB,UAAU,iBAAiB,KAC1B,OAAO,CAAC,YAAY,CAgUtB,CAAA"}
|