@eggjs/mock 6.0.7 → 6.1.0-beta.11

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 (214) hide show
  1. package/README.md +36 -57
  2. package/README.zh_CN.md +31 -51
  3. package/dist/_virtual/rolldown_runtime.js +7 -0
  4. package/dist/app/extend/agent.d.ts +39 -0
  5. package/dist/app/extend/agent.js +48 -0
  6. package/dist/app/extend/application.d.ts +175 -0
  7. package/dist/app/extend/application.js +385 -0
  8. package/dist/app/middleware/cluster_app_mock.d.ts +6 -0
  9. package/dist/app/middleware/cluster_app_mock.js +97 -0
  10. package/dist/app.d.ts +10 -0
  11. package/dist/app.js +17 -0
  12. package/dist/bootstrap.d.ts +9 -0
  13. package/dist/bootstrap.js +14 -0
  14. package/dist/index.d.ts +81 -0
  15. package/dist/index.js +47 -0
  16. package/dist/inject_mocha.d.ts +1 -0
  17. package/dist/inject_mocha.js +34 -0
  18. package/dist/lib/agent_handler.d.ts +7 -0
  19. package/dist/lib/agent_handler.js +26 -0
  20. package/dist/lib/app.d.ts +7 -0
  21. package/dist/lib/app.js +251 -0
  22. package/dist/lib/app_handler.d.ts +9 -0
  23. package/dist/lib/app_handler.js +56 -0
  24. package/dist/lib/cluster.d.ts +126 -0
  25. package/dist/lib/cluster.js +283 -0
  26. package/dist/lib/context.d.ts +4 -0
  27. package/dist/lib/context.js +10 -0
  28. package/dist/lib/format_options.d.ts +10 -0
  29. package/dist/lib/format_options.js +65 -0
  30. package/dist/lib/inject_context.d.ts +9 -0
  31. package/dist/lib/inject_context.js +106 -0
  32. package/dist/lib/mock_agent.d.ts +9 -0
  33. package/dist/lib/mock_agent.js +45 -0
  34. package/dist/lib/mock_custom_loader.d.ts +4 -0
  35. package/dist/lib/mock_custom_loader.js +35 -0
  36. package/dist/lib/mock_http_server.d.ts +6 -0
  37. package/dist/lib/mock_http_server.js +17 -0
  38. package/dist/lib/mock_httpclient.d.ts +40 -0
  39. package/dist/lib/mock_httpclient.js +110 -0
  40. package/dist/lib/parallel/agent.d.ts +24 -0
  41. package/dist/lib/parallel/agent.js +111 -0
  42. package/dist/lib/parallel/app.d.ts +24 -0
  43. package/dist/lib/parallel/app.js +99 -0
  44. package/dist/lib/parallel/util.d.ts +6 -0
  45. package/dist/lib/parallel/util.js +59 -0
  46. package/dist/lib/prerequire.d.ts +1 -0
  47. package/dist/lib/prerequire.js +1 -0
  48. package/dist/lib/request_call_function.d.ts +1 -0
  49. package/dist/lib/request_call_function.js +37 -0
  50. package/dist/lib/restore.d.ts +4 -0
  51. package/dist/lib/restore.js +16 -0
  52. package/dist/lib/start-cluster.d.ts +1 -0
  53. package/dist/lib/start-cluster.js +19 -0
  54. package/dist/lib/supertest.d.ts +16 -0
  55. package/dist/lib/supertest.js +39 -0
  56. package/dist/lib/tmp/empty.d.ts +1 -0
  57. package/dist/lib/tmp/empty.js +1 -0
  58. package/{src/lib/types.ts → dist/lib/types.d.ts} +12 -29
  59. package/dist/lib/types.js +1 -0
  60. package/dist/lib/utils.d.ts +12 -0
  61. package/dist/lib/utils.js +40 -0
  62. package/dist/register.d.ts +10 -0
  63. package/dist/register.js +40 -0
  64. package/dist/typings/index.d.ts +1 -0
  65. package/package.json +69 -98
  66. package/dist/commonjs/app/extend/agent.d.ts +0 -34
  67. package/dist/commonjs/app/extend/agent.js +0 -49
  68. package/dist/commonjs/app/extend/application.d.ts +0 -172
  69. package/dist/commonjs/app/extend/application.js +0 -450
  70. package/dist/commonjs/app/middleware/cluster_app_mock.d.ts +0 -3
  71. package/dist/commonjs/app/middleware/cluster_app_mock.js +0 -101
  72. package/dist/commonjs/app.d.ts +0 -6
  73. package/dist/commonjs/app.js +0 -20
  74. package/dist/commonjs/bootstrap.d.ts +0 -5
  75. package/dist/commonjs/bootstrap.js +0 -59
  76. package/dist/commonjs/index.d.ts +0 -77
  77. package/dist/commonjs/index.js +0 -114
  78. package/dist/commonjs/lib/agent_handler.d.ts +0 -3
  79. package/dist/commonjs/lib/agent_handler.js +0 -28
  80. package/dist/commonjs/lib/app.d.ts +0 -3
  81. package/dist/commonjs/lib/app.js +0 -301
  82. package/dist/commonjs/lib/app_handler.d.ts +0 -5
  83. package/dist/commonjs/lib/app_handler.js +0 -71
  84. package/dist/commonjs/lib/cluster.d.ts +0 -114
  85. package/dist/commonjs/lib/cluster.js +0 -337
  86. package/dist/commonjs/lib/context.d.ts +0 -1
  87. package/dist/commonjs/lib/context.js +0 -16
  88. package/dist/commonjs/lib/format_options.d.ts +0 -5
  89. package/dist/commonjs/lib/format_options.js +0 -100
  90. package/dist/commonjs/lib/inject_context.d.ts +0 -6
  91. package/dist/commonjs/lib/inject_context.js +0 -132
  92. package/dist/commonjs/lib/mock_agent.d.ts +0 -5
  93. package/dist/commonjs/lib/mock_agent.js +0 -49
  94. package/dist/commonjs/lib/mock_custom_loader.d.ts +0 -1
  95. package/dist/commonjs/lib/mock_custom_loader.js +0 -37
  96. package/dist/commonjs/lib/mock_http_server.d.ts +0 -2
  97. package/dist/commonjs/lib/mock_http_server.js +0 -24
  98. package/dist/commonjs/lib/mock_httpclient.d.ts +0 -36
  99. package/dist/commonjs/lib/mock_httpclient.js +0 -147
  100. package/dist/commonjs/lib/parallel/agent.d.ts +0 -20
  101. package/dist/commonjs/lib/parallel/agent.js +0 -125
  102. package/dist/commonjs/lib/parallel/app.d.ts +0 -20
  103. package/dist/commonjs/lib/parallel/app.js +0 -115
  104. package/dist/commonjs/lib/parallel/util.d.ts +0 -3
  105. package/dist/commonjs/lib/parallel/util.js +0 -77
  106. package/dist/commonjs/lib/prerequire.d.ts +0 -1
  107. package/dist/commonjs/lib/prerequire.js +0 -26
  108. package/dist/commonjs/lib/request_call_function.d.ts +0 -1
  109. package/dist/commonjs/lib/request_call_function.js +0 -52
  110. package/dist/commonjs/lib/restore.d.ts +0 -1
  111. package/dist/commonjs/lib/restore.js +0 -16
  112. package/dist/commonjs/lib/start-cluster.d.ts +0 -2
  113. package/dist/commonjs/lib/start-cluster.js +0 -23
  114. package/dist/commonjs/lib/supertest.d.ts +0 -11
  115. package/dist/commonjs/lib/supertest.js +0 -48
  116. package/dist/commonjs/lib/tmp/empty.d.ts +0 -1
  117. package/dist/commonjs/lib/tmp/empty.js +0 -3
  118. package/dist/commonjs/lib/types.d.ts +0 -68
  119. package/dist/commonjs/lib/types.js +0 -3
  120. package/dist/commonjs/lib/utils.d.ts +0 -9
  121. package/dist/commonjs/lib/utils.js +0 -80
  122. package/dist/commonjs/package.json +0 -3
  123. package/dist/commonjs/register.d.ts +0 -8
  124. package/dist/commonjs/register.js +0 -80
  125. package/dist/esm/app/extend/agent.d.ts +0 -34
  126. package/dist/esm/app/extend/agent.js +0 -46
  127. package/dist/esm/app/extend/application.d.ts +0 -172
  128. package/dist/esm/app/extend/application.js +0 -444
  129. package/dist/esm/app/middleware/cluster_app_mock.d.ts +0 -3
  130. package/dist/esm/app/middleware/cluster_app_mock.js +0 -99
  131. package/dist/esm/app.d.ts +0 -6
  132. package/dist/esm/app.js +0 -17
  133. package/dist/esm/bootstrap.d.ts +0 -5
  134. package/dist/esm/bootstrap.js +0 -15
  135. package/dist/esm/index.d.ts +0 -77
  136. package/dist/esm/index.js +0 -91
  137. package/dist/esm/lib/agent_handler.d.ts +0 -3
  138. package/dist/esm/lib/agent_handler.js +0 -24
  139. package/dist/esm/lib/app.d.ts +0 -3
  140. package/dist/esm/lib/app.js +0 -295
  141. package/dist/esm/lib/app_handler.d.ts +0 -5
  142. package/dist/esm/lib/app_handler.js +0 -65
  143. package/dist/esm/lib/cluster.d.ts +0 -114
  144. package/dist/esm/lib/cluster.js +0 -328
  145. package/dist/esm/lib/context.d.ts +0 -1
  146. package/dist/esm/lib/context.js +0 -13
  147. package/dist/esm/lib/format_options.d.ts +0 -5
  148. package/dist/esm/lib/format_options.js +0 -94
  149. package/dist/esm/lib/inject_context.d.ts +0 -6
  150. package/dist/esm/lib/inject_context.js +0 -126
  151. package/dist/esm/lib/mock_agent.d.ts +0 -5
  152. package/dist/esm/lib/mock_agent.js +0 -45
  153. package/dist/esm/lib/mock_custom_loader.d.ts +0 -1
  154. package/dist/esm/lib/mock_custom_loader.js +0 -34
  155. package/dist/esm/lib/mock_http_server.d.ts +0 -2
  156. package/dist/esm/lib/mock_http_server.js +0 -18
  157. package/dist/esm/lib/mock_httpclient.d.ts +0 -36
  158. package/dist/esm/lib/mock_httpclient.js +0 -144
  159. package/dist/esm/lib/parallel/agent.d.ts +0 -20
  160. package/dist/esm/lib/parallel/agent.js +0 -117
  161. package/dist/esm/lib/parallel/app.d.ts +0 -20
  162. package/dist/esm/lib/parallel/app.js +0 -110
  163. package/dist/esm/lib/parallel/util.d.ts +0 -3
  164. package/dist/esm/lib/parallel/util.js +0 -73
  165. package/dist/esm/lib/prerequire.d.ts +0 -1
  166. package/dist/esm/lib/prerequire.js +0 -25
  167. package/dist/esm/lib/request_call_function.d.ts +0 -1
  168. package/dist/esm/lib/request_call_function.js +0 -47
  169. package/dist/esm/lib/restore.d.ts +0 -1
  170. package/dist/esm/lib/restore.js +0 -13
  171. package/dist/esm/lib/start-cluster.d.ts +0 -2
  172. package/dist/esm/lib/start-cluster.js +0 -18
  173. package/dist/esm/lib/supertest.d.ts +0 -11
  174. package/dist/esm/lib/supertest.js +0 -40
  175. package/dist/esm/lib/tmp/empty.d.ts +0 -1
  176. package/dist/esm/lib/tmp/empty.js +0 -2
  177. package/dist/esm/lib/types.d.ts +0 -68
  178. package/dist/esm/lib/types.js +0 -2
  179. package/dist/esm/lib/utils.d.ts +0 -9
  180. package/dist/esm/lib/utils.js +0 -69
  181. package/dist/esm/package.json +0 -3
  182. package/dist/esm/register.d.ts +0 -8
  183. package/dist/esm/register.js +0 -75
  184. package/dist/package.json +0 -4
  185. package/src/app/extend/agent.ts +0 -57
  186. package/src/app/extend/application.ts +0 -512
  187. package/src/app/middleware/cluster_app_mock.ts +0 -102
  188. package/src/app.ts +0 -18
  189. package/src/bootstrap.ts +0 -25
  190. package/src/index.ts +0 -112
  191. package/src/lib/agent_handler.ts +0 -28
  192. package/src/lib/app.ts +0 -314
  193. package/src/lib/app_handler.ts +0 -77
  194. package/src/lib/cluster.ts +0 -363
  195. package/src/lib/context.ts +0 -14
  196. package/src/lib/format_options.ts +0 -103
  197. package/src/lib/inject_context.ts +0 -134
  198. package/src/lib/mock_agent.ts +0 -57
  199. package/src/lib/mock_custom_loader.ts +0 -36
  200. package/src/lib/mock_http_server.ts +0 -19
  201. package/src/lib/mock_httpclient.ts +0 -183
  202. package/src/lib/parallel/agent.ts +0 -128
  203. package/src/lib/parallel/app.ts +0 -123
  204. package/src/lib/parallel/util.ts +0 -66
  205. package/src/lib/prerequire.ts +0 -25
  206. package/src/lib/request_call_function.ts +0 -49
  207. package/src/lib/restore.ts +0 -14
  208. package/src/lib/start-cluster.ts +0 -23
  209. package/src/lib/supertest.ts +0 -45
  210. package/src/lib/tmp/.gitkeep +0 -0
  211. package/src/lib/tmp/empty.ts +0 -0
  212. package/src/lib/utils.ts +0 -82
  213. package/src/register.ts +0 -80
  214. package/src/typings/index.d.ts +0 -4
@@ -1,19 +0,0 @@
1
- import http, { Server } from 'node:http';
2
-
3
- const SERVER = Symbol('http_server');
4
-
5
- export function createServer(app: any): Server {
6
- let server = app[SERVER] || app.callback();
7
- if (typeof server === 'function') {
8
- server = http.createServer(server);
9
- // cache server, avoid create many times
10
- app[SERVER] = server;
11
- if (!app.server) {
12
- app.server = server;
13
- }
14
- // emit server event just like egg-cluster does
15
- // https://github.com/eggjs/egg-cluster/blob/master/lib/app_worker.js#L52
16
- app.emit('server', server);
17
- }
18
- return server;
19
- }
@@ -1,183 +0,0 @@
1
- import { mm } from 'mm';
2
- import { extend } from 'extend2';
3
- import type { Dispatcher, Headers, BodyInit } from 'urllib';
4
- import { getMockAgent } from './mock_agent.js';
5
-
6
- export interface MockResultOptions {
7
- data: string | Buffer | Record<string, any>;
8
- /**
9
- * http status
10
- */
11
- status?: number;
12
- /**
13
- * response header
14
- */
15
- headers?: Record<string, string>;
16
- /**
17
- * delay the associated reply by a set amount in ms
18
- */
19
- delay?: number;
20
- /**
21
- * any matching request will always reply with the defined response indefinitely
22
- */
23
- persist?: boolean;
24
- /**
25
- * any matching request will reply with the defined response a fixed amount of times
26
- */
27
- repeats?: number;
28
- }
29
- // keep compatible with old version
30
- export type ResultObject = MockResultOptions;
31
-
32
- export interface MockResponseCallbackOptions {
33
- path: string;
34
- method: string;
35
- headers?: Headers | Record<string, string>;
36
- origin?: string;
37
- body?: BodyInit | Dispatcher.DispatchOptions['body'] | null;
38
- maxRedirections?: number;
39
- }
40
-
41
- export type MockResultFunction =
42
- (url: string, options: MockResponseCallbackOptions) => MockResultOptions | string;
43
-
44
- function normalizeResult(result: string | MockResultOptions) {
45
- if (typeof result === 'string') {
46
- result = { data: result };
47
- }
48
-
49
- if (!result.status) {
50
- result.status = 200;
51
- }
52
-
53
- result.data = result.data || '';
54
- if (Buffer.isBuffer(result.data)) {
55
- // do nothing
56
- } else if (typeof result.data === 'object') {
57
- // json
58
- result.data = Buffer.from(JSON.stringify(result.data));
59
- } else if (typeof result.data === 'string') {
60
- // string
61
- result.data = Buffer.from(result.data);
62
- } else {
63
- throw new Error('`mockResult.data` must be buffer, string or json');
64
- }
65
- result.headers = result.headers ?? {};
66
- return result;
67
- }
68
-
69
- const MOCK_CONFIGS = Symbol('MOCK_CONFIGS');
70
- const MOCK_CONFIG_INDEX = Symbol('MOCK_CONFIG_INDEX');
71
-
72
- export function createMockHttpClient(app: any) {
73
- /**
74
- * mock httpclient
75
- * @function mockHttpclient
76
- * @param {String} mockUrl - url
77
- * @param {String|Array} mockMethod - http method, default is '*'
78
- * @param {Object|Function} mockResult - you data
79
- * - data - buffer / string / json
80
- * - status - http status
81
- * - headers - response header
82
- * - delay - delay the associated reply by a set amount in ms.
83
- * - persist - any matching request will always reply with the defined response indefinitely, default is true
84
- * - repeats - number, any matching request will reply with the defined response a fixed amount of times
85
- */
86
- return function mockHttpClient(mockUrl: string | RegExp, mockMethod: string | string[] | MockResultOptions | MockResultFunction, mockResult?: MockResultOptions | MockResultFunction | string) {
87
- let mockMethods = mockMethod as string[];
88
- if (!mockResult) {
89
- // app.mockHttpclient(mockUrl, mockResult)
90
- mockResult = mockMethod as MockResultOptions;
91
- mockMethods = [ '*' ];
92
- }
93
- if (!Array.isArray(mockMethods)) {
94
- mockMethods = [ mockMethods ];
95
- }
96
- mockMethods = mockMethods.map(method => (method || 'GET').toUpperCase());
97
-
98
- // use MockAgent on undici
99
- let mockConfigs = app[MOCK_CONFIGS];
100
- if (!mockConfigs) {
101
- mockConfigs = [];
102
- mm(app, MOCK_CONFIGS, mockConfigs);
103
- }
104
-
105
- let mockConfigIndex = -1;
106
- let origin = mockUrl;
107
- let originMethod: ((value: string) => boolean) | undefined;
108
- const pathname = mockUrl;
109
- let pathMethod: (path: string) => boolean;
110
- if (typeof mockUrl === 'string') {
111
- const urlObject = new URL(mockUrl);
112
- origin = urlObject.origin;
113
- const originalPathname = urlObject.pathname;
114
- pathMethod = path => {
115
- if (path === originalPathname) return true;
116
- // should match /foo?a=1 including query
117
- if (path.includes('?')) return path.startsWith(originalPathname);
118
- return false;
119
- };
120
- } else if (mockUrl instanceof RegExp) {
121
- let requestOrigin = '';
122
- originMethod = value => {
123
- requestOrigin = value;
124
- return true;
125
- };
126
- pathMethod = path => {
127
- for (const config of mockConfigs) {
128
- if (config.mockUrl.test(`${requestOrigin}${path}`)) {
129
- mm(app, MOCK_CONFIG_INDEX, config.mockConfigIndex);
130
- return true;
131
- }
132
- }
133
- return false;
134
- };
135
- mockConfigIndex = mockConfigs.length;
136
- mockConfigs.push({ mockUrl, mockResult, mockConfigIndex });
137
- }
138
- const mockPool = originMethod
139
- ? getMockAgent(app).get(originMethod)
140
- : getMockAgent(app).get(originMethod ?? origin as string);
141
- // persist default is true
142
- let persist = true;
143
- if (typeof mockResult === 'object' && typeof mockResult.persist === 'boolean') {
144
- persist = mockResult.persist;
145
- }
146
- mockMethods.forEach(function(method) {
147
- const mockScope = mockPool.intercept({
148
- path: pathMethod ?? pathname,
149
- method: method === '*' ? () => true : method,
150
- }).reply(options => {
151
- // not support mockResult as an async function
152
- const requestUrl = `${options.origin}${options.path}`;
153
- let mockRequestResult;
154
- if (mockConfigIndex >= 0) {
155
- mockResult = mockConfigs[app[MOCK_CONFIG_INDEX]].mockResult;
156
- mockRequestResult = typeof mockResult === 'function' ? mockResult(requestUrl, options) : mockResult;
157
- } else {
158
- mockRequestResult = typeof mockResult === 'function' ? mockResult(requestUrl, options) : mockResult;
159
- }
160
- const result = extend(true, {}, normalizeResult(mockRequestResult!));
161
- return {
162
- statusCode: result.status,
163
- data: result.data,
164
- responseOptions: {
165
- headers: result.headers,
166
- },
167
- };
168
- });
169
- if (typeof mockResult === 'object') {
170
- if (mockResult.delay && mockResult.delay > 0) {
171
- mockScope.delay(mockResult.delay);
172
- }
173
- }
174
- if (persist) {
175
- mockScope.persist();
176
- } else if (typeof mockResult === 'object' && mockResult.repeats && mockResult.repeats > 0) {
177
- mockScope.times(mockResult.repeats);
178
- }
179
- });
180
- };
181
- }
182
-
183
- export type MockHttpClientMethod = ReturnType<typeof createMockHttpClient>;
@@ -1,128 +0,0 @@
1
- import { debuglog } from 'node:util';
2
- import path from 'node:path';
3
- import { Base } from 'sdk-base';
4
- import { detectPort } from 'detect-port';
5
- import { importModule } from '@eggjs/utils';
6
- import type { EggCore } from '@eggjs/core';
7
- import { context } from '../context.js';
8
- import { formatOptions } from '../format_options.js';
9
- import { MockOptions, MockApplicationOptions } from '../types.js';
10
- import { sleep, rimraf } from '../utils.js';
11
- import { setCustomLoader } from '../mock_custom_loader.js';
12
- import { APP_INIT } from './util.js';
13
-
14
- const debug = debuglog('@eggjs/mock/lib/parallel/agent');
15
-
16
- export class MockAgent extends Base {
17
- declare options: MockApplicationOptions;
18
- baseDir: string;
19
- [APP_INIT] = false;
20
- #initOnListeners = new Set<any[]>();
21
- #initOnceListeners = new Set<any[]>();
22
- _instance: EggCore;
23
-
24
- constructor(options: MockApplicationOptions) {
25
- super({ initMethod: '_init' });
26
- this.options = options;
27
- this.baseDir = this.options.baseDir;
28
- }
29
-
30
- async _init() {
31
- if (this.options.beforeInit) {
32
- await this.options.beforeInit(this);
33
- delete this.options.beforeInit;
34
- }
35
- if (this.options.clean !== false) {
36
- const logDir = path.join(this.options.baseDir, 'logs');
37
- try {
38
- await rimraf(logDir);
39
- } catch (err: any) {
40
- console.error(`remove log dir ${logDir} failed: ${err.stack}`);
41
- }
42
- const runDir = path.join(this.options.baseDir, 'run');
43
- try {
44
- await rimraf(runDir);
45
- } catch (err: any) {
46
- console.error(`remove run dir ${runDir} failed: ${err.stack}`);
47
- }
48
- }
49
-
50
- this.options.clusterPort = await detectPort();
51
- process.env.CLUSTER_PORT = String(this.options.clusterPort);
52
- debug('get clusterPort %s', this.options.clusterPort);
53
- const { Agent }: { Agent: typeof EggCore } = await importModule(this.options.framework);
54
-
55
- const agent = this._instance = new Agent({ ...this.options });
56
-
57
- // egg-mock plugin need to override egg context
58
- Object.assign(agent.context, context);
59
- setCustomLoader(agent);
60
-
61
- debug('agent instantiate');
62
- this[APP_INIT] = true;
63
- debug('this[APP_INIT] = true');
64
- this.#bindEvents();
65
- await agent.ready();
66
-
67
- const msg = {
68
- action: 'egg-ready',
69
- data: this.options,
70
- };
71
- (agent as any).messenger.onMessage(msg);
72
- debug('agent ready');
73
- }
74
-
75
- #bindEvents() {
76
- debug('bind cache events to agent');
77
- for (const args of this.#initOnListeners) {
78
- debug('on(%s), use cache and pass to agent', args);
79
- this._instance.on(args[0], args[1]);
80
- this.removeListener(args[0], args[1]);
81
- }
82
- for (const args of this.#initOnceListeners) {
83
- debug('once(%s), use cache and pass to agent', args);
84
- this._instance.once(args[0], args[1]);
85
- this.removeListener(args[0], args[1]);
86
- }
87
- }
88
-
89
- on(...args: any[]) {
90
- if (this[APP_INIT]) {
91
- debug('on(%s), pass to agent', args);
92
- this._instance.on(args[0], args[1]);
93
- } else {
94
- debug('on(%s), cache it because agent has not init', args);
95
- this.#initOnListeners.add(args);
96
- super.on(args[0], args[1]);
97
- }
98
- return this;
99
- }
100
-
101
- once(...args: any[]) {
102
- if (this[APP_INIT]) {
103
- debug('once(%s), pass to agent', args);
104
- this._instance.once(args[0], args[1]);
105
- } else {
106
- debug('once(%s), cache it because agent has not init', args);
107
- this.#initOnceListeners.add(args);
108
- super.on(args[0], args[1]);
109
- }
110
- return this;
111
- }
112
-
113
- /**
114
- * close agent
115
- */
116
- async _close() {
117
- if (this._instance) {
118
- await this._instance.close();
119
- } else {
120
- // when agent init throws an exception, must wait for agent quit gracefully
121
- await sleep(200);
122
- }
123
- }
124
- }
125
-
126
- export function createAgent(options: MockOptions) {
127
- return new MockAgent(formatOptions(options));
128
- }
@@ -1,123 +0,0 @@
1
- import { debuglog } from 'node:util';
2
- import { Base } from 'sdk-base';
3
- import { importModule } from '@eggjs/utils';
4
- import type { EggCore } from '@eggjs/core';
5
- import { context } from '../context.js';
6
- import { formatOptions } from '../format_options.js';
7
- import { MockOptions, MockApplicationOptions } from '../types.js';
8
- import { sleep } from '../utils.js';
9
- import { setCustomLoader } from '../mock_custom_loader.js';
10
- import { createServer } from '../mock_http_server.js';
11
- import { proxyApp, APP_INIT } from './util.js';
12
-
13
- const debug = debuglog('@eggjs/mock/lib/parallel/app');
14
-
15
- export class MockParallelApplication extends Base {
16
- declare options: MockApplicationOptions;
17
- baseDir: string;
18
- [APP_INIT] = false;
19
- #initOnListeners = new Set<any[]>();
20
- #initOnceListeners = new Set<any[]>();
21
- _instance: EggCore;
22
-
23
- constructor(options: MockApplicationOptions) {
24
- super({ initMethod: '_init' });
25
- this.options = options;
26
- this.baseDir = options.baseDir;
27
- }
28
-
29
- async _init() {
30
- if (this.options.beforeInit) {
31
- await this.options.beforeInit(this);
32
- delete this.options.beforeInit;
33
- }
34
-
35
- if (!this.options.clusterPort) {
36
- this.options.clusterPort = parseInt(process.env.CLUSTER_PORT!);
37
- }
38
- if (!this.options.clusterPort) {
39
- throw new Error('cannot get env.CLUSTER_PORT, parallel run fail');
40
- }
41
- debug('get clusterPort %s', this.options.clusterPort);
42
- const { Application }: { Application: typeof EggCore } = await importModule(this.options.framework);
43
-
44
- const app = this._instance = new Application({ ...this.options });
45
-
46
- // egg-mock plugin need to override egg context
47
- Object.assign(app.context, context);
48
- setCustomLoader(app);
49
-
50
- debug('app instantiate');
51
- this[APP_INIT] = true;
52
- debug('this[APP_INIT] = true');
53
- this.#bindEvents();
54
- debug('http server instantiate');
55
- createServer(app);
56
- await app.ready();
57
-
58
- const msg = {
59
- action: 'egg-ready',
60
- data: this.options,
61
- };
62
- (app as any).messenger.onMessage(msg);
63
- debug('app ready');
64
- }
65
-
66
- #bindEvents() {
67
- for (const args of this.#initOnListeners) {
68
- debug('on(%s), use cache and pass to app', args);
69
- this._instance.on(args[0], args[1]);
70
- this.removeListener(args[0], args[1]);
71
- }
72
- for (const args of this.#initOnceListeners) {
73
- debug('once(%s), use cache and pass to app', args);
74
- this._instance.once(args[0], args[1]);
75
- this.removeListener(args[0], args[1]);
76
- }
77
- }
78
-
79
- on(...args: any[]) {
80
- if (this[APP_INIT]) {
81
- debug('on(%s), pass to app', args);
82
- this._instance.on(args[0], args[1]);
83
- } else {
84
- debug('on(%s), cache it because app has not init', args);
85
- if (this.#initOnListeners) {
86
- this.#initOnListeners.add(args);
87
- }
88
- super.on(args[0], args[1]);
89
- }
90
- return this;
91
- }
92
-
93
- once(...args: any[]) {
94
- if (this[APP_INIT]) {
95
- debug('once(%s), pass to app', args);
96
- this._instance.once(args[0], args[1]);
97
- } else {
98
- debug('once(%s), cache it because app has not init', args);
99
- if (this.#initOnceListeners) {
100
- this.#initOnceListeners.add(args);
101
- }
102
- super.on(args[0], args[1]);
103
- }
104
- return this;
105
- }
106
-
107
- /**
108
- * close app
109
- */
110
- async _close() {
111
- if (this._instance) {
112
- await this._instance.close();
113
- } else {
114
- // when app init throws an exception, must wait for app quit gracefully
115
- await sleep(200);
116
- }
117
- }
118
- }
119
-
120
- export function createApp(initOptions: MockOptions) {
121
- const app = new MockParallelApplication(formatOptions(initOptions));
122
- return proxyApp(app);
123
- }
@@ -1,66 +0,0 @@
1
- import { debuglog } from 'node:util';
2
- import { getProperty } from '../utils.js';
3
-
4
- const debug = debuglog('@eggjs/mock/lib/parallel/util');
5
-
6
- export const MOCK_APP_METHOD = [
7
- 'ready',
8
- 'isClosed',
9
- 'closed',
10
- 'close',
11
- 'on',
12
- 'once',
13
- ];
14
-
15
- export const APP_INIT = Symbol('appInit');
16
-
17
- export function proxyApp(app: any) {
18
- const proxyApp = new Proxy(app, {
19
- get(target, prop: string) {
20
- // don't delegate properties on MockAgent
21
- if (MOCK_APP_METHOD.includes(prop)) {
22
- return getProperty(target, prop);
23
- }
24
- if (!target[APP_INIT]) throw new Error(`can't get ${prop} before ready`);
25
- // it's asynchronous when agent and app are loading,
26
- // so should get the properties after loader ready
27
- debug('proxy handler.get %s', prop);
28
- return target._instance[prop];
29
- },
30
- set(target, prop: string, value) {
31
- if (MOCK_APP_METHOD.includes(prop)) return true;
32
- if (!target[APP_INIT]) throw new Error(`can't set ${prop} before ready`);
33
- debug('proxy handler.set %s', prop);
34
- target._instance[prop] = value;
35
- return true;
36
- },
37
- defineProperty(target, prop: string, descriptor) {
38
- // can't define properties on MockAgent
39
- if (MOCK_APP_METHOD.includes(prop)) return true;
40
- if (!target[APP_INIT]) throw new Error(`can't defineProperty ${prop} before ready`);
41
- debug('proxy handler.defineProperty %s', prop);
42
- Object.defineProperty(target._instance, prop, descriptor);
43
- return true;
44
- },
45
- deleteProperty(target, prop: string) {
46
- // can't delete properties on MockAgent
47
- if (MOCK_APP_METHOD.includes(prop)) return true;
48
- if (!target[APP_INIT]) throw new Error(`can't delete ${prop} before ready`);
49
- debug('proxy handler.deleteProperty %s', prop);
50
- delete target._instance[prop];
51
- return true;
52
- },
53
- getOwnPropertyDescriptor(target, prop: string) {
54
- if (MOCK_APP_METHOD.includes(prop)) return Object.getOwnPropertyDescriptor(target, prop);
55
- if (!target[APP_INIT]) throw new Error(`can't getOwnPropertyDescriptor ${prop} before ready`);
56
- debug('proxy handler.getOwnPropertyDescriptor %s', prop);
57
- return Object.getOwnPropertyDescriptor(target._instance, prop);
58
- },
59
- getPrototypeOf(target) {
60
- if (!target[APP_INIT]) throw new Error('can\'t getPrototypeOf before ready');
61
- debug('proxy handler.getPrototypeOf %s');
62
- return Object.getPrototypeOf(target._instance);
63
- },
64
- });
65
- return proxyApp;
66
- }
@@ -1,25 +0,0 @@
1
- // const debug = require('util').debuglog('egg-mock/prerequire');
2
- // const path = require('path');
3
- // const { existsSync } = require('fs');
4
- // const globby = require('globby');
5
-
6
- // const cwd = process.cwd();
7
- // const dirs = [];
8
- // if (existsSync(path.join(cwd, 'app'))) {
9
- // dirs.push('app/**/*.js');
10
- // }
11
- // // avoid Error: ENOENT: no such file or directory, scandir
12
- // if (existsSync(path.join(cwd, 'config'))) {
13
- // dirs.push('config/**/*.js');
14
- // }
15
- // const files = globby.sync(dirs, { cwd });
16
-
17
- // for (const file of files) {
18
- // const filepath = path.join(cwd, file);
19
- // try {
20
- // debug('%s prerequire %s', process.pid, filepath);
21
- // require(filepath);
22
- // } catch (err) {
23
- // debug('prerequire error %s', err.message);
24
- // }
25
- // }
@@ -1,49 +0,0 @@
1
- import httpClient from 'urllib';
2
-
3
- const { port, method, args, property, needResult } = JSON.parse(process.argv[2]);
4
- const url = `http://127.0.0.1:${port}/__egg_mock_call_function`;
5
-
6
- httpClient.request(url, {
7
- method: 'POST',
8
- data: {
9
- method,
10
- args,
11
- property,
12
- needResult,
13
- },
14
- contentType: 'json',
15
- dataType: 'json',
16
- }).then(({ data }) => {
17
- if (!data.success) {
18
- // console.log('POST %s error, method: %s, args: %j, result data: %j',
19
- // url, method, args, data);
20
- if (data.error) {
21
- console.error(data.error);
22
- } else if (data.message) {
23
- const err = new Error(data.message);
24
- err.stack = data.stack;
25
- console.error(err);
26
- }
27
- process.exit(2);
28
- }
29
-
30
- if (data.result) {
31
- console.log('%j', data.result);
32
- }
33
- process.exit(0);
34
- }).catch(err => {
35
- // ignore ECONNREFUSED error on mockRestore
36
- if (method === 'mockRestore' && err.message.includes('ECONNREFUSED')) {
37
- process.exit(0);
38
- }
39
-
40
- console.error('POST %s error, method: %s, args: %j', url, method, args);
41
- console.error(err.stack);
42
-
43
- // ignore all error on mockRestore
44
- if (method === 'mockRestore') {
45
- process.exit(0);
46
- } else {
47
- process.exit(1);
48
- }
49
- });
@@ -1,14 +0,0 @@
1
- import { debuglog } from 'node:util';
2
- import { restore as mmRestore } from 'mm';
3
- import { restoreMockAgent } from './mock_agent.js';
4
- import { restore as clusterRestore } from './cluster.js';
5
-
6
- const debug = debuglog('@eggjs/mock/lib/restore');
7
-
8
- export async function restore() {
9
- // keep mm.restore execute in the current event loop
10
- mmRestore();
11
- await clusterRestore();
12
- await restoreMockAgent();
13
- debug('restore all');
14
- }
@@ -1,23 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- import assert from 'node:assert';
4
- import { debuglog } from 'node:util';
5
- import { importModule } from '@eggjs/utils';
6
- import { isAsyncFunction } from 'is-type-of';
7
-
8
- const debug = debuglog('@eggjs/mock/lib/start-cluster');
9
-
10
- // if (process.env.EGG_BIN_PREREQUIRE) {
11
- // require('./prerequire');
12
- // }
13
-
14
- async function main() {
15
- const options = JSON.parse(process.argv[2]);
16
- debug('startCluster with options: %o', options);
17
- const { startCluster } = await importModule(options.framework);
18
- assert(isAsyncFunction(startCluster),
19
- `framework(${options.framework}) should export startCluster as an async function`);
20
- await startCluster(options);
21
- }
22
-
23
- main();
@@ -1,45 +0,0 @@
1
- import path from 'node:path';
2
- import { readJSONSync } from 'utility';
3
- import { Request, Test } from '@eggjs/supertest';
4
- import { createServer } from './mock_http_server.js';
5
- import { getSourceDirname } from './utils.js';
6
-
7
- // patch from https://github.com/visionmedia/supertest/blob/199506d8dbfe0bb1434fc07c38cdcd1ab4c7c926/index.js#L19
8
-
9
- let pkgVersion = '';
10
-
11
- /**
12
- * Test against the given `app`,
13
- * returning a new `Test`.
14
- */
15
- export class EggTestRequest extends Request {
16
- #app: any;
17
-
18
- constructor(app: any) {
19
- super(createServer(app));
20
- this.#app = app;
21
- }
22
-
23
- protected _testRequest(method: string, url: string): Test {
24
- // support pathFor(url)
25
- if (url[0] !== '/') {
26
- const realUrl = this.#app.router.pathFor(url);
27
- if (!realUrl) {
28
- throw new Error(`Can\'t find router:${url}, please check your \'app/router.js\'`);
29
- }
30
- url = realUrl;
31
- }
32
- const test = super._testRequest(method, url);
33
- if (!pkgVersion) {
34
- const pkgFile = path.join(getSourceDirname(), '../package.json');
35
- const pkg = readJSONSync(pkgFile);
36
- pkgVersion = pkg.version;
37
- }
38
- test.set('User-Agent', `@eggjs/mock/${pkgVersion} Node.js/${process.version}`);
39
- return test;
40
- }
41
- }
42
-
43
- export function request(app: any) {
44
- return new EggTestRequest(app);
45
- }
File without changes
File without changes