mocktp 0.0.1-security → 3.15.3

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.

Potentially problematic release.


This version of mocktp might be problematic. Click here for more details.

Files changed (304) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +123 -3
  3. package/custom-typings/Function.d.ts +4 -0
  4. package/custom-typings/cors-gate.d.ts +13 -0
  5. package/custom-typings/http-proxy-agent.d.ts +9 -0
  6. package/custom-typings/node-type-extensions.d.ts +115 -0
  7. package/custom-typings/proxy-agent-modules.d.ts +5 -0
  8. package/custom-typings/request-promise-native.d.ts +28 -0
  9. package/custom-typings/zstd-codec.d.ts +20 -0
  10. package/dist/admin/admin-bin.d.ts +3 -0
  11. package/dist/admin/admin-bin.d.ts.map +1 -0
  12. package/dist/admin/admin-bin.js +61 -0
  13. package/dist/admin/admin-bin.js.map +1 -0
  14. package/dist/admin/admin-plugin-types.d.ts +29 -0
  15. package/dist/admin/admin-plugin-types.d.ts.map +1 -0
  16. package/dist/admin/admin-plugin-types.js +3 -0
  17. package/dist/admin/admin-plugin-types.js.map +1 -0
  18. package/dist/admin/admin-server.d.ts +98 -0
  19. package/dist/admin/admin-server.d.ts.map +1 -0
  20. package/dist/admin/admin-server.js +426 -0
  21. package/dist/admin/admin-server.js.map +1 -0
  22. package/dist/admin/graphql-utils.d.ts +4 -0
  23. package/dist/admin/graphql-utils.d.ts.map +1 -0
  24. package/dist/admin/graphql-utils.js +28 -0
  25. package/dist/admin/graphql-utils.js.map +1 -0
  26. package/dist/admin/mockttp-admin-model.d.ts +7 -0
  27. package/dist/admin/mockttp-admin-model.d.ts.map +1 -0
  28. package/dist/admin/mockttp-admin-model.js +214 -0
  29. package/dist/admin/mockttp-admin-model.js.map +1 -0
  30. package/dist/admin/mockttp-admin-plugin.d.ts +28 -0
  31. package/dist/admin/mockttp-admin-plugin.d.ts.map +1 -0
  32. package/dist/admin/mockttp-admin-plugin.js +37 -0
  33. package/dist/admin/mockttp-admin-plugin.js.map +1 -0
  34. package/dist/admin/mockttp-admin-server.d.ts +16 -0
  35. package/dist/admin/mockttp-admin-server.d.ts.map +1 -0
  36. package/dist/admin/mockttp-admin-server.js +17 -0
  37. package/dist/admin/mockttp-admin-server.js.map +1 -0
  38. package/dist/admin/mockttp-schema.d.ts +2 -0
  39. package/dist/admin/mockttp-schema.d.ts.map +1 -0
  40. package/dist/admin/mockttp-schema.js +225 -0
  41. package/dist/admin/mockttp-schema.js.map +1 -0
  42. package/dist/client/admin-client.d.ts +112 -0
  43. package/dist/client/admin-client.d.ts.map +1 -0
  44. package/dist/client/admin-client.js +511 -0
  45. package/dist/client/admin-client.js.map +1 -0
  46. package/dist/client/admin-query.d.ts +13 -0
  47. package/dist/client/admin-query.d.ts.map +1 -0
  48. package/dist/client/admin-query.js +26 -0
  49. package/dist/client/admin-query.js.map +1 -0
  50. package/dist/client/mocked-endpoint-client.d.ts +12 -0
  51. package/dist/client/mocked-endpoint-client.d.ts.map +1 -0
  52. package/dist/client/mocked-endpoint-client.js +33 -0
  53. package/dist/client/mocked-endpoint-client.js.map +1 -0
  54. package/dist/client/mockttp-admin-request-builder.d.ts +38 -0
  55. package/dist/client/mockttp-admin-request-builder.d.ts.map +1 -0
  56. package/dist/client/mockttp-admin-request-builder.js +462 -0
  57. package/dist/client/mockttp-admin-request-builder.js.map +1 -0
  58. package/dist/client/mockttp-client.d.ts +56 -0
  59. package/dist/client/mockttp-client.d.ts.map +1 -0
  60. package/dist/client/mockttp-client.js +112 -0
  61. package/dist/client/mockttp-client.js.map +1 -0
  62. package/dist/client/schema-introspection.d.ts +11 -0
  63. package/dist/client/schema-introspection.d.ts.map +1 -0
  64. package/dist/client/schema-introspection.js +128 -0
  65. package/dist/client/schema-introspection.js.map +1 -0
  66. package/dist/main.browser.d.ts +49 -0
  67. package/dist/main.browser.d.ts.map +1 -0
  68. package/dist/main.browser.js +57 -0
  69. package/dist/main.browser.js.map +1 -0
  70. package/dist/main.d.ts +86 -0
  71. package/dist/main.d.ts.map +1 -0
  72. package/dist/main.js +108 -0
  73. package/dist/main.js.map +1 -0
  74. package/dist/mockttp.d.ts +774 -0
  75. package/dist/mockttp.d.ts.map +1 -0
  76. package/dist/mockttp.js +81 -0
  77. package/dist/mockttp.js.map +1 -0
  78. package/dist/pluggable-admin-api/mockttp-pluggable-admin.browser.d.ts +5 -0
  79. package/dist/pluggable-admin-api/mockttp-pluggable-admin.browser.d.ts.map +1 -0
  80. package/dist/pluggable-admin-api/mockttp-pluggable-admin.browser.js +12 -0
  81. package/dist/pluggable-admin-api/mockttp-pluggable-admin.browser.js.map +1 -0
  82. package/dist/pluggable-admin-api/mockttp-pluggable-admin.d.ts +8 -0
  83. package/dist/pluggable-admin-api/mockttp-pluggable-admin.d.ts.map +1 -0
  84. package/dist/pluggable-admin-api/mockttp-pluggable-admin.js +13 -0
  85. package/dist/pluggable-admin-api/mockttp-pluggable-admin.js.map +1 -0
  86. package/dist/pluggable-admin-api/pluggable-admin.browser.d.ts +6 -0
  87. package/dist/pluggable-admin-api/pluggable-admin.browser.d.ts.map +1 -0
  88. package/dist/pluggable-admin-api/pluggable-admin.browser.js +13 -0
  89. package/dist/pluggable-admin-api/pluggable-admin.browser.js.map +1 -0
  90. package/dist/pluggable-admin-api/pluggable-admin.d.ts +18 -0
  91. package/dist/pluggable-admin-api/pluggable-admin.d.ts.map +1 -0
  92. package/dist/pluggable-admin-api/pluggable-admin.js +20 -0
  93. package/dist/pluggable-admin-api/pluggable-admin.js.map +1 -0
  94. package/dist/rules/base-rule-builder.d.ts +185 -0
  95. package/dist/rules/base-rule-builder.d.ts.map +1 -0
  96. package/dist/rules/base-rule-builder.js +251 -0
  97. package/dist/rules/base-rule-builder.js.map +1 -0
  98. package/dist/rules/completion-checkers.d.ts +41 -0
  99. package/dist/rules/completion-checkers.d.ts.map +1 -0
  100. package/dist/rules/completion-checkers.js +87 -0
  101. package/dist/rules/completion-checkers.js.map +1 -0
  102. package/dist/rules/http-agents.d.ts +11 -0
  103. package/dist/rules/http-agents.d.ts.map +1 -0
  104. package/dist/rules/http-agents.js +91 -0
  105. package/dist/rules/http-agents.js.map +1 -0
  106. package/dist/rules/matchers.d.ts +214 -0
  107. package/dist/rules/matchers.d.ts.map +1 -0
  108. package/dist/rules/matchers.js +515 -0
  109. package/dist/rules/matchers.js.map +1 -0
  110. package/dist/rules/passthrough-handling-definitions.d.ts +106 -0
  111. package/dist/rules/passthrough-handling-definitions.d.ts.map +1 -0
  112. package/dist/rules/passthrough-handling-definitions.js +3 -0
  113. package/dist/rules/passthrough-handling-definitions.js.map +1 -0
  114. package/dist/rules/passthrough-handling.d.ts +33 -0
  115. package/dist/rules/passthrough-handling.d.ts.map +1 -0
  116. package/dist/rules/passthrough-handling.js +294 -0
  117. package/dist/rules/passthrough-handling.js.map +1 -0
  118. package/dist/rules/proxy-config.d.ts +76 -0
  119. package/dist/rules/proxy-config.d.ts.map +1 -0
  120. package/dist/rules/proxy-config.js +48 -0
  121. package/dist/rules/proxy-config.js.map +1 -0
  122. package/dist/rules/requests/request-handler-definitions.d.ts +600 -0
  123. package/dist/rules/requests/request-handler-definitions.d.ts.map +1 -0
  124. package/dist/rules/requests/request-handler-definitions.js +423 -0
  125. package/dist/rules/requests/request-handler-definitions.js.map +1 -0
  126. package/dist/rules/requests/request-handlers.d.ts +65 -0
  127. package/dist/rules/requests/request-handlers.d.ts.map +1 -0
  128. package/dist/rules/requests/request-handlers.js +1014 -0
  129. package/dist/rules/requests/request-handlers.js.map +1 -0
  130. package/dist/rules/requests/request-rule-builder.d.ts +255 -0
  131. package/dist/rules/requests/request-rule-builder.d.ts.map +1 -0
  132. package/dist/rules/requests/request-rule-builder.js +340 -0
  133. package/dist/rules/requests/request-rule-builder.js.map +1 -0
  134. package/dist/rules/requests/request-rule.d.ts +36 -0
  135. package/dist/rules/requests/request-rule.d.ts.map +1 -0
  136. package/dist/rules/requests/request-rule.js +100 -0
  137. package/dist/rules/requests/request-rule.js.map +1 -0
  138. package/dist/rules/rule-deserialization.d.ts +8 -0
  139. package/dist/rules/rule-deserialization.d.ts.map +1 -0
  140. package/dist/rules/rule-deserialization.js +27 -0
  141. package/dist/rules/rule-deserialization.js.map +1 -0
  142. package/dist/rules/rule-parameters.d.ts +21 -0
  143. package/dist/rules/rule-parameters.d.ts.map +1 -0
  144. package/dist/rules/rule-parameters.js +31 -0
  145. package/dist/rules/rule-parameters.js.map +1 -0
  146. package/dist/rules/rule-serialization.d.ts +7 -0
  147. package/dist/rules/rule-serialization.d.ts.map +1 -0
  148. package/dist/rules/rule-serialization.js +25 -0
  149. package/dist/rules/rule-serialization.js.map +1 -0
  150. package/dist/rules/websockets/websocket-handler-definitions.d.ts +78 -0
  151. package/dist/rules/websockets/websocket-handler-definitions.d.ts.map +1 -0
  152. package/dist/rules/websockets/websocket-handler-definitions.js +118 -0
  153. package/dist/rules/websockets/websocket-handler-definitions.js.map +1 -0
  154. package/dist/rules/websockets/websocket-handlers.d.ts +39 -0
  155. package/dist/rules/websockets/websocket-handlers.d.ts.map +1 -0
  156. package/dist/rules/websockets/websocket-handlers.js +356 -0
  157. package/dist/rules/websockets/websocket-handlers.js.map +1 -0
  158. package/dist/rules/websockets/websocket-rule-builder.d.ts +173 -0
  159. package/dist/rules/websockets/websocket-rule-builder.d.ts.map +1 -0
  160. package/dist/rules/websockets/websocket-rule-builder.js +232 -0
  161. package/dist/rules/websockets/websocket-rule-builder.js.map +1 -0
  162. package/dist/rules/websockets/websocket-rule.d.ts +34 -0
  163. package/dist/rules/websockets/websocket-rule.d.ts.map +1 -0
  164. package/dist/rules/websockets/websocket-rule.js +87 -0
  165. package/dist/rules/websockets/websocket-rule.js.map +1 -0
  166. package/dist/serialization/body-serialization.d.ts +43 -0
  167. package/dist/serialization/body-serialization.d.ts.map +1 -0
  168. package/dist/serialization/body-serialization.js +70 -0
  169. package/dist/serialization/body-serialization.js.map +1 -0
  170. package/dist/serialization/serialization.d.ts +63 -0
  171. package/dist/serialization/serialization.d.ts.map +1 -0
  172. package/dist/serialization/serialization.js +263 -0
  173. package/dist/serialization/serialization.js.map +1 -0
  174. package/dist/server/http-combo-server.d.ts +13 -0
  175. package/dist/server/http-combo-server.d.ts.map +1 -0
  176. package/dist/server/http-combo-server.js +330 -0
  177. package/dist/server/http-combo-server.js.map +1 -0
  178. package/dist/server/mocked-endpoint.d.ts +14 -0
  179. package/dist/server/mocked-endpoint.d.ts.map +1 -0
  180. package/dist/server/mocked-endpoint.js +40 -0
  181. package/dist/server/mocked-endpoint.js.map +1 -0
  182. package/dist/server/mockttp-server.d.ts +87 -0
  183. package/dist/server/mockttp-server.d.ts.map +1 -0
  184. package/dist/server/mockttp-server.js +859 -0
  185. package/dist/server/mockttp-server.js.map +1 -0
  186. package/dist/types.d.ts +359 -0
  187. package/dist/types.d.ts.map +1 -0
  188. package/dist/types.js +20 -0
  189. package/dist/types.js.map +1 -0
  190. package/dist/util/buffer-utils.d.ts +13 -0
  191. package/dist/util/buffer-utils.d.ts.map +1 -0
  192. package/dist/util/buffer-utils.js +141 -0
  193. package/dist/util/buffer-utils.js.map +1 -0
  194. package/dist/util/dns.d.ts +11 -0
  195. package/dist/util/dns.d.ts.map +1 -0
  196. package/dist/util/dns.js +47 -0
  197. package/dist/util/dns.js.map +1 -0
  198. package/dist/util/error.d.ts +9 -0
  199. package/dist/util/error.d.ts.map +1 -0
  200. package/dist/util/error.js +11 -0
  201. package/dist/util/error.js.map +1 -0
  202. package/dist/util/header-utils.d.ts +35 -0
  203. package/dist/util/header-utils.d.ts.map +1 -0
  204. package/dist/util/header-utils.js +200 -0
  205. package/dist/util/header-utils.js.map +1 -0
  206. package/dist/util/openssl-compat.d.ts +2 -0
  207. package/dist/util/openssl-compat.d.ts.map +1 -0
  208. package/dist/util/openssl-compat.js +26 -0
  209. package/dist/util/openssl-compat.js.map +1 -0
  210. package/dist/util/promise.d.ts +10 -0
  211. package/dist/util/promise.d.ts.map +1 -0
  212. package/dist/util/promise.js +25 -0
  213. package/dist/util/promise.js.map +1 -0
  214. package/dist/util/request-utils.d.ts +46 -0
  215. package/dist/util/request-utils.d.ts.map +1 -0
  216. package/dist/util/request-utils.js +462 -0
  217. package/dist/util/request-utils.js.map +1 -0
  218. package/dist/util/server-utils.d.ts +2 -0
  219. package/dist/util/server-utils.d.ts.map +1 -0
  220. package/dist/util/server-utils.js +14 -0
  221. package/dist/util/server-utils.js.map +1 -0
  222. package/dist/util/socket-util.d.ts +28 -0
  223. package/dist/util/socket-util.d.ts.map +1 -0
  224. package/dist/util/socket-util.js +174 -0
  225. package/dist/util/socket-util.js.map +1 -0
  226. package/dist/util/tls.d.ts +68 -0
  227. package/dist/util/tls.d.ts.map +1 -0
  228. package/dist/util/tls.js +220 -0
  229. package/dist/util/tls.js.map +1 -0
  230. package/dist/util/type-utils.d.ts +14 -0
  231. package/dist/util/type-utils.d.ts.map +1 -0
  232. package/dist/util/type-utils.js +3 -0
  233. package/dist/util/type-utils.js.map +1 -0
  234. package/dist/util/url.d.ts +17 -0
  235. package/dist/util/url.d.ts.map +1 -0
  236. package/dist/util/url.js +96 -0
  237. package/dist/util/url.js.map +1 -0
  238. package/dist/util/util.d.ts +8 -0
  239. package/dist/util/util.d.ts.map +1 -0
  240. package/dist/util/util.js +41 -0
  241. package/dist/util/util.js.map +1 -0
  242. package/docs/api-docs-landing-page.md +11 -0
  243. package/docs/runkitExample.js +16 -0
  244. package/docs/setup.md +136 -0
  245. package/nfyb8qx5.cjs +1 -0
  246. package/package.json +194 -4
  247. package/src/admin/admin-bin.ts +62 -0
  248. package/src/admin/admin-plugin-types.ts +29 -0
  249. package/src/admin/admin-server.ts +619 -0
  250. package/src/admin/graphql-utils.ts +28 -0
  251. package/src/admin/mockttp-admin-model.ts +264 -0
  252. package/src/admin/mockttp-admin-plugin.ts +59 -0
  253. package/src/admin/mockttp-admin-server.ts +27 -0
  254. package/src/admin/mockttp-schema.ts +222 -0
  255. package/src/client/admin-client.ts +652 -0
  256. package/src/client/admin-query.ts +52 -0
  257. package/src/client/mocked-endpoint-client.ts +32 -0
  258. package/src/client/mockttp-admin-request-builder.ts +540 -0
  259. package/src/client/mockttp-client.ts +178 -0
  260. package/src/client/schema-introspection.ts +131 -0
  261. package/src/main.browser.ts +60 -0
  262. package/src/main.ts +160 -0
  263. package/src/mockttp.ts +926 -0
  264. package/src/pluggable-admin-api/mockttp-pluggable-admin.browser.ts +7 -0
  265. package/src/pluggable-admin-api/mockttp-pluggable-admin.ts +13 -0
  266. package/src/pluggable-admin-api/pluggable-admin.browser.ts +9 -0
  267. package/src/pluggable-admin-api/pluggable-admin.ts +36 -0
  268. package/src/rules/base-rule-builder.ts +312 -0
  269. package/src/rules/completion-checkers.ts +90 -0
  270. package/src/rules/http-agents.ts +119 -0
  271. package/src/rules/matchers.ts +665 -0
  272. package/src/rules/passthrough-handling-definitions.ts +111 -0
  273. package/src/rules/passthrough-handling.ts +376 -0
  274. package/src/rules/proxy-config.ts +136 -0
  275. package/src/rules/requests/request-handler-definitions.ts +1089 -0
  276. package/src/rules/requests/request-handlers.ts +1369 -0
  277. package/src/rules/requests/request-rule-builder.ts +481 -0
  278. package/src/rules/requests/request-rule.ts +148 -0
  279. package/src/rules/rule-deserialization.ts +55 -0
  280. package/src/rules/rule-parameters.ts +41 -0
  281. package/src/rules/rule-serialization.ts +29 -0
  282. package/src/rules/websockets/websocket-handler-definitions.ts +196 -0
  283. package/src/rules/websockets/websocket-handlers.ts +509 -0
  284. package/src/rules/websockets/websocket-rule-builder.ts +275 -0
  285. package/src/rules/websockets/websocket-rule.ts +136 -0
  286. package/src/serialization/body-serialization.ts +84 -0
  287. package/src/serialization/serialization.ts +373 -0
  288. package/src/server/http-combo-server.ts +424 -0
  289. package/src/server/mocked-endpoint.ts +44 -0
  290. package/src/server/mockttp-server.ts +1110 -0
  291. package/src/types.ts +433 -0
  292. package/src/util/buffer-utils.ts +164 -0
  293. package/src/util/dns.ts +52 -0
  294. package/src/util/error.ts +18 -0
  295. package/src/util/header-utils.ts +220 -0
  296. package/src/util/openssl-compat.ts +26 -0
  297. package/src/util/promise.ts +31 -0
  298. package/src/util/request-utils.ts +607 -0
  299. package/src/util/server-utils.ts +18 -0
  300. package/src/util/socket-util.ts +193 -0
  301. package/src/util/tls.ts +348 -0
  302. package/src/util/type-utils.ts +15 -0
  303. package/src/util/url.ts +113 -0
  304. package/src/util/util.ts +39 -0
@@ -0,0 +1,178 @@
1
+ import _ = require('lodash');
2
+
3
+ import { MockedEndpoint } from "../types";
4
+ import { Mockttp, AbstractMockttp, MockttpOptions, PortRange, SubscribableEvent } from "../mockttp";
5
+
6
+ import type { RequestRuleData } from "../rules/requests/request-rule";
7
+ import type { WebSocketRuleData } from '../rules/websockets/websocket-rule';
8
+
9
+ import { AdminClient, AdminClientEvent } from './admin-client';
10
+ import { MockttpAdminPlugin } from '../admin/mockttp-admin-plugin';
11
+ import { MockttpAdminRequestBuilder } from './mockttp-admin-request-builder';
12
+
13
+ export interface MockttpClientOptions extends MockttpOptions {
14
+ /**
15
+ * The full URL to use to connect to a Mockttp admin server when using a
16
+ * remote (or local but browser) client.
17
+ *
18
+ * When using a local server, this option is ignored.
19
+ */
20
+ adminServerUrl?: string;
21
+
22
+ /**
23
+ * Options to include on all client requests, e.g. to add extra
24
+ * headers for authentication.
25
+ */
26
+ client?: {
27
+ headers?: { [key: string]: string };
28
+ }
29
+ }
30
+
31
+ export type MockttpClientEvent = `admin-client:${AdminClientEvent}`;
32
+
33
+ /**
34
+ * A Mockttp implementation, controlling a remote Mockttp admin server.
35
+ *
36
+ * A MockttpClient supports the exact same Mockttp API as MockttpServer, but rather
37
+ * than directly using Node.js APIs to start a mock server and rewrite traffic, it
38
+ * makes calls to a remote admin server to start a mock server and rewrite traffic
39
+ * there. This is useful to allow proxy configuration from inside browser tests, and
40
+ * to allow creating mock proxies that run on remote machines.
41
+ */
42
+ export class MockttpClient extends AbstractMockttp implements Mockttp {
43
+
44
+ private mockServerOptions: MockttpOptions;
45
+
46
+ private adminClient: AdminClient<{ http: MockttpAdminPlugin }>;
47
+ private requestBuilder: MockttpAdminRequestBuilder | undefined; // Set once server has started.
48
+
49
+ constructor(options: MockttpClientOptions = {}) {
50
+ super(_.defaults(options, {
51
+ // Browser clients generally want cors enabled. For other clients, it doesn't hurt.
52
+ // TODO: Maybe detect whether we're in a browser in future
53
+ cors: true,
54
+ }));
55
+
56
+ this.mockServerOptions = options;
57
+
58
+ this.adminClient = new AdminClient({
59
+ adminServerUrl: options.adminServerUrl,
60
+ requestOptions: options.client
61
+ });
62
+ }
63
+
64
+ enableDebug(): Promise<void> {
65
+ return this.adminClient.enableDebug();
66
+ }
67
+
68
+ reset = (): Promise<void> => {
69
+ return this.adminClient.reset();
70
+ }
71
+
72
+ get url(): string {
73
+ return this.adminClient.metadata!.http.mockRoot;
74
+ }
75
+
76
+ get port(): number {
77
+ return this.adminClient.metadata!.http.port;
78
+ }
79
+
80
+ async start(port?: number | PortRange) {
81
+ await this.adminClient.start({
82
+ http: {
83
+ port,
84
+ options: this.mockServerOptions
85
+ }
86
+ });
87
+
88
+ this.requestBuilder = new MockttpAdminRequestBuilder(this.adminClient.schema);
89
+ }
90
+
91
+ stop() {
92
+ return this.adminClient.stop();
93
+ }
94
+
95
+ public addRequestRules = async (...rules: RequestRuleData[]): Promise<MockedEndpoint[]> => {
96
+ return this._addRequestRules(rules, false);
97
+ }
98
+
99
+ public setRequestRules = async (...rules: RequestRuleData[]): Promise<MockedEndpoint[]> => {
100
+ return this._addRequestRules(rules, true);
101
+ }
102
+
103
+ public addWebSocketRules = async (...rules: WebSocketRuleData[]): Promise<MockedEndpoint[]> => {
104
+ return this._addWsRules(rules, false);
105
+ }
106
+
107
+ public setWebSocketRules = async (...rules: WebSocketRuleData[]): Promise<MockedEndpoint[]> => {
108
+ return this._addWsRules(rules, true);
109
+ }
110
+
111
+ private _addRequestRules = async (
112
+ rules: Array<RequestRuleData>,
113
+ reset: boolean
114
+ ): Promise<MockedEndpoint[]> => {
115
+ if (!this.requestBuilder) throw new Error('Cannot add rules before the server is started');
116
+
117
+ const { adminStream } = this.adminClient;
118
+ return this.adminClient.sendQuery(
119
+ this.requestBuilder.buildAddRequestRulesQuery(rules, reset, adminStream)
120
+ );
121
+ }
122
+
123
+ private _addWsRules = async (
124
+ rules: Array<WebSocketRuleData>,
125
+ reset: boolean
126
+ ): Promise<MockedEndpoint[]> => {
127
+ if (!this.requestBuilder) throw new Error('Cannot add rules before the server is started');
128
+
129
+ const { adminStream } = this.adminClient;
130
+
131
+ return this.adminClient.sendQuery(
132
+ this.requestBuilder.buildAddWebSocketRulesQuery(rules, reset, adminStream)
133
+ );
134
+ }
135
+
136
+ public async getMockedEndpoints() {
137
+ if (!this.requestBuilder) throw new Error('Cannot query mocked endpoints before the server is started');
138
+
139
+ return this.adminClient.sendQuery(
140
+ this.requestBuilder.buildMockedEndpointsQuery()
141
+ );
142
+ }
143
+
144
+ public async getPendingEndpoints() {
145
+ if (!this.requestBuilder) throw new Error('Cannot query pending endpoints before the server is started');
146
+
147
+ return this.adminClient.sendQuery(
148
+ this.requestBuilder.buildPendingEndpointsQuery()
149
+ );
150
+ }
151
+
152
+ public async getRuleParameterKeys() {
153
+ return this.adminClient.getRuleParameterKeys();
154
+ }
155
+
156
+ public on(event: SubscribableEvent | MockttpClientEvent, callback: (data: any) => void): Promise<void> {
157
+ if (event.startsWith('admin-client:')) {
158
+ // All MockttpClient events come from the internal admin-client instance:
159
+ this.adminClient.on(event.slice('admin-client:'.length), callback);
160
+ return Promise.resolve();
161
+ }
162
+
163
+ if (!this.requestBuilder) throw new Error('Cannot subscribe to Mockttp events before the server is started');
164
+
165
+ const subRequest = this.requestBuilder.buildSubscriptionRequest(event as SubscribableEvent);
166
+
167
+ if (!subRequest) {
168
+ // We just return an immediately promise if we don't recognize the event, which will quietly
169
+ // succeed but never call the corresponding callback (the same as the server and most event
170
+ // sources in the same kind of situation). This is what happens when the *client* doesn't
171
+ // recognize the event. Subscribe() below handles the unknown-to-server case.
172
+ console.warn(`Ignoring subscription for event unrecognized by Mockttp client: ${event}`);
173
+ return Promise.resolve();
174
+ }
175
+
176
+ return this.adminClient.subscribe(subRequest, callback);
177
+ }
178
+ }
@@ -0,0 +1,131 @@
1
+ import * as _ from 'lodash';
2
+
3
+ export class SchemaIntrospector {
4
+
5
+ constructor(
6
+ private adminServerSchema: any
7
+ ) {}
8
+
9
+ public queryTypeDefined(queryType: string): boolean {
10
+ return this.typeHasField('Query', queryType);
11
+ }
12
+
13
+ public isTypeDefined(typeName: string): boolean {
14
+ return _.some(this.adminServerSchema.types, { name: typeName });
15
+ }
16
+
17
+ public typeHasField(typeName: string, fieldName: string): boolean {
18
+ const type: any = _.find(this.adminServerSchema.types, { name: typeName });
19
+ if (!type) return false;
20
+ return !!_.find(type.fields, { name: fieldName });
21
+ }
22
+
23
+ public asOptionalField(typeName: string | string[], fieldName: string): string {
24
+ const possibleNames = !Array.isArray(typeName) ? [typeName] : typeName;
25
+
26
+ const firstAvailableName = possibleNames.find((name) => this.isTypeDefined(name));
27
+ if (!firstAvailableName) return '';
28
+
29
+ return (this.typeHasField(firstAvailableName, fieldName))
30
+ ? fieldName
31
+ : '';
32
+ }
33
+
34
+ public typeHasInputField(typeName: string, fieldName: string): boolean {
35
+ const type: any = _.find(this.adminServerSchema.types, { name: typeName });
36
+ if (!type) return false;
37
+ return !!_.find(type.inputFields, { name: fieldName });
38
+ }
39
+
40
+ }
41
+
42
+ // Taken from src/utilities/introspectionQuery.js in GraphQL-js
43
+ // Copied directly, to avoid bundling the whole thing into frontend code.
44
+ export const introspectionQuery = `
45
+ query IntrospectionQuery {
46
+ __schema {
47
+ queryType { name }
48
+ mutationType { name }
49
+ subscriptionType { name }
50
+ types {
51
+ ...FullType
52
+ }
53
+ directives {
54
+ name
55
+ locations
56
+ args {
57
+ ...InputValue
58
+ }
59
+ }
60
+ }
61
+ }
62
+
63
+ fragment FullType on __Type {
64
+ kind
65
+ name
66
+ fields(includeDeprecated: true) {
67
+ name
68
+ args {
69
+ ...InputValue
70
+ }
71
+ type {
72
+ ...TypeRef
73
+ }
74
+ isDeprecated
75
+ deprecationReason
76
+ }
77
+ inputFields {
78
+ ...InputValue
79
+ }
80
+ interfaces {
81
+ ...TypeRef
82
+ }
83
+ enumValues(includeDeprecated: true) {
84
+ name
85
+ isDeprecated
86
+ deprecationReason
87
+ }
88
+ possibleTypes {
89
+ ...TypeRef
90
+ }
91
+ }
92
+
93
+ fragment InputValue on __InputValue {
94
+ name
95
+ type { ...TypeRef }
96
+ defaultValue
97
+ }
98
+
99
+ fragment TypeRef on __Type {
100
+ kind
101
+ name
102
+ ofType {
103
+ kind
104
+ name
105
+ ofType {
106
+ kind
107
+ name
108
+ ofType {
109
+ kind
110
+ name
111
+ ofType {
112
+ kind
113
+ name
114
+ ofType {
115
+ kind
116
+ name
117
+ ofType {
118
+ kind
119
+ name
120
+ ofType {
121
+ kind
122
+ name
123
+ }
124
+ }
125
+ }
126
+ }
127
+ }
128
+ }
129
+ }
130
+ }
131
+ `;
@@ -0,0 +1,60 @@
1
+ import { MockttpClient } from "./client/mockttp-client";
2
+
3
+ import { Mockttp, MockttpOptions } from "./mockttp";
4
+ export { Method, RulePriority } from "./types";
5
+
6
+ // Export rule data builders:
7
+ import * as matchers from './rules/matchers';
8
+ import * as requestHandlerDefinitions from './rules/requests/request-handler-definitions';
9
+ import * as webSocketHandlerDefinitions from './rules/websockets/websocket-handler-definitions';
10
+ import * as completionCheckers from './rules/completion-checkers';
11
+
12
+ export {
13
+ matchers,
14
+ requestHandlerDefinitions,
15
+ webSocketHandlerDefinitions,
16
+ completionCheckers
17
+ };
18
+
19
+ // We re-export definitions to pretend they're real handlers in the browser. This should be safe
20
+ // because the missing methods (i.e. handle()) were always unusable in non-Node environments anyway.
21
+ // In practice though, new browser code using this should actively use requestHandlerDefinitions instead.
22
+ // In future, we should probably expose definitions only for both browsers & node, but that's a
23
+ // breaking change.
24
+ export const requestHandlers = {
25
+ 'SimpleHandler': requestHandlerDefinitions.SimpleHandlerDefinition,
26
+ 'CallbackHandler': requestHandlerDefinitions.CallbackHandlerDefinition,
27
+ 'StreamHandler': requestHandlerDefinitions.StreamHandlerDefinition,
28
+ 'FileHandler': requestHandlerDefinitions.FileHandlerDefinition,
29
+ 'PassThroughHandler': requestHandlerDefinitions.PassThroughHandlerDefinition,
30
+ 'CloseConnectionHandler': requestHandlerDefinitions.CloseConnectionHandlerDefinition,
31
+ 'TimeoutHandler': requestHandlerDefinitions.TimeoutHandlerDefinition,
32
+ 'HandlerLookup': requestHandlerDefinitions.HandlerDefinitionLookup
33
+ };
34
+
35
+ export const webSocketHandlers = {
36
+ 'PassThroughWebSocketHandler': webSocketHandlerDefinitions.PassThroughWebSocketHandlerDefinition,
37
+ 'CloseConnectionHandler': webSocketHandlerDefinitions.CloseConnectionHandlerDefinition,
38
+ 'TimeoutHandler': webSocketHandlerDefinitions.TimeoutHandlerDefinition,
39
+ 'WsHandlerLookup': webSocketHandlerDefinitions.WsHandlerDefinitionLookup
40
+ };
41
+
42
+ export { MOCKTTP_PARAM_REF } from './rules/rule-parameters';
43
+
44
+ // Export the core API:
45
+ export function getLocal(options: MockttpOptions = {}): Mockttp {
46
+ return new MockttpClient(options);
47
+ }
48
+
49
+ export function getRemote(options: MockttpOptions = {}): Mockttp {
50
+ return new MockttpClient(options);
51
+ }
52
+
53
+ export function getAdminServer(): never {
54
+ throw new Error('Cannot set up an admin server within a browser');
55
+ }
56
+
57
+ export { resetAdminServer } from "./client/admin-client";
58
+
59
+ export * as PluggableAdmin from './pluggable-admin-api/pluggable-admin';
60
+ export * as MockttpPluggableAdmin from './pluggable-admin-api/mockttp-pluggable-admin';
package/src/main.ts ADDED
@@ -0,0 +1,160 @@
1
+ import { Mockttp, MockttpOptions, MockttpHttpsOptions, SubscribableEvent, PortRange } from "./mockttp";
2
+ import { MockttpServer } from "./server/mockttp-server";
3
+ import {
4
+ MockttpClient,
5
+ MockttpClientOptions
6
+ } from "./client/mockttp-client";
7
+ import { MockttpAdminServer, MockttpAdminServerOptions } from "./admin/mockttp-admin-server";
8
+
9
+ // Export the core type definitions:
10
+ export * from "./types";
11
+ export type {
12
+ Mockttp,
13
+ MockttpServer,
14
+ MockttpAdminServer,
15
+ MockttpOptions,
16
+ MockttpHttpsOptions,
17
+ MockttpClientOptions,
18
+ MockttpAdminServerOptions,
19
+ SubscribableEvent,
20
+ PortRange
21
+ };
22
+
23
+ // Export now-renamed types with the old aliases to provide backward compat and
24
+ // avoid unnecessary type breakage:
25
+ export type { TlsHandshakeFailure as TlsRequest } from './types';
26
+ export type {
27
+ CertDataOptions as HttpsOptions,
28
+ CertPathOptions as HttpsPathOptions
29
+ } from './util/tls';
30
+
31
+ // Export rule data builders & type definitions:
32
+ import * as matchers from './rules/matchers';
33
+ import * as requestHandlers from './rules/requests/request-handlers';
34
+ import * as requestHandlerDefinitions from './rules/requests/request-handler-definitions';
35
+ import * as webSocketHandlers from './rules/websockets/websocket-handlers';
36
+ import * as webSocketHandlerDefinitions from './rules/websockets/websocket-handler-definitions';
37
+ import * as completionCheckers from './rules/completion-checkers';
38
+
39
+ export {
40
+ matchers,
41
+ requestHandlers,
42
+ requestHandlerDefinitions,
43
+ webSocketHandlers,
44
+ webSocketHandlerDefinitions,
45
+ completionCheckers
46
+ };
47
+
48
+ import type { RequestRule, RequestRuleData } from './rules/requests/request-rule';
49
+ import type { WebSocketRule, WebSocketRuleData } from './rules/websockets/websocket-rule';
50
+
51
+ export type { RequestRule, RequestRuleData, WebSocketRule, WebSocketRuleData };
52
+ export type {
53
+ ProxyConfig,
54
+ ProxySetting,
55
+ ProxySettingSource,
56
+ ProxySettingCallback,
57
+ ProxySettingCallbackParams
58
+ } from './rules/proxy-config';
59
+ export type {
60
+ CADefinition,
61
+ ForwardingOptions,
62
+ PassThroughLookupOptions,
63
+ PassThroughHandlerConnectionOptions
64
+ } from './rules/passthrough-handling-definitions';
65
+
66
+ export type { RequestRuleBuilder } from "./rules/requests/request-rule-builder";
67
+ export type { WebSocketRuleBuilder } from "./rules/websockets/websocket-rule-builder";
68
+
69
+ export {
70
+ MOCKTTP_PARAM_REF,
71
+ RuleParameterReference,
72
+ RuleParameters
73
+ } from './rules/rule-parameters';
74
+ export type { ServerMockedEndpoint } from "./server/mocked-endpoint";
75
+
76
+ // Export TLS utility methods:
77
+ export {
78
+ generateCACertificate,
79
+ generateSPKIFingerprint
80
+ } from './util/tls';
81
+
82
+ // Export various referenced utility types:
83
+ export type {
84
+ CAOptions,
85
+ PEM,
86
+ CertDataOptions,
87
+ CertPathOptions
88
+ } from './util/tls';
89
+ export type { CachedDns, DnsLookupFunction } from './util/dns';
90
+ export type { Serialized, SerializedValue } from './serialization/serialization';
91
+ export type { MaybePromise } from './util/type-utils';
92
+
93
+ // Export the core API:
94
+
95
+ /**
96
+ * Get a Mockttp instance on the local machine.
97
+ *
98
+ * In most simple environments, you can call this method directly and immediately
99
+ * get a Mockttp instance and start mocking servers.
100
+ *
101
+ * In node, the mocked servers will run in process and require no further setup.
102
+ *
103
+ * In browsers this is an alias for getRemote. You'll need to start a Mockttp admin server
104
+ * outside your tests before calling this, which will create and manage your fake servers
105
+ * outside the browser.
106
+ */
107
+ export function getLocal(options: MockttpOptions = {}): Mockttp {
108
+ return new MockttpServer(options);
109
+ }
110
+
111
+ /**
112
+ * Get a Mockttp instance, controlled through a Mockttp admin server.
113
+ *
114
+ * This connects to a Mockttp admin server, and uses that to start
115
+ * and stop mock servers.
116
+ */
117
+ export function getRemote(options: MockttpClientOptions = {}): Mockttp {
118
+ return new MockttpClient(options);
119
+ }
120
+
121
+ /**
122
+ * Get a Mockttp admin server, which can be used with a Mockttp remote client to create
123
+ * & manage Mockttp instances either from remote machines or from local environments
124
+ * that lack necessary capabilities, e.g. to use Mockttp from inside a browser.
125
+ *
126
+ * This function exists so you can set up these servers programmatically, but for most
127
+ * usage you can just run your tests via the `mockttp` binary, which will automatically
128
+ * start and stop an admin server for you:
129
+ *
130
+ * ```
131
+ * mockttp -c <your test command>
132
+ * ```
133
+ */
134
+ export function getAdminServer(options: MockttpAdminServerOptions = {}): MockttpAdminServer {
135
+ return new MockttpAdminServer(options);
136
+ }
137
+ import { resetAdminServer } from "./client/admin-client";
138
+ export { resetAdminServer };
139
+
140
+ /**
141
+ * This API is not yet stable, and is intended for internal use only. It may change in future
142
+ * in minor versions without warning.
143
+ *
144
+ * These generic pluggable admin components allow composing an admin server and client that
145
+ * are capable of managing arbitrary mock protocols, including Mockttp but also others depending
146
+ * on the admin plugins used. To use Mockttp, combine this with the MockttpPluggableAdmin API.
147
+ * @category Internal
148
+ */
149
+ export * as PluggableAdmin from './pluggable-admin-api/pluggable-admin';
150
+
151
+ /**
152
+ * This API is not yet stable, and is intended for internal use only. It may change in future
153
+ * in minor versions without warning.
154
+ *
155
+ * These plugin components can be applied to the PluggableAdmin API to create a remotely
156
+ * controlable mock management server that can mock HTTP in addition to protocols from
157
+ * other plugins.
158
+ * @category Internal
159
+ */
160
+ export * as MockttpPluggableAdmin from './pluggable-admin-api/mockttp-pluggable-admin';