vite-plugin-mock-dev-server 1.1.11 → 1.1.13
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 -31
- package/README.zh-CN.md +1 -1
- package/dist/index.cjs +12 -12
- package/dist/index.d.ts +28 -5
- package/dist/index.js +12 -12
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -38,7 +38,7 @@
|
|
|
38
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 the mock file.
|
|
41
|
+
- 🍕 Support `viteConfig.define` and `env` in the mock file.
|
|
42
42
|
- ⚓️ Support `viteConfig.resolve.alias` in the mock file.
|
|
43
43
|
- 🌈 Support `vite preview` mode.
|
|
44
44
|
- 📤 Support `multipart` content-type, mock upload file.
|
|
@@ -57,7 +57,7 @@ See the [documentation](https://vite-plugin-mock-dev-server.netlify.app/) to lea
|
|
|
57
57
|
|
|
58
58
|
### Install
|
|
59
59
|
|
|
60
|
-
```sh
|
|
60
|
+
``` sh
|
|
61
61
|
# npm
|
|
62
62
|
npm i -D vite-plugin-mock-dev-server
|
|
63
63
|
# yarn
|
|
@@ -69,7 +69,7 @@ pnpm add -D vite-plugin-mock-dev-server
|
|
|
69
69
|
### Configuration
|
|
70
70
|
|
|
71
71
|
`vite.config.ts`
|
|
72
|
-
```ts
|
|
72
|
+
``` ts
|
|
73
73
|
import { defineConfig } from 'vite'
|
|
74
74
|
import mockDevServerPlugin from 'vite-plugin-mock-dev-server'
|
|
75
75
|
|
|
@@ -101,7 +101,7 @@ The plugin will also read the `define` configuration, which supports direct use
|
|
|
101
101
|
By default, write mock data in the `mock` directory of your project's root directory:
|
|
102
102
|
|
|
103
103
|
`mock/api.mock.ts` :
|
|
104
|
-
```ts
|
|
104
|
+
``` ts
|
|
105
105
|
import { defineMock } from 'vite-plugin-mock-dev-server'
|
|
106
106
|
|
|
107
107
|
export default defineMock({
|
|
@@ -121,7 +121,7 @@ Vite plugin
|
|
|
121
121
|
|
|
122
122
|
|
|
123
123
|
`vite.config.ts`
|
|
124
|
-
```ts
|
|
124
|
+
``` ts
|
|
125
125
|
import { defineConfig } from 'vite'
|
|
126
126
|
import mockDevServerPlugin from 'vite-plugin-mock-dev-server'
|
|
127
127
|
|
|
@@ -189,7 +189,7 @@ export default defineConfig({
|
|
|
189
189
|
**Default:** `{}`
|
|
190
190
|
|
|
191
191
|
example: Configure to file upload dir
|
|
192
|
-
```ts
|
|
192
|
+
``` ts
|
|
193
193
|
MockDevServerPlugin({
|
|
194
194
|
formidableOptions: {
|
|
195
195
|
uploadDir: path.join(process.cwd(), 'uploads'),
|
|
@@ -211,7 +211,7 @@ export default defineConfig({
|
|
|
211
211
|
|
|
212
212
|
**Default:** `false`
|
|
213
213
|
|
|
214
|
-
```ts
|
|
214
|
+
``` ts
|
|
215
215
|
interface ServerBuildOptions {
|
|
216
216
|
/**
|
|
217
217
|
* server port
|
|
@@ -230,7 +230,7 @@ export default defineConfig({
|
|
|
230
230
|
|
|
231
231
|
Mock Type Helper
|
|
232
232
|
|
|
233
|
-
```ts
|
|
233
|
+
``` ts
|
|
234
234
|
import { defineMock } from 'vite-plugin-mock-dev-server'
|
|
235
235
|
|
|
236
236
|
export default defineMock({
|
|
@@ -243,7 +243,7 @@ export default defineMock({
|
|
|
243
243
|
|
|
244
244
|
Return a custom defineMock function to support preprocessing of mock config.
|
|
245
245
|
|
|
246
|
-
```ts
|
|
246
|
+
``` ts
|
|
247
247
|
import path from 'node:path'
|
|
248
248
|
import { createDefineMock } from 'vite-plugin-mock-dev-server'
|
|
249
249
|
|
|
@@ -259,7 +259,7 @@ export default defineApiMock({
|
|
|
259
259
|
|
|
260
260
|
## Mock Configuration
|
|
261
261
|
|
|
262
|
-
```ts
|
|
262
|
+
``` ts
|
|
263
263
|
// Configure the http mock
|
|
264
264
|
export default defineMock({
|
|
265
265
|
/**
|
|
@@ -384,7 +384,7 @@ export default defineMock({
|
|
|
384
384
|
}
|
|
385
385
|
})
|
|
386
386
|
```
|
|
387
|
-
```ts
|
|
387
|
+
``` ts
|
|
388
388
|
// Configure the WebSocket mock
|
|
389
389
|
export default defineMock({
|
|
390
390
|
/**
|
|
@@ -442,7 +442,7 @@ type Request = Connect.IncomingMessage & {
|
|
|
442
442
|
|
|
443
443
|
The original type of `response` is `http.ServerResponse<http.IncomingMessage>`. The plugin adds `setCookie(name, value)` method for configuration cookies on this basis.
|
|
444
444
|
|
|
445
|
-
```ts
|
|
445
|
+
``` ts
|
|
446
446
|
type Response = http.ServerResponse<http.IncomingMessage> & {
|
|
447
447
|
setCookie: (
|
|
448
448
|
name: string,
|
|
@@ -466,14 +466,14 @@ type Response = http.ServerResponse<http.IncomingMessage> & {
|
|
|
466
466
|
See more examples: [example](/example/)
|
|
467
467
|
|
|
468
468
|
**exp:** Match `/api/test`, And returns a response body content with empty data
|
|
469
|
-
```ts
|
|
469
|
+
``` ts
|
|
470
470
|
export default defineMock({
|
|
471
471
|
url: '/api/test',
|
|
472
472
|
})
|
|
473
473
|
```
|
|
474
474
|
|
|
475
475
|
**exp:** Match `/api/test` , And returns a static content data
|
|
476
|
-
```ts
|
|
476
|
+
``` ts
|
|
477
477
|
export default defineMock({
|
|
478
478
|
url: '/api/test',
|
|
479
479
|
body: { a: 1 },
|
|
@@ -482,7 +482,7 @@ export default defineMock({
|
|
|
482
482
|
|
|
483
483
|
|
|
484
484
|
**exp:** Only Support `GET` Method
|
|
485
|
-
```ts
|
|
485
|
+
``` ts
|
|
486
486
|
export default defineMock({
|
|
487
487
|
url: '/api/test',
|
|
488
488
|
method: 'GET'
|
|
@@ -490,14 +490,14 @@ export default defineMock({
|
|
|
490
490
|
```
|
|
491
491
|
|
|
492
492
|
**exp:** In the response header, add a custom header and cookie
|
|
493
|
-
```ts
|
|
493
|
+
``` ts
|
|
494
494
|
export default defineMock({
|
|
495
495
|
url: '/api/test',
|
|
496
496
|
headers: { 'X-Custom': '12345678' },
|
|
497
497
|
cookies: { 'my-cookie': '123456789' },
|
|
498
498
|
})
|
|
499
499
|
```
|
|
500
|
-
```ts
|
|
500
|
+
``` ts
|
|
501
501
|
export default defineMock({
|
|
502
502
|
url: '/api/test',
|
|
503
503
|
headers({ query, body, params, headers }) {
|
|
@@ -511,7 +511,7 @@ export default defineMock({
|
|
|
511
511
|
|
|
512
512
|
|
|
513
513
|
**exp:** Define multiple mock requests for the same URL and match valid rules with validators
|
|
514
|
-
```ts
|
|
514
|
+
``` ts
|
|
515
515
|
export default defineMock([
|
|
516
516
|
// Match /api/test?a=1
|
|
517
517
|
{
|
|
@@ -539,7 +539,7 @@ export default defineMock([
|
|
|
539
539
|
|
|
540
540
|
|
|
541
541
|
**exp:** Response Delay
|
|
542
|
-
```ts
|
|
542
|
+
``` ts
|
|
543
543
|
export default defineMock({
|
|
544
544
|
url: '/api/test',
|
|
545
545
|
delay: 6000, // delay 6 seconds
|
|
@@ -548,7 +548,7 @@ export default defineMock({
|
|
|
548
548
|
|
|
549
549
|
|
|
550
550
|
**exp:** The interface request failed
|
|
551
|
-
```ts
|
|
551
|
+
``` ts
|
|
552
552
|
export default defineMock({
|
|
553
553
|
url: '/api/test',
|
|
554
554
|
status: 502,
|
|
@@ -558,7 +558,7 @@ export default defineMock({
|
|
|
558
558
|
|
|
559
559
|
|
|
560
560
|
**exp:** Dynamic route matching
|
|
561
|
-
```ts
|
|
561
|
+
``` ts
|
|
562
562
|
export default defineMock({
|
|
563
563
|
url: '/api/user/:userId',
|
|
564
564
|
body({ params }) {
|
|
@@ -581,7 +581,7 @@ export default defineMock({
|
|
|
581
581
|
body: Buffer.from(JSON.stringify({ a: 1 }))
|
|
582
582
|
})
|
|
583
583
|
```
|
|
584
|
-
```ts
|
|
584
|
+
``` ts
|
|
585
585
|
// When the type is buffer, the content-type is application/octet-stream.
|
|
586
586
|
// The data passed in through body will be converted to a buffer.
|
|
587
587
|
export default defineMock({
|
|
@@ -595,7 +595,7 @@ export default defineMock({
|
|
|
595
595
|
**exp:** Response file type
|
|
596
596
|
|
|
597
597
|
Simulate file download, and pass in the file reading stream.
|
|
598
|
-
```ts
|
|
598
|
+
``` ts
|
|
599
599
|
import { createReadStream } from 'node:fs'
|
|
600
600
|
|
|
601
601
|
export default defineMock({
|
|
@@ -610,7 +610,7 @@ export default defineMock({
|
|
|
610
610
|
```
|
|
611
611
|
|
|
612
612
|
**exp:** Use `mockjs`:
|
|
613
|
-
```ts
|
|
613
|
+
``` ts
|
|
614
614
|
import Mock from 'mockjs'
|
|
615
615
|
|
|
616
616
|
export default defineMock({
|
|
@@ -626,7 +626,7 @@ You need install `mockjs`
|
|
|
626
626
|
|
|
627
627
|
|
|
628
628
|
**exp:** Use `response` to customize the response
|
|
629
|
-
```ts
|
|
629
|
+
``` ts
|
|
630
630
|
export default defineMock({
|
|
631
631
|
url: '/api/test',
|
|
632
632
|
response(req, res, next) {
|
|
@@ -646,7 +646,7 @@ export default defineMock({
|
|
|
646
646
|
|
|
647
647
|
|
|
648
648
|
**exp:** Use json / json5
|
|
649
|
-
```json
|
|
649
|
+
``` json
|
|
650
650
|
{
|
|
651
651
|
"url": "/api/test",
|
|
652
652
|
"body": {
|
|
@@ -692,7 +692,7 @@ export default defineMock({
|
|
|
692
692
|
```
|
|
693
693
|
|
|
694
694
|
**exp:** Graphql
|
|
695
|
-
```ts
|
|
695
|
+
``` ts
|
|
696
696
|
import { buildSchema, graphql } from 'graphql'
|
|
697
697
|
|
|
698
698
|
const schema = buildSchema(`
|
|
@@ -713,7 +713,7 @@ export default defineMock({
|
|
|
713
713
|
})
|
|
714
714
|
```
|
|
715
715
|
|
|
716
|
-
```ts
|
|
716
|
+
``` ts
|
|
717
717
|
fetch('/api/graphql', {
|
|
718
718
|
method: 'POST',
|
|
719
719
|
body: JSON.stringify({ source: '{ hello }' })
|
|
@@ -721,7 +721,7 @@ fetch('/api/graphql', {
|
|
|
721
721
|
```
|
|
722
722
|
|
|
723
723
|
**exp:** WebSocket Mock
|
|
724
|
-
```ts
|
|
724
|
+
``` ts
|
|
725
725
|
// ws.mock.ts
|
|
726
726
|
export default defineMock({
|
|
727
727
|
url: '/socket.io',
|
|
@@ -748,7 +748,7 @@ export default defineMock({
|
|
|
748
748
|
}
|
|
749
749
|
})
|
|
750
750
|
```
|
|
751
|
-
```ts
|
|
751
|
+
``` ts
|
|
752
752
|
// app.ts
|
|
753
753
|
const ws = new WebSocket('ws://localhost:5173/socket.io')
|
|
754
754
|
ws.addEventListener('open', () => {
|
|
@@ -769,7 +769,7 @@ In some scenarios, it may be necessary to use the data provided by mock services
|
|
|
769
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.
|
|
770
770
|
|
|
771
771
|
The default output is built into the directory `dist/mockServer`, generating files as follows:
|
|
772
|
-
```sh
|
|
772
|
+
``` sh
|
|
773
773
|
./mockServer
|
|
774
774
|
├── index.js
|
|
775
775
|
├── mock-data.js
|
package/README.zh-CN.md
CHANGED
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
- ⚙️ 随意开启或关闭对某个接口的 mock配置
|
|
40
40
|
- 📀 支持多种响应体数据类型,包括 `text/json/buffer/stream`.
|
|
41
41
|
- ⚖️ 使用 `server.proxy` 配置
|
|
42
|
-
- 🍕 支持在 mock文件中使用 `viteConfig.define`配置字段
|
|
42
|
+
- 🍕 支持在 mock文件中使用 `viteConfig.define`配置字段 和 `env` 环境变量
|
|
43
43
|
- ⚓️ 支持在 mock文件中使用 `viteConfig.resolve.alias` 路径别名
|
|
44
44
|
- 🌈 支持 `vite preview` 模式
|
|
45
45
|
- 📤 支持 multipart 类型,模拟文件上传
|
package/dist/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
`,
|
|
3
|
-
`)}};function
|
|
1
|
+
"use strict";var st=Object.create;var J=Object.defineProperty;var it=Object.getOwnPropertyDescriptor;var ct=Object.getOwnPropertyNames;var at=Object.getPrototypeOf,pt=Object.prototype.hasOwnProperty;var lt=(e,o)=>{for(var t in o)J(e,t,{get:o[t],enumerable:!0})},xe=(e,o,t,r)=>{if(o&&typeof o=="object"||typeof o=="function")for(let n of ct(o))!pt.call(e,n)&&n!==t&&J(e,n,{get:()=>o[n],enumerable:!(r=it(o,n))||r.enumerable});return e};var f=(e,o,t)=>(t=e!=null?st(at(e)):{},xe(o||!e||!e.__esModule?J(t,"default",{value:e,enumerable:!0}):t,e)),ut=e=>xe(J({},"__esModule",{value:!0}),e);var $t={};lt($t,{baseMiddleware:()=>me,createDefineMock:()=>It,default:()=>Lt,defineMock:()=>Et,mockDevServerPlugin:()=>Me,mockWebSocket:()=>ve,transformMockData:()=>de});module.exports=ut($t);var mt=()=>typeof document>"u"?new URL("file:"+__filename).href:document.currentScript&&document.currentScript.src||new URL("main.js",document.baseURI).href,h=mt();var Ie=f(require("fs"),1),q=f(require("fs/promises"),1),$=f(require("path"),1),Le=require("esbuild"),$e=f(require("fast-glob"),1),Fe=f(require("is-core-module"),1),te=require("vite");var Se="vite-plugin-mock-dev-server",Oe="1.1.13";var dt=/import\.meta\.env\.(.+)/;function z(e){let o={},t=process.env.NODE_ENV||e.mode;Object.assign(o,{"process.env.NODE_ENV":JSON.stringify(t),"global.process.env.NODE_ENV":JSON.stringify(t),"globalThis.process.env.NODE_ENV":JSON.stringify(t),__vite_process_env_NODE_ENV:JSON.stringify(t)});let r={},n={};for(let c in e.define){let a=e.define[c];r[c]=typeof a=="string"?a:JSON.stringify(a);let m=c.match(dt);m&&(n[m[1]]=`__vite__define__${r[c]}`)}let s={},i={};s["import.meta.hot"]="undefined";for(let c in e.env)s[`import.meta.env.${c}`]=JSON.stringify(e.env[c]);return Object.assign(i,{"import.meta.env":JSON.stringify({...e.env,...n}).replace(/"__vite__define__(.+?)"([,}])/g,(c,a,m)=>`${a.replace(/(^\\")|(\\"$)/g,'"')}${m}`)}),{...s,...r,...i,...o}}var se=f(require("fs/promises"),1),Pe=f(require("path"),1),Re=f(require("json5"),1),G={name:"externalize-deps",setup(e){e.onResolve({filter:/.*/},({path:o})=>{if(o[0]!=="."&&!Pe.default.isAbsolute(o))return{external:!0}})}},Q={name:"json5-loader",setup(e){e.onLoad({filter:/\.json5$/},async({path:o})=>{let t=await se.default.readFile(o,"utf-8");return{contents:`export default ${JSON.stringify(Re.default.parse(t))}`,loader:"js"}})}},V={name:"json-loader",setup(e){e.onLoad({filter:/\.json$/},async({path:o})=>({contents:`export default ${await se.default.readFile(o,"utf-8")}`,loader:"js"}))}},K=e=>({name:"alias-plugin",setup(o){o.onResolve({filter:/.*/},async({path:t})=>{let r=e.find(({find:c})=>ft(c,t));if(!r)return null;let{find:n,replacement:s}=r;return{path:(await o.resolve(t.replace(n,s),{kind:"import-statement",resolveDir:s,namespace:"file"})).path,external:!1}})}});function ft(e,o){return e instanceof RegExp?e.test(o):o.length<e.length?!1:o===e?!0:o.startsWith(`${e}/`)}var X=f(require("fs"),1),Y=f(require("path"),1),je=require("url"),Ce=f(require("debug"),1),We=require("path-to-regexp"),ie=f(require("picocolors"),1),S=e=>Array.isArray(e),j=e=>typeof e=="function",gt=e=>Object.prototype.toString.call(e)==="[object Object]",ce=e=>gt(e)&&Object.keys(e).length===0,kt=e=>e!==null&&typeof e=="object"&&typeof e.pipe=="function",De=e=>kt(e)&&e.readable!==!1&&typeof e._read=="function"&&typeof e._readableState=="object";function _e(e){return new Promise(o=>setTimeout(o,e))}function Ee(e){return Y.default.dirname((0,je.fileURLToPath)(e))}var C=(0,Ce.default)("vite:plugin-mock-dev-server"),w=e=>S(e)?e:e==null?[]:[e],W={info(...e){console.info(ie.default.cyan("mock-dev-server: "),...e)},error(...e){console.error(`
|
|
2
|
+
`,ie.default.cyan("mock-dev-server: "),...e,`
|
|
3
|
+
`)}};function U(e,o,t){for(let n of o){let s=Y.default.join(e,n);if(X.default.existsSync(s)&&X.default.statSync(s).isFile()){let i=t!=null&&t.pathOnly?s:X.default.readFileSync(s,"utf-8");if(!(t!=null&&t.predicate)||t.predicate(i))return i}}let r=Y.default.dirname(e);if(r!==e&&(!(t!=null&&t.rootDir)||r.startsWith(t==null?void 0:t.rootDir)))return U(r,o,t)}var Z=(e={})=>{let o=[],t=[];return Object.keys(e).forEach(r=>{var s,i;let n=e[r];typeof n=="string"||!n.ws&&!((s=n.target)!=null&&s.toString().startsWith("ws:"))&&!((i=n.target)!=null&&i.toString().startsWith("wss:"))?o.push(r):t.push(r)}),{httpProxies:o,wsProxies:t}};function ee(e,o){return e[0]==="^"&&new RegExp(e).test(o)||o.startsWith(e)}function A(e,o){return((0,We.match)(e,{decode:decodeURIComponent})(o)||{params:{}}).params||{}}async function Te(e,o,t){let r=w(t.include),n=w(t.exclude),s=z(o),{httpProxies:i}=Z(o.server.proxy||{});i.push(...w(t.prefix));let c=w(t.wsPrefix),a={};try{let u=U(o.root,["package.json"]);u&&(a=JSON.parse(u))}catch{}let m=t.build.dist,x=await Mt(process.cwd(),r,n),M=$.default.join(o.root,`mock-data-${Date.now()}.js`);await q.default.writeFile(M,x,"utf-8");let{code:N,deps:_}=await bt(M,s,o.resolve.alias),p=yt(_);await q.default.unlink(M);let l=[{filename:$.default.join(m,"mock-data.js"),source:N},{filename:$.default.join(m,"index.js"),source:ht(i,c,t.cookiesOptions,t.build.serverPort)},{filename:$.default.join(m,"package.json"),source:vt(a,p)}];try{if($.default.isAbsolute(m)){await q.default.rm(m,{recursive:!0}),Ie.default.mkdirSync(m,{recursive:!0});for(let{filename:u,source:d}of l)await q.default.writeFile(u,d,"utf-8")}else for(let{filename:u,source:d}of l)e.emitFile({type:"asset",fileName:u,source:d})}catch{}}function yt(e){let o=new Set,t=[Se,"connect","cors"];return Object.keys(e).forEach(r=>{e[r].imports.filter(s=>s.external).map(s=>s.path).forEach(s=>{!t.includes(s)&&!(0,Fe.default)(s)&&o.add(s)})}),Array.from(o)}function vt(e,o){let{dependencies:t={},devDependencies:r={}}=e,n={...t,...r},s={name:"mock-server",type:"module",scripts:{start:"node index.js"},dependencies:{connect:"^3.7.0","vite-plugin-mock-dev-server":`^${Oe}`,cors:"^2.8.5"},pnpm:{peerDependencyRules:{ignoreMissing:["vite"]}}};return o.forEach(i=>{s.dependencies[i]=n[i]||"latest"}),JSON.stringify(s,null,2)}function ht(e,o,t={},r=8080){return`import { createServer } from 'node:http';
|
|
4
4
|
import connect from 'connect';
|
|
5
5
|
import corsMiddleware from 'cors';
|
|
6
6
|
import { baseMiddleware, mockWebSocket } from 'vite-plugin-mock-dev-server';
|
|
@@ -24,8 +24,8 @@ app.use(baseMiddleware({ mockData }, {
|
|
|
24
24
|
server.listen(${r});
|
|
25
25
|
|
|
26
26
|
console.log('listen: http://localhost:${r}');
|
|
27
|
-
`}async function
|
|
28
|
-
`,c+=`m${
|
|
27
|
+
`}async function Mt(e,o,t){let r=await(0,$e.default)(o,{cwd:e}),n=(0,te.createFilter)(o,t,{resolve:!1}),s=r.filter(n),i="",c="";return s.forEach((a,m)=>{let x=(0,te.normalizePath)($.default.join(e,a));i+=`import * as m${m} from '${x}';
|
|
28
|
+
`,c+=`m${m}, `}),`import { transformMockData } from 'vite-plugin-mock-dev-server';
|
|
29
29
|
${i}
|
|
30
30
|
const exporters = [${c}];
|
|
31
31
|
const mockList = exporters.map((raw) => {
|
|
@@ -42,10 +42,10 @@ const mockList = exporters.map((raw) => {
|
|
|
42
42
|
}
|
|
43
43
|
return mockConfig
|
|
44
44
|
});
|
|
45
|
-
export default transformMockData(mockList);`}async function
|
|
46
|
-
`,`file: ${
|
|
47
|
-
`,`file: ${
|
|
48
|
-
`,`file: ${
|
|
49
|
-
`,
|
|
50
|
-
`,r)}}function
|
|
51
|
-
`,
|
|
45
|
+
export default transformMockData(mockList);`}async function bt(e,o,t){var r;try{let n=await(0,Le.build)({entryPoints:[e],outfile:"out.js",write:!1,target:["node14.18","node16"],platform:"node",bundle:!0,metafile:!0,format:"esm",define:o,plugins:[K(t),G,Q,V]});return{code:n.outputFiles[0].text,deps:((r=n.metafile)==null?void 0:r.inputs)||{}}}catch(n){console.error(n)}return{code:"",deps:{}}}var pe=require("buffer"),le=require("url"),qe=f(require("cookies"),1),Be=f(require("http-status"),1),Je=f(require("lodash.sortby"),1),B=f(require("mime-types"),1),ue=require("path-to-regexp"),P=f(require("picocolors"),1);var oe=f(require("co-body"),1),Ne=f(require("formidable"),1);async function He(e,o){var n;let t=e.method.toUpperCase();if(["GET","DELETE","HEAD"].includes(t))return;let r=((n=e.headers["content-type"])==null?void 0:n.toLocaleLowerCase())||"";try{if(r.startsWith("application/json"))return await oe.default.json(e);if(r.startsWith("application/x-www-form-urlencoded"))return await oe.default.form(e);if(r.startsWith("text/plain"))return await oe.default.text(e);if(r.startsWith("multipart/form-data"))return await xt(e,o)}catch(s){console.error(s)}}async function xt(e,o){let t=(0,Ne.default)(o);return new Promise((r,n)=>{t.parse(e,(s,i,c)=>{if(s){n(s);return}r({...i,...c})})})}function Ue(e,o){return F(e.headers,o.headers)&&F(e.body,o.body)&&F(e.params,o.params)&&F(e.query,o.query)&&F(e.refererQuery,o.refererQuery)}function F(e,o){if(!o)return!0;for(let t in o)if(o[t]!==e[t])return!1;return!0}var wt=/:/g;function me(e,{formidableOptions:o={},proxies:t,cookiesOptions:r}){return async function(n,s,i){let c=Date.now(),{query:a,pathname:m}=(0,le.parse)(n.url,!0);if(!m||t.length===0||!t.some(v=>ee(v,n.url)))return i();let x=e.mockData,M=(0,Je.default)(Object.keys(x),v=>{var H;return((H=v.match(wt))==null?void 0:H.length)||0}).find(v=>(0,ue.pathToRegexp)(v).test(m));if(!M)return i();let{query:N}=(0,le.parse)(n.headers.referer||"",!0),_=await He(n,o),p=new qe.default(n,s,r),l=p.get.bind(p),u=n.method.toUpperCase(),d=St(x[M],{pathname:m,method:u,request:{query:a,refererQuery:N,body:_,headers:n.headers,getCookie:l}});if(!d)return i();C("middleware: ",u,n.url);let g=n,k=s;g.body=_,g.query=a,g.refererQuery=N,g.params=A(d.url,m),g.getCookie=l,k.setCookie=p.set.bind(p);let{body:y,delay:O,type:R="json",response:E,status:I=200,statusText:L}=d;if(ae(k,I,L),await Ot(g,k,d),await Pt(g,k,d),y){try{let v=j(y)?await y(g):y;await Ae(c,O),Rt(k,v,R)}catch(v){W.error(`${P.default.red("[body error]")} ${n.url}
|
|
46
|
+
`,`file: ${P.default.cyan(d.__filepath__)}`,v),ae(k,500),s.end("")}return}if(E){try{await Ae(c,O),await E(g,k,i)}catch(v){W.error(`${P.default.red("[response error]")} ${n.url}
|
|
47
|
+
`,`file: ${P.default.cyan(d.__filepath__)}`,v),ae(k,500),s.end("")}return}s.end("")}}function St(e,{pathname:o,method:t,request:r}){return e.find(n=>{if(!o||!n||!n.url||n.ws===!0||!(n.method?S(n.method)?n.method:[n.method]:["GET","POST"]).includes(t))return!1;let i=(0,ue.pathToRegexp)(n.url).test(o);if(i&&n.validator){let c=A(n.url,o);if(j(n.validator))return n.validator({params:c,...r});try{return Ue({params:c,...r},n.validator)}catch(a){return W.error(`${P.default.red("[validator error]")} ${o}
|
|
48
|
+
`,`file: ${P.default.cyan(n.__filepath__)}`,a),!1}}return i})}function ae(e,o=200,t){e.statusCode=o,e.statusMessage=t||jt(o)}async function Ot(e,o,t){let{headers:r,type:n="json"}=t,s=t.__filepath__,i=B.contentType(n)||B.contentType(B.lookup(n)||"");if(i&&o.setHeader("Content-Type",i),o.setHeader("Cache-Control","no-cache,max-age=0"),o.setHeader("X-Mock-Power-By","vite-plugin-mock-dev-server"),o.setHeader("X-File-Path",s),!!r)try{let c=j(r)?await r(e):r;Object.keys(c).forEach(a=>{o.setHeader(a,c[a])})}catch(c){W.error(`${P.default.red("[headers error]")} ${e.url}
|
|
49
|
+
`,c)}}async function Pt(e,o,{cookies:t}){if(t)try{let r=j(t)?await t(e):t;Object.keys(r).forEach(n=>{let s=r[n];if(S(s)){let[i,c]=s;o.setCookie(n,i,c)}else o.setCookie(n,s)})}catch(r){W.error(`${P.default.red("[cookies error]")} ${e.url}
|
|
50
|
+
`,r)}}function Rt(e,o,t){if(De(o))o.pipe(e);else if(pe.Buffer.isBuffer(o))e.end(t==="text"||t==="json"?o.toString("utf-8"):o);else{let r=typeof o=="string"?o:JSON.stringify(o);e.end(t==="buffer"?pe.Buffer.from(r):r)}}async function Ae(e,o){if(!o||o<=0)return;let t=Date.now()-e,r=o-t;r>0&&await _e(r)}function jt(e){return Be.default[e]||"Unknown"}var Qe=f(require("events"),1),re=f(require("fs"),1),Ve=require("module"),fe=f(require("path"),1),Ke=require("url"),ge=f(require("chokidar"),1),Xe=require("esbuild"),Ye=f(require("fast-glob"),1),D=require("vite");var ze=require("url"),Ge=f(require("lodash.sortby"),1);function de(e){let o=[];for(let[,r]of e.entries())r&&(S(r)?o.push(...r):o.push(r));let t={};return o.filter(r=>(r.enabled||typeof r.enabled>"u")&&r.url).forEach(r=>{let{pathname:n,query:s}=(0,ze.parse)(r.url,!0),i=t[n]??(t[n]=[]),c={...r,url:n};if(c.ws!==!0){let a=c.validator;ce(s)||(j(a)?c.validator=function(m){return F(m.query,s)&&a(m)}:a?(c.validator={...a},c.validator.query=c.validator.query?{...s,...c.validator.query}:s):c.validator={query:s})}i.push(c)}),Object.keys(t).forEach(r=>{t[r]=(0,Ge.default)(t[r],n=>{if(n.ws===!0)return 0;let{validator:s}=n;return!s||ce(s)?2:j(s)?0:1/Object.keys(s).reduce((c,a)=>c+Ct(s[a]),0)})}),t}function Ct(e){return e?Object.keys(e).length:0}var Wt=Ee(h),T=(0,Ve.createRequire)(Wt),ne=class extends Qe.default{constructor(t){super();this.options=t;this.moduleCache=new Map;this.moduleDeps=new Map;this.moduleType="cjs";this._mockData={};this.cwd=t.cwd||process.cwd();try{let r=U(this.cwd,["package.json"]);this.moduleType=r&&JSON.parse(r).type==="module"?"esm":"cjs"}catch{}}get mockData(){return this._mockData}load(){let{include:t,exclude:r}=this.options,n=(0,D.createFilter)(t,r,{resolve:!1});(0,Ye.default)(t,{cwd:this.cwd}).then(i=>Promise.all(i.filter(n).map(c=>this.loadMock(c)))).then(()=>this.updateMockList()),this.watchMockEntry(),this.watchDeps();let s=null;this.on("mock:update",async i=>{n(i)&&(await this.loadMock(i),s&&clearImmediate(s),s=setImmediate(()=>{this.updateMockList(),this.emit("mock:update-end",i),s=null}))}),this.on("mock:unlink",async i=>{n(i)&&(this.moduleCache.delete(i),this.updateMockList(),this.emit("mock:update-end",i))})}watchMockEntry(){let{include:t}=this.options,[r,...n]=t,s=ge.default.watch(r,{ignoreInitial:!0,cwd:this.cwd});n.length>0&&n.forEach(i=>s.add(i)),s.on("add",async i=>{i=(0,D.normalizePath)(i),this.emit("mock:update",i),C("watcher:add",i)}),s.on("change",async i=>{i=(0,D.normalizePath)(i),this.emit("mock:update",i),C("watcher:change",i)}),s.on("unlink",async i=>{i=(0,D.normalizePath)(i),this.emit("mock:unlink",i),C("watcher:unlink",i)}),this.mockWatcher=s}watchDeps(){let t=[];this.depsWatcher=ge.default.watch([],{ignoreInitial:!0,cwd:this.cwd}),this.depsWatcher.on("change",r=>{r=(0,D.normalizePath)(r);let n=this.moduleDeps.get(r);n&&n.forEach(s=>{this.emit("mock:update",s)})}),this.depsWatcher.on("unlink",r=>{r=(0,D.normalizePath)(r),this.moduleDeps.delete(r)}),this.on("update:deps",()=>{let r=[];for(let[s]of this.moduleDeps.entries())r.push(s);let n=r.filter(s=>!t.includes(s));n.length>0&&this.depsWatcher.add(n)})}close(){var t,r;(t=this.mockWatcher)==null||t.close(),(r=this.depsWatcher)==null||r.close()}updateMockList(){this._mockData=de(this.moduleCache)}updateModuleDeps(t,r){Object.keys(r).forEach(n=>{r[n].imports.map(i=>i.path).forEach(i=>{this.moduleDeps.has(i)||this.moduleDeps.set(i,new Set),this.moduleDeps.get(i).add(t)})}),this.emit("update:deps")}async loadMock(t){if(!t)return;let r=!1;/\.m[jt]s$/.test(t)?r=!0:/\.c[jt]s$/.test(t)?r=!1:r=this.moduleType==="esm";let{code:n,deps:s}=await this.transformWithEsbuild(t,r);try{let i=await this.loadFromCode(t,n,r)||{},c;i.default?c=i.default:(c=[],Object.keys(i).forEach(a=>{S(i[a])?c.push(...i[a]):c.push(i[a])})),S(c)?c.forEach(a=>a.__filepath__=t):c.__filepath__=t,this.moduleCache.set(t,c),this.updateModuleDeps(t,s)}catch(i){console.error(i)}}async loadFromCode(t,r,n){if(n){let s=`${t}.timestamp-${Date.now()}`,i=`${s}.mjs`,c=`${(0,Ke.pathToFileURL)(s)}.mjs`;await re.default.promises.writeFile(i,r,"utf8");try{return await import(c)}finally{try{re.default.unlinkSync(i)}catch{}}}else{t=fe.default.resolve(this.cwd,t);let s=fe.default.extname(t),i=re.default.realpathSync(t),c=s in T.extensions?s:".js",a=T.extensions[c];T.extensions[c]=(x,M)=>{M===i?x._compile(r,M):a(x,M)},delete T.cache[T.resolve(t)];let m=T(t);return T.extensions[c]=a,m.__esModule?m:{default:m}}}async transformWithEsbuild(t,r){var n;try{let s=await(0,Xe.build)({entryPoints:[t],outfile:"out.js",write:!1,target:["node14.18","node16"],platform:"node",bundle:!0,metafile:!0,format:r?"esm":"cjs",define:this.options.define,plugins:[K(this.options.alias),G,V,Q]});return{code:s.outputFiles[0].text,deps:((n=s.metafile)==null?void 0:n.inputs)||{}}}catch(s){console.error(s)}return{code:"",deps:{}}}};var ke=require("url"),et=f(require("cookies"),1),ye=require("path-to-regexp"),tt=f(require("picocolors"),1),ot=require("ws");function ve(e,o,t,r){var _;let n=new Map,s=new Map,i=new WeakMap,c=p=>{let l=s.get(p);return!l&&s.set(p,l=new Map),l},a=(p,l)=>{let u=p.get(l);return!u&&p.set(l,u=new ot.WebSocketServer({noServer:!0})),u},m=(p,l)=>{let u=n.get(p);!u&&n.set(p,u=new Set),u.add(l)},x=(p,l,u,d,g,k)=>{var y;try{(y=u.setup)==null||y.call(u,l,d),l.on("close",()=>p.delete(g))}catch(O){W.error(`${tt.default.red("[websocket server error]")} ${k}
|
|
51
|
+
`,O)}},M=(p,l,u,d)=>{p.emit("connection",l,u),l.on("close",()=>{let g=d.findIndex(k=>k.ws===l);g!==-1&&d.splice(g,1)})},N=(p,l,u,d,g)=>{let{cleanupList:k,connectionList:y,context:O}=i.get(l);Ze(k),y.forEach(({ws:R})=>R.removeAllListeners()),l.removeAllListeners(),x(p,l,u,O,d,g),y.forEach(({ws:R,req:E})=>M(l,R,E,y))};(_=e.on)==null||_.call(e,"mock:update-end",p=>{if(!n.has(p))return;let l=n.get(p);if(l)for(let u of l.values())for(let d of e.mockData[u]){if(!d.ws||d.__filepath__!==p)return;let g=c(u);for(let[k,y]of g.entries())N(g,y,d,k,p)}}),o==null||o.on("upgrade",(p,l,u)=>{let{pathname:d,query:g}=(0,ke.parse)(p.url,!0);if(!d||t.length===0||!t.some(b=>ee(b,p.url)))return;let k=e.mockData,y=Object.keys(k).find(b=>(0,ye.pathToRegexp)(b).test(d));if(!y)return;let O=k[y].find(b=>b.url&&b.ws&&(0,ye.pathToRegexp)(b.url).test(d));if(!O)return;let R=O.__filepath__;m(R,y);let E=c(y),I=a(E,d),L=i.get(I);if(!L){let b=[],be={onCleanup:nt=>b.push(nt)};L={cleanupList:b,context:be,connectionList:[]},i.set(I,L),x(E,I,O,be,d,R)}let v=p,H=new et.default(p,p,r),{query:rt}=(0,ke.parse)(p.headers.referer||"",!0);v.query=g,v.refererQuery=rt,v.params=A(y,d),v.getCookie=H.get.bind(H),I.handleUpgrade(v,l,u,b=>{C(`websocket-mock: ${p.url} connected`),L.connectionList.push({req:v,ws:b}),M(I,b,v,L.connectionList)})}),o==null||o.on("close",()=>{for(let p of s.values()){for(let l of p.values()){let u=i.get(l);Ze(u.cleanupList),l.close()}p.clear()}s.clear(),n.clear()})}function Ze(e){let o;for(;o=e.shift();)o==null||o()}async function he(e,o,t,r){let n=new ne({include:w(o.include),exclude:w(o.exclude),define:z(e),alias:e.resolve.alias});n.load(),n.on("mock:update-end",()=>{o.reload&&(r==null||r.send({type:"full-reload"}))}),t==null||t.on("close",()=>n.close());let{httpProxies:s}=Z(e.server.proxy||{}),i=w(o.prefix);return ve(n,t,w(o.wsPrefix),o.cookiesOptions),me(n,{formidableOptions:o.formidableOptions,proxies:[...i,...s],cookiesOptions:o.cookiesOptions})}function Me({prefix:e=[],wsPrefix:o=[],include:t=["mock/**/*.mock.{js,ts,cjs,mjs,json,json5}"],exclude:r=["**/node_modules/**","**/.vscode/**","**/.git/**"],reload:n=!1,formidableOptions:s={},build:i=!1,cookiesOptions:c={}}={}){let a={prefix:e,wsPrefix:o,include:t,exclude:r,reload:n,cookiesOptions:c,formidableOptions:{multiples:!0,...s},build:i?Object.assign({serverPort:8080,dist:"mockServer"},typeof i=="object"?i:{}):!1},m=[_t(a)];return a.build&&m.push(Dt(a)),m}function Dt(e){let o={};return{name:"vite-plugin-mock-dev-server-generator",enforce:"post",apply:"build",configResolved(t){o=t,t.logger.warn("")},async buildEnd(t){t||o.command==="build"&&await Te(this,o,e)}}}function _t(e){let o={};return{name:"vite-plugin-mock-dev-server",enforce:"pre",apply:"serve",config(t){var s;let r=w(e.wsPrefix);if(r.length===0||!((s=t.server)!=null&&s.proxy)||Object.keys(t.server.proxy).length===0)return;let n={};Object.keys(t.server.proxy).forEach(i=>{r.includes(i)||(n[i]=t.server.proxy[i])}),t.server.proxy=n},configResolved(t){o=t,t.logger.warn("")},async configureServer({middlewares:t,config:r,httpServer:n,ws:s}){let i=await he(r,e,n,s);t.use(i)},async configurePreviewServer({middlewares:t,httpServer:r}){let n=await he(o,e,r);t.use(n)}}}function Et(e){return e}function It(e){return t=>(S(t)?t=t.map(r=>e(r)||r):t=e(t)||t,t)}var Lt=Me;0&&(module.exports={baseMiddleware,createDefineMock,defineMock,mockDevServerPlugin,mockWebSocket,transformMockData});
|
package/dist/index.d.ts
CHANGED
|
@@ -410,12 +410,12 @@ type FormidableFile = formidable.File | formidable.File[];
|
|
|
410
410
|
declare function mockDevServerPlugin({ prefix, wsPrefix, include, exclude, reload, formidableOptions, build, cookiesOptions, }?: MockServerPluginOptions): Plugin[];
|
|
411
411
|
|
|
412
412
|
/**
|
|
413
|
-
* mock config helper
|
|
414
|
-
*
|
|
415
|
-
* mock配置辅助函数
|
|
413
|
+
* mock config Type helper
|
|
416
414
|
*
|
|
415
|
+
* mock配置 类型帮助函数
|
|
417
416
|
* @param config
|
|
418
417
|
* @example
|
|
418
|
+
* Mock Http Request
|
|
419
419
|
* ```ts
|
|
420
420
|
* export default defineMock({
|
|
421
421
|
* url: '/api/example',
|
|
@@ -423,16 +423,39 @@ declare function mockDevServerPlugin({ prefix, wsPrefix, include, exclude, reloa
|
|
|
423
423
|
* body: { a: 1 },
|
|
424
424
|
* })
|
|
425
425
|
* ```
|
|
426
|
+
* @example
|
|
427
|
+
* Mock WebSocket
|
|
428
|
+
* ```ts
|
|
429
|
+
* export default defineMock({
|
|
430
|
+
* url: '/socket.io',
|
|
431
|
+
* ws: true,
|
|
432
|
+
* setup(wss) {
|
|
433
|
+
* wss.on('connection', (ws) => {
|
|
434
|
+
* ws.on('message', (rawData) => console.log(rawData))
|
|
435
|
+
* ws.send('data')
|
|
436
|
+
* })
|
|
437
|
+
* },
|
|
438
|
+
* })
|
|
439
|
+
* ```
|
|
426
440
|
*/
|
|
427
441
|
declare function defineMock(config: MockHttpItem): MockHttpItem;
|
|
428
442
|
declare function defineMock(config: MockOptions): MockOptions;
|
|
429
443
|
declare function defineMock(config: MockWebsocketItem): MockWebsocketItem;
|
|
430
444
|
/**
|
|
431
|
-
* 返回一个自定义的 defineMock 函数,用于支持对 mock config 的预处理。
|
|
432
|
-
*
|
|
433
445
|
* Return a custom defineMock function to support preprocessing of mock config.
|
|
434
446
|
*
|
|
447
|
+
* 返回一个自定义的 defineMock 函数,用于支持对 mock config 的预处理。
|
|
435
448
|
* @param transformer preprocessing function
|
|
449
|
+
* @example
|
|
450
|
+
* ```ts
|
|
451
|
+
* const definePostMock = createDefineMock((mock) => {
|
|
452
|
+
* mock.url = '/api/post/' + mock.url
|
|
453
|
+
* })
|
|
454
|
+
* export default definePostMock({
|
|
455
|
+
* url: 'list',
|
|
456
|
+
* body: [{ title: '1' }, { title: '2' }],
|
|
457
|
+
* })
|
|
458
|
+
* ```
|
|
436
459
|
*/
|
|
437
460
|
declare function createDefineMock(transformer: (mock: MockHttpItem | MockWebsocketItem) => MockHttpItem | MockWebsocketItem | void): typeof defineMock;
|
|
438
461
|
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
2
|
-
`,
|
|
3
|
-
`)}};function
|
|
1
|
+
import Ue from"fs";import X from"fs/promises";import T from"path";import{build as qe}from"esbuild";import Be from"fast-glob";import Je from"is-core-module";import{createFilter as ze,normalizePath as Ge}from"vite";var ae="vite-plugin-mock-dev-server",pe="1.1.13";var Ee=/import\.meta\.env\.(.+)/;function B(t){let o={},e=process.env.NODE_ENV||t.mode;Object.assign(o,{"process.env.NODE_ENV":JSON.stringify(e),"global.process.env.NODE_ENV":JSON.stringify(e),"globalThis.process.env.NODE_ENV":JSON.stringify(e),__vite_process_env_NODE_ENV:JSON.stringify(e)});let r={},n={};for(let c in t.define){let a=t.define[c];r[c]=typeof a=="string"?a:JSON.stringify(a);let m=c.match(Ee);m&&(n[m[1]]=`__vite__define__${r[c]}`)}let s={},i={};s["import.meta.hot"]="undefined";for(let c in t.env)s[`import.meta.env.${c}`]=JSON.stringify(t.env[c]);return Object.assign(i,{"import.meta.env":JSON.stringify({...t.env,...n}).replace(/"__vite__define__(.+?)"([,}])/g,(c,a,m)=>`${a.replace(/(^\\")|(\\"$)/g,'"')}${m}`)}),{...s,...r,...i,...o}}import le from"fs/promises";import Ie from"path";import Le from"json5";var J={name:"externalize-deps",setup(t){t.onResolve({filter:/.*/},({path:o})=>{if(o[0]!=="."&&!Ie.isAbsolute(o))return{external:!0}})}},z={name:"json5-loader",setup(t){t.onLoad({filter:/\.json5$/},async({path:o})=>{let e=await le.readFile(o,"utf-8");return{contents:`export default ${JSON.stringify(Le.parse(e))}`,loader:"js"}})}},G={name:"json-loader",setup(t){t.onLoad({filter:/\.json$/},async({path:o})=>({contents:`export default ${await le.readFile(o,"utf-8")}`,loader:"js"}))}},Q=t=>({name:"alias-plugin",setup(o){o.onResolve({filter:/.*/},async({path:e})=>{let r=t.find(({find:c})=>$e(c,e));if(!r)return null;let{find:n,replacement:s}=r;return{path:(await o.resolve(e.replace(n,s),{kind:"import-statement",resolveDir:s,namespace:"file"})).path,external:!1}})}});function $e(t,o){return t instanceof RegExp?t.test(o):o.length<t.length?!1:o===t?!0:o.startsWith(`${t}/`)}import Z from"fs";import ee from"path";import{fileURLToPath as Fe}from"url";import Te from"debug";import{match as Ne}from"path-to-regexp";import ue from"picocolors";var S=t=>Array.isArray(t),j=t=>typeof t=="function",He=t=>Object.prototype.toString.call(t)==="[object Object]",te=t=>He(t)&&Object.keys(t).length===0,Ae=t=>t!==null&&typeof t=="object"&&typeof t.pipe=="function",me=t=>Ae(t)&&t.readable!==!1&&typeof t._read=="function"&&typeof t._readableState=="object";function de(t){return new Promise(o=>setTimeout(o,t))}function fe(t){return ee.dirname(Fe(t))}var C=Te("vite:plugin-mock-dev-server"),w=t=>S(t)?t:t==null?[]:[t],R={info(...t){console.info(ue.cyan("mock-dev-server: "),...t)},error(...t){console.error(`
|
|
2
|
+
`,ue.cyan("mock-dev-server: "),...t,`
|
|
3
|
+
`)}};function H(t,o,e){for(let n of o){let s=ee.join(t,n);if(Z.existsSync(s)&&Z.statSync(s).isFile()){let i=e!=null&&e.pathOnly?s:Z.readFileSync(s,"utf-8");if(!(e!=null&&e.predicate)||e.predicate(i))return i}}let r=ee.dirname(t);if(r!==t&&(!(e!=null&&e.rootDir)||r.startsWith(e==null?void 0:e.rootDir)))return H(r,o,e)}var V=(t={})=>{let o=[],e=[];return Object.keys(t).forEach(r=>{var s,i;let n=t[r];typeof n=="string"||!n.ws&&!((s=n.target)!=null&&s.toString().startsWith("ws:"))&&!((i=n.target)!=null&&i.toString().startsWith("wss:"))?o.push(r):e.push(r)}),{httpProxies:o,wsProxies:e}};function K(t,o){return t[0]==="^"&&new RegExp(t).test(o)||o.startsWith(t)}function A(t,o){return(Ne(t,{decode:decodeURIComponent})(o)||{params:{}}).params||{}}async function ge(t,o,e){let r=w(e.include),n=w(e.exclude),s=B(o),{httpProxies:i}=V(o.server.proxy||{});i.push(...w(e.prefix));let c=w(e.wsPrefix),a={};try{let u=H(o.root,["package.json"]);u&&(a=JSON.parse(u))}catch{}let m=e.build.dist,x=await Xe(process.cwd(),r,n),v=T.join(o.root,`mock-data-${Date.now()}.js`);await X.writeFile(v,x,"utf-8");let{code:F,deps:D}=await Ye(v,s,o.resolve.alias),p=Qe(D);await X.unlink(v);let l=[{filename:T.join(m,"mock-data.js"),source:F},{filename:T.join(m,"index.js"),source:Ke(i,c,e.cookiesOptions,e.build.serverPort)},{filename:T.join(m,"package.json"),source:Ve(a,p)}];try{if(T.isAbsolute(m)){await X.rm(m,{recursive:!0}),Ue.mkdirSync(m,{recursive:!0});for(let{filename:u,source:d}of l)await X.writeFile(u,d,"utf-8")}else for(let{filename:u,source:d}of l)t.emitFile({type:"asset",fileName:u,source:d})}catch{}}function Qe(t){let o=new Set,e=[ae,"connect","cors"];return Object.keys(t).forEach(r=>{t[r].imports.filter(s=>s.external).map(s=>s.path).forEach(s=>{!e.includes(s)&&!Je(s)&&o.add(s)})}),Array.from(o)}function Ve(t,o){let{dependencies:e={},devDependencies:r={}}=t,n={...e,...r},s={name:"mock-server",type:"module",scripts:{start:"node index.js"},dependencies:{connect:"^3.7.0","vite-plugin-mock-dev-server":`^${pe}`,cors:"^2.8.5"},pnpm:{peerDependencyRules:{ignoreMissing:["vite"]}}};return o.forEach(i=>{s.dependencies[i]=n[i]||"latest"}),JSON.stringify(s,null,2)}function Ke(t,o,e={},r=8080){return`import { createServer } from 'node:http';
|
|
4
4
|
import connect from 'connect';
|
|
5
5
|
import corsMiddleware from 'cors';
|
|
6
6
|
import { baseMiddleware, mockWebSocket } from 'vite-plugin-mock-dev-server';
|
|
@@ -24,8 +24,8 @@ app.use(baseMiddleware({ mockData }, {
|
|
|
24
24
|
server.listen(${r});
|
|
25
25
|
|
|
26
26
|
console.log('listen: http://localhost:${r}');
|
|
27
|
-
`}async function Xe(t,o,e){let r=await
|
|
28
|
-
`,c+=`m${
|
|
27
|
+
`}async function Xe(t,o,e){let r=await Be(o,{cwd:t}),n=ze(o,e,{resolve:!1}),s=r.filter(n),i="",c="";return s.forEach((a,m)=>{let x=Ge(T.join(t,a));i+=`import * as m${m} from '${x}';
|
|
28
|
+
`,c+=`m${m}, `}),`import { transformMockData } from 'vite-plugin-mock-dev-server';
|
|
29
29
|
${i}
|
|
30
30
|
const exporters = [${c}];
|
|
31
31
|
const mockList = exporters.map((raw) => {
|
|
@@ -42,10 +42,10 @@ const mockList = exporters.map((raw) => {
|
|
|
42
42
|
}
|
|
43
43
|
return mockConfig
|
|
44
44
|
});
|
|
45
|
-
export default transformMockData(mockList);`}async function Ye(t,o,e){var r;try{let n=await
|
|
46
|
-
`,`file: ${W.cyan(
|
|
47
|
-
`,`file: ${W.cyan(
|
|
48
|
-
`,`file: ${W.cyan(n.__filepath__)}`,
|
|
49
|
-
`,
|
|
50
|
-
`,r)}}function
|
|
51
|
-
`,
|
|
45
|
+
export default transformMockData(mockList);`}async function Ye(t,o,e){var r;try{let n=await qe({entryPoints:[t],outfile:"out.js",write:!1,target:["node14.18","node16"],platform:"node",bundle:!0,metafile:!0,format:"esm",define:o,plugins:[Q(e),J,z,G]});return{code:n.outputFiles[0].text,deps:((r=n.metafile)==null?void 0:r.inputs)||{}}}catch(n){console.error(n)}return{code:"",deps:{}}}import{Buffer as ve}from"buffer";import{parse as he}from"url";import tt from"cookies";import ot from"http-status";import rt from"lodash.sortby";import*as U from"mime-types";import{pathToRegexp as be}from"path-to-regexp";import W from"picocolors";import oe from"co-body";import Ze from"formidable";async function ke(t,o){var n;let e=t.method.toUpperCase();if(["GET","DELETE","HEAD"].includes(e))return;let r=((n=t.headers["content-type"])==null?void 0:n.toLocaleLowerCase())||"";try{if(r.startsWith("application/json"))return await oe.json(t);if(r.startsWith("application/x-www-form-urlencoded"))return await oe.form(t);if(r.startsWith("text/plain"))return await oe.text(t);if(r.startsWith("multipart/form-data"))return await et(t,o)}catch(s){console.error(s)}}async function et(t,o){let e=Ze(o);return new Promise((r,n)=>{e.parse(t,(s,i,c)=>{if(s){n(s);return}r({...i,...c})})})}function ye(t,o){return L(t.headers,o.headers)&&L(t.body,o.body)&&L(t.params,o.params)&&L(t.query,o.query)&&L(t.refererQuery,o.refererQuery)}function L(t,o){if(!o)return!0;for(let e in o)if(o[e]!==t[e])return!1;return!0}var nt=/:/g;function xe(t,{formidableOptions:o={},proxies:e,cookiesOptions:r}){return async function(n,s,i){let c=Date.now(),{query:a,pathname:m}=he(n.url,!0);if(!m||e.length===0||!e.some(y=>K(y,n.url)))return i();let x=t.mockData,v=rt(Object.keys(x),y=>{var N;return((N=y.match(nt))==null?void 0:N.length)||0}).find(y=>be(y).test(m));if(!v)return i();let{query:F}=he(n.headers.referer||"",!0),D=await ke(n,o),p=new tt(n,s,r),l=p.get.bind(p),u=n.method.toUpperCase(),d=st(x[v],{pathname:m,method:u,request:{query:a,refererQuery:F,body:D,headers:n.headers,getCookie:l}});if(!d)return i();C("middleware: ",u,n.url);let f=n,g=s;f.body=D,f.query=a,f.refererQuery=F,f.params=A(d.url,m),f.getCookie=l,g.setCookie=p.set.bind(p);let{body:k,delay:O,type:P="json",response:_,status:E=200,statusText:I}=d;if(re(g,E,I),await it(f,g,d),await ct(f,g,d),k){try{let y=j(k)?await k(f):k;await Me(c,O),at(g,y,P)}catch(y){R.error(`${W.red("[body error]")} ${n.url}
|
|
46
|
+
`,`file: ${W.cyan(d.__filepath__)}`,y),re(g,500),s.end("")}return}if(_){try{await Me(c,O),await _(f,g,i)}catch(y){R.error(`${W.red("[response error]")} ${n.url}
|
|
47
|
+
`,`file: ${W.cyan(d.__filepath__)}`,y),re(g,500),s.end("")}return}s.end("")}}function st(t,{pathname:o,method:e,request:r}){return t.find(n=>{if(!o||!n||!n.url||n.ws===!0||!(n.method?S(n.method)?n.method:[n.method]:["GET","POST"]).includes(e))return!1;let i=be(n.url).test(o);if(i&&n.validator){let c=A(n.url,o);if(j(n.validator))return n.validator({params:c,...r});try{return ye({params:c,...r},n.validator)}catch(a){return R.error(`${W.red("[validator error]")} ${o}
|
|
48
|
+
`,`file: ${W.cyan(n.__filepath__)}`,a),!1}}return i})}function re(t,o=200,e){t.statusCode=o,t.statusMessage=e||pt(o)}async function it(t,o,e){let{headers:r,type:n="json"}=e,s=e.__filepath__,i=U.contentType(n)||U.contentType(U.lookup(n)||"");if(i&&o.setHeader("Content-Type",i),o.setHeader("Cache-Control","no-cache,max-age=0"),o.setHeader("X-Mock-Power-By","vite-plugin-mock-dev-server"),o.setHeader("X-File-Path",s),!!r)try{let c=j(r)?await r(t):r;Object.keys(c).forEach(a=>{o.setHeader(a,c[a])})}catch(c){R.error(`${W.red("[headers error]")} ${t.url}
|
|
49
|
+
`,c)}}async function ct(t,o,{cookies:e}){if(e)try{let r=j(e)?await e(t):e;Object.keys(r).forEach(n=>{let s=r[n];if(S(s)){let[i,c]=s;o.setCookie(n,i,c)}else o.setCookie(n,s)})}catch(r){R.error(`${W.red("[cookies error]")} ${t.url}
|
|
50
|
+
`,r)}}function at(t,o,e){if(me(o))o.pipe(t);else if(ve.isBuffer(o))t.end(e==="text"||e==="json"?o.toString("utf-8"):o);else{let r=typeof o=="string"?o:JSON.stringify(o);t.end(e==="buffer"?ve.from(r):r)}}async function Me(t,o){if(!o||o<=0)return;let e=Date.now()-t,r=o-e;r>0&&await de(r)}function pt(t){return ot[t]||"Unknown"}import dt from"events";import ne from"fs";import{createRequire as ft}from"module";import Se from"path";import{pathToFileURL as gt}from"url";import Oe from"chokidar";import{build as kt}from"esbuild";import yt from"fast-glob";import{createFilter as vt,normalizePath as q}from"vite";import{parse as lt}from"url";import ut from"lodash.sortby";function we(t){let o=[];for(let[,r]of t.entries())r&&(S(r)?o.push(...r):o.push(r));let e={};return o.filter(r=>(r.enabled||typeof r.enabled>"u")&&r.url).forEach(r=>{let{pathname:n,query:s}=lt(r.url,!0),i=e[n]??(e[n]=[]),c={...r,url:n};if(c.ws!==!0){let a=c.validator;te(s)||(j(a)?c.validator=function(m){return L(m.query,s)&&a(m)}:a?(c.validator={...a},c.validator.query=c.validator.query?{...s,...c.validator.query}:s):c.validator={query:s})}i.push(c)}),Object.keys(e).forEach(r=>{e[r]=ut(e[r],n=>{if(n.ws===!0)return 0;let{validator:s}=n;return!s||te(s)?2:j(s)?0:1/Object.keys(s).reduce((c,a)=>c+mt(s[a]),0)})}),e}function mt(t){return t?Object.keys(t).length:0}var ht=fe(import.meta.url),$=ft(ht),Y=class extends dt{constructor(e){super();this.options=e;this.moduleCache=new Map;this.moduleDeps=new Map;this.moduleType="cjs";this._mockData={};this.cwd=e.cwd||process.cwd();try{let r=H(this.cwd,["package.json"]);this.moduleType=r&&JSON.parse(r).type==="module"?"esm":"cjs"}catch{}}get mockData(){return this._mockData}load(){let{include:e,exclude:r}=this.options,n=vt(e,r,{resolve:!1});yt(e,{cwd:this.cwd}).then(i=>Promise.all(i.filter(n).map(c=>this.loadMock(c)))).then(()=>this.updateMockList()),this.watchMockEntry(),this.watchDeps();let s=null;this.on("mock:update",async i=>{n(i)&&(await this.loadMock(i),s&&clearImmediate(s),s=setImmediate(()=>{this.updateMockList(),this.emit("mock:update-end",i),s=null}))}),this.on("mock:unlink",async i=>{n(i)&&(this.moduleCache.delete(i),this.updateMockList(),this.emit("mock:update-end",i))})}watchMockEntry(){let{include:e}=this.options,[r,...n]=e,s=Oe.watch(r,{ignoreInitial:!0,cwd:this.cwd});n.length>0&&n.forEach(i=>s.add(i)),s.on("add",async i=>{i=q(i),this.emit("mock:update",i),C("watcher:add",i)}),s.on("change",async i=>{i=q(i),this.emit("mock:update",i),C("watcher:change",i)}),s.on("unlink",async i=>{i=q(i),this.emit("mock:unlink",i),C("watcher:unlink",i)}),this.mockWatcher=s}watchDeps(){let e=[];this.depsWatcher=Oe.watch([],{ignoreInitial:!0,cwd:this.cwd}),this.depsWatcher.on("change",r=>{r=q(r);let n=this.moduleDeps.get(r);n&&n.forEach(s=>{this.emit("mock:update",s)})}),this.depsWatcher.on("unlink",r=>{r=q(r),this.moduleDeps.delete(r)}),this.on("update:deps",()=>{let r=[];for(let[s]of this.moduleDeps.entries())r.push(s);let n=r.filter(s=>!e.includes(s));n.length>0&&this.depsWatcher.add(n)})}close(){var e,r;(e=this.mockWatcher)==null||e.close(),(r=this.depsWatcher)==null||r.close()}updateMockList(){this._mockData=we(this.moduleCache)}updateModuleDeps(e,r){Object.keys(r).forEach(n=>{r[n].imports.map(i=>i.path).forEach(i=>{this.moduleDeps.has(i)||this.moduleDeps.set(i,new Set),this.moduleDeps.get(i).add(e)})}),this.emit("update:deps")}async loadMock(e){if(!e)return;let r=!1;/\.m[jt]s$/.test(e)?r=!0:/\.c[jt]s$/.test(e)?r=!1:r=this.moduleType==="esm";let{code:n,deps:s}=await this.transformWithEsbuild(e,r);try{let i=await this.loadFromCode(e,n,r)||{},c;i.default?c=i.default:(c=[],Object.keys(i).forEach(a=>{S(i[a])?c.push(...i[a]):c.push(i[a])})),S(c)?c.forEach(a=>a.__filepath__=e):c.__filepath__=e,this.moduleCache.set(e,c),this.updateModuleDeps(e,s)}catch(i){console.error(i)}}async loadFromCode(e,r,n){if(n){let s=`${e}.timestamp-${Date.now()}`,i=`${s}.mjs`,c=`${gt(s)}.mjs`;await ne.promises.writeFile(i,r,"utf8");try{return await import(c)}finally{try{ne.unlinkSync(i)}catch{}}}else{e=Se.resolve(this.cwd,e);let s=Se.extname(e),i=ne.realpathSync(e),c=s in $.extensions?s:".js",a=$.extensions[c];$.extensions[c]=(x,v)=>{v===i?x._compile(r,v):a(x,v)},delete $.cache[$.resolve(e)];let m=$(e);return $.extensions[c]=a,m.__esModule?m:{default:m}}}async transformWithEsbuild(e,r){var n;try{let s=await kt({entryPoints:[e],outfile:"out.js",write:!1,target:["node14.18","node16"],platform:"node",bundle:!0,metafile:!0,format:r?"esm":"cjs",define:this.options.define,plugins:[Q(this.options.alias),J,G,z]});return{code:s.outputFiles[0].text,deps:((n=s.metafile)==null?void 0:n.inputs)||{}}}catch(s){console.error(s)}return{code:"",deps:{}}}};import{parse as Pe}from"url";import Mt from"cookies";import{pathToRegexp as je}from"path-to-regexp";import bt from"picocolors";import{WebSocketServer as xt}from"ws";function Re(t,o,e,r){var D;let n=new Map,s=new Map,i=new WeakMap,c=p=>{let l=s.get(p);return!l&&s.set(p,l=new Map),l},a=(p,l)=>{let u=p.get(l);return!u&&p.set(l,u=new xt({noServer:!0})),u},m=(p,l)=>{let u=n.get(p);!u&&n.set(p,u=new Set),u.add(l)},x=(p,l,u,d,f,g)=>{var k;try{(k=u.setup)==null||k.call(u,l,d),l.on("close",()=>p.delete(f))}catch(O){R.error(`${bt.red("[websocket server error]")} ${g}
|
|
51
|
+
`,O)}},v=(p,l,u,d)=>{p.emit("connection",l,u),l.on("close",()=>{let f=d.findIndex(g=>g.ws===l);f!==-1&&d.splice(f,1)})},F=(p,l,u,d,f)=>{let{cleanupList:g,connectionList:k,context:O}=i.get(l);Ce(g),k.forEach(({ws:P})=>P.removeAllListeners()),l.removeAllListeners(),x(p,l,u,O,d,f),k.forEach(({ws:P,req:_})=>v(l,P,_,k))};(D=t.on)==null||D.call(t,"mock:update-end",p=>{if(!n.has(p))return;let l=n.get(p);if(l)for(let u of l.values())for(let d of t.mockData[u]){if(!d.ws||d.__filepath__!==p)return;let f=c(u);for(let[g,k]of f.entries())F(f,k,d,g,p)}}),o==null||o.on("upgrade",(p,l,u)=>{let{pathname:d,query:f}=Pe(p.url,!0);if(!d||e.length===0||!e.some(h=>K(h,p.url)))return;let g=t.mockData,k=Object.keys(g).find(h=>je(h).test(d));if(!k)return;let O=g[k].find(h=>h.url&&h.ws&&je(h.url).test(d));if(!O)return;let P=O.__filepath__;m(P,k);let _=c(k),E=a(_,d),I=i.get(E);if(!I){let h=[],ie={onCleanup:_e=>h.push(_e)};I={cleanupList:h,context:ie,connectionList:[]},i.set(E,I),x(_,E,O,ie,d,P)}let y=p,N=new Mt(p,p,r),{query:De}=Pe(p.headers.referer||"",!0);y.query=f,y.refererQuery=De,y.params=A(k,d),y.getCookie=N.get.bind(N),E.handleUpgrade(y,l,u,h=>{C(`websocket-mock: ${p.url} connected`),I.connectionList.push({req:y,ws:h}),v(E,h,y,I.connectionList)})}),o==null||o.on("close",()=>{for(let p of s.values()){for(let l of p.values()){let u=i.get(l);Ce(u.cleanupList),l.close()}p.clear()}s.clear(),n.clear()})}function Ce(t){let o;for(;o=t.shift();)o==null||o()}async function se(t,o,e,r){let n=new Y({include:w(o.include),exclude:w(o.exclude),define:B(t),alias:t.resolve.alias});n.load(),n.on("mock:update-end",()=>{o.reload&&(r==null||r.send({type:"full-reload"}))}),e==null||e.on("close",()=>n.close());let{httpProxies:s}=V(t.server.proxy||{}),i=w(o.prefix);return Re(n,e,w(o.wsPrefix),o.cookiesOptions),xe(n,{formidableOptions:o.formidableOptions,proxies:[...i,...s],cookiesOptions:o.cookiesOptions})}function We({prefix:t=[],wsPrefix:o=[],include:e=["mock/**/*.mock.{js,ts,cjs,mjs,json,json5}"],exclude:r=["**/node_modules/**","**/.vscode/**","**/.git/**"],reload:n=!1,formidableOptions:s={},build:i=!1,cookiesOptions:c={}}={}){let a={prefix:t,wsPrefix:o,include:e,exclude:r,reload:n,cookiesOptions:c,formidableOptions:{multiples:!0,...s},build:i?Object.assign({serverPort:8080,dist:"mockServer"},typeof i=="object"?i:{}):!1},m=[St(a)];return a.build&&m.push(wt(a)),m}function wt(t){let o={};return{name:"vite-plugin-mock-dev-server-generator",enforce:"post",apply:"build",configResolved(e){o=e,e.logger.warn("")},async buildEnd(e){e||o.command==="build"&&await ge(this,o,t)}}}function St(t){let o={};return{name:"vite-plugin-mock-dev-server",enforce:"pre",apply:"serve",config(e){var s;let r=w(t.wsPrefix);if(r.length===0||!((s=e.server)!=null&&s.proxy)||Object.keys(e.server.proxy).length===0)return;let n={};Object.keys(e.server.proxy).forEach(i=>{r.includes(i)||(n[i]=e.server.proxy[i])}),e.server.proxy=n},configResolved(e){o=e,e.logger.warn("")},async configureServer({middlewares:e,config:r,httpServer:n,ws:s}){let i=await se(r,t,n,s);e.use(i)},async configurePreviewServer({middlewares:e,httpServer:r}){let n=await se(o,t,r);e.use(n)}}}function ir(t){return t}function cr(t){return e=>(S(e)?e=e.map(r=>t(r)||r):e=t(e)||e,e)}var ur=We;export{xe as baseMiddleware,cr as createDefineMock,ur as default,ir as defineMock,We as mockDevServerPlugin,Re as mockWebSocket,we as transformMockData};
|