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.
Files changed (309) hide show
  1. package/dist/host/connections.d.ts +7 -0
  2. package/dist/host/connections.d.ts.map +1 -1
  3. package/dist/host/connections.js +8 -0
  4. package/dist/host/connections.js.map +1 -1
  5. package/dist/host/db/connectionMapping.d.ts +3 -0
  6. package/dist/host/db/connectionMapping.d.ts.map +1 -1
  7. package/dist/host/db/connectionMapping.js +3 -0
  8. package/dist/host/db/connectionMapping.js.map +1 -1
  9. package/dist/host/db/dbErrors.d.ts +9 -0
  10. package/dist/host/db/dbErrors.d.ts.map +1 -0
  11. package/dist/host/db/dbErrors.js +126 -0
  12. package/dist/host/db/dbErrors.js.map +1 -0
  13. package/dist/host/db/mongoAdapter.d.ts.map +1 -1
  14. package/dist/host/db/mongoAdapter.js +12 -2
  15. package/dist/host/db/mongoAdapter.js.map +1 -1
  16. package/dist/host/db/mysqlAdapter.d.ts.map +1 -1
  17. package/dist/host/db/mysqlAdapter.js +2 -1
  18. package/dist/host/db/mysqlAdapter.js.map +1 -1
  19. package/dist/host/db/oracleAdapter.d.ts.map +1 -1
  20. package/dist/host/db/oracleAdapter.js +12 -1
  21. package/dist/host/db/oracleAdapter.js.map +1 -1
  22. package/dist/host/db/oracleConnectString.d.ts.map +1 -1
  23. package/dist/host/db/oracleConnectString.js +13 -4
  24. package/dist/host/db/oracleConnectString.js.map +1 -1
  25. package/dist/host/db/queryExecutor.d.ts.map +1 -1
  26. package/dist/host/db/queryExecutor.js +6 -0
  27. package/dist/host/db/queryExecutor.js.map +1 -1
  28. package/dist/host/db/types.d.ts +16 -0
  29. package/dist/host/db/types.d.ts.map +1 -1
  30. package/dist/host/index.d.ts +1 -0
  31. package/dist/host/index.d.ts.map +1 -1
  32. package/dist/host/index.js +2 -0
  33. package/dist/host/index.js.map +1 -1
  34. package/dist/http/transportError.d.ts +15 -0
  35. package/dist/http/transportError.d.ts.map +1 -0
  36. package/dist/http/transportError.js +70 -0
  37. package/dist/http/transportError.js.map +1 -0
  38. package/dist/index.d.ts +1 -0
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +1 -0
  41. package/dist/index.js.map +1 -1
  42. package/dist/mock-engine/auth.d.ts +29 -0
  43. package/dist/mock-engine/auth.d.ts.map +1 -0
  44. package/dist/mock-engine/auth.js +86 -0
  45. package/dist/mock-engine/auth.js.map +1 -0
  46. package/dist/mock-engine/conditions.d.ts +31 -0
  47. package/dist/mock-engine/conditions.d.ts.map +1 -0
  48. package/dist/mock-engine/conditions.js +210 -0
  49. package/dist/mock-engine/conditions.js.map +1 -0
  50. package/dist/mock-engine/constants.d.ts +28 -0
  51. package/dist/mock-engine/constants.d.ts.map +1 -0
  52. package/dist/mock-engine/constants.js +113 -0
  53. package/dist/mock-engine/constants.js.map +1 -0
  54. package/dist/mock-engine/context.d.ts +17 -0
  55. package/dist/mock-engine/context.d.ts.map +1 -0
  56. package/dist/mock-engine/context.js +92 -0
  57. package/dist/mock-engine/context.js.map +1 -0
  58. package/dist/mock-engine/data/actions.d.ts +4 -0
  59. package/dist/mock-engine/data/actions.d.ts.map +1 -0
  60. package/dist/mock-engine/data/actions.js +149 -0
  61. package/dist/mock-engine/data/actions.js.map +1 -0
  62. package/dist/mock-engine/data/query.d.ts +28 -0
  63. package/dist/mock-engine/data/query.d.ts.map +1 -0
  64. package/dist/mock-engine/data/query.js +402 -0
  65. package/dist/mock-engine/data/query.js.map +1 -0
  66. package/dist/mock-engine/data/record-codec.d.ts +28 -0
  67. package/dist/mock-engine/data/record-codec.d.ts.map +1 -0
  68. package/dist/mock-engine/data/record-codec.js +155 -0
  69. package/dist/mock-engine/data/record-codec.js.map +1 -0
  70. package/dist/mock-engine/data/resource-ops.d.ts +53 -0
  71. package/dist/mock-engine/data/resource-ops.d.ts.map +1 -0
  72. package/dist/mock-engine/data/resource-ops.js +461 -0
  73. package/dist/mock-engine/data/resource-ops.js.map +1 -0
  74. package/dist/mock-engine/data/seed.d.ts +21 -0
  75. package/dist/mock-engine/data/seed.d.ts.map +1 -0
  76. package/dist/mock-engine/data/seed.js +239 -0
  77. package/dist/mock-engine/data/seed.js.map +1 -0
  78. package/dist/mock-engine/data/validate-record.d.ts +30 -0
  79. package/dist/mock-engine/data/validate-record.d.ts.map +1 -0
  80. package/dist/mock-engine/data/validate-record.js +165 -0
  81. package/dist/mock-engine/data/validate-record.js.map +1 -0
  82. package/dist/mock-engine/definition.d.ts +31 -0
  83. package/dist/mock-engine/definition.d.ts.map +1 -0
  84. package/dist/mock-engine/definition.js +440 -0
  85. package/dist/mock-engine/definition.js.map +1 -0
  86. package/dist/mock-engine/engine.d.ts +75 -0
  87. package/dist/mock-engine/engine.d.ts.map +1 -0
  88. package/dist/mock-engine/engine.js +828 -0
  89. package/dist/mock-engine/engine.js.map +1 -0
  90. package/dist/mock-engine/faults.d.ts +38 -0
  91. package/dist/mock-engine/faults.d.ts.map +1 -0
  92. package/dist/mock-engine/faults.js +113 -0
  93. package/dist/mock-engine/faults.js.map +1 -0
  94. package/dist/mock-engine/helpers.d.ts +68 -0
  95. package/dist/mock-engine/helpers.d.ts.map +1 -0
  96. package/dist/mock-engine/helpers.js +388 -0
  97. package/dist/mock-engine/helpers.js.map +1 -0
  98. package/dist/mock-engine/import/build.d.ts +16 -0
  99. package/dist/mock-engine/import/build.d.ts.map +1 -0
  100. package/dist/mock-engine/import/build.js +435 -0
  101. package/dist/mock-engine/import/build.js.map +1 -0
  102. package/dist/mock-engine/import/index.d.ts +15 -0
  103. package/dist/mock-engine/import/index.d.ts.map +1 -0
  104. package/dist/mock-engine/import/index.js +92 -0
  105. package/dist/mock-engine/import/index.js.map +1 -0
  106. package/dist/mock-engine/import/openapi.d.ts +10 -0
  107. package/dist/mock-engine/import/openapi.d.ts.map +1 -0
  108. package/dist/mock-engine/import/openapi.js +199 -0
  109. package/dist/mock-engine/import/openapi.js.map +1 -0
  110. package/dist/mock-engine/import/paths.d.ts +16 -0
  111. package/dist/mock-engine/import/paths.d.ts.map +1 -0
  112. package/dist/mock-engine/import/paths.js +64 -0
  113. package/dist/mock-engine/import/paths.js.map +1 -0
  114. package/dist/mock-engine/import/postman.d.ts +21 -0
  115. package/dist/mock-engine/import/postman.d.ts.map +1 -0
  116. package/dist/mock-engine/import/postman.js +241 -0
  117. package/dist/mock-engine/import/postman.js.map +1 -0
  118. package/dist/mock-engine/import/report.d.ts +12 -0
  119. package/dist/mock-engine/import/report.d.ts.map +1 -0
  120. package/dist/mock-engine/import/report.js +39 -0
  121. package/dist/mock-engine/import/report.js.map +1 -0
  122. package/dist/mock-engine/import/types.d.ts +94 -0
  123. package/dist/mock-engine/import/types.d.ts.map +1 -0
  124. package/dist/mock-engine/import/types.js +6 -0
  125. package/dist/mock-engine/import/types.js.map +1 -0
  126. package/dist/mock-engine/index.d.ts +24 -0
  127. package/dist/mock-engine/index.d.ts.map +1 -0
  128. package/dist/mock-engine/index.js +27 -0
  129. package/dist/mock-engine/index.js.map +1 -0
  130. package/dist/mock-engine/legacy-builder.d.ts +27 -0
  131. package/dist/mock-engine/legacy-builder.d.ts.map +1 -0
  132. package/dist/mock-engine/legacy-builder.js +322 -0
  133. package/dist/mock-engine/legacy-builder.js.map +1 -0
  134. package/dist/mock-engine/memory-store.d.ts +73 -0
  135. package/dist/mock-engine/memory-store.d.ts.map +1 -0
  136. package/dist/mock-engine/memory-store.js +314 -0
  137. package/dist/mock-engine/memory-store.js.map +1 -0
  138. package/dist/mock-engine/node/ajv-body-validator.d.ts +13 -0
  139. package/dist/mock-engine/node/ajv-body-validator.d.ts.map +1 -0
  140. package/dist/mock-engine/node/ajv-body-validator.js +158 -0
  141. package/dist/mock-engine/node/ajv-body-validator.js.map +1 -0
  142. package/dist/mock-engine/node/file-store.d.ts +30 -0
  143. package/dist/mock-engine/node/file-store.d.ts.map +1 -0
  144. package/dist/mock-engine/node/file-store.js +116 -0
  145. package/dist/mock-engine/node/file-store.js.map +1 -0
  146. package/dist/mock-engine/node/index.d.ts +5 -0
  147. package/dist/mock-engine/node/index.d.ts.map +1 -0
  148. package/dist/mock-engine/node/index.js +8 -0
  149. package/dist/mock-engine/node/index.js.map +1 -0
  150. package/dist/mock-engine/node/node-http-adapter.d.ts +38 -0
  151. package/dist/mock-engine/node/node-http-adapter.d.ts.map +1 -0
  152. package/dist/mock-engine/node/node-http-adapter.js +215 -0
  153. package/dist/mock-engine/node/node-http-adapter.js.map +1 -0
  154. package/dist/mock-engine/node/vm-regex-runner.d.ts +14 -0
  155. package/dist/mock-engine/node/vm-regex-runner.d.ts.map +1 -0
  156. package/dist/mock-engine/node/vm-regex-runner.js +90 -0
  157. package/dist/mock-engine/node/vm-regex-runner.js.map +1 -0
  158. package/dist/mock-engine/render.d.ts +19 -0
  159. package/dist/mock-engine/render.d.ts.map +1 -0
  160. package/dist/mock-engine/render.js +57 -0
  161. package/dist/mock-engine/render.js.map +1 -0
  162. package/dist/mock-engine/routing.d.ts +48 -0
  163. package/dist/mock-engine/routing.d.ts.map +1 -0
  164. package/dist/mock-engine/routing.js +122 -0
  165. package/dist/mock-engine/routing.js.map +1 -0
  166. package/dist/mock-engine/templates.d.ts +58 -0
  167. package/dist/mock-engine/templates.d.ts.map +1 -0
  168. package/dist/mock-engine/templates.js +300 -0
  169. package/dist/mock-engine/templates.js.map +1 -0
  170. package/dist/mock-engine/testing/index.d.ts +13 -0
  171. package/dist/mock-engine/testing/index.d.ts.map +1 -0
  172. package/dist/mock-engine/testing/index.js +69 -0
  173. package/dist/mock-engine/testing/index.js.map +1 -0
  174. package/dist/mock-engine/types.d.ts +684 -0
  175. package/dist/mock-engine/types.d.ts.map +1 -0
  176. package/dist/mock-engine/types.js +7 -0
  177. package/dist/mock-engine/types.js.map +1 -0
  178. package/dist/mock-engine/util.d.ts +25 -0
  179. package/dist/mock-engine/util.d.ts.map +1 -0
  180. package/dist/mock-engine/util.js +143 -0
  181. package/dist/mock-engine/util.js.map +1 -0
  182. package/dist/openapi/index.d.ts +34 -0
  183. package/dist/openapi/index.d.ts.map +1 -0
  184. package/dist/openapi/index.js +246 -0
  185. package/dist/openapi/index.js.map +1 -0
  186. package/dist/runner/requestRunner.d.ts.map +1 -1
  187. package/dist/runner/requestRunner.js +6 -1
  188. package/dist/runner/requestRunner.js.map +1 -1
  189. package/dist/script/features/random.d.ts.map +1 -1
  190. package/dist/script/features/random.js +3 -1
  191. package/dist/script/features/random.js.map +1 -1
  192. package/dist/script/types.d.ts +5 -0
  193. package/dist/script/types.d.ts.map +1 -1
  194. package/dist/templating/postman-generators.d.ts +5 -0
  195. package/dist/templating/postman-generators.d.ts.map +1 -1
  196. package/dist/templating/postman-generators.js +19 -14
  197. package/dist/templating/postman-generators.js.map +1 -1
  198. package/dist/templating/random-generators.d.ts.map +1 -1
  199. package/dist/templating/random-generators.js +3 -1
  200. package/dist/templating/random-generators.js.map +1 -1
  201. package/dist/templating/random-source.d.ts +12 -0
  202. package/dist/templating/random-source.d.ts.map +1 -0
  203. package/dist/templating/random-source.js +38 -0
  204. package/dist/templating/random-source.js.map +1 -0
  205. package/dist-cjs/host/connections.js +8 -0
  206. package/dist-cjs/host/connections.js.map +1 -1
  207. package/dist-cjs/host/db/connectionMapping.js +3 -0
  208. package/dist-cjs/host/db/connectionMapping.js.map +1 -1
  209. package/dist-cjs/host/db/dbErrors.js +130 -0
  210. package/dist-cjs/host/db/dbErrors.js.map +1 -0
  211. package/dist-cjs/host/db/mongoAdapter.js +12 -2
  212. package/dist-cjs/host/db/mongoAdapter.js.map +1 -1
  213. package/dist-cjs/host/db/mysqlAdapter.js +2 -1
  214. package/dist-cjs/host/db/mysqlAdapter.js.map +1 -1
  215. package/dist-cjs/host/db/oracleAdapter.js +12 -1
  216. package/dist-cjs/host/db/oracleAdapter.js.map +1 -1
  217. package/dist-cjs/host/db/oracleConnectString.js +13 -4
  218. package/dist-cjs/host/db/oracleConnectString.js.map +1 -1
  219. package/dist-cjs/host/db/queryExecutor.js +6 -0
  220. package/dist-cjs/host/db/queryExecutor.js.map +1 -1
  221. package/dist-cjs/host/index.js +5 -2
  222. package/dist-cjs/host/index.js.map +1 -1
  223. package/dist-cjs/http/transportError.js +75 -0
  224. package/dist-cjs/http/transportError.js.map +1 -0
  225. package/dist-cjs/index.js +4 -1
  226. package/dist-cjs/index.js.map +1 -1
  227. package/dist-cjs/mock-engine/auth.js +96 -0
  228. package/dist-cjs/mock-engine/auth.js.map +1 -0
  229. package/dist-cjs/mock-engine/conditions.js +216 -0
  230. package/dist-cjs/mock-engine/conditions.js.map +1 -0
  231. package/dist-cjs/mock-engine/constants.js +116 -0
  232. package/dist-cjs/mock-engine/constants.js.map +1 -0
  233. package/dist-cjs/mock-engine/context.js +99 -0
  234. package/dist-cjs/mock-engine/context.js.map +1 -0
  235. package/dist-cjs/mock-engine/data/actions.js +153 -0
  236. package/dist-cjs/mock-engine/data/actions.js.map +1 -0
  237. package/dist-cjs/mock-engine/data/query.js +413 -0
  238. package/dist-cjs/mock-engine/data/query.js.map +1 -0
  239. package/dist-cjs/mock-engine/data/record-codec.js +165 -0
  240. package/dist-cjs/mock-engine/data/record-codec.js.map +1 -0
  241. package/dist-cjs/mock-engine/data/resource-ops.js +476 -0
  242. package/dist-cjs/mock-engine/data/resource-ops.js.map +1 -0
  243. package/dist-cjs/mock-engine/data/seed.js +246 -0
  244. package/dist-cjs/mock-engine/data/seed.js.map +1 -0
  245. package/dist-cjs/mock-engine/data/validate-record.js +170 -0
  246. package/dist-cjs/mock-engine/data/validate-record.js.map +1 -0
  247. package/dist-cjs/mock-engine/definition.js +454 -0
  248. package/dist-cjs/mock-engine/definition.js.map +1 -0
  249. package/dist-cjs/mock-engine/engine.js +837 -0
  250. package/dist-cjs/mock-engine/engine.js.map +1 -0
  251. package/dist-cjs/mock-engine/faults.js +117 -0
  252. package/dist-cjs/mock-engine/faults.js.map +1 -0
  253. package/dist-cjs/mock-engine/helpers.js +399 -0
  254. package/dist-cjs/mock-engine/helpers.js.map +1 -0
  255. package/dist-cjs/mock-engine/import/build.js +439 -0
  256. package/dist-cjs/mock-engine/import/build.js.map +1 -0
  257. package/dist-cjs/mock-engine/import/index.js +120 -0
  258. package/dist-cjs/mock-engine/import/index.js.map +1 -0
  259. package/dist-cjs/mock-engine/import/openapi.js +203 -0
  260. package/dist-cjs/mock-engine/import/openapi.js.map +1 -0
  261. package/dist-cjs/mock-engine/import/paths.js +72 -0
  262. package/dist-cjs/mock-engine/import/paths.js.map +1 -0
  263. package/dist-cjs/mock-engine/import/postman.js +247 -0
  264. package/dist-cjs/mock-engine/import/postman.js.map +1 -0
  265. package/dist-cjs/mock-engine/import/report.js +43 -0
  266. package/dist-cjs/mock-engine/import/report.js.map +1 -0
  267. package/dist-cjs/mock-engine/import/types.js +7 -0
  268. package/dist-cjs/mock-engine/import/types.js.map +1 -0
  269. package/dist-cjs/mock-engine/index.js +81 -0
  270. package/dist-cjs/mock-engine/index.js.map +1 -0
  271. package/dist-cjs/mock-engine/legacy-builder.js +327 -0
  272. package/dist-cjs/mock-engine/legacy-builder.js.map +1 -0
  273. package/dist-cjs/mock-engine/memory-store.js +318 -0
  274. package/dist-cjs/mock-engine/memory-store.js.map +1 -0
  275. package/dist-cjs/mock-engine/node/ajv-body-validator.js +166 -0
  276. package/dist-cjs/mock-engine/node/ajv-body-validator.js.map +1 -0
  277. package/dist-cjs/mock-engine/node/file-store.js +123 -0
  278. package/dist-cjs/mock-engine/node/file-store.js.map +1 -0
  279. package/dist-cjs/mock-engine/node/index.js +16 -0
  280. package/dist-cjs/mock-engine/node/index.js.map +1 -0
  281. package/dist-cjs/mock-engine/node/node-http-adapter.js +219 -0
  282. package/dist-cjs/mock-engine/node/node-http-adapter.js.map +1 -0
  283. package/dist-cjs/mock-engine/node/vm-regex-runner.js +97 -0
  284. package/dist-cjs/mock-engine/node/vm-regex-runner.js.map +1 -0
  285. package/dist-cjs/mock-engine/render.js +64 -0
  286. package/dist-cjs/mock-engine/render.js.map +1 -0
  287. package/dist-cjs/mock-engine/routing.js +130 -0
  288. package/dist-cjs/mock-engine/routing.js.map +1 -0
  289. package/dist-cjs/mock-engine/templates.js +308 -0
  290. package/dist-cjs/mock-engine/templates.js.map +1 -0
  291. package/dist-cjs/mock-engine/testing/index.js +72 -0
  292. package/dist-cjs/mock-engine/testing/index.js.map +1 -0
  293. package/dist-cjs/mock-engine/types.js +8 -0
  294. package/dist-cjs/mock-engine/types.js.map +1 -0
  295. package/dist-cjs/mock-engine/util.js +166 -0
  296. package/dist-cjs/mock-engine/util.js.map +1 -0
  297. package/dist-cjs/openapi/index.js +257 -0
  298. package/dist-cjs/openapi/index.js.map +1 -0
  299. package/dist-cjs/runner/requestRunner.js +6 -1
  300. package/dist-cjs/runner/requestRunner.js.map +1 -1
  301. package/dist-cjs/script/features/random.js +3 -1
  302. package/dist-cjs/script/features/random.js.map +1 -1
  303. package/dist-cjs/templating/postman-generators.js +21 -15
  304. package/dist-cjs/templating/postman-generators.js.map +1 -1
  305. package/dist-cjs/templating/random-generators.js +3 -1
  306. package/dist-cjs/templating/random-generators.js.map +1 -1
  307. package/dist-cjs/templating/random-source.js +44 -0
  308. package/dist-cjs/templating/random-source.js.map +1 -0
  309. package/package.json +29 -1
@@ -0,0 +1,318 @@
1
+ "use strict";
2
+ // In-memory MockDataStore — the reference implementation. Used by the
3
+ // renderer sandbox and tests, and as the base of the desktop FileDataStore.
4
+ //
5
+ // Every operation runs synchronously inside its async wrapper (no await
6
+ // between check and write), so unique values are atomic on one event loop.
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.MemoryDataStore = void 0;
9
+ const query_js_1 = require("./data/query.js");
10
+ const util_js_1 = require("./util.js");
11
+ const tokenField = (token) => {
12
+ const index = token.indexOf("\u001f");
13
+ return index <= 0 ? "#" : token.slice(0, index);
14
+ };
15
+ class MemoryDataStore {
16
+ mocks = new Map();
17
+ pending = new Map();
18
+ /** Called after every mutation (the file store persists on it). */
19
+ changed(_mockId) {
20
+ // no-op in memory
21
+ }
22
+ namespaces(mockId) {
23
+ let map = this.mocks.get(mockId);
24
+ if (!map) {
25
+ map = new Map();
26
+ this.mocks.set(mockId, map);
27
+ }
28
+ return map;
29
+ }
30
+ ns(scope, create = true) {
31
+ const map = this.namespaces(scope.mockId);
32
+ let state = map.get(scope.ns);
33
+ if (!state && create) {
34
+ const now = Date.now();
35
+ state = {
36
+ kind: scope.ns.startsWith("s:") ? "session" : "default",
37
+ ...(scope.ns.startsWith("s:") ? { sessionId: scope.ns.slice(2) } : {}),
38
+ createdAt: now,
39
+ lastSeenAt: now,
40
+ idleExpiresAt: null,
41
+ seq: new Map(),
42
+ resources: new Map(),
43
+ };
44
+ map.set(scope.ns, state);
45
+ }
46
+ return state;
47
+ }
48
+ res(scope, resource) {
49
+ const ns = this.ns(scope);
50
+ let state = ns.resources.get(resource);
51
+ if (!state) {
52
+ state = { nextOrdinal: 1, records: new Map(), uniq: new Map() };
53
+ ns.resources.set(resource, state);
54
+ }
55
+ return state;
56
+ }
57
+ insertSync(scope, doc) {
58
+ const state = this.res(scope, doc.resource);
59
+ for (const token of doc.uniq) {
60
+ if (state.uniq.has(token))
61
+ return { ok: false, reason: "conflict", field: tokenField(token) };
62
+ }
63
+ const stored = (0, util_js_1.deepClone)(doc);
64
+ stored.ordinal = stored.ordinal ?? state.nextOrdinal;
65
+ state.nextOrdinal = Math.max(state.nextOrdinal, stored.ordinal) + 1;
66
+ state.records.set(stored.key, stored);
67
+ for (const token of stored.uniq)
68
+ state.uniq.set(token, stored.key);
69
+ return { ok: true, doc: (0, util_js_1.deepClone)(stored) };
70
+ }
71
+ seedSync(scope, plan) {
72
+ const ns = this.ns(scope);
73
+ for (const doc of plan.docs)
74
+ this.insertSync(scope, doc);
75
+ for (const [resource, value] of Object.entries(plan.sequences)) {
76
+ ns.seq.set(resource, Math.max(ns.seq.get(resource) ?? 0, value));
77
+ }
78
+ }
79
+ async ensureNamespace(scope, seed, options) {
80
+ const key = `${scope.mockId}\u001f${scope.ns}`;
81
+ const inFlight = this.pending.get(key);
82
+ if (inFlight) {
83
+ await inFlight;
84
+ return { ok: true, created: false };
85
+ }
86
+ const map = this.namespaces(scope.mockId);
87
+ const existing = map.get(scope.ns);
88
+ if (existing) {
89
+ if (existing.idleExpiresAt !== null && existing.idleExpiresAt < options.now) {
90
+ map.delete(scope.ns);
91
+ }
92
+ else {
93
+ existing.lastSeenAt = options.now;
94
+ if (options.isSession)
95
+ existing.idleExpiresAt = options.now + options.idleTtlMs;
96
+ return { ok: true, created: false };
97
+ }
98
+ }
99
+ if (options.isSession) {
100
+ const active = [...map.values()].filter((ns) => ns.kind === "session" && (ns.idleExpiresAt === null || ns.idleExpiresAt >= options.now)).length;
101
+ if (active >= options.maxSessions)
102
+ return { ok: false, reason: "session-limit" };
103
+ }
104
+ const state = this.ns(scope);
105
+ state.createdAt = options.now;
106
+ state.lastSeenAt = options.now;
107
+ state.idleExpiresAt = options.isSession ? options.now + options.idleTtlMs : null;
108
+ const work = (async () => {
109
+ const plan = await seed();
110
+ this.seedSync(scope, plan);
111
+ this.changed(scope.mockId);
112
+ })();
113
+ this.pending.set(key, work);
114
+ try {
115
+ await work;
116
+ }
117
+ finally {
118
+ this.pending.delete(key);
119
+ }
120
+ return { ok: true, created: true };
121
+ }
122
+ async resetNamespace(scope, seed, now) {
123
+ const map = this.namespaces(scope.mockId);
124
+ const previous = map.get(scope.ns);
125
+ map.delete(scope.ns);
126
+ const state = this.ns(scope);
127
+ state.createdAt = previous?.createdAt ?? now;
128
+ state.lastSeenAt = now;
129
+ state.idleExpiresAt = previous?.idleExpiresAt ?? null;
130
+ this.seedSync(scope, seed);
131
+ this.changed(scope.mockId);
132
+ }
133
+ async dropNamespace(scope) {
134
+ this.namespaces(scope.mockId).delete(scope.ns);
135
+ this.changed(scope.mockId);
136
+ }
137
+ async listNamespaces(mockId) {
138
+ return [...this.namespaces(mockId).entries()].map(([ns, state]) => ({
139
+ ns,
140
+ kind: state.kind,
141
+ ...(state.sessionId ? { sessionId: state.sessionId } : {}),
142
+ createdAt: new Date(state.createdAt).toISOString(),
143
+ lastSeenAt: new Date(state.lastSeenAt).toISOString(),
144
+ idleExpiresAt: state.idleExpiresAt === null ? null : new Date(state.idleExpiresAt).toISOString(),
145
+ recordCount: [...state.resources.values()].reduce((sum, r) => sum + r.records.size, 0),
146
+ }));
147
+ }
148
+ /** Drop idle sessions (hosts call this on a timer). */
149
+ sweepExpired(mockId, now) {
150
+ const map = this.namespaces(mockId);
151
+ let removed = 0;
152
+ for (const [ns, state] of map) {
153
+ if (state.kind === "session" && state.idleExpiresAt !== null && state.idleExpiresAt < now) {
154
+ map.delete(ns);
155
+ removed += 1;
156
+ }
157
+ }
158
+ if (removed > 0)
159
+ this.changed(mockId);
160
+ return removed;
161
+ }
162
+ /** Forget everything stored for a mock (mock deleted). */
163
+ dropMock(mockId) {
164
+ this.mocks.delete(mockId);
165
+ this.changed(mockId);
166
+ }
167
+ async insert(scope, doc) {
168
+ const outcome = this.insertSync(scope, doc);
169
+ if (outcome.ok)
170
+ this.changed(scope.mockId);
171
+ return outcome;
172
+ }
173
+ async get(scope, resource, key) {
174
+ const doc = this.res(scope, resource).records.get(key);
175
+ return doc ? (0, util_js_1.deepClone)(doc) : null;
176
+ }
177
+ async getMany(scope, resource, keys) {
178
+ const records = this.res(scope, resource).records;
179
+ return keys.map((key) => records.get(key)).filter((doc) => !!doc).map((doc) => (0, util_js_1.deepClone)(doc));
180
+ }
181
+ async find(scope, resource, options) {
182
+ const all = [...this.res(scope, resource).records.values()].filter((doc) => (0, query_js_1.matchesFilter)(doc, options.filter));
183
+ const sorted = (0, query_js_1.sortDocs)(all, options.sort ?? []);
184
+ const skip = Math.max(0, options.skip ?? 0);
185
+ const limited = options.limit === undefined ? sorted.slice(skip) : sorted.slice(skip, skip + Math.max(0, options.limit));
186
+ return { docs: limited.map((doc) => (0, util_js_1.deepClone)(doc)), total: options.noTotal ? limited.length : all.length };
187
+ }
188
+ async count(scope, resource, filter, limit) {
189
+ let count = 0;
190
+ for (const doc of this.res(scope, resource).records.values()) {
191
+ if ((0, query_js_1.matchesFilter)(doc, filter)) {
192
+ count += 1;
193
+ if (limit !== undefined && count >= limit)
194
+ break;
195
+ }
196
+ }
197
+ return count;
198
+ }
199
+ async countNamespace(scope, limit) {
200
+ const ns = this.ns(scope);
201
+ if (!ns)
202
+ return 0;
203
+ let total = 0;
204
+ for (const state of ns.resources.values()) {
205
+ total += state.records.size;
206
+ if (limit !== undefined && total >= limit)
207
+ return total;
208
+ }
209
+ return total;
210
+ }
211
+ async replace(scope, resource, key, expectedRev, doc) {
212
+ const state = this.res(scope, resource);
213
+ const current = state.records.get(key);
214
+ if (!current)
215
+ return { ok: false, reason: "notFound" };
216
+ if (current.rev !== expectedRev)
217
+ return { ok: false, reason: "stale" };
218
+ for (const token of doc.uniq) {
219
+ const owner = state.uniq.get(token);
220
+ if (owner !== undefined && owner !== key)
221
+ return { ok: false, reason: "conflict", field: tokenField(token) };
222
+ }
223
+ for (const token of current.uniq)
224
+ state.uniq.delete(token);
225
+ const stored = (0, util_js_1.deepClone)({ ...doc, key, ordinal: current.ordinal });
226
+ state.records.set(key, stored);
227
+ for (const token of stored.uniq)
228
+ state.uniq.set(token, key);
229
+ this.changed(scope.mockId);
230
+ return { ok: true, doc: (0, util_js_1.deepClone)(stored) };
231
+ }
232
+ async delete(scope, resource, keys) {
233
+ const state = this.res(scope, resource);
234
+ let removed = 0;
235
+ for (const key of keys) {
236
+ const doc = state.records.get(key);
237
+ if (!doc)
238
+ continue;
239
+ for (const token of doc.uniq)
240
+ state.uniq.delete(token);
241
+ state.records.delete(key);
242
+ removed += 1;
243
+ }
244
+ if (removed > 0)
245
+ this.changed(scope.mockId);
246
+ return removed;
247
+ }
248
+ async clearResource(scope, resource) {
249
+ const state = this.res(scope, resource);
250
+ const removed = state.records.size;
251
+ state.records.clear();
252
+ state.uniq.clear();
253
+ if (removed > 0)
254
+ this.changed(scope.mockId);
255
+ return removed;
256
+ }
257
+ async nextSequence(scope, resource) {
258
+ const ns = this.ns(scope);
259
+ const next = (ns.seq.get(resource) ?? 0) + 1;
260
+ ns.seq.set(resource, next);
261
+ this.changed(scope.mockId);
262
+ return next;
263
+ }
264
+ async bumpSequence(scope, resource, value) {
265
+ const ns = this.ns(scope);
266
+ if (value > (ns.seq.get(resource) ?? 0)) {
267
+ ns.seq.set(resource, value);
268
+ this.changed(scope.mockId);
269
+ }
270
+ }
271
+ // ── Serialisation (file store) ──────────────────────────────────────
272
+ serialize(mockId) {
273
+ const out = { formatVersion: 1, namespaces: {} };
274
+ for (const [ns, state] of this.namespaces(mockId)) {
275
+ const resources = {};
276
+ for (const [resource, rs] of state.resources)
277
+ resources[resource] = { nextOrdinal: rs.nextOrdinal, records: [...rs.records.values()] };
278
+ out.namespaces[ns] = {
279
+ kind: state.kind,
280
+ ...(state.sessionId ? { sessionId: state.sessionId } : {}),
281
+ createdAt: state.createdAt,
282
+ lastSeenAt: state.lastSeenAt,
283
+ idleExpiresAt: state.idleExpiresAt,
284
+ seq: Object.fromEntries(state.seq),
285
+ resources,
286
+ };
287
+ }
288
+ return out;
289
+ }
290
+ hydrate(mockId, data) {
291
+ const map = new Map();
292
+ for (const [ns, raw] of Object.entries(data?.namespaces ?? {})) {
293
+ const resources = new Map();
294
+ for (const [resource, rs] of Object.entries(raw.resources ?? {})) {
295
+ const records = new Map();
296
+ const uniq = new Map();
297
+ for (const doc of rs.records ?? []) {
298
+ records.set(doc.key, doc);
299
+ for (const token of doc.uniq ?? [])
300
+ uniq.set(token, doc.key);
301
+ }
302
+ resources.set(resource, { nextOrdinal: rs.nextOrdinal ?? records.size + 1, records, uniq });
303
+ }
304
+ map.set(ns, {
305
+ kind: raw.kind,
306
+ ...(raw.sessionId ? { sessionId: raw.sessionId } : {}),
307
+ createdAt: raw.createdAt,
308
+ lastSeenAt: raw.lastSeenAt,
309
+ idleExpiresAt: raw.idleExpiresAt,
310
+ seq: new Map(Object.entries(raw.seq ?? {})),
311
+ resources,
312
+ });
313
+ }
314
+ this.mocks.set(mockId, map);
315
+ }
316
+ }
317
+ exports.MemoryDataStore = MemoryDataStore;
318
+ //# sourceMappingURL=memory-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../../src/mock-engine/memory-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ // Request-body validation for mock routes (`requestValidation.mode ===
3
+ // "schema"`): JSON Schema draft-07 through Ajv. A mismatch is a flat list of
4
+ // `{ field, message }` that the engine answers with a 400.
5
+ //
6
+ // Strictness: unknown properties are REJECTED by default —
7
+ // `additionalProperties: false` is injected into every object subschema that
8
+ // doesn't set it (an author opts out per object with `true`). The injection
9
+ // runs on a deep clone; the stored schema is never mutated.
10
+ //
11
+ // Compiled validators are cached by the schema's JSON text, least recently
12
+ // used first out. Eviction also calls `ajv.removeSchema` on the exact object
13
+ // Ajv cached — Ajv keeps every compiled schema in a strong `_cache`, so
14
+ // without it the process grows until it is killed.
15
+ var __importDefault = (this && this.__importDefault) || function (mod) {
16
+ return (mod && mod.__esModule) ? mod : { "default": mod };
17
+ };
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.createAjvBodyValidator = exports.normalizeStrictSchema = void 0;
20
+ const ajv_1 = __importDefault(require("ajv"));
21
+ const ajv_formats_1 = __importDefault(require("ajv-formats"));
22
+ const isPlainObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
23
+ /** Deep clone with `additionalProperties: false` on object subschemas that don't declare it. */
24
+ const normalizeStrictSchema = (schema) => {
25
+ if (Array.isArray(schema)) {
26
+ return schema.map((entry) => (0, exports.normalizeStrictSchema)(entry));
27
+ }
28
+ if (!isPlainObject(schema)) {
29
+ return schema;
30
+ }
31
+ const next = {};
32
+ for (const [key, value] of Object.entries(schema)) {
33
+ if (key === "properties" && isPlainObject(value)) {
34
+ const props = {};
35
+ for (const [propKey, propValue] of Object.entries(value)) {
36
+ props[propKey] = (0, exports.normalizeStrictSchema)(propValue);
37
+ }
38
+ next[key] = props;
39
+ }
40
+ else if (key === "items" ||
41
+ key === "additionalProperties" ||
42
+ key === "contains" ||
43
+ key === "not" ||
44
+ key === "if" ||
45
+ key === "then" ||
46
+ key === "else") {
47
+ next[key] = (0, exports.normalizeStrictSchema)(value);
48
+ }
49
+ else if ((key === "allOf" || key === "anyOf" || key === "oneOf") && Array.isArray(value)) {
50
+ next[key] = value.map((entry) => (0, exports.normalizeStrictSchema)(entry));
51
+ }
52
+ else if ((key === "$defs" || key === "definitions") && isPlainObject(value)) {
53
+ const defs = {};
54
+ for (const [defKey, defValue] of Object.entries(value)) {
55
+ defs[defKey] = (0, exports.normalizeStrictSchema)(defValue);
56
+ }
57
+ next[key] = defs;
58
+ }
59
+ else {
60
+ next[key] = value;
61
+ }
62
+ }
63
+ const looksLikeObjectSchema = next.type === "object" || isPlainObject(next.properties);
64
+ if (looksLikeObjectSchema && next.additionalProperties === undefined) {
65
+ next.additionalProperties = false;
66
+ }
67
+ return next;
68
+ };
69
+ exports.normalizeStrictSchema = normalizeStrictSchema;
70
+ // JSON Pointer (`/user/email`) → dotted path (`user.email`); root → `(body)`.
71
+ const toFieldPath = (instancePath, extra) => {
72
+ const base = instancePath.replace(/^\//, "").replace(/~1/g, "/").replace(/~0/g, "~").replace(/\//g, ".");
73
+ const combined = extra ? (base ? `${base}.${extra}` : extra) : base;
74
+ return combined || "(body)";
75
+ };
76
+ const createAjvBodyValidator = (options = {}) => {
77
+ const cacheLimit = options.cacheLimit ?? 500;
78
+ const ajv = new ajv_1.default({ allErrors: true, strict: false });
79
+ (0, ajv_formats_1.default)(ajv);
80
+ const validators = new Map();
81
+ const compile = (schema) => {
82
+ const compiled = (0, exports.normalizeStrictSchema)(schema);
83
+ // A root `$id` registers the schema globally; a second mock reusing it
84
+ // would fail with "schema already exists". `compiled` is a fresh clone.
85
+ if (isPlainObject(compiled))
86
+ delete compiled.$id;
87
+ return { validate: ajv.compile(compiled), compiled: compiled };
88
+ };
89
+ const getValidator = (schema) => {
90
+ const key = JSON.stringify(schema) ?? "undefined";
91
+ const hit = validators.get(key);
92
+ if (hit) {
93
+ validators.delete(key);
94
+ validators.set(key, hit);
95
+ return hit.validate;
96
+ }
97
+ const entry = compile(schema);
98
+ validators.set(key, entry);
99
+ if (validators.size > cacheLimit) {
100
+ const oldestKey = validators.keys().next().value;
101
+ if (oldestKey !== undefined) {
102
+ const oldest = validators.get(oldestKey);
103
+ validators.delete(oldestKey);
104
+ if (oldest)
105
+ ajv.removeSchema(oldest.compiled);
106
+ }
107
+ }
108
+ return entry.validate;
109
+ };
110
+ const validate = (schema, body) => {
111
+ let check;
112
+ try {
113
+ check = getValidator(schema);
114
+ }
115
+ catch {
116
+ // A schema that no longer compiles must not turn every call into a 500.
117
+ return null;
118
+ }
119
+ if (check(body))
120
+ return null;
121
+ const fields = [];
122
+ const seen = new Set();
123
+ for (const err of check.errors ?? []) {
124
+ let field;
125
+ let message;
126
+ if (err.keyword === "required") {
127
+ field = toFieldPath(err.instancePath, err.params.missingProperty);
128
+ message = "is required";
129
+ }
130
+ else if (err.keyword === "additionalProperties") {
131
+ field = toFieldPath(err.instancePath, err.params.additionalProperty);
132
+ message = "is not an allowed field";
133
+ }
134
+ else {
135
+ field = toFieldPath(err.instancePath);
136
+ message = err.message ?? "is invalid";
137
+ }
138
+ const dedupeKey = `${field}::${message}`;
139
+ if (!seen.has(dedupeKey)) {
140
+ seen.add(dedupeKey);
141
+ fields.push({ field, message });
142
+ }
143
+ }
144
+ return fields.length > 0 ? fields : [{ field: "(body)", message: "is invalid" }];
145
+ };
146
+ return {
147
+ validate,
148
+ compileError(schema) {
149
+ try {
150
+ // Through the cache: the first request reuses this compile.
151
+ getValidator(schema);
152
+ return null;
153
+ }
154
+ catch (error) {
155
+ return error instanceof Error ? error.message : "Invalid JSON Schema";
156
+ }
157
+ },
158
+ clear() {
159
+ for (const entry of validators.values())
160
+ ajv.removeSchema(entry.compiled);
161
+ validators.clear();
162
+ },
163
+ };
164
+ };
165
+ exports.createAjvBodyValidator = createAjvBodyValidator;
166
+ //# sourceMappingURL=ajv-body-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ajv-body-validator.js","sourceRoot":"","sources":["../../../src/mock-engine/node/ajv-body-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ // FileDataStore — the in-memory store persisted to one JSON file per mock
3
+ // (desktop local mocks). Writes are batched (write-behind, 250 ms) and land
4
+ // atomically: tmp file + rename, so a crash never leaves half a file.
5
+ //
6
+ // Hosts `open(mockId)` before serving a mock, `flush` on shutdown and
7
+ // `remove` when the mock is deleted.
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.FileDataStore = void 0;
13
+ const node_fs_1 = require("node:fs");
14
+ const node_path_1 = __importDefault(require("node:path"));
15
+ const memory_store_js_1 = require("../memory-store.js");
16
+ const SAFE_ID = /^[A-Za-z0-9._-]{1,128}$/;
17
+ class FileDataStore extends memory_store_js_1.MemoryDataStore {
18
+ dir;
19
+ debounceMs;
20
+ onError;
21
+ timers = new Map();
22
+ writing = new Map();
23
+ opened = new Set();
24
+ constructor(options) {
25
+ super();
26
+ this.dir = options.dir;
27
+ this.debounceMs = options.debounceMs ?? 250;
28
+ this.onError = options.onError;
29
+ }
30
+ fileOf(mockId) {
31
+ if (!SAFE_ID.test(mockId))
32
+ throw new Error(`Invalid mock id "${mockId}"`);
33
+ return node_path_1.default.join(this.dir, `${mockId}.json`);
34
+ }
35
+ /** Load a mock's data from disk (once). A missing or corrupt file starts empty. */
36
+ async open(mockId) {
37
+ if (this.opened.has(mockId))
38
+ return;
39
+ let data = null;
40
+ try {
41
+ const raw = await node_fs_1.promises.readFile(this.fileOf(mockId), "utf-8");
42
+ const parsed = JSON.parse(raw);
43
+ if (parsed && parsed.formatVersion === 1)
44
+ data = parsed;
45
+ }
46
+ catch (error) {
47
+ if (error.code !== "ENOENT") {
48
+ // Keep the unreadable file for inspection; start fresh.
49
+ await node_fs_1.promises.rename(this.fileOf(mockId), `${this.fileOf(mockId)}.corrupt-${Date.now()}`).catch(() => undefined);
50
+ this.onError?.(error, mockId);
51
+ }
52
+ }
53
+ this.hydrate(mockId, data);
54
+ this.opened.add(mockId);
55
+ }
56
+ isOpen(mockId) {
57
+ return this.opened.has(mockId);
58
+ }
59
+ changed(mockId) {
60
+ if (!this.opened.has(mockId))
61
+ return;
62
+ const existing = this.timers.get(mockId);
63
+ if (existing)
64
+ clearTimeout(existing);
65
+ this.timers.set(mockId, setTimeout(() => {
66
+ this.timers.delete(mockId);
67
+ void this.write(mockId);
68
+ }, this.debounceMs));
69
+ }
70
+ async write(mockId) {
71
+ const previous = this.writing.get(mockId) ?? Promise.resolve();
72
+ const next = previous.then(async () => {
73
+ try {
74
+ await node_fs_1.promises.mkdir(this.dir, { recursive: true });
75
+ const target = this.fileOf(mockId);
76
+ const tmp = `${target}.tmp`;
77
+ await node_fs_1.promises.writeFile(tmp, JSON.stringify(this.serialize(mockId)), "utf-8");
78
+ await node_fs_1.promises.rename(tmp, target);
79
+ }
80
+ catch (error) {
81
+ this.onError?.(error, mockId);
82
+ }
83
+ });
84
+ this.writing.set(mockId, next);
85
+ await next;
86
+ if (this.writing.get(mockId) === next)
87
+ this.writing.delete(mockId);
88
+ }
89
+ /** Write pending changes now (shutdown, before export). */
90
+ async flush(mockId) {
91
+ const ids = mockId ? [mockId] : [...new Set([...this.timers.keys(), ...this.writing.keys()])];
92
+ await Promise.all(ids.map(async (id) => {
93
+ const timer = this.timers.get(id);
94
+ if (timer) {
95
+ clearTimeout(timer);
96
+ this.timers.delete(id);
97
+ await this.write(id);
98
+ }
99
+ else {
100
+ await this.writing.get(id);
101
+ }
102
+ }));
103
+ }
104
+ /** Close a mock: flush and forget it from memory. */
105
+ async close(mockId) {
106
+ await this.flush(mockId);
107
+ this.mocks.delete(mockId);
108
+ this.opened.delete(mockId);
109
+ }
110
+ /** Delete a mock's data, in memory and on disk. */
111
+ async remove(mockId) {
112
+ const timer = this.timers.get(mockId);
113
+ if (timer)
114
+ clearTimeout(timer);
115
+ this.timers.delete(mockId);
116
+ await this.writing.get(mockId);
117
+ this.opened.delete(mockId);
118
+ this.mocks.delete(mockId);
119
+ await node_fs_1.promises.rm(this.fileOf(mockId), { force: true });
120
+ }
121
+ }
122
+ exports.FileDataStore = FileDataStore;
123
+ //# sourceMappingURL=file-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-store.js","sourceRoot":"","sources":["../../../src/mock-engine/node/file-store.ts"],"names":[],"mappings":"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"}