@eggjs/mock 6.0.0-beta.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.
Files changed (159) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +547 -0
  3. package/README.zh_CN.md +512 -0
  4. package/dist/commonjs/app/extend/agent.d.ts +33 -0
  5. package/dist/commonjs/app/extend/agent.js +49 -0
  6. package/dist/commonjs/app/extend/application.d.ts +175 -0
  7. package/dist/commonjs/app/extend/application.js +448 -0
  8. package/dist/commonjs/app/middleware/cluster_app_mock.d.ts +3 -0
  9. package/dist/commonjs/app/middleware/cluster_app_mock.js +100 -0
  10. package/dist/commonjs/app.d.ts +6 -0
  11. package/dist/commonjs/app.js +20 -0
  12. package/dist/commonjs/bootstrap.d.ts +4 -0
  13. package/dist/commonjs/bootstrap.js +58 -0
  14. package/dist/commonjs/index.d.ts +76 -0
  15. package/dist/commonjs/index.js +99 -0
  16. package/dist/commonjs/index.test-d.d.ts +1 -0
  17. package/dist/commonjs/index.test-d.js +43 -0
  18. package/dist/commonjs/lib/agent_handler.d.ts +3 -0
  19. package/dist/commonjs/lib/agent_handler.js +28 -0
  20. package/dist/commonjs/lib/app.d.ts +28 -0
  21. package/dist/commonjs/lib/app.js +303 -0
  22. package/dist/commonjs/lib/app_handler.d.ts +5 -0
  23. package/dist/commonjs/lib/app_handler.js +67 -0
  24. package/dist/commonjs/lib/cluster.d.ts +114 -0
  25. package/dist/commonjs/lib/cluster.js +337 -0
  26. package/dist/commonjs/lib/context.d.ts +1 -0
  27. package/dist/commonjs/lib/context.js +16 -0
  28. package/dist/commonjs/lib/format_options.d.ts +5 -0
  29. package/dist/commonjs/lib/format_options.js +100 -0
  30. package/dist/commonjs/lib/inject_context.d.ts +6 -0
  31. package/dist/commonjs/lib/inject_context.js +132 -0
  32. package/dist/commonjs/lib/mock_agent.d.ts +5 -0
  33. package/dist/commonjs/lib/mock_agent.js +49 -0
  34. package/dist/commonjs/lib/mock_custom_loader.d.ts +1 -0
  35. package/dist/commonjs/lib/mock_custom_loader.js +37 -0
  36. package/dist/commonjs/lib/mock_http_server.d.ts +2 -0
  37. package/dist/commonjs/lib/mock_http_server.js +24 -0
  38. package/dist/commonjs/lib/mock_httpclient.d.ts +35 -0
  39. package/dist/commonjs/lib/mock_httpclient.js +147 -0
  40. package/dist/commonjs/lib/parallel/agent.d.ts +20 -0
  41. package/dist/commonjs/lib/parallel/agent.js +125 -0
  42. package/dist/commonjs/lib/parallel/app.d.ts +20 -0
  43. package/dist/commonjs/lib/parallel/app.js +115 -0
  44. package/dist/commonjs/lib/parallel/util.d.ts +3 -0
  45. package/dist/commonjs/lib/parallel/util.js +77 -0
  46. package/dist/commonjs/lib/prerequire.d.ts +1 -0
  47. package/dist/commonjs/lib/prerequire.js +26 -0
  48. package/dist/commonjs/lib/request_call_function.d.ts +1 -0
  49. package/dist/commonjs/lib/request_call_function.js +52 -0
  50. package/dist/commonjs/lib/restore.d.ts +1 -0
  51. package/dist/commonjs/lib/restore.js +16 -0
  52. package/dist/commonjs/lib/start-cluster.d.ts +2 -0
  53. package/dist/commonjs/lib/start-cluster.js +23 -0
  54. package/dist/commonjs/lib/supertest.d.ts +11 -0
  55. package/dist/commonjs/lib/supertest.js +48 -0
  56. package/dist/commonjs/lib/tmp/empty.d.ts +1 -0
  57. package/dist/commonjs/lib/tmp/empty.js +3 -0
  58. package/dist/commonjs/lib/types.d.ts +60 -0
  59. package/dist/commonjs/lib/types.js +3 -0
  60. package/dist/commonjs/lib/utils.d.ts +9 -0
  61. package/dist/commonjs/lib/utils.js +80 -0
  62. package/dist/commonjs/package.json +3 -0
  63. package/dist/commonjs/register.d.ts +8 -0
  64. package/dist/commonjs/register.js +80 -0
  65. package/dist/esm/app/extend/agent.d.ts +33 -0
  66. package/dist/esm/app/extend/agent.js +46 -0
  67. package/dist/esm/app/extend/application.d.ts +175 -0
  68. package/dist/esm/app/extend/application.js +442 -0
  69. package/dist/esm/app/middleware/cluster_app_mock.d.ts +3 -0
  70. package/dist/esm/app/middleware/cluster_app_mock.js +98 -0
  71. package/dist/esm/app.d.ts +6 -0
  72. package/dist/esm/app.js +17 -0
  73. package/dist/esm/bootstrap.d.ts +4 -0
  74. package/dist/esm/bootstrap.js +16 -0
  75. package/dist/esm/index.d.ts +76 -0
  76. package/dist/esm/index.js +90 -0
  77. package/dist/esm/index.test-d.d.ts +1 -0
  78. package/dist/esm/index.test-d.js +42 -0
  79. package/dist/esm/lib/agent_handler.d.ts +3 -0
  80. package/dist/esm/lib/agent_handler.js +24 -0
  81. package/dist/esm/lib/app.d.ts +28 -0
  82. package/dist/esm/lib/app.js +295 -0
  83. package/dist/esm/lib/app_handler.d.ts +5 -0
  84. package/dist/esm/lib/app_handler.js +61 -0
  85. package/dist/esm/lib/cluster.d.ts +114 -0
  86. package/dist/esm/lib/cluster.js +328 -0
  87. package/dist/esm/lib/context.d.ts +1 -0
  88. package/dist/esm/lib/context.js +13 -0
  89. package/dist/esm/lib/format_options.d.ts +5 -0
  90. package/dist/esm/lib/format_options.js +94 -0
  91. package/dist/esm/lib/inject_context.d.ts +6 -0
  92. package/dist/esm/lib/inject_context.js +126 -0
  93. package/dist/esm/lib/mock_agent.d.ts +5 -0
  94. package/dist/esm/lib/mock_agent.js +45 -0
  95. package/dist/esm/lib/mock_custom_loader.d.ts +1 -0
  96. package/dist/esm/lib/mock_custom_loader.js +34 -0
  97. package/dist/esm/lib/mock_http_server.d.ts +2 -0
  98. package/dist/esm/lib/mock_http_server.js +18 -0
  99. package/dist/esm/lib/mock_httpclient.d.ts +35 -0
  100. package/dist/esm/lib/mock_httpclient.js +144 -0
  101. package/dist/esm/lib/parallel/agent.d.ts +20 -0
  102. package/dist/esm/lib/parallel/agent.js +117 -0
  103. package/dist/esm/lib/parallel/app.d.ts +20 -0
  104. package/dist/esm/lib/parallel/app.js +110 -0
  105. package/dist/esm/lib/parallel/util.d.ts +3 -0
  106. package/dist/esm/lib/parallel/util.js +73 -0
  107. package/dist/esm/lib/prerequire.d.ts +1 -0
  108. package/dist/esm/lib/prerequire.js +25 -0
  109. package/dist/esm/lib/request_call_function.d.ts +1 -0
  110. package/dist/esm/lib/request_call_function.js +47 -0
  111. package/dist/esm/lib/restore.d.ts +1 -0
  112. package/dist/esm/lib/restore.js +13 -0
  113. package/dist/esm/lib/start-cluster.d.ts +2 -0
  114. package/dist/esm/lib/start-cluster.js +18 -0
  115. package/dist/esm/lib/supertest.d.ts +11 -0
  116. package/dist/esm/lib/supertest.js +40 -0
  117. package/dist/esm/lib/tmp/empty.d.ts +1 -0
  118. package/dist/esm/lib/tmp/empty.js +2 -0
  119. package/dist/esm/lib/types.d.ts +60 -0
  120. package/dist/esm/lib/types.js +2 -0
  121. package/dist/esm/lib/utils.d.ts +9 -0
  122. package/dist/esm/lib/utils.js +69 -0
  123. package/dist/esm/package.json +3 -0
  124. package/dist/esm/register.d.ts +8 -0
  125. package/dist/esm/register.js +75 -0
  126. package/dist/package.json +4 -0
  127. package/package.json +131 -0
  128. package/src/app/extend/agent.ts +56 -0
  129. package/src/app/extend/application.ts +512 -0
  130. package/src/app/middleware/cluster_app_mock.ts +101 -0
  131. package/src/app.ts +18 -0
  132. package/src/bootstrap.ts +25 -0
  133. package/src/index.d.ts +193 -0
  134. package/src/index.test-d.ts +47 -0
  135. package/src/index.ts +110 -0
  136. package/src/lib/agent_handler.ts +28 -0
  137. package/src/lib/app.ts +313 -0
  138. package/src/lib/app_handler.ts +69 -0
  139. package/src/lib/cluster.ts +363 -0
  140. package/src/lib/context.ts +14 -0
  141. package/src/lib/format_options.ts +103 -0
  142. package/src/lib/inject_context.ts +134 -0
  143. package/src/lib/mock_agent.ts +57 -0
  144. package/src/lib/mock_custom_loader.ts +36 -0
  145. package/src/lib/mock_http_server.ts +19 -0
  146. package/src/lib/mock_httpclient.ts +181 -0
  147. package/src/lib/parallel/agent.ts +128 -0
  148. package/src/lib/parallel/app.ts +123 -0
  149. package/src/lib/parallel/util.ts +66 -0
  150. package/src/lib/prerequire.ts +25 -0
  151. package/src/lib/request_call_function.ts +49 -0
  152. package/src/lib/restore.ts +14 -0
  153. package/src/lib/start-cluster.ts +23 -0
  154. package/src/lib/supertest.ts +45 -0
  155. package/src/lib/tmp/.gitkeep +0 -0
  156. package/src/lib/tmp/empty.ts +0 -0
  157. package/src/lib/types.ts +72 -0
  158. package/src/lib/utils.ts +82 -0
  159. package/src/register.ts +80 -0
@@ -0,0 +1,34 @@
1
+ import { debuglog } from 'node:util';
2
+ const debug = debuglog('@eggjs/mock/lib/mock_custom_loader');
3
+ export function setCustomLoader(app) {
4
+ const customLoader = app.config.customLoader;
5
+ if (!customLoader)
6
+ return;
7
+ for (const field of Object.keys(customLoader)) {
8
+ const loaderConfig = Object.assign({}, customLoader[field]);
9
+ loaderConfig.field = field;
10
+ addMethod(loaderConfig);
11
+ }
12
+ function addMethod(loaderConfig) {
13
+ const field = loaderConfig.field;
14
+ const appMethodName = 'mock' + field.replace(/^[a-z]/i, s => s.toUpperCase());
15
+ if (app[appMethodName]) {
16
+ app.coreLogger.warn('Can\'t override app.%s', appMethodName);
17
+ return;
18
+ }
19
+ debug('[addMethod] %s => %j', appMethodName, loaderConfig);
20
+ app[appMethodName] = function (service, methodName, fn) {
21
+ if (typeof service === 'string') {
22
+ const arr = service.split('.');
23
+ service = loaderConfig.inject === 'ctx' ? this[field + 'Classes'] : this[field];
24
+ for (const key of arr) {
25
+ service = service[key];
26
+ }
27
+ service = service.prototype || service;
28
+ }
29
+ this._mockFn(service, methodName, fn);
30
+ return this;
31
+ };
32
+ }
33
+ }
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja19jdXN0b21fbG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tb2NrX2N1c3RvbV9sb2FkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVyQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsb0NBQW9DLENBQUMsQ0FBQztBQUU3RCxNQUFNLFVBQVUsZUFBZSxDQUFDLEdBQVE7SUFDdEMsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUM7SUFDN0MsSUFBSSxDQUFDLFlBQVk7UUFBRSxPQUFPO0lBRTFCLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1FBQzlDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzVELFlBQVksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQzNCLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsU0FBUyxTQUFTLENBQUMsWUFBaUI7UUFDbEMsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLEtBQWUsQ0FBQztRQUMzQyxNQUFNLGFBQWEsR0FBRyxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUM5RSxJQUFJLEdBQUcsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQzdELE9BQU87UUFDVCxDQUFDO1FBQ0QsS0FBSyxDQUFDLHNCQUFzQixFQUFFLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUMzRCxHQUFHLENBQUMsYUFBYSxDQUFDLEdBQUcsVUFBUyxPQUFZLEVBQUUsVUFBa0IsRUFBRSxFQUFPO1lBQ3JFLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ2hDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQy9CLE9BQU8sR0FBRyxZQUFZLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNoRixLQUFLLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO29CQUN0QixPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN6QixDQUFDO2dCQUNELE9BQU8sR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQztZQUN6QyxDQUFDO1lBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3RDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUMifQ==
@@ -0,0 +1,2 @@
1
+ import { Server } from 'node:http';
2
+ export declare function createServer(app: any): Server;
@@ -0,0 +1,18 @@
1
+ import http from 'node:http';
2
+ const SERVER = Symbol('http_server');
3
+ export function createServer(app) {
4
+ let server = app[SERVER] || app.callback();
5
+ if (typeof server === 'function') {
6
+ server = http.createServer(server);
7
+ // cache server, avoid create many times
8
+ app[SERVER] = server;
9
+ if (!app.server) {
10
+ app.server = server;
11
+ }
12
+ // emit server event just like egg-cluster does
13
+ // https://github.com/eggjs/egg-cluster/blob/master/lib/app_worker.js#L52
14
+ app.emit('server', server);
15
+ }
16
+ return server;
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja19odHRwX3NlcnZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvbW9ja19odHRwX3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLElBQWdCLE1BQU0sV0FBVyxDQUFDO0FBRXpDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUVyQyxNQUFNLFVBQVUsWUFBWSxDQUFDLEdBQVE7SUFDbkMsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQyxJQUFJLE9BQU8sTUFBTSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ2pDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25DLHdDQUF3QztRQUN4QyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsR0FBRyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDdEIsQ0FBQztRQUNELCtDQUErQztRQUMvQyx5RUFBeUU7UUFDekUsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMifQ==
@@ -0,0 +1,35 @@
1
+ import type { Dispatcher, Headers, BodyInit } from 'urllib';
2
+ export interface MockResultOptions {
3
+ data: string | Buffer | Record<string, any>;
4
+ /**
5
+ * http status
6
+ */
7
+ status?: number;
8
+ /**
9
+ * response header
10
+ */
11
+ headers?: Record<string, string>;
12
+ /**
13
+ * delay the associated reply by a set amount in ms
14
+ */
15
+ delay?: number;
16
+ /**
17
+ * any matching request will always reply with the defined response indefinitely
18
+ */
19
+ persist?: boolean;
20
+ /**
21
+ * any matching request will reply with the defined response a fixed amount of times
22
+ */
23
+ repeats?: number;
24
+ }
25
+ export interface MockResponseCallbackOptions {
26
+ path: string;
27
+ method: string;
28
+ headers?: Headers | Record<string, string>;
29
+ origin?: string;
30
+ body?: BodyInit | Dispatcher.DispatchOptions['body'] | null;
31
+ maxRedirections?: number;
32
+ }
33
+ export type MockResultFunction = (url: string, options: MockResponseCallbackOptions) => MockResultOptions | string;
34
+ export declare function createMockHttpClient(app: any): (mockUrl: string | RegExp, mockMethod: string | string[] | MockResultOptions | MockResultFunction, mockResult?: MockResultOptions | MockResultFunction | string) => void;
35
+ export type MockHttpClientMethod = ReturnType<typeof createMockHttpClient>;
@@ -0,0 +1,144 @@
1
+ import { mm } from 'mm';
2
+ import { extend } from 'extend2';
3
+ import { getMockAgent } from './mock_agent.js';
4
+ function normalizeResult(result) {
5
+ if (typeof result === 'string') {
6
+ result = { data: result };
7
+ }
8
+ if (!result.status) {
9
+ result.status = 200;
10
+ }
11
+ result.data = result.data || '';
12
+ if (Buffer.isBuffer(result.data)) {
13
+ // do nothing
14
+ }
15
+ else if (typeof result.data === 'object') {
16
+ // json
17
+ result.data = Buffer.from(JSON.stringify(result.data));
18
+ }
19
+ else if (typeof result.data === 'string') {
20
+ // string
21
+ result.data = Buffer.from(result.data);
22
+ }
23
+ else {
24
+ throw new Error('`mockResult.data` must be buffer, string or json');
25
+ }
26
+ result.headers = result.headers ?? {};
27
+ return result;
28
+ }
29
+ const MOCK_CONFIGS = Symbol('MOCK_CONFIGS');
30
+ const MOCK_CONFIG_INDEX = Symbol('MOCK_CONFIG_INDEX');
31
+ export function createMockHttpClient(app) {
32
+ /**
33
+ * mock httpclient
34
+ * @function mockHttpclient
35
+ * @param {String} mockUrl - url
36
+ * @param {String|Array} mockMethod - http method, default is '*'
37
+ * @param {Object|Function} mockResult - you data
38
+ * - data - buffer / string / json
39
+ * - status - http status
40
+ * - headers - response header
41
+ * - delay - delay the associated reply by a set amount in ms.
42
+ * - persist - any matching request will always reply with the defined response indefinitely, default is true
43
+ * - repeats - number, any matching request will reply with the defined response a fixed amount of times
44
+ */
45
+ return function mockHttpClient(mockUrl, mockMethod, mockResult) {
46
+ let mockMethods = mockMethod;
47
+ if (!mockResult) {
48
+ // app.mockHttpclient(mockUrl, mockResult)
49
+ mockResult = mockMethod;
50
+ mockMethods = ['*'];
51
+ }
52
+ if (!Array.isArray(mockMethods)) {
53
+ mockMethods = [mockMethods];
54
+ }
55
+ mockMethods = mockMethods.map(method => (method || 'GET').toUpperCase());
56
+ // use MockAgent on undici
57
+ let mockConfigs = app[MOCK_CONFIGS];
58
+ if (!mockConfigs) {
59
+ mockConfigs = [];
60
+ mm(app, MOCK_CONFIGS, mockConfigs);
61
+ }
62
+ let mockConfigIndex = -1;
63
+ let origin = mockUrl;
64
+ let originMethod;
65
+ const pathname = mockUrl;
66
+ let pathMethod;
67
+ if (typeof mockUrl === 'string') {
68
+ const urlObject = new URL(mockUrl);
69
+ origin = urlObject.origin;
70
+ const originalPathname = urlObject.pathname;
71
+ pathMethod = path => {
72
+ if (path === originalPathname)
73
+ return true;
74
+ // should match /foo?a=1 including query
75
+ if (path.includes('?'))
76
+ return path.startsWith(originalPathname);
77
+ return false;
78
+ };
79
+ }
80
+ else if (mockUrl instanceof RegExp) {
81
+ let requestOrigin = '';
82
+ originMethod = value => {
83
+ requestOrigin = value;
84
+ return true;
85
+ };
86
+ pathMethod = path => {
87
+ for (const config of mockConfigs) {
88
+ if (config.mockUrl.test(`${requestOrigin}${path}`)) {
89
+ mm(app, MOCK_CONFIG_INDEX, config.mockConfigIndex);
90
+ return true;
91
+ }
92
+ }
93
+ return false;
94
+ };
95
+ mockConfigIndex = mockConfigs.length;
96
+ mockConfigs.push({ mockUrl, mockResult, mockConfigIndex });
97
+ }
98
+ const mockPool = originMethod
99
+ ? getMockAgent(app).get(originMethod)
100
+ : getMockAgent(app).get(originMethod ?? origin);
101
+ // persist default is true
102
+ let persist = true;
103
+ if (typeof mockResult === 'object' && typeof mockResult.persist === 'boolean') {
104
+ persist = mockResult.persist;
105
+ }
106
+ mockMethods.forEach(function (method) {
107
+ const mockScope = mockPool.intercept({
108
+ path: pathMethod ?? pathname,
109
+ method: method === '*' ? () => true : method,
110
+ }).reply(options => {
111
+ // not support mockResult as an async function
112
+ const requestUrl = `${options.origin}${options.path}`;
113
+ let mockRequestResult;
114
+ if (mockConfigIndex >= 0) {
115
+ mockResult = mockConfigs[app[MOCK_CONFIG_INDEX]].mockResult;
116
+ mockRequestResult = typeof mockResult === 'function' ? mockResult(requestUrl, options) : mockResult;
117
+ }
118
+ else {
119
+ mockRequestResult = typeof mockResult === 'function' ? mockResult(requestUrl, options) : mockResult;
120
+ }
121
+ const result = extend(true, {}, normalizeResult(mockRequestResult));
122
+ return {
123
+ statusCode: result.status,
124
+ data: result.data,
125
+ responseOptions: {
126
+ headers: result.headers,
127
+ },
128
+ };
129
+ });
130
+ if (typeof mockResult === 'object') {
131
+ if (mockResult.delay && mockResult.delay > 0) {
132
+ mockScope.delay(mockResult.delay);
133
+ }
134
+ }
135
+ if (persist) {
136
+ mockScope.persist();
137
+ }
138
+ else if (typeof mockResult === 'object' && mockResult.repeats && mockResult.repeats > 0) {
139
+ mockScope.times(mockResult.repeats);
140
+ }
141
+ });
142
+ };
143
+ }
144
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja19odHRwY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tb2NrX2h0dHBjbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLElBQUksQ0FBQztBQUN4QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWpDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQXNDL0MsU0FBUyxlQUFlLENBQUMsTUFBa0M7SUFDekQsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMvQixNQUFNLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbkIsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7SUFDdEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7SUFDaEMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2pDLGFBQWE7SUFDZixDQUFDO1NBQU0sSUFBSSxPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDM0MsT0FBTztRQUNQLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7U0FBTSxJQUFJLE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMzQyxTQUFTO1FBQ1QsTUFBTSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FB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
@@ -0,0 +1,20 @@
1
+ import { Base } from 'sdk-base';
2
+ import type { EggCore } from '@eggjs/core';
3
+ import { MockOptions, MockApplicationOptions } from '../types.js';
4
+ import { APP_INIT } from './util.js';
5
+ export declare class MockAgent extends Base {
6
+ #private;
7
+ options: MockApplicationOptions;
8
+ baseDir: string;
9
+ [APP_INIT]: boolean;
10
+ _instance: EggCore;
11
+ constructor(options: MockApplicationOptions);
12
+ _init(): Promise<void>;
13
+ on(...args: any[]): this;
14
+ once(...args: any[]): this;
15
+ /**
16
+ * close agent
17
+ */
18
+ _close(): Promise<void>;
19
+ }
20
+ export declare function createAgent(options: MockOptions): MockAgent;
@@ -0,0 +1,117 @@
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 { context } from '../context.js';
7
+ import { formatOptions } from '../format_options.js';
8
+ import { sleep, rimraf } from '../utils.js';
9
+ import { setCustomLoader } from '../mock_custom_loader.js';
10
+ import { APP_INIT } from './util.js';
11
+ const debug = debuglog('@eggjs/mock/lib/parallel/agent');
12
+ export class MockAgent extends Base {
13
+ baseDir;
14
+ [APP_INIT] = false;
15
+ #initOnListeners = new Set();
16
+ #initOnceListeners = new Set();
17
+ _instance;
18
+ constructor(options) {
19
+ super({ initMethod: '_init' });
20
+ this.options = options;
21
+ this.baseDir = this.options.baseDir;
22
+ }
23
+ async _init() {
24
+ if (this.options.beforeInit) {
25
+ await this.options.beforeInit(this);
26
+ delete this.options.beforeInit;
27
+ }
28
+ if (this.options.clean !== false) {
29
+ const logDir = path.join(this.options.baseDir, 'logs');
30
+ try {
31
+ await rimraf(logDir);
32
+ }
33
+ catch (err) {
34
+ console.error(`remove log dir ${logDir} failed: ${err.stack}`);
35
+ }
36
+ const runDir = path.join(this.options.baseDir, 'run');
37
+ try {
38
+ await rimraf(runDir);
39
+ }
40
+ catch (err) {
41
+ console.error(`remove run dir ${runDir} failed: ${err.stack}`);
42
+ }
43
+ }
44
+ this.options.clusterPort = await detectPort();
45
+ process.env.CLUSTER_PORT = String(this.options.clusterPort);
46
+ debug('get clusterPort %s', this.options.clusterPort);
47
+ const { Agent } = await importModule(this.options.framework);
48
+ const agent = this._instance = new Agent({ ...this.options });
49
+ // egg-mock plugin need to override egg context
50
+ Object.assign(agent.context, context);
51
+ setCustomLoader(agent);
52
+ debug('agent instantiate');
53
+ this[APP_INIT] = true;
54
+ debug('this[APP_INIT] = true');
55
+ this.#bindEvents();
56
+ await agent.ready();
57
+ const msg = {
58
+ action: 'egg-ready',
59
+ data: this.options,
60
+ };
61
+ agent.messenger.onMessage(msg);
62
+ debug('agent ready');
63
+ }
64
+ #bindEvents() {
65
+ debug('bind cache events to agent');
66
+ for (const args of this.#initOnListeners) {
67
+ debug('on(%s), use cache and pass to agent', args);
68
+ this._instance.on(args[0], args[1]);
69
+ this.removeListener(args[0], args[1]);
70
+ }
71
+ for (const args of this.#initOnceListeners) {
72
+ debug('once(%s), use cache and pass to agent', args);
73
+ this._instance.once(args[0], args[1]);
74
+ this.removeListener(args[0], args[1]);
75
+ }
76
+ }
77
+ on(...args) {
78
+ if (this[APP_INIT]) {
79
+ debug('on(%s), pass to agent', args);
80
+ this._instance.on(args[0], args[1]);
81
+ }
82
+ else {
83
+ debug('on(%s), cache it because agent has not init', args);
84
+ this.#initOnListeners.add(args);
85
+ super.on(args[0], args[1]);
86
+ }
87
+ return this;
88
+ }
89
+ once(...args) {
90
+ if (this[APP_INIT]) {
91
+ debug('once(%s), pass to agent', args);
92
+ this._instance.once(args[0], args[1]);
93
+ }
94
+ else {
95
+ debug('once(%s), cache it because agent has not init', args);
96
+ this.#initOnceListeners.add(args);
97
+ super.on(args[0], args[1]);
98
+ }
99
+ return this;
100
+ }
101
+ /**
102
+ * close agent
103
+ */
104
+ async _close() {
105
+ if (this._instance) {
106
+ await this._instance.close();
107
+ }
108
+ else {
109
+ // when agent init throws an exception, must wait for agent quit gracefully
110
+ await sleep(200);
111
+ }
112
+ }
113
+ }
114
+ export function createAgent(options) {
115
+ return new MockAgent(formatOptions(options));
116
+ }
117
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3BhcmFsbGVsL2FnZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDckMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTVDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXJDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0FBRXpELE1BQU0sT0FBTyxTQUFVLFNBQVEsSUFBSTtJQUVqQyxPQUFPLENBQVM7SUFDaEIsQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDbkIsZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQVMsQ0FBQztJQUNwQyxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBUyxDQUFDO0lBQ3RDLFNBQVMsQ0FBVTtJQUVuQixZQUFZLE9BQStCO1FBQ3pDLEtBQUssQ0FBQyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9B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
@@ -0,0 +1,20 @@
1
+ import { Base } from 'sdk-base';
2
+ import type { EggCore } from '@eggjs/core';
3
+ import { MockOptions, MockApplicationOptions } from '../types.js';
4
+ import { APP_INIT } from './util.js';
5
+ export declare class MockParallelApplication extends Base {
6
+ #private;
7
+ options: MockApplicationOptions;
8
+ baseDir: string;
9
+ [APP_INIT]: boolean;
10
+ _instance: EggCore;
11
+ constructor(options: MockApplicationOptions);
12
+ _init(): Promise<void>;
13
+ on(...args: any[]): this;
14
+ once(...args: any[]): this;
15
+ /**
16
+ * close app
17
+ */
18
+ _close(): Promise<void>;
19
+ }
20
+ export declare function createApp(initOptions: MockOptions): any;
@@ -0,0 +1,110 @@
1
+ import { debuglog } from 'node:util';
2
+ import { Base } from 'sdk-base';
3
+ import { importModule } from '@eggjs/utils';
4
+ import { context } from '../context.js';
5
+ import { formatOptions } from '../format_options.js';
6
+ import { sleep } from '../utils.js';
7
+ import { setCustomLoader } from '../mock_custom_loader.js';
8
+ import { createServer } from '../mock_http_server.js';
9
+ import { proxyApp, APP_INIT } from './util.js';
10
+ const debug = debuglog('@eggjs/mock/lib/parallel/app');
11
+ export class MockParallelApplication extends Base {
12
+ baseDir;
13
+ [APP_INIT] = false;
14
+ #initOnListeners = new Set();
15
+ #initOnceListeners = new Set();
16
+ _instance;
17
+ constructor(options) {
18
+ super({ initMethod: '_init' });
19
+ this.options = options;
20
+ this.baseDir = options.baseDir;
21
+ }
22
+ async _init() {
23
+ if (this.options.beforeInit) {
24
+ await this.options.beforeInit(this);
25
+ delete this.options.beforeInit;
26
+ }
27
+ if (!this.options.clusterPort) {
28
+ this.options.clusterPort = parseInt(process.env.CLUSTER_PORT);
29
+ }
30
+ if (!this.options.clusterPort) {
31
+ throw new Error('cannot get env.CLUSTER_PORT, parallel run fail');
32
+ }
33
+ debug('get clusterPort %s', this.options.clusterPort);
34
+ const { Application } = await importModule(this.options.framework);
35
+ const app = this._instance = new Application({ ...this.options });
36
+ // egg-mock plugin need to override egg context
37
+ Object.assign(app.context, context);
38
+ setCustomLoader(app);
39
+ debug('app instantiate');
40
+ this[APP_INIT] = true;
41
+ debug('this[APP_INIT] = true');
42
+ this.#bindEvents();
43
+ debug('http server instantiate');
44
+ createServer(app);
45
+ await app.ready();
46
+ const msg = {
47
+ action: 'egg-ready',
48
+ data: this.options,
49
+ };
50
+ app.messenger.onMessage(msg);
51
+ debug('app ready');
52
+ }
53
+ #bindEvents() {
54
+ for (const args of this.#initOnListeners) {
55
+ debug('on(%s), use cache and pass to app', args);
56
+ this._instance.on(args[0], args[1]);
57
+ this.removeListener(args[0], args[1]);
58
+ }
59
+ for (const args of this.#initOnceListeners) {
60
+ debug('once(%s), use cache and pass to app', args);
61
+ this._instance.once(args[0], args[1]);
62
+ this.removeListener(args[0], args[1]);
63
+ }
64
+ }
65
+ on(...args) {
66
+ if (this[APP_INIT]) {
67
+ debug('on(%s), pass to app', args);
68
+ this._instance.on(args[0], args[1]);
69
+ }
70
+ else {
71
+ debug('on(%s), cache it because app has not init', args);
72
+ if (this.#initOnListeners) {
73
+ this.#initOnListeners.add(args);
74
+ }
75
+ super.on(args[0], args[1]);
76
+ }
77
+ return this;
78
+ }
79
+ once(...args) {
80
+ if (this[APP_INIT]) {
81
+ debug('once(%s), pass to app', args);
82
+ this._instance.once(args[0], args[1]);
83
+ }
84
+ else {
85
+ debug('once(%s), cache it because app has not init', args);
86
+ if (this.#initOnceListeners) {
87
+ this.#initOnceListeners.add(args);
88
+ }
89
+ super.on(args[0], args[1]);
90
+ }
91
+ return this;
92
+ }
93
+ /**
94
+ * close app
95
+ */
96
+ async _close() {
97
+ if (this._instance) {
98
+ await this._instance.close();
99
+ }
100
+ else {
101
+ // when app init throws an exception, must wait for app quit gracefully
102
+ await sleep(200);
103
+ }
104
+ }
105
+ }
106
+ export function createApp(initOptions) {
107
+ const app = new MockParallelApplication(formatOptions(initOptions));
108
+ return proxyApp(app);
109
+ }
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9wYXJhbGxlbC9hcHAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFNUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNwQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRS9DLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0FBRXZELE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxJQUFJO0lBRS9DLE9BQU8sQ0FBUztJQUNoQixDQUFDLFFBQVEsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNuQixnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBUyxDQUFDO0lBQ3BDLGtCQUFrQixHQUFHLElBQUksR0FBRyxFQUFTLENBQUM7SUFDdEMsU0FBUyxDQUFVO0lBRW5CLFlBQVksT0FBK0I7UUFDekMsS0FBSyxDQUFDLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxLQUFLLENB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
@@ -0,0 +1,3 @@
1
+ export declare const MOCK_APP_METHOD: string[];
2
+ export declare const APP_INIT: unique symbol;
3
+ export declare function proxyApp(app: any): any;
@@ -0,0 +1,73 @@
1
+ import { debuglog } from 'node:util';
2
+ import { getProperty } from '../utils.js';
3
+ const debug = debuglog('@eggjs/mock/lib/parallel/util');
4
+ export const MOCK_APP_METHOD = [
5
+ 'ready',
6
+ 'isClosed',
7
+ 'closed',
8
+ 'close',
9
+ 'on',
10
+ 'once',
11
+ ];
12
+ export const APP_INIT = Symbol('appInit');
13
+ export function proxyApp(app) {
14
+ const proxyApp = new Proxy(app, {
15
+ get(target, prop) {
16
+ // don't delegate properties on MockAgent
17
+ if (MOCK_APP_METHOD.includes(prop)) {
18
+ return getProperty(target, prop);
19
+ }
20
+ if (!target[APP_INIT])
21
+ throw new Error(`can't get ${prop} before ready`);
22
+ // it's asynchronous when agent and app are loading,
23
+ // so should get the properties after loader ready
24
+ debug('proxy handler.get %s', prop);
25
+ return target._instance[prop];
26
+ },
27
+ set(target, prop, value) {
28
+ if (MOCK_APP_METHOD.includes(prop))
29
+ return true;
30
+ if (!target[APP_INIT])
31
+ throw new Error(`can't set ${prop} before ready`);
32
+ debug('proxy handler.set %s', prop);
33
+ target._instance[prop] = value;
34
+ return true;
35
+ },
36
+ defineProperty(target, prop, descriptor) {
37
+ // can't define properties on MockAgent
38
+ if (MOCK_APP_METHOD.includes(prop))
39
+ return true;
40
+ if (!target[APP_INIT])
41
+ throw new Error(`can't defineProperty ${prop} before ready`);
42
+ debug('proxy handler.defineProperty %s', prop);
43
+ Object.defineProperty(target._instance, prop, descriptor);
44
+ return true;
45
+ },
46
+ deleteProperty(target, prop) {
47
+ // can't delete properties on MockAgent
48
+ if (MOCK_APP_METHOD.includes(prop))
49
+ return true;
50
+ if (!target[APP_INIT])
51
+ throw new Error(`can't delete ${prop} before ready`);
52
+ debug('proxy handler.deleteProperty %s', prop);
53
+ delete target._instance[prop];
54
+ return true;
55
+ },
56
+ getOwnPropertyDescriptor(target, prop) {
57
+ if (MOCK_APP_METHOD.includes(prop))
58
+ return Object.getOwnPropertyDescriptor(target, prop);
59
+ if (!target[APP_INIT])
60
+ throw new Error(`can't getOwnPropertyDescriptor ${prop} before ready`);
61
+ debug('proxy handler.getOwnPropertyDescriptor %s', prop);
62
+ return Object.getOwnPropertyDescriptor(target._instance, prop);
63
+ },
64
+ getPrototypeOf(target) {
65
+ if (!target[APP_INIT])
66
+ throw new Error('can\'t getPrototypeOf before ready');
67
+ debug('proxy handler.getPrototypeOf %s');
68
+ return Object.getPrototypeOf(target._instance);
69
+ },
70
+ });
71
+ return proxyApp;
72
+ }
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcGFyYWxsZWwvdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFMUMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLCtCQUErQixDQUFDLENBQUM7QUFFeEQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHO0lBQzdCLE9BQU87SUFDUCxVQUFVO0lBQ1YsUUFBUTtJQUNSLE9BQU87SUFDUCxJQUFJO0lBQ0osTUFBTTtDQUNQLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBRTFDLE1BQU0sVUFBVSxRQUFRLENBQUMsR0FBUTtJQUMvQixNQUFNLFFBQVEsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLEVBQUU7UUFDOUIsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFZO1lBQ3RCLHlDQUF5QztZQUN6QyxJQUFJLGVBQWUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsT0FBTyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ25DLENBQUM7WUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGFBQWEsSUFBSSxlQUFlLENBQUMsQ0FBQztZQUN6RSxvREFBb0Q7WUFDcEQsa0RBQWtEO1lBQ2xELEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUNELEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBWSxFQUFFLEtBQUs7WUFDN0IsSUFBSSxl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
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,25 @@
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
+ export {};
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
+ // for (const file of files) {
17
+ // const filepath = path.join(cwd, file);
18
+ // try {
19
+ // debug('%s prerequire %s', process.pid, filepath);
20
+ // require(filepath);
21
+ // } catch (err) {
22
+ // debug('prerequire error %s', err.message);
23
+ // }
24
+ // }
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlcmVxdWlyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcHJlcmVxdWlyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpRUFBaUU7QUFDakUsZ0NBQWdDO0FBQ2hDLHdDQUF3QztBQUN4QyxvQ0FBb0M7O0FBRXBDLDZCQUE2QjtBQUM3QixtQkFBbUI7QUFDbkIsMkNBQTJDO0FBQzNDLDhCQUE4QjtBQUM5QixJQUFJO0FBQ0osNkRBQTZEO0FBQzdELDhDQUE4QztBQUM5QyxpQ0FBaUM7QUFDakMsSUFBSTtBQUNKLDRDQUE0QztBQUU1Qyw4QkFBOEI7QUFDOUIsMkNBQTJDO0FBQzNDLFVBQVU7QUFDVix3REFBd0Q7QUFDeEQseUJBQXlCO0FBQ3pCLG9CQUFvQjtBQUNwQixpREFBaUQ7QUFDakQsTUFBTTtBQUNOLElBQUkifQ==
@@ -0,0 +1 @@
1
+ export {};