@farris/cli 2.3.8 → 2.3.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 (113) hide show
  1. package/lib/commands/add-app.js +5 -5
  2. package/lib/commands/add-lib.js +5 -5
  3. package/lib/commands/add-micro.js +11 -11
  4. package/lib/commands/add-project.js +196 -196
  5. package/lib/commands/add-project.js.map +1 -1
  6. package/lib/commands/build-components.js +60 -60
  7. package/lib/commands/build-components.js.map +1 -1
  8. package/lib/commands/build-css.js +38 -38
  9. package/lib/commands/build-css.js.map +1 -1
  10. package/lib/commands/build-lib.js +30 -30
  11. package/lib/commands/build.js +19 -19
  12. package/lib/commands/build.js.map +1 -1
  13. package/lib/commands/create-app-options.js +85 -85
  14. package/lib/commands/create-app-options.js.map +1 -1
  15. package/lib/commands/create-app.js +131 -131
  16. package/lib/commands/create-app.js.map +1 -1
  17. package/lib/commands/create-options.js +69 -58
  18. package/lib/commands/create-options.js.map +1 -1
  19. package/lib/commands/create.js +345 -341
  20. package/lib/commands/create.js.map +1 -1
  21. package/lib/commands/dev-serve.js +18 -18
  22. package/lib/commands/extract-i18n.js +74 -74
  23. package/lib/commands/extract-i18n.js.map +1 -1
  24. package/lib/commands/generate/api.js +124 -124
  25. package/lib/commands/generate/api.js.map +1 -1
  26. package/lib/commands/generate/common.js +101 -101
  27. package/lib/commands/generate/common.js.map +1 -1
  28. package/lib/commands/generate/component.js +156 -156
  29. package/lib/commands/generate/component.js.map +1 -1
  30. package/lib/commands/generate/view.js +168 -168
  31. package/lib/commands/generate/view.js.map +1 -1
  32. package/lib/commands/preview-serve.js +16 -16
  33. package/lib/commands/workspace/add-app.js +15 -15
  34. package/lib/commands/workspace/add-app.js.map +1 -1
  35. package/lib/commands/workspace/create.js +62 -62
  36. package/lib/commands/workspace/create.js.map +1 -1
  37. package/lib/commands/workspace/inspect.js +30 -30
  38. package/lib/commands/workspace/inspect.js.map +1 -1
  39. package/lib/commands/workspace/verify.js +38 -38
  40. package/lib/commands/workspace/verify.js.map +1 -1
  41. package/lib/common/agents-doc.js +33 -33
  42. package/lib/common/agents-doc.js.map +1 -1
  43. package/lib/common/apply-catalog-deps.js +15 -15
  44. package/lib/common/apply-catalog-deps.js.map +1 -1
  45. package/lib/common/component-file-name.js +3 -3
  46. package/lib/common/constant.js +85 -84
  47. package/lib/common/constant.js.map +1 -1
  48. package/lib/common/create-app-target.js +46 -46
  49. package/lib/common/create-app-target.js.map +1 -1
  50. package/lib/common/generate-app.js +106 -106
  51. package/lib/common/generate-app.js.map +1 -1
  52. package/lib/common/get-dependencies.js +9 -9
  53. package/lib/common/get-farris-config.js +25 -25
  54. package/lib/common/get-farris-config.js.map +1 -1
  55. package/lib/common/get-version.js +6 -6
  56. package/lib/common/get-vite-config.js +192 -192
  57. package/lib/common/get-vite-config.js.map +1 -1
  58. package/lib/common/lib-package-exports.js +24 -24
  59. package/lib/common/lib-package-exports.js.map +1 -1
  60. package/lib/common/list-lib-components.js +23 -23
  61. package/lib/common/list-lib-components.js.map +1 -1
  62. package/lib/common/output.js +164 -164
  63. package/lib/common/output.js.map +1 -1
  64. package/lib/common/project-layout.js +155 -155
  65. package/lib/common/project-layout.js.map +1 -1
  66. package/lib/common/safety.js +172 -172
  67. package/lib/common/safety.js.map +1 -1
  68. package/lib/common/template-manifest.js +18 -18
  69. package/lib/common/template-manifest.js.map +1 -1
  70. package/lib/common/template-renderer.js +114 -114
  71. package/lib/common/template-renderer.js.map +1 -1
  72. package/lib/common/transaction.js +83 -83
  73. package/lib/common/transaction.js.map +1 -1
  74. package/lib/common/verifier.js +187 -187
  75. package/lib/common/verifier.js.map +1 -1
  76. package/lib/common/workspace-contract.js +195 -191
  77. package/lib/common/workspace-contract.js.map +1 -1
  78. package/lib/config/vite-app.js +13 -13
  79. package/lib/config/vite-common.js +20 -20
  80. package/lib/config/vite-common.js.map +1 -1
  81. package/lib/config/vite-component.js +32 -32
  82. package/lib/config/vite-component.js.map +1 -1
  83. package/lib/config/vite-lib.js +26 -26
  84. package/lib/index.js +280 -261
  85. package/lib/index.js.map +1 -1
  86. package/lib/plugins/create-app-package-json.js +23 -23
  87. package/lib/plugins/create-component-style.js +44 -44
  88. package/lib/plugins/create-package-json.js +48 -48
  89. package/lib/plugins/create-package-json.js.map +1 -1
  90. package/lib/plugins/dts.js +8 -8
  91. package/lib/plugins/html-system.js +9 -9
  92. package/lib/plugins/mock.js +240 -292
  93. package/lib/plugins/mock.js.map +1 -1
  94. package/lib/plugins/msw-adapter.js +141 -0
  95. package/lib/plugins/msw-adapter.js.map +1 -0
  96. package/lib/plugins/replace.js +17 -17
  97. package/lib/plugins/systemjs-bundle.js +15 -15
  98. package/lib/plugins/systemjs-bundle.js.map +1 -1
  99. package/package.json +93 -87
  100. package/templates/create/AGENTS.md +4 -3
  101. package/templates/lib/.gitignore.tpl +1 -0
  102. package/templates/micro/.gitignore.tpl +1 -0
  103. package/templates/micro/mock/README.md +39 -26
  104. package/templates/micro/mock/tsconfig.json +10 -0
  105. package/templates/micro/package.json +1 -0
  106. package/templates/mobile/.gitignore.tpl +1 -0
  107. package/templates/mobile/mock/README.md +39 -26
  108. package/templates/mobile/mock/tsconfig.json +10 -0
  109. package/templates/mobile/package.json +1 -0
  110. package/templates/web/.gitignore.tpl +1 -0
  111. package/templates/web/mock/README.md +39 -26
  112. package/templates/web/mock/tsconfig.json +10 -0
  113. package/templates/web/package.json +1 -0
@@ -1,293 +1,241 @@
1
- import { existsSync, readdirSync, statSync } from 'node:fs';
2
- import { join, relative, resolve, sep } from 'node:path';
3
- const toPosix = (p) => p.split(sep).join('/');
4
- const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
5
- /**
6
- * 归一化 mock 文件的默认导出。
7
- * 推荐写法是路由数组;同时兼容 umi 风格的对象映射写法:{ 'GET /api/users': 数据或函数 }
8
- */
9
- export function normalizeRoutes(exported) {
10
- if (Array.isArray(exported)) {
11
- return exported.filter((item) => !!item && typeof item === 'object' && typeof item.url === 'string');
12
- }
13
- if (exported && typeof exported === 'object') {
14
- return Object.entries(exported).map(([key, value]) => {
15
- const parts = key.trim().split(/\s+/);
16
- const [method, url] = parts.length > 1 ? [parts[0], parts[1]] : ['GET', parts[0]];
17
- return { url, method, response: value };
18
- });
19
- }
20
- return [];
21
- }
22
- /**
23
- * 路径匹配,支持 :param 与尾部 *;命中返回参数表,未命中返回 null
24
- */
25
- export function matchPath(pattern, pathname) {
26
- const patternParts = pattern.split('/');
27
- const pathParts = pathname.split('/');
28
- const params = {};
29
- for (let i = 0; i < patternParts.length; i++) {
30
- const segment = patternParts[i];
31
- const actual = pathParts[i];
32
- if (segment === '*') {
33
- return params;
34
- }
35
- if (segment.startsWith(':')) {
36
- if (actual === undefined || actual === '') {
37
- return null;
38
- }
39
- params[segment.slice(1)] = decodeURIComponent(actual);
40
- continue;
41
- }
42
- if (segment !== actual) {
43
- return null;
44
- }
45
- }
46
- return patternParts.length === pathParts.length ? params : null;
47
- }
48
- /**
49
- * 按方法查找首个命中的路由
50
- */
51
- export function findRoute(routes, method, pathname) {
52
- for (const route of routes) {
53
- const routeMethod = (route.method ?? 'GET').toUpperCase();
54
- if (routeMethod !== method) {
55
- continue;
56
- }
57
- const params = matchPath(route.url, pathname);
58
- if (params) {
59
- return { route, params };
60
- }
61
- }
62
- return null;
63
- }
64
- /**
65
- * 查找重复定义的路由(同一方法 + 同一路径出现在多个文件)
66
- */
67
- export function findDuplicates(routes) {
68
- const grouped = new Map();
69
- for (const route of routes) {
70
- const key = `${(route.method ?? 'GET').toUpperCase()} ${route.url}`;
71
- const files = grouped.get(key) ?? [];
72
- files.push(route.sourceFile ?? '<未知来源>');
73
- grouped.set(key, files);
74
- }
75
- return Array.from(grouped.entries())
76
- .filter(([, files]) => files.length > 1)
77
- .map(([key, files]) => ({ key, files }));
78
- }
79
- /**
80
- * 判断请求路径是否命中了已配置的代理
81
- */
82
- export function isProxied(pathname, server) {
83
- const proxy = (server.config.server.proxy ?? {});
84
- return Object.keys(proxy).some((key) => {
85
- if (key.startsWith('^')) {
86
- try {
87
- return new RegExp(key).test(pathname);
88
- }
89
- catch {
90
- return false;
91
- }
92
- }
93
- return pathname === key || pathname.startsWith(key.endsWith('/') ? key : `${key}/`);
94
- });
95
- }
96
- /**
97
- * 判断请求路径是否属于接口前缀
98
- */
99
- export function isApiPath(pathname, apiPrefixes) {
100
- return apiPrefixes.some((prefix) => pathname === prefix || pathname.startsWith(prefix.endsWith('/') ? prefix : `${prefix}/`));
101
- }
102
- function readBody(req) {
103
- if (req.method === 'GET' || req.method === 'HEAD') {
104
- return Promise.resolve(undefined);
105
- }
106
- return new Promise((resolve) => {
107
- let data = '';
108
- req.on('data', (chunk) => {
109
- data += chunk;
110
- });
111
- req.on('end', () => {
112
- if (!data) {
113
- return resolve(undefined);
114
- }
115
- try {
116
- resolve(JSON.parse(data));
117
- }
118
- catch {
119
- resolve(data);
120
- }
121
- });
122
- req.on('error', () => resolve(undefined));
123
- });
124
- }
125
- export function farrisMockPlugin(options) {
126
- const dir = options.dir ?? 'mock';
127
- const defaultTimeout = options.timeout ?? 0;
128
- const loggerEnabled = options.logger ?? true;
129
- const apiPrefixes = options.apiPrefixes ?? ['/api'];
130
- return {
131
- name: 'farris:mock',
132
- apply: 'serve',
133
- configureServer(server) {
134
- const { root } = server.config;
135
- const mockDir = resolve(root, dir);
136
- let routes = null;
137
- const log = (msg) => {
138
- if (loggerEnabled) {
139
- server.config.logger.info(`[mock] ${msg}`, { timestamp: true });
140
- }
141
- };
142
- const logError = (msg) => {
143
- server.config.logger.error(`[mock] ${msg}`, { timestamp: true });
144
- };
145
- // 收集 mock 目录下的文件,跳过 _ 前缀文件
146
- const listFiles = () => {
147
- if (!existsSync(mockDir)) {
148
- return [];
149
- }
150
- const files = [];
151
- const walk = (current) => {
152
- for (const name of readdirSync(current)) {
153
- const full = join(current, name);
154
- if (statSync(full).isDirectory()) {
155
- walk(full);
156
- }
157
- else if (/\.m?[jt]s$/.test(name) && !name.startsWith('_')) {
158
- files.push(full);
159
- }
160
- }
161
- };
162
- walk(mockDir);
163
- return files;
164
- };
165
- const loadRoutes = async () => {
166
- if (routes) {
167
- return routes;
168
- }
169
- const collected = [];
170
- for (const file of listFiles()) {
171
- const url = '/' + toPosix(relative(root, file));
172
- const mod = await server.ssrLoadModule(url);
173
- for (const route of normalizeRoutes(mod.default ?? mod)) {
174
- collected.push({ ...route, sourceFile: toPosix(relative(root, file)) });
175
- }
176
- }
177
- const duplicates = findDuplicates(collected);
178
- if (duplicates.length > 0) {
179
- throw new Error(`mock 路由重复定义:${duplicates
180
- .map((item) => `${item.key}(${item.files.join('、')})`)
181
- .join(';')}`);
182
- }
183
- routes = collected;
184
- return routes;
185
- };
186
- // mock 文件变更时清空缓存并失效模块,下次请求重新加载
187
- const invalidate = async (file) => {
188
- routes = null;
189
- try {
190
- const id = toPosix(file);
191
- const mod = await server.moduleGraph.getModuleById(id);
192
- if (mod) {
193
- await server.moduleGraph.invalidateModule(mod);
194
- }
195
- }
196
- catch {
197
- // 失效失败不阻断,routes 已清空,下次请求会重新加载
198
- }
199
- log(`mock 已变更,重新加载: ${toPosix(relative(root, file))}`);
200
- };
201
- server.watcher.add(mockDir);
202
- server.watcher.on('all', (event, file) => {
203
- if (!file.startsWith(mockDir)) {
204
- return;
205
- }
206
- if (event === 'change' || event === 'add' || event === 'unlink') {
207
- void invalidate(file);
208
- }
209
- });
210
- // 启动时预加载一次,让重复定义、语法错误在启动阶段可见;失败不阻断,请求时会再次报错并返回 500
211
- if (options.enabled && server.httpServer) {
212
- server.httpServer.once('listening', () => {
213
- void loadRoutes().catch((err) => {
214
- logError(`mock 加载失败:${err instanceof Error ? err.message : String(err)}`);
215
- });
216
- });
217
- }
218
- server.middlewares.use(async (req, res, next) => {
219
- const [pathname, search = ''] = (req.url ?? '/').split('?');
220
- const method = (req.method ?? 'GET').toUpperCase();
221
- let hit = null;
222
- if (options.enabled) {
223
- try {
224
- hit = findRoute(await loadRoutes(), method, pathname);
225
- }
226
- catch (err) {
227
- res.statusCode = 500;
228
- res.setHeader('Content-Type', 'application/json; charset=utf-8');
229
- res.end(JSON.stringify({ error: `mock 加载失败: ${err instanceof Error ? err.message : String(err)}` }));
230
- logError(`${method} ${pathname} 500 mock 加载失败`);
231
- return;
232
- }
233
- }
234
- if (!hit) {
235
- // 未命中 mock:配了代理则交给代理接力;没有代理的接口路径给出明确的 404
236
- if (isApiPath(pathname, apiPrefixes)) {
237
- if (!isProxied(pathname, server)) {
238
- res.statusCode = 404;
239
- res.setHeader('Content-Type', 'application/json; charset=utf-8');
240
- res.end(JSON.stringify({
241
- error: `${options.enabled ? '未命中 mock 且未配置代理' : 'mock 已关闭且未配置代理'}: ${method} ${pathname}`
242
- }));
243
- log(`${method} ${pathname} 404 (未命中 mock/代理)`);
244
- return;
245
- }
246
- if (options.enabled) {
247
- log(`${method} ${pathname} 未命中 mock → 交给代理处理`);
248
- }
249
- }
250
- return next();
251
- }
252
- const { route, params } = hit;
253
- const start = Date.now();
254
- const ctx = {
255
- method,
256
- url: req.url,
257
- path: pathname,
258
- query: Object.fromEntries(new URLSearchParams(search)),
259
- params,
260
- headers: req.headers,
261
- body: await readBody(req)
262
- };
263
- let payload;
264
- try {
265
- payload =
266
- typeof route.response === 'function'
267
- ? await route.response(ctx)
268
- : route.response;
269
- }
270
- catch (err) {
271
- res.statusCode = 500;
272
- res.setHeader('Content-Type', 'application/json; charset=utf-8');
273
- res.end(JSON.stringify({ error: `mock 处理异常: ${err instanceof Error ? err.message : String(err)}` }));
274
- logError(`${method} ${pathname} 500 mock 处理异常`);
275
- return;
276
- }
277
- const delay = route.timeout ?? defaultTimeout;
278
- if (delay > 0) {
279
- await sleep(delay);
280
- }
281
- const status = route.status ?? route.statusCode ?? 200;
282
- res.statusCode = status;
283
- res.setHeader('Content-Type', 'application/json; charset=utf-8');
284
- for (const [key, value] of Object.entries(route.headers ?? {})) {
285
- res.setHeader(key, value);
286
- }
287
- res.end(typeof payload === 'string' ? payload : JSON.stringify(payload));
288
- log(`${method} ${pathname} ${status} (mock) ${Date.now() - start}ms`);
289
- });
290
- }
291
- };
292
- }
1
+ import { existsSync, readdirSync, statSync } from 'node:fs';
2
+ import { join, relative, resolve, sep } from 'node:path';
3
+ import { handlerInfo, isInsideDir, isRequestHandler, loadAppMsw, runMockHandlers } from './msw-adapter.js';
4
+ const toPosix = (p) => p.split(sep).join('/');
5
+ /** mock 目录下参与加载的文件后缀,`_` 前缀文件跳过 */
6
+ const MOCK_FILE_RE = /\.m?[jt]s$/;
7
+ /** 判断请求路径是否命中了已配置的代理 */
8
+ export function isProxied(pathname, server) {
9
+ const proxy = (server.config.server.proxy ?? {});
10
+ return Object.keys(proxy).some((key) => {
11
+ if (key.startsWith('^')) {
12
+ try {
13
+ return new RegExp(key).test(pathname);
14
+ }
15
+ catch {
16
+ return false;
17
+ }
18
+ }
19
+ return pathname === key || pathname.startsWith(key.endsWith('/') ? key : `${key}/`);
20
+ });
21
+ }
22
+ /** 判断请求路径是否属于接口前缀 */
23
+ export function isApiPath(pathname, apiPrefixes) {
24
+ return apiPrefixes.some((prefix) => pathname === prefix || pathname.startsWith(prefix.endsWith('/') ? prefix : `${prefix}/`));
25
+ }
26
+ /** 判断一组导出值是否为"非空的 handler 数组" */
27
+ const isHandlerArray = (value) => Array.isArray(value) && value.length > 0 && value.every(isRequestHandler);
28
+ /**
29
+ * 从 mock 模块里取出 handler 数组。
30
+ * 兼容两种写法:本工程约定的 `export default [...]`,以及 MSW 文档中最常见的
31
+ * `export const handlers = [...]`(AI 语料里的默认写法,故一并接受)。
32
+ */
33
+ export function pickHandlers(module) {
34
+ if (isHandlerArray(module.default)) {
35
+ return module.default;
36
+ }
37
+ if (isHandlerArray(module.handlers)) {
38
+ return module.handlers;
39
+ }
40
+ const named = Object.values(module).find(isHandlerArray);
41
+ return named ?? module.default ?? module.handlers ?? module;
42
+ }
43
+ export function farrisMockPlugin(options) {
44
+ const dir = options.dir ?? 'mock';
45
+ const loggerEnabled = options.logger ?? true;
46
+ const apiPrefixes = options.apiPrefixes ?? ['/api'];
47
+ let root = '';
48
+ let mockDir = '';
49
+ let isBuild = false;
50
+ return {
51
+ name: 'farris:mock',
52
+ // 构建期护栏要在 vite:resolve 之前看到应用代码的导入,否则 msw 会被 vite 的解析器先接走
53
+ enforce: 'pre',
54
+ configResolved(config) {
55
+ ({ root } = config);
56
+ mockDir = resolve(root, dir);
57
+ isBuild = config.command === 'build';
58
+ },
59
+ // 构建期护栏:mock 只能写在 mock/ 目录里,应用代码引用 msw 会把它带进产物
60
+ resolveId(source, importer) {
61
+ if (!isBuild || !importer || isInsideDir(importer, mockDir)) {
62
+ return null;
63
+ }
64
+ // 裸包名与子路径(msw/node、msw/browser)同样会携带 mock 引擎进入产物
65
+ if (source !== 'msw' && !source.startsWith('msw/')) {
66
+ return null;
67
+ }
68
+ this.error(`构建产物不得引用 msw(来源:${importer}):mock 只写在 ${dir}/ 目录下的 mock 文件里;` +
69
+ 'msw 是开发期依赖,进入构建产物会污染交付物。');
70
+ return null;
71
+ },
72
+ configureServer(server) {
73
+ ({ root } = server.config);
74
+ mockDir = resolve(root, dir);
75
+ let handlers = null;
76
+ const log = (msg) => {
77
+ if (loggerEnabled) {
78
+ server.config.logger.info(`[mock] ${msg}`, { timestamp: true });
79
+ }
80
+ };
81
+ const logError = (msg) => {
82
+ server.config.logger.error(`[mock] ${msg}`, { timestamp: true });
83
+ };
84
+ // 收集 mock 目录下的文件,跳过 _ 前缀文件
85
+ const listFiles = () => {
86
+ if (!existsSync(mockDir)) {
87
+ return [];
88
+ }
89
+ const files = [];
90
+ const walk = (current) => {
91
+ for (const name of readdirSync(current)) {
92
+ const full = join(current, name);
93
+ if (statSync(full).isDirectory()) {
94
+ walk(full);
95
+ }
96
+ else if (MOCK_FILE_RE.test(name) && !name.startsWith('_')) {
97
+ files.push(full);
98
+ }
99
+ }
100
+ };
101
+ walk(mockDir);
102
+ return files;
103
+ };
104
+ const loadHandlers = async (files) => {
105
+ if (handlers) {
106
+ return handlers;
107
+ }
108
+ const collected = [];
109
+ const declared = new Map();
110
+ for (const file of files) {
111
+ const display = toPosix(relative(root, file));
112
+ const mod = await server.ssrLoadModule('/' + display);
113
+ const exported = pickHandlers(mod);
114
+ if (Array.isArray(exported) && exported.length === 0) {
115
+ log(`${display} 未导出任何 handler(空数组),已跳过`);
116
+ continue;
117
+ }
118
+ const list = Array.isArray(exported) ? exported : [exported];
119
+ for (const item of list) {
120
+ if (!isRequestHandler(item)) {
121
+ throw new Error(`${display} 未导出可用的 MSW handler:handler 文件请写 export default [http.get(...)] 或 export const handlers = [http.get(...)],不需要 setupServer / setupWorker 接线;` +
122
+ '共享数据或工具文件请把文件名加上 _ 前缀,例如 _data.ts(写法见 mock/README.md,约定版本 2026-09)');
123
+ }
124
+ collected.push(item);
125
+ const { path, method } = handlerInfo(item);
126
+ if (typeof path === 'string') {
127
+ if (/^https?:\/\//i.test(path)) {
128
+ log(`${display} 的 ${String(method).toUpperCase()} ${path} 使用了绝对地址:mock 只写路径(如 /api/v1/users),绝对地址在请求主机不同时不会命中`);
129
+ }
130
+ const key = `${String(method).toUpperCase()} ${path}`;
131
+ declared.set(key, [...(declared.get(key) ?? []), display]);
132
+ }
133
+ else {
134
+ log(`${display} 中存在无法静态判别的路径(${String(path)}),跳过重复校验`);
135
+ }
136
+ }
137
+ }
138
+ const duplicates = [...declared.entries()].filter(([, files]) => files.length > 1);
139
+ if (duplicates.length > 0) {
140
+ throw new Error(`mock 路由重复定义:${duplicates
141
+ .map(([key, files]) => `${key}(${files.join('、')})`)
142
+ .join(';')}`);
143
+ }
144
+ handlers = collected;
145
+ return handlers;
146
+ };
147
+ /**
148
+ * 准备一次请求所需的 handler 与 msw 运行时。
149
+ * mock 目录没有文件时返回 null:此时不需要 msw,也不会因为应用缺依赖而报错。
150
+ */
151
+ const prepare = async () => {
152
+ if (handlers) {
153
+ return handlers.length > 0 ? { handlers, runtime: await loadAppMsw(root) } : null;
154
+ }
155
+ const files = listFiles();
156
+ if (files.length === 0) {
157
+ handlers = [];
158
+ return null;
159
+ }
160
+ const runtime = await loadAppMsw(root);
161
+ const loaded = await loadHandlers(files);
162
+ return loaded.length > 0 ? { handlers: loaded, runtime } : null;
163
+ };
164
+ // mock 文件变更时清空缓存并失效模块,下次请求重新加载
165
+ const invalidate = async (file) => {
166
+ handlers = null;
167
+ try {
168
+ const id = toPosix(file);
169
+ const mod = await server.moduleGraph.getModuleById(id);
170
+ if (mod) {
171
+ await server.moduleGraph.invalidateModule(mod);
172
+ }
173
+ }
174
+ catch {
175
+ // 失效失败不阻断,handlers 已清空,下次请求会重新加载
176
+ }
177
+ log(`mock 已变更,重新加载: ${toPosix(relative(root, file))}`);
178
+ };
179
+ server.watcher.add(mockDir);
180
+ server.watcher.on('all', (event, file) => {
181
+ if (!file.startsWith(mockDir)) {
182
+ return;
183
+ }
184
+ if (event === 'change' || event === 'add' || event === 'unlink') {
185
+ void invalidate(file);
186
+ }
187
+ });
188
+ // 启动时预加载一次,让写法错误、重复定义、依赖缺失在启动阶段可见;失败不阻断,请求时会再次报错并返回 500
189
+ if (options.enabled && server.httpServer) {
190
+ server.httpServer.once('listening', () => {
191
+ void prepare().catch((err) => {
192
+ logError(`mock 加载失败:${err instanceof Error ? err.message : String(err)}`);
193
+ });
194
+ });
195
+ }
196
+ server.middlewares.use(async (req, res, next) => {
197
+ const [pathname] = (req.url ?? '/').split('?');
198
+ const method = (req.method ?? 'GET').toUpperCase();
199
+ const startedAt = Date.now();
200
+ if (options.enabled) {
201
+ try {
202
+ const ready = await prepare();
203
+ if (ready) {
204
+ const status = await runMockHandlers(req, res, ready.handlers, ready.runtime);
205
+ if (status !== null) {
206
+ log(`${method} ${pathname} ${status} (mock) ${Date.now() - startedAt}ms`);
207
+ return;
208
+ }
209
+ }
210
+ }
211
+ catch (err) {
212
+ res.statusCode = 500;
213
+ res.setHeader('Content-Type', 'application/json; charset=utf-8');
214
+ res.end(JSON.stringify({
215
+ error: `mock 加载失败: ${err instanceof Error ? err.message : String(err)}`
216
+ }));
217
+ logError(`${method} ${pathname} 500 mock 加载失败`);
218
+ return;
219
+ }
220
+ }
221
+ // 未命中 mock:配了代理则交给代理接力;没有代理的接口路径给出明确的 404
222
+ if (isApiPath(pathname, apiPrefixes)) {
223
+ if (!isProxied(pathname, server)) {
224
+ res.statusCode = 404;
225
+ res.setHeader('Content-Type', 'application/json; charset=utf-8');
226
+ res.end(JSON.stringify({
227
+ error: `${options.enabled ? '未命中 mock 且未配置代理' : 'mock 已关闭且未配置代理'}: ${method} ${pathname}`
228
+ }));
229
+ log(`${method} ${pathname} 404 (未命中 mock/代理)`);
230
+ return;
231
+ }
232
+ if (options.enabled) {
233
+ log(`${method} ${pathname} 未命中 mock → 交给代理处理`);
234
+ }
235
+ }
236
+ return next();
237
+ });
238
+ }
239
+ };
240
+ }
293
241
  //# sourceMappingURL=mock.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/plugins/mock.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/plugins/mock.ts"],"names":[],"mappings":"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"}