@crvouga/mockingbird-service-formbricks 3.5.0 → 3.7.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/dist/cli.js CHANGED
@@ -3,8 +3,8 @@ import {
3
3
  runCli,
4
4
  serveCommand,
5
5
  serveTarget
6
- } from "./chunk-MYBPU56P.js";
7
- import "./chunk-THESW6F4.js";
6
+ } from "./chunk-M3VADEIL.js";
7
+ import "./chunk-XJB56QGS.js";
8
8
 
9
9
  // src/cli.ts
10
10
  var code = await runCli(
package/dist/index.d.ts CHANGED
@@ -184,9 +184,15 @@ declare class Collection<T> {
184
184
  }>;
185
185
  }
186
186
 
187
+ /**
188
+ * What names an id base: a non-negative safe integer (or its decimal string) or `"boot"`,
189
+ * which derives the base from the wall clock when the runtime is created.
190
+ */
191
+ type IdBase = number | string;
187
192
  /**
188
193
  * Sequential id source persisted in SQLite. Ids are deterministic for a given
189
194
  * sequence history (`cus_` + 14 opaque chars), so reproductions stay stable.
195
+ * A runtime's `idBase` is mixed in, so a different base reissues none of another's ids.
190
196
  */
191
197
  declare class IdSequence {
192
198
  private readonly sqlite;
@@ -525,6 +531,15 @@ type FaultRule = {
525
531
  requestHeaders?: Record<string, string>;
526
532
  /** Fault only requests carrying these query parameters. `"*"` matches any value. */
527
533
  query?: Record<string, string>;
534
+ /**
535
+ * Fault only requests whose JSON body carries these fields. Each key is a dotted path into
536
+ * the parsed body (`"patient_details.email"`; a number steps into an array, `"items.0.sku"`)
537
+ * and each value is what the field must equal: a string, number, boolean or `null`, compared
538
+ * strictly (`3` is not `"3"`). `"*"` matches any value that is present. A request whose body
539
+ * is missing, is not JSON, or is not a JSON object never matches. Not `body`, which is the
540
+ * response a rule injects.
541
+ */
542
+ requestBody?: Record<string, RequestBodyValue>;
528
543
  /**
529
544
  * Fault only this namespace. Omit (or `"*"`) to fault every namespace — which is what
530
545
  * an in-process caller usually wants, and what a parallel worker usually does not:
@@ -591,6 +606,8 @@ type FaultRule = {
591
606
  /** The preset this rule was expanded from, if any. */
592
607
  fromPreset?: string;
593
608
  };
609
+ /** What a field of the request body must equal in {@link FaultRule.requestBody}. */
610
+ type RequestBodyValue = string | number | boolean | null;
594
611
  /** A fault that fired for one request. */
595
612
  type FaultHit = {
596
613
  id: string;
@@ -628,6 +645,11 @@ type FaultCandidate = {
628
645
  /** Request headers and query, for rules that match on them. */
629
646
  headers?: Headers;
630
647
  query?: URLSearchParams;
648
+ /**
649
+ * The request body parsed as JSON, read only when a rule matches on `requestBody`. Resolve
650
+ * `undefined` for a body that is missing or not JSON. It must leave the request readable.
651
+ */
652
+ readJson?: () => Promise<unknown>;
631
653
  /** The namespace clock, for `from` / `until`. Rules with a window are skipped without it. */
632
654
  now?: number;
633
655
  /** How to spend a delay for this request. Default: the registry's own sleep. */
@@ -1150,6 +1172,12 @@ type ServiceRuntime<T extends ServiceInstance> = FetchAPI & {
1150
1172
  mount(prefix: string): MountedAPI;
1151
1173
  readonly sqlite: SqliteClient$1;
1152
1174
  readonly clock: Clock;
1175
+ /**
1176
+ * Change the id base ({@link RuntimeOptions.idBase}) for ids generated from now on, and
1177
+ * return the number it resolved to. Set it before the first request so a boot's ids stay
1178
+ * one run.
1179
+ */
1180
+ setIdBase(base: IdBase): number;
1153
1181
  readonly faults: FaultRegistry;
1154
1182
  /** Baseline response time per namespace. */
1155
1183
  readonly latency: LatencyRegistry;
package/dist/index.js CHANGED
@@ -14,7 +14,7 @@ import {
14
14
  operationIds,
15
15
  supportedOperationIds,
16
16
  validateResponseData
17
- } from "./chunk-THESW6F4.js";
17
+ } from "./chunk-XJB56QGS.js";
18
18
  export {
19
19
  CORPUS_SURVEYS,
20
20
  DEFAULT_SETTINGS,
package/dist/server.d.ts CHANGED
@@ -133,6 +133,12 @@ interface SqliteClient$2 {
133
133
  transaction<T>(fn: () => T): T;
134
134
  }
135
135
 
136
+ /**
137
+ * What names an id base: a non-negative safe integer (or its decimal string) or `"boot"`,
138
+ * which derives the base from the wall clock when the runtime is created.
139
+ */
140
+ type IdBase$1 = number | string;
141
+
136
142
  /**
137
143
  * The single source of time for a service.
138
144
  *
@@ -215,6 +221,15 @@ type FaultRule$1 = {
215
221
  requestHeaders?: Record<string, string>;
216
222
  /** Fault only requests carrying these query parameters. `"*"` matches any value. */
217
223
  query?: Record<string, string>;
224
+ /**
225
+ * Fault only requests whose JSON body carries these fields. Each key is a dotted path into
226
+ * the parsed body (`"patient_details.email"`; a number steps into an array, `"items.0.sku"`)
227
+ * and each value is what the field must equal: a string, number, boolean or `null`, compared
228
+ * strictly (`3` is not `"3"`). `"*"` matches any value that is present. A request whose body
229
+ * is missing, is not JSON, or is not a JSON object never matches. Not `body`, which is the
230
+ * response a rule injects.
231
+ */
232
+ requestBody?: Record<string, RequestBodyValue$1>;
218
233
  /**
219
234
  * Fault only this namespace. Omit (or `"*"`) to fault every namespace — which is what
220
235
  * an in-process caller usually wants, and what a parallel worker usually does not:
@@ -281,6 +296,8 @@ type FaultRule$1 = {
281
296
  /** The preset this rule was expanded from, if any. */
282
297
  fromPreset?: string;
283
298
  };
299
+ /** What a field of the request body must equal in {@link FaultRule.requestBody}. */
300
+ type RequestBodyValue$1 = string | number | boolean | null;
284
301
  /** A fault that fired for one request. */
285
302
  type FaultHit$1 = {
286
303
  id: string;
@@ -305,6 +322,11 @@ type FaultCandidate$1 = {
305
322
  /** Request headers and query, for rules that match on them. */
306
323
  headers?: Headers;
307
324
  query?: URLSearchParams;
325
+ /**
326
+ * The request body parsed as JSON, read only when a rule matches on `requestBody`. Resolve
327
+ * `undefined` for a body that is missing or not JSON. It must leave the request readable.
328
+ */
329
+ readJson?: () => Promise<unknown>;
308
330
  /** The namespace clock, for `from` / `until`. Rules with a window are skipped without it. */
309
331
  now?: number;
310
332
  /** How to spend a delay for this request. Default: the registry's own sleep. */
@@ -827,6 +849,12 @@ type ServiceRuntime$1<T extends ServiceInstance$1> = FetchAPI$2 & {
827
849
  mount(prefix: string): MountedAPI$1;
828
850
  readonly sqlite: SqliteClient$2;
829
851
  readonly clock: Clock$1;
852
+ /**
853
+ * Change the id base ({@link RuntimeOptions.idBase}) for ids generated from now on, and
854
+ * return the number it resolved to. Set it before the first request so a boot's ids stay
855
+ * one run.
856
+ */
857
+ setIdBase(base: IdBase$1): number;
830
858
  readonly faults: FaultRegistry$1;
831
859
  /** Baseline response time per namespace. */
832
860
  readonly latency: LatencyRegistry$1;
@@ -932,6 +960,12 @@ type CommonServeOptions = {
932
960
  /** Synthetic provider fixture objects supplied by a fleet entry. */
933
961
  fixtures?: Record<string, unknown>;
934
962
  baseUrl?: string;
963
+ /**
964
+ * Boot settings from `--settings`, `MOCKINGBIRD_SETTINGS` or a fleet entry's `settings`,
965
+ * already checked by the target's {@link ServeTarget.parseSettings}. Pass them to the
966
+ * service's own `settings` option so they become every namespace's defaults.
967
+ */
968
+ settings?: Record<string, unknown>;
935
969
  };
936
970
  /**
937
971
  * What a service contributes to `serve`: how to build its runtime from CLI flags,
@@ -944,6 +978,13 @@ type ServeTarget = {
944
978
  defaultPort: number;
945
979
  /** Serve flags beyond the common ones. */
946
980
  options?: Record<string, CliOption>;
981
+ /**
982
+ * Check the boot settings a caller supplied (`--settings`, `MOCKINGBIRD_SETTINGS`, a fleet
983
+ * entry's `settings`) against the service's settings schema, returning them normalized
984
+ * or throwing a message naming the bad field. A target without one takes no boot settings,
985
+ * and supplying some is refused before a port is bound.
986
+ */
987
+ parseSettings?(settings: Record<string, unknown>): Record<string, unknown>;
947
988
  create(values: CliValues, common: CommonServeOptions): Promise<ServiceRuntime$1<ServiceInstance$1>> | ServiceRuntime$1<ServiceInstance$1>;
948
989
  /** Startup lines after the listen address, e.g. the loaded corpus version. */
949
990
  banner?(runtime: ServiceRuntime$1<ServiceInstance$1>): string[];
@@ -1125,9 +1166,15 @@ declare class Collection<T> {
1125
1166
  }>;
1126
1167
  }
1127
1168
 
1169
+ /**
1170
+ * What names an id base: a non-negative safe integer (or its decimal string) or `"boot"`,
1171
+ * which derives the base from the wall clock when the runtime is created.
1172
+ */
1173
+ type IdBase = number | string;
1128
1174
  /**
1129
1175
  * Sequential id source persisted in SQLite. Ids are deterministic for a given
1130
1176
  * sequence history (`cus_` + 14 opaque chars), so reproductions stay stable.
1177
+ * A runtime's `idBase` is mixed in, so a different base reissues none of another's ids.
1131
1178
  */
1132
1179
  declare class IdSequence {
1133
1180
  private readonly sqlite;
@@ -1466,6 +1513,15 @@ type FaultRule = {
1466
1513
  requestHeaders?: Record<string, string>;
1467
1514
  /** Fault only requests carrying these query parameters. `"*"` matches any value. */
1468
1515
  query?: Record<string, string>;
1516
+ /**
1517
+ * Fault only requests whose JSON body carries these fields. Each key is a dotted path into
1518
+ * the parsed body (`"patient_details.email"`; a number steps into an array, `"items.0.sku"`)
1519
+ * and each value is what the field must equal: a string, number, boolean or `null`, compared
1520
+ * strictly (`3` is not `"3"`). `"*"` matches any value that is present. A request whose body
1521
+ * is missing, is not JSON, or is not a JSON object never matches. Not `body`, which is the
1522
+ * response a rule injects.
1523
+ */
1524
+ requestBody?: Record<string, RequestBodyValue>;
1469
1525
  /**
1470
1526
  * Fault only this namespace. Omit (or `"*"`) to fault every namespace — which is what
1471
1527
  * an in-process caller usually wants, and what a parallel worker usually does not:
@@ -1532,6 +1588,8 @@ type FaultRule = {
1532
1588
  /** The preset this rule was expanded from, if any. */
1533
1589
  fromPreset?: string;
1534
1590
  };
1591
+ /** What a field of the request body must equal in {@link FaultRule.requestBody}. */
1592
+ type RequestBodyValue = string | number | boolean | null;
1535
1593
  /** A fault that fired for one request. */
1536
1594
  type FaultHit = {
1537
1595
  id: string;
@@ -1556,6 +1614,11 @@ type FaultCandidate = {
1556
1614
  /** Request headers and query, for rules that match on them. */
1557
1615
  headers?: Headers;
1558
1616
  query?: URLSearchParams;
1617
+ /**
1618
+ * The request body parsed as JSON, read only when a rule matches on `requestBody`. Resolve
1619
+ * `undefined` for a body that is missing or not JSON. It must leave the request readable.
1620
+ */
1621
+ readJson?: () => Promise<unknown>;
1559
1622
  /** The namespace clock, for `from` / `until`. Rules with a window are skipped without it. */
1560
1623
  now?: number;
1561
1624
  /** How to spend a delay for this request. Default: the registry's own sleep. */
@@ -2078,6 +2141,12 @@ type ServiceRuntime<T extends ServiceInstance> = FetchAPI$1 & {
2078
2141
  mount(prefix: string): MountedAPI;
2079
2142
  readonly sqlite: SqliteClient$1;
2080
2143
  readonly clock: Clock;
2144
+ /**
2145
+ * Change the id base ({@link RuntimeOptions.idBase}) for ids generated from now on, and
2146
+ * return the number it resolved to. Set it before the first request so a boot's ids stay
2147
+ * one run.
2148
+ */
2149
+ setIdBase(base: IdBase): number;
2081
2150
  readonly faults: FaultRegistry;
2082
2151
  /** Baseline response time per namespace. */
2083
2152
  readonly latency: LatencyRegistry;
@@ -2381,8 +2450,14 @@ type FormbricksServer = Listening & {
2381
2450
  };
2382
2451
  /** Serve the Formbricks mock over `node:http`. */
2383
2452
  declare const createServer: (options?: FormbricksServerOptions) => Promise<FormbricksServer>;
2453
+ /**
2454
+ * Read a surveys file (a list, or `{surveys: [...]}`) and lay it after the corpus surveys
2455
+ * (`append`, the default; a survey whose id the corpus or an earlier row has is skipped) or use it
2456
+ * as the whole corpus (`replace`). A survey without a `workspaceId` is served by every workspace.
2457
+ */
2458
+ declare const loadSurveysFile: (path: string, mode?: "append" | "replace", legacyEnvironmentIds?: Record<string, string>) => Survey[];
2384
2459
  /** How `serve` (and `serve --config`) builds the Formbricks mock from flags. */
2385
2460
  declare const serveTarget: ServeTarget;
2386
2461
 
2387
- export { DEFAULT_PORT, createServer, serveTarget };
2462
+ export { DEFAULT_PORT, createServer, loadSurveysFile, serveTarget };
2388
2463
  export type { FormbricksServer, FormbricksServerOptions };
package/dist/server.js CHANGED
@@ -1,12 +1,14 @@
1
1
  import {
2
2
  DEFAULT_PORT,
3
3
  createServer,
4
+ loadSurveysFile,
4
5
  serveTarget
5
- } from "./chunk-MYBPU56P.js";
6
- import "./chunk-THESW6F4.js";
6
+ } from "./chunk-M3VADEIL.js";
7
+ import "./chunk-XJB56QGS.js";
7
8
  export {
8
9
  DEFAULT_PORT,
9
10
  createServer,
11
+ loadSurveysFile,
10
12
  serveTarget
11
13
  };
12
14
  //# sourceMappingURL=server.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crvouga/mockingbird-service-formbricks",
3
- "version": "3.5.0",
3
+ "version": "3.7.0",
4
4
  "description": "Stateful emulator of open-source Formbricks: the client environment state (seeded with a synthetic survey corpus), response creation with upstream's validation and {code, message, details} errors, the v1 management API, the widget script, and signed response webhooks.",
5
5
  "license": "MIT",
6
6
  "type": "module",