callman-core 1.38.0 → 1.40.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/host/connections.d.ts +7 -0
- package/dist/host/connections.d.ts.map +1 -1
- package/dist/host/connections.js +8 -0
- package/dist/host/connections.js.map +1 -1
- package/dist/host/db/connectionMapping.d.ts +3 -0
- package/dist/host/db/connectionMapping.d.ts.map +1 -1
- package/dist/host/db/connectionMapping.js +3 -0
- package/dist/host/db/connectionMapping.js.map +1 -1
- package/dist/host/db/dbErrors.d.ts +9 -0
- package/dist/host/db/dbErrors.d.ts.map +1 -0
- package/dist/host/db/dbErrors.js +126 -0
- package/dist/host/db/dbErrors.js.map +1 -0
- package/dist/host/db/mongoAdapter.d.ts.map +1 -1
- package/dist/host/db/mongoAdapter.js +12 -2
- package/dist/host/db/mongoAdapter.js.map +1 -1
- package/dist/host/db/mysqlAdapter.d.ts.map +1 -1
- package/dist/host/db/mysqlAdapter.js +2 -1
- package/dist/host/db/mysqlAdapter.js.map +1 -1
- package/dist/host/db/oracleAdapter.d.ts.map +1 -1
- package/dist/host/db/oracleAdapter.js +12 -1
- package/dist/host/db/oracleAdapter.js.map +1 -1
- package/dist/host/db/oracleConnectString.d.ts.map +1 -1
- package/dist/host/db/oracleConnectString.js +13 -4
- package/dist/host/db/oracleConnectString.js.map +1 -1
- package/dist/host/db/queryExecutor.d.ts.map +1 -1
- package/dist/host/db/queryExecutor.js +6 -0
- package/dist/host/db/queryExecutor.js.map +1 -1
- package/dist/host/db/types.d.ts +16 -0
- package/dist/host/db/types.d.ts.map +1 -1
- package/dist/host/index.d.ts +1 -0
- package/dist/host/index.d.ts.map +1 -1
- package/dist/host/index.js +2 -0
- package/dist/host/index.js.map +1 -1
- package/dist/http/transportError.d.ts +15 -0
- package/dist/http/transportError.d.ts.map +1 -0
- package/dist/http/transportError.js +70 -0
- package/dist/http/transportError.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/mock-engine/auth.d.ts +29 -0
- package/dist/mock-engine/auth.d.ts.map +1 -0
- package/dist/mock-engine/auth.js +86 -0
- package/dist/mock-engine/auth.js.map +1 -0
- package/dist/mock-engine/conditions.d.ts +31 -0
- package/dist/mock-engine/conditions.d.ts.map +1 -0
- package/dist/mock-engine/conditions.js +210 -0
- package/dist/mock-engine/conditions.js.map +1 -0
- package/dist/mock-engine/constants.d.ts +28 -0
- package/dist/mock-engine/constants.d.ts.map +1 -0
- package/dist/mock-engine/constants.js +113 -0
- package/dist/mock-engine/constants.js.map +1 -0
- package/dist/mock-engine/context.d.ts +17 -0
- package/dist/mock-engine/context.d.ts.map +1 -0
- package/dist/mock-engine/context.js +92 -0
- package/dist/mock-engine/context.js.map +1 -0
- package/dist/mock-engine/data/actions.d.ts +4 -0
- package/dist/mock-engine/data/actions.d.ts.map +1 -0
- package/dist/mock-engine/data/actions.js +149 -0
- package/dist/mock-engine/data/actions.js.map +1 -0
- package/dist/mock-engine/data/query.d.ts +28 -0
- package/dist/mock-engine/data/query.d.ts.map +1 -0
- package/dist/mock-engine/data/query.js +402 -0
- package/dist/mock-engine/data/query.js.map +1 -0
- package/dist/mock-engine/data/record-codec.d.ts +28 -0
- package/dist/mock-engine/data/record-codec.d.ts.map +1 -0
- package/dist/mock-engine/data/record-codec.js +155 -0
- package/dist/mock-engine/data/record-codec.js.map +1 -0
- package/dist/mock-engine/data/resource-ops.d.ts +53 -0
- package/dist/mock-engine/data/resource-ops.d.ts.map +1 -0
- package/dist/mock-engine/data/resource-ops.js +461 -0
- package/dist/mock-engine/data/resource-ops.js.map +1 -0
- package/dist/mock-engine/data/seed.d.ts +21 -0
- package/dist/mock-engine/data/seed.d.ts.map +1 -0
- package/dist/mock-engine/data/seed.js +239 -0
- package/dist/mock-engine/data/seed.js.map +1 -0
- package/dist/mock-engine/data/validate-record.d.ts +30 -0
- package/dist/mock-engine/data/validate-record.d.ts.map +1 -0
- package/dist/mock-engine/data/validate-record.js +165 -0
- package/dist/mock-engine/data/validate-record.js.map +1 -0
- package/dist/mock-engine/definition.d.ts +31 -0
- package/dist/mock-engine/definition.d.ts.map +1 -0
- package/dist/mock-engine/definition.js +440 -0
- package/dist/mock-engine/definition.js.map +1 -0
- package/dist/mock-engine/engine.d.ts +75 -0
- package/dist/mock-engine/engine.d.ts.map +1 -0
- package/dist/mock-engine/engine.js +828 -0
- package/dist/mock-engine/engine.js.map +1 -0
- package/dist/mock-engine/faults.d.ts +38 -0
- package/dist/mock-engine/faults.d.ts.map +1 -0
- package/dist/mock-engine/faults.js +113 -0
- package/dist/mock-engine/faults.js.map +1 -0
- package/dist/mock-engine/helpers.d.ts +68 -0
- package/dist/mock-engine/helpers.d.ts.map +1 -0
- package/dist/mock-engine/helpers.js +388 -0
- package/dist/mock-engine/helpers.js.map +1 -0
- package/dist/mock-engine/import/build.d.ts +16 -0
- package/dist/mock-engine/import/build.d.ts.map +1 -0
- package/dist/mock-engine/import/build.js +435 -0
- package/dist/mock-engine/import/build.js.map +1 -0
- package/dist/mock-engine/import/index.d.ts +15 -0
- package/dist/mock-engine/import/index.d.ts.map +1 -0
- package/dist/mock-engine/import/index.js +92 -0
- package/dist/mock-engine/import/index.js.map +1 -0
- package/dist/mock-engine/import/openapi.d.ts +10 -0
- package/dist/mock-engine/import/openapi.d.ts.map +1 -0
- package/dist/mock-engine/import/openapi.js +199 -0
- package/dist/mock-engine/import/openapi.js.map +1 -0
- package/dist/mock-engine/import/paths.d.ts +16 -0
- package/dist/mock-engine/import/paths.d.ts.map +1 -0
- package/dist/mock-engine/import/paths.js +64 -0
- package/dist/mock-engine/import/paths.js.map +1 -0
- package/dist/mock-engine/import/postman.d.ts +21 -0
- package/dist/mock-engine/import/postman.d.ts.map +1 -0
- package/dist/mock-engine/import/postman.js +241 -0
- package/dist/mock-engine/import/postman.js.map +1 -0
- package/dist/mock-engine/import/report.d.ts +12 -0
- package/dist/mock-engine/import/report.d.ts.map +1 -0
- package/dist/mock-engine/import/report.js +39 -0
- package/dist/mock-engine/import/report.js.map +1 -0
- package/dist/mock-engine/import/types.d.ts +94 -0
- package/dist/mock-engine/import/types.d.ts.map +1 -0
- package/dist/mock-engine/import/types.js +6 -0
- package/dist/mock-engine/import/types.js.map +1 -0
- package/dist/mock-engine/index.d.ts +24 -0
- package/dist/mock-engine/index.d.ts.map +1 -0
- package/dist/mock-engine/index.js +27 -0
- package/dist/mock-engine/index.js.map +1 -0
- package/dist/mock-engine/legacy-builder.d.ts +27 -0
- package/dist/mock-engine/legacy-builder.d.ts.map +1 -0
- package/dist/mock-engine/legacy-builder.js +322 -0
- package/dist/mock-engine/legacy-builder.js.map +1 -0
- package/dist/mock-engine/memory-store.d.ts +73 -0
- package/dist/mock-engine/memory-store.d.ts.map +1 -0
- package/dist/mock-engine/memory-store.js +314 -0
- package/dist/mock-engine/memory-store.js.map +1 -0
- package/dist/mock-engine/node/ajv-body-validator.d.ts +13 -0
- package/dist/mock-engine/node/ajv-body-validator.d.ts.map +1 -0
- package/dist/mock-engine/node/ajv-body-validator.js +158 -0
- package/dist/mock-engine/node/ajv-body-validator.js.map +1 -0
- package/dist/mock-engine/node/file-store.d.ts +30 -0
- package/dist/mock-engine/node/file-store.d.ts.map +1 -0
- package/dist/mock-engine/node/file-store.js +116 -0
- package/dist/mock-engine/node/file-store.js.map +1 -0
- package/dist/mock-engine/node/index.d.ts +5 -0
- package/dist/mock-engine/node/index.d.ts.map +1 -0
- package/dist/mock-engine/node/index.js +8 -0
- package/dist/mock-engine/node/index.js.map +1 -0
- package/dist/mock-engine/node/node-http-adapter.d.ts +38 -0
- package/dist/mock-engine/node/node-http-adapter.d.ts.map +1 -0
- package/dist/mock-engine/node/node-http-adapter.js +215 -0
- package/dist/mock-engine/node/node-http-adapter.js.map +1 -0
- package/dist/mock-engine/node/vm-regex-runner.d.ts +14 -0
- package/dist/mock-engine/node/vm-regex-runner.d.ts.map +1 -0
- package/dist/mock-engine/node/vm-regex-runner.js +90 -0
- package/dist/mock-engine/node/vm-regex-runner.js.map +1 -0
- package/dist/mock-engine/render.d.ts +19 -0
- package/dist/mock-engine/render.d.ts.map +1 -0
- package/dist/mock-engine/render.js +57 -0
- package/dist/mock-engine/render.js.map +1 -0
- package/dist/mock-engine/routing.d.ts +48 -0
- package/dist/mock-engine/routing.d.ts.map +1 -0
- package/dist/mock-engine/routing.js +122 -0
- package/dist/mock-engine/routing.js.map +1 -0
- package/dist/mock-engine/templates.d.ts +58 -0
- package/dist/mock-engine/templates.d.ts.map +1 -0
- package/dist/mock-engine/templates.js +300 -0
- package/dist/mock-engine/templates.js.map +1 -0
- package/dist/mock-engine/testing/index.d.ts +13 -0
- package/dist/mock-engine/testing/index.d.ts.map +1 -0
- package/dist/mock-engine/testing/index.js +69 -0
- package/dist/mock-engine/testing/index.js.map +1 -0
- package/dist/mock-engine/types.d.ts +684 -0
- package/dist/mock-engine/types.d.ts.map +1 -0
- package/dist/mock-engine/types.js +7 -0
- package/dist/mock-engine/types.js.map +1 -0
- package/dist/mock-engine/util.d.ts +25 -0
- package/dist/mock-engine/util.d.ts.map +1 -0
- package/dist/mock-engine/util.js +143 -0
- package/dist/mock-engine/util.js.map +1 -0
- package/dist/openapi/index.d.ts +34 -0
- package/dist/openapi/index.d.ts.map +1 -0
- package/dist/openapi/index.js +246 -0
- package/dist/openapi/index.js.map +1 -0
- package/dist/runner/requestRunner.d.ts.map +1 -1
- package/dist/runner/requestRunner.js +6 -1
- package/dist/runner/requestRunner.js.map +1 -1
- package/dist/script/features/random.d.ts.map +1 -1
- package/dist/script/features/random.js +3 -1
- package/dist/script/features/random.js.map +1 -1
- package/dist/script/types.d.ts +5 -0
- package/dist/script/types.d.ts.map +1 -1
- package/dist/templating/postman-generators.d.ts +5 -0
- package/dist/templating/postman-generators.d.ts.map +1 -1
- package/dist/templating/postman-generators.js +19 -14
- package/dist/templating/postman-generators.js.map +1 -1
- package/dist/templating/random-generators.d.ts.map +1 -1
- package/dist/templating/random-generators.js +3 -1
- package/dist/templating/random-generators.js.map +1 -1
- package/dist/templating/random-source.d.ts +12 -0
- package/dist/templating/random-source.d.ts.map +1 -0
- package/dist/templating/random-source.js +38 -0
- package/dist/templating/random-source.js.map +1 -0
- package/dist-cjs/host/connections.js +8 -0
- package/dist-cjs/host/connections.js.map +1 -1
- package/dist-cjs/host/db/connectionMapping.js +3 -0
- package/dist-cjs/host/db/connectionMapping.js.map +1 -1
- package/dist-cjs/host/db/dbErrors.js +130 -0
- package/dist-cjs/host/db/dbErrors.js.map +1 -0
- package/dist-cjs/host/db/mongoAdapter.js +12 -2
- package/dist-cjs/host/db/mongoAdapter.js.map +1 -1
- package/dist-cjs/host/db/mysqlAdapter.js +2 -1
- package/dist-cjs/host/db/mysqlAdapter.js.map +1 -1
- package/dist-cjs/host/db/oracleAdapter.js +12 -1
- package/dist-cjs/host/db/oracleAdapter.js.map +1 -1
- package/dist-cjs/host/db/oracleConnectString.js +13 -4
- package/dist-cjs/host/db/oracleConnectString.js.map +1 -1
- package/dist-cjs/host/db/queryExecutor.js +6 -0
- package/dist-cjs/host/db/queryExecutor.js.map +1 -1
- package/dist-cjs/host/index.js +5 -2
- package/dist-cjs/host/index.js.map +1 -1
- package/dist-cjs/http/transportError.js +75 -0
- package/dist-cjs/http/transportError.js.map +1 -0
- package/dist-cjs/index.js +4 -1
- package/dist-cjs/index.js.map +1 -1
- package/dist-cjs/mock-engine/auth.js +96 -0
- package/dist-cjs/mock-engine/auth.js.map +1 -0
- package/dist-cjs/mock-engine/conditions.js +216 -0
- package/dist-cjs/mock-engine/conditions.js.map +1 -0
- package/dist-cjs/mock-engine/constants.js +116 -0
- package/dist-cjs/mock-engine/constants.js.map +1 -0
- package/dist-cjs/mock-engine/context.js +99 -0
- package/dist-cjs/mock-engine/context.js.map +1 -0
- package/dist-cjs/mock-engine/data/actions.js +153 -0
- package/dist-cjs/mock-engine/data/actions.js.map +1 -0
- package/dist-cjs/mock-engine/data/query.js +413 -0
- package/dist-cjs/mock-engine/data/query.js.map +1 -0
- package/dist-cjs/mock-engine/data/record-codec.js +165 -0
- package/dist-cjs/mock-engine/data/record-codec.js.map +1 -0
- package/dist-cjs/mock-engine/data/resource-ops.js +476 -0
- package/dist-cjs/mock-engine/data/resource-ops.js.map +1 -0
- package/dist-cjs/mock-engine/data/seed.js +246 -0
- package/dist-cjs/mock-engine/data/seed.js.map +1 -0
- package/dist-cjs/mock-engine/data/validate-record.js +170 -0
- package/dist-cjs/mock-engine/data/validate-record.js.map +1 -0
- package/dist-cjs/mock-engine/definition.js +454 -0
- package/dist-cjs/mock-engine/definition.js.map +1 -0
- package/dist-cjs/mock-engine/engine.js +837 -0
- package/dist-cjs/mock-engine/engine.js.map +1 -0
- package/dist-cjs/mock-engine/faults.js +117 -0
- package/dist-cjs/mock-engine/faults.js.map +1 -0
- package/dist-cjs/mock-engine/helpers.js +399 -0
- package/dist-cjs/mock-engine/helpers.js.map +1 -0
- package/dist-cjs/mock-engine/import/build.js +439 -0
- package/dist-cjs/mock-engine/import/build.js.map +1 -0
- package/dist-cjs/mock-engine/import/index.js +120 -0
- package/dist-cjs/mock-engine/import/index.js.map +1 -0
- package/dist-cjs/mock-engine/import/openapi.js +203 -0
- package/dist-cjs/mock-engine/import/openapi.js.map +1 -0
- package/dist-cjs/mock-engine/import/paths.js +72 -0
- package/dist-cjs/mock-engine/import/paths.js.map +1 -0
- package/dist-cjs/mock-engine/import/postman.js +247 -0
- package/dist-cjs/mock-engine/import/postman.js.map +1 -0
- package/dist-cjs/mock-engine/import/report.js +43 -0
- package/dist-cjs/mock-engine/import/report.js.map +1 -0
- package/dist-cjs/mock-engine/import/types.js +7 -0
- package/dist-cjs/mock-engine/import/types.js.map +1 -0
- package/dist-cjs/mock-engine/index.js +81 -0
- package/dist-cjs/mock-engine/index.js.map +1 -0
- package/dist-cjs/mock-engine/legacy-builder.js +327 -0
- package/dist-cjs/mock-engine/legacy-builder.js.map +1 -0
- package/dist-cjs/mock-engine/memory-store.js +318 -0
- package/dist-cjs/mock-engine/memory-store.js.map +1 -0
- package/dist-cjs/mock-engine/node/ajv-body-validator.js +166 -0
- package/dist-cjs/mock-engine/node/ajv-body-validator.js.map +1 -0
- package/dist-cjs/mock-engine/node/file-store.js +123 -0
- package/dist-cjs/mock-engine/node/file-store.js.map +1 -0
- package/dist-cjs/mock-engine/node/index.js +16 -0
- package/dist-cjs/mock-engine/node/index.js.map +1 -0
- package/dist-cjs/mock-engine/node/node-http-adapter.js +219 -0
- package/dist-cjs/mock-engine/node/node-http-adapter.js.map +1 -0
- package/dist-cjs/mock-engine/node/vm-regex-runner.js +97 -0
- package/dist-cjs/mock-engine/node/vm-regex-runner.js.map +1 -0
- package/dist-cjs/mock-engine/render.js +64 -0
- package/dist-cjs/mock-engine/render.js.map +1 -0
- package/dist-cjs/mock-engine/routing.js +130 -0
- package/dist-cjs/mock-engine/routing.js.map +1 -0
- package/dist-cjs/mock-engine/templates.js +308 -0
- package/dist-cjs/mock-engine/templates.js.map +1 -0
- package/dist-cjs/mock-engine/testing/index.js +72 -0
- package/dist-cjs/mock-engine/testing/index.js.map +1 -0
- package/dist-cjs/mock-engine/types.js +8 -0
- package/dist-cjs/mock-engine/types.js.map +1 -0
- package/dist-cjs/mock-engine/util.js +166 -0
- package/dist-cjs/mock-engine/util.js.map +1 -0
- package/dist-cjs/openapi/index.js +257 -0
- package/dist-cjs/openapi/index.js.map +1 -0
- package/dist-cjs/runner/requestRunner.js +6 -1
- package/dist-cjs/runner/requestRunner.js.map +1 -1
- package/dist-cjs/script/features/random.js +3 -1
- package/dist-cjs/script/features/random.js.map +1 -1
- package/dist-cjs/templating/postman-generators.js +21 -15
- package/dist-cjs/templating/postman-generators.js.map +1 -1
- package/dist-cjs/templating/random-generators.js +3 -1
- package/dist-cjs/templating/random-generators.js.map +1 -1
- package/dist-cjs/templating/random-source.js +44 -0
- package/dist-cjs/templating/random-source.js.map +1 -0
- package/package.json +29 -1
|
@@ -0,0 +1,684 @@
|
|
|
1
|
+
export type MockHttpMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "ANY";
|
|
2
|
+
export type ConditionOperator = "exists" | "not-exists" | "equals" | "not-equals" | "contains" | "starts-with" | "matches";
|
|
3
|
+
export interface VariantConditionRule {
|
|
4
|
+
/** `headers.x`, `params.x`, `query.x`, `body.a.b`, `auth.sub`, `auth.claims.role`, `session.id`. */
|
|
5
|
+
field: string;
|
|
6
|
+
operator: ConditionOperator;
|
|
7
|
+
value?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface VariantCondition {
|
|
10
|
+
type: "all" | "any";
|
|
11
|
+
rules: VariantConditionRule[];
|
|
12
|
+
}
|
|
13
|
+
export type MockDelayConfig = {
|
|
14
|
+
mode: "none";
|
|
15
|
+
} | {
|
|
16
|
+
mode: "fixed";
|
|
17
|
+
ms: number;
|
|
18
|
+
} | {
|
|
19
|
+
mode: "random";
|
|
20
|
+
minMs: number;
|
|
21
|
+
maxMs: number;
|
|
22
|
+
};
|
|
23
|
+
export interface MockRequestValidationConfig {
|
|
24
|
+
mode: "any" | "schema";
|
|
25
|
+
/** JSON Schema draft-07. */
|
|
26
|
+
schema?: unknown;
|
|
27
|
+
}
|
|
28
|
+
export type BuilderPreset = "list" | "detail" | "create" | "update" | "delete" | "echo" | "custom";
|
|
29
|
+
export type LegacyMockSource = {
|
|
30
|
+
kind: "static";
|
|
31
|
+
data: unknown[];
|
|
32
|
+
} | {
|
|
33
|
+
kind: "state";
|
|
34
|
+
stateKey: string;
|
|
35
|
+
};
|
|
36
|
+
export interface ListBuilderConfig {
|
|
37
|
+
preset: "list";
|
|
38
|
+
source: LegacyMockSource;
|
|
39
|
+
filtering: {
|
|
40
|
+
enabled: boolean;
|
|
41
|
+
rules: {
|
|
42
|
+
queryParam: string;
|
|
43
|
+
field: string;
|
|
44
|
+
operator: "equals" | "contains" | "startsWith" | "in";
|
|
45
|
+
}[];
|
|
46
|
+
};
|
|
47
|
+
sorting: {
|
|
48
|
+
enabled: boolean;
|
|
49
|
+
sortByParam: string;
|
|
50
|
+
orderParam: string;
|
|
51
|
+
allowedFields: string[];
|
|
52
|
+
};
|
|
53
|
+
pagination: {
|
|
54
|
+
enabled: boolean;
|
|
55
|
+
strategy: "page" | "offset" | "cursor";
|
|
56
|
+
defaultPageSize: number;
|
|
57
|
+
maxPageSize: number;
|
|
58
|
+
envelope: "standard" | "data-meta" | "raw";
|
|
59
|
+
};
|
|
60
|
+
statusCode: number;
|
|
61
|
+
headers: Record<string, string>;
|
|
62
|
+
}
|
|
63
|
+
export interface DetailBuilderConfig {
|
|
64
|
+
preset: "detail";
|
|
65
|
+
source: LegacyMockSource;
|
|
66
|
+
paramName: string;
|
|
67
|
+
lookupField: string;
|
|
68
|
+
notFoundBehavior: {
|
|
69
|
+
statusCode: number;
|
|
70
|
+
body?: unknown;
|
|
71
|
+
};
|
|
72
|
+
statusCode: number;
|
|
73
|
+
headers: Record<string, string>;
|
|
74
|
+
}
|
|
75
|
+
export interface CreateBuilderConfig {
|
|
76
|
+
preset: "create";
|
|
77
|
+
stateKey: string;
|
|
78
|
+
autoGenerate: {
|
|
79
|
+
id?: "uuid" | "incremental";
|
|
80
|
+
createdAt?: boolean;
|
|
81
|
+
updatedAt?: boolean;
|
|
82
|
+
};
|
|
83
|
+
requiredFields: string[];
|
|
84
|
+
responseBehavior: "return-created" | "return-id" | "status-only";
|
|
85
|
+
statusCode: number;
|
|
86
|
+
headers: Record<string, string>;
|
|
87
|
+
}
|
|
88
|
+
export interface UpdateBuilderConfig {
|
|
89
|
+
preset: "update";
|
|
90
|
+
stateKey: string;
|
|
91
|
+
paramName: string;
|
|
92
|
+
lookupField: string;
|
|
93
|
+
mergeStrategy: "partial" | "full";
|
|
94
|
+
autoUpdateUpdatedAt: boolean;
|
|
95
|
+
notFoundBehavior: {
|
|
96
|
+
statusCode: number;
|
|
97
|
+
body?: unknown;
|
|
98
|
+
};
|
|
99
|
+
statusCode: number;
|
|
100
|
+
headers: Record<string, string>;
|
|
101
|
+
}
|
|
102
|
+
export interface DeleteBuilderConfig {
|
|
103
|
+
preset: "delete";
|
|
104
|
+
stateKey: string;
|
|
105
|
+
paramName: string;
|
|
106
|
+
lookupField: string;
|
|
107
|
+
notFoundBehavior: {
|
|
108
|
+
statusCode: number;
|
|
109
|
+
body?: unknown;
|
|
110
|
+
};
|
|
111
|
+
responseBehavior: "204" | "return-deleted" | "success-message";
|
|
112
|
+
statusCode: number;
|
|
113
|
+
headers: Record<string, string>;
|
|
114
|
+
}
|
|
115
|
+
export interface EchoBuilderConfig {
|
|
116
|
+
preset: "echo";
|
|
117
|
+
statusCode: number;
|
|
118
|
+
headers: Record<string, string>;
|
|
119
|
+
}
|
|
120
|
+
export interface CustomBuilderConfig {
|
|
121
|
+
preset: "custom";
|
|
122
|
+
statusCode: number;
|
|
123
|
+
headers: Record<string, string>;
|
|
124
|
+
body?: unknown;
|
|
125
|
+
}
|
|
126
|
+
export type BuilderConfig = ListBuilderConfig | DetailBuilderConfig | CreateBuilderConfig | UpdateBuilderConfig | DeleteBuilderConfig | EchoBuilderConfig | CustomBuilderConfig;
|
|
127
|
+
export type MockResponseConfig = {
|
|
128
|
+
type: "static";
|
|
129
|
+
statusCode: number;
|
|
130
|
+
headers: Record<string, string>;
|
|
131
|
+
body?: unknown;
|
|
132
|
+
} | {
|
|
133
|
+
type: "template";
|
|
134
|
+
statusCode: number;
|
|
135
|
+
headers: Record<string, string>;
|
|
136
|
+
body?: unknown;
|
|
137
|
+
} | {
|
|
138
|
+
type: "builder";
|
|
139
|
+
preset: BuilderPreset;
|
|
140
|
+
config: BuilderConfig;
|
|
141
|
+
};
|
|
142
|
+
export interface MockResponseVariant {
|
|
143
|
+
variantId: string;
|
|
144
|
+
/** Ascending: the lowest number is checked first. */
|
|
145
|
+
priority: number;
|
|
146
|
+
condition: VariantCondition;
|
|
147
|
+
response: MockResponseConfig;
|
|
148
|
+
}
|
|
149
|
+
export type MockOutcome = "success" | "created" | "notFound" | "conflict" | "validationError" | "unauthorized" | "forbidden" | "limitExceeded" | "payloadTooLarge";
|
|
150
|
+
/** A per-outcome response. `body` and header values are always template-resolved. */
|
|
151
|
+
export interface MockOutcomeResponse {
|
|
152
|
+
statusCode?: number;
|
|
153
|
+
headers?: Record<string, string>;
|
|
154
|
+
body?: unknown;
|
|
155
|
+
}
|
|
156
|
+
export type MockOutcomeResponses = Partial<Record<MockOutcome, MockOutcomeResponse>>;
|
|
157
|
+
/** `none` = public, `user` = any signed-in user, `{roles}` = user with one of these roles. */
|
|
158
|
+
export type MockAuthRequirement = "none" | "user" | {
|
|
159
|
+
roles: string[];
|
|
160
|
+
};
|
|
161
|
+
export interface MockUserAuthConfig {
|
|
162
|
+
enabled: boolean;
|
|
163
|
+
/** Resource name holding the users. */
|
|
164
|
+
usersResource: string;
|
|
165
|
+
identityField: string;
|
|
166
|
+
passwordField: string;
|
|
167
|
+
/** HMAC secret (hex). Generated by the host when absent; never returned unmasked by default. */
|
|
168
|
+
secret?: string;
|
|
169
|
+
tokenTtlSeconds: number;
|
|
170
|
+
issuer?: string;
|
|
171
|
+
audience?: string;
|
|
172
|
+
/** User field copied into the `role` claim and checked by `{roles}` requirements. */
|
|
173
|
+
roleClaim?: string;
|
|
174
|
+
/** Extra claims: claim name ← user field. */
|
|
175
|
+
claims?: Record<string, string>;
|
|
176
|
+
/** Default requirement: nothing, every resource endpoint, or every route. */
|
|
177
|
+
protect: "none" | "resources" | "all";
|
|
178
|
+
endpoints: {
|
|
179
|
+
login: {
|
|
180
|
+
enabled: boolean;
|
|
181
|
+
path: string;
|
|
182
|
+
};
|
|
183
|
+
register: {
|
|
184
|
+
enabled: boolean;
|
|
185
|
+
path: string;
|
|
186
|
+
};
|
|
187
|
+
me: {
|
|
188
|
+
enabled: boolean;
|
|
189
|
+
path: string;
|
|
190
|
+
};
|
|
191
|
+
};
|
|
192
|
+
responses?: Partial<Record<"loginSuccess" | "loginFailure" | "unauthorized" | "forbidden", MockOutcomeResponse>>;
|
|
193
|
+
}
|
|
194
|
+
export interface MockFaultRule {
|
|
195
|
+
id: string;
|
|
196
|
+
enabled: boolean;
|
|
197
|
+
kind: "error" | "delay" | "timeout" | "drop";
|
|
198
|
+
/** 0..1, default 1. */
|
|
199
|
+
probability?: number;
|
|
200
|
+
when?: {
|
|
201
|
+
callCount?: {
|
|
202
|
+
lte?: number;
|
|
203
|
+
gte?: number;
|
|
204
|
+
every?: number;
|
|
205
|
+
in?: number[];
|
|
206
|
+
};
|
|
207
|
+
condition?: VariantCondition;
|
|
208
|
+
};
|
|
209
|
+
/** `before` short-circuits the handler; `after` runs it, then loses or delays the answer. */
|
|
210
|
+
phase?: "before" | "after";
|
|
211
|
+
error?: MockOutcomeResponse;
|
|
212
|
+
delay?: {
|
|
213
|
+
minMs: number;
|
|
214
|
+
maxMs: number;
|
|
215
|
+
};
|
|
216
|
+
timeout?: {
|
|
217
|
+
afterMs?: number;
|
|
218
|
+
};
|
|
219
|
+
drop?: {
|
|
220
|
+
mode: "reset" | "partial";
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
export interface MockFaultSequenceStep {
|
|
224
|
+
times: number;
|
|
225
|
+
outcome: "pass" | Omit<MockFaultRule, "id" | "enabled" | "when" | "probability">;
|
|
226
|
+
}
|
|
227
|
+
export interface MockFaultConfig {
|
|
228
|
+
/** Route/endpoint faults also apply the mock-level ones unless false. */
|
|
229
|
+
inherit?: boolean;
|
|
230
|
+
rules: MockFaultRule[];
|
|
231
|
+
sequence?: {
|
|
232
|
+
steps: MockFaultSequenceStep[];
|
|
233
|
+
loop: boolean;
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
/** The flat form the UI and the MCP edit; converted with `faultsFromSimple` / `toSimpleFaults`. */
|
|
237
|
+
export interface MockSimpleFaults {
|
|
238
|
+
/** % of requests answered with `errorStatus`. */
|
|
239
|
+
errorRate?: number;
|
|
240
|
+
errorStatus?: number;
|
|
241
|
+
errorBody?: unknown;
|
|
242
|
+
delay?: MockDelayConfig;
|
|
243
|
+
/** % of requests held unanswered. */
|
|
244
|
+
timeoutRate?: number;
|
|
245
|
+
/** % of requests whose connection is closed without a response. */
|
|
246
|
+
dropRate?: number;
|
|
247
|
+
/** The first N requests (per session) fail with `errorStatus`, then recover. */
|
|
248
|
+
failFirst?: number;
|
|
249
|
+
}
|
|
250
|
+
export interface MockSessionConfig {
|
|
251
|
+
enabled: boolean;
|
|
252
|
+
idleTtlMinutes: number;
|
|
253
|
+
/** Lets a caller reset its own session through `POST /__callman/session/reset`. */
|
|
254
|
+
allowPublicReset: boolean;
|
|
255
|
+
}
|
|
256
|
+
export type MockFieldType = "string" | "number" | "integer" | "boolean" | "object" | "array" | "date" | "datetime" | "email" | "uuid" | "password";
|
|
257
|
+
export type MockIdStrategy = "uuid" | "incremental" | "objectId" | "nanoid" | "client";
|
|
258
|
+
export interface MockFieldRef {
|
|
259
|
+
/** Target resource name. */
|
|
260
|
+
resource: string;
|
|
261
|
+
onDelete: "restrict" | "cascade" | "nullify" | "none";
|
|
262
|
+
/** Check the target exists on create/update (default true). */
|
|
263
|
+
check?: boolean;
|
|
264
|
+
/** Name of the expanded object for `_expand` (default: field name minus `Id`/`_id`). */
|
|
265
|
+
as?: string;
|
|
266
|
+
/** Generate `GET/POST /<parent>/:<field>/<child>` nested routes (default true). */
|
|
267
|
+
nested?: boolean;
|
|
268
|
+
}
|
|
269
|
+
export interface MockField {
|
|
270
|
+
/** `^[A-Za-z_][A-Za-z0-9_]{0,63}$` */
|
|
271
|
+
name: string;
|
|
272
|
+
type: MockFieldType;
|
|
273
|
+
required?: boolean;
|
|
274
|
+
nullable?: boolean;
|
|
275
|
+
unique?: boolean;
|
|
276
|
+
uniqueCaseInsensitive?: boolean;
|
|
277
|
+
/** A literal, or a template such as `"{{now}}"` / `"{{auth.sub}}"`. */
|
|
278
|
+
default?: unknown;
|
|
279
|
+
enum?: (string | number)[];
|
|
280
|
+
min?: number;
|
|
281
|
+
max?: number;
|
|
282
|
+
minLength?: number;
|
|
283
|
+
maxLength?: number;
|
|
284
|
+
pattern?: string;
|
|
285
|
+
items?: {
|
|
286
|
+
type: Exclude<MockFieldType, "password" | "array">;
|
|
287
|
+
};
|
|
288
|
+
/** Client writes are ignored. */
|
|
289
|
+
readOnly?: boolean;
|
|
290
|
+
/** Never returned. `password` fields are always write-only and stored hashed. */
|
|
291
|
+
writeOnly?: boolean;
|
|
292
|
+
ref?: MockFieldRef;
|
|
293
|
+
/** `$randomEmail`, `faker.email`, or a template like `"{{$randomFirstName}} {{$randomLastName}}"`. */
|
|
294
|
+
fakerHint?: string;
|
|
295
|
+
}
|
|
296
|
+
export type MockResourceEndpointName = "list" | "get" | "create" | "replace" | "patch" | "delete";
|
|
297
|
+
export interface MockResourceEndpointConfig {
|
|
298
|
+
enabled: boolean;
|
|
299
|
+
auth?: MockAuthRequirement;
|
|
300
|
+
faults?: MockFaultConfig;
|
|
301
|
+
delay?: MockDelayConfig;
|
|
302
|
+
responses?: MockOutcomeResponses;
|
|
303
|
+
requestValidation?: MockRequestValidationConfig;
|
|
304
|
+
}
|
|
305
|
+
export interface MockResourceListConfig {
|
|
306
|
+
envelope: "array" | "data-meta" | "items" | "custom";
|
|
307
|
+
/** Template with `{{records}} {{total}} {{page}} {{limit}} {{totalPages}}` (envelope `custom`). */
|
|
308
|
+
customBody?: unknown;
|
|
309
|
+
/** Page size when the client sends none; null = everything up to `maxLimit`. */
|
|
310
|
+
defaultLimit: number | null;
|
|
311
|
+
maxLimit: number;
|
|
312
|
+
totalCountHeader: boolean;
|
|
313
|
+
linkHeader: boolean;
|
|
314
|
+
/** `declared` ignores query params that are not fields; `any` filters on every param. */
|
|
315
|
+
filterMode: "declared" | "any";
|
|
316
|
+
searchable: boolean;
|
|
317
|
+
/** e.g. `-createdAt,name` */
|
|
318
|
+
defaultSort?: string;
|
|
319
|
+
}
|
|
320
|
+
export interface MockResourceSeed {
|
|
321
|
+
records?: Record<string, unknown>[];
|
|
322
|
+
/** Generate N records from the field definitions (after `records`). */
|
|
323
|
+
generate?: number;
|
|
324
|
+
salt?: string;
|
|
325
|
+
}
|
|
326
|
+
export interface MockResource {
|
|
327
|
+
/** Stable id: records are keyed by it, so renaming never touches data. */
|
|
328
|
+
resourceId: string;
|
|
329
|
+
/** `^[a-z][a-zA-Z0-9_-]{0,39}$`, unique per mock. */
|
|
330
|
+
name: string;
|
|
331
|
+
basePath: string;
|
|
332
|
+
idField: string;
|
|
333
|
+
idStrategy: MockIdStrategy;
|
|
334
|
+
/** Field the `/:id` endpoints look up by (default `idField`, e.g. `slug`). */
|
|
335
|
+
lookupField?: string;
|
|
336
|
+
/** Accept a client-sent id on create (default true). */
|
|
337
|
+
allowClientId?: boolean;
|
|
338
|
+
/** Empty = schemaless (json-server style). */
|
|
339
|
+
fields: MockField[];
|
|
340
|
+
additionalFields: "allow" | "strip" | "reject";
|
|
341
|
+
timestamps: {
|
|
342
|
+
createdAt: string | null;
|
|
343
|
+
updatedAt: string | null;
|
|
344
|
+
};
|
|
345
|
+
/** Records belong to the signed-in user through this field (needs userAuth). */
|
|
346
|
+
ownerField?: string;
|
|
347
|
+
auth?: MockAuthRequirement;
|
|
348
|
+
endpoints: Record<MockResourceEndpointName, MockResourceEndpointConfig>;
|
|
349
|
+
list: MockResourceListConfig;
|
|
350
|
+
seed?: MockResourceSeed;
|
|
351
|
+
}
|
|
352
|
+
export type MockDataOperation = "insert" | "find" | "findOne" | "update" | "delete" | "count" | "upsert";
|
|
353
|
+
export interface MockActionMatchRule {
|
|
354
|
+
field: string;
|
|
355
|
+
op?: "eq" | "ne" | "gt" | "gte" | "lt" | "lte" | "in" | "contains" | "like";
|
|
356
|
+
/** Template or literal: `"{{request.params.id}}"`, `"{{auth.sub}}"`, `"active"`. */
|
|
357
|
+
value: string;
|
|
358
|
+
/** Skip this rule when the value resolves to empty (optional filters). */
|
|
359
|
+
skipIfEmpty?: boolean;
|
|
360
|
+
}
|
|
361
|
+
export interface MockActionWrite {
|
|
362
|
+
/** Template for the written object; default `"{{request.body}}"`. */
|
|
363
|
+
source?: string;
|
|
364
|
+
pick?: string[];
|
|
365
|
+
omit?: string[];
|
|
366
|
+
/** Applied last; values are type-preserving templates. */
|
|
367
|
+
set?: Record<string, unknown>;
|
|
368
|
+
}
|
|
369
|
+
export interface MockDataAction {
|
|
370
|
+
operation: MockDataOperation;
|
|
371
|
+
/** Resource name. */
|
|
372
|
+
resource: string;
|
|
373
|
+
match?: MockActionMatchRule[];
|
|
374
|
+
write?: MockActionWrite;
|
|
375
|
+
/** update: merge (default) or replace. */
|
|
376
|
+
mode?: "merge" | "replace";
|
|
377
|
+
/** update/delete every match instead of the first. */
|
|
378
|
+
many?: boolean;
|
|
379
|
+
find?: {
|
|
380
|
+
useRequestQuery?: boolean;
|
|
381
|
+
sort?: string;
|
|
382
|
+
limit?: number;
|
|
383
|
+
};
|
|
384
|
+
responses?: MockOutcomeResponses;
|
|
385
|
+
}
|
|
386
|
+
export interface MockRoute {
|
|
387
|
+
routeId: string;
|
|
388
|
+
method: MockHttpMethod;
|
|
389
|
+
path: string;
|
|
390
|
+
name?: string;
|
|
391
|
+
/** With `action`: the default success response. */
|
|
392
|
+
response: MockResponseConfig;
|
|
393
|
+
variants: MockResponseVariant[];
|
|
394
|
+
behavior: {
|
|
395
|
+
delay: MockDelayConfig;
|
|
396
|
+
};
|
|
397
|
+
requestValidation?: MockRequestValidationConfig;
|
|
398
|
+
/** Disabled routes never match (default enabled). */
|
|
399
|
+
enabled?: boolean;
|
|
400
|
+
/** Extra match condition (query/headers): when false the next route is tried. */
|
|
401
|
+
match?: VariantCondition;
|
|
402
|
+
action?: MockDataAction;
|
|
403
|
+
auth?: MockAuthRequirement;
|
|
404
|
+
faults?: MockFaultConfig;
|
|
405
|
+
}
|
|
406
|
+
export interface MockDefinition {
|
|
407
|
+
schemaVersion: 2;
|
|
408
|
+
name?: string;
|
|
409
|
+
description?: string;
|
|
410
|
+
routes: MockRoute[];
|
|
411
|
+
resources: MockResource[];
|
|
412
|
+
userAuth?: MockUserAuthConfig | null;
|
|
413
|
+
faults?: MockFaultConfig | null;
|
|
414
|
+
sessions?: MockSessionConfig;
|
|
415
|
+
/** The pre-v2 state bucket read by legacy builder routes and `{{state.*}}`. */
|
|
416
|
+
legacy?: {
|
|
417
|
+
state?: Record<string, unknown>;
|
|
418
|
+
initialState?: Record<string, unknown>;
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
type DeepPartial<T> = T extends (infer U)[] ? DeepPartial<U>[] : T extends object ? {
|
|
422
|
+
[K in keyof T]?: DeepPartial<T[K]>;
|
|
423
|
+
} : T;
|
|
424
|
+
/** What importers and editors produce: ids and defaults are filled in by `normalizeMockDefinition`. */
|
|
425
|
+
export type MockDefinitionDraft = DeepPartial<MockDefinition>;
|
|
426
|
+
export interface MockRequest {
|
|
427
|
+
method: string;
|
|
428
|
+
/** Path after the mount point, with a leading `/`. */
|
|
429
|
+
path: string;
|
|
430
|
+
/** `/mock/<id>` on the server, `""` on the desktop — used for Location/Link headers. */
|
|
431
|
+
mountPath: string;
|
|
432
|
+
/** Parsed query (Express `qs` shape) for templates and conditions. */
|
|
433
|
+
query: Record<string, unknown>;
|
|
434
|
+
/** Raw query pairs — the input of the list query language. */
|
|
435
|
+
rawQuery: Array<[string, string]>;
|
|
436
|
+
/** Lower-cased header names. */
|
|
437
|
+
headers: Record<string, string>;
|
|
438
|
+
body?: unknown;
|
|
439
|
+
receivedAt: number;
|
|
440
|
+
}
|
|
441
|
+
export interface MockRenderedResponse {
|
|
442
|
+
statusCode: number;
|
|
443
|
+
headers: Record<string, string>;
|
|
444
|
+
body: string;
|
|
445
|
+
/** The structured body before serialisation (logs). */
|
|
446
|
+
rawBody: unknown;
|
|
447
|
+
bodyTruncated: boolean;
|
|
448
|
+
}
|
|
449
|
+
export type MockTransport = {
|
|
450
|
+
kind: "respond";
|
|
451
|
+
} | {
|
|
452
|
+
kind: "hang";
|
|
453
|
+
ms: number;
|
|
454
|
+
} | {
|
|
455
|
+
kind: "drop";
|
|
456
|
+
mode: "reset" | "partial";
|
|
457
|
+
};
|
|
458
|
+
export interface MockEngineTrace {
|
|
459
|
+
routeId?: string;
|
|
460
|
+
virtual?: {
|
|
461
|
+
kind: "resource" | "auth" | "control";
|
|
462
|
+
resource?: string;
|
|
463
|
+
endpoint?: string;
|
|
464
|
+
};
|
|
465
|
+
variantId?: string;
|
|
466
|
+
session?: string;
|
|
467
|
+
authSubject?: string;
|
|
468
|
+
action?: {
|
|
469
|
+
operation: string;
|
|
470
|
+
resource: string;
|
|
471
|
+
outcome: string;
|
|
472
|
+
affected: number;
|
|
473
|
+
};
|
|
474
|
+
faults: {
|
|
475
|
+
ruleId: string;
|
|
476
|
+
kind: string;
|
|
477
|
+
}[];
|
|
478
|
+
failureReason?: string;
|
|
479
|
+
storeOps: number;
|
|
480
|
+
/** Set when the legacy state bucket changed (hosts invalidate their cache). */
|
|
481
|
+
legacyStateChanged?: boolean;
|
|
482
|
+
}
|
|
483
|
+
export interface MockExecutionResult {
|
|
484
|
+
response: MockRenderedResponse;
|
|
485
|
+
/** Already clamped to `limits.maxDelayMs`. */
|
|
486
|
+
delayMs: number;
|
|
487
|
+
transport: MockTransport;
|
|
488
|
+
trace: MockEngineTrace;
|
|
489
|
+
}
|
|
490
|
+
export interface MockInvalidField {
|
|
491
|
+
field: string;
|
|
492
|
+
message: string;
|
|
493
|
+
}
|
|
494
|
+
export interface MockRandomSource {
|
|
495
|
+
/** A number in [0, 1). */
|
|
496
|
+
next(): number;
|
|
497
|
+
}
|
|
498
|
+
export interface MockClock {
|
|
499
|
+
now(): number;
|
|
500
|
+
}
|
|
501
|
+
export interface MockCallCounters {
|
|
502
|
+
/** Increments and returns the call count of `key` inside the namespace. */
|
|
503
|
+
incr(scope: MockStoreScope, key: string): Promise<number>;
|
|
504
|
+
reset(scope: MockStoreScope): Promise<void>;
|
|
505
|
+
}
|
|
506
|
+
export interface MockRegexRunner {
|
|
507
|
+
test(pattern: string, subject: string): boolean;
|
|
508
|
+
}
|
|
509
|
+
export type MockBodyValidator = (schema: unknown, body: unknown) => MockInvalidField[] | null;
|
|
510
|
+
export interface MockCryptoPort {
|
|
511
|
+
hmacSha256(key: Uint8Array, data: Uint8Array): Promise<Uint8Array>;
|
|
512
|
+
sha256(data: Uint8Array): Promise<Uint8Array>;
|
|
513
|
+
randomBytes(length: number): Uint8Array;
|
|
514
|
+
}
|
|
515
|
+
export interface MockLegacyStatePort {
|
|
516
|
+
snapshot(): Record<string, unknown>;
|
|
517
|
+
apply(mutations: LegacyStateMutation[]): Promise<void>;
|
|
518
|
+
}
|
|
519
|
+
export type LegacyStateMutation = {
|
|
520
|
+
kind: "append";
|
|
521
|
+
stateKey: string;
|
|
522
|
+
value: unknown;
|
|
523
|
+
} | {
|
|
524
|
+
kind: "updateAtIndex";
|
|
525
|
+
stateKey: string;
|
|
526
|
+
index: number;
|
|
527
|
+
value: unknown;
|
|
528
|
+
} | {
|
|
529
|
+
kind: "removeAtIndex";
|
|
530
|
+
stateKey: string;
|
|
531
|
+
index: number;
|
|
532
|
+
};
|
|
533
|
+
export interface MockEngineLogger {
|
|
534
|
+
warn(message: string, meta?: Record<string, unknown>): void;
|
|
535
|
+
error(message: string, meta?: Record<string, unknown>): void;
|
|
536
|
+
}
|
|
537
|
+
export interface MockEngineLimits {
|
|
538
|
+
maxRecordsPerResource: number;
|
|
539
|
+
maxRecordsPerNamespace: number;
|
|
540
|
+
maxRecordBytes: number;
|
|
541
|
+
maxSessions: number;
|
|
542
|
+
sessionIdleTtlMs: number;
|
|
543
|
+
maxDataOpsPerRequest: number;
|
|
544
|
+
maxResponseBodyBytes: number;
|
|
545
|
+
maxDelayMs: number;
|
|
546
|
+
maxPageSize: number;
|
|
547
|
+
maxFilterClauses: number;
|
|
548
|
+
maxInValues: number;
|
|
549
|
+
maxExpand: number;
|
|
550
|
+
maxEmbedPerParent: number;
|
|
551
|
+
maxCascadeDepth: number;
|
|
552
|
+
maxCascadeRecords: number;
|
|
553
|
+
maxSeedGenerate: number;
|
|
554
|
+
}
|
|
555
|
+
export interface MockEngineContext {
|
|
556
|
+
mockId: string;
|
|
557
|
+
mockName?: string;
|
|
558
|
+
store?: MockDataStore;
|
|
559
|
+
clock: MockClock;
|
|
560
|
+
random: MockRandomSource;
|
|
561
|
+
counters: MockCallCounters;
|
|
562
|
+
regex: MockRegexRunner;
|
|
563
|
+
/** Node hosts pass the Ajv validator; without one `requestValidation` is skipped. */
|
|
564
|
+
bodyValidator?: MockBodyValidator;
|
|
565
|
+
crypto: MockCryptoPort;
|
|
566
|
+
legacyState?: MockLegacyStatePort;
|
|
567
|
+
logger?: MockEngineLogger;
|
|
568
|
+
limits: MockEngineLimits;
|
|
569
|
+
}
|
|
570
|
+
export interface MockStoreScope {
|
|
571
|
+
mockId: string;
|
|
572
|
+
/** `_` = shared data, `s:<id>` = a test session. */
|
|
573
|
+
ns: string;
|
|
574
|
+
}
|
|
575
|
+
export interface MockRecordDoc {
|
|
576
|
+
resource: string;
|
|
577
|
+
/** Canonical id: `n:<int>` or `s:<string>`. */
|
|
578
|
+
key: string;
|
|
579
|
+
data: Record<string, unknown>;
|
|
580
|
+
/** PK + unique-field tokens (one compound unique index). */
|
|
581
|
+
uniq: string[];
|
|
582
|
+
/** `<field>\u001f<target key>` tokens for relations. */
|
|
583
|
+
refs: string[];
|
|
584
|
+
/** Lower-cased searchable text for `q`. */
|
|
585
|
+
text: string;
|
|
586
|
+
rev: number;
|
|
587
|
+
/** Insertion order (stores assign it; the default sort). */
|
|
588
|
+
ordinal?: number;
|
|
589
|
+
}
|
|
590
|
+
export type MockFilterOp = "eq" | "ne" | "gt" | "gte" | "lt" | "lte" | "in" | "nin" | "exists" | "contains" | "like";
|
|
591
|
+
export type MockFilterNode = {
|
|
592
|
+
and: MockFilterNode[];
|
|
593
|
+
} | {
|
|
594
|
+
or: MockFilterNode[];
|
|
595
|
+
} | {
|
|
596
|
+
field: string;
|
|
597
|
+
op: MockFilterOp;
|
|
598
|
+
value: unknown;
|
|
599
|
+
} | {
|
|
600
|
+
text: string;
|
|
601
|
+
} | {
|
|
602
|
+
keys: string[];
|
|
603
|
+
} | {
|
|
604
|
+
ref: string;
|
|
605
|
+
keys: string[];
|
|
606
|
+
};
|
|
607
|
+
export interface MockSortSpec {
|
|
608
|
+
field: string;
|
|
609
|
+
dir: 1 | -1;
|
|
610
|
+
}
|
|
611
|
+
export interface MockFindOptions {
|
|
612
|
+
filter?: MockFilterNode;
|
|
613
|
+
sort?: MockSortSpec[];
|
|
614
|
+
skip?: number;
|
|
615
|
+
limit?: number;
|
|
616
|
+
/** Skip the total count (expand/embed lookups). */
|
|
617
|
+
noTotal?: boolean;
|
|
618
|
+
}
|
|
619
|
+
export type MockWriteOutcome = {
|
|
620
|
+
ok: true;
|
|
621
|
+
doc: MockRecordDoc;
|
|
622
|
+
} | {
|
|
623
|
+
ok: false;
|
|
624
|
+
reason: "conflict";
|
|
625
|
+
field: string;
|
|
626
|
+
} | {
|
|
627
|
+
ok: false;
|
|
628
|
+
reason: "stale";
|
|
629
|
+
} | {
|
|
630
|
+
ok: false;
|
|
631
|
+
reason: "notFound";
|
|
632
|
+
};
|
|
633
|
+
export interface MockSeedPlan {
|
|
634
|
+
docs: MockRecordDoc[];
|
|
635
|
+
/** Highest numeric id per resource, so incremental ids continue after the seed. */
|
|
636
|
+
sequences: Record<string, number>;
|
|
637
|
+
}
|
|
638
|
+
export interface MockNamespaceInfo {
|
|
639
|
+
ns: string;
|
|
640
|
+
kind: "default" | "session";
|
|
641
|
+
sessionId?: string;
|
|
642
|
+
createdAt?: string;
|
|
643
|
+
lastSeenAt?: string;
|
|
644
|
+
idleExpiresAt?: string | null;
|
|
645
|
+
recordCount?: number;
|
|
646
|
+
}
|
|
647
|
+
export interface MockEnsureNamespaceOptions {
|
|
648
|
+
isSession: boolean;
|
|
649
|
+
maxSessions: number;
|
|
650
|
+
idleTtlMs: number;
|
|
651
|
+
now: number;
|
|
652
|
+
}
|
|
653
|
+
export interface MockDataStore {
|
|
654
|
+
/** Create the namespace on first use and seed it once; sessions are capped. */
|
|
655
|
+
ensureNamespace(scope: MockStoreScope, seed: () => Promise<MockSeedPlan>, options: MockEnsureNamespaceOptions): Promise<{
|
|
656
|
+
ok: true;
|
|
657
|
+
created: boolean;
|
|
658
|
+
} | {
|
|
659
|
+
ok: false;
|
|
660
|
+
reason: "session-limit";
|
|
661
|
+
}>;
|
|
662
|
+
/** Drop every record of the namespace and seed it again. */
|
|
663
|
+
resetNamespace(scope: MockStoreScope, seed: MockSeedPlan, now: number): Promise<void>;
|
|
664
|
+
dropNamespace(scope: MockStoreScope): Promise<void>;
|
|
665
|
+
listNamespaces(mockId: string): Promise<MockNamespaceInfo[]>;
|
|
666
|
+
insert(scope: MockStoreScope, doc: MockRecordDoc): Promise<MockWriteOutcome>;
|
|
667
|
+
get(scope: MockStoreScope, resource: string, key: string): Promise<MockRecordDoc | null>;
|
|
668
|
+
getMany(scope: MockStoreScope, resource: string, keys: string[]): Promise<MockRecordDoc[]>;
|
|
669
|
+
find(scope: MockStoreScope, resource: string, options: MockFindOptions): Promise<{
|
|
670
|
+
docs: MockRecordDoc[];
|
|
671
|
+
total: number;
|
|
672
|
+
}>;
|
|
673
|
+
count(scope: MockStoreScope, resource: string, filter?: MockFilterNode, limit?: number): Promise<number>;
|
|
674
|
+
countNamespace(scope: MockStoreScope, limit?: number): Promise<number>;
|
|
675
|
+
/** Replace a record if its `rev` still matches. */
|
|
676
|
+
replace(scope: MockStoreScope, resource: string, key: string, expectedRev: number, doc: MockRecordDoc): Promise<MockWriteOutcome>;
|
|
677
|
+
delete(scope: MockStoreScope, resource: string, keys: string[]): Promise<number>;
|
|
678
|
+
/** Delete every record of a resource in the namespace. */
|
|
679
|
+
clearResource(scope: MockStoreScope, resource: string): Promise<number>;
|
|
680
|
+
nextSequence(scope: MockStoreScope, resource: string): Promise<number>;
|
|
681
|
+
bumpSequence(scope: MockStoreScope, resource: string, value: number): Promise<void>;
|
|
682
|
+
}
|
|
683
|
+
export {};
|
|
684
|
+
//# sourceMappingURL=types.d.ts.map
|