vite-plugin-mock-dev-server 1.1.8 → 1.1.10

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
@@ -26,22 +26,22 @@
26
26
 
27
27
  ## Feature
28
28
 
29
- - ⚡️ light weight,flexible,fast.
29
+ - ⚡️ Lightweight, Flexible, Fast.
30
30
  - 🧲 Not injection-based, non-intrusive to client code.
31
31
  - 💡 ESModule/commonjs.
32
32
  - 🦾 Typescript.
33
33
  - 🔥 HMR
34
34
  - 🏷 Support `json` / `json5`.
35
35
  - 📦 Auto import mock file.
36
- - 🎨 Support any liblike `mockjs`,or not use it.
36
+ - 🎨 Support any lib, like `mockjs`, or do not use it.
37
37
  - 📥 Path rule matching, request parameter matching.
38
- - ⚙️ Support Enabled/Disabled any one of api mock
38
+ - ⚙️ Support Enabled/Disabled any one of the API mock.
39
39
  - 📀 Supports response body content type such as `text/json/buffer/stream`.
40
40
  - ⚖️ Use `server.proxy`
41
- - 🍕 Support `viteConfig.define` in mock file.
42
- - ⚓️ Support `viteConfig.resolve.alias` in mock file.
41
+ - 🍕 Support `viteConfig.define` in the mock file.
42
+ - ⚓️ Support `viteConfig.resolve.alias` in the mock file.
43
43
  - 🌈 Support `vite preview` mode.
44
- - 📤 Support `multipart` content-typemock upload file.
44
+ - 📤 Support `multipart` content-type, mock upload file.
45
45
  - 📥 Support mock download file.
46
46
  - ⚜️ Support `WebSocket Mock`
47
47
  - 🗂 Support building small independent deployable mock services.
@@ -53,10 +53,6 @@ See the [documentation](https://vite-plugin-mock-dev-server.netlify.app/) to lea
53
53
 
54
54
  [![Netlify Status](https://api.netlify.com/api/v1/badges/9ccda610-2c6a-4cd0-aeaa-a8932f2b477c/deploy-status)](https://app.netlify.com/sites/vite-plugin-mock-dev-server/deploys)
55
55
 
56
- ## Playground
57
-
58
- [![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/pengzhanbo/vite-plugin-mock-dev-server/tree/main/playground)
59
-
60
56
  ## Usage
61
57
 
62
58
  ### Install
@@ -121,7 +117,7 @@ export default defineMock({
121
117
 
122
118
  ### mockDevServerPlugin(options)
123
119
 
124
- vite plugin
120
+ Vite plugin
125
121
 
126
122
 
127
123
  `vite.config.ts`
@@ -143,7 +139,7 @@ export default defineConfig({
143
139
 
144
140
  **Type:** `string | string[]`
145
141
 
146
- Configure custom matching rules for mock server. Any request path starting with the value of `prefix` will be proxied to the corresponding target. If the `prefix` value starts with ^, it will be recognized as a RegExp.
142
+ Configure custom matching rules for the mock server. Any request path starting with the value of `prefix` will be proxied to the corresponding target. If the `prefix` value starts with ^, it will be recognized as a RegExp.
147
143
 
148
144
  > In general, `server.proxy` is sufficient to meet the needs. Adding this item is for compatibility with certain scenarios.
149
145
 
@@ -153,7 +149,7 @@ export default defineConfig({
153
149
 
154
150
  **类型:** `string | string[]`
155
151
 
156
- Configure the matching rules for WebSocket service. Any request path starting with the value of `wsPrefix` and using the `ws/wss` protocol will be proxied to the corresponding target.
152
+ Configure the matching rules for the WebSocket service. Any request path starting with the value of `wsPrefix` and using the `ws/wss` protocol will be proxied to the corresponding target.
157
153
 
158
154
  If the value of `wsPrefix` starts with `^`, it will be recognized as a RegExp.
159
155
 
@@ -173,7 +169,7 @@ export default defineConfig({
173
169
 
174
170
  **Type:** `string | string[]`
175
171
 
176
- When reading mock files for configuration, the files that need to be excluded can be a directory, glob, or an array.
172
+ When reading mock files for configuration, the files that need to be excluded can be a directory, glob, or array.
177
173
 
178
174
  **Default:** `['**/node_modules/**','**/.vscode/**','**/.git/**']`
179
175
 
@@ -188,7 +184,7 @@ export default defineConfig({
188
184
 
189
185
  - `options.formidableOptions`
190
186
 
191
- Configure to `formidable`,see [formidable options](https://github.com/node-formidable/formidable#options)
187
+ Configure to `formidable`, see [formidable options](https://github.com/node-formidable/formidable#options)
192
188
 
193
189
  **Default:** `{}`
194
190
 
@@ -208,8 +204,8 @@ export default defineConfig({
208
204
  **Default:** `{}`
209
205
 
210
206
  - `options.build`
211
-
212
- Configuration needed to build a small, independently deployable mock service.
207
+
208
+ The configuration needed to build a small, independently deployable mock service.
213
209
 
214
210
  **Type:** `boolean | ServerBuildOptions`
215
211
 
@@ -248,7 +244,7 @@ export default defineMock({
248
244
  Return a custom defineMock function to support preprocessing of mock config.
249
245
 
250
246
  ```ts
251
- import path from 'path'
247
+ import path from 'node:path'
252
248
  import { createDefineMock } from 'vite-plugin-mock-dev-server'
253
249
 
254
250
  // Preprocessed mock url
@@ -288,7 +284,7 @@ export default defineMock({
288
284
  *
289
285
  * @default true
290
286
  */
291
- enable: true,
287
+ enabled: true,
292
288
  /**
293
289
  * Set interface response delay, unit: ms.
294
290
  * @default 0
@@ -444,7 +440,7 @@ type Request = Connect.IncomingMessage & {
444
440
 
445
441
  **In Response:**
446
442
 
447
- The original type of `response` is `http.ServerResponse<http.IncomingMessage>`. The plugin adds `setCookie(name, value)` method for configuration cookie on this basis.
443
+ The original type of `response` is `http.ServerResponse<http.IncomingMessage>`. The plugin adds `setCookie(name, value)` method for configuration cookies on this basis.
448
444
 
449
445
  ```ts
450
446
  type Response = http.ServerResponse<http.IncomingMessage> & {
@@ -469,14 +465,14 @@ type Response = http.ServerResponse<http.IncomingMessage> & {
469
465
 
470
466
  See more examples: [example](/example/)
471
467
 
472
- **exp:** Match `/api/test`,And returns a response body content with empty data
468
+ **exp:** Match `/api/test`, And returns a response body content with empty data
473
469
  ```ts
474
470
  export default defineMock({
475
471
  url: '/api/test',
476
472
  })
477
473
  ```
478
474
 
479
- **exp:** Match `/api/test` And returns a static content data
475
+ **exp:** Match `/api/test` , And returns a static content data
480
476
  ```ts
481
477
  export default defineMock({
482
478
  url: '/api/test',
@@ -514,7 +510,7 @@ export default defineMock({
514
510
  ```
515
511
 
516
512
 
517
- **exp:** Define multiple mock requests for the same url and match valid rules with validators
513
+ **exp:** Define multiple mock requests for the same URL and match valid rules with validators
518
514
  ```ts
519
515
  export default defineMock([
520
516
  // Match /api/test?a=1
@@ -573,8 +569,10 @@ export default defineMock({
573
569
 
574
570
  The `userId` in the route will be resolved into the `request.params` object.
575
571
 
576
- **exp:** Use buffer to respond data
572
+ **exp**:** Use the buffer to respond data
577
573
  ```ts
574
+ import { Buffer } from 'node:buffer'
575
+
578
576
  // Since the default value of type is json,
579
577
  // although buffer is used for body during transmission,
580
578
  // the content-type is still json.
@@ -596,9 +594,10 @@ export default defineMock({
596
594
 
597
595
  **exp:** Response file type
598
596
 
599
- Simulate file download, pass in the file reading stream.
597
+ Simulate file download, and pass in the file reading stream.
600
598
  ```ts
601
599
  import { createReadStream } from 'node:fs'
600
+
602
601
  export default defineMock({
603
602
  url: '/api/download',
604
603
  // When you are unsure of the type, you can pass in the file name for internal parsing by the plugin.
@@ -613,6 +612,7 @@ export default defineMock({
613
612
  **exp:** Use `mockjs`:
614
613
  ```ts
615
614
  import Mock from 'mockjs'
615
+
616
616
  export default defineMock({
617
617
  url: '/api/test',
618
618
  body: Mock.mock({
@@ -622,7 +622,7 @@ export default defineMock({
622
622
  })
623
623
  })
624
624
  ```
625
- You need installed `mockjs`
625
+ You need install `mockjs`
626
626
 
627
627
 
628
628
  **exp:** Use `response` to customize the response
@@ -657,9 +657,9 @@ export default defineMock({
657
657
 
658
658
 
659
659
 
660
- **exp:** multipart, upload file.
660
+ **exp:** multipart, upload files.
661
661
 
662
- use [`formidable`](https://www.npmjs.com/package/formidable#readme) to supported.
662
+ use [`formidable`](https://www.npmjs.com/package/formidable#readme) to support.
663
663
  ``` html
664
664
  <form action="/api/upload" method="post" enctype="multipart/form-data">
665
665
  <p>
@@ -694,6 +694,7 @@ export default defineMock({
694
694
  **exp:** Graphql
695
695
  ```ts
696
696
  import { buildSchema, graphql } from 'graphql'
697
+
697
698
  const schema = buildSchema(`
698
699
  type Query {
699
700
  hello: String
@@ -763,9 +764,9 @@ ws.addEventListener('message', (raw) => {
763
764
 
764
765
  ## Mock Services
765
766
 
766
- In some scenarios, it may be necessary to use the data provided by mock services for display purposes, but the project may have already been packaged, built and deployed without support from `vite` and this plugin's mock service. Since this plugin supports importing various `node` modules in mock files at the design stage, the mock file cannot be inline into client build code.
767
+ In some scenarios, it may be necessary to use the data provided by mock services for display purposes, but the project may have already been packaged, built and deployed without support from `Vite` and this plugin's mock service. Since this plugin supports importing various `node` modules in mock files at the design stage, the mock file cannot be inline into client build code.
767
768
 
768
- To meet such scenarios, on one hand, the plugin provides support under `vite preview`, and on the other hand, it also builds a small independent mock service application that can be deployed to relevant environments during `vite build`. This can then be forwarded through other HTTP servers like nginx to actual ports for mock support.
769
+ To meet such scenarios, on one hand, the plugin provides support under `vite preview`, and on the other hand, it also builds a small independent mock service application that can be deployed to relevant environments during `vite build`. This can then be forwarded through other HTTP servers like Nginx to actual ports for mock support.
769
770
 
770
771
  The default output is built into the directory `dist/mockServer`, generating files as follows:
771
772
  ```sh
package/README.zh-CN.md CHANGED
@@ -54,9 +54,6 @@
54
54
 
55
55
  [![Netlify Status](https://api.netlify.com/api/v1/badges/9ccda610-2c6a-4cd0-aeaa-a8932f2b477c/deploy-status)](https://app.netlify.com/sites/vite-plugin-mock-dev-server/deploys)
56
56
 
57
- ## Playground
58
-
59
- [![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/pengzhanbo/vite-plugin-mock-dev-server/tree/main/playground)
60
57
  ## 使用
61
58
 
62
59
  ### 安装
@@ -242,7 +239,7 @@ export default defineMock({
242
239
  返回一个自定义的 defineMock 函数,用于支持对 mock config 的预处理。
243
240
 
244
241
  ```ts
245
- import path from 'path'
242
+ import path from 'node:path'
246
243
  import { createDefineMock } from 'vite-plugin-mock-dev-server'
247
244
 
248
245
  // 预处理 mock url
@@ -280,7 +277,7 @@ export default defineMock({
280
277
  * 对当前不需要mock的接口,可设置为 false
281
278
  * @default true
282
279
  */
283
- enable: true,
280
+ enabled: true,
284
281
  /**
285
282
  * 设置接口响应延迟, 单位:ms
286
283
  * @default 0
@@ -567,6 +564,8 @@ export default defineMock({
567
564
 
568
565
  **exp:** 使用 buffer 响应数据
569
566
  ```ts
567
+ import { Buffer } from 'node:buffer'
568
+
570
569
  // 由于 type 默认值是 json,虽然在传输过程中body使用buffer,
571
570
  // 但是 content-type 还是为 json
572
571
  export default defineMock({
@@ -590,6 +589,7 @@ export default defineMock({
590
589
  模拟文件下载,传入文件读取流
591
590
  ```ts
592
591
  import { createReadStream } from 'node:fs'
592
+
593
593
  export default defineMock({
594
594
  url: '/api/download',
595
595
  // 当你不确定类型,可传入文件名由插件内部进行解析
@@ -604,6 +604,7 @@ export default defineMock({
604
604
  **exp:** 使用 `mockjs` 生成响应数据:
605
605
  ```ts
606
606
  import Mock from 'mockjs'
607
+
607
608
  export default defineMock({
608
609
  url: '/api/test',
609
610
  body: Mock.mock({
@@ -684,6 +685,7 @@ export default defineMock({
684
685
  **exp:** Graphql
685
686
  ```ts
686
687
  import { buildSchema, graphql } from 'graphql'
688
+
687
689
  const schema = buildSchema(`
688
690
  type Query {
689
691
  hello: String
package/dist/index.cjs CHANGED
@@ -1,7 +1,7 @@
1
- "use strict";var rt=Object.create;var B=Object.defineProperty;var nt=Object.getOwnPropertyDescriptor;var st=Object.getOwnPropertyNames;var it=Object.getPrototypeOf,ct=Object.prototype.hasOwnProperty;var at=(e,o)=>{for(var t in o)B(e,t,{get:o[t],enumerable:!0})},Me=(e,o,t,r)=>{if(o&&typeof o=="object"||typeof o=="function")for(let n of st(o))!ct.call(e,n)&&n!==t&&B(e,n,{get:()=>o[n],enumerable:!(r=nt(o,n))||r.enumerable});return e};var f=(e,o,t)=>(t=e!=null?rt(it(e)):{},Me(o||!e||!e.__esModule?B(t,"default",{value:e,enumerable:!0}):t,e)),pt=e=>Me(B({},"__esModule",{value:!0}),e);var Et={};at(Et,{baseMiddleware:()=>pe,createDefineMock:()=>Wt,default:()=>Dt,defineMock:()=>Ct,mockDevServerPlugin:()=>ye,mockWebSocket:()=>ke,transformMockData:()=>ue});module.exports=pt(Et);var ut=()=>typeof document>"u"?new URL("file:"+__filename).href:document.currentScript&&document.currentScript.src||new URL("main.js",document.baseURI).href,b=ut();var Le=f(require("fs"),1),q=f(require("fs/promises"),1),T=f(require("path"),1),Ie=require("esbuild"),_e=f(require("fast-glob"),1),Te=f(require("is-core-module"),1),Z=require("vite");var xe="vite-plugin-mock-dev-server",we="1.1.8";var re=f(require("fs/promises"),1),Se=f(require("path"),1),Oe=f(require("json5"),1),J={name:"externalize-deps",setup(e){e.onResolve({filter:/.*/},({path:o})=>{if(o[0]!=="."&&!Se.default.isAbsolute(o))return{external:!0}})}},z={name:"json5-loader",setup(e){e.onLoad({filter:/\.json5$/},async({path:o})=>{let t=await re.default.readFile(o,"utf-8");return{contents:`export default ${JSON.stringify(Oe.default.parse(t))}`,loader:"js"}})}},G={name:"json-loader",setup(e){e.onLoad({filter:/\.json$/},async({path:o})=>({contents:`export default ${await re.default.readFile(o,"utf-8")}`,loader:"js"}))}},Q=e=>({name:"alias-plugin",setup(o){o.onResolve({filter:/.*/},async({path:t})=>{let r=e.find(({find:c})=>lt(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 lt(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),K=f(require("path"),1),Pe=require("url"),je=f(require("debug"),1),Re=require("path-to-regexp"),ne=f(require("picocolors"),1),S=e=>Array.isArray(e),j=e=>typeof e=="function",dt=e=>Object.prototype.toString.call(e)==="[object Object]",Ce=e=>dt(e)&&Object.keys(e).length===0,mt=e=>e!==null&&typeof e=="object"&&typeof e.pipe=="function",We=e=>mt(e)&&e.readable!==!1&&typeof e._read=="function"&&typeof e._readableState=="object";function De(e){return new Promise(o=>setTimeout(o,e))}function Ee(e){return K.default.dirname((0,Pe.fileURLToPath)(e))}var R=(0,je.default)("vite:plugin-mock-dev-server"),O=e=>S(e)?e:e==null?[]:[e],C={info(...e){console.info(ne.default.cyan("mock-dev-server: "),...e)},error(...e){console.error(`
2
- `,ne.default.cyan("mock-dev-server: "),...e,`
3
- `)}};function U(e,o,t){for(let n of o){let s=K.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=K.default.dirname(e);if(r!==e&&(!(t!=null&&t.rootDir)||r.startsWith(t==null?void 0:t.rootDir)))return U(r,o,t)}var V=(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 N(e,o){return((0,Re.match)(e,{decode:decodeURIComponent})(o)||{params:{}}).params||{}}async function $e(e,o,t){let r=O(t.include),n=O(t.exclude),s={};if(o.define)for(let p in o.define){let l=o.define[p];s[p]=typeof l=="string"?l:JSON.stringify(l)}let{httpProxies:i}=V(o.server.proxy||{});i.push(...O(t.prefix));let c=O(t.wsPrefix),d={};try{let p=U(o.root,["package.json"]);p&&(d=JSON.parse(p))}catch{}let m=t.build.dist,M=await yt(process.cwd(),r,n),h=T.default.join(o.root,`mock-data-${Date.now()}.js`);await q.default.writeFile(h,M,"utf-8");let{code:H,deps:D}=await ht(h,s,o.resolve.alias),a=ft(D);await q.default.unlink(h);let u=[{filename:T.default.join(m,"mock-data.js"),source:H},{filename:T.default.join(m,"index.js"),source:gt(i,c,t.cookiesOptions,t.build.serverPort)},{filename:T.default.join(m,"package.json"),source:kt(d,a)}];try{if(T.default.isAbsolute(m)){await q.default.rm(m,{recursive:!0}),Le.default.mkdirSync(m,{recursive:!0});for(let{filename:p,source:l}of u)await q.default.writeFile(p,l,"utf-8")}else for(let{filename:p,source:l}of u)e.emitFile({type:"asset",fileName:p,source:l})}catch{}}function ft(e){let o=new Set,t=[xe,"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,Te.default)(s)&&o.add(s)})}),Array.from(o)}function kt(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":`^${we}`,cors:"^2.8.5"},pnpm:{peerDependencyRules:{ignoreMissing:["vite"]}}};return o.forEach(i=>{s.dependencies[i]=n[i]||"latest"}),JSON.stringify(s,null,2)}function gt(e,o,t={},r=8080){return`import { createServer } from 'node:http';
4
- import connect from 'connect';
1
+ "use strict";var nt=Object.create;var J=Object.defineProperty;var st=Object.getOwnPropertyDescriptor;var it=Object.getOwnPropertyNames;var ct=Object.getPrototypeOf,at=Object.prototype.hasOwnProperty;var pt=(e,o)=>{for(var t in o)J(e,t,{get:o[t],enumerable:!0})},Me=(e,o,t,r)=>{if(o&&typeof o=="object"||typeof o=="function")for(let n of it(o))!at.call(e,n)&&n!==t&&J(e,n,{get:()=>o[n],enumerable:!(r=st(o,n))||r.enumerable});return e};var f=(e,o,t)=>(t=e!=null?nt(ct(e)):{},Me(o||!e||!e.__esModule?J(t,"default",{value:e,enumerable:!0}):t,e)),ut=e=>Me(J({},"__esModule",{value:!0}),e);var Lt={};pt(Lt,{baseMiddleware:()=>ue,createDefineMock:()=>Et,default:()=>It,defineMock:()=>Dt,mockDevServerPlugin:()=>he,mockWebSocket:()=>ge,transformMockData:()=>le});module.exports=ut(Lt);var lt=()=>typeof document>"u"?new URL("file:"+__filename).href:document.currentScript&&document.currentScript.src||new URL("main.js",document.baseURI).href,b=lt();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),$e=f(require("is-core-module"),1),ee=require("vite");var xe="vite-plugin-mock-dev-server",we="1.1.10";var ne=f(require("fs/promises"),1),Se=f(require("path"),1),Oe=f(require("json5"),1),z={name:"externalize-deps",setup(e){e.onResolve({filter:/.*/},({path:o})=>{if(o[0]!=="."&&!Se.default.isAbsolute(o))return{external:!0}})}},G={name:"json5-loader",setup(e){e.onLoad({filter:/\.json5$/},async({path:o})=>{let t=await ne.default.readFile(o,"utf-8");return{contents:`export default ${JSON.stringify(Oe.default.parse(t))}`,loader:"js"}})}},Q={name:"json-loader",setup(e){e.onLoad({filter:/\.json$/},async({path:o})=>({contents:`export default ${await ne.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})=>mt(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 mt(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),K=f(require("path"),1),Ce=require("url"),Pe=f(require("debug"),1),je=require("path-to-regexp"),se=f(require("picocolors"),1),w=e=>Array.isArray(e),j=e=>typeof e=="function",dt=e=>Object.prototype.toString.call(e)==="[object Object]",Re=e=>dt(e)&&Object.keys(e).length===0,ft=e=>e!==null&&typeof e=="object"&&typeof e.pipe=="function",We=e=>ft(e)&&e.readable!==!1&&typeof e._read=="function"&&typeof e._readableState=="object";function De(e){return new Promise(o=>setTimeout(o,e))}function Ee(e){return K.default.dirname((0,Ce.fileURLToPath)(e))}var R=(0,Pe.default)("vite:plugin-mock-dev-server"),O=e=>w(e)?e:e==null?[]:[e],W={info(...e){console.info(se.default.cyan("mock-dev-server: "),...e)},error(...e){console.error(`
2
+ `,se.default.cyan("mock-dev-server: "),...e,`
3
+ `)}};function A(e,o,t){for(let n of o){let s=K.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=K.default.dirname(e);if(r!==e&&(!(t!=null&&t.rootDir)||r.startsWith(t==null?void 0:t.rootDir)))return A(r,o,t)}var V=(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 Z(e,o){return e[0]==="^"&&new RegExp(e).test(o)||o.startsWith(e)}function N(e,o){return((0,je.match)(e,{decode:decodeURIComponent})(o)||{params:{}}).params||{}}async function Fe(e,o,t){let r=O(t.include),n=O(t.exclude),s={};if(o.define)for(let p in o.define){let m=o.define[p];s[p]=typeof m=="string"?m:JSON.stringify(m)}let{httpProxies:i}=V(o.server.proxy||{});i.push(...O(t.prefix));let c=O(t.wsPrefix),l={};try{let p=A(o.root,["package.json"]);p&&(l=JSON.parse(p))}catch{}let d=t.build.dist,M=await ht(process.cwd(),r,n),v=$.default.join(o.root,`mock-data-${Date.now()}.js`);await q.default.writeFile(v,M,"utf-8");let{code:H,deps:E}=await vt(v,s,o.resolve.alias),a=kt(E);await q.default.unlink(v);let u=[{filename:$.default.join(d,"mock-data.js"),source:H},{filename:$.default.join(d,"index.js"),source:yt(i,c,t.cookiesOptions,t.build.serverPort)},{filename:$.default.join(d,"package.json"),source:gt(l,a)}];try{if($.default.isAbsolute(d)){await q.default.rm(d,{recursive:!0}),Ie.default.mkdirSync(d,{recursive:!0});for(let{filename:p,source:m}of u)await q.default.writeFile(p,m,"utf-8")}else for(let{filename:p,source:m}of u)e.emitFile({type:"asset",fileName:p,source:m})}catch{}}function kt(e){let o=new Set,t=[xe,"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,$e.default)(s)&&o.add(s)})}),Array.from(o)}function gt(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":`^${we}`,cors:"^2.8.5"},pnpm:{peerDependencyRules:{ignoreMissing:["vite"]}}};return o.forEach(i=>{s.dependencies[i]=n[i]||"latest"}),JSON.stringify(s,null,2)}function yt(e,o,t={},r=8080){return`import { createServer } from 'node:http';
4
+ import connect from 'connect';
5
5
  import corsMiddleware from 'cors';
6
6
  import { baseMiddleware, mockWebSocket } from 'vite-plugin-mock-dev-server';
7
7
  import mockData from './mock-data.js';
@@ -24,19 +24,28 @@ app.use(baseMiddleware({ mockData }, {
24
24
  server.listen(${r});
25
25
 
26
26
  console.log('listen: http://localhost:${r}');
27
- `}async function yt(e,o,t){let r=await(0,_e.default)(o,{cwd:e}),n=(0,Z.createFilter)(o,t,{resolve:!1}),s=r.filter(n),i="",c="";return s.forEach((d,m)=>{let M=(0,Z.normalizePath)(T.default.join(e,d));i+=`import * as m${m} from '${M}';
28
- `,c+=`m${m}, `}),`import { transformMockData } from 'vite-plugin-mock-dev-server';
27
+ `}async function ht(e,o,t){let r=await(0,_e.default)(o,{cwd:e}),n=(0,ee.createFilter)(o,t,{resolve:!1}),s=r.filter(n),i="",c="";return s.forEach((l,d)=>{let M=(0,ee.normalizePath)($.default.join(e,l));i+=`import * as m${d} from '${M}';
28
+ `,c+=`m${d}, `}),`import { transformMockData } from 'vite-plugin-mock-dev-server';
29
29
  ${i}
30
30
  const exporters = [${c}];
31
- const mockList = exporters.map((raw) => raw && raw.default
32
- ? raw.default
33
- : Object.keys(raw || {}).map((key) => raw[key])
34
- )
35
- export default transformMockData(mockList);
36
- `}async function ht(e,o,t){var r;try{let n=await(0,Ie.build)({entryPoints:[e],outfile:"out.js",write:!1,target:["node14.18","node16"],platform:"node",bundle:!0,metafile:!0,format:"esm",define:o,plugins:[Q(t),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:{}}}var ie=require("buffer"),ce=require("url"),qe=f(require("cookies"),1),Ae=f(require("http-status"),1),A=f(require("mime-types"),1),ae=require("path-to-regexp"),P=f(require("picocolors"),1);var ee=f(require("co-body"),1),Fe=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 ee.default.json(e);if(r.startsWith("application/x-www-form-urlencoded"))return await ee.default.form(e);if(r.startsWith("text/plain"))return await ee.default.text(e);if(r.startsWith("multipart/form-data"))return await vt(e,o)}catch(s){console.error(s)}}async function vt(e,o){let t=(0,Fe.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 $(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(o[t]!==e[t])return!1;return!0}function pe(e,{formidableOptions:o={},proxies:t,cookiesOptions:r}){return async function(n,s,i){let c=Date.now(),{query:d,pathname:m}=(0,ce.parse)(n.url,!0);if(!m||t.length===0||!t.some(v=>Y(v,n.url)))return i();let M=e.mockData,h=Object.keys(M).find(v=>(0,ae.pathToRegexp)(v).test(m));if(!h)return i();let{query:H}=(0,ce.parse)(n.headers.referer||"",!0),D=await He(n,o),a=new qe.default(n,s,r),u=a.get.bind(a),p=n.method.toUpperCase(),l=Mt(M[h],{pathname:m,method:p,request:{query:d,refererQuery:H,body:D,headers:n.headers,getCookie:u}});if(!l)return i();R("middleware: ",p,n.url);let k=n,g=s;k.body=D,k.query=d,k.refererQuery=H,k.params=N(l.url,m),k.getCookie=u,g.setCookie=a.set.bind(a);let{body:y,delay:w,type:E="json",response:L,status:I=200,statusText:_}=l;if(se(g,I,_),await bt(k,g,l),await xt(k,g,l),y){try{let v=j(y)?await y(k):y;await Ne(c,w),wt(g,v,E)}catch(v){C.error(`${P.default.red("[body error]")} ${n.url}
37
- `,`file: ${P.default.cyan(l.__filepath__)}`,v),se(g,500),s.end("")}return}if(L){try{await Ne(c,w),await L(k,g,i)}catch(v){C.error(`${P.default.red("[response error]")} ${n.url}
38
- `,`file: ${P.default.cyan(l.__filepath__)}`,v),se(g,500),s.end("")}return}s.end("")}}function Mt(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,ae.pathToRegexp)(n.url).test(o);if(i&&n.validator){let c=N(n.url,o);if(j(n.validator))return n.validator({params:c,...r});try{return Ue({params:c,...r},n.validator)}catch(d){return C.error(`${P.default.red("[validator error]")} ${o}
39
- `,`file: ${P.default.cyan(n.__filepath__)}`,d),!1}}return i})}function se(e,o=200,t){e.statusCode=o,e.statusMessage=t||St(o)}async function bt(e,o,{headers:t,type:r="json"}){let n=A.contentType(r)||A.contentType(A.lookup(r)||"");if(n&&o.setHeader("Content-Type",n),o.setHeader("Cache-Control","no-cache,max-age=0"),o.setHeader("X-Mock","generate by vite:plugin-mock-dev-server"),!!t)try{let s=j(t)?await t(e):t;Object.keys(s).forEach(i=>{o.setHeader(i,s[i])})}catch(s){C.error(`${P.default.red("[headers error]")} ${e.url}
40
- `,s)}}async function xt(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){C.error(`${P.default.red("[cookies error]")} ${e.url}
41
- `,r)}}function wt(e,o,t){if(We(o))o.pipe(e);else if(ie.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"?ie.Buffer.from(r):r)}}async function Ne(e,o){if(!o||o<=0)return;let t=Date.now()-e,r=o-t;r>0&&await De(r)}function St(e){return Ae.default[e]||"Unknown"}var ze=f(require("events"),1),te=f(require("fs"),1),Ge=require("module"),le=f(require("path"),1),Qe=require("url"),de=f(require("chokidar"),1),Xe=require("esbuild"),Ke=f(require("fast-glob"),1),W=require("vite");var Be=require("url"),Je=f(require("lodash.sortby"),1);function ue(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,Be.parse)(r.url,!0),i=t[n]??(t[n]=[]),c={...r,url:n};if(c.ws!==!0){let d=c.validator;Ce(s)||(j(d)?c.validator=function(m){return $(m.query,s)&&d(m)}:d?(c.validator={...d},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,Je.default)(t[r],n=>{if(n.ws===!0)return 0;let{validator:s}=n;return s?j(s)?0:1/Object.keys(s).reduce((c,d)=>c+Ot(s[d]),0):1})}),t}function Ot(e){return e?Object.keys(e).length:0}var Pt=Ee(b),F=(0,Ge.createRequire)(Pt),oe=class extends ze.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}async load(){let{include:t,exclude:r}=this.options,n=await(0,Ke.default)(t,{cwd:this.cwd}),s=(0,W.createFilter)(t,r,{resolve:!1});this.watchMockEntry(),this.watchDeps();for(let c of n.filter(s))await this.loadMock(c);this.updateMockList();let i=null;this.on("mock:update",async c=>{s(c)&&(await this.loadMock(c),i&&clearTimeout(i),i=setTimeout(()=>{this.updateMockList(),this.emit("mock:update-end",c),i=null},0))}),this.on("mock:unlink",async c=>{s(c)&&(this.moduleCache.delete(c),this.updateMockList(),this.emit("mock:update-end",c))})}watchMockEntry(){let{include:t}=this.options,[r,...n]=t,s=de.default.watch(r,{ignoreInitial:!0,cwd:this.cwd});n.length>0&&n.forEach(i=>s.add(i)),s.on("add",async i=>{i=(0,W.normalizePath)(i),this.emit("mock:update",i),R("watcher:add",i)}),s.on("change",async i=>{i=(0,W.normalizePath)(i),this.emit("mock:update",i),R("watcher:change",i)}),s.on("unlink",async i=>{i=(0,W.normalizePath)(i),this.emit("mock:unlink",i),R("watcher:unlink",i)}),this.mockWatcher=s}watchDeps(){let t=[];this.depsWatcher=de.default.watch([],{ignoreInitial:!0,cwd:this.cwd}),this.depsWatcher.on("change",r=>{r=(0,W.normalizePath)(r);let n=this.moduleDeps.get(r);n&&n.forEach(s=>{this.emit("mock:update",s)})}),this.depsWatcher.on("unlink",r=>{r=(0,W.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=ue(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&&i.default?i.default:Object.keys(i||{}).map(d=>i[d]);S(c)?c.forEach(d=>d.__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,Qe.pathToFileURL)(s)}.mjs`;await te.default.promises.writeFile(i,r,"utf8");try{return await import(c)}finally{try{te.default.unlinkSync(i)}catch{}}}else{t=le.default.resolve(this.cwd,t);let s=le.default.extname(t),i=te.default.realpathSync(t),c=s in F.extensions?s:".js",d=F.extensions[c];F.extensions[c]=(M,h)=>{h===i?M._compile(r,h):d(M,h)},delete F.cache[F.resolve(t)];let m=F(t);return F.extensions[c]=d,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:[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:{}}}};var me=require("url"),Ye=f(require("cookies"),1),fe=require("path-to-regexp"),Ze=f(require("picocolors"),1),et=require("ws");function ke(e,o,t,r){var D;let n=new Map,s=new Map,i=new WeakMap,c=a=>{let u=s.get(a);return!u&&s.set(a,u=new Map),u},d=(a,u)=>{let p=a.get(u);return!p&&a.set(u,p=new et.WebSocketServer({noServer:!0})),p},m=(a,u)=>{let p=n.get(a);!p&&n.set(a,p=new Set),p.add(u)},M=(a,u,p,l,k,g)=>{var y;try{(y=p.setup)==null||y.call(p,u,l),u.on("close",()=>{a.delete(k)})}catch(w){C.error(`${Ze.default.red("[websocket server error]")} ${g}
42
- `,w)}},h=(a,u,p,l)=>{a.emit("connection",u,p),u.on("close",()=>{let k=l.findIndex(g=>g.ws===u);k!==-1&&l.splice(k,1)})},H=(a,u,p,l,k)=>{let{cleanupList:g,connectionList:y,context:w}=i.get(u);Ve(g),u.removeAllListeners(),M(a,u,p,w,l,k),y.forEach(({ws:E,req:L})=>{E.removeAllListeners(),h(u,E,L,y)})};(D=e.on)==null||D.call(e,"mock:update-end",a=>{if(!n.has(a))return;let u=n.get(a);for(let p of u.values())for(let l of e.mockData[p]){if(!l.ws||l.__filepath!==a)return;let k=c(p);for(let[g,y]of k.entries())H(k,y,l,g,a)}}),o==null||o.on("upgrade",(a,u,p)=>{let{pathname:l,query:k}=(0,me.parse)(a.url,!0);if(!l||t.length===0||!t.some(x=>Y(x,a.url)))return;let g=e.mockData,y=Object.keys(g).find(x=>(0,fe.pathToRegexp)(x).test(l));if(!y)return;let w=g[y].find(x=>x.url&&x.ws&&(0,fe.pathToRegexp)(x.url).test(l));if(!w)return;let E=w.__filepath__;m(E,y);let L=c(y),I=d(L,l),_=i.get(I);if(!_){let x=[],ve={onCleanup:ot=>x.push(ot)};_={cleanupList:x,context:ve,connectionList:[]},i.set(I,_),M(L,I,w,ve,l,E)}let v=a,he=new Ye.default(a,a,r),{query:tt}=(0,me.parse)(a.headers.referer||"",!0);v.query=k,v.refererQuery=tt,v.params=N(y,l),v.getCookie=he.get.bind(he),I.handleUpgrade(v,u,p,x=>{R(`websocket-mock: ${a.url} connected`),_.connectionList.push({req:v,ws:x}),h(I,x,v,_.connectionList)})}),o==null||o.on("close",()=>{for(let a of s.values()){for(let u of a.values()){let p=i.get(u);Ve(p.cleanupList),u.close()}a.clear()}s.clear(),n.clear()})}function Ve(e){let o;for(;o=e.shift();)o==null||o()}async function ge(e,o,t,r){let n=O(o.include),s=O(o.exclude),i={};if(e.define)for(let M in e.define){let h=e.define[M];i[M]=typeof h=="string"?h:JSON.stringify(h)}let c=new oe({include:n,exclude:s,define:i,alias:e.resolve.alias});await c.load(),c.on("mock:update-end",()=>{o.reload&&(r==null||r.send({type:"full-reload"}))}),t==null||t.on("close",()=>c.close());let{httpProxies:d}=V(e.server.proxy||{}),m=O(o.prefix);return ke(c,t,O(o.wsPrefix),o.cookiesOptions),pe(c,{formidableOptions:o.formidableOptions,proxies:[...m,...d],cookiesOptions:o.cookiesOptions})}function ye({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 d={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=[Rt(d)];return d.build&&m.push(jt(d)),m}function jt(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 $e(this,o,e)}}}function Rt(e){let o={};return{name:"vite-plugin-mock-dev-server",enforce:"pre",apply:"serve",configResolved(t){o=t,t.logger.warn("")},async configureServer({middlewares:t,config:r,httpServer:n,ws:s}){let i=await ge(r,e,n,s);t.use(i)},async configurePreviewServer({middlewares:t,httpServer:r}){let n=await ge(o,e,r);t.use(n)}}}function Ct(e){return e}function Wt(e){return t=>(S(t)?t=t.map(r=>e(r)||r):t=e(t)||t,t)}var Dt=ye;0&&(module.exports={baseMiddleware,createDefineMock,defineMock,mockDevServerPlugin,mockWebSocket,transformMockData});
31
+ const mockList = exporters.map((raw) => {
32
+ let mockConfig
33
+ if (raw.default) {
34
+ mockConfig = raw.default
35
+ } else {
36
+ mockConfig = []
37
+ Object.keys(raw || {}).forEach((key) => {
38
+ isArray(raw[key])
39
+ ? mockConfig.push(...raw[key])
40
+ : mockConfig.push(raw[key])
41
+ })
42
+ }
43
+ return mockConfig
44
+ });
45
+ export default transformMockData(mockList);`}async function vt(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:[X(t),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:{}}}var ce=require("buffer"),ae=require("url"),Ne=f(require("cookies"),1),qe=f(require("http-status"),1),Be=f(require("lodash.sortby"),1),B=f(require("mime-types"),1),pe=require("path-to-regexp"),C=f(require("picocolors"),1);var te=f(require("co-body"),1),Te=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 te.default.json(e);if(r.startsWith("application/x-www-form-urlencoded"))return await te.default.form(e);if(r.startsWith("text/plain"))return await te.default.text(e);if(r.startsWith("multipart/form-data"))return await Mt(e,o)}catch(s){console.error(s)}}async function Mt(e,o){let t=(0,Te.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 bt=/:/g;function ue(e,{formidableOptions:o={},proxies:t,cookiesOptions:r}){return async function(n,s,i){let c=Date.now(),{query:l,pathname:d}=(0,ae.parse)(n.url,!0);if(!d||t.length===0||!t.some(h=>Z(h,n.url)))return i();let M=e.mockData,v=(0,Be.default)(Object.keys(M),h=>{var U;return((U=h.match(bt))==null?void 0:U.length)||0}).find(h=>(0,pe.pathToRegexp)(h).test(d));if(!v)return i();let{query:H}=(0,ae.parse)(n.headers.referer||"",!0),E=await He(n,o),a=new Ne.default(n,s,r),u=a.get.bind(a),p=n.method.toUpperCase(),m=xt(M[v],{pathname:d,method:p,request:{query:l,refererQuery:H,body:E,headers:n.headers,getCookie:u}});if(!m)return i();R("middleware: ",p,n.url);let k=n,g=s;k.body=E,k.query=l,k.refererQuery=H,k.params=N(m.url,d),k.getCookie=u,g.setCookie=a.set.bind(a);let{body:y,delay:S,type:P="json",response:I,status:L=200,statusText:_}=m;if(ie(g,L,_),await wt(k,g,m),await St(k,g,m),y){try{let h=j(y)?await y(k):y;await Ae(c,S),Ot(g,h,P)}catch(h){W.error(`${C.default.red("[body error]")} ${n.url}
46
+ `,`file: ${C.default.cyan(m.__filepath__)}`,h),ie(g,500),s.end("")}return}if(I){try{await Ae(c,S),await I(k,g,i)}catch(h){W.error(`${C.default.red("[response error]")} ${n.url}
47
+ `,`file: ${C.default.cyan(m.__filepath__)}`,h),ie(g,500),s.end("")}return}s.end("")}}function xt(e,{pathname:o,method:t,request:r}){return e.find(n=>{if(!o||!n||!n.url||n.ws===!0||!(n.method?w(n.method)?n.method:[n.method]:["GET","POST"]).includes(t))return!1;let i=(0,pe.pathToRegexp)(n.url).test(o);if(i&&n.validator){let c=N(n.url,o);if(j(n.validator))return n.validator({params:c,...r});try{return Ue({params:c,...r},n.validator)}catch(l){return W.error(`${C.default.red("[validator error]")} ${o}
48
+ `,`file: ${C.default.cyan(n.__filepath__)}`,l),!1}}return i})}function ie(e,o=200,t){e.statusCode=o,e.statusMessage=t||Ct(o)}async function wt(e,o,{headers:t,type:r="json"}){let n=B.contentType(r)||B.contentType(B.lookup(r)||"");if(n&&o.setHeader("Content-Type",n),o.setHeader("Cache-Control","no-cache,max-age=0"),o.setHeader("X-Mock","generate by vite:plugin-mock-dev-server"),!!t)try{let s=j(t)?await t(e):t;Object.keys(s).forEach(i=>{o.setHeader(i,s[i])})}catch(s){W.error(`${C.default.red("[headers error]")} ${e.url}
49
+ `,s)}}async function St(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(w(s)){let[i,c]=s;o.setCookie(n,i,c)}else o.setCookie(n,s)})}catch(r){W.error(`${C.default.red("[cookies error]")} ${e.url}
50
+ `,r)}}function Ot(e,o,t){if(We(o))o.pipe(e);else if(ce.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"?ce.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 De(r)}function Ct(e){return qe.default[e]||"Unknown"}var Ge=f(require("events"),1),oe=f(require("fs"),1),Qe=require("module"),me=f(require("path"),1),Xe=require("url"),de=f(require("chokidar"),1),Ye=require("esbuild"),Ke=f(require("fast-glob"),1),D=require("vite");var Je=require("url"),ze=f(require("lodash.sortby"),1);function le(e){let o=[];for(let[,r]of e.entries())r&&(w(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,Je.parse)(r.url,!0),i=t[n]??(t[n]=[]),c={...r,url:n};if(c.ws!==!0){let l=c.validator;Re(s)||(j(l)?c.validator=function(d){return F(d.query,s)&&l(d)}:l?(c.validator={...l},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,ze.default)(t[r],n=>{if(n.ws===!0)return 0;let{validator:s}=n;return s?j(s)?0:1/Object.keys(s).reduce((c,l)=>c+Pt(s[l]),0):1})}),t}function Pt(e){return e?Object.keys(e).length:0}var jt=Ee(b),T=(0,Qe.createRequire)(jt),re=class extends Ge.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,D.createFilter)(t,r,{resolve:!1});(0,Ke.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=de.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),R("watcher:add",i)}),s.on("change",async i=>{i=(0,D.normalizePath)(i),this.emit("mock:update",i),R("watcher:change",i)}),s.on("unlink",async i=>{i=(0,D.normalizePath)(i),this.emit("mock:unlink",i),R("watcher:unlink",i)}),this.mockWatcher=s}watchDeps(){let t=[];this.depsWatcher=de.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=le(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(l=>{w(i[l])?c.push(...i[l]):c.push(i[l])})),w(c)?c.forEach(l=>l.__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 oe.default.promises.writeFile(i,r,"utf8");try{return await import(c)}finally{try{oe.default.unlinkSync(i)}catch{}}}else{t=me.default.resolve(this.cwd,t);let s=me.default.extname(t),i=oe.default.realpathSync(t),c=s in T.extensions?s:".js",l=T.extensions[c];T.extensions[c]=(M,v)=>{v===i?M._compile(r,v):l(M,v)},delete T.cache[T.resolve(t)];let d=T(t);return T.extensions[c]=l,d.__esModule?d:{default:d}}}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),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:{}}}};var fe=require("url"),Ze=f(require("cookies"),1),ke=require("path-to-regexp"),et=f(require("picocolors"),1),tt=require("ws");function ge(e,o,t,r){var E;let n=new Map,s=new Map,i=new WeakMap,c=a=>{let u=s.get(a);return!u&&s.set(a,u=new Map),u},l=(a,u)=>{let p=a.get(u);return!p&&a.set(u,p=new tt.WebSocketServer({noServer:!0})),p},d=(a,u)=>{let p=n.get(a);!p&&n.set(a,p=new Set),p.add(u)},M=(a,u,p,m,k,g)=>{var y;try{(y=p.setup)==null||y.call(p,u,m),u.on("close",()=>{a.delete(k)})}catch(S){W.error(`${et.default.red("[websocket server error]")} ${g}
51
+ `,S)}},v=(a,u,p,m)=>{a.emit("connection",u,p),u.on("close",()=>{let k=m.findIndex(g=>g.ws===u);k!==-1&&m.splice(k,1)})},H=(a,u,p,m,k)=>{let{cleanupList:g,connectionList:y,context:S}=i.get(u);Ve(g),y.forEach(({ws:P})=>P.removeAllListeners()),u.removeAllListeners(),M(a,u,p,S,m,k),y.forEach(({ws:P,req:I})=>v(u,P,I,y))};(E=e.on)==null||E.call(e,"mock:update-end",a=>{if(!n.has(a))return;let u=n.get(a);if(u)for(let p of u.values())for(let m of e.mockData[p]){if(!m.ws||m.__filepath__!==a)return;let k=c(p);for(let[g,y]of k.entries())H(k,y,m,g,a)}}),o==null||o.on("upgrade",(a,u,p)=>{let{pathname:m,query:k}=(0,fe.parse)(a.url,!0);if(!m||t.length===0||!t.some(x=>Z(x,a.url)))return;let g=e.mockData,y=Object.keys(g).find(x=>(0,ke.pathToRegexp)(x).test(m));if(!y)return;let S=g[y].find(x=>x.url&&x.ws&&(0,ke.pathToRegexp)(x.url).test(m));if(!S)return;let P=S.__filepath__;d(P,y);let I=c(y),L=l(I,m),_=i.get(L);if(!_){let x=[],ve={onCleanup:rt=>x.push(rt)};_={cleanupList:x,context:ve,connectionList:[]},i.set(L,_),M(I,L,S,ve,m,P)}let h=a,U=new Ze.default(a,a,r),{query:ot}=(0,fe.parse)(a.headers.referer||"",!0);h.query=k,h.refererQuery=ot,h.params=N(y,m),h.getCookie=U.get.bind(U),L.handleUpgrade(h,u,p,x=>{R(`websocket-mock: ${a.url} connected`),_.connectionList.push({req:h,ws:x}),v(L,x,h,_.connectionList)})}),o==null||o.on("close",()=>{for(let a of s.values()){for(let u of a.values()){let p=i.get(u);Ve(p.cleanupList),u.close()}a.clear()}s.clear(),n.clear()})}function Ve(e){let o;for(;o=e.shift();)o==null||o()}async function ye(e,o,t,r){let n=O(o.include),s=O(o.exclude),i={};if(e.define)for(let M in e.define){let v=e.define[M];i[M]=typeof v=="string"?v:JSON.stringify(v)}let c=new re({include:n,exclude:s,define:i,alias:e.resolve.alias});c.load(),c.on("mock:update-end",()=>{o.reload&&(r==null||r.send({type:"full-reload"}))}),t==null||t.on("close",()=>c.close());let{httpProxies:l}=V(e.server.proxy||{}),d=O(o.prefix);return ge(c,t,O(o.wsPrefix),o.cookiesOptions),ue(c,{formidableOptions:o.formidableOptions,proxies:[...d,...l],cookiesOptions:o.cookiesOptions})}function he({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 l={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},d=[Wt(l)];return l.build&&d.push(Rt(l)),d}function Rt(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 Fe(this,o,e)}}}function Wt(e){let o={};return{name:"vite-plugin-mock-dev-server",enforce:"pre",apply:"serve",configResolved(t){o=t,t.logger.warn("")},async configureServer({middlewares:t,config:r,httpServer:n,ws:s}){let i=await ye(r,e,n,s);t.use(i)},async configurePreviewServer({middlewares:t,httpServer:r}){let n=await ye(o,e,r);t.use(n)}}}function Dt(e){return e}function Et(e){return t=>(w(t)?t=t.map(r=>e(r)||r):t=e(t)||t,t)}var It=he;0&&(module.exports={baseMiddleware,createDefineMock,defineMock,mockDevServerPlugin,mockWebSocket,transformMockData});
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { Connect, Plugin, ResolvedConfig } from 'vite';
2
+ import { Buffer } from 'node:buffer';
2
3
  import http from 'node:http';
3
4
  import { Readable } from 'node:stream';
4
5
  import Cookies from 'cookies';
@@ -7,6 +8,11 @@ import { WebSocketServer } from 'ws';
7
8
  import EventEmitter from 'node:events';
8
9
  import chokidar from 'chokidar';
9
10
 
11
+ /**
12
+ * Configure plugin
13
+ *
14
+ * 插件配置项
15
+ */
10
16
  interface MockServerPluginOptions {
11
17
  /**
12
18
  * To configure the path matching rules for http mock services,
@@ -95,6 +101,9 @@ interface ServerBuildOption {
95
101
  type Method = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'TRACE' | 'OPTIONS';
96
102
  type Headers = http.IncomingHttpHeaders;
97
103
  type ResponseBody = Record<string, any> | any[] | string | number | Readable | Buffer | null;
104
+ /**
105
+ * 扩展 request,添加额外的属性和方法
106
+ */
98
107
  interface ExtraRequest {
99
108
  /**
100
109
  * The query string located after `?` in the request address has been parsed into JSON.
@@ -126,6 +135,9 @@ interface ExtraRequest {
126
135
  */
127
136
  headers: Headers;
128
137
  /**
138
+ * Get the cookie carried in the request.
139
+ *
140
+ * 获取 请求中携带的 cookie
129
141
  * @see [cookies](https://github.com/pillarjs/cookies#cookiesgetname--options)
130
142
  */
131
143
  getCookie: (name: string, option?: Cookies.GetOption) => string | undefined;
@@ -133,6 +145,9 @@ interface ExtraRequest {
133
145
  type MockRequest = Connect.IncomingMessage & ExtraRequest;
134
146
  type MockResponse = http.ServerResponse<http.IncomingMessage> & {
135
147
  /**
148
+ * Set cookie in response
149
+ *
150
+ * 向请求响应中设置 cookie
136
151
  * @see [cookies](https://github.com/pillarjs/cookies#cookiessetname--values--options)
137
152
  */
138
153
  setCookie: (name: string, value?: string | null, option?: Cookies.SetOption) => void;
@@ -442,7 +457,7 @@ declare class MockLoader extends EventEmitter {
442
457
  private _mockData;
443
458
  constructor(options: MockLoaderOptions);
444
459
  get mockData(): Record<string, MockOptions>;
445
- load(): Promise<void>;
460
+ load(): void;
446
461
  private watchMockEntry;
447
462
  /**
448
463
  * 监听 mock文件依赖的本地文件变动,
@@ -464,6 +479,18 @@ interface BaseMiddlewareOptions {
464
479
  }
465
480
  declare function baseMiddleware(mockLoader: MockLoader, { formidableOptions, proxies, cookiesOptions }: BaseMiddlewareOptions): Connect.NextHandleFunction;
466
481
 
482
+ /**
483
+ * 不复用 `viteConfig.server.proxy` 中 websocket proxy的原因是,
484
+ * 很难通过一种令人满意的方式,检查 mock 文件中是否有 websocket 相关的 mock 配置,
485
+ * 对比 `server.proxy` 中被使用的,并从 `viteConfig.server.proxy` 中删除。
486
+ * 由于不确定 mock 文件的规模,解析所有mock文件后找出相对应的路径匹配规则再修改 `viteConfig`,
487
+ * 这个链路的时间开销,已经影响了 vite 开发服务的启动时间,这有违 vite 和插件的预期。
488
+ * 且如果 新增的 mock 文件中 又有其他的规则需要再次 修改 `viteConfig` 导致 vite 服务重启,
489
+ * 这其实并不是一个合适的处理方案,很难符合用户的预期。
490
+ * 比较合适的方案还是提供 `wsPrefix` 配置项给用户自定义,并由用户确保 `wsPrefix` 中的项不存在
491
+ * 于 `server.proxy` 中,避免 vite 内的 http-proxy ws 与 插件的 ws 的冲突。
492
+ */
493
+
467
494
  declare function mockWebSocket(loader: MockLoader, httpServer: http.Server | null, proxies: string[], cookiesOptions: MockServerPluginOptions['cookiesOptions']): void;
468
495
 
469
496
  declare function transformMockData(mockList: Map<string, MockHttpItem | MockWebsocketItem | MockOptions> | (MockHttpItem | MockWebsocketItem | MockOptions)[]): Record<string, MockOptions>;
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
- import Ne from"fs";import X from"fs/promises";import F from"path";import{build as qe}from"esbuild";import Ae from"fast-glob";import Ue from"is-core-module";import{createFilter as Be,normalizePath as Je}from"vite";var ie="vite-plugin-mock-dev-server",ce="1.1.8";import ae from"fs/promises";import Ee from"path";import Le from"json5";var U={name:"externalize-deps",setup(t){t.onResolve({filter:/.*/},({path:o})=>{if(o[0]!=="."&&!Ee.isAbsolute(o))return{external:!0}})}},B={name:"json5-loader",setup(t){t.onLoad({filter:/\.json5$/},async({path:o})=>{let e=await ae.readFile(o,"utf-8");return{contents:`export default ${JSON.stringify(Le.parse(e))}`,loader:"js"}})}},J={name:"json-loader",setup(t){t.onLoad({filter:/\.json$/},async({path:o})=>({contents:`export default ${await ae.readFile(o,"utf-8")}`,loader:"js"}))}},z=t=>({name:"alias-plugin",setup(o){o.onResolve({filter:/.*/},async({path:e})=>{let r=t.find(({find:c})=>Ie(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 Ie(t,o){return t instanceof RegExp?t.test(o):o.length<t.length?!1:o===t?!0:o.startsWith(`${t}/`)}import V from"fs";import Y from"path";import{fileURLToPath as Te}from"url";import $e from"debug";import{match as _e}from"path-to-regexp";import pe from"picocolors";var S=t=>Array.isArray(t),P=t=>typeof t=="function",Fe=t=>Object.prototype.toString.call(t)==="[object Object]",ue=t=>Fe(t)&&Object.keys(t).length===0,He=t=>t!==null&&typeof t=="object"&&typeof t.pipe=="function",le=t=>He(t)&&t.readable!==!1&&typeof t._read=="function"&&typeof t._readableState=="object";function de(t){return new Promise(o=>setTimeout(o,t))}function me(t){return Y.dirname(Te(t))}var j=$e("vite:plugin-mock-dev-server"),O=t=>S(t)?t:t==null?[]:[t],C={info(...t){console.info(pe.cyan("mock-dev-server: "),...t)},error(...t){console.error(`
1
+ import Ae from"fs";import Y from"fs/promises";import T from"path";import{build as Ne}from"esbuild";import Ue from"fast-glob";import qe from"is-core-module";import{createFilter as Be,normalizePath as Je}from"vite";var ie="vite-plugin-mock-dev-server",ce="1.1.10";import ae from"fs/promises";import Ee from"path";import Ie from"json5";var B={name:"externalize-deps",setup(t){t.onResolve({filter:/.*/},({path:o})=>{if(o[0]!=="."&&!Ee.isAbsolute(o))return{external:!0}})}},J={name:"json5-loader",setup(t){t.onLoad({filter:/\.json5$/},async({path:o})=>{let e=await ae.readFile(o,"utf-8");return{contents:`export default ${JSON.stringify(Ie.parse(e))}`,loader:"js"}})}},z={name:"json-loader",setup(t){t.onLoad({filter:/\.json$/},async({path:o})=>({contents:`export default ${await ae.readFile(o,"utf-8")}`,loader:"js"}))}},G=t=>({name:"alias-plugin",setup(o){o.onResolve({filter:/.*/},async({path:e})=>{let r=t.find(({find:c})=>Le(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 Le(t,o){return t instanceof RegExp?t.test(o):o.length<t.length?!1:o===t?!0:o.startsWith(`${t}/`)}import V from"fs";import Z from"path";import{fileURLToPath as _e}from"url";import $e from"debug";import{match as Fe}from"path-to-regexp";import pe from"picocolors";var w=t=>Array.isArray(t),P=t=>typeof t=="function",Te=t=>Object.prototype.toString.call(t)==="[object Object]",le=t=>Te(t)&&Object.keys(t).length===0,He=t=>t!==null&&typeof t=="object"&&typeof t.pipe=="function",ue=t=>He(t)&&t.readable!==!1&&typeof t._read=="function"&&typeof t._readableState=="object";function me(t){return new Promise(o=>setTimeout(o,t))}function de(t){return Z.dirname(_e(t))}var j=$e("vite:plugin-mock-dev-server"),O=t=>w(t)?t:t==null?[]:[t],R={info(...t){console.info(pe.cyan("mock-dev-server: "),...t)},error(...t){console.error(`
2
2
  `,pe.cyan("mock-dev-server: "),...t,`
3
- `)}};function H(t,o,e){for(let n of o){let s=Y.join(t,n);if(V.existsSync(s)&&V.statSync(s).isFile()){let i=e!=null&&e.pathOnly?s:V.readFileSync(s,"utf-8");if(!(e!=null&&e.predicate)||e.predicate(i))return i}}let r=Y.dirname(t);if(r!==t&&(!(e!=null&&e.rootDir)||r.startsWith(e==null?void 0:e.rootDir)))return H(r,o,e)}var G=(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 Q(t,o){return t[0]==="^"&&new RegExp(t).test(o)||o.startsWith(t)}function N(t,o){return(_e(t,{decode:decodeURIComponent})(o)||{params:{}}).params||{}}async function fe(t,o,e){let r=O(e.include),n=O(e.exclude),s={};if(o.define)for(let p in o.define){let l=o.define[p];s[p]=typeof l=="string"?l:JSON.stringify(l)}let{httpProxies:i}=G(o.server.proxy||{});i.push(...O(e.prefix));let c=O(e.wsPrefix),d={};try{let p=H(o.root,["package.json"]);p&&(d=JSON.parse(p))}catch{}let m=e.build.dist,v=await Xe(process.cwd(),r,n),y=F.join(o.root,`mock-data-${Date.now()}.js`);await X.writeFile(y,v,"utf-8");let{code:_,deps:R}=await Ke(y,s,o.resolve.alias),a=ze(R);await X.unlink(y);let u=[{filename:F.join(m,"mock-data.js"),source:_},{filename:F.join(m,"index.js"),source:Qe(i,c,e.cookiesOptions,e.build.serverPort)},{filename:F.join(m,"package.json"),source:Ge(d,a)}];try{if(F.isAbsolute(m)){await X.rm(m,{recursive:!0}),Ne.mkdirSync(m,{recursive:!0});for(let{filename:p,source:l}of u)await X.writeFile(p,l,"utf-8")}else for(let{filename:p,source:l}of u)t.emitFile({type:"asset",fileName:p,source:l})}catch{}}function ze(t){let o=new Set,e=[ie,"connect","cors"];return Object.keys(t).forEach(r=>{t[r].imports.filter(s=>s.external).map(s=>s.path).forEach(s=>{!e.includes(s)&&!Ue(s)&&o.add(s)})}),Array.from(o)}function Ge(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":`^${ce}`,cors:"^2.8.5"},pnpm:{peerDependencyRules:{ignoreMissing:["vite"]}}};return o.forEach(i=>{s.dependencies[i]=n[i]||"latest"}),JSON.stringify(s,null,2)}function Qe(t,o,e={},r=8080){return`import { createServer } from 'node:http';
4
- import connect from 'connect';
3
+ `)}};function A(t,o,e){for(let n of o){let s=Z.join(t,n);if(V.existsSync(s)&&V.statSync(s).isFile()){let i=e!=null&&e.pathOnly?s:V.readFileSync(s,"utf-8");if(!(e!=null&&e.predicate)||e.predicate(i))return i}}let r=Z.dirname(t);if(r!==t&&(!(e!=null&&e.rootDir)||r.startsWith(e==null?void 0:e.rootDir)))return A(r,o,e)}var Q=(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 X(t,o){return t[0]==="^"&&new RegExp(t).test(o)||o.startsWith(t)}function N(t,o){return(Fe(t,{decode:decodeURIComponent})(o)||{params:{}}).params||{}}async function fe(t,o,e){let r=O(e.include),n=O(e.exclude),s={};if(o.define)for(let p in o.define){let m=o.define[p];s[p]=typeof m=="string"?m:JSON.stringify(m)}let{httpProxies:i}=Q(o.server.proxy||{});i.push(...O(e.prefix));let c=O(e.wsPrefix),u={};try{let p=A(o.root,["package.json"]);p&&(u=JSON.parse(p))}catch{}let d=e.build.dist,v=await Xe(process.cwd(),r,n),h=T.join(o.root,`mock-data-${Date.now()}.js`);await Y.writeFile(h,v,"utf-8");let{code:F,deps:D}=await Ye(h,s,o.resolve.alias),a=ze(D);await Y.unlink(h);let l=[{filename:T.join(d,"mock-data.js"),source:F},{filename:T.join(d,"index.js"),source:Qe(i,c,e.cookiesOptions,e.build.serverPort)},{filename:T.join(d,"package.json"),source:Ge(u,a)}];try{if(T.isAbsolute(d)){await Y.rm(d,{recursive:!0}),Ae.mkdirSync(d,{recursive:!0});for(let{filename:p,source:m}of l)await Y.writeFile(p,m,"utf-8")}else for(let{filename:p,source:m}of l)t.emitFile({type:"asset",fileName:p,source:m})}catch{}}function ze(t){let o=new Set,e=[ie,"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 Ge(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":`^${ce}`,cors:"^2.8.5"},pnpm:{peerDependencyRules:{ignoreMissing:["vite"]}}};return o.forEach(i=>{s.dependencies[i]=n[i]||"latest"}),JSON.stringify(s,null,2)}function Qe(t,o,e={},r=8080){return`import { createServer } from 'node:http';
4
+ import connect from 'connect';
5
5
  import corsMiddleware from 'cors';
6
6
  import { baseMiddleware, mockWebSocket } from 'vite-plugin-mock-dev-server';
7
7
  import mockData from './mock-data.js';
@@ -24,19 +24,28 @@ 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 Ae(o,{cwd:t}),n=Be(o,e,{resolve:!1}),s=r.filter(n),i="",c="";return s.forEach((d,m)=>{let v=Je(F.join(t,d));i+=`import * as m${m} from '${v}';
28
- `,c+=`m${m}, `}),`import { transformMockData } from 'vite-plugin-mock-dev-server';
27
+ `}async function Xe(t,o,e){let r=await Ue(o,{cwd:t}),n=Be(o,e,{resolve:!1}),s=r.filter(n),i="",c="";return s.forEach((u,d)=>{let v=Je(T.join(t,u));i+=`import * as m${d} from '${v}';
28
+ `,c+=`m${d}, `}),`import { transformMockData } from 'vite-plugin-mock-dev-server';
29
29
  ${i}
30
30
  const exporters = [${c}];
31
- const mockList = exporters.map((raw) => raw && raw.default
32
- ? raw.default
33
- : Object.keys(raw || {}).map((key) => raw[key])
34
- )
35
- export default transformMockData(mockList);
36
- `}async function Ke(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:[z(e),U,B,J]});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 ye}from"buffer";import{parse as he}from"url";import Ze from"cookies";import et from"http-status";import*as q from"mime-types";import{pathToRegexp as Me}from"path-to-regexp";import W from"picocolors";import Z from"co-body";import Ve 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 Z.json(t);if(r.startsWith("application/x-www-form-urlencoded"))return await Z.form(t);if(r.startsWith("text/plain"))return await Z.text(t);if(r.startsWith("multipart/form-data"))return await Ye(t,o)}catch(s){console.error(s)}}async function Ye(t,o){let e=Ve(o);return new Promise((r,n)=>{e.parse(t,(s,i,c)=>{if(s){n(s);return}r({...i,...c})})})}function ge(t,o){return T(t.headers,o.headers)&&T(t.body,o.body)&&T(t.params,o.params)&&T(t.query,o.query)&&T(t.refererQuery,o.refererQuery)}function T(t,o){if(!o)return!0;for(let e in o)if(o[e]!==t[e])return!1;return!0}function be(t,{formidableOptions:o={},proxies:e,cookiesOptions:r}){return async function(n,s,i){let c=Date.now(),{query:d,pathname:m}=he(n.url,!0);if(!m||e.length===0||!e.some(h=>Q(h,n.url)))return i();let v=t.mockData,y=Object.keys(v).find(h=>Me(h).test(m));if(!y)return i();let{query:_}=he(n.headers.referer||"",!0),R=await ke(n,o),a=new Ze(n,s,r),u=a.get.bind(a),p=n.method.toUpperCase(),l=tt(v[y],{pathname:m,method:p,request:{query:d,refererQuery:_,body:R,headers:n.headers,getCookie:u}});if(!l)return i();j("middleware: ",p,n.url);let f=n,k=s;f.body=R,f.query=d,f.refererQuery=_,f.params=N(l.url,m),f.getCookie=u,k.setCookie=a.set.bind(a);let{body:g,delay:w,type:D="json",response:E,status:L=200,statusText:I}=l;if(ee(k,L,I),await ot(f,k,l),await rt(f,k,l),g){try{let h=P(g)?await g(f):g;await ve(c,w),nt(k,h,D)}catch(h){C.error(`${W.red("[body error]")} ${n.url}
37
- `,`file: ${W.cyan(l.__filepath__)}`,h),ee(k,500),s.end("")}return}if(E){try{await ve(c,w),await E(f,k,i)}catch(h){C.error(`${W.red("[response error]")} ${n.url}
38
- `,`file: ${W.cyan(l.__filepath__)}`,h),ee(k,500),s.end("")}return}s.end("")}}function tt(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=Me(n.url).test(o);if(i&&n.validator){let c=N(n.url,o);if(P(n.validator))return n.validator({params:c,...r});try{return ge({params:c,...r},n.validator)}catch(d){return C.error(`${W.red("[validator error]")} ${o}
39
- `,`file: ${W.cyan(n.__filepath__)}`,d),!1}}return i})}function ee(t,o=200,e){t.statusCode=o,t.statusMessage=e||st(o)}async function ot(t,o,{headers:e,type:r="json"}){let n=q.contentType(r)||q.contentType(q.lookup(r)||"");if(n&&o.setHeader("Content-Type",n),o.setHeader("Cache-Control","no-cache,max-age=0"),o.setHeader("X-Mock","generate by vite:plugin-mock-dev-server"),!!e)try{let s=P(e)?await e(t):e;Object.keys(s).forEach(i=>{o.setHeader(i,s[i])})}catch(s){C.error(`${W.red("[headers error]")} ${t.url}
40
- `,s)}}async function rt(t,o,{cookies:e}){if(e)try{let r=P(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){C.error(`${W.red("[cookies error]")} ${t.url}
41
- `,r)}}function nt(t,o,e){if(le(o))o.pipe(t);else if(ye.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"?ye.from(r):r)}}async function ve(t,o){if(!o||o<=0)return;let e=Date.now()-t,r=o-e;r>0&&await de(r)}function st(t){return et[t]||"Unknown"}import pt from"events";import te from"fs";import{createRequire as ut}from"module";import we from"path";import{pathToFileURL as lt}from"url";import Se from"chokidar";import{build as dt}from"esbuild";import mt from"fast-glob";import{createFilter as ft,normalizePath as A}from"vite";import{parse as it}from"url";import ct from"lodash.sortby";function xe(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}=it(r.url,!0),i=e[n]??(e[n]=[]),c={...r,url:n};if(c.ws!==!0){let d=c.validator;ue(s)||(P(d)?c.validator=function(m){return T(m.query,s)&&d(m)}:d?(c.validator={...d},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]=ct(e[r],n=>{if(n.ws===!0)return 0;let{validator:s}=n;return s?P(s)?0:1/Object.keys(s).reduce((c,d)=>c+at(s[d]),0):1})}),e}function at(t){return t?Object.keys(t).length:0}var kt=me(import.meta.url),$=ut(kt),K=class extends pt{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}async load(){let{include:e,exclude:r}=this.options,n=await mt(e,{cwd:this.cwd}),s=ft(e,r,{resolve:!1});this.watchMockEntry(),this.watchDeps();for(let c of n.filter(s))await this.loadMock(c);this.updateMockList();let i=null;this.on("mock:update",async c=>{s(c)&&(await this.loadMock(c),i&&clearTimeout(i),i=setTimeout(()=>{this.updateMockList(),this.emit("mock:update-end",c),i=null},0))}),this.on("mock:unlink",async c=>{s(c)&&(this.moduleCache.delete(c),this.updateMockList(),this.emit("mock:update-end",c))})}watchMockEntry(){let{include:e}=this.options,[r,...n]=e,s=Se.watch(r,{ignoreInitial:!0,cwd:this.cwd});n.length>0&&n.forEach(i=>s.add(i)),s.on("add",async i=>{i=A(i),this.emit("mock:update",i),j("watcher:add",i)}),s.on("change",async i=>{i=A(i),this.emit("mock:update",i),j("watcher:change",i)}),s.on("unlink",async i=>{i=A(i),this.emit("mock:unlink",i),j("watcher:unlink",i)}),this.mockWatcher=s}watchDeps(){let e=[];this.depsWatcher=Se.watch([],{ignoreInitial:!0,cwd:this.cwd}),this.depsWatcher.on("change",r=>{r=A(r);let n=this.moduleDeps.get(r);n&&n.forEach(s=>{this.emit("mock:update",s)})}),this.depsWatcher.on("unlink",r=>{r=A(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=xe(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&&i.default?i.default:Object.keys(i||{}).map(d=>i[d]);S(c)?c.forEach(d=>d.__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=`${lt(s)}.mjs`;await te.promises.writeFile(i,r,"utf8");try{return await import(c)}finally{try{te.unlinkSync(i)}catch{}}}else{e=we.resolve(this.cwd,e);let s=we.extname(e),i=te.realpathSync(e),c=s in $.extensions?s:".js",d=$.extensions[c];$.extensions[c]=(v,y)=>{y===i?v._compile(r,y):d(v,y)},delete $.cache[$.resolve(e)];let m=$(e);return $.extensions[c]=d,m.__esModule?m:{default:m}}}async transformWithEsbuild(e,r){var n;try{let s=await dt({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:[z(this.options.alias),U,J,B]});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 Oe}from"url";import gt from"cookies";import{pathToRegexp as Pe}from"path-to-regexp";import yt from"picocolors";import{WebSocketServer as ht}from"ws";function Ce(t,o,e,r){var R;let n=new Map,s=new Map,i=new WeakMap,c=a=>{let u=s.get(a);return!u&&s.set(a,u=new Map),u},d=(a,u)=>{let p=a.get(u);return!p&&a.set(u,p=new ht({noServer:!0})),p},m=(a,u)=>{let p=n.get(a);!p&&n.set(a,p=new Set),p.add(u)},v=(a,u,p,l,f,k)=>{var g;try{(g=p.setup)==null||g.call(p,u,l),u.on("close",()=>{a.delete(f)})}catch(w){C.error(`${yt.red("[websocket server error]")} ${k}
42
- `,w)}},y=(a,u,p,l)=>{a.emit("connection",u,p),u.on("close",()=>{let f=l.findIndex(k=>k.ws===u);f!==-1&&l.splice(f,1)})},_=(a,u,p,l,f)=>{let{cleanupList:k,connectionList:g,context:w}=i.get(u);je(k),u.removeAllListeners(),v(a,u,p,w,l,f),g.forEach(({ws:D,req:E})=>{D.removeAllListeners(),y(u,D,E,g)})};(R=t.on)==null||R.call(t,"mock:update-end",a=>{if(!n.has(a))return;let u=n.get(a);for(let p of u.values())for(let l of t.mockData[p]){if(!l.ws||l.__filepath!==a)return;let f=c(p);for(let[k,g]of f.entries())_(f,g,l,k,a)}}),o==null||o.on("upgrade",(a,u,p)=>{let{pathname:l,query:f}=Oe(a.url,!0);if(!l||e.length===0||!e.some(M=>Q(M,a.url)))return;let k=t.mockData,g=Object.keys(k).find(M=>Pe(M).test(l));if(!g)return;let w=k[g].find(M=>M.url&&M.ws&&Pe(M.url).test(l));if(!w)return;let D=w.__filepath__;m(D,g);let E=c(g),L=d(E,l),I=i.get(L);if(!I){let M=[],ne={onCleanup:De=>M.push(De)};I={cleanupList:M,context:ne,connectionList:[]},i.set(L,I),v(E,L,w,ne,l,D)}let h=a,re=new gt(a,a,r),{query:Re}=Oe(a.headers.referer||"",!0);h.query=f,h.refererQuery=Re,h.params=N(g,l),h.getCookie=re.get.bind(re),L.handleUpgrade(h,u,p,M=>{j(`websocket-mock: ${a.url} connected`),I.connectionList.push({req:h,ws:M}),y(L,M,h,I.connectionList)})}),o==null||o.on("close",()=>{for(let a of s.values()){for(let u of a.values()){let p=i.get(u);je(p.cleanupList),u.close()}a.clear()}s.clear(),n.clear()})}function je(t){let o;for(;o=t.shift();)o==null||o()}async function oe(t,o,e,r){let n=O(o.include),s=O(o.exclude),i={};if(t.define)for(let v in t.define){let y=t.define[v];i[v]=typeof y=="string"?y:JSON.stringify(y)}let c=new K({include:n,exclude:s,define:i,alias:t.resolve.alias});await c.load(),c.on("mock:update-end",()=>{o.reload&&(r==null||r.send({type:"full-reload"}))}),e==null||e.on("close",()=>c.close());let{httpProxies:d}=G(t.server.proxy||{}),m=O(o.prefix);return Ce(c,e,O(o.wsPrefix),o.cookiesOptions),be(c,{formidableOptions:o.formidableOptions,proxies:[...m,...d],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 d={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=[Mt(d)];return d.build&&m.push(vt(d)),m}function vt(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 fe(this,o,t)}}}function Mt(t){let o={};return{name:"vite-plugin-mock-dev-server",enforce:"pre",apply:"serve",configResolved(e){o=e,e.logger.warn("")},async configureServer({middlewares:e,config:r,httpServer:n,ws:s}){let i=await oe(r,t,n,s);e.use(i)},async configurePreviewServer({middlewares:e,httpServer:r}){let n=await oe(o,t,r);e.use(n)}}}function Ko(t){return t}function Vo(t){return e=>(S(e)?e=e.map(r=>t(r)||r):e=t(e)||e,e)}var tr=We;export{be as baseMiddleware,Vo as createDefineMock,tr as default,Ko as defineMock,We as mockDevServerPlugin,Ce as mockWebSocket,xe as transformMockData};
31
+ const mockList = exporters.map((raw) => {
32
+ let mockConfig
33
+ if (raw.default) {
34
+ mockConfig = raw.default
35
+ } else {
36
+ mockConfig = []
37
+ Object.keys(raw || {}).forEach((key) => {
38
+ isArray(raw[key])
39
+ ? mockConfig.push(...raw[key])
40
+ : mockConfig.push(raw[key])
41
+ })
42
+ }
43
+ return mockConfig
44
+ });
45
+ export default transformMockData(mockList);`}async function Ye(t,o,e){var r;try{let n=await Ne({entryPoints:[t],outfile:"out.js",write:!1,target:["node14.18","node16"],platform:"node",bundle:!0,metafile:!0,format:"esm",define:o,plugins:[G(e),B,J,z]});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 ye}from"buffer";import{parse as he}from"url";import Ze from"cookies";import et from"http-status";import tt from"lodash.sortby";import*as U from"mime-types";import{pathToRegexp as Me}from"path-to-regexp";import W from"picocolors";import ee from"co-body";import Ke 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 ee.json(t);if(r.startsWith("application/x-www-form-urlencoded"))return await ee.form(t);if(r.startsWith("text/plain"))return await ee.text(t);if(r.startsWith("multipart/form-data"))return await Ve(t,o)}catch(s){console.error(s)}}async function Ve(t,o){let e=Ke(o);return new Promise((r,n)=>{e.parse(t,(s,i,c)=>{if(s){n(s);return}r({...i,...c})})})}function ge(t,o){return _(t.headers,o.headers)&&_(t.body,o.body)&&_(t.params,o.params)&&_(t.query,o.query)&&_(t.refererQuery,o.refererQuery)}function _(t,o){if(!o)return!0;for(let e in o)if(o[e]!==t[e])return!1;return!0}var ot=/:/g;function be(t,{formidableOptions:o={},proxies:e,cookiesOptions:r}){return async function(n,s,i){let c=Date.now(),{query:u,pathname:d}=he(n.url,!0);if(!d||e.length===0||!e.some(y=>X(y,n.url)))return i();let v=t.mockData,h=tt(Object.keys(v),y=>{var H;return((H=y.match(ot))==null?void 0:H.length)||0}).find(y=>Me(y).test(d));if(!h)return i();let{query:F}=he(n.headers.referer||"",!0),D=await ke(n,o),a=new Ze(n,s,r),l=a.get.bind(a),p=n.method.toUpperCase(),m=rt(v[h],{pathname:d,method:p,request:{query:u,refererQuery:F,body:D,headers:n.headers,getCookie:l}});if(!m)return i();j("middleware: ",p,n.url);let f=n,k=s;f.body=D,f.query=u,f.refererQuery=F,f.params=N(m.url,d),f.getCookie=l,k.setCookie=a.set.bind(a);let{body:g,delay:S,type:C="json",response:E,status:I=200,statusText:L}=m;if(te(k,I,L),await nt(f,k,m),await st(f,k,m),g){try{let y=P(g)?await g(f):g;await ve(c,S),it(k,y,C)}catch(y){R.error(`${W.red("[body error]")} ${n.url}
46
+ `,`file: ${W.cyan(m.__filepath__)}`,y),te(k,500),s.end("")}return}if(E){try{await ve(c,S),await E(f,k,i)}catch(y){R.error(`${W.red("[response error]")} ${n.url}
47
+ `,`file: ${W.cyan(m.__filepath__)}`,y),te(k,500),s.end("")}return}s.end("")}}function rt(t,{pathname:o,method:e,request:r}){return t.find(n=>{if(!o||!n||!n.url||n.ws===!0||!(n.method?w(n.method)?n.method:[n.method]:["GET","POST"]).includes(e))return!1;let i=Me(n.url).test(o);if(i&&n.validator){let c=N(n.url,o);if(P(n.validator))return n.validator({params:c,...r});try{return ge({params:c,...r},n.validator)}catch(u){return R.error(`${W.red("[validator error]")} ${o}
48
+ `,`file: ${W.cyan(n.__filepath__)}`,u),!1}}return i})}function te(t,o=200,e){t.statusCode=o,t.statusMessage=e||ct(o)}async function nt(t,o,{headers:e,type:r="json"}){let n=U.contentType(r)||U.contentType(U.lookup(r)||"");if(n&&o.setHeader("Content-Type",n),o.setHeader("Cache-Control","no-cache,max-age=0"),o.setHeader("X-Mock","generate by vite:plugin-mock-dev-server"),!!e)try{let s=P(e)?await e(t):e;Object.keys(s).forEach(i=>{o.setHeader(i,s[i])})}catch(s){R.error(`${W.red("[headers error]")} ${t.url}
49
+ `,s)}}async function st(t,o,{cookies:e}){if(e)try{let r=P(e)?await e(t):e;Object.keys(r).forEach(n=>{let s=r[n];if(w(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 it(t,o,e){if(ue(o))o.pipe(t);else if(ye.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"?ye.from(r):r)}}async function ve(t,o){if(!o||o<=0)return;let e=Date.now()-t,r=o-e;r>0&&await me(r)}function ct(t){return et[t]||"Unknown"}import ut from"events";import oe from"fs";import{createRequire as mt}from"module";import we from"path";import{pathToFileURL as dt}from"url";import Se from"chokidar";import{build as ft}from"esbuild";import kt from"fast-glob";import{createFilter as gt,normalizePath as q}from"vite";import{parse as at}from"url";import pt from"lodash.sortby";function xe(t){let o=[];for(let[,r]of t.entries())r&&(w(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}=at(r.url,!0),i=e[n]??(e[n]=[]),c={...r,url:n};if(c.ws!==!0){let u=c.validator;le(s)||(P(u)?c.validator=function(d){return _(d.query,s)&&u(d)}:u?(c.validator={...u},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]=pt(e[r],n=>{if(n.ws===!0)return 0;let{validator:s}=n;return s?P(s)?0:1/Object.keys(s).reduce((c,u)=>c+lt(s[u]),0):1})}),e}function lt(t){return t?Object.keys(t).length:0}var yt=de(import.meta.url),$=mt(yt),K=class extends ut{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=gt(e,r,{resolve:!1});kt(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=Se.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),j("watcher:add",i)}),s.on("change",async i=>{i=q(i),this.emit("mock:update",i),j("watcher:change",i)}),s.on("unlink",async i=>{i=q(i),this.emit("mock:unlink",i),j("watcher:unlink",i)}),this.mockWatcher=s}watchDeps(){let e=[];this.depsWatcher=Se.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=xe(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(u=>{w(i[u])?c.push(...i[u]):c.push(i[u])})),w(c)?c.forEach(u=>u.__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=`${dt(s)}.mjs`;await oe.promises.writeFile(i,r,"utf8");try{return await import(c)}finally{try{oe.unlinkSync(i)}catch{}}}else{e=we.resolve(this.cwd,e);let s=we.extname(e),i=oe.realpathSync(e),c=s in $.extensions?s:".js",u=$.extensions[c];$.extensions[c]=(v,h)=>{h===i?v._compile(r,h):u(v,h)},delete $.cache[$.resolve(e)];let d=$(e);return $.extensions[c]=u,d.__esModule?d:{default:d}}}async transformWithEsbuild(e,r){var n;try{let s=await ft({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:[G(this.options.alias),B,z,J]});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 Oe}from"url";import ht from"cookies";import{pathToRegexp as Ce}from"path-to-regexp";import vt from"picocolors";import{WebSocketServer as Mt}from"ws";function je(t,o,e,r){var D;let n=new Map,s=new Map,i=new WeakMap,c=a=>{let l=s.get(a);return!l&&s.set(a,l=new Map),l},u=(a,l)=>{let p=a.get(l);return!p&&a.set(l,p=new Mt({noServer:!0})),p},d=(a,l)=>{let p=n.get(a);!p&&n.set(a,p=new Set),p.add(l)},v=(a,l,p,m,f,k)=>{var g;try{(g=p.setup)==null||g.call(p,l,m),l.on("close",()=>{a.delete(f)})}catch(S){R.error(`${vt.red("[websocket server error]")} ${k}
51
+ `,S)}},h=(a,l,p,m)=>{a.emit("connection",l,p),l.on("close",()=>{let f=m.findIndex(k=>k.ws===l);f!==-1&&m.splice(f,1)})},F=(a,l,p,m,f)=>{let{cleanupList:k,connectionList:g,context:S}=i.get(l);Pe(k),g.forEach(({ws:C})=>C.removeAllListeners()),l.removeAllListeners(),v(a,l,p,S,m,f),g.forEach(({ws:C,req:E})=>h(l,C,E,g))};(D=t.on)==null||D.call(t,"mock:update-end",a=>{if(!n.has(a))return;let l=n.get(a);if(l)for(let p of l.values())for(let m of t.mockData[p]){if(!m.ws||m.__filepath__!==a)return;let f=c(p);for(let[k,g]of f.entries())F(f,g,m,k,a)}}),o==null||o.on("upgrade",(a,l,p)=>{let{pathname:m,query:f}=Oe(a.url,!0);if(!m||e.length===0||!e.some(M=>X(M,a.url)))return;let k=t.mockData,g=Object.keys(k).find(M=>Ce(M).test(m));if(!g)return;let S=k[g].find(M=>M.url&&M.ws&&Ce(M.url).test(m));if(!S)return;let C=S.__filepath__;d(C,g);let E=c(g),I=u(E,m),L=i.get(I);if(!L){let M=[],ne={onCleanup:De=>M.push(De)};L={cleanupList:M,context:ne,connectionList:[]},i.set(I,L),v(E,I,S,ne,m,C)}let y=a,H=new ht(a,a,r),{query:We}=Oe(a.headers.referer||"",!0);y.query=f,y.refererQuery=We,y.params=N(g,m),y.getCookie=H.get.bind(H),I.handleUpgrade(y,l,p,M=>{j(`websocket-mock: ${a.url} connected`),L.connectionList.push({req:y,ws:M}),h(I,M,y,L.connectionList)})}),o==null||o.on("close",()=>{for(let a of s.values()){for(let l of a.values()){let p=i.get(l);Pe(p.cleanupList),l.close()}a.clear()}s.clear(),n.clear()})}function Pe(t){let o;for(;o=t.shift();)o==null||o()}async function re(t,o,e,r){let n=O(o.include),s=O(o.exclude),i={};if(t.define)for(let v in t.define){let h=t.define[v];i[v]=typeof h=="string"?h:JSON.stringify(h)}let c=new K({include:n,exclude:s,define:i,alias:t.resolve.alias});c.load(),c.on("mock:update-end",()=>{o.reload&&(r==null||r.send({type:"full-reload"}))}),e==null||e.on("close",()=>c.close());let{httpProxies:u}=Q(t.server.proxy||{}),d=O(o.prefix);return je(c,e,O(o.wsPrefix),o.cookiesOptions),be(c,{formidableOptions:o.formidableOptions,proxies:[...d,...u],cookiesOptions:o.cookiesOptions})}function Re({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 u={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},d=[xt(u)];return u.build&&d.push(bt(u)),d}function bt(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 fe(this,o,t)}}}function xt(t){let o={};return{name:"vite-plugin-mock-dev-server",enforce:"pre",apply:"serve",configResolved(e){o=e,e.logger.warn("")},async configureServer({middlewares:e,config:r,httpServer:n,ws:s}){let i=await re(r,t,n,s);e.use(i)},async configurePreviewServer({middlewares:e,httpServer:r}){let n=await re(o,t,r);e.use(n)}}}function Zo(t){return t}function er(t){return e=>(w(e)?e=e.map(r=>t(r)||r):e=t(e)||e,e)}var nr=Re;export{be as baseMiddleware,er as createDefineMock,nr as default,Zo as defineMock,Re as mockDevServerPlugin,je as mockWebSocket,xe as transformMockData};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vite-plugin-mock-dev-server",
3
- "version": "1.1.8",
3
+ "version": "1.1.10",
4
4
  "keywords": [
5
5
  "vite",
6
6
  "plugin",
@@ -47,8 +47,8 @@
47
47
  "ws": "^8.13.0"
48
48
  },
49
49
  "devDependencies": {
50
- "@pengzhanbo/eslint-config-ts": "^0.3.4",
51
- "@pengzhanbo/prettier-config": "^0.3.4",
50
+ "@pengzhanbo/eslint-config": "^0.3.11",
51
+ "@pengzhanbo/prettier-config": "^0.3.11",
52
52
  "@types/co-body": "^6.1.0",
53
53
  "@types/cookies": "^0.7.7",
54
54
  "@types/debug": "^4.1.7",
@@ -56,17 +56,17 @@
56
56
  "@types/is-core-module": "^2.2.0",
57
57
  "@types/lodash.sortby": "^4.7.7",
58
58
  "@types/mime-types": "^2.1.1",
59
- "@types/node": "^18.16.1",
59
+ "@types/node": "^18.16.5",
60
60
  "@types/ws": "^8.5.4",
61
61
  "bumpp": "^9.1.0",
62
62
  "conventional-changelog-cli": "^2.2.2",
63
- "eslint": "^8.39.0",
63
+ "eslint": "^8.40.0",
64
64
  "mockjs": "^1.1.0",
65
65
  "prettier": "^2.8.8",
66
66
  "tsup": "^6.7.0",
67
67
  "typescript": "^5.0.4",
68
- "vite": "^4.3.3",
69
- "vitepress": "1.0.0-alpha.74"
68
+ "vite": "^4.3.5",
69
+ "vitepress": "1.0.0-alpha.75"
70
70
  },
71
71
  "peerDependencies": {
72
72
  "vite": ">=3.0.0"