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 +31 -30
- package/README.zh-CN.md +7 -5
- package/dist/index.cjs +27 -18
- package/dist/index.d.ts +28 -1
- package/dist/index.js +26 -17
- package/package.json +7 -7
package/README.md
CHANGED
|
@@ -26,22 +26,22 @@
|
|
|
26
26
|
|
|
27
27
|
## Feature
|
|
28
28
|
|
|
29
|
-
- ⚡️
|
|
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 lib
|
|
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
|
|
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-type
|
|
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
|
[](https://app.netlify.com/sites/vite-plugin-mock-dev-server/deploys)
|
|
55
55
|
|
|
56
|
-
## Playground
|
|
57
|
-
|
|
58
|
-
[](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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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`
|
|
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
|
|
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
|
|
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
|
|
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
|
|
660
|
+
**exp:** multipart, upload files.
|
|
661
661
|
|
|
662
|
-
use [`formidable`](https://www.npmjs.com/package/formidable#readme) to
|
|
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 `
|
|
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
|
|
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
|
[](https://app.netlify.com/sites/vite-plugin-mock-dev-server/deploys)
|
|
56
56
|
|
|
57
|
-
## Playground
|
|
58
|
-
|
|
59
|
-
[](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
|
-
|
|
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
|
|
2
|
-
`,
|
|
3
|
-
`)}};function
|
|
4
|
-
|
|
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
|
|
28
|
-
`,c+=`m${
|
|
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) =>
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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():
|
|
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
|
|
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
|
|
4
|
-
|
|
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
|
|
28
|
-
`,c+=`m${
|
|
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) =>
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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.
|
|
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
|
|
51
|
-
"@pengzhanbo/prettier-config": "^0.3.
|
|
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.
|
|
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.
|
|
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.
|
|
69
|
-
"vitepress": "1.0.0-alpha.
|
|
68
|
+
"vite": "^4.3.5",
|
|
69
|
+
"vitepress": "1.0.0-alpha.75"
|
|
70
70
|
},
|
|
71
71
|
"peerDependencies": {
|
|
72
72
|
"vite": ">=3.0.0"
|