vite-plugin-mock-dev-server 1.3.0 → 1.3.1
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 +82 -2
- package/README.zh-CN.md +52 -1
- package/dist/index.cjs +13 -13
- package/dist/index.d.cts +18 -1
- package/dist/index.d.ts +18 -1
- package/dist/index.js +10 -10
- package/package.json +12 -12
package/README.md
CHANGED
|
@@ -142,7 +142,7 @@ export default defineConfig({
|
|
|
142
142
|
|
|
143
143
|
- `options.wsPrefix`
|
|
144
144
|
|
|
145
|
-
|
|
145
|
+
**Type:** `string | string[]`
|
|
146
146
|
|
|
147
147
|
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.
|
|
148
148
|
|
|
@@ -187,7 +187,7 @@ export default defineConfig({
|
|
|
187
187
|
|
|
188
188
|
- `options.log`
|
|
189
189
|
|
|
190
|
-
**Type:** `
|
|
190
|
+
**Type:** `boolean | 'info' | 'warn' | 'error' | 'silent'`
|
|
191
191
|
|
|
192
192
|
Enable log and configure log level.
|
|
193
193
|
|
|
@@ -469,6 +469,55 @@ type Response = http.ServerResponse<http.IncomingMessage> & {
|
|
|
469
469
|
> the 'response' method is not supported,
|
|
470
470
|
> as is the function form that uses other fields.
|
|
471
471
|
|
|
472
|
+
## Share Mock Data
|
|
473
|
+
|
|
474
|
+
Due to each `mock` file being compiled as a separate entry point, the local files they depend on are also compiled within. Additionally, each mock file has an independent scope. This means that even if multiple mock files collectively depend on a `data.ts` file, they cannot share data. If one mock file modifies the data in `data.ts`, other mock files will not receive the updated data.
|
|
475
|
+
|
|
476
|
+
To address this, the plugin offers a `defineMockData` function, which allows using `data.ts` as a shared data source within mock files.
|
|
477
|
+
|
|
478
|
+
```ts
|
|
479
|
+
type defineMockData<T> = (
|
|
480
|
+
key: string, // key
|
|
481
|
+
initialData: T, // initial data
|
|
482
|
+
) => [getter, setter] & { value: T }
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
#### Exp:
|
|
486
|
+
`data.ts`
|
|
487
|
+
```ts
|
|
488
|
+
import { defineMockData } from 'vite-plugin-mock-dev-server'
|
|
489
|
+
|
|
490
|
+
export default defineMockData('posts', [
|
|
491
|
+
{ id: '1', title: 'title1', content: 'content1' },
|
|
492
|
+
{ id: '2', title: 'title2', content: 'content2' },
|
|
493
|
+
])
|
|
494
|
+
```
|
|
495
|
+
`*.mock.ts`
|
|
496
|
+
```ts
|
|
497
|
+
import { defineMock } from 'vite-plugin-mock-dev-server'
|
|
498
|
+
import posts from './data'
|
|
499
|
+
|
|
500
|
+
export default defineMock([
|
|
501
|
+
{
|
|
502
|
+
url: '/api/posts',
|
|
503
|
+
body: () => posts.value
|
|
504
|
+
},
|
|
505
|
+
{
|
|
506
|
+
url: '/api/posts/delete/:id',
|
|
507
|
+
body: (params) => {
|
|
508
|
+
const id = params.id
|
|
509
|
+
posts.value = posts.value.filter((post) => post.id !== id)
|
|
510
|
+
return { success: true }
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
])
|
|
514
|
+
```
|
|
515
|
+
|
|
516
|
+
> **Tips:**
|
|
517
|
+
>
|
|
518
|
+
> The `defineMockData` function relies solely on the shared data support provided by `memory`.
|
|
519
|
+
> If persistent mock data is required, it is recommended to use a `nosql` database like `lowdb` or `level`.
|
|
520
|
+
|
|
472
521
|
## Example
|
|
473
522
|
|
|
474
523
|
`mock/**/*.mock.{ts,js,mjs,cjs,json,json5}`
|
|
@@ -803,6 +852,37 @@ You can access related `mock` interfaces through `localhost:8080/`.
|
|
|
803
852
|
|
|
804
853
|
[awesome-vite](https://github.com/vitejs/awesome-vite#helpers)
|
|
805
854
|
|
|
855
|
+
## Contributors
|
|
856
|
+
|
|
857
|
+
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
|
858
|
+
[](#contributors-)
|
|
859
|
+
<!-- ALL-CONTRIBUTORS-BADGE:END -->
|
|
860
|
+
|
|
861
|
+
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
|
862
|
+
<!-- prettier-ignore-start -->
|
|
863
|
+
<!-- markdownlint-disable -->
|
|
864
|
+
<table>
|
|
865
|
+
<tbody>
|
|
866
|
+
<tr>
|
|
867
|
+
<td align="center" valign="top" width="14.28%"><a href="https://pengzhanbo.cn"><img src="https://avatars.githubusercontent.com/u/16745751?v=4?s=100" width="100px;" alt="pengzhanbo"/><br /><sub><b>pengzhanbo</b></sub></a><br /><a href="https://github.com/pengzhanbo/vite-plugin-mock-dev-server/commits?author=pengzhanbo" title="Documentation">📖</a> <a href="#ideas-pengzhanbo" title="Ideas, Planning, & Feedback">🤔</a> <a href="#example-pengzhanbo" title="Examples">💡</a> <a href="https://github.com/pengzhanbo/vite-plugin-mock-dev-server/commits?author=pengzhanbo" title="Code">💻</a></td>
|
|
868
|
+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jiadesen"><img src="https://avatars.githubusercontent.com/u/22772994?v=4?s=100" width="100px;" alt="jiadesen"/><br /><sub><b>jiadesen</b></sub></a><br /><a href="#ideas-jiadesen" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/pengzhanbo/vite-plugin-mock-dev-server/issues?q=author%3Ajiadesen" title="Bug reports">🐛</a></td>
|
|
869
|
+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/yogibaba"><img src="https://avatars.githubusercontent.com/u/152670?v=4?s=100" width="100px;" alt="yogibaba"/><br /><sub><b>yogibaba</b></sub></a><br /><a href="https://github.com/pengzhanbo/vite-plugin-mock-dev-server/commits?author=yogibaba" title="Code">💻</a></td>
|
|
870
|
+
</tr>
|
|
871
|
+
</tbody>
|
|
872
|
+
</table>
|
|
873
|
+
|
|
874
|
+
<!-- markdownlint-restore -->
|
|
875
|
+
<!-- prettier-ignore-end -->
|
|
876
|
+
|
|
877
|
+
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
|
878
|
+
<!-- prettier-ignore-start -->
|
|
879
|
+
<!-- markdownlint-disable -->
|
|
880
|
+
|
|
881
|
+
<!-- markdownlint-restore -->
|
|
882
|
+
<!-- prettier-ignore-end -->
|
|
883
|
+
|
|
884
|
+
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
|
885
|
+
|
|
806
886
|
## LICENSE
|
|
807
887
|
|
|
808
888
|
[MIT](/LICENSE)
|
package/README.zh-CN.md
CHANGED
|
@@ -183,7 +183,7 @@ export default defineConfig({
|
|
|
183
183
|
|
|
184
184
|
- `options.log`
|
|
185
185
|
|
|
186
|
-
**Type:** `
|
|
186
|
+
**Type:** `boolean | 'info' | 'warn' | 'error' | 'silent'`
|
|
187
187
|
|
|
188
188
|
启动日志,以及配置日志打印级别
|
|
189
189
|
|
|
@@ -457,6 +457,57 @@ type Response = http.ServerResponse<http.IncomingMessage> & {
|
|
|
457
457
|
>
|
|
458
458
|
> 如果使用 json/json5 编写 mock文件,则不支持使用 `response` 方法,以及不支持使用其他字段的函数形式。
|
|
459
459
|
|
|
460
|
+
## 共享 Mock 数据
|
|
461
|
+
|
|
462
|
+
由于每个mock文件都是作为独立的入口进行编译,其依赖的本地文件也编译在内,
|
|
463
|
+
且每个mock文件拥有独立的作用域,这使得即使多个 mock文件共同依赖某一个`data.ts`文件,也无法共享数据。
|
|
464
|
+
某个 `mock` 文件对 `data.ts` 中的数据进行修改,其它`mock`文件不会获取到修改后的数据。
|
|
465
|
+
|
|
466
|
+
为此,插件提供了一个 `defineMockData` 函数,用于在 `mock` 文件中使用 `data.ts` 作为共享数据源。
|
|
467
|
+
|
|
468
|
+
```ts
|
|
469
|
+
type defineMockData<T> = (
|
|
470
|
+
key: string, // 数据唯一标识符
|
|
471
|
+
initialData: T, // 初始化数据
|
|
472
|
+
) => [getter, setter] & { value: T }
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
#### 用法:
|
|
476
|
+
`data.ts`
|
|
477
|
+
```ts
|
|
478
|
+
import { defineMockData } from 'vite-plugin-mock-dev-server'
|
|
479
|
+
|
|
480
|
+
export default defineMockData('posts', [
|
|
481
|
+
{ id: '1', title: 'title1', content: 'content1' },
|
|
482
|
+
{ id: '2', title: 'title2', content: 'content2' },
|
|
483
|
+
])
|
|
484
|
+
```
|
|
485
|
+
`*.mock.ts`
|
|
486
|
+
```ts
|
|
487
|
+
import { defineMock } from 'vite-plugin-mock-dev-server'
|
|
488
|
+
import posts from './data'
|
|
489
|
+
|
|
490
|
+
export default defineMock([
|
|
491
|
+
{
|
|
492
|
+
url: '/api/posts',
|
|
493
|
+
body: () => posts.value
|
|
494
|
+
},
|
|
495
|
+
{
|
|
496
|
+
url: '/api/posts/delete/:id',
|
|
497
|
+
body: (params) => {
|
|
498
|
+
const id = params.id
|
|
499
|
+
posts.value = posts.value.filter((post) => post.id !== id)
|
|
500
|
+
return { success: true }
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
])
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
> **注意:**
|
|
507
|
+
>
|
|
508
|
+
> `defineMockData` 仅是基于 `memory` 提供的共享数据支持,
|
|
509
|
+
> 如果需要做 mock 数据持久化,建议使用 `nosql`, 如 `lowdb` 或 `level` 等。
|
|
510
|
+
|
|
460
511
|
## Example
|
|
461
512
|
|
|
462
513
|
`mock/**/*.mock.{ts,js,mjs,cjs,json,json5}`
|
package/dist/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var mt=Object.create;var ee=Object.defineProperty;var ut=Object.getOwnPropertyDescriptor;var dt=Object.getOwnPropertyNames;var ft=Object.getPrototypeOf,gt=Object.prototype.hasOwnProperty;var kt=(o,t)=>{for(var e in t)ee(o,e,{get:t[e],enumerable:!0})},Pe=(o,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of dt(t))!gt.call(o,s)&&s!==e&&ee(o,s,{get:()=>t[s],enumerable:!(n=ut(t,s))||n.enumerable});return o};var f=(o,t,e)=>(e=o!=null?mt(ft(o)):{},Pe(t||!o||!o.__esModule?ee(e,"default",{value:o,enumerable:!0}):e,o)),yt=o=>Pe(ee({},"__esModule",{value:!0}),o);var Qt={};kt(Qt,{baseMiddleware:()=>ye,createDefineMock:()=>Jt,default:()=>Gt,defineMock:()=>Bt,defineMockData:()=>zt,mockDevServerPlugin:()=>we,mockWebSocket:()=>be,transformMockData:()=>he});module.exports=yt(Qt);var ht=()=>typeof document>"u"?new URL("file:"+__filename).href:document.currentScript&&document.currentScript.src||new URL("main.js",document.baseURI).href,b=ht();var at=require("@pengzhanbo/utils");var Je=f(require("fs"),1),X=f(require("fs/promises"),1),q=f(require("path"),1),Y=require("@pengzhanbo/utils"),Ae=f(require("fast-glob"),1),ze=f(require("is-core-module"),1),le=require("vite");var je="vite-plugin-mock-dev-server",De="1.3.1";var U=f(require("fs"),1),Te=require("module"),ie=f(require("path"),1),Ne=require("url"),Fe=require("esbuild"),He=f(require("json5"),1);var te=f(require("fs"),1),oe=f(require("path"),1),Le=require("querystring"),re=require("url"),Ee=f(require("debug"),1),$e=require("path-to-regexp"),vt=o=>o!==null&&typeof o=="object"&&typeof o.pipe=="function",_e=o=>vt(o)&&o.readable!==!1&&typeof o._read=="function"&&typeof o._readableState=="object";function Ie(o){return oe.default.dirname((0,re.fileURLToPath)(o))}var ne=(0,Ee.default)("vite:mock-dev-server");function V(o,t,e){for(let s of t){let r=oe.default.join(o,s);if(te.default.existsSync(r)&&te.default.statSync(r).isFile()){let i=e!=null&&e.pathOnly?r:te.default.readFileSync(r,"utf-8");if(!(e!=null&&e.predicate)||e.predicate(i))return i}}let n=oe.default.dirname(o);if(n!==o&&(!(e!=null&&e.rootDir)||n.startsWith(e==null?void 0:e.rootDir)))return V(n,t,e)}var se=(o={})=>{let t=[],e=[];return Object.keys(o).forEach(n=>{var r,i;let s=o[n];typeof s=="string"||!s.ws&&!((r=s.target)!=null&&r.toString().startsWith("ws:"))&&!((i=s.target)!=null&&i.toString().startsWith("wss:"))?t.push(n):e.push(n)}),{httpProxies:t,wsProxies:e}};function G(o,t){return o[0]==="^"&&new RegExp(o).test(t)||t.startsWith(o)}function K(o,t){return((0,$e.match)(o,{decode:decodeURIComponent})(t)||{params:{}}).params||{}}function W(o){let t=new re.URL(o,"http://example.com"),e=decodeURIComponent(t.pathname),n=(0,Le.parse)(t.search.replace(/^\?/,""));return{pathname:e,query:n}}var Mt={name:"externalize-deps",setup(o){o.onResolve({filter:/.*/},({path:t})=>{if(t[0]!=="."&&!ie.default.isAbsolute(t))return{external:!0}})}},bt={name:"json5-loader",setup(o){o.onLoad({filter:/\.json5$/},async({path:t})=>{let e=await U.promises.readFile(t,"utf-8");return{contents:`export default ${JSON.stringify(He.default.parse(e))}`,loader:"js"}})}},xt={name:"json-loader",setup(o){o.onLoad({filter:/\.json$/},async({path:t})=>({contents:`export default ${await U.promises.readFile(t,"utf-8")}`,loader:"js"}))}},wt=o=>({name:"alias-plugin",setup(t){t.onResolve({filter:/.*/},async({path:e})=>{let n=o.find(({find:c})=>St(c,e));if(!n)return null;let{find:s,replacement:r}=n;return{path:(await t.resolve(e.replace(s,r),{kind:"import-statement",resolveDir:r,namespace:"file"})).path,external:!1}})}});function St(o,t){return o instanceof RegExp?o.test(t):t.length<o.length?!1:t===o?!0:t.startsWith(`${o}/`)}async function ce(o,t){var r;let{isESM:e=!0,define:n,alias:s}=t;try{let i=await(0,Fe.build)({entryPoints:[o],outfile:"out.js",write:!1,target:["node14.18","node16"],platform:"node",bundle:!0,metafile:!0,format:e?"esm":"cjs",define:n,plugins:[wt(s),Mt,xt,bt]});return{code:i.outputFiles[0].text,deps:((r=i.metafile)==null?void 0:r.inputs)||{}}}catch(i){console.error(i)}return{code:"",deps:{}}}var Ot=Ie(b),H=(0,Te.createRequire)(Ot);async function Ue(o,t,e,n){if(e){let s=`${o}.timestamp-${Date.now()}`,r=`${s}.mjs`,i=`${(0,Ne.pathToFileURL)(s)}.mjs`;await U.promises.writeFile(r,t,"utf8");try{return await import(i)}finally{try{U.default.unlinkSync(r)}catch{}}}else{o=ie.default.resolve(n,o);let s=ie.default.extname(o),r=U.default.realpathSync(o),i=s in H.extensions?s:".js",c=H.extensions[i];H.extensions[i]=(p,m)=>{m===r?p._compile(t,m):c(p,m)},delete H.cache[H.resolve(o)];let a=H(o);return H.extensions[i]=c,a.__esModule?a:{default:a}}}var de=f(require("picocolors"),1);var Be=require("@pengzhanbo/utils"),E=f(require("picocolors"),1),qe={silent:0,error:1,warn:2,info:3};function ae(o,t="info"){o=`[${o}]`;function e(s,r,i){if(i=(0,Be.isBoolean)(i)?i?t:"error":i,qe[i]>=qe[s]){let a=s==="info"?"log":s,p=s==="info"?E.default.cyan(E.default.bold(o)):s==="warn"?E.default.yellow(E.default.bold(o)):E.default.red(E.default.bold(o)),m=`${E.default.dim(new Date().toLocaleTimeString())} ${p} ${r}`;console[a](m)}}return{info(s,r=t){e("info",s,r)},warn(s,r=t){e("warn",s,r)},error(s,r=t){e("error",s,r)}}}var Ct=/import\.meta\.env\.(.+)/;function pe(o){let t=ae("vite:mock-dev-server","warn"),e={},n=process.env.NODE_ENV||o.mode;Object.assign(e,{"process.env.NODE_ENV":JSON.stringify(n),"global.process.env.NODE_ENV":JSON.stringify(n),"globalThis.process.env.NODE_ENV":JSON.stringify(n),__vite_process_env_NODE_ENV:JSON.stringify(n)});let s={},r={},i=[];for(let p in o.define){let m=o.define[p];if(typeof m=="string")try{JSON.parse(m),s[p]=m}catch{i.push(p)}else s[p]=JSON.stringify(m);let h=p.match(Ct);h&&s[p]&&(r[h[1]]=`__vite__define__${s[p]}`)}i.length&&t.warn(`The following keys: ${de.default.yellow(de.default.underline(i.join(", ")))} declared in 'define' cannot be parsed as regular code snippets.`);let c={},a={};c["import.meta.hot"]="undefined";for(let p in o.env)c[`import.meta.env.${p}`]=JSON.stringify(o.env[p]);return Object.assign(a,{"import.meta.env":JSON.stringify({...o.env,...r}).replace(/"__vite__define__(.+?)"([,}])/g,(p,m,h)=>`${m.replace(/(^\\")|(\\"$)/g,'"')}${h}`)}),{...c,...s,...a,...e}}async function Ge(o,t,e){let n=(0,Y.toArray)(e.include),s=(0,Y.toArray)(e.exclude),r=pe(t),{httpProxies:i}=se(t.server.proxy||{});i.push(...(0,Y.toArray)(e.prefix));let c=(0,Y.toArray)(e.wsPrefix),a={};try{let u=V(t.root,["package.json"]);u&&(a=JSON.parse(u))}catch{}let p=e.build.dist,m=await jt(process.cwd(),n,s),h=q.default.join(t.root,`mock-data-${Date.now()}.js`);await X.default.writeFile(h,m,"utf-8");let{code:S,deps:L}=await ce(h,{define:r,alias:t.resolve.alias}),j=Rt(L);await X.default.unlink(h);let l=[{filename:q.default.join(p,"mock-data.js"),source:S},{filename:q.default.join(p,"index.js"),source:Wt(i,c,e.cookiesOptions,e.build.serverPort)},{filename:q.default.join(p,"package.json"),source:Pt(a,j)}];try{if(q.default.isAbsolute(p)){await X.default.rm(p,{recursive:!0}),Je.default.mkdirSync(p,{recursive:!0});for(let{filename:u,source:d}of l)await X.default.writeFile(u,d,"utf-8")}else for(let{filename:u,source:d}of l)o.emitFile({type:"asset",fileName:u,source:d})}catch{}}function Rt(o){let t=new Set,e=[je,"connect","cors"];return Object.keys(o).forEach(n=>{o[n].imports.filter(r=>r.external&&!r.path.startsWith("<define:")).map(r=>r.path).forEach(r=>{!e.includes(r)&&!(0,ze.default)(r)&&t.add(r)})}),Array.from(t)}function Pt(o,t){let{dependencies:e={},devDependencies:n={}}=o,s={...e,...n},r={name:"mock-server",type:"module",scripts:{start:"node index.js"},dependencies:{connect:"^3.7.0","vite-plugin-mock-dev-server":`^${De}`,cors:"^2.8.5"},pnpm:{peerDependencyRules:{ignoreMissing:["vite"]}}};return t.forEach(i=>{r.dependencies[i]=s[i]||"latest"}),JSON.stringify(r,null,2)}function Wt(o,t,e={},n=8080){return`import { createServer } from 'node:http';
|
|
2
2
|
import connect from 'connect';
|
|
3
3
|
import corsMiddleware from 'cors';
|
|
4
4
|
import { baseMiddleware, mockWebSocket } from 'vite-plugin-mock-dev-server';
|
|
@@ -6,8 +6,8 @@ import mockData from './mock-data.js';
|
|
|
6
6
|
|
|
7
7
|
const app = connect();
|
|
8
8
|
const server = createServer(app);
|
|
9
|
-
const httpProxies = ${JSON.stringify(
|
|
10
|
-
const wsProxies = ${JSON.stringify(
|
|
9
|
+
const httpProxies = ${JSON.stringify(o)};
|
|
10
|
+
const wsProxies = ${JSON.stringify(t)};
|
|
11
11
|
const cookiesOptions = ${JSON.stringify(e)};
|
|
12
12
|
|
|
13
13
|
mockWebSocket({ mockData }, server, wsProxies, cookiesOptions);
|
|
@@ -22,7 +22,7 @@ app.use(baseMiddleware({ mockData }, {
|
|
|
22
22
|
server.listen(${n});
|
|
23
23
|
|
|
24
24
|
console.log('listen: http://localhost:${n}');
|
|
25
|
-
`}async function
|
|
25
|
+
`}async function jt(o,t,e){let n=await(0,Ae.default)(t,{cwd:o}),s=(0,le.createFilter)(t,e,{resolve:!1}),r=n.filter(s),i="",c="";return r.forEach((a,p)=>{let m=(0,le.normalizePath)(q.default.join(o,a));i+=`import * as m${p} from '${m}';
|
|
26
26
|
`,c+=`m${p}, `}),`import { transformMockData } from 'vite-plugin-mock-dev-server';
|
|
27
27
|
${i}
|
|
28
28
|
const exporters = [${c}];
|
|
@@ -40,18 +40,18 @@ const mockList = exporters.map((raw) => {
|
|
|
40
40
|
}
|
|
41
41
|
return mockConfig
|
|
42
42
|
});
|
|
43
|
-
export default transformMockData(mockList);`}var J=require("@pengzhanbo/utils"),
|
|
44
|
-
${
|
|
45
|
-
at body (${
|
|
46
|
-
${
|
|
47
|
-
at response (${
|
|
43
|
+
export default transformMockData(mockList);`}var J=require("@pengzhanbo/utils"),it=f(require("cors"),1),ct=require("path-to-regexp");var ge=require("buffer"),y=require("@pengzhanbo/utils"),Ze=f(require("cookies"),1),et=f(require("http-status"),1),Z=f(require("mime-types"),1),ke=require("path-to-regexp"),x=f(require("picocolors"),1);var me=f(require("co-body"),1),Qe=f(require("formidable"),1);async function Ve(o,t){var s;let e=o.method.toUpperCase();if(["GET","DELETE","HEAD"].includes(e))return;let n=((s=o.headers["content-type"])==null?void 0:s.toLocaleLowerCase())||"";try{if(n.startsWith("application/json"))return await me.default.json(o);if(n.startsWith("application/x-www-form-urlencoded"))return await me.default.form(o);if(n.startsWith("text/plain"))return await me.default.text(o);if(n.startsWith("multipart/form-data"))return await Dt(o,t)}catch(r){console.error(r)}}async function Dt(o,t){let e=(0,Qe.default)(t);return new Promise((n,s)=>{e.parse(o,(r,i,c)=>{if(r){s(r);return}n({...i,...c})})})}var Q=require("@pengzhanbo/utils");function Ke(o,t){return $(o.headers,t.headers)&&$(o.body,t.body)&&$(o.params,t.params)&&$(o.query,t.query)&&$(o.refererQuery,t.refererQuery)}function $(o,t){if(!t)return!0;for(let e in t)if(!Xe(o[e],t[e]))return!1;return!0}function Xe(o,t){if((0,Q.isArray)(o)&&(0,Q.isArray)(t)){let e=new Set;return t.every(n=>o.some((s,r)=>{if(e.has(r))return!1;let i=Xe(s,n);return i&&e.add(r),i}))}return(0,Q.isObject)(o)&&(0,Q.isObject)(t)?$(o,t):Object.is(o,t)}var Lt=/:/g;function ye(o,{formidableOptions:t={},proxies:e,cookiesOptions:n,logger:s}){return async function(r,i,c){let a=(0,y.timestamp)(),{query:p,pathname:m}=W(r.url);if(!m||e.length===0||!e.some(C=>G(C,r.url)))return c();let h=o.mockData,S=(0,y.sortBy)(Object.keys(h),C=>{var w;return((w=C.match(Lt))==null?void 0:w.length)||0}).find(C=>(0,ke.pathToRegexp)(C).test(m));if(!S)return c();let{query:L}=W(r.headers.referer||""),j=await Ve(r,t),l=new Ze.default(r,i,n),u=l.get.bind(l),d=r.method.toUpperCase(),g=Et(h[S],s,{pathname:m,method:d,request:{query:p,refererQuery:L,body:j,headers:r.headers,getCookie:u}});if(!g)return c();let k=r,v=i;k.body=j,k.query=p,k.refererQuery=L,k.params=K(g.url,m),k.getCookie=u,v.setCookie=l.set.bind(l);let{body:M,delay:O,type:D="json",response:T,status:N=200,statusText:F,log:P,__filepath__:z}=g;if(fe(v,N,F),await $t(k,v,g,s),await _t(k,v,g,s),s.info(Nt(k,z),P),M){try{let C=(0,y.isFunction)(M)?await M(k):M;await Ye(a,O),It(v,C,D)}catch(C){s.error(`${x.default.red(`mock error at ${m}`)}
|
|
44
|
+
${C}
|
|
45
|
+
at body (${x.default.underline(z)})`,P),fe(v,500),i.end("")}return}if(T){try{await Ye(a,O),await T(k,v,c)}catch(C){s.error(`${x.default.red(`mock error at ${m}`)}
|
|
46
|
+
${C}
|
|
47
|
+
at response (${x.default.underline(z)})`,P),fe(v,500),i.end("")}return}i.end("")}}function Et(o,t,{pathname:e,method:n,request:s}){return o.find(r=>{if(!e||!r||!r.url||r.ws===!0||!(r.method?(0,y.isArray)(r.method)?r.method:[r.method]:["GET","POST"]).includes(n))return!1;let c=(0,ke.pathToRegexp)(r.url).test(e);if(c&&r.validator){let a=K(r.url,e);if((0,y.isFunction)(r.validator))return r.validator({params:a,...s});try{return Ke({params:a,...s},r.validator)}catch(p){let m=r.__filepath__;return t.error(`${x.default.red(`mock error at ${e}`)}
|
|
48
48
|
${p}
|
|
49
|
-
at validator (${
|
|
49
|
+
at validator (${x.default.underline(m)})`,r.log),!1}}return c})}function fe(o,t=200,e){o.statusCode=t,o.statusMessage=e||Tt(t)}async function $t(o,t,e,n){let{headers:s,type:r="json"}=e,i=e.__filepath__,c=Z.contentType(r)||Z.contentType(Z.lookup(r)||"");if(c&&t.setHeader("Content-Type",c),t.setHeader("Cache-Control","no-cache,max-age=0"),t.setHeader("X-Mock-Power-By","vite-plugin-mock-dev-server"),t.setHeader("X-File-Path",i),!!s)try{let a=(0,y.isFunction)(s)?await s(o):s;Object.keys(a).forEach(p=>{t.setHeader(p,a[p])})}catch(a){n.error(`${x.default.red(`mock error at ${o.url.split("?")[0]}`)}
|
|
50
50
|
${a}
|
|
51
|
-
at headers (${
|
|
51
|
+
at headers (${x.default.underline(i)})`,e.log)}}async function _t(o,t,e,n){let{cookies:s}=e,r=e.__filepath__;if(s)try{let i=(0,y.isFunction)(s)?await s(o):s;Object.keys(i).forEach(c=>{let a=i[c];if((0,y.isArray)(a)){let[p,m]=a;t.setCookie(c,p,m)}else t.setCookie(c,a)})}catch(i){n.error(`${x.default.red(`mock error at ${o.url.split("?")[0]}`)}
|
|
52
52
|
${i}
|
|
53
|
-
at cookies (${
|
|
53
|
+
at cookies (${x.default.underline(r)})`,e.log)}}function It(o,t,e){if(_e(t))t.pipe(o);else if(ge.Buffer.isBuffer(t))o.end(e==="text"||e==="json"?t.toString("utf-8"):t);else{let n=typeof t=="string"?t:JSON.stringify(t);o.end(e==="buffer"?ge.Buffer.from(n):n)}}async function Ye(o,t){if(!t||typeof t=="number"&&t<=0||(0,y.isArray)(t)&&t.length!==2)return;let e=0;if((0,y.isArray)(t)){let[n,s]=t;e=(0,y.random)(n,s)}else e=t-((0,y.timestamp)()-o);e>0&&await(0,y.sleep)(e)}function Tt(o){return et.default[o]||"Unknown"}function Nt(o,t){let{url:e,method:n,query:s,params:r,body:i}=o,{pathname:c}=new URL(e,"http://example.com");c=x.default.green(decodeURIComponent(c));let a=(j,l)=>!l||(0,y.isEmptyObject)(l)?"":` ${x.default.gray(`${j}:`)}${JSON.stringify(l)}`,p=x.default.magenta(x.default.bold(n)),m=a("query",s),h=a("params",r),S=a("body",i),L=` ${x.default.dim(x.default.underline(`(${t})`))}`;return`${p} ${c}${m}${h}${S}${L}`}var tt=f(require("events"),1),I=require("@pengzhanbo/utils"),ve=f(require("chokidar"),1),ot=f(require("fast-glob"),1),_=require("vite");var R=require("@pengzhanbo/utils");function he(o){let t=[];for(let[,n]of o.entries())n&&((0,R.isArray)(n)?t.push(...n):t.push(n));let e={};return t.filter(n=>(0,R.isObject)(n)&&n.enabled!==!1&&n.url).forEach(n=>{let{pathname:s,query:r}=W(n.url),i=e[s]??=[],c={...n,url:s};if(c.ws!==!0){let a=c.validator;(0,R.isEmptyObject)(r)||((0,R.isFunction)(a)?c.validator=function(p){return $(p.query,r)&&a(p)}:a?(c.validator={...a},c.validator.query=c.validator.query?{...r,...c.validator.query}:r):c.validator={query:r})}i.push(c)}),Object.keys(e).forEach(n=>{e[n]=(0,R.sortBy)(e[n],s=>{if(s.ws===!0)return 0;let{validator:r}=s;return!r||(0,R.isEmptyObject)(r)?2:(0,R.isFunction)(r)?0:1/Object.keys(r).reduce((c,a)=>c+Ft(r[a]),0)})}),e}function Ft(o){return o?Object.keys(o).length:0}var ue=class extends tt.default{constructor(e){super();this.options=e;this.cwd=e.cwd||process.cwd();try{let n=V(this.cwd,["package.json"]);this.moduleType=n&&JSON.parse(n).type==="module"?"esm":"cjs"}catch{}}moduleCache=new Map;moduleDeps=new Map;cwd;mockWatcher;depsWatcher;moduleType="cjs";_mockData={};get mockData(){return this._mockData}load(){let{include:e,exclude:n}=this.options,s=(0,_.createFilter)(e,n,{resolve:!1});(0,ot.default)(e,{cwd:this.cwd}).then(i=>i.filter(s).map(c=>()=>this.loadMock(c))).then(i=>(0,I.promiseParallel)(i,10)).then(()=>this.updateMockList()),this.watchMockEntry(),this.watchDeps();let r=null;this.on("mock:update",async i=>{s(i)&&(await this.loadMock(i),r&&clearImmediate(r),r=setImmediate(()=>{this.updateMockList(),this.emit("mock:update-end",i),r=null}))}),this.on("mock:unlink",async i=>{s(i)&&(this.moduleCache.delete(i),this.updateMockList(),this.emit("mock:update-end",i))})}watchMockEntry(){let{include:e}=this.options,[n,...s]=e,r=this.mockWatcher=ve.default.watch(n,{ignoreInitial:!0,cwd:this.cwd});s.length>0&&s.forEach(i=>r.add(i)),r.on("add",async i=>{i=(0,_.normalizePath)(i),this.emit("mock:update",i),ne("watcher:add",i)}),r.on("change",async i=>{i=(0,_.normalizePath)(i),this.emit("mock:update",i),ne("watcher:change",i)}),r.on("unlink",async i=>{i=(0,_.normalizePath)(i),this.emit("mock:unlink",i),ne("watcher:unlink",i)})}watchDeps(){let e=[];this.depsWatcher=ve.default.watch([],{ignoreInitial:!0,cwd:this.cwd}),this.depsWatcher.on("change",n=>{n=(0,_.normalizePath)(n);let s=this.moduleDeps.get(n);s&&s.forEach(r=>{this.emit("mock:update",r)})}),this.depsWatcher.on("unlink",n=>{n=(0,_.normalizePath)(n),this.moduleDeps.delete(n)}),this.on("update:deps",()=>{let n=[];for(let[r]of this.moduleDeps.entries())n.push(r);let s=n.filter(r=>!e.includes(r));s.length>0&&this.depsWatcher.add(s)})}close(){var e,n;(e=this.mockWatcher)==null||e.close(),(n=this.depsWatcher)==null||n.close()}updateMockList(){this._mockData=he(this.moduleCache)}updateModuleDeps(e,n){Object.keys(n).forEach(s=>{n[s].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 n=!1;/\.m[jt]s$/.test(e)?n=!0:/\.c[jt]s$/.test(e)?n=!1:n=this.moduleType==="esm";let{define:s,alias:r}=this.options,{code:i,deps:c}=await ce(e,{isESM:n,define:s,alias:r});try{let a=await Ue(e,i,n,this.cwd)||{},p;(0,I.hasOwn)(a,"default")?p=a.default:(p=[],Object.keys(a).forEach(m=>p.push(...(0,I.toArray)(a[m])))),(0,I.isArray)(p)?p.forEach(m=>m.__filepath__=e):p.__filepath__=e,this.moduleCache.set(e,p),this.updateModuleDeps(e,c)}catch(a){console.error(a)}}};var nt=f(require("cookies"),1),Me=require("path-to-regexp"),B=f(require("picocolors"),1),st=require("ws");function be({loader:o,httpServer:t,proxies:e,cookiesOptions:n,logger:s}){var j;let r=new Map,i=new Map,c=new WeakMap,a=l=>{let u=i.get(l);return!u&&i.set(l,u=new Map),u},p=(l,u)=>{let d=l.get(u);return!d&&l.set(u,d=new st.WebSocketServer({noServer:!0})),d},m=(l,u)=>{let d=r.get(l);!d&&r.set(l,d=new Set),d.add(u)},h=(l,u,d,g,k,v)=>{var M;try{(M=d.setup)==null||M.call(d,u,g),u.on("close",()=>l.delete(k)),u.on("error",O=>{s.error(`${B.default.red(`WebSocket mock error at ${u.path}`)}
|
|
54
54
|
${O}
|
|
55
55
|
at setup (${v})`,d.log)})}catch(O){s.error(`${B.default.red(`WebSocket mock error at ${u.path}`)}
|
|
56
56
|
${O}
|
|
57
|
-
at setup (${v})`,d.log)}},S=(l,u,d,g)=>{l.emit("connection",u,d),u.on("close",()=>{let k=g.findIndex(v=>v.ws===u);k!==-1&&g.splice(k,1)})},
|
|
57
|
+
at setup (${v})`,d.log)}},S=(l,u,d,g)=>{l.emit("connection",u,d),u.on("close",()=>{let k=g.findIndex(v=>v.ws===u);k!==-1&&g.splice(k,1)})},L=(l,u,d,g,k)=>{let{cleanupList:v,connectionList:M,context:O}=c.get(u);rt(v),M.forEach(({ws:D})=>D.removeAllListeners()),u.removeAllListeners(),h(l,u,d,O,g,k),M.forEach(({ws:D,req:T})=>S(u,D,T,M))};(j=o.on)==null||j.call(o,"mock:update-end",l=>{if(!r.has(l))return;let u=r.get(l);if(u)for(let d of u.values())for(let g of o.mockData[d]){if(!g.ws||g.__filepath__!==l)return;let k=a(d);for(let[v,M]of k.entries())L(k,M,g,v,l)}}),t==null||t.on("upgrade",(l,u,d)=>{let{pathname:g,query:k}=W(l.url);if(!g||e.length===0||!e.some(w=>G(w,l.url)))return;let v=o.mockData,M=Object.keys(v).find(w=>(0,Me.pathToRegexp)(w).test(g));if(!M)return;let O=v[M].find(w=>w.url&&w.ws&&(0,Me.pathToRegexp)(w.url).test(g));if(!O)return;let D=O.__filepath__;m(D,M);let T=a(M),N=p(T,g),F=c.get(N);if(!F){let w=[],Re={onCleanup:lt=>w.push(lt)};F={cleanupList:w,context:Re,connectionList:[]},c.set(N,F),h(T,N,O,Re,g,D)}let P=l,z=new nt.default(l,l,n),{query:C}=W(l.headers.referer||"");P.query=k,P.refererQuery=C,P.params=K(M,g),P.getCookie=z.get.bind(z),N.handleUpgrade(P,u,d,w=>{s.info(`${B.default.magenta(B.default.bold("WebSocket"))} ${B.default.green(l.url)} connected ${B.default.dim(`(${D})`)}`,O.log),F.connectionList.push({req:P,ws:w}),S(N,w,P,F.connectionList)})}),t==null||t.on("close",()=>{for(let l of i.values()){for(let u of l.values()){let d=c.get(u);rt(d.cleanupList),u.close()}l.clear()}i.clear(),r.clear()})}function rt(o){let t;for(;t=o.shift();)t==null||t()}function xe(o,t,e,n){let s=ae("vite:mock",(0,J.isBoolean)(t.log)?t.log?"info":"error":t.log),r=new ue({include:(0,J.toArray)(t.include),exclude:(0,J.toArray)(t.exclude),define:pe(o),alias:o.resolve.alias});r.load(),r.on("mock:update-end",()=>{t.reload&&(n==null||n.send({type:"full-reload"}))}),e==null||e.on("close",()=>r.close());let{httpProxies:i}=se(o.server.proxy||{}),a=[...(0,J.toArray)(t.prefix),...i];be({loader:r,httpServer:e,proxies:(0,J.toArray)(t.wsPrefix),cookiesOptions:t.cookiesOptions,logger:s});let p=[];return p.push(Ht(r,a,o,t),ye(r,{formidableOptions:t.formidableOptions,proxies:a,cookiesOptions:t.cookiesOptions,logger:s})),p.filter(Boolean)}function Ht(o,t,e,n){let s={},r=n.cors===!1?!1:e.server.cors!==!1;return r&&e.server.cors!==!1&&(s={...s,...typeof e.server.cors=="boolean"?{}:e.server.cors}),r&&n.cors!==!1&&(s={...s,...typeof n.cors=="boolean"?{}:n.cors}),r?function(i,c,a){let{pathname:p}=W(i.url);if(!p||t.length===0||!t.some(S=>G(S,i.url)))return a();let m=o.mockData;if(!Object.keys(m).find(S=>(0,ct.pathToRegexp)(S).test(p)))return a();(0,it.default)(s)(i,c,a)}:void 0}function we({prefix:o=[],wsPrefix:t=[],include:e=["mock/**/*.mock.{js,ts,cjs,mjs,json,json5}"],exclude:n=["**/node_modules/**","**/.vscode/**","**/.git/**"],reload:s=!1,log:r="info",cors:i=!0,formidableOptions:c={},build:a=!1,cookiesOptions:p={}}={}){let m={prefix:o,wsPrefix:t,include:e,exclude:n,reload:s,cors:i,cookiesOptions:p,log:r,formidableOptions:{multiples:!0,...c},build:a?Object.assign({serverPort:8080,dist:"mockServer"},typeof a=="object"?a:{}):!1},h=[qt(m)];return m.build&&h.push(Ut(m)),h}function Ut(o){let t={};return{name:"vite-plugin-mock-dev-server-generator",enforce:"post",apply:"build",configResolved(e){t=e,e.logger.warn("")},async buildEnd(e){e||t.command==="build"&&await Ge(this,t,o)}}}function qt(o){let t={};return{name:"vite-plugin-mock-dev-server",enforce:"pre",apply:"serve",config(e){var r;let n=(0,at.toArray)(o.wsPrefix);if(n.length===0||!((r=e.server)!=null&&r.proxy)||Object.keys(e.server.proxy).length===0)return;let s={};Object.keys(e.server.proxy).forEach(i=>{n.includes(i)||(s[i]=e.server.proxy[i])}),e.server.proxy=s},configResolved(e){t=e,e.logger.warn("")},configureServer({middlewares:e,config:n,httpServer:s,ws:r}){xe(n,o,s,r).forEach(c=>e.use(c))},configurePreviewServer({middlewares:e,httpServer:n}){xe(t,o,n).forEach(r=>e.use(r))}}}var pt=require("@pengzhanbo/utils");function Bt(o){return o}function Jt(o){return e=>((0,pt.isArray)(e)?e=e.map(n=>o(n)||n):e=o(e)||e,e)}var A=require("@pengzhanbo/utils"),Se=new Map,Oe=new WeakMap,At=70,Ce=class{value;#e;#t;constructor(t){this.value=t,this.#e=(0,A.deepClone)(t),this.#t=Date.now()}hotUpdate(t){Date.now()-this.#t<At||(0,A.deepEqual)(t,this.#e)||(this.value=t,this.#e=(0,A.deepClone)(t),this.#t=Date.now())}};function zt(o,t){Se.has(o)||Se.set(o,new Ce(t));let e=Se.get(o);if(e.hotUpdate(t),Oe.has(e))return Oe.get(e);let n=[()=>e.value,s=>{(0,A.isFunction)(s)&&(s=s(e.value)??e.value),e.value=s}];return Object.defineProperty(n,"value",{get(){return e.value},set(s){e.value=s}}),Oe.set(e,n),n}var Gt=we;0&&(module.exports={baseMiddleware,createDefineMock,defineMock,defineMockData,mockDevServerPlugin,mockWebSocket,transformMockData});
|
package/dist/index.d.cts
CHANGED
|
@@ -496,6 +496,23 @@ declare function defineMock(config: MockOptions): MockOptions;
|
|
|
496
496
|
*/
|
|
497
497
|
declare function createDefineMock(transformer: (mock: MockHttpItem | MockWebsocketItem) => MockHttpItem | MockWebsocketItem | void): typeof defineMock;
|
|
498
498
|
|
|
499
|
+
type MockData<T = any> = readonly [
|
|
500
|
+
/**
|
|
501
|
+
* getter
|
|
502
|
+
*/
|
|
503
|
+
() => T,
|
|
504
|
+
/**
|
|
505
|
+
* setter
|
|
506
|
+
*/
|
|
507
|
+
(val: T | ((val: T) => T | void)) => void
|
|
508
|
+
] & {
|
|
509
|
+
/**
|
|
510
|
+
* @property getter/setter
|
|
511
|
+
*/
|
|
512
|
+
value: T;
|
|
513
|
+
};
|
|
514
|
+
declare function defineMockData<T = any>(key: string, initialData: T): MockData<T>;
|
|
515
|
+
|
|
499
516
|
interface Logger {
|
|
500
517
|
info(msg: string, level?: boolean | LogLevel): void;
|
|
501
518
|
warn(msg: string, level?: boolean | LogLevel): void;
|
|
@@ -567,4 +584,4 @@ declare function mockWebSocket({ loader, httpServer, proxies, cookiesOptions, lo
|
|
|
567
584
|
|
|
568
585
|
declare function transformMockData(mockList: Map<string, MockHttpItem | MockWebsocketItem | MockOptions> | (MockHttpItem | MockWebsocketItem | MockOptions)[]): Record<string, MockOptions>;
|
|
569
586
|
|
|
570
|
-
export { BaseMiddlewareOptions, FormidableFile, MockHttpItem, MockOptions, MockRequest, MockServerPluginOptions, MockSocketOptions, MockWebsocketItem, baseMiddleware, createDefineMock, mockDevServerPlugin as default, defineMock, mockDevServerPlugin, mockWebSocket, transformMockData };
|
|
587
|
+
export { BaseMiddlewareOptions, FormidableFile, MockData, MockHttpItem, MockOptions, MockRequest, MockServerPluginOptions, MockSocketOptions, MockWebsocketItem, baseMiddleware, createDefineMock, mockDevServerPlugin as default, defineMock, defineMockData, mockDevServerPlugin, mockWebSocket, transformMockData };
|
package/dist/index.d.ts
CHANGED
|
@@ -496,6 +496,23 @@ declare function defineMock(config: MockOptions): MockOptions;
|
|
|
496
496
|
*/
|
|
497
497
|
declare function createDefineMock(transformer: (mock: MockHttpItem | MockWebsocketItem) => MockHttpItem | MockWebsocketItem | void): typeof defineMock;
|
|
498
498
|
|
|
499
|
+
type MockData<T = any> = readonly [
|
|
500
|
+
/**
|
|
501
|
+
* getter
|
|
502
|
+
*/
|
|
503
|
+
() => T,
|
|
504
|
+
/**
|
|
505
|
+
* setter
|
|
506
|
+
*/
|
|
507
|
+
(val: T | ((val: T) => T | void)) => void
|
|
508
|
+
] & {
|
|
509
|
+
/**
|
|
510
|
+
* @property getter/setter
|
|
511
|
+
*/
|
|
512
|
+
value: T;
|
|
513
|
+
};
|
|
514
|
+
declare function defineMockData<T = any>(key: string, initialData: T): MockData<T>;
|
|
515
|
+
|
|
499
516
|
interface Logger {
|
|
500
517
|
info(msg: string, level?: boolean | LogLevel): void;
|
|
501
518
|
warn(msg: string, level?: boolean | LogLevel): void;
|
|
@@ -567,4 +584,4 @@ declare function mockWebSocket({ loader, httpServer, proxies, cookiesOptions, lo
|
|
|
567
584
|
|
|
568
585
|
declare function transformMockData(mockList: Map<string, MockHttpItem | MockWebsocketItem | MockOptions> | (MockHttpItem | MockWebsocketItem | MockOptions)[]): Record<string, MockOptions>;
|
|
569
586
|
|
|
570
|
-
export { BaseMiddlewareOptions, FormidableFile, MockHttpItem, MockOptions, MockRequest, MockServerPluginOptions, MockSocketOptions, MockWebsocketItem, baseMiddleware, createDefineMock, mockDevServerPlugin as default, defineMock, mockDevServerPlugin, mockWebSocket, transformMockData };
|
|
587
|
+
export { BaseMiddlewareOptions, FormidableFile, MockData, MockHttpItem, MockOptions, MockRequest, MockServerPluginOptions, MockSocketOptions, MockWebsocketItem, baseMiddleware, createDefineMock, mockDevServerPlugin as default, defineMock, defineMockData, mockDevServerPlugin, mockWebSocket, transformMockData };
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{toArray as
|
|
1
|
+
import{toArray as Qt}from"@pengzhanbo/utils";import ct from"node:fs";import K from"node:fs/promises";import F from"node:path";import{toArray as X}from"@pengzhanbo/utils";import at from"fast-glob";import pt from"is-core-module";import{createFilter as lt,normalizePath as mt}from"vite";var fe="vite-plugin-mock-dev-server",ge="1.3.1";import he,{promises as se}from"node:fs";import{createRequire as Ve}from"node:module";import ne from"node:path";import{pathToFileURL as Ke}from"node:url";import{build as Xe}from"esbuild";import Ye from"json5";import oe from"node:fs";import re from"node:path";import{parse as Be}from"node:querystring";import{URL as Je,fileURLToPath as Ae}from"node:url";import ze from"debug";import{match as Ge}from"path-to-regexp";var Qe=o=>o!==null&&typeof o=="object"&&typeof o.pipe=="function",ke=o=>Qe(o)&&o.readable!==!1&&typeof o._read=="function"&&typeof o._readableState=="object";function ye(o){return re.dirname(Ae(o))}var A=ze("vite:mock-dev-server");function U(o,t,e){for(let s of t){let r=re.join(o,s);if(oe.existsSync(r)&&oe.statSync(r).isFile()){let i=e!=null&&e.pathOnly?r:oe.readFileSync(r,"utf-8");if(!(e!=null&&e.predicate)||e.predicate(i))return i}}let n=re.dirname(o);if(n!==o&&(!(e!=null&&e.rootDir)||n.startsWith(e==null?void 0:e.rootDir)))return U(n,t,e)}var z=(o={})=>{let t=[],e=[];return Object.keys(o).forEach(n=>{var r,i;let s=o[n];typeof s=="string"||!s.ws&&!((r=s.target)!=null&&r.toString().startsWith("ws:"))&&!((i=s.target)!=null&&i.toString().startsWith("wss:"))?t.push(n):e.push(n)}),{httpProxies:t,wsProxies:e}};function N(o,t){return o[0]==="^"&&new RegExp(o).test(t)||t.startsWith(o)}function q(o,t){return(Ge(o,{decode:decodeURIComponent})(t)||{params:{}}).params||{}}function R(o){let t=new Je(o,"http://example.com"),e=decodeURIComponent(t.pathname),n=Be(t.search.replace(/^\?/,""));return{pathname:e,query:n}}var Ze={name:"externalize-deps",setup(o){o.onResolve({filter:/.*/},({path:t})=>{if(t[0]!=="."&&!ne.isAbsolute(t))return{external:!0}})}},et={name:"json5-loader",setup(o){o.onLoad({filter:/\.json5$/},async({path:t})=>{let e=await se.readFile(t,"utf-8");return{contents:`export default ${JSON.stringify(Ye.parse(e))}`,loader:"js"}})}},tt={name:"json-loader",setup(o){o.onLoad({filter:/\.json$/},async({path:t})=>({contents:`export default ${await se.readFile(t,"utf-8")}`,loader:"js"}))}},ot=o=>({name:"alias-plugin",setup(t){t.onResolve({filter:/.*/},async({path:e})=>{let n=o.find(({find:c})=>rt(c,e));if(!n)return null;let{find:s,replacement:r}=n;return{path:(await t.resolve(e.replace(s,r),{kind:"import-statement",resolveDir:r,namespace:"file"})).path,external:!1}})}});function rt(o,t){return o instanceof RegExp?o.test(t):t.length<o.length?!1:t===o?!0:t.startsWith(`${o}/`)}async function G(o,t){var r;let{isESM:e=!0,define:n,alias:s}=t;try{let i=await Xe({entryPoints:[o],outfile:"out.js",write:!1,target:["node14.18","node16"],platform:"node",bundle:!0,metafile:!0,format:e?"esm":"cjs",define:n,plugins:[ot(s),Ze,tt,et]});return{code:i.outputFiles[0].text,deps:((r=i.metafile)==null?void 0:r.inputs)||{}}}catch(i){console.error(i)}return{code:"",deps:{}}}var nt=ye(import.meta.url),_=Ve(nt);async function ve(o,t,e,n){if(e){let s=`${o}.timestamp-${Date.now()}`,r=`${s}.mjs`,i=`${Ke(s)}.mjs`;await se.writeFile(r,t,"utf8");try{return await import(i)}finally{try{he.unlinkSync(r)}catch{}}}else{o=ne.resolve(n,o);let s=ne.extname(o),r=he.realpathSync(o),i=s in _.extensions?s:".js",c=_.extensions[i];_.extensions[i]=(p,m)=>{m===r?p._compile(t,m):c(p,m)},delete _.cache[_.resolve(o)];let a=_(o);return _.extensions[i]=c,a.__esModule?a:{default:a}}}import be from"picocolors";import{isBoolean as st}from"@pengzhanbo/utils";import I from"picocolors";var Me={silent:0,error:1,warn:2,info:3};function Q(o,t="info"){o=`[${o}]`;function e(s,r,i){if(i=st(i)?i?t:"error":i,Me[i]>=Me[s]){let a=s==="info"?"log":s,p=s==="info"?I.cyan(I.bold(o)):s==="warn"?I.yellow(I.bold(o)):I.red(I.bold(o)),m=`${I.dim(new Date().toLocaleTimeString())} ${p} ${r}`;console[a](m)}}return{info(s,r=t){e("info",s,r)},warn(s,r=t){e("warn",s,r)},error(s,r=t){e("error",s,r)}}}var it=/import\.meta\.env\.(.+)/;function V(o){let t=Q("vite:mock-dev-server","warn"),e={},n=process.env.NODE_ENV||o.mode;Object.assign(e,{"process.env.NODE_ENV":JSON.stringify(n),"global.process.env.NODE_ENV":JSON.stringify(n),"globalThis.process.env.NODE_ENV":JSON.stringify(n),__vite_process_env_NODE_ENV:JSON.stringify(n)});let s={},r={},i=[];for(let p in o.define){let m=o.define[p];if(typeof m=="string")try{JSON.parse(m),s[p]=m}catch{i.push(p)}else s[p]=JSON.stringify(m);let k=p.match(it);k&&s[p]&&(r[k[1]]=`__vite__define__${s[p]}`)}i.length&&t.warn(`The following keys: ${be.yellow(be.underline(i.join(", ")))} declared in 'define' cannot be parsed as regular code snippets.`);let c={},a={};c["import.meta.hot"]="undefined";for(let p in o.env)c[`import.meta.env.${p}`]=JSON.stringify(o.env[p]);return Object.assign(a,{"import.meta.env":JSON.stringify({...o.env,...r}).replace(/"__vite__define__(.+?)"([,}])/g,(p,m,k)=>`${m.replace(/(^\\")|(\\"$)/g,'"')}${k}`)}),{...c,...s,...a,...e}}async function xe(o,t,e){let n=X(e.include),s=X(e.exclude),r=V(t),{httpProxies:i}=z(t.server.proxy||{});i.push(...X(e.prefix));let c=X(e.wsPrefix),a={};try{let u=U(t.root,["package.json"]);u&&(a=JSON.parse(u))}catch{}let p=e.build.dist,m=await gt(process.cwd(),n,s),k=F.join(t.root,`mock-data-${Date.now()}.js`);await K.writeFile(k,m,"utf-8");let{code:w,deps:j}=await G(k,{define:r,alias:t.resolve.alias}),P=ut(j);await K.unlink(k);let l=[{filename:F.join(p,"mock-data.js"),source:w},{filename:F.join(p,"index.js"),source:ft(i,c,e.cookiesOptions,e.build.serverPort)},{filename:F.join(p,"package.json"),source:dt(a,P)}];try{if(F.isAbsolute(p)){await K.rm(p,{recursive:!0}),ct.mkdirSync(p,{recursive:!0});for(let{filename:u,source:d}of l)await K.writeFile(u,d,"utf-8")}else for(let{filename:u,source:d}of l)o.emitFile({type:"asset",fileName:u,source:d})}catch{}}function ut(o){let t=new Set,e=[fe,"connect","cors"];return Object.keys(o).forEach(n=>{o[n].imports.filter(r=>r.external&&!r.path.startsWith("<define:")).map(r=>r.path).forEach(r=>{!e.includes(r)&&!pt(r)&&t.add(r)})}),Array.from(t)}function dt(o,t){let{dependencies:e={},devDependencies:n={}}=o,s={...e,...n},r={name:"mock-server",type:"module",scripts:{start:"node index.js"},dependencies:{connect:"^3.7.0","vite-plugin-mock-dev-server":`^${ge}`,cors:"^2.8.5"},pnpm:{peerDependencyRules:{ignoreMissing:["vite"]}}};return t.forEach(i=>{r.dependencies[i]=s[i]||"latest"}),JSON.stringify(r,null,2)}function ft(o,t,e={},n=8080){return`import { createServer } from 'node:http';
|
|
2
2
|
import connect from 'connect';
|
|
3
3
|
import corsMiddleware from 'cors';
|
|
4
4
|
import { baseMiddleware, mockWebSocket } from 'vite-plugin-mock-dev-server';
|
|
@@ -22,7 +22,7 @@ app.use(baseMiddleware({ mockData }, {
|
|
|
22
22
|
server.listen(${n});
|
|
23
23
|
|
|
24
24
|
console.log('listen: http://localhost:${n}');
|
|
25
|
-
`}async function
|
|
25
|
+
`}async function gt(o,t,e){let n=await at(t,{cwd:o}),s=lt(t,e,{resolve:!1}),r=n.filter(s),i="",c="";return r.forEach((a,p)=>{let m=mt(F.join(o,a));i+=`import * as m${p} from '${m}';
|
|
26
26
|
`,c+=`m${p}, `}),`import { transformMockData } from 'vite-plugin-mock-dev-server';
|
|
27
27
|
${i}
|
|
28
28
|
const exporters = [${c}];
|
|
@@ -40,18 +40,18 @@ const mockList = exporters.map((raw) => {
|
|
|
40
40
|
}
|
|
41
41
|
return mockConfig
|
|
42
42
|
});
|
|
43
|
-
export default transformMockData(mockList);`}import{isBoolean as
|
|
43
|
+
export default transformMockData(mockList);`}import{isBoolean as Jt,toArray as te}from"@pengzhanbo/utils";import At from"cors";import{pathToRegexp as zt}from"path-to-regexp";import{Buffer as Pe}from"node:buffer";import{isArray as Y,isEmptyObject as ht,isFunction as Z,random as vt,sleep as Mt,sortBy as bt,timestamp as je}from"@pengzhanbo/utils";import xt from"cookies";import wt from"http-status";import*as B from"mime-types";import{pathToRegexp as De}from"path-to-regexp";import M from"picocolors";import ie from"co-body";import kt from"formidable";async function we(o,t){var s;let e=o.method.toUpperCase();if(["GET","DELETE","HEAD"].includes(e))return;let n=((s=o.headers["content-type"])==null?void 0:s.toLocaleLowerCase())||"";try{if(n.startsWith("application/json"))return await ie.json(o);if(n.startsWith("application/x-www-form-urlencoded"))return await ie.form(o);if(n.startsWith("text/plain"))return await ie.text(o);if(n.startsWith("multipart/form-data"))return await yt(o,t)}catch(r){console.error(r)}}async function yt(o,t){let e=kt(t);return new Promise((n,s)=>{e.parse(o,(r,i,c)=>{if(r){s(r);return}n({...i,...c})})})}import{isArray as Se,isObject as Oe}from"@pengzhanbo/utils";function Ce(o,t){return D(o.headers,t.headers)&&D(o.body,t.body)&&D(o.params,t.params)&&D(o.query,t.query)&&D(o.refererQuery,t.refererQuery)}function D(o,t){if(!t)return!0;for(let e in t)if(!Re(o[e],t[e]))return!1;return!0}function Re(o,t){if(Se(o)&&Se(t)){let e=new Set;return t.every(n=>o.some((s,r)=>{if(e.has(r))return!1;let i=Re(s,n);return i&&e.add(r),i}))}return Oe(o)&&Oe(t)?D(o,t):Object.is(o,t)}var St=/:/g;function Le(o,{formidableOptions:t={},proxies:e,cookiesOptions:n,logger:s}){return async function(r,i,c){let a=je(),{query:p,pathname:m}=R(r.url);if(!m||e.length===0||!e.some(O=>N(O,r.url)))return c();let k=o.mockData,w=bt(Object.keys(k),O=>{var v;return((v=O.match(St))==null?void 0:v.length)||0}).find(O=>De(O).test(m));if(!w)return c();let{query:j}=R(r.headers.referer||""),P=await we(r,t),l=new xt(r,i,n),u=l.get.bind(l),d=r.method.toUpperCase(),f=Ot(k[w],s,{pathname:m,method:d,request:{query:p,refererQuery:j,body:P,headers:r.headers,getCookie:u}});if(!f)return c();let g=r,y=i;g.body=P,g.query=p,g.refererQuery=j,g.params=q(f.url,m),g.getCookie=u,y.setCookie=l.set.bind(l);let{body:h,delay:S,type:W="json",response:L,status:E=200,statusText:$,log:C,__filepath__:T}=f;if(ce(y,E,$),await Ct(g,y,f,s),await Rt(g,y,f,s),s.info(jt(g,T),C),h){try{let O=Z(h)?await h(g):h;await We(a,S),Pt(y,O,W)}catch(O){s.error(`${M.red(`mock error at ${m}`)}
|
|
44
44
|
${O}
|
|
45
|
-
at body (${M.underline(T)})`,C),ce(y,500),i.end("")}return}if(
|
|
45
|
+
at body (${M.underline(T)})`,C),ce(y,500),i.end("")}return}if(L){try{await We(a,S),await L(g,y,c)}catch(O){s.error(`${M.red(`mock error at ${m}`)}
|
|
46
46
|
${O}
|
|
47
|
-
at response (${M.underline(T)})`,C),ce(y,500),i.end("")}return}i.end("")}}function
|
|
47
|
+
at response (${M.underline(T)})`,C),ce(y,500),i.end("")}return}i.end("")}}function Ot(o,t,{pathname:e,method:n,request:s}){return o.find(r=>{if(!e||!r||!r.url||r.ws===!0||!(r.method?Y(r.method)?r.method:[r.method]:["GET","POST"]).includes(n))return!1;let c=De(r.url).test(e);if(c&&r.validator){let a=q(r.url,e);if(Z(r.validator))return r.validator({params:a,...s});try{return Ce({params:a,...s},r.validator)}catch(p){let m=r.__filepath__;return t.error(`${M.red(`mock error at ${e}`)}
|
|
48
48
|
${p}
|
|
49
|
-
at validator (${M.underline(m)})`,r.log),!1}}return c})}function ce(o,t=200,e){o.statusCode=t,o.statusMessage=e||
|
|
49
|
+
at validator (${M.underline(m)})`,r.log),!1}}return c})}function ce(o,t=200,e){o.statusCode=t,o.statusMessage=e||Wt(t)}async function Ct(o,t,e,n){let{headers:s,type:r="json"}=e,i=e.__filepath__,c=B.contentType(r)||B.contentType(B.lookup(r)||"");if(c&&t.setHeader("Content-Type",c),t.setHeader("Cache-Control","no-cache,max-age=0"),t.setHeader("X-Mock-Power-By","vite-plugin-mock-dev-server"),t.setHeader("X-File-Path",i),!!s)try{let a=Z(s)?await s(o):s;Object.keys(a).forEach(p=>{t.setHeader(p,a[p])})}catch(a){n.error(`${M.red(`mock error at ${o.url.split("?")[0]}`)}
|
|
50
50
|
${a}
|
|
51
|
-
at headers (${M.underline(i)})`,e.log)}}async function
|
|
51
|
+
at headers (${M.underline(i)})`,e.log)}}async function Rt(o,t,e,n){let{cookies:s}=e,r=e.__filepath__;if(s)try{let i=Z(s)?await s(o):s;Object.keys(i).forEach(c=>{let a=i[c];if(Y(a)){let[p,m]=a;t.setCookie(c,p,m)}else t.setCookie(c,a)})}catch(i){n.error(`${M.red(`mock error at ${o.url.split("?")[0]}`)}
|
|
52
52
|
${i}
|
|
53
|
-
at cookies (${M.underline(r)})`,e.log)}}function
|
|
53
|
+
at cookies (${M.underline(r)})`,e.log)}}function Pt(o,t,e){if(ke(t))t.pipe(o);else if(Pe.isBuffer(t))o.end(e==="text"||e==="json"?t.toString("utf-8"):t);else{let n=typeof t=="string"?t:JSON.stringify(t);o.end(e==="buffer"?Pe.from(n):n)}}async function We(o,t){if(!t||typeof t=="number"&&t<=0||Y(t)&&t.length!==2)return;let e=0;if(Y(t)){let[n,s]=t;e=vt(n,s)}else e=t-(je()-o);e>0&&await Mt(e)}function Wt(o){return wt[o]||"Unknown"}function jt(o,t){let{url:e,method:n,query:s,params:r,body:i}=o,{pathname:c}=new URL(e,"http://example.com");c=M.green(decodeURIComponent(c));let a=(P,l)=>!l||ht(l)?"":` ${M.gray(`${P}:`)}${JSON.stringify(l)}`,p=M.magenta(M.bold(n)),m=a("query",s),k=a("params",r),w=a("body",i),j=` ${M.dim(M.underline(`(${t})`))}`;return`${p} ${c}${m}${k}${w}${j}`}import _t from"node:events";import{hasOwn as It,isArray as Tt,promiseParallel as Nt,toArray as Ft}from"@pengzhanbo/utils";import Ie from"chokidar";import Ht from"fast-glob";import{createFilter as Ut,normalizePath as J}from"vite";import{isArray as Dt,isEmptyObject as Ee,isFunction as $e,isObject as Lt,sortBy as Et}from"@pengzhanbo/utils";function _e(o){let t=[];for(let[,n]of o.entries())n&&(Dt(n)?t.push(...n):t.push(n));let e={};return t.filter(n=>Lt(n)&&n.enabled!==!1&&n.url).forEach(n=>{let{pathname:s,query:r}=R(n.url),i=e[s]??=[],c={...n,url:s};if(c.ws!==!0){let a=c.validator;Ee(r)||($e(a)?c.validator=function(p){return D(p.query,r)&&a(p)}:a?(c.validator={...a},c.validator.query=c.validator.query?{...r,...c.validator.query}:r):c.validator={query:r})}i.push(c)}),Object.keys(e).forEach(n=>{e[n]=Et(e[n],s=>{if(s.ws===!0)return 0;let{validator:r}=s;return!r||Ee(r)?2:$e(r)?0:1/Object.keys(r).reduce((c,a)=>c+$t(r[a]),0)})}),e}function $t(o){return o?Object.keys(o).length:0}var ee=class extends _t{constructor(e){super();this.options=e;this.cwd=e.cwd||process.cwd();try{let n=U(this.cwd,["package.json"]);this.moduleType=n&&JSON.parse(n).type==="module"?"esm":"cjs"}catch{}}moduleCache=new Map;moduleDeps=new Map;cwd;mockWatcher;depsWatcher;moduleType="cjs";_mockData={};get mockData(){return this._mockData}load(){let{include:e,exclude:n}=this.options,s=Ut(e,n,{resolve:!1});Ht(e,{cwd:this.cwd}).then(i=>i.filter(s).map(c=>()=>this.loadMock(c))).then(i=>Nt(i,10)).then(()=>this.updateMockList()),this.watchMockEntry(),this.watchDeps();let r=null;this.on("mock:update",async i=>{s(i)&&(await this.loadMock(i),r&&clearImmediate(r),r=setImmediate(()=>{this.updateMockList(),this.emit("mock:update-end",i),r=null}))}),this.on("mock:unlink",async i=>{s(i)&&(this.moduleCache.delete(i),this.updateMockList(),this.emit("mock:update-end",i))})}watchMockEntry(){let{include:e}=this.options,[n,...s]=e,r=this.mockWatcher=Ie.watch(n,{ignoreInitial:!0,cwd:this.cwd});s.length>0&&s.forEach(i=>r.add(i)),r.on("add",async i=>{i=J(i),this.emit("mock:update",i),A("watcher:add",i)}),r.on("change",async i=>{i=J(i),this.emit("mock:update",i),A("watcher:change",i)}),r.on("unlink",async i=>{i=J(i),this.emit("mock:unlink",i),A("watcher:unlink",i)})}watchDeps(){let e=[];this.depsWatcher=Ie.watch([],{ignoreInitial:!0,cwd:this.cwd}),this.depsWatcher.on("change",n=>{n=J(n);let s=this.moduleDeps.get(n);s&&s.forEach(r=>{this.emit("mock:update",r)})}),this.depsWatcher.on("unlink",n=>{n=J(n),this.moduleDeps.delete(n)}),this.on("update:deps",()=>{let n=[];for(let[r]of this.moduleDeps.entries())n.push(r);let s=n.filter(r=>!e.includes(r));s.length>0&&this.depsWatcher.add(s)})}close(){var e,n;(e=this.mockWatcher)==null||e.close(),(n=this.depsWatcher)==null||n.close()}updateMockList(){this._mockData=_e(this.moduleCache)}updateModuleDeps(e,n){Object.keys(n).forEach(s=>{n[s].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 n=!1;/\.m[jt]s$/.test(e)?n=!0:/\.c[jt]s$/.test(e)?n=!1:n=this.moduleType==="esm";let{define:s,alias:r}=this.options,{code:i,deps:c}=await G(e,{isESM:n,define:s,alias:r});try{let a=await ve(e,i,n,this.cwd)||{},p;It(a,"default")?p=a.default:(p=[],Object.keys(a).forEach(m=>p.push(...Ft(a[m])))),Tt(p)?p.forEach(m=>m.__filepath__=e):p.__filepath__=e,this.moduleCache.set(e,p),this.updateModuleDeps(e,c)}catch(a){console.error(a)}}};import qt from"cookies";import{pathToRegexp as Te}from"path-to-regexp";import H from"picocolors";import{WebSocketServer as Bt}from"ws";function Fe({loader:o,httpServer:t,proxies:e,cookiesOptions:n,logger:s}){var P;let r=new Map,i=new Map,c=new WeakMap,a=l=>{let u=i.get(l);return!u&&i.set(l,u=new Map),u},p=(l,u)=>{let d=l.get(u);return!d&&l.set(u,d=new Bt({noServer:!0})),d},m=(l,u)=>{let d=r.get(l);!d&&r.set(l,d=new Set),d.add(u)},k=(l,u,d,f,g,y)=>{var h;try{(h=d.setup)==null||h.call(d,u,f),u.on("close",()=>l.delete(g)),u.on("error",S=>{s.error(`${H.red(`WebSocket mock error at ${u.path}`)}
|
|
54
54
|
${S}
|
|
55
|
-
at setup (${y})`,d.log)})}catch(S){s.error(`${
|
|
55
|
+
at setup (${y})`,d.log)})}catch(S){s.error(`${H.red(`WebSocket mock error at ${u.path}`)}
|
|
56
56
|
${S}
|
|
57
|
-
at setup (${y})`,d.log)}},w=(l,u,d,f)=>{l.emit("connection",u,d),u.on("close",()=>{let g=f.findIndex(y=>y.ws===u);g!==-1&&f.splice(g,1)})},j=(l,u,d,f,g)=>{let{cleanupList:y,connectionList:h,context:S}=c.get(u);
|
|
57
|
+
at setup (${y})`,d.log)}},w=(l,u,d,f)=>{l.emit("connection",u,d),u.on("close",()=>{let g=f.findIndex(y=>y.ws===u);g!==-1&&f.splice(g,1)})},j=(l,u,d,f,g)=>{let{cleanupList:y,connectionList:h,context:S}=c.get(u);Ne(y),h.forEach(({ws:W})=>W.removeAllListeners()),u.removeAllListeners(),k(l,u,d,S,f,g),h.forEach(({ws:W,req:L})=>w(u,W,L,h))};(P=o.on)==null||P.call(o,"mock:update-end",l=>{if(!r.has(l))return;let u=r.get(l);if(u)for(let d of u.values())for(let f of o.mockData[d]){if(!f.ws||f.__filepath__!==l)return;let g=a(d);for(let[y,h]of g.entries())j(g,h,f,y,l)}}),t==null||t.on("upgrade",(l,u,d)=>{let{pathname:f,query:g}=R(l.url);if(!f||e.length===0||!e.some(v=>N(v,l.url)))return;let y=o.mockData,h=Object.keys(y).find(v=>Te(v).test(f));if(!h)return;let S=y[h].find(v=>v.url&&v.ws&&Te(v.url).test(f));if(!S)return;let W=S.__filepath__;m(W,h);let L=a(h),E=p(L,f),$=c.get(E);if(!$){let v=[],ue={onCleanup:qe=>v.push(qe)};$={cleanupList:v,context:ue,connectionList:[]},c.set(E,$),k(L,E,S,ue,f,W)}let C=l,T=new qt(l,l,n),{query:O}=R(l.headers.referer||"");C.query=g,C.refererQuery=O,C.params=q(h,f),C.getCookie=T.get.bind(T),E.handleUpgrade(C,u,d,v=>{s.info(`${H.magenta(H.bold("WebSocket"))} ${H.green(l.url)} connected ${H.dim(`(${W})`)}`,S.log),$.connectionList.push({req:C,ws:v}),w(E,v,C,$.connectionList)})}),t==null||t.on("close",()=>{for(let l of i.values()){for(let u of l.values()){let d=c.get(u);Ne(d.cleanupList),u.close()}l.clear()}i.clear(),r.clear()})}function Ne(o){let t;for(;t=o.shift();)t==null||t()}function ae(o,t,e,n){let s=Q("vite:mock",Jt(t.log)?t.log?"info":"error":t.log),r=new ee({include:te(t.include),exclude:te(t.exclude),define:V(o),alias:o.resolve.alias});r.load(),r.on("mock:update-end",()=>{t.reload&&(n==null||n.send({type:"full-reload"}))}),e==null||e.on("close",()=>r.close());let{httpProxies:i}=z(o.server.proxy||{}),a=[...te(t.prefix),...i];Fe({loader:r,httpServer:e,proxies:te(t.wsPrefix),cookiesOptions:t.cookiesOptions,logger:s});let p=[];return p.push(Gt(r,a,o,t),Le(r,{formidableOptions:t.formidableOptions,proxies:a,cookiesOptions:t.cookiesOptions,logger:s})),p.filter(Boolean)}function Gt(o,t,e,n){let s={},r=n.cors===!1?!1:e.server.cors!==!1;return r&&e.server.cors!==!1&&(s={...s,...typeof e.server.cors=="boolean"?{}:e.server.cors}),r&&n.cors!==!1&&(s={...s,...typeof n.cors=="boolean"?{}:n.cors}),r?function(i,c,a){let{pathname:p}=R(i.url);if(!p||t.length===0||!t.some(w=>N(w,i.url)))return a();let m=o.mockData;if(!Object.keys(m).find(w=>zt(w).test(p)))return a();At(s)(i,c,a)}:void 0}function He({prefix:o=[],wsPrefix:t=[],include:e=["mock/**/*.mock.{js,ts,cjs,mjs,json,json5}"],exclude:n=["**/node_modules/**","**/.vscode/**","**/.git/**"],reload:s=!1,log:r="info",cors:i=!0,formidableOptions:c={},build:a=!1,cookiesOptions:p={}}={}){let m={prefix:o,wsPrefix:t,include:e,exclude:n,reload:s,cors:i,cookiesOptions:p,log:r,formidableOptions:{multiples:!0,...c},build:a?Object.assign({serverPort:8080,dist:"mockServer"},typeof a=="object"?a:{}):!1},k=[Kt(m)];return m.build&&k.push(Vt(m)),k}function Vt(o){let t={};return{name:"vite-plugin-mock-dev-server-generator",enforce:"post",apply:"build",configResolved(e){t=e,e.logger.warn("")},async buildEnd(e){e||t.command==="build"&&await xe(this,t,o)}}}function Kt(o){let t={};return{name:"vite-plugin-mock-dev-server",enforce:"pre",apply:"serve",config(e){var r;let n=Qt(o.wsPrefix);if(n.length===0||!((r=e.server)!=null&&r.proxy)||Object.keys(e.server.proxy).length===0)return;let s={};Object.keys(e.server.proxy).forEach(i=>{n.includes(i)||(s[i]=e.server.proxy[i])}),e.server.proxy=s},configResolved(e){t=e,e.logger.warn("")},configureServer({middlewares:e,config:n,httpServer:s,ws:r}){ae(n,o,s,r).forEach(c=>e.use(c))},configurePreviewServer({middlewares:e,httpServer:n}){ae(t,o,n).forEach(r=>e.use(r))}}}import{isArray as Xt}from"@pengzhanbo/utils";function Jr(o){return o}function Ar(o){return e=>(Xt(e)?e=e.map(n=>o(n)||n):e=o(e)||e,e)}import{deepClone as Ue,deepEqual as Yt,isFunction as Zt}from"@pengzhanbo/utils";var pe=new Map,le=new WeakMap,eo=70,me=class{value;#e;#t;constructor(t){this.value=t,this.#e=Ue(t),this.#t=Date.now()}hotUpdate(t){Date.now()-this.#t<eo||Yt(t,this.#e)||(this.value=t,this.#e=Ue(t),this.#t=Date.now())}};function Vr(o,t){pe.has(o)||pe.set(o,new me(t));let e=pe.get(o);if(e.hotUpdate(t),le.has(e))return le.get(e);let n=[()=>e.value,s=>{Zt(s)&&(s=s(e.value)??e.value),e.value=s}];return Object.defineProperty(n,"value",{get(){return e.value},set(s){e.value=s}}),le.set(e,n),n}var Zr=He;export{Le as baseMiddleware,Ar as createDefineMock,Zr as default,Jr as defineMock,Vr as defineMockData,He as mockDevServerPlugin,Fe as mockWebSocket,_e as transformMockData};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vite-plugin-mock-dev-server",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.1",
|
|
4
4
|
"keywords": [
|
|
5
5
|
"vite",
|
|
6
6
|
"plugin",
|
|
@@ -44,11 +44,11 @@
|
|
|
44
44
|
"cookies": "^0.8.0",
|
|
45
45
|
"cors": "^2.8.5",
|
|
46
46
|
"debug": "^4.3.4",
|
|
47
|
-
"esbuild": "^0.
|
|
47
|
+
"esbuild": "^0.19.2",
|
|
48
48
|
"fast-glob": "^3.3.1",
|
|
49
49
|
"formidable": "2.1.1",
|
|
50
50
|
"http-status": "^1.6.2",
|
|
51
|
-
"is-core-module": "^2.
|
|
51
|
+
"is-core-module": "^2.13.0",
|
|
52
52
|
"json5": "^2.2.3",
|
|
53
53
|
"mime-types": "^2.1.35",
|
|
54
54
|
"path-to-regexp": "^6.2.1",
|
|
@@ -56,8 +56,8 @@
|
|
|
56
56
|
"ws": "^8.13.0"
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
|
-
"@pengzhanbo/eslint-config": "^0.4.
|
|
60
|
-
"@pengzhanbo/prettier-config": "^0.4.
|
|
59
|
+
"@pengzhanbo/eslint-config": "^0.4.2",
|
|
60
|
+
"@pengzhanbo/prettier-config": "^0.4.2",
|
|
61
61
|
"@types/co-body": "^6.1.0",
|
|
62
62
|
"@types/cookies": "^0.7.7",
|
|
63
63
|
"@types/cors": "^2.8.13",
|
|
@@ -67,15 +67,15 @@
|
|
|
67
67
|
"@types/mime-types": "^2.1.1",
|
|
68
68
|
"@types/node": "^20.4.3",
|
|
69
69
|
"@types/ws": "^8.5.5",
|
|
70
|
-
"bumpp": "^9.
|
|
70
|
+
"bumpp": "^9.2.0",
|
|
71
71
|
"conventional-changelog-cli": "^3.0.0",
|
|
72
|
-
"eslint": "^8.
|
|
72
|
+
"eslint": "^8.48.0",
|
|
73
73
|
"mockjs": "^1.1.0",
|
|
74
|
-
"prettier": "^3.0.
|
|
75
|
-
"tsup": "^7.
|
|
76
|
-
"typescript": "^5.
|
|
77
|
-
"vite": "^4.4.
|
|
78
|
-
"vitepress": "1.0.0-
|
|
74
|
+
"prettier": "^3.0.2",
|
|
75
|
+
"tsup": "^7.2.0",
|
|
76
|
+
"typescript": "^5.2.2",
|
|
77
|
+
"vite": "^4.4.9",
|
|
78
|
+
"vitepress": "^1.0.0-rc.4"
|
|
79
79
|
},
|
|
80
80
|
"peerDependencies": {
|
|
81
81
|
"vite": ">=3.0.0"
|