@databehave/server 0.1.3 → 0.2.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 (156) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +85 -83
  3. package/dist/cors.d.ts +1 -1
  4. package/dist/cors.js +1 -1
  5. package/dist/cors.js.map +1 -1
  6. package/dist/http.d.ts +94 -0
  7. package/dist/http.d.ts.map +1 -0
  8. package/dist/http.js +23 -0
  9. package/dist/http.js.map +1 -0
  10. package/dist/index.d.ts +10 -20
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +8 -18
  13. package/dist/index.js.map +1 -1
  14. package/dist/log.d.ts +9 -49
  15. package/dist/log.d.ts.map +1 -1
  16. package/dist/log.js +16 -92
  17. package/dist/log.js.map +1 -1
  18. package/dist/node-authority.d.ts +12 -0
  19. package/dist/node-authority.d.ts.map +1 -0
  20. package/dist/node-authority.js +72 -0
  21. package/dist/node-authority.js.map +1 -0
  22. package/dist/node-body.d.ts +11 -0
  23. package/dist/node-body.d.ts.map +1 -0
  24. package/dist/node-body.js +61 -0
  25. package/dist/node-body.js.map +1 -0
  26. package/dist/node-http.d.ts +19 -0
  27. package/dist/node-http.d.ts.map +1 -0
  28. package/dist/node-http.js +210 -0
  29. package/dist/node-http.js.map +1 -0
  30. package/dist/plugins/access-log.d.ts +11 -0
  31. package/dist/plugins/access-log.d.ts.map +1 -0
  32. package/dist/plugins/access-log.js +27 -0
  33. package/dist/plugins/access-log.js.map +1 -0
  34. package/dist/plugins/cors.d.ts +5 -0
  35. package/dist/plugins/cors.d.ts.map +1 -0
  36. package/dist/plugins/cors.js +35 -0
  37. package/dist/plugins/cors.js.map +1 -0
  38. package/dist/plugins/routes.d.ts +5 -0
  39. package/dist/plugins/routes.d.ts.map +1 -0
  40. package/dist/plugins/routes.js +10 -0
  41. package/dist/plugins/routes.js.map +1 -0
  42. package/dist/request.d.ts +2 -2
  43. package/dist/request.d.ts.map +1 -1
  44. package/dist/request.js +6 -4
  45. package/dist/request.js.map +1 -1
  46. package/dist/route-key.d.ts +2 -0
  47. package/dist/route-key.d.ts.map +1 -1
  48. package/dist/route-key.js +5 -1
  49. package/dist/route-key.js.map +1 -1
  50. package/dist/server.d.ts +7 -59
  51. package/dist/server.d.ts.map +1 -1
  52. package/dist/server.js +289 -466
  53. package/dist/server.js.map +1 -1
  54. package/dist/types.d.ts +10 -156
  55. package/dist/types.d.ts.map +1 -1
  56. package/dist/types.js +1 -1
  57. package/package.json +9 -22
  58. package/dist/admin/admin-routes.d.ts +0 -42
  59. package/dist/admin/admin-routes.d.ts.map +0 -1
  60. package/dist/admin/admin-routes.js +0 -472
  61. package/dist/admin/admin-routes.js.map +0 -1
  62. package/dist/admin/admin-types.d.ts +0 -170
  63. package/dist/admin/admin-types.d.ts.map +0 -1
  64. package/dist/admin/admin-types.js +0 -30
  65. package/dist/admin/admin-types.js.map +0 -1
  66. package/dist/admin/banner.d.ts +0 -11
  67. package/dist/admin/banner.d.ts.map +0 -1
  68. package/dist/admin/banner.js +0 -5
  69. package/dist/admin/banner.js.map +0 -1
  70. package/dist/admin/header-parser.d.ts +0 -14
  71. package/dist/admin/header-parser.d.ts.map +0 -1
  72. package/dist/admin/header-parser.js +0 -171
  73. package/dist/admin/header-parser.js.map +0 -1
  74. package/dist/admin/inject.d.ts +0 -48
  75. package/dist/admin/inject.d.ts.map +0 -1
  76. package/dist/admin/inject.js +0 -167
  77. package/dist/admin/inject.js.map +0 -1
  78. package/dist/admin/overrides-store.d.ts +0 -18
  79. package/dist/admin/overrides-store.d.ts.map +0 -1
  80. package/dist/admin/overrides-store.js +0 -100
  81. package/dist/admin/overrides-store.js.map +0 -1
  82. package/dist/admin/resolve-cors.d.ts +0 -22
  83. package/dist/admin/resolve-cors.d.ts.map +0 -1
  84. package/dist/admin/resolve-cors.js +0 -28
  85. package/dist/admin/resolve-cors.js.map +0 -1
  86. package/dist/admin/scenarios-store.d.ts +0 -15
  87. package/dist/admin/scenarios-store.d.ts.map +0 -1
  88. package/dist/admin/scenarios-store.js +0 -109
  89. package/dist/admin/scenarios-store.js.map +0 -1
  90. package/dist/admin/ui.css +0 -1
  91. package/dist/admin/ui.html +0 -13
  92. package/dist/admin/ui.js +0 -240
  93. package/dist/bin-helpers.d.ts +0 -46
  94. package/dist/bin-helpers.d.ts.map +0 -1
  95. package/dist/bin-helpers.js +0 -61
  96. package/dist/bin-helpers.js.map +0 -1
  97. package/dist/bin.d.ts +0 -3
  98. package/dist/bin.d.ts.map +0 -1
  99. package/dist/bin.js +0 -86
  100. package/dist/bin.js.map +0 -1
  101. package/dist/define.d.ts +0 -26
  102. package/dist/define.d.ts.map +0 -1
  103. package/dist/define.js +0 -55
  104. package/dist/define.js.map +0 -1
  105. package/dist/json-config.d.ts +0 -170
  106. package/dist/json-config.d.ts.map +0 -1
  107. package/dist/json-config.js +0 -684
  108. package/dist/json-config.js.map +0 -1
  109. package/dist/jsonc.d.ts +0 -24
  110. package/dist/jsonc.d.ts.map +0 -1
  111. package/dist/jsonc.js +0 -125
  112. package/dist/jsonc.js.map +0 -1
  113. package/dist/middleware/request-validation.d.ts +0 -58
  114. package/dist/middleware/request-validation.d.ts.map +0 -1
  115. package/dist/middleware/request-validation.js +0 -328
  116. package/dist/middleware/request-validation.js.map +0 -1
  117. package/dist/mock-mode.d.ts +0 -95
  118. package/dist/mock-mode.d.ts.map +0 -1
  119. package/dist/mock-mode.js +0 -95
  120. package/dist/mock-mode.js.map +0 -1
  121. package/dist/openapi/auto-schema.d.ts +0 -83
  122. package/dist/openapi/auto-schema.d.ts.map +0 -1
  123. package/dist/openapi/auto-schema.js +0 -232
  124. package/dist/openapi/auto-schema.js.map +0 -1
  125. package/dist/openapi/generate.d.ts +0 -20
  126. package/dist/openapi/generate.d.ts.map +0 -1
  127. package/dist/openapi/generate.js +0 -121
  128. package/dist/openapi/generate.js.map +0 -1
  129. package/dist/openapi/loader.d.ts +0 -18
  130. package/dist/openapi/loader.d.ts.map +0 -1
  131. package/dist/openapi/loader.js +0 -25
  132. package/dist/openapi/loader.js.map +0 -1
  133. package/dist/openapi/register.d.ts +0 -58
  134. package/dist/openapi/register.d.ts.map +0 -1
  135. package/dist/openapi/register.js +0 -166
  136. package/dist/openapi/register.js.map +0 -1
  137. package/dist/openapi/seed.d.ts +0 -16
  138. package/dist/openapi/seed.d.ts.map +0 -1
  139. package/dist/openapi/seed.js +0 -58
  140. package/dist/openapi/seed.js.map +0 -1
  141. package/dist/openapi/translate.d.ts +0 -55
  142. package/dist/openapi/translate.d.ts.map +0 -1
  143. package/dist/openapi/translate.js +0 -319
  144. package/dist/openapi/translate.js.map +0 -1
  145. package/dist/openapi/walker.d.ts +0 -44
  146. package/dist/openapi/walker.d.ts.map +0 -1
  147. package/dist/openapi/walker.js +0 -15
  148. package/dist/openapi/walker.js.map +0 -1
  149. package/dist/run.d.ts +0 -27
  150. package/dist/run.d.ts.map +0 -1
  151. package/dist/run.js +0 -87
  152. package/dist/run.js.map +0 -1
  153. package/dist/validation/validate.d.ts +0 -38
  154. package/dist/validation/validate.d.ts.map +0 -1
  155. package/dist/validation/validate.js +0 -372
  156. package/dist/validation/validate.js.map +0 -1
@@ -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
@@ -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
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
3
- //# sourceMappingURL=bin.d.ts.map
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
@@ -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
@@ -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"}
@@ -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"}