vite-plugin-mock-dev-server 1.1.13 → 1.1.15

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 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, unit: ms.
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
- * 设置接口响应延迟, 单位:ms
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 st=Object.create;var J=Object.defineProperty;var it=Object.getOwnPropertyDescriptor;var ct=Object.getOwnPropertyNames;var at=Object.getPrototypeOf,pt=Object.prototype.hasOwnProperty;var lt=(e,o)=>{for(var t in o)J(e,t,{get:o[t],enumerable:!0})},xe=(e,o,t,r)=>{if(o&&typeof o=="object"||typeof o=="function")for(let n of ct(o))!pt.call(e,n)&&n!==t&&J(e,n,{get:()=>o[n],enumerable:!(r=it(o,n))||r.enumerable});return e};var f=(e,o,t)=>(t=e!=null?st(at(e)):{},xe(o||!e||!e.__esModule?J(t,"default",{value:e,enumerable:!0}):t,e)),ut=e=>xe(J({},"__esModule",{value:!0}),e);var $t={};lt($t,{baseMiddleware:()=>me,createDefineMock:()=>It,default:()=>Lt,defineMock:()=>Et,mockDevServerPlugin:()=>Me,mockWebSocket:()=>ve,transformMockData:()=>de});module.exports=ut($t);var mt=()=>typeof document>"u"?new URL("file:"+__filename).href:document.currentScript&&document.currentScript.src||new URL("main.js",document.baseURI).href,h=mt();var Ie=f(require("fs"),1),q=f(require("fs/promises"),1),$=f(require("path"),1),Le=require("esbuild"),$e=f(require("fast-glob"),1),Fe=f(require("is-core-module"),1),te=require("vite");var Se="vite-plugin-mock-dev-server",Oe="1.1.13";var dt=/import\.meta\.env\.(.+)/;function z(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(dt);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 se=f(require("fs/promises"),1),Pe=f(require("path"),1),Re=f(require("json5"),1),G={name:"externalize-deps",setup(e){e.onResolve({filter:/.*/},({path:o})=>{if(o[0]!=="."&&!Pe.default.isAbsolute(o))return{external:!0}})}},Q={name:"json5-loader",setup(e){e.onLoad({filter:/\.json5$/},async({path:o})=>{let t=await se.default.readFile(o,"utf-8");return{contents:`export default ${JSON.stringify(Re.default.parse(t))}`,loader:"js"}})}},V={name:"json-loader",setup(e){e.onLoad({filter:/\.json$/},async({path:o})=>({contents:`export default ${await se.default.readFile(o,"utf-8")}`,loader:"js"}))}},K=e=>({name:"alias-plugin",setup(o){o.onResolve({filter:/.*/},async({path:t})=>{let r=e.find(({find:c})=>ft(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 ft(e,o){return e instanceof RegExp?e.test(o):o.length<e.length?!1:o===e?!0:o.startsWith(`${e}/`)}var X=f(require("fs"),1),Y=f(require("path"),1),je=require("url"),Ce=f(require("debug"),1),We=require("path-to-regexp"),ie=f(require("picocolors"),1),S=e=>Array.isArray(e),j=e=>typeof e=="function",gt=e=>Object.prototype.toString.call(e)==="[object Object]",ce=e=>gt(e)&&Object.keys(e).length===0,kt=e=>e!==null&&typeof e=="object"&&typeof e.pipe=="function",De=e=>kt(e)&&e.readable!==!1&&typeof e._read=="function"&&typeof e._readableState=="object";function _e(e){return new Promise(o=>setTimeout(o,e))}function Ee(e){return Y.default.dirname((0,je.fileURLToPath)(e))}var C=(0,Ce.default)("vite:plugin-mock-dev-server"),w=e=>S(e)?e:e==null?[]:[e],W={info(...e){console.info(ie.default.cyan("mock-dev-server: "),...e)},error(...e){console.error(`
2
- `,ie.default.cyan("mock-dev-server: "),...e,`
3
- `)}};function U(e,o,t){for(let n of o){let s=Y.default.join(e,n);if(X.default.existsSync(s)&&X.default.statSync(s).isFile()){let i=t!=null&&t.pathOnly?s:X.default.readFileSync(s,"utf-8");if(!(t!=null&&t.predicate)||t.predicate(i))return i}}let r=Y.default.dirname(e);if(r!==e&&(!(t!=null&&t.rootDir)||r.startsWith(t==null?void 0:t.rootDir)))return U(r,o,t)}var Z=(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 ee(e,o){return e[0]==="^"&&new RegExp(e).test(o)||o.startsWith(e)}function A(e,o){return((0,We.match)(e,{decode:decodeURIComponent})(o)||{params:{}}).params||{}}async function Te(e,o,t){let r=w(t.include),n=w(t.exclude),s=z(o),{httpProxies:i}=Z(o.server.proxy||{});i.push(...w(t.prefix));let c=w(t.wsPrefix),a={};try{let u=U(o.root,["package.json"]);u&&(a=JSON.parse(u))}catch{}let m=t.build.dist,x=await Mt(process.cwd(),r,n),M=$.default.join(o.root,`mock-data-${Date.now()}.js`);await q.default.writeFile(M,x,"utf-8");let{code:N,deps:_}=await bt(M,s,o.resolve.alias),p=yt(_);await q.default.unlink(M);let l=[{filename:$.default.join(m,"mock-data.js"),source:N},{filename:$.default.join(m,"index.js"),source:ht(i,c,t.cookiesOptions,t.build.serverPort)},{filename:$.default.join(m,"package.json"),source:vt(a,p)}];try{if($.default.isAbsolute(m)){await q.default.rm(m,{recursive:!0}),Ie.default.mkdirSync(m,{recursive:!0});for(let{filename:u,source:d}of l)await q.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=[Se,"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 vt(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":`^${Oe}`,cors:"^2.8.5"},pnpm:{peerDependencyRules:{ignoreMissing:["vite"]}}};return o.forEach(i=>{s.dependencies[i]=n[i]||"latest"}),JSON.stringify(s,null,2)}function ht(e,o,t={},r=8080){return`import { createServer } from 'node:http';
1
+ "use strict";var ct=Object.create;var z=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var pt=Object.getOwnPropertyNames;var lt=Object.getPrototypeOf,ut=Object.prototype.hasOwnProperty;var mt=(e,o)=>{for(var t in o)z(e,t,{get:o[t],enumerable:!0})},Se=(e,o,t,r)=>{if(o&&typeof o=="object"||typeof o=="function")for(let n of pt(o))!ut.call(e,n)&&n!==t&&z(e,n,{get:()=>o[n],enumerable:!(r=at(o,n))||r.enumerable});return e};var f=(e,o,t)=>(t=e!=null?ct(lt(e)):{},Se(o||!e||!e.__esModule?z(t,"default",{value:e,enumerable:!0}):t,e)),dt=e=>Se(z({},"__esModule",{value:!0}),e);var Tt={};mt(Tt,{baseMiddleware:()=>ke,createDefineMock:()=>Lt,default:()=>$t,defineMock:()=>It,mockDevServerPlugin:()=>xe,mockWebSocket:()=>Me,transformMockData:()=>ge});module.exports=dt(Tt);var ft=()=>typeof document>"u"?new URL("file:"+__filename).href:document.currentScript&&document.currentScript.src||new URL("main.js",document.baseURI).href,b=ft();var $e=f(require("fs"),1),q=f(require("fs/promises"),1),F=f(require("path"),1),Te=require("esbuild"),Fe=f(require("fast-glob"),1),Ne=f(require("is-core-module"),1),se=require("vite");var Pe="vite-plugin-mock-dev-server",je="1.1.15";var Z=f(require("picocolors"),1);var G=f(require("fs"),1),Q=f(require("path"),1),Re=require("querystring"),V=require("url"),Ce=f(require("debug"),1),We=require("path-to-regexp"),pe=f(require("picocolors"),1),M=e=>Array.isArray(e),C=e=>typeof e=="function",K=e=>Object.prototype.toString.call(e)==="[object Object]",le=e=>K(e)&&Object.keys(e).length===0,kt=e=>e!==null&&typeof e=="object"&&typeof e.pipe=="function",De=e=>kt(e)&&e.readable!==!1&&typeof e._read=="function"&&typeof e._readableState=="object";function _e(e){return new Promise(o=>setTimeout(o,e))}function Ee(e){return Q.default.dirname((0,V.fileURLToPath)(e))}var W=(0,Ce.default)("vite:plugin-mock-dev-server"),S=e=>M(e)?e:e==null?[]:[e],P={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=Q.default.join(e,n);if(G.default.existsSync(s)&&G.default.statSync(s).isFile()){let i=t!=null&&t.pathOnly?s:G.default.readFileSync(s,"utf-8");if(!(t!=null&&t.predicate)||t.predicate(i))return i}}let r=Q.default.dirname(e);if(r!==e&&(!(t!=null&&t.rootDir)||r.startsWith(t==null?void 0:t.rootDir)))return A(r,o,t)}var X=(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 Y(e,o){return e[0]==="^"&&new RegExp(e).test(o)||o.startsWith(e)}function J(e,o){return((0,We.match)(e,{decode:decodeURIComponent})(o)||{params:{}}).params||{}}function D(e){let o=new V.URL(e,"http://example.com"),t=decodeURIComponent(o.pathname),r=(0,Re.parse)(o.search.replace(/^\?/,""));return{pathname:t,query:r}}var gt=/import\.meta\.env\.(.+)/;function ee(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={},s=[];for(let a in e.define){let u=e.define[a];if(typeof u=="string")try{JSON.parse(u),r[a]=u}catch{s.push(a)}else r[a]=JSON.stringify(u);let v=a.match(gt);v&&r[a]&&(n[v[1]]=`__vite__define__${r[a]}`)}s.length&&P.error(`${Z.default.yellow("[warn]")} The following keys: ${Z.default.yellow(Z.default.underline(s.join(", ")))} declared in 'define' cannot be parsed as regular code snippets.`);let i={},c={};i["import.meta.hot"]="undefined";for(let a in e.env)i[`import.meta.env.${a}`]=JSON.stringify(e.env[a]);return Object.assign(c,{"import.meta.env":JSON.stringify({...e.env,...n}).replace(/"__vite__define__(.+?)"([,}])/g,(a,u,v)=>`${u.replace(/(^\\")|(\\"$)/g,'"')}${v}`)}),{...i,...r,...c,...o}}var ue=f(require("fs/promises"),1),Ie=f(require("path"),1),Le=f(require("json5"),1),te={name:"externalize-deps",setup(e){e.onResolve({filter:/.*/},({path:o})=>{if(o[0]!=="."&&!Ie.default.isAbsolute(o))return{external:!0}})}},oe={name:"json5-loader",setup(e){e.onLoad({filter:/\.json5$/},async({path:o})=>{let t=await ue.default.readFile(o,"utf-8");return{contents:`export default ${JSON.stringify(Le.default.parse(t))}`,loader:"js"}})}},re={name:"json-loader",setup(e){e.onLoad({filter:/\.json$/},async({path:o})=>({contents:`export default ${await ue.default.readFile(o,"utf-8")}`,loader:"js"}))}},ne=e=>({name:"alias-plugin",setup(o){o.onResolve({filter:/.*/},async({path:t})=>{let r=e.find(({find:c})=>yt(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 yt(e,o){return e instanceof RegExp?e.test(o):o.length<e.length?!1:o===e?!0:o.startsWith(`${e}/`)}async function He(e,o,t){let r=S(t.include),n=S(t.exclude),s=ee(o),{httpProxies:i}=X(o.server.proxy||{});i.push(...S(t.prefix));let c=S(t.wsPrefix),a={};try{let m=A(o.root,["package.json"]);m&&(a=JSON.parse(m))}catch{}let u=t.build.dist,v=await bt(process.cwd(),r,n),x=F.default.join(o.root,`mock-data-${Date.now()}.js`);await q.default.writeFile(x,v,"utf-8");let{code:H,deps:I}=await xt(x,s,o.resolve.alias),p=ht(I);await q.default.unlink(x);let l=[{filename:F.default.join(u,"mock-data.js"),source:H},{filename:F.default.join(u,"index.js"),source:Mt(i,c,t.cookiesOptions,t.build.serverPort)},{filename:F.default.join(u,"package.json"),source:vt(a,p)}];try{if(F.default.isAbsolute(u)){await q.default.rm(u,{recursive:!0}),$e.default.mkdirSync(u,{recursive:!0});for(let{filename:m,source:d}of l)await q.default.writeFile(m,d,"utf-8")}else for(let{filename:m,source:d}of l)e.emitFile({type:"asset",fileName:m,source:d})}catch{}}function ht(e){let o=new Set,t=[Pe,"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,Ne.default)(s)&&o.add(s)})}),Array.from(o)}function vt(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":`^${je}`,cors:"^2.8.5"},pnpm:{peerDependencyRules:{ignoreMissing:["vite"]}}};return o.forEach(i=>{s.dependencies[i]=n[i]||"latest"}),JSON.stringify(s,null,2)}function Mt(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,8 +24,8 @@ 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,$e.default)(o,{cwd:e}),n=(0,te.createFilter)(o,t,{resolve:!1}),s=r.filter(n),i="",c="";return s.forEach((a,m)=>{let x=(0,te.normalizePath)($.default.join(e,a));i+=`import * as m${m} from '${x}';
28
- `,c+=`m${m}, `}),`import { transformMockData } from 'vite-plugin-mock-dev-server';
27
+ `}async function bt(e,o,t){let r=await(0,Fe.default)(o,{cwd:e}),n=(0,se.createFilter)(o,t,{resolve:!1}),s=r.filter(n),i="",c="";return s.forEach((a,u)=>{let v=(0,se.normalizePath)(F.default.join(e,a));i+=`import * as m${u} from '${v}';
28
+ `,c+=`m${u}, `}),`import { transformMockData } from 'vite-plugin-mock-dev-server';
29
29
  ${i}
30
30
  const exporters = [${c}];
31
31
  const mockList = exporters.map((raw) => {
@@ -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,Le.build)({entryPoints:[e],outfile:"out.js",write:!1,target:["node14.18","node16"],platform:"node",bundle:!0,metafile:!0,format:"esm",define:o,plugins:[K(t),G,Q,V]});return{code:n.outputFiles[0].text,deps:((r=n.metafile)==null?void 0:r.inputs)||{}}}catch(n){console.error(n)}return{code:"",deps:{}}}var pe=require("buffer"),le=require("url"),qe=f(require("cookies"),1),Be=f(require("http-status"),1),Je=f(require("lodash.sortby"),1),B=f(require("mime-types"),1),ue=require("path-to-regexp"),P=f(require("picocolors"),1);var oe=f(require("co-body"),1),Ne=f(require("formidable"),1);async function He(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 oe.default.json(e);if(r.startsWith("application/x-www-form-urlencoded"))return await oe.default.form(e);if(r.startsWith("text/plain"))return await oe.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,Ne.default)(o);return new Promise((r,n)=>{t.parse(e,(s,i,c)=>{if(s){n(s);return}r({...i,...c})})})}function Ue(e,o){return F(e.headers,o.headers)&&F(e.body,o.body)&&F(e.params,o.params)&&F(e.query,o.query)&&F(e.refererQuery,o.refererQuery)}function F(e,o){if(!o)return!0;for(let t in o)if(o[t]!==e[t])return!1;return!0}var wt=/:/g;function me(e,{formidableOptions:o={},proxies:t,cookiesOptions:r}){return async function(n,s,i){let c=Date.now(),{query:a,pathname:m}=(0,le.parse)(n.url,!0);if(!m||t.length===0||!t.some(v=>ee(v,n.url)))return i();let x=e.mockData,M=(0,Je.default)(Object.keys(x),v=>{var H;return((H=v.match(wt))==null?void 0:H.length)||0}).find(v=>(0,ue.pathToRegexp)(v).test(m));if(!M)return i();let{query:N}=(0,le.parse)(n.headers.referer||"",!0),_=await He(n,o),p=new qe.default(n,s,r),l=p.get.bind(p),u=n.method.toUpperCase(),d=St(x[M],{pathname:m,method:u,request:{query:a,refererQuery:N,body:_,headers:n.headers,getCookie:l}});if(!d)return i();C("middleware: ",u,n.url);let g=n,k=s;g.body=_,g.query=a,g.refererQuery=N,g.params=A(d.url,m),g.getCookie=l,k.setCookie=p.set.bind(p);let{body:y,delay:O,type:R="json",response:E,status:I=200,statusText:L}=d;if(ae(k,I,L),await Ot(g,k,d),await Pt(g,k,d),y){try{let v=j(y)?await y(g):y;await Ae(c,O),Rt(k,v,R)}catch(v){W.error(`${P.default.red("[body error]")} ${n.url}
46
- `,`file: ${P.default.cyan(d.__filepath__)}`,v),ae(k,500),s.end("")}return}if(E){try{await Ae(c,O),await E(g,k,i)}catch(v){W.error(`${P.default.red("[response error]")} ${n.url}
47
- `,`file: ${P.default.cyan(d.__filepath__)}`,v),ae(k,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?S(n.method)?n.method:[n.method]:["GET","POST"]).includes(t))return!1;let i=(0,ue.pathToRegexp)(n.url).test(o);if(i&&n.validator){let c=A(n.url,o);if(j(n.validator))return n.validator({params:c,...r});try{return Ue({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 ae(e,o=200,t){e.statusCode=o,e.statusMessage=t||jt(o)}async function Ot(e,o,t){let{headers:r,type:n="json"}=t,s=t.__filepath__,i=B.contentType(n)||B.contentType(B.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(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=j(t)?await t(e):t;Object.keys(r).forEach(n=>{let s=r[n];if(S(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 Rt(e,o,t){if(De(o))o.pipe(e);else if(pe.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"?pe.Buffer.from(r):r)}}async function Ae(e,o){if(!o||o<=0)return;let t=Date.now()-e,r=o-t;r>0&&await _e(r)}function jt(e){return Be.default[e]||"Unknown"}var Qe=f(require("events"),1),re=f(require("fs"),1),Ve=require("module"),fe=f(require("path"),1),Ke=require("url"),ge=f(require("chokidar"),1),Xe=require("esbuild"),Ye=f(require("fast-glob"),1),D=require("vite");var ze=require("url"),Ge=f(require("lodash.sortby"),1);function de(e){let o=[];for(let[,r]of e.entries())r&&(S(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}=(0,ze.parse)(r.url,!0),i=t[n]??(t[n]=[]),c={...r,url:n};if(c.ws!==!0){let a=c.validator;ce(s)||(j(a)?c.validator=function(m){return F(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,Ge.default)(t[r],n=>{if(n.ws===!0)return 0;let{validator:s}=n;return!s||ce(s)?2:j(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=Ee(h),T=(0,Ve.createRequire)(Wt),ne=class extends Qe.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=U(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,D.createFilter)(t,r,{resolve:!1});(0,Ye.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=ge.default.watch(r,{ignoreInitial:!0,cwd:this.cwd});n.length>0&&n.forEach(i=>s.add(i)),s.on("add",async i=>{i=(0,D.normalizePath)(i),this.emit("mock:update",i),C("watcher:add",i)}),s.on("change",async i=>{i=(0,D.normalizePath)(i),this.emit("mock:update",i),C("watcher:change",i)}),s.on("unlink",async i=>{i=(0,D.normalizePath)(i),this.emit("mock:unlink",i),C("watcher:unlink",i)}),this.mockWatcher=s}watchDeps(){let t=[];this.depsWatcher=ge.default.watch([],{ignoreInitial:!0,cwd:this.cwd}),this.depsWatcher.on("change",r=>{r=(0,D.normalizePath)(r);let n=this.moduleDeps.get(r);n&&n.forEach(s=>{this.emit("mock:update",s)})}),this.depsWatcher.on("unlink",r=>{r=(0,D.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=de(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=>{S(i[a])?c.push(...i[a]):c.push(i[a])})),S(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,Ke.pathToFileURL)(s)}.mjs`;await re.default.promises.writeFile(i,r,"utf8");try{return await import(c)}finally{try{re.default.unlinkSync(i)}catch{}}}else{t=fe.default.resolve(this.cwd,t);let s=fe.default.extname(t),i=re.default.realpathSync(t),c=s in T.extensions?s:".js",a=T.extensions[c];T.extensions[c]=(x,M)=>{M===i?x._compile(r,M):a(x,M)},delete T.cache[T.resolve(t)];let m=T(t);return T.extensions[c]=a,m.__esModule?m:{default:m}}}async transformWithEsbuild(t,r){var n;try{let s=await(0,Xe.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:[K(this.options.alias),G,V,Q]});return{code:s.outputFiles[0].text,deps:((n=s.metafile)==null?void 0:n.inputs)||{}}}catch(s){console.error(s)}return{code:"",deps:{}}}};var ke=require("url"),et=f(require("cookies"),1),ye=require("path-to-regexp"),tt=f(require("picocolors"),1),ot=require("ws");function ve(e,o,t,r){var _;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 ot.WebSocketServer({noServer:!0})),u},m=(p,l)=>{let u=n.get(p);!u&&n.set(p,u=new Set),u.add(l)},x=(p,l,u,d,g,k)=>{var y;try{(y=u.setup)==null||y.call(u,l,d),l.on("close",()=>p.delete(g))}catch(O){W.error(`${tt.default.red("[websocket server error]")} ${k}
51
- `,O)}},M=(p,l,u,d)=>{p.emit("connection",l,u),l.on("close",()=>{let g=d.findIndex(k=>k.ws===l);g!==-1&&d.splice(g,1)})},N=(p,l,u,d,g)=>{let{cleanupList:k,connectionList:y,context:O}=i.get(l);Ze(k),y.forEach(({ws:R})=>R.removeAllListeners()),l.removeAllListeners(),x(p,l,u,O,d,g),y.forEach(({ws:R,req:E})=>M(l,R,E,y))};(_=e.on)==null||_.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 g=c(u);for(let[k,y]of g.entries())N(g,y,d,k,p)}}),o==null||o.on("upgrade",(p,l,u)=>{let{pathname:d,query:g}=(0,ke.parse)(p.url,!0);if(!d||t.length===0||!t.some(b=>ee(b,p.url)))return;let k=e.mockData,y=Object.keys(k).find(b=>(0,ye.pathToRegexp)(b).test(d));if(!y)return;let O=k[y].find(b=>b.url&&b.ws&&(0,ye.pathToRegexp)(b.url).test(d));if(!O)return;let R=O.__filepath__;m(R,y);let E=c(y),I=a(E,d),L=i.get(I);if(!L){let b=[],be={onCleanup:nt=>b.push(nt)};L={cleanupList:b,context:be,connectionList:[]},i.set(I,L),x(E,I,O,be,d,R)}let v=p,H=new et.default(p,p,r),{query:rt}=(0,ke.parse)(p.headers.referer||"",!0);v.query=g,v.refererQuery=rt,v.params=A(y,d),v.getCookie=H.get.bind(H),I.handleUpgrade(v,l,u,b=>{C(`websocket-mock: ${p.url} connected`),L.connectionList.push({req:v,ws:b}),M(I,b,v,L.connectionList)})}),o==null||o.on("close",()=>{for(let p of s.values()){for(let l of p.values()){let u=i.get(l);Ze(u.cleanupList),l.close()}p.clear()}s.clear(),n.clear()})}function Ze(e){let o;for(;o=e.shift();)o==null||o()}async function he(e,o,t,r){let n=new ne({include:w(o.include),exclude:w(o.exclude),define:z(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}=Z(e.server.proxy||{}),i=w(o.prefix);return ve(n,t,w(o.wsPrefix),o.cookiesOptions),me(n,{formidableOptions:o.formidableOptions,proxies:[...i,...s],cookiesOptions:o.cookiesOptions})}function Me({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 Te(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=w(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 he(r,e,n,s);t.use(i)},async configurePreviewServer({middlewares:t,httpServer:r}){let n=await he(o,e,r);t.use(n)}}}function Et(e){return e}function It(e){return t=>(S(t)?t=t.map(r=>e(r)||r):t=e(t)||t,t)}var Lt=Me;0&&(module.exports={baseMiddleware,createDefineMock,defineMock,mockDevServerPlugin,mockWebSocket,transformMockData});
45
+ export default transformMockData(mockList);`}async function xt(e,o,t){var r;try{let n=await(0,Te.build)({entryPoints:[e],outfile:"out.js",write:!1,target:["node14.18","node16"],platform:"node",bundle:!0,metafile:!0,format:"esm",define:o,plugins:[ne(t),te,oe,re]});return{code:n.outputFiles[0].text,deps:((r=n.metafile)==null?void 0:r.inputs)||{}}}catch(n){console.error(n)}return{code:"",deps:{}}}var de=require("buffer"),ze=f(require("cookies"),1),Ge=f(require("http-status"),1),Qe=f(require("lodash.sortby"),1),B=f(require("mime-types"),1),fe=require("path-to-regexp"),j=f(require("picocolors"),1);var ie=f(require("co-body"),1),Ue=f(require("formidable"),1);async function Ae(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 ie.default.json(e);if(r.startsWith("application/x-www-form-urlencoded"))return await ie.default.form(e);if(r.startsWith("text/plain"))return await ie.default.text(e);if(r.startsWith("multipart/form-data"))return await wt(e,o)}catch(s){console.error(s)}}async function wt(e,o){let t=(0,Ue.default)(o);return new Promise((r,n)=>{t.parse(e,(s,i,c)=>{if(s){n(s);return}r({...i,...c})})})}function Je(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(M(e)&&M(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 K(e)&&K(o)?_(e,o):e===o}var St=/:/g;function ke(e,{formidableOptions:o={},proxies:t,cookiesOptions:r}){return async function(n,s,i){let c=Date.now(),{query:a,pathname:u}=D(n.url);if(!u||t.length===0||!t.some(h=>Y(h,n.url)))return i();let v=e.mockData,x=(0,Qe.default)(Object.keys(v),h=>{var U;return((U=h.match(St))==null?void 0:U.length)||0}).find(h=>(0,fe.pathToRegexp)(h).test(u));if(!x)return i();let{query:H}=D(n.headers.referer||""),I=await Ae(n,o),p=new ze.default(n,s,r),l=p.get.bind(p),m=n.method.toUpperCase(),d=Ot(v[x],{pathname:u,method:m,request:{query:a,refererQuery:H,body:I,headers:n.headers,getCookie:l}});if(!d)return i();W("middleware: ",m,n.url);let k=n,g=s;k.body=I,k.query=a,k.refererQuery=H,k.params=J(d.url,u),k.getCookie=l,g.setCookie=p.set.bind(p);let{body:y,delay:O,type:R="json",response:L,status:$=200,statusText:T}=d;if(me(g,$,T),await Pt(k,g,d),await jt(k,g,d),y){try{let h=C(y)?await y(k):y;await Be(c,O),Rt(g,h,R)}catch(h){P.error(`${j.default.red("[body error]")} ${n.url}
46
+ `,`file: ${j.default.cyan(d.__filepath__)}`,h),me(g,500),s.end("")}return}if(L){try{await Be(c,O),await L(k,g,i)}catch(h){P.error(`${j.default.red("[response error]")} ${n.url}
47
+ `,`file: ${j.default.cyan(d.__filepath__)}`,h),me(g,500),s.end("")}return}s.end("")}}function Ot(e,{pathname:o,method:t,request:r}){return e.find(n=>{if(!o||!n||!n.url||n.ws===!0||!(n.method?M(n.method)?n.method:[n.method]:["GET","POST"]).includes(t))return!1;let i=(0,fe.pathToRegexp)(n.url).test(o);if(i&&n.validator){let c=J(n.url,o);if(C(n.validator))return n.validator({params:c,...r});try{return Je({params:c,...r},n.validator)}catch(a){return P.error(`${j.default.red("[validator error]")} ${o}
48
+ `,`file: ${j.default.cyan(n.__filepath__)}`,a),!1}}return i})}function me(e,o=200,t){e.statusCode=o,e.statusMessage=t||Ct(o)}async function Pt(e,o,t){let{headers:r,type:n="json"}=t,s=t.__filepath__,i=B.contentType(n)||B.contentType(B.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=C(r)?await r(e):r;Object.keys(c).forEach(a=>{o.setHeader(a,c[a])})}catch(c){P.error(`${j.default.red("[headers error]")} ${e.url}
49
+ `,c)}}async function jt(e,o,{cookies:t}){if(t)try{let r=C(t)?await t(e):t;Object.keys(r).forEach(n=>{let s=r[n];if(M(s)){let[i,c]=s;o.setCookie(n,i,c)}else o.setCookie(n,s)})}catch(r){P.error(`${j.default.red("[cookies error]")} ${e.url}
50
+ `,r)}}function Rt(e,o,t){if(De(o))o.pipe(e);else if(de.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"?de.Buffer.from(r):r)}}async function Be(e,o){if(!o||typeof o=="number"&&o<=0||M(o)&&o.length!==2)return;let t=0;if(M(o)){let[r,n]=o;t=Math.floor(Math.random()*(n-r+1))+r}else t=o-(Date.now()-e);t>0&&await _e(t)}function Ct(e){return Ge.default[e]||"Unknown"}var Ke=f(require("events"),1),ce=f(require("fs"),1),Xe=require("module"),ye=f(require("path"),1),Ye=require("url"),he=f(require("chokidar"),1),Ze=require("esbuild"),et=f(require("fast-glob"),1),E=require("vite");var Ve=f(require("lodash.sortby"),1);function ge(e){let o=[];for(let[,r]of e.entries())r&&(M(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)||(C(a)?c.validator=function(u){return _(u.query,s)&&a(u)}: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,Ve.default)(t[r],n=>{if(n.ws===!0)return 0;let{validator:s}=n;return!s||le(s)?2:C(s)?0:1/Object.keys(s).reduce((c,a)=>c+Wt(s[a]),0)})}),t}function Wt(e){return e?Object.keys(e).length:0}var Dt=Ee(b),N=(0,Xe.createRequire)(Dt),ae=class extends Ke.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,et.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=he.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),W("watcher:add",i)}),s.on("change",async i=>{i=(0,E.normalizePath)(i),this.emit("mock:update",i),W("watcher:change",i)}),s.on("unlink",async i=>{i=(0,E.normalizePath)(i),this.emit("mock:unlink",i),W("watcher:unlink",i)}),this.mockWatcher=s}watchDeps(){let t=[];this.depsWatcher=he.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=ge(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=>{M(i[a])?c.push(...i[a]):c.push(i[a])})),M(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,Ye.pathToFileURL)(s)}.mjs`;await ce.default.promises.writeFile(i,r,"utf8");try{return await import(c)}finally{try{ce.default.unlinkSync(i)}catch{}}}else{t=ye.default.resolve(this.cwd,t);let s=ye.default.extname(t),i=ce.default.realpathSync(t),c=s in N.extensions?s:".js",a=N.extensions[c];N.extensions[c]=(v,x)=>{x===i?v._compile(r,x):a(v,x)},delete N.cache[N.resolve(t)];let u=N(t);return N.extensions[c]=a,u.__esModule?u:{default:u}}}async transformWithEsbuild(t,r){var n;try{let s=await(0,Ze.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:[ne(this.options.alias),te,re,oe]});return{code:s.outputFiles[0].text,deps:((n=s.metafile)==null?void 0:n.inputs)||{}}}catch(s){console.error(s)}return{code:"",deps:{}}}};var ot=f(require("cookies"),1),ve=require("path-to-regexp"),rt=f(require("picocolors"),1),nt=require("ws");function Me(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 m=p.get(l);return!m&&p.set(l,m=new nt.WebSocketServer({noServer:!0})),m},u=(p,l)=>{let m=n.get(p);!m&&n.set(p,m=new Set),m.add(l)},v=(p,l,m,d,k,g)=>{var y;try{(y=m.setup)==null||y.call(m,l,d),l.on("close",()=>p.delete(k))}catch(O){P.error(`${rt.default.red("[websocket server error]")} ${g}
51
+ `,O)}},x=(p,l,m,d)=>{p.emit("connection",l,m),l.on("close",()=>{let k=d.findIndex(g=>g.ws===l);k!==-1&&d.splice(k,1)})},H=(p,l,m,d,k)=>{let{cleanupList:g,connectionList:y,context:O}=i.get(l);tt(g),y.forEach(({ws:R})=>R.removeAllListeners()),l.removeAllListeners(),v(p,l,m,O,d,k),y.forEach(({ws:R,req:L})=>x(l,R,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 m of l.values())for(let d of e.mockData[m]){if(!d.ws||d.__filepath__!==p)return;let k=c(m);for(let[g,y]of k.entries())H(k,y,d,g,p)}}),o==null||o.on("upgrade",(p,l,m)=>{let{pathname:d,query:k}=D(p.url);if(!d||t.length===0||!t.some(w=>Y(w,p.url)))return;let g=e.mockData,y=Object.keys(g).find(w=>(0,ve.pathToRegexp)(w).test(d));if(!y)return;let O=g[y].find(w=>w.url&&w.ws&&(0,ve.pathToRegexp)(w.url).test(d));if(!O)return;let R=O.__filepath__;u(R,y);let L=c(y),$=a(L,d),T=i.get($);if(!T){let w=[],we={onCleanup:it=>w.push(it)};T={cleanupList:w,context:we,connectionList:[]},i.set($,T),v(L,$,O,we,d,R)}let h=p,U=new ot.default(p,p,r),{query:st}=D(p.headers.referer||"");h.query=k,h.refererQuery=st,h.params=J(y,d),h.getCookie=U.get.bind(U),$.handleUpgrade(h,l,m,w=>{W(`websocket-mock: ${p.url} connected`),T.connectionList.push({req:h,ws:w}),x($,w,h,T.connectionList)})}),o==null||o.on("close",()=>{for(let p of s.values()){for(let l of p.values()){let m=i.get(l);tt(m.cleanupList),l.close()}p.clear()}s.clear(),n.clear()})}function tt(e){let o;for(;o=e.shift();)o==null||o()}async function be(e,o,t,r){let n=new ae({include:S(o.include),exclude:S(o.exclude),define:ee(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}=X(e.server.proxy||{}),i=S(o.prefix);return Me(n,t,S(o.wsPrefix),o.cookiesOptions),ke(n,{formidableOptions:o.formidableOptions,proxies:[...i,...s],cookiesOptions:o.cookiesOptions})}function xe({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},u=[Et(a)];return a.build&&u.push(_t(a)),u}function _t(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 He(this,o,e)}}}function Et(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 be(r,e,n,s);t.use(i)},async configurePreviewServer({middlewares:t,httpServer:r}){let n=await be(o,e,r);t.use(n)}}}function It(e){return e}function Lt(e){return t=>(M(t)?t=t.map(r=>e(r)||r):t=e(t)||t,t)}var $t=xe;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, unit: `ms`
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
- * 配置响应延迟时间, 单位: `ms`
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
  *
@@ -399,8 +402,19 @@ interface MockWebsocketItem extends MockBaseItem {
399
402
  }
400
403
  interface WebSocketSetupContext {
401
404
  /**
405
+ * When defining WSS, you may perform some automatic or looping tasks.
406
+ * However, when hot updating, the plugin will re-execute `setup()`,
407
+ * which may result in duplicate registration of listening events and looping tasks
408
+ * such as setTimeout. You can use `onCleanup()` to clear these automatic or looping tasks.
409
+ *
402
410
  * 当你在定义 WSS 时,可能会执行一些自动任务或循环任务,
403
- * 但是当热更新时,插件内部会重新执行 setup() ,这可能导致出现
411
+ * 但是当热更新时,插件内部会重新执行 setup()
412
+ * 这可能导致出现 重复注册监听事件 和 循环任务如 `setTimeout` 等。
413
+ * 通过 `onCleanup()` 可以来清除这些自动任务或循环任务。
414
+ * @example
415
+ * ``` ts
416
+ * onCleanup(() => clearTimeout(timeId))
417
+ * ```
404
418
  */
405
419
  onCleanup: (cleanup: () => void) => void;
406
420
  }
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import Ue from"fs";import X from"fs/promises";import T from"path";import{build as qe}from"esbuild";import Be from"fast-glob";import Je from"is-core-module";import{createFilter as ze,normalizePath as Ge}from"vite";var ae="vite-plugin-mock-dev-server",pe="1.1.13";var Ee=/import\.meta\.env\.(.+)/;function B(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(Ee);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 le from"fs/promises";import Ie from"path";import Le from"json5";var J={name:"externalize-deps",setup(t){t.onResolve({filter:/.*/},({path:o})=>{if(o[0]!=="."&&!Ie.isAbsolute(o))return{external:!0}})}},z={name:"json5-loader",setup(t){t.onLoad({filter:/\.json5$/},async({path:o})=>{let e=await le.readFile(o,"utf-8");return{contents:`export default ${JSON.stringify(Le.parse(e))}`,loader:"js"}})}},G={name:"json-loader",setup(t){t.onLoad({filter:/\.json$/},async({path:o})=>({contents:`export default ${await le.readFile(o,"utf-8")}`,loader:"js"}))}},Q=t=>({name:"alias-plugin",setup(o){o.onResolve({filter:/.*/},async({path:e})=>{let r=t.find(({find:c})=>$e(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 $e(t,o){return t instanceof RegExp?t.test(o):o.length<t.length?!1:o===t?!0:o.startsWith(`${t}/`)}import Z from"fs";import ee from"path";import{fileURLToPath as Fe}from"url";import Te from"debug";import{match as Ne}from"path-to-regexp";import ue from"picocolors";var S=t=>Array.isArray(t),j=t=>typeof t=="function",He=t=>Object.prototype.toString.call(t)==="[object Object]",te=t=>He(t)&&Object.keys(t).length===0,Ae=t=>t!==null&&typeof t=="object"&&typeof t.pipe=="function",me=t=>Ae(t)&&t.readable!==!1&&typeof t._read=="function"&&typeof t._readableState=="object";function de(t){return new Promise(o=>setTimeout(o,t))}function fe(t){return ee.dirname(Fe(t))}var C=Te("vite:plugin-mock-dev-server"),w=t=>S(t)?t:t==null?[]:[t],R={info(...t){console.info(ue.cyan("mock-dev-server: "),...t)},error(...t){console.error(`
2
- `,ue.cyan("mock-dev-server: "),...t,`
3
- `)}};function H(t,o,e){for(let n of o){let s=ee.join(t,n);if(Z.existsSync(s)&&Z.statSync(s).isFile()){let i=e!=null&&e.pathOnly?s:Z.readFileSync(s,"utf-8");if(!(e!=null&&e.predicate)||e.predicate(i))return i}}let r=ee.dirname(t);if(r!==t&&(!(e!=null&&e.rootDir)||r.startsWith(e==null?void 0:e.rootDir)))return H(r,o,e)}var V=(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 K(t,o){return t[0]==="^"&&new RegExp(t).test(o)||o.startsWith(t)}function A(t,o){return(Ne(t,{decode:decodeURIComponent})(o)||{params:{}}).params||{}}async function ge(t,o,e){let r=w(e.include),n=w(e.exclude),s=B(o),{httpProxies:i}=V(o.server.proxy||{});i.push(...w(e.prefix));let c=w(e.wsPrefix),a={};try{let u=H(o.root,["package.json"]);u&&(a=JSON.parse(u))}catch{}let m=e.build.dist,x=await Xe(process.cwd(),r,n),v=T.join(o.root,`mock-data-${Date.now()}.js`);await X.writeFile(v,x,"utf-8");let{code:F,deps:D}=await Ye(v,s,o.resolve.alias),p=Qe(D);await X.unlink(v);let l=[{filename:T.join(m,"mock-data.js"),source:F},{filename:T.join(m,"index.js"),source:Ke(i,c,e.cookiesOptions,e.build.serverPort)},{filename:T.join(m,"package.json"),source:Ve(a,p)}];try{if(T.isAbsolute(m)){await X.rm(m,{recursive:!0}),Ue.mkdirSync(m,{recursive:!0});for(let{filename:u,source:d}of l)await X.writeFile(u,d,"utf-8")}else for(let{filename:u,source:d}of l)t.emitFile({type:"asset",fileName:u,source:d})}catch{}}function Qe(t){let o=new Set,e=[ae,"connect","cors"];return Object.keys(t).forEach(r=>{t[r].imports.filter(s=>s.external).map(s=>s.path).forEach(s=>{!e.includes(s)&&!Je(s)&&o.add(s)})}),Array.from(o)}function Ve(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":`^${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 Ke(t,o,e={},r=8080){return`import { createServer } from 'node:http';
1
+ import Be from"fs";import Z from"fs/promises";import N from"path";import{build as ze}from"esbuild";import Ge from"fast-glob";import Qe from"is-core-module";import{createFilter as Ve,normalizePath as Ke}from"vite";var ue="vite-plugin-mock-dev-server",me="1.1.15";import ne from"picocolors";import te from"fs";import oe from"path";import{parse as Le}from"querystring";import{URL as $e,fileURLToPath as Te}from"url";import Fe from"debug";import{match as Ne}from"path-to-regexp";import de from"picocolors";var v=t=>Array.isArray(t),C=t=>typeof t=="function",B=t=>Object.prototype.toString.call(t)==="[object Object]",re=t=>B(t)&&Object.keys(t).length===0,He=t=>t!==null&&typeof t=="object"&&typeof t.pipe=="function",fe=t=>He(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(Te(t))}var R=Fe("vite:plugin-mock-dev-server"),S=t=>v(t)?t:t==null?[]:[t],P={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 z=(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 G(t,o){return t[0]==="^"&&new RegExp(t).test(o)||o.startsWith(t)}function U(t,o){return(Ne(t,{decode:decodeURIComponent})(o)||{params:{}}).params||{}}function W(t){let o=new $e(t,"http://example.com"),e=decodeURIComponent(o.pathname),r=Le(o.search.replace(/^\?/,""));return{pathname:e,query:r}}var Ae=/import\.meta\.env\.(.+)/;function Q(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={},s=[];for(let a in t.define){let u=t.define[a];if(typeof u=="string")try{JSON.parse(u),r[a]=u}catch{s.push(a)}else r[a]=JSON.stringify(u);let h=a.match(Ae);h&&r[a]&&(n[h[1]]=`__vite__define__${r[a]}`)}s.length&&P.error(`${ne.yellow("[warn]")} The following keys: ${ne.yellow(ne.underline(s.join(", ")))} declared in 'define' cannot be parsed as regular code snippets.`);let i={},c={};i["import.meta.hot"]="undefined";for(let a in t.env)i[`import.meta.env.${a}`]=JSON.stringify(t.env[a]);return Object.assign(c,{"import.meta.env":JSON.stringify({...t.env,...n}).replace(/"__vite__define__(.+?)"([,}])/g,(a,u,h)=>`${u.replace(/(^\\")|(\\"$)/g,'"')}${h}`)}),{...i,...r,...c,...o}}import ye from"fs/promises";import Ue from"path";import Je from"json5";var V={name:"externalize-deps",setup(t){t.onResolve({filter:/.*/},({path:o})=>{if(o[0]!=="."&&!Ue.isAbsolute(o))return{external:!0}})}},K={name:"json5-loader",setup(t){t.onLoad({filter:/\.json5$/},async({path:o})=>{let e=await ye.readFile(o,"utf-8");return{contents:`export default ${JSON.stringify(Je.parse(e))}`,loader:"js"}})}},X={name:"json-loader",setup(t){t.onLoad({filter:/\.json$/},async({path:o})=>({contents:`export default ${await ye.readFile(o,"utf-8")}`,loader:"js"}))}},Y=t=>({name:"alias-plugin",setup(o){o.onResolve({filter:/.*/},async({path:e})=>{let r=t.find(({find:c})=>qe(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 qe(t,o){return t instanceof RegExp?t.test(o):o.length<t.length?!1:o===t?!0:o.startsWith(`${t}/`)}async function he(t,o,e){let r=S(e.include),n=S(e.exclude),s=Q(o),{httpProxies:i}=z(o.server.proxy||{});i.push(...S(e.prefix));let c=S(e.wsPrefix),a={};try{let m=A(o.root,["package.json"]);m&&(a=JSON.parse(m))}catch{}let u=e.build.dist,h=await et(process.cwd(),r,n),M=N.join(o.root,`mock-data-${Date.now()}.js`);await Z.writeFile(M,h,"utf-8");let{code:F,deps:_}=await tt(M,s,o.resolve.alias),p=Xe(_);await Z.unlink(M);let l=[{filename:N.join(u,"mock-data.js"),source:F},{filename:N.join(u,"index.js"),source:Ze(i,c,e.cookiesOptions,e.build.serverPort)},{filename:N.join(u,"package.json"),source:Ye(a,p)}];try{if(N.isAbsolute(u)){await Z.rm(u,{recursive:!0}),Be.mkdirSync(u,{recursive:!0});for(let{filename:m,source:d}of l)await Z.writeFile(m,d,"utf-8")}else for(let{filename:m,source:d}of l)t.emitFile({type:"asset",fileName:m,source:d})}catch{}}function Xe(t){let o=new Set,e=[ue,"connect","cors"];return Object.keys(t).forEach(r=>{t[r].imports.filter(s=>s.external).map(s=>s.path).forEach(s=>{!e.includes(s)&&!Qe(s)&&o.add(s)})}),Array.from(o)}function Ye(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":`^${me}`,cors:"^2.8.5"},pnpm:{peerDependencyRules:{ignoreMissing:["vite"]}}};return o.forEach(i=>{s.dependencies[i]=n[i]||"latest"}),JSON.stringify(s,null,2)}function Ze(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,8 +24,8 @@ app.use(baseMiddleware({ mockData }, {
24
24
  server.listen(${r});
25
25
 
26
26
  console.log('listen: http://localhost:${r}');
27
- `}async function Xe(t,o,e){let r=await Be(o,{cwd:t}),n=ze(o,e,{resolve:!1}),s=r.filter(n),i="",c="";return s.forEach((a,m)=>{let x=Ge(T.join(t,a));i+=`import * as m${m} from '${x}';
28
- `,c+=`m${m}, `}),`import { transformMockData } from 'vite-plugin-mock-dev-server';
27
+ `}async function et(t,o,e){let r=await Ge(o,{cwd:t}),n=Ve(o,e,{resolve:!1}),s=r.filter(n),i="",c="";return s.forEach((a,u)=>{let h=Ke(N.join(t,a));i+=`import * as m${u} from '${h}';
28
+ `,c+=`m${u}, `}),`import { transformMockData } from 'vite-plugin-mock-dev-server';
29
29
  ${i}
30
30
  const exporters = [${c}];
31
31
  const mockList = exporters.map((raw) => {
@@ -42,10 +42,10 @@ const mockList = exporters.map((raw) => {
42
42
  }
43
43
  return mockConfig
44
44
  });
45
- export default transformMockData(mockList);`}async function Ye(t,o,e){var r;try{let n=await qe({entryPoints:[t],outfile:"out.js",write:!1,target:["node14.18","node16"],platform:"node",bundle:!0,metafile:!0,format:"esm",define:o,plugins:[Q(e),J,z,G]});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 ve}from"buffer";import{parse as he}from"url";import tt from"cookies";import ot from"http-status";import rt from"lodash.sortby";import*as U from"mime-types";import{pathToRegexp as be}from"path-to-regexp";import W from"picocolors";import oe from"co-body";import Ze from"formidable";async function ke(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 oe.json(t);if(r.startsWith("application/x-www-form-urlencoded"))return await oe.form(t);if(r.startsWith("text/plain"))return await oe.text(t);if(r.startsWith("multipart/form-data"))return await et(t,o)}catch(s){console.error(s)}}async function et(t,o){let e=Ze(o);return new Promise((r,n)=>{e.parse(t,(s,i,c)=>{if(s){n(s);return}r({...i,...c})})})}function ye(t,o){return L(t.headers,o.headers)&&L(t.body,o.body)&&L(t.params,o.params)&&L(t.query,o.query)&&L(t.refererQuery,o.refererQuery)}function L(t,o){if(!o)return!0;for(let e in o)if(o[e]!==t[e])return!1;return!0}var nt=/:/g;function xe(t,{formidableOptions:o={},proxies:e,cookiesOptions:r}){return async function(n,s,i){let c=Date.now(),{query:a,pathname:m}=he(n.url,!0);if(!m||e.length===0||!e.some(y=>K(y,n.url)))return i();let x=t.mockData,v=rt(Object.keys(x),y=>{var N;return((N=y.match(nt))==null?void 0:N.length)||0}).find(y=>be(y).test(m));if(!v)return i();let{query:F}=he(n.headers.referer||"",!0),D=await ke(n,o),p=new tt(n,s,r),l=p.get.bind(p),u=n.method.toUpperCase(),d=st(x[v],{pathname:m,method:u,request:{query:a,refererQuery:F,body:D,headers:n.headers,getCookie:l}});if(!d)return i();C("middleware: ",u,n.url);let f=n,g=s;f.body=D,f.query=a,f.refererQuery=F,f.params=A(d.url,m),f.getCookie=l,g.setCookie=p.set.bind(p);let{body:k,delay:O,type:P="json",response:_,status:E=200,statusText:I}=d;if(re(g,E,I),await it(f,g,d),await ct(f,g,d),k){try{let y=j(k)?await k(f):k;await Me(c,O),at(g,y,P)}catch(y){R.error(`${W.red("[body error]")} ${n.url}
46
- `,`file: ${W.cyan(d.__filepath__)}`,y),re(g,500),s.end("")}return}if(_){try{await Me(c,O),await _(f,g,i)}catch(y){R.error(`${W.red("[response error]")} ${n.url}
47
- `,`file: ${W.cyan(d.__filepath__)}`,y),re(g,500),s.end("")}return}s.end("")}}function st(t,{pathname:o,method:e,request:r}){return t.find(n=>{if(!o||!n||!n.url||n.ws===!0||!(n.method?S(n.method)?n.method:[n.method]:["GET","POST"]).includes(e))return!1;let i=be(n.url).test(o);if(i&&n.validator){let c=A(n.url,o);if(j(n.validator))return n.validator({params:c,...r});try{return ye({params:c,...r},n.validator)}catch(a){return R.error(`${W.red("[validator error]")} ${o}
48
- `,`file: ${W.cyan(n.__filepath__)}`,a),!1}}return i})}function re(t,o=200,e){t.statusCode=o,t.statusMessage=e||pt(o)}async function it(t,o,e){let{headers:r,type:n="json"}=e,s=e.__filepath__,i=U.contentType(n)||U.contentType(U.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(`${W.red("[headers error]")} ${t.url}
49
- `,c)}}async function ct(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(S(s)){let[i,c]=s;o.setCookie(n,i,c)}else o.setCookie(n,s)})}catch(r){R.error(`${W.red("[cookies error]")} ${t.url}
50
- `,r)}}function at(t,o,e){if(me(o))o.pipe(t);else if(ve.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"?ve.from(r):r)}}async function Me(t,o){if(!o||o<=0)return;let e=Date.now()-t,r=o-e;r>0&&await de(r)}function pt(t){return ot[t]||"Unknown"}import dt from"events";import ne from"fs";import{createRequire as ft}from"module";import Se from"path";import{pathToFileURL as gt}from"url";import Oe from"chokidar";import{build as kt}from"esbuild";import yt from"fast-glob";import{createFilter as vt,normalizePath as q}from"vite";import{parse as lt}from"url";import ut from"lodash.sortby";function we(t){let o=[];for(let[,r]of t.entries())r&&(S(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}=lt(r.url,!0),i=e[n]??(e[n]=[]),c={...r,url:n};if(c.ws!==!0){let a=c.validator;te(s)||(j(a)?c.validator=function(m){return L(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]=ut(e[r],n=>{if(n.ws===!0)return 0;let{validator:s}=n;return!s||te(s)?2:j(s)?0:1/Object.keys(s).reduce((c,a)=>c+mt(s[a]),0)})}),e}function mt(t){return t?Object.keys(t).length:0}var ht=fe(import.meta.url),$=ft(ht),Y=class extends dt{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=H(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});yt(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=Oe.watch(r,{ignoreInitial:!0,cwd:this.cwd});n.length>0&&n.forEach(i=>s.add(i)),s.on("add",async i=>{i=q(i),this.emit("mock:update",i),C("watcher:add",i)}),s.on("change",async i=>{i=q(i),this.emit("mock:update",i),C("watcher:change",i)}),s.on("unlink",async i=>{i=q(i),this.emit("mock:unlink",i),C("watcher:unlink",i)}),this.mockWatcher=s}watchDeps(){let e=[];this.depsWatcher=Oe.watch([],{ignoreInitial:!0,cwd:this.cwd}),this.depsWatcher.on("change",r=>{r=q(r);let n=this.moduleDeps.get(r);n&&n.forEach(s=>{this.emit("mock:update",s)})}),this.depsWatcher.on("unlink",r=>{r=q(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=we(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=>{S(i[a])?c.push(...i[a]):c.push(i[a])})),S(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 ne.promises.writeFile(i,r,"utf8");try{return await import(c)}finally{try{ne.unlinkSync(i)}catch{}}}else{e=Se.resolve(this.cwd,e);let s=Se.extname(e),i=ne.realpathSync(e),c=s in $.extensions?s:".js",a=$.extensions[c];$.extensions[c]=(x,v)=>{v===i?x._compile(r,v):a(x,v)},delete $.cache[$.resolve(e)];let m=$(e);return $.extensions[c]=a,m.__esModule?m:{default:m}}}async transformWithEsbuild(e,r){var n;try{let s=await kt({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:[Q(this.options.alias),J,G,z]});return{code:s.outputFiles[0].text,deps:((n=s.metafile)==null?void 0:n.inputs)||{}}}catch(s){console.error(s)}return{code:"",deps:{}}}};import{parse as Pe}from"url";import Mt from"cookies";import{pathToRegexp as je}from"path-to-regexp";import bt from"picocolors";import{WebSocketServer as xt}from"ws";function Re(t,o,e,r){var D;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 xt({noServer:!0})),u},m=(p,l)=>{let u=n.get(p);!u&&n.set(p,u=new Set),u.add(l)},x=(p,l,u,d,f,g)=>{var k;try{(k=u.setup)==null||k.call(u,l,d),l.on("close",()=>p.delete(f))}catch(O){R.error(`${bt.red("[websocket server error]")} ${g}
51
- `,O)}},v=(p,l,u,d)=>{p.emit("connection",l,u),l.on("close",()=>{let f=d.findIndex(g=>g.ws===l);f!==-1&&d.splice(f,1)})},F=(p,l,u,d,f)=>{let{cleanupList:g,connectionList:k,context:O}=i.get(l);Ce(g),k.forEach(({ws:P})=>P.removeAllListeners()),l.removeAllListeners(),x(p,l,u,O,d,f),k.forEach(({ws:P,req:_})=>v(l,P,_,k))};(D=t.on)==null||D.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[g,k]of f.entries())F(f,k,d,g,p)}}),o==null||o.on("upgrade",(p,l,u)=>{let{pathname:d,query:f}=Pe(p.url,!0);if(!d||e.length===0||!e.some(h=>K(h,p.url)))return;let g=t.mockData,k=Object.keys(g).find(h=>je(h).test(d));if(!k)return;let O=g[k].find(h=>h.url&&h.ws&&je(h.url).test(d));if(!O)return;let P=O.__filepath__;m(P,k);let _=c(k),E=a(_,d),I=i.get(E);if(!I){let h=[],ie={onCleanup:_e=>h.push(_e)};I={cleanupList:h,context:ie,connectionList:[]},i.set(E,I),x(_,E,O,ie,d,P)}let y=p,N=new Mt(p,p,r),{query:De}=Pe(p.headers.referer||"",!0);y.query=f,y.refererQuery=De,y.params=A(k,d),y.getCookie=N.get.bind(N),E.handleUpgrade(y,l,u,h=>{C(`websocket-mock: ${p.url} connected`),I.connectionList.push({req:y,ws:h}),v(E,h,y,I.connectionList)})}),o==null||o.on("close",()=>{for(let p of s.values()){for(let l of p.values()){let u=i.get(l);Ce(u.cleanupList),l.close()}p.clear()}s.clear(),n.clear()})}function Ce(t){let o;for(;o=t.shift();)o==null||o()}async function se(t,o,e,r){let n=new Y({include:w(o.include),exclude:w(o.exclude),define:B(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}=V(t.server.proxy||{}),i=w(o.prefix);return Re(n,e,w(o.wsPrefix),o.cookiesOptions),xe(n,{formidableOptions:o.formidableOptions,proxies:[...i,...s],cookiesOptions:o.cookiesOptions})}function We({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=[St(a)];return a.build&&m.push(wt(a)),m}function wt(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 ge(this,o,t)}}}function St(t){let o={};return{name:"vite-plugin-mock-dev-server",enforce:"pre",apply:"serve",config(e){var s;let r=w(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 se(r,t,n,s);e.use(i)},async configurePreviewServer({middlewares:e,httpServer:r}){let n=await se(o,t,r);e.use(n)}}}function ir(t){return t}function cr(t){return e=>(S(e)?e=e.map(r=>t(r)||r):e=t(e)||e,e)}var ur=We;export{xe as baseMiddleware,cr as createDefineMock,ur as default,ir as defineMock,We as mockDevServerPlugin,Re as mockWebSocket,we as transformMockData};
45
+ export default transformMockData(mockList);`}async function tt(t,o,e){var r;try{let n=await ze({entryPoints:[t],outfile:"out.js",write:!1,target:["node14.18","node16"],platform:"node",bundle:!0,metafile:!0,format:"esm",define:o,plugins:[Y(e),V,K,X]});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 xe}from"buffer";import nt from"cookies";import st from"http-status";import it from"lodash.sortby";import*as J from"mime-types";import{pathToRegexp as Se}from"path-to-regexp";import E from"picocolors";import se from"co-body";import ot from"formidable";async function ve(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 se.json(t);if(r.startsWith("application/x-www-form-urlencoded"))return await se.form(t);if(r.startsWith("text/plain"))return await se.text(t);if(r.startsWith("multipart/form-data"))return await rt(t,o)}catch(s){console.error(s)}}async function rt(t,o){let e=ot(o);return new Promise((r,n)=>{e.parse(t,(s,i,c)=>{if(s){n(s);return}r({...i,...c})})})}function Me(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(!be(t[e],o[e]))return!1;return!0}function be(t,o){if(v(t)&&v(o)){let e=new Set;return o.every(r=>t.some((n,s)=>{if(e.has(s))return!1;let i=be(n,r);return i&&e.add(s),i}))}return B(t)&&B(o)?D(t,o):t===o}var ct=/:/g;function Oe(t,{formidableOptions:o={},proxies:e,cookiesOptions:r}){return async function(n,s,i){let c=Date.now(),{query:a,pathname:u}=W(n.url);if(!u||e.length===0||!e.some(y=>G(y,n.url)))return i();let h=t.mockData,M=it(Object.keys(h),y=>{var H;return((H=y.match(ct))==null?void 0:H.length)||0}).find(y=>Se(y).test(u));if(!M)return i();let{query:F}=W(n.headers.referer||""),_=await ve(n,o),p=new nt(n,s,r),l=p.get.bind(p),m=n.method.toUpperCase(),d=at(h[M],{pathname:u,method:m,request:{query:a,refererQuery:F,body:_,headers:n.headers,getCookie:l}});if(!d)return i();R("middleware: ",m,n.url);let f=n,k=s;f.body=_,f.query=a,f.refererQuery=F,f.params=U(d.url,u),f.getCookie=l,k.setCookie=p.set.bind(p);let{body:g,delay:O,type:j="json",response:I,status:L=200,statusText:$}=d;if(ie(k,L,$),await pt(f,k,d),await lt(f,k,d),g){try{let y=C(g)?await g(f):g;await we(c,O),ut(k,y,j)}catch(y){P.error(`${E.red("[body error]")} ${n.url}
46
+ `,`file: ${E.cyan(d.__filepath__)}`,y),ie(k,500),s.end("")}return}if(I){try{await we(c,O),await I(f,k,i)}catch(y){P.error(`${E.red("[response error]")} ${n.url}
47
+ `,`file: ${E.cyan(d.__filepath__)}`,y),ie(k,500),s.end("")}return}s.end("")}}function at(t,{pathname:o,method:e,request:r}){return t.find(n=>{if(!o||!n||!n.url||n.ws===!0||!(n.method?v(n.method)?n.method:[n.method]:["GET","POST"]).includes(e))return!1;let i=Se(n.url).test(o);if(i&&n.validator){let c=U(n.url,o);if(C(n.validator))return n.validator({params:c,...r});try{return Me({params:c,...r},n.validator)}catch(a){return P.error(`${E.red("[validator error]")} ${o}
48
+ `,`file: ${E.cyan(n.__filepath__)}`,a),!1}}return i})}function ie(t,o=200,e){t.statusCode=o,t.statusMessage=e||mt(o)}async function pt(t,o,e){let{headers:r,type:n="json"}=e,s=e.__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=C(r)?await r(t):r;Object.keys(c).forEach(a=>{o.setHeader(a,c[a])})}catch(c){P.error(`${E.red("[headers error]")} ${t.url}
49
+ `,c)}}async function lt(t,o,{cookies:e}){if(e)try{let r=C(e)?await e(t):e;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){P.error(`${E.red("[cookies error]")} ${t.url}
50
+ `,r)}}function ut(t,o,e){if(fe(o))o.pipe(t);else if(xe.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"?xe.from(r):r)}}async function we(t,o){if(!o||typeof o=="number"&&o<=0||v(o)&&o.length!==2)return;let e=0;if(v(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 mt(t){return st[t]||"Unknown"}import kt from"events";import ce from"fs";import{createRequire as gt}from"module";import je from"path";import{pathToFileURL as yt}from"url";import Ce from"chokidar";import{build as ht}from"esbuild";import vt from"fast-glob";import{createFilter as Mt,normalizePath as q}from"vite";import dt from"lodash.sortby";function Pe(t){let o=[];for(let[,r]of t.entries())r&&(v(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)||(C(a)?c.validator=function(u){return D(u.query,s)&&a(u)}: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]=dt(e[r],n=>{if(n.ws===!0)return 0;let{validator:s}=n;return!s||re(s)?2:C(s)?0:1/Object.keys(s).reduce((c,a)=>c+ft(s[a]),0)})}),e}function ft(t){return t?Object.keys(t).length:0}var bt=ge(import.meta.url),T=gt(bt),ee=class extends kt{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=Mt(e,r,{resolve:!1});vt(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=Ce.watch(r,{ignoreInitial:!0,cwd:this.cwd});n.length>0&&n.forEach(i=>s.add(i)),s.on("add",async i=>{i=q(i),this.emit("mock:update",i),R("watcher:add",i)}),s.on("change",async i=>{i=q(i),this.emit("mock:update",i),R("watcher:change",i)}),s.on("unlink",async i=>{i=q(i),this.emit("mock:unlink",i),R("watcher:unlink",i)}),this.mockWatcher=s}watchDeps(){let e=[];this.depsWatcher=Ce.watch([],{ignoreInitial:!0,cwd:this.cwd}),this.depsWatcher.on("change",r=>{r=q(r);let n=this.moduleDeps.get(r);n&&n.forEach(s=>{this.emit("mock:update",s)})}),this.depsWatcher.on("unlink",r=>{r=q(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=Pe(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=>{v(i[a])?c.push(...i[a]):c.push(i[a])})),v(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=`${yt(s)}.mjs`;await ce.promises.writeFile(i,r,"utf8");try{return await import(c)}finally{try{ce.unlinkSync(i)}catch{}}}else{e=je.resolve(this.cwd,e);let s=je.extname(e),i=ce.realpathSync(e),c=s in T.extensions?s:".js",a=T.extensions[c];T.extensions[c]=(h,M)=>{M===i?h._compile(r,M):a(h,M)},delete T.cache[T.resolve(e)];let u=T(e);return T.extensions[c]=a,u.__esModule?u:{default:u}}}async transformWithEsbuild(e,r){var n;try{let s=await ht({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:[Y(this.options.alias),V,X,K]});return{code:s.outputFiles[0].text,deps:((n=s.metafile)==null?void 0:n.inputs)||{}}}catch(s){console.error(s)}return{code:"",deps:{}}}};import xt from"cookies";import{pathToRegexp as Re}from"path-to-regexp";import wt from"picocolors";import{WebSocketServer as St}from"ws";function De(t,o,e,r){var _;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 m=p.get(l);return!m&&p.set(l,m=new St({noServer:!0})),m},u=(p,l)=>{let m=n.get(p);!m&&n.set(p,m=new Set),m.add(l)},h=(p,l,m,d,f,k)=>{var g;try{(g=m.setup)==null||g.call(m,l,d),l.on("close",()=>p.delete(f))}catch(O){P.error(`${wt.red("[websocket server error]")} ${k}
51
+ `,O)}},M=(p,l,m,d)=>{p.emit("connection",l,m),l.on("close",()=>{let f=d.findIndex(k=>k.ws===l);f!==-1&&d.splice(f,1)})},F=(p,l,m,d,f)=>{let{cleanupList:k,connectionList:g,context:O}=i.get(l);We(k),g.forEach(({ws:j})=>j.removeAllListeners()),l.removeAllListeners(),h(p,l,m,O,d,f),g.forEach(({ws:j,req:I})=>M(l,j,I,g))};(_=t.on)==null||_.call(t,"mock:update-end",p=>{if(!n.has(p))return;let l=n.get(p);if(l)for(let m of l.values())for(let d of t.mockData[m]){if(!d.ws||d.__filepath__!==p)return;let f=c(m);for(let[k,g]of f.entries())F(f,g,d,k,p)}}),o==null||o.on("upgrade",(p,l,m)=>{let{pathname:d,query:f}=W(p.url);if(!d||e.length===0||!e.some(b=>G(b,p.url)))return;let k=t.mockData,g=Object.keys(k).find(b=>Re(b).test(d));if(!g)return;let O=k[g].find(b=>b.url&&b.ws&&Re(b.url).test(d));if(!O)return;let j=O.__filepath__;u(j,g);let I=c(g),L=a(I,d),$=i.get(L);if(!$){let b=[],pe={onCleanup:Ie=>b.push(Ie)};$={cleanupList:b,context:pe,connectionList:[]},i.set(L,$),h(I,L,O,pe,d,j)}let y=p,H=new xt(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,m,b=>{R(`websocket-mock: ${p.url} connected`),$.connectionList.push({req:y,ws:b}),M(L,b,y,$.connectionList)})}),o==null||o.on("close",()=>{for(let p of s.values()){for(let l of p.values()){let m=i.get(l);We(m.cleanupList),l.close()}p.clear()}s.clear(),n.clear()})}function We(t){let o;for(;o=t.shift();)o==null||o()}async function ae(t,o,e,r){let n=new ee({include:S(o.include),exclude:S(o.exclude),define:Q(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}=z(t.server.proxy||{}),i=S(o.prefix);return De(n,e,S(o.wsPrefix),o.cookiesOptions),Oe(n,{formidableOptions:o.formidableOptions,proxies:[...i,...s],cookiesOptions:o.cookiesOptions})}function Ee({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},u=[Pt(a)];return a.build&&u.push(Ot(a)),u}function Ot(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 he(this,o,t)}}}function Pt(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 ae(r,t,n,s);e.use(i)},async configurePreviewServer({middlewares:e,httpServer:r}){let n=await ae(o,t,r);e.use(n)}}}function pr(t){return t}function lr(t){return e=>(v(e)?e=e.map(r=>t(r)||r):e=t(e)||e,e)}var fr=Ee;export{Oe as baseMiddleware,lr as createDefineMock,fr as default,pr as defineMock,Ee as mockDevServerPlugin,De as mockWebSocket,Pe as transformMockData};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vite-plugin-mock-dev-server",
3
- "version": "1.1.13",
3
+ "version": "1.1.15",
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.18",
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.0",
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.11",
51
- "@pengzhanbo/prettier-config": "^0.3.11",
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.5",
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.5",
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.40.0",
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.5",
69
- "vitepress": "1.0.0-alpha.75"
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.3.1",
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",