callman-core 1.38.0 → 1.39.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 (239) hide show
  1. package/dist/mock-engine/auth.d.ts +29 -0
  2. package/dist/mock-engine/auth.d.ts.map +1 -0
  3. package/dist/mock-engine/auth.js +86 -0
  4. package/dist/mock-engine/auth.js.map +1 -0
  5. package/dist/mock-engine/conditions.d.ts +31 -0
  6. package/dist/mock-engine/conditions.d.ts.map +1 -0
  7. package/dist/mock-engine/conditions.js +210 -0
  8. package/dist/mock-engine/conditions.js.map +1 -0
  9. package/dist/mock-engine/constants.d.ts +28 -0
  10. package/dist/mock-engine/constants.d.ts.map +1 -0
  11. package/dist/mock-engine/constants.js +113 -0
  12. package/dist/mock-engine/constants.js.map +1 -0
  13. package/dist/mock-engine/context.d.ts +17 -0
  14. package/dist/mock-engine/context.d.ts.map +1 -0
  15. package/dist/mock-engine/context.js +92 -0
  16. package/dist/mock-engine/context.js.map +1 -0
  17. package/dist/mock-engine/data/actions.d.ts +4 -0
  18. package/dist/mock-engine/data/actions.d.ts.map +1 -0
  19. package/dist/mock-engine/data/actions.js +149 -0
  20. package/dist/mock-engine/data/actions.js.map +1 -0
  21. package/dist/mock-engine/data/query.d.ts +28 -0
  22. package/dist/mock-engine/data/query.d.ts.map +1 -0
  23. package/dist/mock-engine/data/query.js +402 -0
  24. package/dist/mock-engine/data/query.js.map +1 -0
  25. package/dist/mock-engine/data/record-codec.d.ts +28 -0
  26. package/dist/mock-engine/data/record-codec.d.ts.map +1 -0
  27. package/dist/mock-engine/data/record-codec.js +155 -0
  28. package/dist/mock-engine/data/record-codec.js.map +1 -0
  29. package/dist/mock-engine/data/resource-ops.d.ts +53 -0
  30. package/dist/mock-engine/data/resource-ops.d.ts.map +1 -0
  31. package/dist/mock-engine/data/resource-ops.js +461 -0
  32. package/dist/mock-engine/data/resource-ops.js.map +1 -0
  33. package/dist/mock-engine/data/seed.d.ts +21 -0
  34. package/dist/mock-engine/data/seed.d.ts.map +1 -0
  35. package/dist/mock-engine/data/seed.js +239 -0
  36. package/dist/mock-engine/data/seed.js.map +1 -0
  37. package/dist/mock-engine/data/validate-record.d.ts +30 -0
  38. package/dist/mock-engine/data/validate-record.d.ts.map +1 -0
  39. package/dist/mock-engine/data/validate-record.js +165 -0
  40. package/dist/mock-engine/data/validate-record.js.map +1 -0
  41. package/dist/mock-engine/definition.d.ts +31 -0
  42. package/dist/mock-engine/definition.d.ts.map +1 -0
  43. package/dist/mock-engine/definition.js +440 -0
  44. package/dist/mock-engine/definition.js.map +1 -0
  45. package/dist/mock-engine/engine.d.ts +75 -0
  46. package/dist/mock-engine/engine.d.ts.map +1 -0
  47. package/dist/mock-engine/engine.js +828 -0
  48. package/dist/mock-engine/engine.js.map +1 -0
  49. package/dist/mock-engine/faults.d.ts +38 -0
  50. package/dist/mock-engine/faults.d.ts.map +1 -0
  51. package/dist/mock-engine/faults.js +113 -0
  52. package/dist/mock-engine/faults.js.map +1 -0
  53. package/dist/mock-engine/helpers.d.ts +68 -0
  54. package/dist/mock-engine/helpers.d.ts.map +1 -0
  55. package/dist/mock-engine/helpers.js +388 -0
  56. package/dist/mock-engine/helpers.js.map +1 -0
  57. package/dist/mock-engine/import/build.d.ts +16 -0
  58. package/dist/mock-engine/import/build.d.ts.map +1 -0
  59. package/dist/mock-engine/import/build.js +435 -0
  60. package/dist/mock-engine/import/build.js.map +1 -0
  61. package/dist/mock-engine/import/index.d.ts +15 -0
  62. package/dist/mock-engine/import/index.d.ts.map +1 -0
  63. package/dist/mock-engine/import/index.js +92 -0
  64. package/dist/mock-engine/import/index.js.map +1 -0
  65. package/dist/mock-engine/import/openapi.d.ts +10 -0
  66. package/dist/mock-engine/import/openapi.d.ts.map +1 -0
  67. package/dist/mock-engine/import/openapi.js +199 -0
  68. package/dist/mock-engine/import/openapi.js.map +1 -0
  69. package/dist/mock-engine/import/paths.d.ts +16 -0
  70. package/dist/mock-engine/import/paths.d.ts.map +1 -0
  71. package/dist/mock-engine/import/paths.js +64 -0
  72. package/dist/mock-engine/import/paths.js.map +1 -0
  73. package/dist/mock-engine/import/postman.d.ts +21 -0
  74. package/dist/mock-engine/import/postman.d.ts.map +1 -0
  75. package/dist/mock-engine/import/postman.js +241 -0
  76. package/dist/mock-engine/import/postman.js.map +1 -0
  77. package/dist/mock-engine/import/report.d.ts +12 -0
  78. package/dist/mock-engine/import/report.d.ts.map +1 -0
  79. package/dist/mock-engine/import/report.js +39 -0
  80. package/dist/mock-engine/import/report.js.map +1 -0
  81. package/dist/mock-engine/import/types.d.ts +94 -0
  82. package/dist/mock-engine/import/types.d.ts.map +1 -0
  83. package/dist/mock-engine/import/types.js +6 -0
  84. package/dist/mock-engine/import/types.js.map +1 -0
  85. package/dist/mock-engine/index.d.ts +24 -0
  86. package/dist/mock-engine/index.d.ts.map +1 -0
  87. package/dist/mock-engine/index.js +27 -0
  88. package/dist/mock-engine/index.js.map +1 -0
  89. package/dist/mock-engine/legacy-builder.d.ts +27 -0
  90. package/dist/mock-engine/legacy-builder.d.ts.map +1 -0
  91. package/dist/mock-engine/legacy-builder.js +322 -0
  92. package/dist/mock-engine/legacy-builder.js.map +1 -0
  93. package/dist/mock-engine/memory-store.d.ts +73 -0
  94. package/dist/mock-engine/memory-store.d.ts.map +1 -0
  95. package/dist/mock-engine/memory-store.js +314 -0
  96. package/dist/mock-engine/memory-store.js.map +1 -0
  97. package/dist/mock-engine/node/ajv-body-validator.d.ts +13 -0
  98. package/dist/mock-engine/node/ajv-body-validator.d.ts.map +1 -0
  99. package/dist/mock-engine/node/ajv-body-validator.js +158 -0
  100. package/dist/mock-engine/node/ajv-body-validator.js.map +1 -0
  101. package/dist/mock-engine/node/file-store.d.ts +30 -0
  102. package/dist/mock-engine/node/file-store.d.ts.map +1 -0
  103. package/dist/mock-engine/node/file-store.js +116 -0
  104. package/dist/mock-engine/node/file-store.js.map +1 -0
  105. package/dist/mock-engine/node/index.d.ts +5 -0
  106. package/dist/mock-engine/node/index.d.ts.map +1 -0
  107. package/dist/mock-engine/node/index.js +8 -0
  108. package/dist/mock-engine/node/index.js.map +1 -0
  109. package/dist/mock-engine/node/node-http-adapter.d.ts +38 -0
  110. package/dist/mock-engine/node/node-http-adapter.d.ts.map +1 -0
  111. package/dist/mock-engine/node/node-http-adapter.js +215 -0
  112. package/dist/mock-engine/node/node-http-adapter.js.map +1 -0
  113. package/dist/mock-engine/node/vm-regex-runner.d.ts +14 -0
  114. package/dist/mock-engine/node/vm-regex-runner.d.ts.map +1 -0
  115. package/dist/mock-engine/node/vm-regex-runner.js +90 -0
  116. package/dist/mock-engine/node/vm-regex-runner.js.map +1 -0
  117. package/dist/mock-engine/render.d.ts +19 -0
  118. package/dist/mock-engine/render.d.ts.map +1 -0
  119. package/dist/mock-engine/render.js +57 -0
  120. package/dist/mock-engine/render.js.map +1 -0
  121. package/dist/mock-engine/routing.d.ts +48 -0
  122. package/dist/mock-engine/routing.d.ts.map +1 -0
  123. package/dist/mock-engine/routing.js +122 -0
  124. package/dist/mock-engine/routing.js.map +1 -0
  125. package/dist/mock-engine/templates.d.ts +58 -0
  126. package/dist/mock-engine/templates.d.ts.map +1 -0
  127. package/dist/mock-engine/templates.js +300 -0
  128. package/dist/mock-engine/templates.js.map +1 -0
  129. package/dist/mock-engine/testing/index.d.ts +13 -0
  130. package/dist/mock-engine/testing/index.d.ts.map +1 -0
  131. package/dist/mock-engine/testing/index.js +69 -0
  132. package/dist/mock-engine/testing/index.js.map +1 -0
  133. package/dist/mock-engine/types.d.ts +684 -0
  134. package/dist/mock-engine/types.d.ts.map +1 -0
  135. package/dist/mock-engine/types.js +7 -0
  136. package/dist/mock-engine/types.js.map +1 -0
  137. package/dist/mock-engine/util.d.ts +25 -0
  138. package/dist/mock-engine/util.d.ts.map +1 -0
  139. package/dist/mock-engine/util.js +143 -0
  140. package/dist/mock-engine/util.js.map +1 -0
  141. package/dist/openapi/index.d.ts +34 -0
  142. package/dist/openapi/index.d.ts.map +1 -0
  143. package/dist/openapi/index.js +246 -0
  144. package/dist/openapi/index.js.map +1 -0
  145. package/dist/script/features/random.d.ts.map +1 -1
  146. package/dist/script/features/random.js +3 -1
  147. package/dist/script/features/random.js.map +1 -1
  148. package/dist/templating/postman-generators.d.ts +5 -0
  149. package/dist/templating/postman-generators.d.ts.map +1 -1
  150. package/dist/templating/postman-generators.js +19 -14
  151. package/dist/templating/postman-generators.js.map +1 -1
  152. package/dist/templating/random-generators.d.ts.map +1 -1
  153. package/dist/templating/random-generators.js +3 -1
  154. package/dist/templating/random-generators.js.map +1 -1
  155. package/dist/templating/random-source.d.ts +12 -0
  156. package/dist/templating/random-source.d.ts.map +1 -0
  157. package/dist/templating/random-source.js +38 -0
  158. package/dist/templating/random-source.js.map +1 -0
  159. package/dist-cjs/mock-engine/auth.js +96 -0
  160. package/dist-cjs/mock-engine/auth.js.map +1 -0
  161. package/dist-cjs/mock-engine/conditions.js +216 -0
  162. package/dist-cjs/mock-engine/conditions.js.map +1 -0
  163. package/dist-cjs/mock-engine/constants.js +116 -0
  164. package/dist-cjs/mock-engine/constants.js.map +1 -0
  165. package/dist-cjs/mock-engine/context.js +99 -0
  166. package/dist-cjs/mock-engine/context.js.map +1 -0
  167. package/dist-cjs/mock-engine/data/actions.js +153 -0
  168. package/dist-cjs/mock-engine/data/actions.js.map +1 -0
  169. package/dist-cjs/mock-engine/data/query.js +413 -0
  170. package/dist-cjs/mock-engine/data/query.js.map +1 -0
  171. package/dist-cjs/mock-engine/data/record-codec.js +165 -0
  172. package/dist-cjs/mock-engine/data/record-codec.js.map +1 -0
  173. package/dist-cjs/mock-engine/data/resource-ops.js +476 -0
  174. package/dist-cjs/mock-engine/data/resource-ops.js.map +1 -0
  175. package/dist-cjs/mock-engine/data/seed.js +246 -0
  176. package/dist-cjs/mock-engine/data/seed.js.map +1 -0
  177. package/dist-cjs/mock-engine/data/validate-record.js +170 -0
  178. package/dist-cjs/mock-engine/data/validate-record.js.map +1 -0
  179. package/dist-cjs/mock-engine/definition.js +454 -0
  180. package/dist-cjs/mock-engine/definition.js.map +1 -0
  181. package/dist-cjs/mock-engine/engine.js +837 -0
  182. package/dist-cjs/mock-engine/engine.js.map +1 -0
  183. package/dist-cjs/mock-engine/faults.js +117 -0
  184. package/dist-cjs/mock-engine/faults.js.map +1 -0
  185. package/dist-cjs/mock-engine/helpers.js +399 -0
  186. package/dist-cjs/mock-engine/helpers.js.map +1 -0
  187. package/dist-cjs/mock-engine/import/build.js +439 -0
  188. package/dist-cjs/mock-engine/import/build.js.map +1 -0
  189. package/dist-cjs/mock-engine/import/index.js +120 -0
  190. package/dist-cjs/mock-engine/import/index.js.map +1 -0
  191. package/dist-cjs/mock-engine/import/openapi.js +203 -0
  192. package/dist-cjs/mock-engine/import/openapi.js.map +1 -0
  193. package/dist-cjs/mock-engine/import/paths.js +72 -0
  194. package/dist-cjs/mock-engine/import/paths.js.map +1 -0
  195. package/dist-cjs/mock-engine/import/postman.js +247 -0
  196. package/dist-cjs/mock-engine/import/postman.js.map +1 -0
  197. package/dist-cjs/mock-engine/import/report.js +43 -0
  198. package/dist-cjs/mock-engine/import/report.js.map +1 -0
  199. package/dist-cjs/mock-engine/import/types.js +7 -0
  200. package/dist-cjs/mock-engine/import/types.js.map +1 -0
  201. package/dist-cjs/mock-engine/index.js +81 -0
  202. package/dist-cjs/mock-engine/index.js.map +1 -0
  203. package/dist-cjs/mock-engine/legacy-builder.js +327 -0
  204. package/dist-cjs/mock-engine/legacy-builder.js.map +1 -0
  205. package/dist-cjs/mock-engine/memory-store.js +318 -0
  206. package/dist-cjs/mock-engine/memory-store.js.map +1 -0
  207. package/dist-cjs/mock-engine/node/ajv-body-validator.js +166 -0
  208. package/dist-cjs/mock-engine/node/ajv-body-validator.js.map +1 -0
  209. package/dist-cjs/mock-engine/node/file-store.js +123 -0
  210. package/dist-cjs/mock-engine/node/file-store.js.map +1 -0
  211. package/dist-cjs/mock-engine/node/index.js +16 -0
  212. package/dist-cjs/mock-engine/node/index.js.map +1 -0
  213. package/dist-cjs/mock-engine/node/node-http-adapter.js +219 -0
  214. package/dist-cjs/mock-engine/node/node-http-adapter.js.map +1 -0
  215. package/dist-cjs/mock-engine/node/vm-regex-runner.js +97 -0
  216. package/dist-cjs/mock-engine/node/vm-regex-runner.js.map +1 -0
  217. package/dist-cjs/mock-engine/render.js +64 -0
  218. package/dist-cjs/mock-engine/render.js.map +1 -0
  219. package/dist-cjs/mock-engine/routing.js +130 -0
  220. package/dist-cjs/mock-engine/routing.js.map +1 -0
  221. package/dist-cjs/mock-engine/templates.js +308 -0
  222. package/dist-cjs/mock-engine/templates.js.map +1 -0
  223. package/dist-cjs/mock-engine/testing/index.js +72 -0
  224. package/dist-cjs/mock-engine/testing/index.js.map +1 -0
  225. package/dist-cjs/mock-engine/types.js +8 -0
  226. package/dist-cjs/mock-engine/types.js.map +1 -0
  227. package/dist-cjs/mock-engine/util.js +166 -0
  228. package/dist-cjs/mock-engine/util.js.map +1 -0
  229. package/dist-cjs/openapi/index.js +257 -0
  230. package/dist-cjs/openapi/index.js.map +1 -0
  231. package/dist-cjs/script/features/random.js +3 -1
  232. package/dist-cjs/script/features/random.js.map +1 -1
  233. package/dist-cjs/templating/postman-generators.js +21 -15
  234. package/dist-cjs/templating/postman-generators.js.map +1 -1
  235. package/dist-cjs/templating/random-generators.js +3 -1
  236. package/dist-cjs/templating/random-generators.js.map +1 -1
  237. package/dist-cjs/templating/random-source.js +44 -0
  238. package/dist-cjs/templating/random-source.js.map +1 -0
  239. package/package.json +29 -1
@@ -0,0 +1,29 @@
1
+ import type { MockCryptoPort } from "./types.js";
2
+ export declare const isHashedPassword: (value: unknown) => value is string;
3
+ export declare const hashPassword: (crypto: MockCryptoPort, password: string) => Promise<string>;
4
+ export declare const verifyPassword: (crypto: MockCryptoPort, stored: unknown, candidate: string) => Promise<boolean>;
5
+ export declare const generateMockSecret: (crypto: MockCryptoPort) => string;
6
+ export interface MockJwtClaims {
7
+ sub: string;
8
+ iat: number;
9
+ exp: number;
10
+ iss?: string;
11
+ aud?: string;
12
+ [claim: string]: unknown;
13
+ }
14
+ export declare const signMockJwt: (crypto: MockCryptoPort, secretHex: string, claims: MockJwtClaims) => Promise<string>;
15
+ export type JwtVerifyResult = {
16
+ ok: true;
17
+ claims: MockJwtClaims;
18
+ } | {
19
+ ok: false;
20
+ reason: "malformed" | "signature" | "expired" | "issuer" | "audience";
21
+ };
22
+ export declare const verifyMockJwt: (crypto: MockCryptoPort, secretHex: string, token: string, options: {
23
+ nowSeconds: number;
24
+ issuer?: string;
25
+ audience?: string;
26
+ }) => Promise<JwtVerifyResult>;
27
+ /** Bearer token from an Authorization header, or null. */
28
+ export declare const bearerToken: (authorization: string | undefined) => string | null;
29
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/mock-engine/auth.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAKjD,eAAO,MAAM,gBAAgB,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MACK,CAAC;AASjE,eAAO,MAAM,YAAY,GAAU,QAAQ,cAAc,EAAE,UAAU,MAAM,KAAG,OAAO,CAAC,MAAM,CAI3F,CAAC;AAEF,eAAO,MAAM,cAAc,GAAU,QAAQ,cAAc,EAAE,QAAQ,OAAO,EAAE,WAAW,MAAM,KAAG,OAAO,CAAC,OAAO,CAWhH,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,QAAQ,cAAc,KAAG,MAAuC,CAAC;AAEpG,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAID,eAAO,MAAM,WAAW,GAAU,QAAQ,cAAc,EAAE,WAAW,MAAM,EAAE,QAAQ,aAAa,KAAG,OAAO,CAAC,MAAM,CAKlH,CAAC;AAEF,MAAM,MAAM,eAAe,GACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GACnC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAA;CAAE,CAAC;AAEzF,eAAO,MAAM,aAAa,GACxB,QAAQ,cAAc,EACtB,WAAW,MAAM,EACjB,OAAO,MAAM,EACb,SAAS;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,KAClE,OAAO,CAAC,eAAe,CA0BzB,CAAC;AAEF,0DAA0D;AAC1D,eAAO,MAAM,WAAW,GAAI,eAAe,MAAM,GAAG,SAAS,KAAG,MAAM,GAAG,IAIxE,CAAC"}
@@ -0,0 +1,86 @@
1
+ // Auth simulation primitives: mock-grade password hashing and HS256 JWTs.
2
+ // Everything goes through the injected `MockCryptoPort` (WebCrypto by
3
+ // default), so the same code runs on the server, in Electron main and in the
4
+ // renderer. These are simulated credentials for test APIs — not a real
5
+ // identity system.
6
+ import { base64UrlDecode, base64UrlEncode, fromHex, fromUtf8, timingSafeEqualBytes, toHex, utf8 } from "./util.js";
7
+ const PASSWORD_PREFIX = "$mockpw$v1$";
8
+ export const isHashedPassword = (value) => typeof value === "string" && value.startsWith(PASSWORD_PREFIX);
9
+ const concat = (a, b) => {
10
+ const out = new Uint8Array(a.length + b.length);
11
+ out.set(a, 0);
12
+ out.set(b, a.length);
13
+ return out;
14
+ };
15
+ export const hashPassword = async (crypto, password) => {
16
+ const salt = crypto.randomBytes(16);
17
+ const digest = await crypto.sha256(concat(salt, utf8(password)));
18
+ return `${PASSWORD_PREFIX}${toHex(salt)}$${toHex(digest)}`;
19
+ };
20
+ export const verifyPassword = async (crypto, stored, candidate) => {
21
+ if (typeof stored !== "string")
22
+ return false;
23
+ if (!isHashedPassword(stored)) {
24
+ // Seeds and imports may hold plain values; compare their digests.
25
+ const [a, b] = await Promise.all([crypto.sha256(utf8(stored)), crypto.sha256(utf8(candidate))]);
26
+ return timingSafeEqualBytes(a, b);
27
+ }
28
+ const [saltHex, hashHex] = stored.slice(PASSWORD_PREFIX.length).split("$");
29
+ if (!saltHex || !hashHex)
30
+ return false;
31
+ const digest = await crypto.sha256(concat(fromHex(saltHex), utf8(candidate)));
32
+ return timingSafeEqualBytes(digest, fromHex(hashHex));
33
+ };
34
+ export const generateMockSecret = (crypto) => toHex(crypto.randomBytes(32));
35
+ const HEADER = base64UrlEncode(utf8(JSON.stringify({ alg: "HS256", typ: "JWT" })));
36
+ export const signMockJwt = async (crypto, secretHex, claims) => {
37
+ const payload = base64UrlEncode(utf8(JSON.stringify(claims)));
38
+ const signingInput = `${HEADER}.${payload}`;
39
+ const signature = await crypto.hmacSha256(fromHex(secretHex), utf8(signingInput));
40
+ return `${signingInput}.${base64UrlEncode(signature)}`;
41
+ };
42
+ export const verifyMockJwt = async (crypto, secretHex, token, options) => {
43
+ const parts = token.split(".");
44
+ if (parts.length !== 3)
45
+ return { ok: false, reason: "malformed" };
46
+ const [headerPart, payloadPart, signaturePart] = parts;
47
+ const headerBytes = base64UrlDecode(headerPart);
48
+ const payloadBytes = base64UrlDecode(payloadPart);
49
+ const signature = base64UrlDecode(signaturePart);
50
+ if (!headerBytes || !payloadBytes || !signature)
51
+ return { ok: false, reason: "malformed" };
52
+ let header;
53
+ let claims;
54
+ try {
55
+ header = JSON.parse(fromUtf8(headerBytes));
56
+ claims = JSON.parse(fromUtf8(payloadBytes));
57
+ }
58
+ catch {
59
+ return { ok: false, reason: "malformed" };
60
+ }
61
+ if (!header || typeof header !== "object" || header.alg !== "HS256")
62
+ return { ok: false, reason: "malformed" };
63
+ const expected = await crypto.hmacSha256(fromHex(secretHex), utf8(`${headerPart}.${payloadPart}`));
64
+ if (!timingSafeEqualBytes(expected, signature))
65
+ return { ok: false, reason: "signature" };
66
+ if (!claims || typeof claims !== "object")
67
+ return { ok: false, reason: "malformed" };
68
+ const c = claims;
69
+ if (typeof c.sub !== "string")
70
+ return { ok: false, reason: "malformed" };
71
+ if (typeof c.exp === "number" && c.exp <= options.nowSeconds)
72
+ return { ok: false, reason: "expired" };
73
+ if (options.issuer && c.iss !== options.issuer)
74
+ return { ok: false, reason: "issuer" };
75
+ if (options.audience && c.aud !== options.audience)
76
+ return { ok: false, reason: "audience" };
77
+ return { ok: true, claims: c };
78
+ };
79
+ /** Bearer token from an Authorization header, or null. */
80
+ export const bearerToken = (authorization) => {
81
+ if (!authorization)
82
+ return null;
83
+ const match = /^Bearer\s+(.+)$/i.exec(authorization.trim());
84
+ return match ? match[1].trim() : null;
85
+ };
86
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/mock-engine/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { MockRegexRunner, VariantCondition } from "./types.js";
2
+ export declare const MAX_PATTERN_LENGTH = 512;
3
+ /** Subjects are truncated before matching so a 1 MB field cannot turn a linear pattern into a long scan. */
4
+ export declare const MAX_REGEX_SUBJECT_CHARS = 4096;
5
+ /**
6
+ * Why a `matches` pattern is refused, or `null` when it is acceptable.
7
+ * Human-readable: the message is returned to the editor as a 400.
8
+ */
9
+ export declare const describeUnsafePattern: (source: string) => string | null;
10
+ /**
11
+ * A runner without a timeout, for hosts that cannot use `vm` (the renderer
12
+ * previews). Patterns were vetted by `describeUnsafePattern` at save time;
13
+ * the subject is truncated. Node hosts use the vm runner instead.
14
+ */
15
+ export declare const createBasicRegexRunner: () => MockRegexRunner;
16
+ export interface ConditionContext {
17
+ params: Record<string, string>;
18
+ query: Record<string, unknown>;
19
+ headers: Record<string, string>;
20
+ body?: unknown;
21
+ auth?: {
22
+ authenticated: boolean;
23
+ sub?: string;
24
+ claims?: Record<string, unknown>;
25
+ };
26
+ session?: {
27
+ id: string | null;
28
+ };
29
+ }
30
+ export declare const evaluateCondition: (condition: VariantCondition, ctx: ConditionContext, regex: MockRegexRunner) => boolean;
31
+ //# sourceMappingURL=conditions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conditions.d.ts","sourceRoot":"","sources":["../../src/mock-engine/conditions.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGpE,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAGtC,4GAA4G;AAC5G,eAAO,MAAM,uBAAuB,OAAQ,CAAC;AAuC7C;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAAI,QAAQ,MAAM,KAAG,MAAM,GAAG,IAsE/D,CAAC;AAKF;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,QAAO,eAoBzC,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE;QAAE,aAAa,EAAE,OAAO,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IAClF,OAAO,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;CACjC;AA+BD,eAAO,MAAM,iBAAiB,GAC5B,WAAW,gBAAgB,EAC3B,KAAK,gBAAgB,EACrB,OAAO,eAAe,KACrB,OAyBF,CAAC"}
@@ -0,0 +1,210 @@
1
+ // Variant/match conditions and the save-time regex safety check.
2
+ //
3
+ // A condition is an AND/OR group of field-operator-value rules read from the
4
+ // request scopes (headers, params, query, body) plus, in engine v2, the
5
+ // signed-in user (`auth.*`) and the test session (`session.id`). The
6
+ // `matches` operator runs through the injected `MockRegexRunner`, which the
7
+ // Node hosts back with a vm timeout so an author's pattern cannot pin the
8
+ // event loop on an anonymous caller's input.
9
+ import { lookupHeader, navigatePath } from "./util.js";
10
+ export const MAX_PATTERN_LENGTH = 512;
11
+ // The subject is truncated before matching: a 1 MB body field must not turn
12
+ // even a linear pattern into a long scan.
13
+ /** Subjects are truncated before matching so a 1 MB field cannot turn a linear pattern into a long scan. */
14
+ export const MAX_REGEX_SUBJECT_CHARS = 4_096;
15
+ // Reads a quantifier starting at `index`. Returns its length and whether it
16
+ // can repeat more than once (`?` and `{0,1}` cannot, so they never nest
17
+ // dangerously).
18
+ const readQuantifier = (source, index) => {
19
+ const char = source[index];
20
+ let length = 0;
21
+ let repeats = false;
22
+ if (char === "*" || char === "+") {
23
+ length = 1;
24
+ repeats = true;
25
+ }
26
+ else if (char === "?") {
27
+ length = 1;
28
+ }
29
+ else if (char === "{") {
30
+ const match = /^\{(\d+)(,(\d*))?\}/.exec(source.slice(index));
31
+ if (!match)
32
+ return null;
33
+ length = match[0].length;
34
+ const min = Number(match[1]);
35
+ const max = match[2] === undefined ? min : match[3] === "" ? Infinity : Number(match[3]);
36
+ repeats = max > 1;
37
+ }
38
+ else {
39
+ return null;
40
+ }
41
+ // Lazy / possessive-looking suffix (`*?`) — same repetition semantics.
42
+ if (source[index + length] === "?")
43
+ length += 1;
44
+ return { length, repeats };
45
+ };
46
+ /**
47
+ * Why a `matches` pattern is refused, or `null` when it is acceptable.
48
+ * Human-readable: the message is returned to the editor as a 400.
49
+ */
50
+ export const describeUnsafePattern = (source) => {
51
+ if (source.length > MAX_PATTERN_LENGTH) {
52
+ return `Pattern is longer than ${MAX_PATTERN_LENGTH} characters`;
53
+ }
54
+ try {
55
+ new RegExp(source);
56
+ }
57
+ catch (error) {
58
+ return `Invalid regular expression: ${error instanceof Error ? error.message : String(error)}`;
59
+ }
60
+ const stack = [{ repeats: false }];
61
+ let inClass = false;
62
+ for (let i = 0; i < source.length; i += 1) {
63
+ const char = source[i];
64
+ if (char === "\\") {
65
+ const next = source[i + 1] ?? "";
66
+ if (!inClass && (/[1-9]/.test(next) || next === "k")) {
67
+ return "Backreferences are not supported in mock patterns";
68
+ }
69
+ i += 1;
70
+ // An escaped atom outside a class can still be quantified.
71
+ if (!inClass) {
72
+ const quantifier = readQuantifier(source, i + 1);
73
+ if (quantifier) {
74
+ if (quantifier.repeats)
75
+ stack[stack.length - 1].repeats = true;
76
+ i += quantifier.length;
77
+ }
78
+ }
79
+ continue;
80
+ }
81
+ if (inClass) {
82
+ if (char === "]") {
83
+ inClass = false;
84
+ const quantifier = readQuantifier(source, i + 1);
85
+ if (quantifier) {
86
+ if (quantifier.repeats)
87
+ stack[stack.length - 1].repeats = true;
88
+ i += quantifier.length;
89
+ }
90
+ }
91
+ continue;
92
+ }
93
+ if (char === "[") {
94
+ inClass = true;
95
+ continue;
96
+ }
97
+ if (char === "(") {
98
+ stack.push({ repeats: false });
99
+ continue;
100
+ }
101
+ if (char === ")") {
102
+ const closed = stack.pop() ?? { repeats: false };
103
+ const parent = stack[stack.length - 1] ?? stack[0];
104
+ const quantifier = readQuantifier(source, i + 1);
105
+ if (quantifier) {
106
+ if (quantifier.repeats && closed.repeats) {
107
+ return "Pattern repeats a group that itself repeats (like (a+)+) — that can hang on crafted input; simplify it";
108
+ }
109
+ if (quantifier.repeats)
110
+ parent.repeats = true;
111
+ i += quantifier.length;
112
+ }
113
+ if (closed.repeats)
114
+ parent.repeats = true;
115
+ continue;
116
+ }
117
+ const quantifier = readQuantifier(source, i + 1);
118
+ if (quantifier) {
119
+ if (quantifier.repeats)
120
+ stack[stack.length - 1].repeats = true;
121
+ i += quantifier.length;
122
+ }
123
+ }
124
+ return null;
125
+ };
126
+ // ── Run-time evaluation ───────────────────────────────────────────────
127
+ /**
128
+ * A runner without a timeout, for hosts that cannot use `vm` (the renderer
129
+ * previews). Patterns were vetted by `describeUnsafePattern` at save time;
130
+ * the subject is truncated. Node hosts use the vm runner instead.
131
+ */
132
+ export const createBasicRegexRunner = () => {
133
+ const cache = new Map();
134
+ return {
135
+ test(pattern, subject) {
136
+ if (pattern.length > MAX_PATTERN_LENGTH * 4)
137
+ return false;
138
+ let compiled = cache.get(pattern);
139
+ if (compiled === undefined) {
140
+ try {
141
+ compiled = new RegExp(pattern);
142
+ }
143
+ catch {
144
+ compiled = null;
145
+ }
146
+ if (cache.size > 500)
147
+ cache.clear();
148
+ cache.set(pattern, compiled);
149
+ }
150
+ if (!compiled)
151
+ return false;
152
+ const input = subject.length > MAX_REGEX_SUBJECT_CHARS ? subject.slice(0, MAX_REGEX_SUBJECT_CHARS) : subject;
153
+ return compiled.test(input);
154
+ },
155
+ };
156
+ };
157
+ const resolveFieldValue = (field, ctx) => {
158
+ const segments = field.split(".");
159
+ const [head, ...rest] = segments;
160
+ switch (head) {
161
+ case "headers":
162
+ if (rest.length === 0)
163
+ return undefined;
164
+ return rest.length === 1
165
+ ? lookupHeader(ctx.headers, rest[0])
166
+ : navigatePath(lookupHeader(ctx.headers, rest[0]), rest.slice(1));
167
+ case "params":
168
+ return navigatePath(ctx.params, rest);
169
+ case "query":
170
+ return navigatePath(ctx.query, rest);
171
+ case "body":
172
+ return navigatePath(ctx.body, rest);
173
+ case "auth":
174
+ return navigatePath(ctx.auth ?? { authenticated: false }, rest);
175
+ case "session":
176
+ return navigatePath(ctx.session ?? { id: null }, rest);
177
+ default:
178
+ return undefined;
179
+ }
180
+ };
181
+ const isPresent = (value) => value !== undefined && value !== null && value !== "";
182
+ const stringify = (value) => typeof value === "object" && value !== null ? JSON.stringify(value) : String(value);
183
+ export const evaluateCondition = (condition, ctx, regex) => {
184
+ if (!condition || !Array.isArray(condition.rules) || condition.rules.length === 0)
185
+ return false;
186
+ const results = condition.rules.map((rule) => {
187
+ const fieldValue = resolveFieldValue(rule.field, ctx);
188
+ const ruleValue = rule.value ?? "";
189
+ switch (rule.operator) {
190
+ case "exists":
191
+ return isPresent(fieldValue);
192
+ case "not-exists":
193
+ return !isPresent(fieldValue);
194
+ case "equals":
195
+ return stringify(fieldValue) === String(ruleValue);
196
+ case "not-equals":
197
+ return stringify(fieldValue) !== String(ruleValue);
198
+ case "contains":
199
+ return stringify(fieldValue).includes(String(ruleValue));
200
+ case "starts-with":
201
+ return stringify(fieldValue).startsWith(String(ruleValue));
202
+ case "matches":
203
+ return regex.test(String(ruleValue), stringify(fieldValue));
204
+ default:
205
+ return false;
206
+ }
207
+ });
208
+ return condition.type === "all" ? results.every(Boolean) : results.some(Boolean);
209
+ };
210
+ //# sourceMappingURL=conditions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conditions.js","sourceRoot":"","sources":["../../src/mock-engine/conditions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { MockEngineLimits } from "./types.js";
2
+ export declare const MOCK_FIELD_TYPES: readonly ["string", "number", "integer", "boolean", "object", "array", "date", "datetime", "email", "uuid", "password"];
3
+ export declare const MOCK_ID_STRATEGIES: readonly ["uuid", "incremental", "objectId", "nanoid", "client"];
4
+ export declare const MOCK_DATA_OPERATIONS: readonly ["insert", "find", "findOne", "update", "delete", "count", "upsert"];
5
+ export declare const MOCK_RESOURCE_ENDPOINTS: readonly ["list", "get", "create", "replace", "patch", "delete"];
6
+ /** Faker hints offered by editors (any `$random*` token also works). */
7
+ export declare const MOCK_FAKER_HINTS: readonly ["$randomFirstName", "$randomLastName", "$randomFullName", "$randomUserName", "$randomEmail", "$randomPhoneNumber", "$randomPassword", "$randomUUID", "$randomInt", "$randomPrice", "$randomBoolean", "$randomCity", "$randomCountry", "$randomCountryCode", "$randomStreetAddress", "$randomZipCode", "$randomLatitude", "$randomLongitude", "$randomCompanyName", "$randomJobTitle", "$randomDepartment", "$randomProductName", "$randomProduct", "$randomCurrencyCode", "$randomColor", "$randomWord", "$randomWords", "$randomSentence", "$randomParagraph", "$randomUrl", "$randomDomainName", "$randomIP", "$randomImageUrl", "$randomDatePast", "$randomDateRecent", "$randomDateFuture", "$isoTimestamp", "$timestamp"];
8
+ /** Paths under this prefix are reserved for the engine's control endpoints. */
9
+ export declare const MOCK_CONTROL_PREFIX = "/__callman";
10
+ export declare const MOCK_SESSION_HEADER = "x-mock-session";
11
+ export declare const MOCK_SESSION_ID_PATTERN: RegExp;
12
+ export declare const MOCK_DEFAULT_NAMESPACE = "_";
13
+ export declare const MOCK_FIELD_NAME_PATTERN: RegExp;
14
+ export declare const MOCK_RESOURCE_NAME_PATTERN: RegExp;
15
+ export declare const DEFAULT_MOCK_ENGINE_LIMITS: MockEngineLimits;
16
+ /** Desktop defaults: one user's own machine, so larger. */
17
+ export declare const DESKTOP_MOCK_ENGINE_LIMITS: MockEngineLimits;
18
+ /** Hard ceilings the definition validator applies regardless of host limits. */
19
+ export declare const MOCK_DEFINITION_LIMITS: {
20
+ readonly maxRoutes: 500;
21
+ readonly maxResources: 50;
22
+ readonly maxFieldsPerResource: 100;
23
+ readonly maxVariantsPerRoute: 20;
24
+ readonly maxMatchRules: 10;
25
+ readonly maxFaultRules: 20;
26
+ readonly maxSeedRecords: 5000;
27
+ };
28
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/mock-engine/constants.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAiC,MAAM,YAAY,CAAC;AAElF,eAAO,MAAM,gBAAgB,yHAYgB,CAAC;AAE9C,eAAO,MAAM,kBAAkB,kEAMe,CAAC;AAE/C,eAAO,MAAM,oBAAoB,+EAAgF,CAAC;AAElH,eAAO,MAAM,uBAAuB,kEAAmE,CAAC;AAExG,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,0sBAuCnB,CAAC;AAEX,+EAA+E;AAC/E,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAEhD,eAAO,MAAM,mBAAmB,mBAAmB,CAAC;AAEpD,eAAO,MAAM,uBAAuB,QAA4B,CAAC;AAEjE,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAE1C,eAAO,MAAM,uBAAuB,QAAkC,CAAC;AAEvE,eAAO,MAAM,0BAA0B,QAA+B,CAAC;AAEvE,eAAO,MAAM,0BAA0B,EAAE,gBAiBxC,CAAC;AAEF,2DAA2D;AAC3D,eAAO,MAAM,0BAA0B,EAAE,gBASxC,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,sBAAsB;;;;;;;;CAQzB,CAAC"}
@@ -0,0 +1,113 @@
1
+ // Shared vocabularies and defaults. The MCP builds its zod enums from these
2
+ // tuples and the desktop builds its pickers from them, so every client speaks
3
+ // exactly the words the engine understands.
4
+ export const MOCK_FIELD_TYPES = [
5
+ "string",
6
+ "number",
7
+ "integer",
8
+ "boolean",
9
+ "object",
10
+ "array",
11
+ "date",
12
+ "datetime",
13
+ "email",
14
+ "uuid",
15
+ "password",
16
+ ];
17
+ export const MOCK_ID_STRATEGIES = [
18
+ "uuid",
19
+ "incremental",
20
+ "objectId",
21
+ "nanoid",
22
+ "client",
23
+ ];
24
+ export const MOCK_DATA_OPERATIONS = ["insert", "find", "findOne", "update", "delete", "count", "upsert"];
25
+ export const MOCK_RESOURCE_ENDPOINTS = ["list", "get", "create", "replace", "patch", "delete"];
26
+ /** Faker hints offered by editors (any `$random*` token also works). */
27
+ export const MOCK_FAKER_HINTS = [
28
+ "$randomFirstName",
29
+ "$randomLastName",
30
+ "$randomFullName",
31
+ "$randomUserName",
32
+ "$randomEmail",
33
+ "$randomPhoneNumber",
34
+ "$randomPassword",
35
+ "$randomUUID",
36
+ "$randomInt",
37
+ "$randomPrice",
38
+ "$randomBoolean",
39
+ "$randomCity",
40
+ "$randomCountry",
41
+ "$randomCountryCode",
42
+ "$randomStreetAddress",
43
+ "$randomZipCode",
44
+ "$randomLatitude",
45
+ "$randomLongitude",
46
+ "$randomCompanyName",
47
+ "$randomJobTitle",
48
+ "$randomDepartment",
49
+ "$randomProductName",
50
+ "$randomProduct",
51
+ "$randomCurrencyCode",
52
+ "$randomColor",
53
+ "$randomWord",
54
+ "$randomWords",
55
+ "$randomSentence",
56
+ "$randomParagraph",
57
+ "$randomUrl",
58
+ "$randomDomainName",
59
+ "$randomIP",
60
+ "$randomImageUrl",
61
+ "$randomDatePast",
62
+ "$randomDateRecent",
63
+ "$randomDateFuture",
64
+ "$isoTimestamp",
65
+ "$timestamp",
66
+ ];
67
+ /** Paths under this prefix are reserved for the engine's control endpoints. */
68
+ export const MOCK_CONTROL_PREFIX = "/__callman";
69
+ export const MOCK_SESSION_HEADER = "x-mock-session";
70
+ export const MOCK_SESSION_ID_PATTERN = /^[A-Za-z0-9._:-]{1,64}$/;
71
+ export const MOCK_DEFAULT_NAMESPACE = "_";
72
+ export const MOCK_FIELD_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]{0,63}$/;
73
+ export const MOCK_RESOURCE_NAME_PATTERN = /^[a-z][a-zA-Z0-9_-]{0,39}$/;
74
+ export const DEFAULT_MOCK_ENGINE_LIMITS = {
75
+ maxRecordsPerResource: 1_000,
76
+ maxRecordsPerNamespace: 5_000,
77
+ maxRecordBytes: 16_384,
78
+ maxSessions: 20,
79
+ sessionIdleTtlMs: 60 * 60 * 1000,
80
+ maxDataOpsPerRequest: 25,
81
+ maxResponseBodyBytes: 102_400,
82
+ maxDelayMs: 60_000,
83
+ maxPageSize: 1_000,
84
+ maxFilterClauses: 20,
85
+ maxInValues: 100,
86
+ maxExpand: 3,
87
+ maxEmbedPerParent: 100,
88
+ maxCascadeDepth: 3,
89
+ maxCascadeRecords: 1_000,
90
+ maxSeedGenerate: 1_000,
91
+ };
92
+ /** Desktop defaults: one user's own machine, so larger. */
93
+ export const DESKTOP_MOCK_ENGINE_LIMITS = {
94
+ ...DEFAULT_MOCK_ENGINE_LIMITS,
95
+ maxRecordsPerResource: 10_000,
96
+ maxRecordsPerNamespace: 50_000,
97
+ maxRecordBytes: 65_536,
98
+ maxSessions: 50,
99
+ maxDataOpsPerRequest: 50,
100
+ maxDelayMs: 30_000,
101
+ maxSeedGenerate: 5_000,
102
+ };
103
+ /** Hard ceilings the definition validator applies regardless of host limits. */
104
+ export const MOCK_DEFINITION_LIMITS = {
105
+ maxRoutes: 500,
106
+ maxResources: 50,
107
+ maxFieldsPerResource: 100,
108
+ maxVariantsPerRoute: 20,
109
+ maxMatchRules: 10,
110
+ maxFaultRules: 20,
111
+ maxSeedRecords: 5_000,
112
+ };
113
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/mock-engine/constants.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { MockCallCounters, MockClock, MockCryptoPort, MockEngineContext, MockEngineLimits, MockRandomSource } from "./types.js";
2
+ export declare const systemClock: MockClock;
3
+ export declare const cryptoRandom: MockRandomSource;
4
+ /** Deterministic PRNG (mulberry32) seeded by a string — seeds and tests. */
5
+ export declare const seededRandom: (seed: string) => MockRandomSource;
6
+ export declare const createMemoryCounters: () => MockCallCounters;
7
+ export declare const webCryptoPort: MockCryptoPort;
8
+ export interface CreateEngineContextInput extends Partial<Omit<MockEngineContext, "mockId" | "limits">> {
9
+ mockId: string;
10
+ limits?: Partial<MockEngineLimits>;
11
+ }
12
+ export declare const createMockEngineContext: (input: CreateEngineContextInput) => MockEngineContext;
13
+ /** Wrap a store so one request cannot run more than `max` store operations. */
14
+ export declare class MockOpBudgetExceeded extends Error {
15
+ constructor();
16
+ }
17
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/mock-engine/context.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAEjB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,WAAW,EAAE,SAAqC,CAAC;AAQhE,eAAO,MAAM,YAAY,EAAE,gBAM1B,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,gBAgB3C,CAAC;AAEF,eAAO,MAAM,oBAAoB,QAAO,gBAoBvC,CAAC;AAKF,eAAO,MAAM,aAAa,EAAE,cAc3B,CAAC;AAEF,MAAM,WAAW,wBAAyB,SAAQ,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG,QAAQ,CAAC,CAAC;IACrG,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACpC;AAED,eAAO,MAAM,uBAAuB,GAAI,OAAO,wBAAwB,KAAG,iBAQxE,CAAC;AAEH,+EAA+E;AAC/E,qBAAa,oBAAqB,SAAQ,KAAK;;CAK9C"}