@midwayjs/mock 4.0.0-beta.11 → 4.0.0-beta.13

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.
package/dist/creator.js CHANGED
@@ -479,7 +479,6 @@ class BootstrapAppStarter {
479
479
  return applicationManager.getApplication(type);
480
480
  }
481
481
  async close(options = {}) {
482
- // eslint-disable-next-line node/no-extraneous-require
483
482
  const BootstrapModule = await (0, core_1.loadModule)('@midwayjs/bootstrap', {
484
483
  loadMode: this.options.moduleLoadType,
485
484
  safeLoad: true,
@@ -0,0 +1,15 @@
1
+ export interface DevPluginOptions {
2
+ appDir: string;
3
+ baseDir?: string;
4
+ basePath?: string;
5
+ watch?: {
6
+ include?: RegExp[];
7
+ exclude?: RegExp[];
8
+ };
9
+ getRequestHandler?: (app: any) => (req: any, res: any, next?: (err?: unknown) => void) => any;
10
+ }
11
+ export declare function devPlugin(options: DevPluginOptions): {
12
+ name: string;
13
+ apply(compiler: any): void;
14
+ };
15
+ //# sourceMappingURL=rspack.d.ts.map
package/dist/rspack.js ADDED
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.devPlugin = devPlugin;
4
+ const creator_1 = require("./creator");
5
+ const node_path_1 = require("node:path");
6
+ function startsWithBasePath(url, basePath) {
7
+ if (basePath === '/') {
8
+ return true;
9
+ }
10
+ return url === basePath || url.startsWith(`${basePath}/`);
11
+ }
12
+ function getDefaultRequestHandler(app) {
13
+ if (app && typeof app.callback === 'function') {
14
+ return app.callback();
15
+ }
16
+ if (typeof app === 'function') {
17
+ return app;
18
+ }
19
+ if (app && typeof app.getFramework === 'function') {
20
+ const framework = app.getFramework();
21
+ if (framework) {
22
+ const frameworkApp = typeof framework.getApplication === 'function'
23
+ ? framework.getApplication()
24
+ : undefined;
25
+ if (frameworkApp && typeof frameworkApp.callback === 'function') {
26
+ return frameworkApp.callback();
27
+ }
28
+ if (typeof framework.callback2 === 'function') {
29
+ return framework.callback2();
30
+ }
31
+ }
32
+ }
33
+ throw new Error('[midway:mock] can not resolve request handler, please provide getRequestHandler in devPlugin options');
34
+ }
35
+ function devPlugin(options) {
36
+ if (!options?.appDir) {
37
+ throw new Error('[midway:mock] devPlugin requires "appDir", e.g. devPlugin({ appDir: process.cwd() })');
38
+ }
39
+ const appDir = options.appDir;
40
+ const baseDir = options.baseDir
41
+ ? (0, node_path_1.resolve)(appDir, options.baseDir)
42
+ : (0, node_path_1.resolve)(appDir, 'src');
43
+ const resolvedBaseDir = baseDir;
44
+ const basePath = options.basePath || '/api';
45
+ const watchInclude = options.watch?.include || [/\.(ts|tsx|js|mjs|cjs)$/];
46
+ const watchExclude = options.watch?.exclude || [/\.d\.ts$/];
47
+ const getRequestHandler = options.getRequestHandler || getDefaultRequestHandler;
48
+ const hmrImportQueryEnvKey = 'MIDWAY_HMR_IMPORT_QUERY';
49
+ let appPromise = null;
50
+ let reloadingAppPromise = null;
51
+ const shouldReloadFile = (file) => {
52
+ if (!file.startsWith(resolvedBaseDir)) {
53
+ return false;
54
+ }
55
+ if (watchExclude.some(reg => reg.test(file))) {
56
+ return false;
57
+ }
58
+ return watchInclude.some(reg => reg.test(file));
59
+ };
60
+ const reloadApp = async () => {
61
+ if (reloadingAppPromise) {
62
+ return reloadingAppPromise;
63
+ }
64
+ reloadingAppPromise = (async () => {
65
+ const oldAppPromise = appPromise;
66
+ appPromise = null;
67
+ if (oldAppPromise) {
68
+ const oldApp = await oldAppPromise;
69
+ await (0, creator_1.close)(oldApp);
70
+ }
71
+ })().finally(() => {
72
+ reloadingAppPromise = null;
73
+ });
74
+ return reloadingAppPromise;
75
+ };
76
+ const ensureApp = async () => {
77
+ if (!appPromise) {
78
+ const previousQuery = process.env[hmrImportQueryEnvKey];
79
+ process.env[hmrImportQueryEnvKey] = '1';
80
+ appPromise = (0, creator_1.createApp)({
81
+ appDir,
82
+ baseDir,
83
+ }).finally(() => {
84
+ if (previousQuery === undefined) {
85
+ delete process.env[hmrImportQueryEnvKey];
86
+ }
87
+ else {
88
+ process.env[hmrImportQueryEnvKey] = previousQuery;
89
+ }
90
+ });
91
+ }
92
+ return appPromise;
93
+ };
94
+ return {
95
+ name: 'midway-dev-runtime-rspack',
96
+ apply(compiler) {
97
+ const logger = typeof compiler.getInfrastructureLogger === 'function'
98
+ ? compiler.getInfrastructureLogger('midway:mock')
99
+ : console;
100
+ compiler.hooks.invalid?.tap('midway-dev-runtime-rspack', (fileName) => {
101
+ if (!fileName || !shouldReloadFile(fileName)) {
102
+ return;
103
+ }
104
+ logger.info(`[midway:mock] detected server change, reload midway app: ${fileName}`);
105
+ void reloadApp().catch((err) => {
106
+ logger.error(`[midway:mock] failed to reload midway app: ${err?.message || err}`);
107
+ });
108
+ });
109
+ compiler.hooks.shutdown?.tapPromise('midway-dev-runtime-rspack', async () => {
110
+ await reloadApp();
111
+ });
112
+ compiler.options.devServer = compiler.options.devServer || {};
113
+ const previousSetupMiddlewares = compiler.options.devServer.setupMiddlewares;
114
+ compiler.options.devServer.setupMiddlewares = (middlewares, devServer) => {
115
+ const requestMiddleware = async (req, res, next) => {
116
+ const originalUrl = req.url || '';
117
+ const pathname = originalUrl.split('?')[0];
118
+ if (!startsWithBasePath(pathname, basePath)) {
119
+ next();
120
+ return;
121
+ }
122
+ try {
123
+ const app = await ensureApp();
124
+ const handler = getRequestHandler(app);
125
+ return handler(req, res, next);
126
+ }
127
+ catch (err) {
128
+ next(err);
129
+ return;
130
+ }
131
+ };
132
+ if (Array.isArray(middlewares)) {
133
+ middlewares.unshift(requestMiddleware);
134
+ }
135
+ if (typeof previousSetupMiddlewares === 'function') {
136
+ return previousSetupMiddlewares(middlewares, devServer);
137
+ }
138
+ return middlewares;
139
+ };
140
+ },
141
+ };
142
+ }
143
+ //# sourceMappingURL=rspack.js.map
package/dist/vite.d.ts ADDED
@@ -0,0 +1,33 @@
1
+ interface RouteManifestLike {
2
+ source: string;
3
+ operationId: string;
4
+ controllerId?: string;
5
+ controllerPrefix: string;
6
+ method: string;
7
+ path: string;
8
+ fullPath: string;
9
+ routerName?: string;
10
+ }
11
+ export interface DevPluginOptions {
12
+ appDir: string;
13
+ baseDir?: string;
14
+ basePath?: string;
15
+ watch?: {
16
+ include?: RegExp[];
17
+ exclude?: RegExp[];
18
+ };
19
+ getRequestHandler?: (app: any) => (req: any, res: any, next?: () => void) => any;
20
+ routeManifest?: boolean | {
21
+ virtualId?: string;
22
+ filter?: (route: RouteManifestLike) => boolean;
23
+ };
24
+ }
25
+ export declare function devPlugin(options: DevPluginOptions): {
26
+ name: string;
27
+ apply: string;
28
+ resolveId(source: string): string;
29
+ load(id: string): Promise<string>;
30
+ configureServer(server: any): Promise<void>;
31
+ };
32
+ export {};
33
+ //# sourceMappingURL=vite.d.ts.map
package/dist/vite.js ADDED
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.devPlugin = devPlugin;
4
+ const creator_1 = require("./creator");
5
+ const node_path_1 = require("node:path");
6
+ const core_1 = require("@midwayjs/core");
7
+ const DEFAULT_ROUTE_MANIFEST_VIRTUAL_ID = 'virtual:midway-route-manifest';
8
+ function startsWithBasePath(url, basePath) {
9
+ if (basePath === '/') {
10
+ return true;
11
+ }
12
+ return url === basePath || url.startsWith(`${basePath}/`);
13
+ }
14
+ function getDefaultRequestHandler(app) {
15
+ if (app && typeof app.callback === 'function') {
16
+ return app.callback();
17
+ }
18
+ if (typeof app === 'function') {
19
+ return app;
20
+ }
21
+ if (app && typeof app.getFramework === 'function') {
22
+ const framework = app.getFramework();
23
+ if (framework) {
24
+ const frameworkApp = typeof framework.getApplication === 'function'
25
+ ? framework.getApplication()
26
+ : undefined;
27
+ if (frameworkApp && typeof frameworkApp.callback === 'function') {
28
+ return frameworkApp.callback();
29
+ }
30
+ if (typeof framework.callback2 === 'function') {
31
+ return framework.callback2();
32
+ }
33
+ }
34
+ }
35
+ throw new Error('[midway:mock] can not resolve request handler, please provide getRequestHandler in devPlugin options');
36
+ }
37
+ function devPlugin(options) {
38
+ if (!options?.appDir) {
39
+ throw new Error('[midway:mock] devPlugin requires "appDir", e.g. devPlugin({ appDir: process.cwd() })');
40
+ }
41
+ const appDir = options.appDir;
42
+ const baseDir = options.baseDir
43
+ ? (0, node_path_1.resolve)(appDir, options.baseDir)
44
+ : (0, node_path_1.resolve)(appDir, 'src');
45
+ const resolvedBaseDir = baseDir;
46
+ const basePath = options.basePath || '/api';
47
+ const watchInclude = options.watch?.include || [/\.(ts|tsx|js|mjs|cjs)$/];
48
+ const watchExclude = options.watch?.exclude || [/\.d\.ts$/];
49
+ const getRequestHandler = options.getRequestHandler || getDefaultRequestHandler;
50
+ const routeManifestOptions = options.routeManifest && typeof options.routeManifest === 'object'
51
+ ? options.routeManifest
52
+ : undefined;
53
+ const routeManifestEnabled = options.routeManifest !== false;
54
+ const routeManifestVirtualId = routeManifestOptions?.virtualId || DEFAULT_ROUTE_MANIFEST_VIRTUAL_ID;
55
+ const routeManifestResolvedId = `\0${routeManifestVirtualId}`;
56
+ const routeManifestFilter = routeManifestOptions?.filter;
57
+ let appPromise = null;
58
+ const hmrImportQueryEnvKey = 'MIDWAY_HMR_IMPORT_QUERY';
59
+ let routeManifestPromise = null;
60
+ let reloadingAppPromise = null;
61
+ let viteServer;
62
+ const invalidateRouteManifestModule = () => {
63
+ if (!routeManifestEnabled || !viteServer) {
64
+ return;
65
+ }
66
+ const mod = viteServer.moduleGraph?.getModuleById(routeManifestResolvedId);
67
+ if (mod) {
68
+ viteServer.moduleGraph.invalidateModule(mod);
69
+ viteServer.ws?.send({
70
+ type: 'full-reload',
71
+ });
72
+ }
73
+ };
74
+ const shouldReloadFile = (file) => {
75
+ if (!file.startsWith(resolvedBaseDir)) {
76
+ return false;
77
+ }
78
+ if (watchExclude.some(reg => reg.test(file))) {
79
+ return false;
80
+ }
81
+ return watchInclude.some(reg => reg.test(file));
82
+ };
83
+ const reloadApp = async () => {
84
+ if (reloadingAppPromise) {
85
+ return reloadingAppPromise;
86
+ }
87
+ reloadingAppPromise = (async () => {
88
+ const oldAppPromise = appPromise;
89
+ appPromise = null;
90
+ routeManifestPromise = null;
91
+ if (oldAppPromise) {
92
+ const oldApp = await oldAppPromise;
93
+ await (0, creator_1.close)(oldApp);
94
+ }
95
+ invalidateRouteManifestModule();
96
+ })().finally(() => {
97
+ reloadingAppPromise = null;
98
+ });
99
+ return reloadingAppPromise;
100
+ };
101
+ const ensureApp = async () => {
102
+ if (!appPromise) {
103
+ const previousQuery = process.env[hmrImportQueryEnvKey];
104
+ process.env[hmrImportQueryEnvKey] = '1';
105
+ appPromise = (0, creator_1.createApp)({
106
+ appDir,
107
+ baseDir,
108
+ }).finally(() => {
109
+ if (previousQuery === undefined) {
110
+ delete process.env[hmrImportQueryEnvKey];
111
+ }
112
+ else {
113
+ process.env[hmrImportQueryEnvKey] = previousQuery;
114
+ }
115
+ });
116
+ }
117
+ return appPromise;
118
+ };
119
+ const ensureRouteManifest = async () => {
120
+ if (!routeManifestEnabled) {
121
+ return [];
122
+ }
123
+ if (!routeManifestPromise) {
124
+ routeManifestPromise = (async () => {
125
+ const app = await ensureApp();
126
+ const appContext = app.getApplicationContext?.();
127
+ if (!appContext) {
128
+ throw new Error('[midway:mock] can not resolve applicationContext for route manifest generation');
129
+ }
130
+ const webRouterService = await appContext.getAsync(core_1.MidwayWebRouterService);
131
+ let manifest = await webRouterService.getRouteManifest();
132
+ if (typeof routeManifestFilter === 'function') {
133
+ manifest = manifest.filter(routeManifestFilter);
134
+ }
135
+ return manifest;
136
+ })();
137
+ }
138
+ return routeManifestPromise;
139
+ };
140
+ return {
141
+ name: 'midway-dev-runtime',
142
+ apply: 'serve',
143
+ resolveId(source) {
144
+ if (!routeManifestEnabled) {
145
+ return null;
146
+ }
147
+ if (source === routeManifestVirtualId) {
148
+ return routeManifestResolvedId;
149
+ }
150
+ return null;
151
+ },
152
+ async load(id) {
153
+ if (!routeManifestEnabled || id !== routeManifestResolvedId) {
154
+ return null;
155
+ }
156
+ const manifest = await ensureRouteManifest();
157
+ return `export default ${JSON.stringify(manifest)};`;
158
+ },
159
+ async configureServer(server) {
160
+ viteServer = server;
161
+ server.httpServer?.once('close', async () => {
162
+ await reloadApp();
163
+ });
164
+ server.watcher.on('all', async (eventName, file) => {
165
+ if (eventName !== 'add' &&
166
+ eventName !== 'change' &&
167
+ eventName !== 'unlink') {
168
+ return;
169
+ }
170
+ if (!shouldReloadFile(file)) {
171
+ return;
172
+ }
173
+ server.config.logger.info(`[midway:mock] detected server ${eventName}, reload midway app: ${file}`);
174
+ await reloadApp();
175
+ });
176
+ server.middlewares.use(async (req, res, next) => {
177
+ const originalUrl = req.url || '';
178
+ const pathname = originalUrl.split('?')[0];
179
+ if (!startsWithBasePath(pathname, basePath)) {
180
+ next();
181
+ return;
182
+ }
183
+ const app = await ensureApp();
184
+ const handler = getRequestHandler(app);
185
+ return handler(req, res, next);
186
+ });
187
+ },
188
+ };
189
+ }
190
+ //# sourceMappingURL=vite.js.map
package/package.json CHANGED
@@ -1,9 +1,26 @@
1
1
  {
2
2
  "name": "@midwayjs/mock",
3
- "version": "4.0.0-beta.11",
3
+ "version": "4.0.0-beta.13",
4
4
  "description": "create your test app from midway framework",
5
5
  "main": "dist/index.js",
6
6
  "typings": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "require": "./dist/index.js",
11
+ "import": "./dist/index.js"
12
+ },
13
+ "./vite": {
14
+ "types": "./dist/vite.d.ts",
15
+ "require": "./dist/vite.js",
16
+ "import": "./dist/vite.js"
17
+ },
18
+ "./rspack": {
19
+ "types": "./dist/rspack.d.ts",
20
+ "require": "./dist/rspack.js",
21
+ "import": "./dist/rspack.js"
22
+ }
23
+ },
7
24
  "scripts": {
8
25
  "build": "tsc",
9
26
  "test": "node -r ts-node/register ../../node_modules/jest/bin/jest.js --runInBand",
@@ -29,7 +46,7 @@
29
46
  },
30
47
  "license": "MIT",
31
48
  "devDependencies": {
32
- "@midwayjs/core": "^4.0.0-beta.11",
49
+ "@midwayjs/core": "^4.0.0-beta.13",
33
50
  "@midwayjs/logger": "^4.0.0",
34
51
  "@types/amqplib": "0.10.8",
35
52
  "amqplib": "0.10.9",
@@ -50,5 +67,5 @@
50
67
  "type": "git",
51
68
  "url": "https://github.com/midwayjs/midway.git"
52
69
  },
53
- "gitHead": "6ef05719ca6e900f1ec34aff7a5c5a9614358c50"
70
+ "gitHead": "9a38b66a84a6880370cac90d737f94f9c5f2f256"
54
71
  }