vite-plugin-mock-dev-server 1.1.12 → 1.1.14
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/README.md +45 -42
- package/README.zh-CN.md +38 -38
- package/dist/index.cjs +11 -11
- package/dist/index.d.ts +6 -3
- package/dist/index.js +11 -11
- package/package.json +14 -27
package/README.md
CHANGED
|
@@ -81,9 +81,7 @@ export default defineConfig({
|
|
|
81
81
|
define: {},
|
|
82
82
|
server: {
|
|
83
83
|
proxy: {
|
|
84
|
-
'^/api': {
|
|
85
|
-
target: 'http://example.com'
|
|
86
|
-
}
|
|
84
|
+
'^/api': { target: 'http://example.com' }
|
|
87
85
|
}
|
|
88
86
|
}
|
|
89
87
|
})
|
|
@@ -106,10 +104,7 @@ import { defineMock } from 'vite-plugin-mock-dev-server'
|
|
|
106
104
|
|
|
107
105
|
export default defineMock({
|
|
108
106
|
url: '/api/test',
|
|
109
|
-
body: {
|
|
110
|
-
a: 1,
|
|
111
|
-
b: 2,
|
|
112
|
-
}
|
|
107
|
+
body: { a: 1, b: 2 }
|
|
113
108
|
})
|
|
114
109
|
```
|
|
115
110
|
|
|
@@ -220,7 +215,7 @@ export default defineConfig({
|
|
|
220
215
|
serverPort?: number
|
|
221
216
|
/**
|
|
222
217
|
* build output dir
|
|
223
|
-
@default 'mockServer'
|
|
218
|
+
* @default 'mockServer'
|
|
224
219
|
*/
|
|
225
220
|
dist?: string
|
|
226
221
|
}
|
|
@@ -286,7 +281,9 @@ export default defineMock({
|
|
|
286
281
|
*/
|
|
287
282
|
enabled: true,
|
|
288
283
|
/**
|
|
289
|
-
* Set interface response delay,
|
|
284
|
+
* Set interface response delay, if an array is passed in,
|
|
285
|
+
* it represents the range of delay time.
|
|
286
|
+
* unit: ms.
|
|
290
287
|
* @default 0
|
|
291
288
|
*/
|
|
292
289
|
delay: 1000,
|
|
@@ -299,38 +296,6 @@ export default defineMock({
|
|
|
299
296
|
* response status text
|
|
300
297
|
*/
|
|
301
298
|
statusText: 'OK',
|
|
302
|
-
/**
|
|
303
|
-
* Request validator, return mock data if validated, otherwise do not use current mock.
|
|
304
|
-
* This is useful in scenarios where an interface needs to return different data based
|
|
305
|
-
* on different input parameters.
|
|
306
|
-
* Validators can solve this type of problem well by dividing the same URL into multiple
|
|
307
|
-
* mock configurations and determining which one is effective based on the validator.
|
|
308
|
-
*
|
|
309
|
-
* @type { headers?: object; body?: object; query?: object; params?: object; refererQuery?: object }
|
|
310
|
-
*
|
|
311
|
-
* If the validator passes in an object,
|
|
312
|
-
* then the validation method is to strictly compare whether the `value`
|
|
313
|
-
* of each `key` in headers/body/query/params in the request interface is exactly equal.
|
|
314
|
-
* If they are all equal, then the validation passes.
|
|
315
|
-
* @type ({ headers: object; body: object; query: object; params: object; refererQuery: object }) => boolean
|
|
316
|
-
*
|
|
317
|
-
* If the validator passed in is a function,
|
|
318
|
-
* then the data related to the requested interface will be provided as input parameters
|
|
319
|
-
* for users to perform custom validation and return a boolean.
|
|
320
|
-
*
|
|
321
|
-
*/
|
|
322
|
-
validator: {
|
|
323
|
-
headers: {},
|
|
324
|
-
body: {},
|
|
325
|
-
query: {},
|
|
326
|
-
params: {},
|
|
327
|
-
/**
|
|
328
|
-
* refererQuery validates the query parameters in the URL of the request source page,
|
|
329
|
-
* which allows for direct modification of parameters in the browser address bar
|
|
330
|
-
* to obtain different simulated data.
|
|
331
|
-
*/
|
|
332
|
-
refererQuery: {}
|
|
333
|
-
},
|
|
334
299
|
/**
|
|
335
300
|
* response headers
|
|
336
301
|
* @type Record<string, any>
|
|
@@ -381,7 +346,38 @@ export default defineMock({
|
|
|
381
346
|
*/
|
|
382
347
|
response(req, res, next) {
|
|
383
348
|
res.end()
|
|
384
|
-
}
|
|
349
|
+
},
|
|
350
|
+
/**
|
|
351
|
+
* Request validator, return mock data if validated, otherwise do not use current mock.
|
|
352
|
+
* This is useful in scenarios where an interface needs to return different data based
|
|
353
|
+
* on different input parameters.
|
|
354
|
+
* Validators can solve this type of problem well by dividing the same URL into multiple
|
|
355
|
+
* mock configurations and determining which one is effective based on the validator.
|
|
356
|
+
*
|
|
357
|
+
* @type { headers, body, query, params, refererQuery }
|
|
358
|
+
* If the validator passed in is an object,
|
|
359
|
+
* then the validation method is to deeply compare whether
|
|
360
|
+
* `headers/body/query/params/refererQuery` of the requested interface contain
|
|
361
|
+
* the `key-value` of the validator.
|
|
362
|
+
*
|
|
363
|
+
* @type (request) => boolean
|
|
364
|
+
* If the validator passed in is a function,
|
|
365
|
+
* then the data related to the requested interface will be provided as input parameters
|
|
366
|
+
* for users to perform custom validation and return a boolean.
|
|
367
|
+
*
|
|
368
|
+
*/
|
|
369
|
+
validator: {
|
|
370
|
+
headers: {},
|
|
371
|
+
body: {},
|
|
372
|
+
query: {},
|
|
373
|
+
params: {},
|
|
374
|
+
/**
|
|
375
|
+
* refererQuery validates the query parameters in the URL of the request source page,
|
|
376
|
+
* which allows for direct modification of parameters in the browser address bar
|
|
377
|
+
* to obtain different simulated data.
|
|
378
|
+
*/
|
|
379
|
+
refererQuery: {}
|
|
380
|
+
},
|
|
385
381
|
})
|
|
386
382
|
```
|
|
387
383
|
``` ts
|
|
@@ -533,6 +529,13 @@ export default defineMock([
|
|
|
533
529
|
// `?a=3` will resolve to `validator.query`
|
|
534
530
|
url: '/api/test?a=3',
|
|
535
531
|
body: { message: 'query.a == 3' }
|
|
532
|
+
},
|
|
533
|
+
// Hitting the POST /api/test request, and in the request body,
|
|
534
|
+
// field a is an array that contains items with values of 1 and 2.
|
|
535
|
+
{
|
|
536
|
+
url: '/api/test',
|
|
537
|
+
method: ['POST'],
|
|
538
|
+
validator: { body: { a: [1, 2] } }
|
|
536
539
|
}
|
|
537
540
|
])
|
|
538
541
|
```
|
package/README.zh-CN.md
CHANGED
|
@@ -82,9 +82,7 @@ export default defineConfig({
|
|
|
82
82
|
define: {},
|
|
83
83
|
server: {
|
|
84
84
|
proxy: {
|
|
85
|
-
'^/api': {
|
|
86
|
-
target: 'http://example.com'
|
|
87
|
-
}
|
|
85
|
+
'^/api': { target: 'http://example.com' }
|
|
88
86
|
}
|
|
89
87
|
}
|
|
90
88
|
})
|
|
@@ -106,10 +104,7 @@ import { defineMock } from 'vite-plugin-mock-dev-server'
|
|
|
106
104
|
|
|
107
105
|
export default defineMock({
|
|
108
106
|
url: '/api/test',
|
|
109
|
-
body: {
|
|
110
|
-
a: 1,
|
|
111
|
-
b: 2,
|
|
112
|
-
}
|
|
107
|
+
body: { a: 1, b: 2 }
|
|
113
108
|
})
|
|
114
109
|
```
|
|
115
110
|
|
|
@@ -215,7 +210,7 @@ export default defineConfig({
|
|
|
215
210
|
serverPort?: number
|
|
216
211
|
/**
|
|
217
212
|
* 构建输出目录
|
|
218
|
-
@default 'mockServer'
|
|
213
|
+
* @default 'mockServer'
|
|
219
214
|
*/
|
|
220
215
|
dist?: string
|
|
221
216
|
}
|
|
@@ -279,7 +274,8 @@ export default defineMock({
|
|
|
279
274
|
*/
|
|
280
275
|
enabled: true,
|
|
281
276
|
/**
|
|
282
|
-
*
|
|
277
|
+
* 设置接口响应延迟,如果传入的是一个数组,则代表延迟时间的范围
|
|
278
|
+
* 单位:ms
|
|
283
279
|
* @default 0
|
|
284
280
|
*/
|
|
285
281
|
delay: 1000,
|
|
@@ -292,33 +288,6 @@ export default defineMock({
|
|
|
292
288
|
* 响应状态文本
|
|
293
289
|
*/
|
|
294
290
|
statusText: 'OK',
|
|
295
|
-
/**
|
|
296
|
-
* 请求验证器,通过验证器则返回 mock数据,否则不使用当前mock。
|
|
297
|
-
* 这对于一些场景中,某个接口需要通过不同的入参来返回不同的数据,
|
|
298
|
-
* 验证器可以很好的解决这一类问题,将同个 url 分为多个 mock配置,
|
|
299
|
-
* 根据 验证器来判断哪个mock配置生效。
|
|
300
|
-
*
|
|
301
|
-
* @type { headers?: object; body?: object; query?: object; params?: object; refererQuery?: object }
|
|
302
|
-
*
|
|
303
|
-
* 如果 validator 传入的是一个对象,那么验证方式是严格比较 请求的接口
|
|
304
|
-
* 中,headers/body/query/params 的各个`key`的`value`是否全等,
|
|
305
|
-
* 全等则校验通过
|
|
306
|
-
*
|
|
307
|
-
* @type ({ headers: object; body: object; query: object; params: object; refererQuery: object }) => boolean
|
|
308
|
-
* 如果 validator 传入的是一个函数,那么会讲 请求的接口相关数据作为入参,提供给使用者进行自定义校验,并返回一个 boolean
|
|
309
|
-
*
|
|
310
|
-
*/
|
|
311
|
-
validator: {
|
|
312
|
-
headers: {},
|
|
313
|
-
body: {},
|
|
314
|
-
query: {},
|
|
315
|
-
params: {},
|
|
316
|
-
/**
|
|
317
|
-
* refererQuery 验证了请求来源页面 URL 中的查询参数,
|
|
318
|
-
* 这使得可以直接在浏览器地址栏中修改参数以获取不同的模拟数据。
|
|
319
|
-
*/
|
|
320
|
-
refererQuery: {}
|
|
321
|
-
},
|
|
322
291
|
/**
|
|
323
292
|
* 响应状态 headers
|
|
324
293
|
* @type Record<string, any>
|
|
@@ -363,7 +332,7 @@ export default defineMock({
|
|
|
363
332
|
* @type (request: { headers, query, body, params }) => any | Promise<any>
|
|
364
333
|
* 如果传入一个函数,那么可以更加灵活的定义返回响应体数据
|
|
365
334
|
*/
|
|
366
|
-
body:
|
|
335
|
+
body: '',
|
|
367
336
|
|
|
368
337
|
/**
|
|
369
338
|
* 如果通过 body 配置不能解决mock需求,
|
|
@@ -376,7 +345,32 @@ export default defineMock({
|
|
|
376
345
|
*/
|
|
377
346
|
response(req, res, next) {
|
|
378
347
|
res.end()
|
|
379
|
-
}
|
|
348
|
+
},
|
|
349
|
+
/**
|
|
350
|
+
* 请求验证器,通过验证器则返回 mock数据,否则不使用当前mock。
|
|
351
|
+
* 这对于一些场景中,某个接口需要通过不同的入参来返回不同的数据,验证器可以很好的解决这一类问题,
|
|
352
|
+
* 将同个 url 分为多个 mock配置,根据 验证器来判断哪个mock配置生效。
|
|
353
|
+
*
|
|
354
|
+
* @type { headers, body, query, params, refererQuery }
|
|
355
|
+
* 如果 validator 传入的是一个对象,那么验证方式是 深度比较 请求的接口
|
|
356
|
+
* 中 headers/body/query/params/refererQuery 是否包含 validator 的 key-value。
|
|
357
|
+
*
|
|
358
|
+
* @type (request) => boolean
|
|
359
|
+
* 如果 validator 传入的是一个函数,那么会将 请求的接口相关数据作为入参,
|
|
360
|
+
* 提供给使用者进行自定义校验,并返回一个 boolean
|
|
361
|
+
*
|
|
362
|
+
*/
|
|
363
|
+
validator: {
|
|
364
|
+
headers: {},
|
|
365
|
+
body: {},
|
|
366
|
+
query: {},
|
|
367
|
+
params: {},
|
|
368
|
+
/**
|
|
369
|
+
* refererQuery 验证了请求来源页面 URL 中的查询参数,
|
|
370
|
+
* 这使得可以直接在浏览器地址栏中修改参数以获取不同的模拟数据。
|
|
371
|
+
*/
|
|
372
|
+
refererQuery: {}
|
|
373
|
+
},
|
|
380
374
|
})
|
|
381
375
|
```
|
|
382
376
|
```ts
|
|
@@ -528,6 +522,12 @@ export default defineMock([
|
|
|
528
522
|
// `?a=3` 将会解析到 `validator.query`
|
|
529
523
|
url: '/api/test?a=3',
|
|
530
524
|
body: { message: 'query.a == 3' },
|
|
525
|
+
},
|
|
526
|
+
// 命中 POST /api/test 请求,且 请求体中,字段 a 为数组,且数组包含值为 1, 2 的项
|
|
527
|
+
{
|
|
528
|
+
url: '/api/test',
|
|
529
|
+
method: ['POST'],
|
|
530
|
+
validator: { body: { a: [1, 2] } }
|
|
531
531
|
}
|
|
532
532
|
])
|
|
533
533
|
```
|
package/dist/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
`,
|
|
3
|
-
`)}};function
|
|
1
|
+
"use strict";var it=Object.create;var z=Object.defineProperty;var ct=Object.getOwnPropertyDescriptor;var at=Object.getOwnPropertyNames;var pt=Object.getPrototypeOf,lt=Object.prototype.hasOwnProperty;var ut=(e,o)=>{for(var t in o)z(e,t,{get:o[t],enumerable:!0})},we=(e,o,t,r)=>{if(o&&typeof o=="object"||typeof o=="function")for(let n of at(o))!lt.call(e,n)&&n!==t&&z(e,n,{get:()=>o[n],enumerable:!(r=ct(o,n))||r.enumerable});return e};var f=(e,o,t)=>(t=e!=null?it(pt(e)):{},we(o||!e||!e.__esModule?z(t,"default",{value:e,enumerable:!0}):t,e)),mt=e=>we(z({},"__esModule",{value:!0}),e);var $t={};ut($t,{baseMiddleware:()=>fe,createDefineMock:()=>It,default:()=>Lt,defineMock:()=>Et,mockDevServerPlugin:()=>be,mockWebSocket:()=>ve,transformMockData:()=>ke});module.exports=mt($t);var dt=()=>typeof document>"u"?new URL("file:"+__filename).href:document.currentScript&&document.currentScript.src||new URL("main.js",document.baseURI).href,M=dt();var Le=f(require("fs"),1),B=f(require("fs/promises"),1),F=f(require("path"),1),$e=require("esbuild"),Te=f(require("fast-glob"),1),Fe=f(require("is-core-module"),1),ne=require("vite");var Oe="vite-plugin-mock-dev-server",Pe="1.1.14";var ft=/import\.meta\.env\.(.+)/;function G(e){let o={},t=process.env.NODE_ENV||e.mode;Object.assign(o,{"process.env.NODE_ENV":JSON.stringify(t),"global.process.env.NODE_ENV":JSON.stringify(t),"globalThis.process.env.NODE_ENV":JSON.stringify(t),__vite_process_env_NODE_ENV:JSON.stringify(t)});let r={},n={};for(let c in e.define){let a=e.define[c];r[c]=typeof a=="string"?a:JSON.stringify(a);let m=c.match(ft);m&&(n[m[1]]=`__vite__define__${r[c]}`)}let s={},i={};s["import.meta.hot"]="undefined";for(let c in e.env)s[`import.meta.env.${c}`]=JSON.stringify(e.env[c]);return Object.assign(i,{"import.meta.env":JSON.stringify({...e.env,...n}).replace(/"__vite__define__(.+?)"([,}])/g,(c,a,m)=>`${a.replace(/(^\\")|(\\"$)/g,'"')}${m}`)}),{...s,...r,...i,...o}}var ae=f(require("fs/promises"),1),je=f(require("path"),1),Re=f(require("json5"),1),Q={name:"externalize-deps",setup(e){e.onResolve({filter:/.*/},({path:o})=>{if(o[0]!=="."&&!je.default.isAbsolute(o))return{external:!0}})}},V={name:"json5-loader",setup(e){e.onLoad({filter:/\.json5$/},async({path:o})=>{let t=await ae.default.readFile(o,"utf-8");return{contents:`export default ${JSON.stringify(Re.default.parse(t))}`,loader:"js"}})}},K={name:"json-loader",setup(e){e.onLoad({filter:/\.json$/},async({path:o})=>({contents:`export default ${await ae.default.readFile(o,"utf-8")}`,loader:"js"}))}},X=e=>({name:"alias-plugin",setup(o){o.onResolve({filter:/.*/},async({path:t})=>{let r=e.find(({find:c})=>kt(c,t));if(!r)return null;let{find:n,replacement:s}=r;return{path:(await o.resolve(t.replace(n,s),{kind:"import-statement",resolveDir:s,namespace:"file"})).path,external:!1}})}});function kt(e,o){return e instanceof RegExp?e.test(o):o.length<e.length?!1:o===e?!0:o.startsWith(`${e}/`)}var Y=f(require("fs"),1),Z=f(require("path"),1),Ce=require("querystring"),ee=require("url"),We=f(require("debug"),1),De=require("path-to-regexp"),pe=f(require("picocolors"),1),v=e=>Array.isArray(e),R=e=>typeof e=="function",te=e=>Object.prototype.toString.call(e)==="[object Object]",le=e=>te(e)&&Object.keys(e).length===0,gt=e=>e!==null&&typeof e=="object"&&typeof e.pipe=="function",_e=e=>gt(e)&&e.readable!==!1&&typeof e._read=="function"&&typeof e._readableState=="object";function Ee(e){return new Promise(o=>setTimeout(o,e))}function Ie(e){return Z.default.dirname((0,ee.fileURLToPath)(e))}var C=(0,We.default)("vite:plugin-mock-dev-server"),S=e=>v(e)?e:e==null?[]:[e],W={info(...e){console.info(pe.default.cyan("mock-dev-server: "),...e)},error(...e){console.error(`
|
|
2
|
+
`,pe.default.cyan("mock-dev-server: "),...e,`
|
|
3
|
+
`)}};function A(e,o,t){for(let n of o){let s=Z.default.join(e,n);if(Y.default.existsSync(s)&&Y.default.statSync(s).isFile()){let i=t!=null&&t.pathOnly?s:Y.default.readFileSync(s,"utf-8");if(!(t!=null&&t.predicate)||t.predicate(i))return i}}let r=Z.default.dirname(e);if(r!==e&&(!(t!=null&&t.rootDir)||r.startsWith(t==null?void 0:t.rootDir)))return A(r,o,t)}var oe=(e={})=>{let o=[],t=[];return Object.keys(e).forEach(r=>{var s,i;let n=e[r];typeof n=="string"||!n.ws&&!((s=n.target)!=null&&s.toString().startsWith("ws:"))&&!((i=n.target)!=null&&i.toString().startsWith("wss:"))?o.push(r):t.push(r)}),{httpProxies:o,wsProxies:t}};function re(e,o){return e[0]==="^"&&new RegExp(e).test(o)||o.startsWith(e)}function q(e,o){return((0,De.match)(e,{decode:decodeURIComponent})(o)||{params:{}}).params||{}}function D(e){let o=new ee.URL(e,"http://example.com"),t=decodeURIComponent(o.pathname),r=(0,Ce.parse)(o.search.replace(/^\?/,""));return{pathname:t,query:r}}async function Ne(e,o,t){let r=S(t.include),n=S(t.exclude),s=G(o),{httpProxies:i}=oe(o.server.proxy||{});i.push(...S(t.prefix));let c=S(t.wsPrefix),a={};try{let u=A(o.root,["package.json"]);u&&(a=JSON.parse(u))}catch{}let m=t.build.dist,w=await Mt(process.cwd(),r,n),b=F.default.join(o.root,`mock-data-${Date.now()}.js`);await B.default.writeFile(b,w,"utf-8");let{code:H,deps:I}=await bt(b,s,o.resolve.alias),p=yt(I);await B.default.unlink(b);let l=[{filename:F.default.join(m,"mock-data.js"),source:H},{filename:F.default.join(m,"index.js"),source:vt(i,c,t.cookiesOptions,t.build.serverPort)},{filename:F.default.join(m,"package.json"),source:ht(a,p)}];try{if(F.default.isAbsolute(m)){await B.default.rm(m,{recursive:!0}),Le.default.mkdirSync(m,{recursive:!0});for(let{filename:u,source:d}of l)await B.default.writeFile(u,d,"utf-8")}else for(let{filename:u,source:d}of l)e.emitFile({type:"asset",fileName:u,source:d})}catch{}}function yt(e){let o=new Set,t=[Oe,"connect","cors"];return Object.keys(e).forEach(r=>{e[r].imports.filter(s=>s.external).map(s=>s.path).forEach(s=>{!t.includes(s)&&!(0,Fe.default)(s)&&o.add(s)})}),Array.from(o)}function ht(e,o){let{dependencies:t={},devDependencies:r={}}=e,n={...t,...r},s={name:"mock-server",type:"module",scripts:{start:"node index.js"},dependencies:{connect:"^3.7.0","vite-plugin-mock-dev-server":`^${Pe}`,cors:"^2.8.5"},pnpm:{peerDependencyRules:{ignoreMissing:["vite"]}}};return o.forEach(i=>{s.dependencies[i]=n[i]||"latest"}),JSON.stringify(s,null,2)}function vt(e,o,t={},r=8080){return`import { createServer } from 'node:http';
|
|
4
4
|
import connect from 'connect';
|
|
5
5
|
import corsMiddleware from 'cors';
|
|
6
6
|
import { baseMiddleware, mockWebSocket } from 'vite-plugin-mock-dev-server';
|
|
@@ -24,7 +24,7 @@ app.use(baseMiddleware({ mockData }, {
|
|
|
24
24
|
server.listen(${r});
|
|
25
25
|
|
|
26
26
|
console.log('listen: http://localhost:${r}');
|
|
27
|
-
`}async function Mt(e,o,t){let r=await(0
|
|
27
|
+
`}async function Mt(e,o,t){let r=await(0,Te.default)(o,{cwd:e}),n=(0,ne.createFilter)(o,t,{resolve:!1}),s=r.filter(n),i="",c="";return s.forEach((a,m)=>{let w=(0,ne.normalizePath)(F.default.join(e,a));i+=`import * as m${m} from '${w}';
|
|
28
28
|
`,c+=`m${m}, `}),`import { transformMockData } from 'vite-plugin-mock-dev-server';
|
|
29
29
|
${i}
|
|
30
30
|
const exporters = [${c}];
|
|
@@ -42,10 +42,10 @@ const mockList = exporters.map((raw) => {
|
|
|
42
42
|
}
|
|
43
43
|
return mockConfig
|
|
44
44
|
});
|
|
45
|
-
export default transformMockData(mockList);`}async function bt(e,o,t){var r;try{let n=await(0
|
|
46
|
-
`,`file: ${P.default.cyan(d.__filepath__)}`,
|
|
47
|
-
`,`file: ${P.default.cyan(d.__filepath__)}`,
|
|
48
|
-
`,`file: ${P.default.cyan(n.__filepath__)}`,a),!1}}return i})}function
|
|
49
|
-
`,c)}}async function Pt(e,o,{cookies:t}){if(t)try{let r=
|
|
50
|
-
`,r)}}function
|
|
51
|
-
`,O)}},
|
|
45
|
+
export default transformMockData(mockList);`}async function bt(e,o,t){var r;try{let n=await(0,$e.build)({entryPoints:[e],outfile:"out.js",write:!1,target:["node14.18","node16"],platform:"node",bundle:!0,metafile:!0,format:"esm",define:o,plugins:[X(t),Q,V,K]});return{code:n.outputFiles[0].text,deps:((r=n.metafile)==null?void 0:r.inputs)||{}}}catch(n){console.error(n)}return{code:"",deps:{}}}var me=require("buffer"),Je=f(require("cookies"),1),ze=f(require("http-status"),1),Ge=f(require("lodash.sortby"),1),J=f(require("mime-types"),1),de=require("path-to-regexp"),P=f(require("picocolors"),1);var se=f(require("co-body"),1),He=f(require("formidable"),1);async function Ue(e,o){var n;let t=e.method.toUpperCase();if(["GET","DELETE","HEAD"].includes(t))return;let r=((n=e.headers["content-type"])==null?void 0:n.toLocaleLowerCase())||"";try{if(r.startsWith("application/json"))return await se.default.json(e);if(r.startsWith("application/x-www-form-urlencoded"))return await se.default.form(e);if(r.startsWith("text/plain"))return await se.default.text(e);if(r.startsWith("multipart/form-data"))return await xt(e,o)}catch(s){console.error(s)}}async function xt(e,o){let t=(0,He.default)(o);return new Promise((r,n)=>{t.parse(e,(s,i,c)=>{if(s){n(s);return}r({...i,...c})})})}function Ae(e,o){return _(e.headers,o.headers)&&_(e.body,o.body)&&_(e.params,o.params)&&_(e.query,o.query)&&_(e.refererQuery,o.refererQuery)}function _(e,o){if(!o)return!0;for(let t in o)if(!qe(e[t],o[t]))return!1;return!0}function qe(e,o){if(v(e)&&v(o)){let t=new Set;return o.every(r=>e.some((n,s)=>{if(t.has(s))return!1;let i=qe(n,r);return i&&t.add(s),i}))}return te(e)&&te(o)?_(e,o):e===o}var wt=/:/g;function fe(e,{formidableOptions:o={},proxies:t,cookiesOptions:r}){return async function(n,s,i){let c=Date.now(),{query:a,pathname:m}=D(n.url);if(!m||t.length===0||!t.some(h=>re(h,n.url)))return i();let w=e.mockData,b=(0,Ge.default)(Object.keys(w),h=>{var U;return((U=h.match(wt))==null?void 0:U.length)||0}).find(h=>(0,de.pathToRegexp)(h).test(m));if(!b)return i();let{query:H}=D(n.headers.referer||""),I=await Ue(n,o),p=new Je.default(n,s,r),l=p.get.bind(p),u=n.method.toUpperCase(),d=St(w[b],{pathname:m,method:u,request:{query:a,refererQuery:H,body:I,headers:n.headers,getCookie:l}});if(!d)return i();C("middleware: ",u,n.url);let k=n,g=s;k.body=I,k.query=a,k.refererQuery=H,k.params=q(d.url,m),k.getCookie=l,g.setCookie=p.set.bind(p);let{body:y,delay:O,type:j="json",response:L,status:$=200,statusText:T}=d;if(ue(g,$,T),await Ot(k,g,d),await Pt(k,g,d),y){try{let h=R(y)?await y(k):y;await Be(c,O),jt(g,h,j)}catch(h){W.error(`${P.default.red("[body error]")} ${n.url}
|
|
46
|
+
`,`file: ${P.default.cyan(d.__filepath__)}`,h),ue(g,500),s.end("")}return}if(L){try{await Be(c,O),await L(k,g,i)}catch(h){W.error(`${P.default.red("[response error]")} ${n.url}
|
|
47
|
+
`,`file: ${P.default.cyan(d.__filepath__)}`,h),ue(g,500),s.end("")}return}s.end("")}}function St(e,{pathname:o,method:t,request:r}){return e.find(n=>{if(!o||!n||!n.url||n.ws===!0||!(n.method?v(n.method)?n.method:[n.method]:["GET","POST"]).includes(t))return!1;let i=(0,de.pathToRegexp)(n.url).test(o);if(i&&n.validator){let c=q(n.url,o);if(R(n.validator))return n.validator({params:c,...r});try{return Ae({params:c,...r},n.validator)}catch(a){return W.error(`${P.default.red("[validator error]")} ${o}
|
|
48
|
+
`,`file: ${P.default.cyan(n.__filepath__)}`,a),!1}}return i})}function ue(e,o=200,t){e.statusCode=o,e.statusMessage=t||Rt(o)}async function Ot(e,o,t){let{headers:r,type:n="json"}=t,s=t.__filepath__,i=J.contentType(n)||J.contentType(J.lookup(n)||"");if(i&&o.setHeader("Content-Type",i),o.setHeader("Cache-Control","no-cache,max-age=0"),o.setHeader("X-Mock-Power-By","vite-plugin-mock-dev-server"),o.setHeader("X-File-Path",s),!!r)try{let c=R(r)?await r(e):r;Object.keys(c).forEach(a=>{o.setHeader(a,c[a])})}catch(c){W.error(`${P.default.red("[headers error]")} ${e.url}
|
|
49
|
+
`,c)}}async function Pt(e,o,{cookies:t}){if(t)try{let r=R(t)?await t(e):t;Object.keys(r).forEach(n=>{let s=r[n];if(v(s)){let[i,c]=s;o.setCookie(n,i,c)}else o.setCookie(n,s)})}catch(r){W.error(`${P.default.red("[cookies error]")} ${e.url}
|
|
50
|
+
`,r)}}function jt(e,o,t){if(_e(o))o.pipe(e);else if(me.Buffer.isBuffer(o))e.end(t==="text"||t==="json"?o.toString("utf-8"):o);else{let r=typeof o=="string"?o:JSON.stringify(o);e.end(t==="buffer"?me.Buffer.from(r):r)}}async function Be(e,o){if(!o||typeof o=="number"&&o<=0||v(o)&&o.length!==2)return;let t=0;if(v(o)){let[r,n]=o;t=Math.floor(Math.random()*(n-r+1))+r}else t=o-(Date.now()-e);t>0&&await Ee(t)}function Rt(e){return ze.default[e]||"Unknown"}var Ve=f(require("events"),1),ie=f(require("fs"),1),Ke=require("module"),ge=f(require("path"),1),Xe=require("url"),ye=f(require("chokidar"),1),Ye=require("esbuild"),Ze=f(require("fast-glob"),1),E=require("vite");var Qe=f(require("lodash.sortby"),1);function ke(e){let o=[];for(let[,r]of e.entries())r&&(v(r)?o.push(...r):o.push(r));let t={};return o.filter(r=>(r.enabled||typeof r.enabled>"u")&&r.url).forEach(r=>{let{pathname:n,query:s}=D(r.url),i=t[n]??(t[n]=[]),c={...r,url:n};if(c.ws!==!0){let a=c.validator;le(s)||(R(a)?c.validator=function(m){return _(m.query,s)&&a(m)}:a?(c.validator={...a},c.validator.query=c.validator.query?{...s,...c.validator.query}:s):c.validator={query:s})}i.push(c)}),Object.keys(t).forEach(r=>{t[r]=(0,Qe.default)(t[r],n=>{if(n.ws===!0)return 0;let{validator:s}=n;return!s||le(s)?2:R(s)?0:1/Object.keys(s).reduce((c,a)=>c+Ct(s[a]),0)})}),t}function Ct(e){return e?Object.keys(e).length:0}var Wt=Ie(M),N=(0,Ke.createRequire)(Wt),ce=class extends Ve.default{constructor(t){super();this.options=t;this.moduleCache=new Map;this.moduleDeps=new Map;this.moduleType="cjs";this._mockData={};this.cwd=t.cwd||process.cwd();try{let r=A(this.cwd,["package.json"]);this.moduleType=r&&JSON.parse(r).type==="module"?"esm":"cjs"}catch{}}get mockData(){return this._mockData}load(){let{include:t,exclude:r}=this.options,n=(0,E.createFilter)(t,r,{resolve:!1});(0,Ze.default)(t,{cwd:this.cwd}).then(i=>Promise.all(i.filter(n).map(c=>this.loadMock(c)))).then(()=>this.updateMockList()),this.watchMockEntry(),this.watchDeps();let s=null;this.on("mock:update",async i=>{n(i)&&(await this.loadMock(i),s&&clearImmediate(s),s=setImmediate(()=>{this.updateMockList(),this.emit("mock:update-end",i),s=null}))}),this.on("mock:unlink",async i=>{n(i)&&(this.moduleCache.delete(i),this.updateMockList(),this.emit("mock:update-end",i))})}watchMockEntry(){let{include:t}=this.options,[r,...n]=t,s=ye.default.watch(r,{ignoreInitial:!0,cwd:this.cwd});n.length>0&&n.forEach(i=>s.add(i)),s.on("add",async i=>{i=(0,E.normalizePath)(i),this.emit("mock:update",i),C("watcher:add",i)}),s.on("change",async i=>{i=(0,E.normalizePath)(i),this.emit("mock:update",i),C("watcher:change",i)}),s.on("unlink",async i=>{i=(0,E.normalizePath)(i),this.emit("mock:unlink",i),C("watcher:unlink",i)}),this.mockWatcher=s}watchDeps(){let t=[];this.depsWatcher=ye.default.watch([],{ignoreInitial:!0,cwd:this.cwd}),this.depsWatcher.on("change",r=>{r=(0,E.normalizePath)(r);let n=this.moduleDeps.get(r);n&&n.forEach(s=>{this.emit("mock:update",s)})}),this.depsWatcher.on("unlink",r=>{r=(0,E.normalizePath)(r),this.moduleDeps.delete(r)}),this.on("update:deps",()=>{let r=[];for(let[s]of this.moduleDeps.entries())r.push(s);let n=r.filter(s=>!t.includes(s));n.length>0&&this.depsWatcher.add(n)})}close(){var t,r;(t=this.mockWatcher)==null||t.close(),(r=this.depsWatcher)==null||r.close()}updateMockList(){this._mockData=ke(this.moduleCache)}updateModuleDeps(t,r){Object.keys(r).forEach(n=>{r[n].imports.map(i=>i.path).forEach(i=>{this.moduleDeps.has(i)||this.moduleDeps.set(i,new Set),this.moduleDeps.get(i).add(t)})}),this.emit("update:deps")}async loadMock(t){if(!t)return;let r=!1;/\.m[jt]s$/.test(t)?r=!0:/\.c[jt]s$/.test(t)?r=!1:r=this.moduleType==="esm";let{code:n,deps:s}=await this.transformWithEsbuild(t,r);try{let i=await this.loadFromCode(t,n,r)||{},c;i.default?c=i.default:(c=[],Object.keys(i).forEach(a=>{v(i[a])?c.push(...i[a]):c.push(i[a])})),v(c)?c.forEach(a=>a.__filepath__=t):c.__filepath__=t,this.moduleCache.set(t,c),this.updateModuleDeps(t,s)}catch(i){console.error(i)}}async loadFromCode(t,r,n){if(n){let s=`${t}.timestamp-${Date.now()}`,i=`${s}.mjs`,c=`${(0,Xe.pathToFileURL)(s)}.mjs`;await ie.default.promises.writeFile(i,r,"utf8");try{return await import(c)}finally{try{ie.default.unlinkSync(i)}catch{}}}else{t=ge.default.resolve(this.cwd,t);let s=ge.default.extname(t),i=ie.default.realpathSync(t),c=s in N.extensions?s:".js",a=N.extensions[c];N.extensions[c]=(w,b)=>{b===i?w._compile(r,b):a(w,b)},delete N.cache[N.resolve(t)];let m=N(t);return N.extensions[c]=a,m.__esModule?m:{default:m}}}async transformWithEsbuild(t,r){var n;try{let s=await(0,Ye.build)({entryPoints:[t],outfile:"out.js",write:!1,target:["node14.18","node16"],platform:"node",bundle:!0,metafile:!0,format:r?"esm":"cjs",define:this.options.define,plugins:[X(this.options.alias),Q,K,V]});return{code:s.outputFiles[0].text,deps:((n=s.metafile)==null?void 0:n.inputs)||{}}}catch(s){console.error(s)}return{code:"",deps:{}}}};var tt=f(require("cookies"),1),he=require("path-to-regexp"),ot=f(require("picocolors"),1),rt=require("ws");function ve(e,o,t,r){var I;let n=new Map,s=new Map,i=new WeakMap,c=p=>{let l=s.get(p);return!l&&s.set(p,l=new Map),l},a=(p,l)=>{let u=p.get(l);return!u&&p.set(l,u=new rt.WebSocketServer({noServer:!0})),u},m=(p,l)=>{let u=n.get(p);!u&&n.set(p,u=new Set),u.add(l)},w=(p,l,u,d,k,g)=>{var y;try{(y=u.setup)==null||y.call(u,l,d),l.on("close",()=>p.delete(k))}catch(O){W.error(`${ot.default.red("[websocket server error]")} ${g}
|
|
51
|
+
`,O)}},b=(p,l,u,d)=>{p.emit("connection",l,u),l.on("close",()=>{let k=d.findIndex(g=>g.ws===l);k!==-1&&d.splice(k,1)})},H=(p,l,u,d,k)=>{let{cleanupList:g,connectionList:y,context:O}=i.get(l);et(g),y.forEach(({ws:j})=>j.removeAllListeners()),l.removeAllListeners(),w(p,l,u,O,d,k),y.forEach(({ws:j,req:L})=>b(l,j,L,y))};(I=e.on)==null||I.call(e,"mock:update-end",p=>{if(!n.has(p))return;let l=n.get(p);if(l)for(let u of l.values())for(let d of e.mockData[u]){if(!d.ws||d.__filepath__!==p)return;let k=c(u);for(let[g,y]of k.entries())H(k,y,d,g,p)}}),o==null||o.on("upgrade",(p,l,u)=>{let{pathname:d,query:k}=D(p.url);if(!d||t.length===0||!t.some(x=>re(x,p.url)))return;let g=e.mockData,y=Object.keys(g).find(x=>(0,he.pathToRegexp)(x).test(d));if(!y)return;let O=g[y].find(x=>x.url&&x.ws&&(0,he.pathToRegexp)(x.url).test(d));if(!O)return;let j=O.__filepath__;m(j,y);let L=c(y),$=a(L,d),T=i.get($);if(!T){let x=[],xe={onCleanup:st=>x.push(st)};T={cleanupList:x,context:xe,connectionList:[]},i.set($,T),w(L,$,O,xe,d,j)}let h=p,U=new tt.default(p,p,r),{query:nt}=D(p.headers.referer||"");h.query=k,h.refererQuery=nt,h.params=q(y,d),h.getCookie=U.get.bind(U),$.handleUpgrade(h,l,u,x=>{C(`websocket-mock: ${p.url} connected`),T.connectionList.push({req:h,ws:x}),b($,x,h,T.connectionList)})}),o==null||o.on("close",()=>{for(let p of s.values()){for(let l of p.values()){let u=i.get(l);et(u.cleanupList),l.close()}p.clear()}s.clear(),n.clear()})}function et(e){let o;for(;o=e.shift();)o==null||o()}async function Me(e,o,t,r){let n=new ce({include:S(o.include),exclude:S(o.exclude),define:G(e),alias:e.resolve.alias});n.load(),n.on("mock:update-end",()=>{o.reload&&(r==null||r.send({type:"full-reload"}))}),t==null||t.on("close",()=>n.close());let{httpProxies:s}=oe(e.server.proxy||{}),i=S(o.prefix);return ve(n,t,S(o.wsPrefix),o.cookiesOptions),fe(n,{formidableOptions:o.formidableOptions,proxies:[...i,...s],cookiesOptions:o.cookiesOptions})}function be({prefix:e=[],wsPrefix:o=[],include:t=["mock/**/*.mock.{js,ts,cjs,mjs,json,json5}"],exclude:r=["**/node_modules/**","**/.vscode/**","**/.git/**"],reload:n=!1,formidableOptions:s={},build:i=!1,cookiesOptions:c={}}={}){let a={prefix:e,wsPrefix:o,include:t,exclude:r,reload:n,cookiesOptions:c,formidableOptions:{multiples:!0,...s},build:i?Object.assign({serverPort:8080,dist:"mockServer"},typeof i=="object"?i:{}):!1},m=[_t(a)];return a.build&&m.push(Dt(a)),m}function Dt(e){let o={};return{name:"vite-plugin-mock-dev-server-generator",enforce:"post",apply:"build",configResolved(t){o=t,t.logger.warn("")},async buildEnd(t){t||o.command==="build"&&await Ne(this,o,e)}}}function _t(e){let o={};return{name:"vite-plugin-mock-dev-server",enforce:"pre",apply:"serve",config(t){var s;let r=S(e.wsPrefix);if(r.length===0||!((s=t.server)!=null&&s.proxy)||Object.keys(t.server.proxy).length===0)return;let n={};Object.keys(t.server.proxy).forEach(i=>{r.includes(i)||(n[i]=t.server.proxy[i])}),t.server.proxy=n},configResolved(t){o=t,t.logger.warn("")},async configureServer({middlewares:t,config:r,httpServer:n,ws:s}){let i=await Me(r,e,n,s);t.use(i)},async configurePreviewServer({middlewares:t,httpServer:r}){let n=await Me(o,e,r);t.use(n)}}}function Et(e){return e}function It(e){return t=>(v(t)?t=t.map(r=>e(r)||r):t=e(t)||t,t)}var Lt=be;0&&(module.exports={baseMiddleware,createDefineMock,defineMock,mockDevServerPlugin,mockWebSocket,transformMockData});
|
package/dist/index.d.ts
CHANGED
|
@@ -225,12 +225,15 @@ interface MockHttpItem extends MockBaseItem {
|
|
|
225
225
|
*/
|
|
226
226
|
statusText?: string;
|
|
227
227
|
/**
|
|
228
|
-
* Configure response delay time,
|
|
228
|
+
* Configure response delay time,
|
|
229
|
+
* If an array is passed in, it represents the range of delay time.
|
|
230
|
+
* unit: `ms`
|
|
229
231
|
*
|
|
230
|
-
* 配置响应延迟时间,
|
|
232
|
+
* 配置响应延迟时间, 如果传入的是一个数组,则代表延迟时间的范围
|
|
233
|
+
* 单位: `ms`
|
|
231
234
|
* @default 0
|
|
232
235
|
*/
|
|
233
|
-
delay?: number;
|
|
236
|
+
delay?: number | [number, number];
|
|
234
237
|
/**
|
|
235
238
|
* Configure response body cookies
|
|
236
239
|
*
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
2
|
-
`,
|
|
3
|
-
`)}};function
|
|
1
|
+
import Be from"fs";import Z from"fs/promises";import N from"path";import{build as Je}from"esbuild";import ze from"fast-glob";import Ge from"is-core-module";import{createFilter as Qe,normalizePath as Ve}from"vite";var le="vite-plugin-mock-dev-server",ue="1.1.14";var Ie=/import\.meta\.env\.(.+)/;function J(t){let o={},e=process.env.NODE_ENV||t.mode;Object.assign(o,{"process.env.NODE_ENV":JSON.stringify(e),"global.process.env.NODE_ENV":JSON.stringify(e),"globalThis.process.env.NODE_ENV":JSON.stringify(e),__vite_process_env_NODE_ENV:JSON.stringify(e)});let r={},n={};for(let c in t.define){let a=t.define[c];r[c]=typeof a=="string"?a:JSON.stringify(a);let m=c.match(Ie);m&&(n[m[1]]=`__vite__define__${r[c]}`)}let s={},i={};s["import.meta.hot"]="undefined";for(let c in t.env)s[`import.meta.env.${c}`]=JSON.stringify(t.env[c]);return Object.assign(i,{"import.meta.env":JSON.stringify({...t.env,...n}).replace(/"__vite__define__(.+?)"([,}])/g,(c,a,m)=>`${a.replace(/(^\\")|(\\"$)/g,'"')}${m}`)}),{...s,...r,...i,...o}}import me from"fs/promises";import Le from"path";import $e from"json5";var z={name:"externalize-deps",setup(t){t.onResolve({filter:/.*/},({path:o})=>{if(o[0]!=="."&&!Le.isAbsolute(o))return{external:!0}})}},G={name:"json5-loader",setup(t){t.onLoad({filter:/\.json5$/},async({path:o})=>{let e=await me.readFile(o,"utf-8");return{contents:`export default ${JSON.stringify($e.parse(e))}`,loader:"js"}})}},Q={name:"json-loader",setup(t){t.onLoad({filter:/\.json$/},async({path:o})=>({contents:`export default ${await me.readFile(o,"utf-8")}`,loader:"js"}))}},V=t=>({name:"alias-plugin",setup(o){o.onResolve({filter:/.*/},async({path:e})=>{let r=t.find(({find:c})=>Te(c,e));if(!r)return null;let{find:n,replacement:s}=r;return{path:(await o.resolve(e.replace(n,s),{kind:"import-statement",resolveDir:s,namespace:"file"})).path,external:!1}})}});function Te(t,o){return t instanceof RegExp?t.test(o):o.length<t.length?!1:o===t?!0:o.startsWith(`${t}/`)}import te from"fs";import oe from"path";import{parse as Fe}from"querystring";import{URL as Ne,fileURLToPath as He}from"url";import Ae from"debug";import{match as Ue}from"path-to-regexp";import de from"picocolors";var h=t=>Array.isArray(t),j=t=>typeof t=="function",K=t=>Object.prototype.toString.call(t)==="[object Object]",re=t=>K(t)&&Object.keys(t).length===0,qe=t=>t!==null&&typeof t=="object"&&typeof t.pipe=="function",fe=t=>qe(t)&&t.readable!==!1&&typeof t._read=="function"&&typeof t._readableState=="object";function ke(t){return new Promise(o=>setTimeout(o,t))}function ge(t){return oe.dirname(He(t))}var C=Ae("vite:plugin-mock-dev-server"),S=t=>h(t)?t:t==null?[]:[t],R={info(...t){console.info(de.cyan("mock-dev-server: "),...t)},error(...t){console.error(`
|
|
2
|
+
`,de.cyan("mock-dev-server: "),...t,`
|
|
3
|
+
`)}};function A(t,o,e){for(let n of o){let s=oe.join(t,n);if(te.existsSync(s)&&te.statSync(s).isFile()){let i=e!=null&&e.pathOnly?s:te.readFileSync(s,"utf-8");if(!(e!=null&&e.predicate)||e.predicate(i))return i}}let r=oe.dirname(t);if(r!==t&&(!(e!=null&&e.rootDir)||r.startsWith(e==null?void 0:e.rootDir)))return A(r,o,e)}var X=(t={})=>{let o=[],e=[];return Object.keys(t).forEach(r=>{var s,i;let n=t[r];typeof n=="string"||!n.ws&&!((s=n.target)!=null&&s.toString().startsWith("ws:"))&&!((i=n.target)!=null&&i.toString().startsWith("wss:"))?o.push(r):e.push(r)}),{httpProxies:o,wsProxies:e}};function Y(t,o){return t[0]==="^"&&new RegExp(t).test(o)||o.startsWith(t)}function U(t,o){return(Ue(t,{decode:decodeURIComponent})(o)||{params:{}}).params||{}}function W(t){let o=new Ne(t,"http://example.com"),e=decodeURIComponent(o.pathname),r=Fe(o.search.replace(/^\?/,""));return{pathname:e,query:r}}async function ye(t,o,e){let r=S(e.include),n=S(e.exclude),s=J(o),{httpProxies:i}=X(o.server.proxy||{});i.push(...S(e.prefix));let c=S(e.wsPrefix),a={};try{let u=A(o.root,["package.json"]);u&&(a=JSON.parse(u))}catch{}let m=e.build.dist,w=await Ze(process.cwd(),r,n),v=N.join(o.root,`mock-data-${Date.now()}.js`);await Z.writeFile(v,w,"utf-8");let{code:F,deps:E}=await et(v,s,o.resolve.alias),p=Ke(E);await Z.unlink(v);let l=[{filename:N.join(m,"mock-data.js"),source:F},{filename:N.join(m,"index.js"),source:Ye(i,c,e.cookiesOptions,e.build.serverPort)},{filename:N.join(m,"package.json"),source:Xe(a,p)}];try{if(N.isAbsolute(m)){await Z.rm(m,{recursive:!0}),Be.mkdirSync(m,{recursive:!0});for(let{filename:u,source:d}of l)await Z.writeFile(u,d,"utf-8")}else for(let{filename:u,source:d}of l)t.emitFile({type:"asset",fileName:u,source:d})}catch{}}function Ke(t){let o=new Set,e=[le,"connect","cors"];return Object.keys(t).forEach(r=>{t[r].imports.filter(s=>s.external).map(s=>s.path).forEach(s=>{!e.includes(s)&&!Ge(s)&&o.add(s)})}),Array.from(o)}function Xe(t,o){let{dependencies:e={},devDependencies:r={}}=t,n={...e,...r},s={name:"mock-server",type:"module",scripts:{start:"node index.js"},dependencies:{connect:"^3.7.0","vite-plugin-mock-dev-server":`^${ue}`,cors:"^2.8.5"},pnpm:{peerDependencyRules:{ignoreMissing:["vite"]}}};return o.forEach(i=>{s.dependencies[i]=n[i]||"latest"}),JSON.stringify(s,null,2)}function Ye(t,o,e={},r=8080){return`import { createServer } from 'node:http';
|
|
4
4
|
import connect from 'connect';
|
|
5
5
|
import corsMiddleware from 'cors';
|
|
6
6
|
import { baseMiddleware, mockWebSocket } from 'vite-plugin-mock-dev-server';
|
|
@@ -24,7 +24,7 @@ app.use(baseMiddleware({ mockData }, {
|
|
|
24
24
|
server.listen(${r});
|
|
25
25
|
|
|
26
26
|
console.log('listen: http://localhost:${r}');
|
|
27
|
-
`}async function
|
|
27
|
+
`}async function Ze(t,o,e){let r=await ze(o,{cwd:t}),n=Qe(o,e,{resolve:!1}),s=r.filter(n),i="",c="";return s.forEach((a,m)=>{let w=Ve(N.join(t,a));i+=`import * as m${m} from '${w}';
|
|
28
28
|
`,c+=`m${m}, `}),`import { transformMockData } from 'vite-plugin-mock-dev-server';
|
|
29
29
|
${i}
|
|
30
30
|
const exporters = [${c}];
|
|
@@ -42,10 +42,10 @@ const mockList = exporters.map((raw) => {
|
|
|
42
42
|
}
|
|
43
43
|
return mockConfig
|
|
44
44
|
});
|
|
45
|
-
export default transformMockData(mockList);`}async function
|
|
46
|
-
`,`file: ${
|
|
47
|
-
`,`file: ${
|
|
48
|
-
`,`file: ${
|
|
49
|
-
`,c)}}async function
|
|
50
|
-
`,r)}}function
|
|
51
|
-
`,O)}},v=(p,l,u,d)=>{p.emit("connection",l,u),l.on("close",()=>{let f=d.findIndex(
|
|
45
|
+
export default transformMockData(mockList);`}async function et(t,o,e){var r;try{let n=await Je({entryPoints:[t],outfile:"out.js",write:!1,target:["node14.18","node16"],platform:"node",bundle:!0,metafile:!0,format:"esm",define:o,plugins:[V(e),z,G,Q]});return{code:n.outputFiles[0].text,deps:((r=n.metafile)==null?void 0:r.inputs)||{}}}catch(n){console.error(n)}return{code:"",deps:{}}}import{Buffer as be}from"buffer";import rt from"cookies";import nt from"http-status";import st from"lodash.sortby";import*as q from"mime-types";import{pathToRegexp as we}from"path-to-regexp";import _ from"picocolors";import ne from"co-body";import tt from"formidable";async function he(t,o){var n;let e=t.method.toUpperCase();if(["GET","DELETE","HEAD"].includes(e))return;let r=((n=t.headers["content-type"])==null?void 0:n.toLocaleLowerCase())||"";try{if(r.startsWith("application/json"))return await ne.json(t);if(r.startsWith("application/x-www-form-urlencoded"))return await ne.form(t);if(r.startsWith("text/plain"))return await ne.text(t);if(r.startsWith("multipart/form-data"))return await ot(t,o)}catch(s){console.error(s)}}async function ot(t,o){let e=tt(o);return new Promise((r,n)=>{e.parse(t,(s,i,c)=>{if(s){n(s);return}r({...i,...c})})})}function ve(t,o){return D(t.headers,o.headers)&&D(t.body,o.body)&&D(t.params,o.params)&&D(t.query,o.query)&&D(t.refererQuery,o.refererQuery)}function D(t,o){if(!o)return!0;for(let e in o)if(!Me(t[e],o[e]))return!1;return!0}function Me(t,o){if(h(t)&&h(o)){let e=new Set;return o.every(r=>t.some((n,s)=>{if(e.has(s))return!1;let i=Me(n,r);return i&&e.add(s),i}))}return K(t)&&K(o)?D(t,o):t===o}var it=/:/g;function Se(t,{formidableOptions:o={},proxies:e,cookiesOptions:r}){return async function(n,s,i){let c=Date.now(),{query:a,pathname:m}=W(n.url);if(!m||e.length===0||!e.some(y=>Y(y,n.url)))return i();let w=t.mockData,v=st(Object.keys(w),y=>{var H;return((H=y.match(it))==null?void 0:H.length)||0}).find(y=>we(y).test(m));if(!v)return i();let{query:F}=W(n.headers.referer||""),E=await he(n,o),p=new rt(n,s,r),l=p.get.bind(p),u=n.method.toUpperCase(),d=ct(w[v],{pathname:m,method:u,request:{query:a,refererQuery:F,body:E,headers:n.headers,getCookie:l}});if(!d)return i();C("middleware: ",u,n.url);let f=n,k=s;f.body=E,f.query=a,f.refererQuery=F,f.params=U(d.url,m),f.getCookie=l,k.setCookie=p.set.bind(p);let{body:g,delay:O,type:P="json",response:I,status:L=200,statusText:$}=d;if(se(k,L,$),await at(f,k,d),await pt(f,k,d),g){try{let y=j(g)?await g(f):g;await xe(c,O),lt(k,y,P)}catch(y){R.error(`${_.red("[body error]")} ${n.url}
|
|
46
|
+
`,`file: ${_.cyan(d.__filepath__)}`,y),se(k,500),s.end("")}return}if(I){try{await xe(c,O),await I(f,k,i)}catch(y){R.error(`${_.red("[response error]")} ${n.url}
|
|
47
|
+
`,`file: ${_.cyan(d.__filepath__)}`,y),se(k,500),s.end("")}return}s.end("")}}function ct(t,{pathname:o,method:e,request:r}){return t.find(n=>{if(!o||!n||!n.url||n.ws===!0||!(n.method?h(n.method)?n.method:[n.method]:["GET","POST"]).includes(e))return!1;let i=we(n.url).test(o);if(i&&n.validator){let c=U(n.url,o);if(j(n.validator))return n.validator({params:c,...r});try{return ve({params:c,...r},n.validator)}catch(a){return R.error(`${_.red("[validator error]")} ${o}
|
|
48
|
+
`,`file: ${_.cyan(n.__filepath__)}`,a),!1}}return i})}function se(t,o=200,e){t.statusCode=o,t.statusMessage=e||ut(o)}async function at(t,o,e){let{headers:r,type:n="json"}=e,s=e.__filepath__,i=q.contentType(n)||q.contentType(q.lookup(n)||"");if(i&&o.setHeader("Content-Type",i),o.setHeader("Cache-Control","no-cache,max-age=0"),o.setHeader("X-Mock-Power-By","vite-plugin-mock-dev-server"),o.setHeader("X-File-Path",s),!!r)try{let c=j(r)?await r(t):r;Object.keys(c).forEach(a=>{o.setHeader(a,c[a])})}catch(c){R.error(`${_.red("[headers error]")} ${t.url}
|
|
49
|
+
`,c)}}async function pt(t,o,{cookies:e}){if(e)try{let r=j(e)?await e(t):e;Object.keys(r).forEach(n=>{let s=r[n];if(h(s)){let[i,c]=s;o.setCookie(n,i,c)}else o.setCookie(n,s)})}catch(r){R.error(`${_.red("[cookies error]")} ${t.url}
|
|
50
|
+
`,r)}}function lt(t,o,e){if(fe(o))o.pipe(t);else if(be.isBuffer(o))t.end(e==="text"||e==="json"?o.toString("utf-8"):o);else{let r=typeof o=="string"?o:JSON.stringify(o);t.end(e==="buffer"?be.from(r):r)}}async function xe(t,o){if(!o||typeof o=="number"&&o<=0||h(o)&&o.length!==2)return;let e=0;if(h(o)){let[r,n]=o;e=Math.floor(Math.random()*(n-r+1))+r}else e=o-(Date.now()-t);e>0&&await ke(e)}function ut(t){return nt[t]||"Unknown"}import ft from"events";import ie from"fs";import{createRequire as kt}from"module";import Pe from"path";import{pathToFileURL as gt}from"url";import je from"chokidar";import{build as yt}from"esbuild";import ht from"fast-glob";import{createFilter as vt,normalizePath as B}from"vite";import mt from"lodash.sortby";function Oe(t){let o=[];for(let[,r]of t.entries())r&&(h(r)?o.push(...r):o.push(r));let e={};return o.filter(r=>(r.enabled||typeof r.enabled>"u")&&r.url).forEach(r=>{let{pathname:n,query:s}=W(r.url),i=e[n]??(e[n]=[]),c={...r,url:n};if(c.ws!==!0){let a=c.validator;re(s)||(j(a)?c.validator=function(m){return D(m.query,s)&&a(m)}:a?(c.validator={...a},c.validator.query=c.validator.query?{...s,...c.validator.query}:s):c.validator={query:s})}i.push(c)}),Object.keys(e).forEach(r=>{e[r]=mt(e[r],n=>{if(n.ws===!0)return 0;let{validator:s}=n;return!s||re(s)?2:j(s)?0:1/Object.keys(s).reduce((c,a)=>c+dt(s[a]),0)})}),e}function dt(t){return t?Object.keys(t).length:0}var Mt=ge(import.meta.url),T=kt(Mt),ee=class extends ft{constructor(e){super();this.options=e;this.moduleCache=new Map;this.moduleDeps=new Map;this.moduleType="cjs";this._mockData={};this.cwd=e.cwd||process.cwd();try{let r=A(this.cwd,["package.json"]);this.moduleType=r&&JSON.parse(r).type==="module"?"esm":"cjs"}catch{}}get mockData(){return this._mockData}load(){let{include:e,exclude:r}=this.options,n=vt(e,r,{resolve:!1});ht(e,{cwd:this.cwd}).then(i=>Promise.all(i.filter(n).map(c=>this.loadMock(c)))).then(()=>this.updateMockList()),this.watchMockEntry(),this.watchDeps();let s=null;this.on("mock:update",async i=>{n(i)&&(await this.loadMock(i),s&&clearImmediate(s),s=setImmediate(()=>{this.updateMockList(),this.emit("mock:update-end",i),s=null}))}),this.on("mock:unlink",async i=>{n(i)&&(this.moduleCache.delete(i),this.updateMockList(),this.emit("mock:update-end",i))})}watchMockEntry(){let{include:e}=this.options,[r,...n]=e,s=je.watch(r,{ignoreInitial:!0,cwd:this.cwd});n.length>0&&n.forEach(i=>s.add(i)),s.on("add",async i=>{i=B(i),this.emit("mock:update",i),C("watcher:add",i)}),s.on("change",async i=>{i=B(i),this.emit("mock:update",i),C("watcher:change",i)}),s.on("unlink",async i=>{i=B(i),this.emit("mock:unlink",i),C("watcher:unlink",i)}),this.mockWatcher=s}watchDeps(){let e=[];this.depsWatcher=je.watch([],{ignoreInitial:!0,cwd:this.cwd}),this.depsWatcher.on("change",r=>{r=B(r);let n=this.moduleDeps.get(r);n&&n.forEach(s=>{this.emit("mock:update",s)})}),this.depsWatcher.on("unlink",r=>{r=B(r),this.moduleDeps.delete(r)}),this.on("update:deps",()=>{let r=[];for(let[s]of this.moduleDeps.entries())r.push(s);let n=r.filter(s=>!e.includes(s));n.length>0&&this.depsWatcher.add(n)})}close(){var e,r;(e=this.mockWatcher)==null||e.close(),(r=this.depsWatcher)==null||r.close()}updateMockList(){this._mockData=Oe(this.moduleCache)}updateModuleDeps(e,r){Object.keys(r).forEach(n=>{r[n].imports.map(i=>i.path).forEach(i=>{this.moduleDeps.has(i)||this.moduleDeps.set(i,new Set),this.moduleDeps.get(i).add(e)})}),this.emit("update:deps")}async loadMock(e){if(!e)return;let r=!1;/\.m[jt]s$/.test(e)?r=!0:/\.c[jt]s$/.test(e)?r=!1:r=this.moduleType==="esm";let{code:n,deps:s}=await this.transformWithEsbuild(e,r);try{let i=await this.loadFromCode(e,n,r)||{},c;i.default?c=i.default:(c=[],Object.keys(i).forEach(a=>{h(i[a])?c.push(...i[a]):c.push(i[a])})),h(c)?c.forEach(a=>a.__filepath__=e):c.__filepath__=e,this.moduleCache.set(e,c),this.updateModuleDeps(e,s)}catch(i){console.error(i)}}async loadFromCode(e,r,n){if(n){let s=`${e}.timestamp-${Date.now()}`,i=`${s}.mjs`,c=`${gt(s)}.mjs`;await ie.promises.writeFile(i,r,"utf8");try{return await import(c)}finally{try{ie.unlinkSync(i)}catch{}}}else{e=Pe.resolve(this.cwd,e);let s=Pe.extname(e),i=ie.realpathSync(e),c=s in T.extensions?s:".js",a=T.extensions[c];T.extensions[c]=(w,v)=>{v===i?w._compile(r,v):a(w,v)},delete T.cache[T.resolve(e)];let m=T(e);return T.extensions[c]=a,m.__esModule?m:{default:m}}}async transformWithEsbuild(e,r){var n;try{let s=await yt({entryPoints:[e],outfile:"out.js",write:!1,target:["node14.18","node16"],platform:"node",bundle:!0,metafile:!0,format:r?"esm":"cjs",define:this.options.define,plugins:[V(this.options.alias),z,Q,G]});return{code:s.outputFiles[0].text,deps:((n=s.metafile)==null?void 0:n.inputs)||{}}}catch(s){console.error(s)}return{code:"",deps:{}}}};import bt from"cookies";import{pathToRegexp as Ce}from"path-to-regexp";import xt from"picocolors";import{WebSocketServer as wt}from"ws";function We(t,o,e,r){var E;let n=new Map,s=new Map,i=new WeakMap,c=p=>{let l=s.get(p);return!l&&s.set(p,l=new Map),l},a=(p,l)=>{let u=p.get(l);return!u&&p.set(l,u=new wt({noServer:!0})),u},m=(p,l)=>{let u=n.get(p);!u&&n.set(p,u=new Set),u.add(l)},w=(p,l,u,d,f,k)=>{var g;try{(g=u.setup)==null||g.call(u,l,d),l.on("close",()=>p.delete(f))}catch(O){R.error(`${xt.red("[websocket server error]")} ${k}
|
|
51
|
+
`,O)}},v=(p,l,u,d)=>{p.emit("connection",l,u),l.on("close",()=>{let f=d.findIndex(k=>k.ws===l);f!==-1&&d.splice(f,1)})},F=(p,l,u,d,f)=>{let{cleanupList:k,connectionList:g,context:O}=i.get(l);Re(k),g.forEach(({ws:P})=>P.removeAllListeners()),l.removeAllListeners(),w(p,l,u,O,d,f),g.forEach(({ws:P,req:I})=>v(l,P,I,g))};(E=t.on)==null||E.call(t,"mock:update-end",p=>{if(!n.has(p))return;let l=n.get(p);if(l)for(let u of l.values())for(let d of t.mockData[u]){if(!d.ws||d.__filepath__!==p)return;let f=c(u);for(let[k,g]of f.entries())F(f,g,d,k,p)}}),o==null||o.on("upgrade",(p,l,u)=>{let{pathname:d,query:f}=W(p.url);if(!d||e.length===0||!e.some(M=>Y(M,p.url)))return;let k=t.mockData,g=Object.keys(k).find(M=>Ce(M).test(d));if(!g)return;let O=k[g].find(M=>M.url&&M.ws&&Ce(M.url).test(d));if(!O)return;let P=O.__filepath__;m(P,g);let I=c(g),L=a(I,d),$=i.get(L);if(!$){let M=[],ae={onCleanup:Ee=>M.push(Ee)};$={cleanupList:M,context:ae,connectionList:[]},i.set(L,$),w(I,L,O,ae,d,P)}let y=p,H=new bt(p,p,r),{query:_e}=W(p.headers.referer||"");y.query=f,y.refererQuery=_e,y.params=U(g,d),y.getCookie=H.get.bind(H),L.handleUpgrade(y,l,u,M=>{C(`websocket-mock: ${p.url} connected`),$.connectionList.push({req:y,ws:M}),v(L,M,y,$.connectionList)})}),o==null||o.on("close",()=>{for(let p of s.values()){for(let l of p.values()){let u=i.get(l);Re(u.cleanupList),l.close()}p.clear()}s.clear(),n.clear()})}function Re(t){let o;for(;o=t.shift();)o==null||o()}async function ce(t,o,e,r){let n=new ee({include:S(o.include),exclude:S(o.exclude),define:J(t),alias:t.resolve.alias});n.load(),n.on("mock:update-end",()=>{o.reload&&(r==null||r.send({type:"full-reload"}))}),e==null||e.on("close",()=>n.close());let{httpProxies:s}=X(t.server.proxy||{}),i=S(o.prefix);return We(n,e,S(o.wsPrefix),o.cookiesOptions),Se(n,{formidableOptions:o.formidableOptions,proxies:[...i,...s],cookiesOptions:o.cookiesOptions})}function De({prefix:t=[],wsPrefix:o=[],include:e=["mock/**/*.mock.{js,ts,cjs,mjs,json,json5}"],exclude:r=["**/node_modules/**","**/.vscode/**","**/.git/**"],reload:n=!1,formidableOptions:s={},build:i=!1,cookiesOptions:c={}}={}){let a={prefix:t,wsPrefix:o,include:e,exclude:r,reload:n,cookiesOptions:c,formidableOptions:{multiples:!0,...s},build:i?Object.assign({serverPort:8080,dist:"mockServer"},typeof i=="object"?i:{}):!1},m=[Ot(a)];return a.build&&m.push(St(a)),m}function St(t){let o={};return{name:"vite-plugin-mock-dev-server-generator",enforce:"post",apply:"build",configResolved(e){o=e,e.logger.warn("")},async buildEnd(e){e||o.command==="build"&&await ye(this,o,t)}}}function Ot(t){let o={};return{name:"vite-plugin-mock-dev-server",enforce:"pre",apply:"serve",config(e){var s;let r=S(t.wsPrefix);if(r.length===0||!((s=e.server)!=null&&s.proxy)||Object.keys(e.server.proxy).length===0)return;let n={};Object.keys(e.server.proxy).forEach(i=>{r.includes(i)||(n[i]=e.server.proxy[i])}),e.server.proxy=n},configResolved(e){o=e,e.logger.warn("")},async configureServer({middlewares:e,config:r,httpServer:n,ws:s}){let i=await ce(r,t,n,s);e.use(i)},async configurePreviewServer({middlewares:e,httpServer:r}){let n=await ce(o,t,r);e.use(n)}}}function ir(t){return t}function cr(t){return e=>(h(e)?e=e.map(r=>t(r)||r):e=t(e)||e,e)}var ur=De;export{Se as baseMiddleware,cr as createDefineMock,ur as default,ir as defineMock,De as mockDevServerPlugin,We as mockWebSocket,Oe as transformMockData};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vite-plugin-mock-dev-server",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.14",
|
|
4
4
|
"keywords": [
|
|
5
5
|
"vite",
|
|
6
6
|
"plugin",
|
|
@@ -18,9 +18,11 @@
|
|
|
18
18
|
"type": "module",
|
|
19
19
|
"exports": {
|
|
20
20
|
".": {
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
21
22
|
"require": "./dist/index.cjs",
|
|
22
23
|
"import": "./dist/index.js"
|
|
23
|
-
}
|
|
24
|
+
},
|
|
25
|
+
"./package.json": "./package.json"
|
|
24
26
|
},
|
|
25
27
|
"main": "dist/index.cjs",
|
|
26
28
|
"module": "dist/index.js",
|
|
@@ -34,11 +36,11 @@
|
|
|
34
36
|
"co-body": "^6.1.0",
|
|
35
37
|
"cookies": "^0.8.0",
|
|
36
38
|
"debug": "^4.3.4",
|
|
37
|
-
"esbuild": "^0.17.
|
|
39
|
+
"esbuild": "^0.17.19",
|
|
38
40
|
"fast-glob": "^3.2.12",
|
|
39
41
|
"formidable": "^2.1.1",
|
|
40
42
|
"http-status": "^1.6.2",
|
|
41
|
-
"is-core-module": "^2.12.
|
|
43
|
+
"is-core-module": "^2.12.1",
|
|
42
44
|
"json5": "^2.2.3",
|
|
43
45
|
"lodash.sortby": "^4.7.0",
|
|
44
46
|
"mime-types": "^2.1.35",
|
|
@@ -47,49 +49,34 @@
|
|
|
47
49
|
"ws": "^8.13.0"
|
|
48
50
|
},
|
|
49
51
|
"devDependencies": {
|
|
50
|
-
"@pengzhanbo/eslint-config": "^0.3.
|
|
51
|
-
"@pengzhanbo/prettier-config": "^0.3.
|
|
52
|
+
"@pengzhanbo/eslint-config": "^0.3.12",
|
|
53
|
+
"@pengzhanbo/prettier-config": "^0.3.12",
|
|
52
54
|
"@types/co-body": "^6.1.0",
|
|
53
55
|
"@types/cookies": "^0.7.7",
|
|
54
56
|
"@types/debug": "^4.1.7",
|
|
55
|
-
"@types/formidable": "^2.0.
|
|
57
|
+
"@types/formidable": "^2.0.6",
|
|
56
58
|
"@types/is-core-module": "^2.2.0",
|
|
57
59
|
"@types/lodash.sortby": "^4.7.7",
|
|
58
60
|
"@types/mime-types": "^2.1.1",
|
|
59
|
-
"@types/node": "^18.16.
|
|
61
|
+
"@types/node": "^18.16.13",
|
|
60
62
|
"@types/ws": "^8.5.4",
|
|
61
63
|
"bumpp": "^9.1.0",
|
|
62
64
|
"conventional-changelog-cli": "^2.2.2",
|
|
63
|
-
"eslint": "^8.
|
|
65
|
+
"eslint": "^8.41.0",
|
|
64
66
|
"mockjs": "^1.1.0",
|
|
65
67
|
"prettier": "^2.8.8",
|
|
66
68
|
"tsup": "^6.7.0",
|
|
67
69
|
"typescript": "^5.0.4",
|
|
68
|
-
"vite": "^4.3.
|
|
69
|
-
"vitepress": "1.0.0-alpha.
|
|
70
|
+
"vite": "^4.3.8",
|
|
71
|
+
"vitepress": "1.0.0-alpha.76"
|
|
70
72
|
},
|
|
71
73
|
"peerDependencies": {
|
|
72
74
|
"vite": ">=3.0.0"
|
|
73
75
|
},
|
|
74
|
-
"packageManager": "pnpm@8.
|
|
76
|
+
"packageManager": "pnpm@8.5.0",
|
|
75
77
|
"engines": {
|
|
76
78
|
"node": "^14.18.0 || >=16"
|
|
77
79
|
},
|
|
78
|
-
"tsup": {
|
|
79
|
-
"entry": [
|
|
80
|
-
"src/index.ts"
|
|
81
|
-
],
|
|
82
|
-
"shims": true,
|
|
83
|
-
"sourcemap": false,
|
|
84
|
-
"dts": true,
|
|
85
|
-
"splitting": false,
|
|
86
|
-
"clean": true,
|
|
87
|
-
"minify": true,
|
|
88
|
-
"format": [
|
|
89
|
-
"esm",
|
|
90
|
-
"cjs"
|
|
91
|
-
]
|
|
92
|
-
},
|
|
93
80
|
"scripts": {
|
|
94
81
|
"build": "tsup",
|
|
95
82
|
"dev": "DEBUG=vite:plugin-mock-dev-server vite example --config ./example/vite.config.ts",
|