vite-plugin-mock-dev-server 1.2.1 → 1.3.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -183,7 +183,13 @@ export default defineConfig({
183
183
  Configure to `cors`, see [cors](https://github.com/expressjs/cors#configuration-options)
184
184
 
185
185
 
186
- **Default:** `false`
186
+ **Default:** `true`
187
+
188
+ - `options.log`
189
+
190
+ **Type:** `true | 'info' | 'warn' | 'error' | 'silent'`
191
+
192
+ Enable log and configure log level.
187
193
 
188
194
  - `options.formidableOptions`
189
195
 
package/README.zh-CN.md CHANGED
@@ -181,6 +181,12 @@ export default defineConfig({
181
181
 
182
182
  配置 `cors`, 查看 [cors](https://github.com/expressjs/cors#configuration-options)
183
183
 
184
+ - `options.log`
185
+
186
+ **Type:** `true | 'info' | 'warn' | 'error' | 'silent'`
187
+
188
+ 启动日志,以及配置日志打印级别
189
+
184
190
  - `options.formidableOptions`
185
191
 
186
192
  配置 `formidable`,查看 [formidable options](https://github.com/node-formidable/formidable#options)
package/dist/index.cjs CHANGED
@@ -1,6 +1,4 @@
1
- "use strict";var pt=Object.create;var Q=Object.defineProperty;var lt=Object.getOwnPropertyDescriptor;var ut=Object.getOwnPropertyNames;var mt=Object.getPrototypeOf,dt=Object.prototype.hasOwnProperty;var ft=(e,o)=>{for(var t in o)Q(e,t,{get:o[t],enumerable:!0})},Se=(e,o,t,r)=>{if(o&&typeof o=="object"||typeof o=="function")for(let n of ut(o))!dt.call(e,n)&&n!==t&&Q(e,n,{get:()=>o[n],enumerable:!(r=lt(o,n))||r.enumerable});return e};var f=(e,o,t)=>(t=e!=null?pt(mt(e)):{},Se(o||!e||!e.__esModule?Q(t,"default",{value:e,enumerable:!0}):t,e)),kt=e=>Se(Q({},"__esModule",{value:!0}),e);var Ht={};ft(Ht,{baseMiddleware:()=>ke,createDefineMock:()=>Ft,default:()=>Nt,defineMock:()=>Tt,mockDevServerPlugin:()=>xe,mockWebSocket:()=>Me,transformMockData:()=>ge});module.exports=kt(Ht);var gt=()=>typeof document>"u"?new URL("file:"+__filename).href:document.currentScript&&document.currentScript.src||new URL("main.js",document.baseURI).href,b=gt();var $e=f(require("fs"),1),z=f(require("fs/promises"),1),N=f(require("path"),1),Te=require("esbuild"),Fe=f(require("fast-glob"),1),Ne=f(require("is-core-module"),1),se=require("vite");var Ce="vite-plugin-mock-dev-server",je="1.2.1";var Z=f(require("picocolors"),1);var V=f(require("fs"),1),K=f(require("path"),1),Pe=require("querystring"),X=require("url"),Re=f(require("debug"),1),We=require("path-to-regexp"),pe=f(require("picocolors"),1),M=e=>Array.isArray(e),D=e=>typeof e=="function",U=e=>Object.prototype.toString.call(e)==="[object Object]",le=e=>U(e)&&Object.keys(e).length===0,yt=e=>e!==null&&typeof e=="object"&&typeof e.pipe=="function",De=e=>yt(e)&&e.readable!==!1&&typeof e._read=="function"&&typeof e._readableState=="object";function Ee(e){return new Promise(o=>setTimeout(o,e))}function _e(e){return K.default.dirname((0,X.fileURLToPath)(e))}var E=(0,Re.default)("vite:plugin-mock-dev-server"),S=e=>M(e)?e:e==null?[]:[e],j={info(...e){console.info(pe.default.cyan("mock-dev-server: "),...e)},error(...e){console.error(`
2
- `,pe.default.cyan("mock-dev-server: "),...e,`
3
- `)}};function J(e,o,t){for(let n of o){let s=K.default.join(e,n);if(V.default.existsSync(s)&&V.default.statSync(s).isFile()){let i=t!=null&&t.pathOnly?s:V.default.readFileSync(s,"utf-8");if(!(t!=null&&t.predicate)||t.predicate(i))return i}}let r=K.default.dirname(e);if(r!==e&&(!(t!=null&&t.rootDir)||r.startsWith(t==null?void 0:t.rootDir)))return J(r,o,t)}var Y=(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 A(e,o){return e[0]==="^"&&new RegExp(e).test(o)||o.startsWith(e)}function q(e,o){return((0,We.match)(e,{decode:decodeURIComponent})(o)||{params:{}}).params||{}}function P(e){let o=new X.URL(e,"http://example.com"),t=decodeURIComponent(o.pathname),r=(0,Pe.parse)(o.search.replace(/^\?/,""));return{pathname:t,query:r}}var ht=/import\.meta\.env\.(.+)/;function ee(e){let o={},t=process.env.NODE_ENV||e.mode;Object.assign(o,{"process.env.NODE_ENV":JSON.stringify(t),"global.process.env.NODE_ENV":JSON.stringify(t),"globalThis.process.env.NODE_ENV":JSON.stringify(t),__vite_process_env_NODE_ENV:JSON.stringify(t)});let r={},n={},s=[];for(let a in e.define){let p=e.define[a];if(typeof p=="string")try{JSON.parse(p),r[a]=p}catch{s.push(a)}else r[a]=JSON.stringify(p);let k=a.match(ht);k&&r[a]&&(n[k[1]]=`__vite__define__${r[a]}`)}s.length&&j.error(`${Z.default.yellow("[warn]")} The following keys: ${Z.default.yellow(Z.default.underline(s.join(", ")))} declared in 'define' cannot be parsed as regular code snippets.`);let i={},c={};i["import.meta.hot"]="undefined";for(let a in e.env)i[`import.meta.env.${a}`]=JSON.stringify(e.env[a]);return Object.assign(c,{"import.meta.env":JSON.stringify({...e.env,...n}).replace(/"__vite__define__(.+?)"([,}])/g,(a,p,k)=>`${p.replace(/(^\\")|(\\"$)/g,'"')}${k}`)}),{...i,...r,...c,...o}}var ue=f(require("fs/promises"),1),Le=f(require("path"),1),Ie=f(require("json5"),1),te={name:"externalize-deps",setup(e){e.onResolve({filter:/.*/},({path:o})=>{if(o[0]!=="."&&!Le.default.isAbsolute(o))return{external:!0}})}},oe={name:"json5-loader",setup(e){e.onLoad({filter:/\.json5$/},async({path:o})=>{let t=await ue.default.readFile(o,"utf-8");return{contents:`export default ${JSON.stringify(Ie.default.parse(t))}`,loader:"js"}})}},re={name:"json-loader",setup(e){e.onLoad({filter:/\.json$/},async({path:o})=>({contents:`export default ${await ue.default.readFile(o,"utf-8")}`,loader:"js"}))}},ne=e=>({name:"alias-plugin",setup(o){o.onResolve({filter:/.*/},async({path:t})=>{let r=e.find(({find:c})=>vt(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 vt(e,o){return e instanceof RegExp?e.test(o):o.length<e.length?!1:o===e?!0:o.startsWith(`${e}/`)}async function He(e,o,t){let r=S(t.include),n=S(t.exclude),s=ee(o),{httpProxies:i}=Y(o.server.proxy||{});i.push(...S(t.prefix));let c=S(t.wsPrefix),a={};try{let m=J(o.root,["package.json"]);m&&(a=JSON.parse(m))}catch{}let p=t.build.dist,k=await wt(process.cwd(),r,n),x=N.default.join(o.root,`mock-data-${Date.now()}.js`);await z.default.writeFile(x,k,"utf-8");let{code:O,deps:I}=await St(x,s,o.resolve.alias),l=Mt(I);await z.default.unlink(x);let u=[{filename:N.default.join(p,"mock-data.js"),source:O},{filename:N.default.join(p,"index.js"),source:xt(i,c,t.cookiesOptions,t.build.serverPort)},{filename:N.default.join(p,"package.json"),source:bt(a,l)}];try{if(N.default.isAbsolute(p)){await z.default.rm(p,{recursive:!0}),$e.default.mkdirSync(p,{recursive:!0});for(let{filename:m,source:d}of u)await z.default.writeFile(m,d,"utf-8")}else for(let{filename:m,source:d}of u)e.emitFile({type:"asset",fileName:m,source:d})}catch{}}function Mt(e){let o=new Set,t=[Ce,"connect","cors"];return Object.keys(e).forEach(r=>{e[r].imports.filter(s=>s.external&&!s.path.startsWith("<define:")).map(s=>s.path).forEach(s=>{!t.includes(s)&&!(0,Ne.default)(s)&&o.add(s)})}),Array.from(o)}function bt(e,o){let{dependencies:t={},devDependencies:r={}}=e,n={...t,...r},s={name:"mock-server",type:"module",scripts:{start:"node index.js"},dependencies:{connect:"^3.7.0","vite-plugin-mock-dev-server":`^${je}`,cors:"^2.8.5"},pnpm:{peerDependencyRules:{ignoreMissing:["vite"]}}};return o.forEach(i=>{s.dependencies[i]=n[i]||"latest"}),JSON.stringify(s,null,2)}function xt(e,o,t={},r=8080){return`import { createServer } from 'node:http';
1
+ "use strict";var ct=Object.create;var Z=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var pt=Object.getOwnPropertyNames;var lt=Object.getPrototypeOf,mt=Object.prototype.hasOwnProperty;var ut=(t,o)=>{for(var e in o)Z(t,e,{get:o[e],enumerable:!0})},Se=(t,o,e,n)=>{if(o&&typeof o=="object"||typeof o=="function")for(let s of pt(o))!mt.call(t,s)&&s!==e&&Z(t,s,{get:()=>o[s],enumerable:!(n=at(o,s))||n.enumerable});return t};var f=(t,o,e)=>(e=t!=null?ct(lt(t)):{},Se(o||!t||!t.__esModule?Z(e,"default",{value:t,enumerable:!0}):e,t)),dt=t=>Se(Z({},"__esModule",{value:!0}),t);var qt={};ut(qt,{baseMiddleware:()=>ke,createDefineMock:()=>Ft,default:()=>Ut,defineMock:()=>Ht,mockDevServerPlugin:()=>xe,mockWebSocket:()=>Me,transformMockData:()=>ye});module.exports=dt(qt);var ft=()=>typeof document>"u"?new URL("file:"+__filename).href:document.currentScript&&document.currentScript.src||new URL("main.js",document.baseURI).href,w=ft();var nt=require("@pengzhanbo/utils");var Fe=f(require("fs"),1),K=f(require("fs/promises"),1),q=f(require("path"),1),X=require("@pengzhanbo/utils"),Ue=f(require("fast-glob"),1),qe=f(require("is-core-module"),1),pe=require("vite");var Re="vite-plugin-mock-dev-server",Ce="1.3.0-beta.0";var U=f(require("fs"),1),$e=require("module"),se=f(require("path"),1),_e=require("url"),De=require("esbuild"),Ie=f(require("json5"),1);var ee=f(require("fs"),1),te=f(require("path"),1),Pe=require("querystring"),oe=require("url"),We=f(require("debug"),1),je=require("path-to-regexp"),gt=t=>t!==null&&typeof t=="object"&&typeof t.pipe=="function",Le=t=>gt(t)&&t.readable!==!1&&typeof t._read=="function"&&typeof t._readableState=="object";function Ee(t){return te.default.dirname((0,oe.fileURLToPath)(t))}var re=(0,We.default)("vite:mock-dev-server");function Q(t,o,e){for(let s of o){let r=te.default.join(t,s);if(ee.default.existsSync(r)&&ee.default.statSync(r).isFile()){let i=e!=null&&e.pathOnly?r:ee.default.readFileSync(r,"utf-8");if(!(e!=null&&e.predicate)||e.predicate(i))return i}}let n=te.default.dirname(t);if(n!==t&&(!(e!=null&&e.rootDir)||n.startsWith(e==null?void 0:e.rootDir)))return Q(n,o,e)}var ne=(t={})=>{let o=[],e=[];return Object.keys(t).forEach(n=>{var r,i;let s=t[n];typeof s=="string"||!s.ws&&!((r=s.target)!=null&&r.toString().startsWith("ws:"))&&!((i=s.target)!=null&&i.toString().startsWith("wss:"))?o.push(n):e.push(n)}),{httpProxies:o,wsProxies:e}};function z(t,o){return t[0]==="^"&&new RegExp(t).test(o)||o.startsWith(t)}function V(t,o){return((0,je.match)(t,{decode:decodeURIComponent})(o)||{params:{}}).params||{}}function W(t){let o=new oe.URL(t,"http://example.com"),e=decodeURIComponent(o.pathname),n=(0,Pe.parse)(o.search.replace(/^\?/,""));return{pathname:e,query:n}}var kt={name:"externalize-deps",setup(t){t.onResolve({filter:/.*/},({path:o})=>{if(o[0]!=="."&&!se.default.isAbsolute(o))return{external:!0}})}},yt={name:"json5-loader",setup(t){t.onLoad({filter:/\.json5$/},async({path:o})=>{let e=await U.promises.readFile(o,"utf-8");return{contents:`export default ${JSON.stringify(Ie.default.parse(e))}`,loader:"js"}})}},ht={name:"json-loader",setup(t){t.onLoad({filter:/\.json$/},async({path:o})=>({contents:`export default ${await U.promises.readFile(o,"utf-8")}`,loader:"js"}))}},vt=t=>({name:"alias-plugin",setup(o){o.onResolve({filter:/.*/},async({path:e})=>{let n=t.find(({find:c})=>Mt(c,e));if(!n)return null;let{find:s,replacement:r}=n;return{path:(await o.resolve(e.replace(s,r),{kind:"import-statement",resolveDir:r,namespace:"file"})).path,external:!1}})}});function Mt(t,o){return t instanceof RegExp?t.test(o):o.length<t.length?!1:o===t?!0:o.startsWith(`${t}/`)}async function ie(t,o){var r;let{isESM:e=!0,define:n,alias:s}=o;try{let i=await(0,De.build)({entryPoints:[t],outfile:"out.js",write:!1,target:["node14.18","node16"],platform:"node",bundle:!0,metafile:!0,format:e?"esm":"cjs",define:n,plugins:[vt(s),kt,ht,yt]});return{code:i.outputFiles[0].text,deps:((r=i.metafile)==null?void 0:r.inputs)||{}}}catch(i){console.error(i)}return{code:"",deps:{}}}var bt=Ee(w),F=(0,$e.createRequire)(bt);async function Te(t,o,e,n){if(e){let s=`${t}.timestamp-${Date.now()}`,r=`${s}.mjs`,i=`${(0,_e.pathToFileURL)(s)}.mjs`;await U.promises.writeFile(r,o,"utf8");try{return await import(i)}finally{try{U.default.unlinkSync(r)}catch{}}}else{t=se.default.resolve(n,t);let s=se.default.extname(t),r=U.default.realpathSync(t),i=s in F.extensions?s:".js",c=F.extensions[i];F.extensions[i]=(p,m)=>{m===r?p._compile(o,m):c(p,m)},delete F.cache[F.resolve(t)];let a=F(t);return F.extensions[i]=c,a.__esModule?a:{default:a}}}var ue=f(require("picocolors"),1);var He=require("@pengzhanbo/utils"),$=f(require("picocolors"),1),Ne={silent:0,error:1,warn:2,info:3};function ce(t,o="info"){t=`[${t}]`;function e(s,r,i){if(i=(0,He.isBoolean)(i)?i?o:"error":i,Ne[i]>=Ne[s]){let a=s==="info"?"log":s,p=s==="info"?$.default.cyan($.default.bold(t)):s==="warn"?$.default.yellow($.default.bold(t)):$.default.red($.default.bold(t)),m=`${$.default.dim(new Date().toLocaleTimeString())} ${p} ${r}`;console[a](m)}}return{info(s,r=o){e("info",s,r)},warn(s,r=o){e("warn",s,r)},error(s,r=o){e("error",s,r)}}}var xt=/import\.meta\.env\.(.+)/;function ae(t){let o=ce("vite:mock-dev-server","warn"),e={},n=process.env.NODE_ENV||t.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 t.define){let m=t.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(xt);h&&s[p]&&(r[h[1]]=`__vite__define__${s[p]}`)}i.length&&o.warn(`The following keys: ${ue.default.yellow(ue.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 t.env)c[`import.meta.env.${p}`]=JSON.stringify(t.env[p]);return Object.assign(a,{"import.meta.env":JSON.stringify({...t.env,...r}).replace(/"__vite__define__(.+?)"([,}])/g,(p,m,h)=>`${m.replace(/(^\\")|(\\"$)/g,'"')}${h}`)}),{...c,...s,...a,...e}}async function Be(t,o,e){let n=(0,X.toArray)(e.include),s=(0,X.toArray)(e.exclude),r=ae(o),{httpProxies:i}=ne(o.server.proxy||{});i.push(...(0,X.toArray)(e.prefix));let c=(0,X.toArray)(e.wsPrefix),a={};try{let u=Q(o.root,["package.json"]);u&&(a=JSON.parse(u))}catch{}let p=e.build.dist,m=await Rt(process.cwd(),n,s),h=q.default.join(o.root,`mock-data-${Date.now()}.js`);await K.default.writeFile(h,m,"utf-8");let{code:S,deps:E}=await ie(h,{define:r,alias:o.resolve.alias}),j=wt(E);await K.default.unlink(h);let l=[{filename:q.default.join(p,"mock-data.js"),source:S},{filename:q.default.join(p,"index.js"),source:Ot(i,c,e.cookiesOptions,e.build.serverPort)},{filename:q.default.join(p,"package.json"),source:St(a,j)}];try{if(q.default.isAbsolute(p)){await K.default.rm(p,{recursive:!0}),Fe.default.mkdirSync(p,{recursive:!0});for(let{filename:u,source:d}of l)await K.default.writeFile(u,d,"utf-8")}else for(let{filename:u,source:d}of l)t.emitFile({type:"asset",fileName:u,source:d})}catch{}}function wt(t){let o=new Set,e=[Re,"connect","cors"];return Object.keys(t).forEach(n=>{t[n].imports.filter(r=>r.external&&!r.path.startsWith("<define:")).map(r=>r.path).forEach(r=>{!e.includes(r)&&!(0,qe.default)(r)&&o.add(r)})}),Array.from(o)}function St(t,o){let{dependencies:e={},devDependencies:n={}}=t,s={...e,...n},r={name:"mock-server",type:"module",scripts:{start:"node index.js"},dependencies:{connect:"^3.7.0","vite-plugin-mock-dev-server":`^${Ce}`,cors:"^2.8.5"},pnpm:{peerDependencyRules:{ignoreMissing:["vite"]}}};return o.forEach(i=>{r.dependencies[i]=s[i]||"latest"}),JSON.stringify(r,null,2)}function Ot(t,o,e={},n=8080){return`import { createServer } from 'node:http';
4
2
  import connect from 'connect';
5
3
  import corsMiddleware from 'cors';
6
4
  import { baseMiddleware, mockWebSocket } from 'vite-plugin-mock-dev-server';
@@ -8,11 +6,11 @@ import mockData from './mock-data.js';
8
6
 
9
7
  const app = connect();
10
8
  const server = createServer(app);
11
- const httpProxies = ${JSON.stringify(e)};
12
- const wxProxies = ${JSON.stringify(o)};
13
- const cookiesOptions = ${JSON.stringify(t)};
9
+ const httpProxies = ${JSON.stringify(t)};
10
+ const wsProxies = ${JSON.stringify(o)};
11
+ const cookiesOptions = ${JSON.stringify(e)};
14
12
 
15
- mockWebSocket({ mockData }, server, wxProxies, cookiesOptions);
13
+ mockWebSocket({ mockData }, server, wsProxies, cookiesOptions);
16
14
 
17
15
  app.use(corsMiddleware());
18
16
  app.use(baseMiddleware({ mockData }, {
@@ -21,10 +19,10 @@ app.use(baseMiddleware({ mockData }, {
21
19
  cookiesOptions,
22
20
  }));
23
21
 
24
- server.listen(${r});
22
+ server.listen(${n});
25
23
 
26
- console.log('listen: http://localhost:${r}');
27
- `}async function wt(e,o,t){let r=await(0,Fe.default)(o,{cwd:e}),n=(0,se.createFilter)(o,t,{resolve:!1}),s=r.filter(n),i="",c="";return s.forEach((a,p)=>{let k=(0,se.normalizePath)(N.default.join(e,a));i+=`import * as m${p} from '${k}';
24
+ console.log('listen: http://localhost:${n}');
25
+ `}async function Rt(t,o,e){let n=await(0,Ue.default)(o,{cwd:t}),s=(0,pe.createFilter)(o,e,{resolve:!1}),r=n.filter(s),i="",c="";return r.forEach((a,p)=>{let m=(0,pe.normalizePath)(q.default.join(t,a));i+=`import * as m${p} from '${m}';
28
26
  `,c+=`m${p}, `}),`import { transformMockData } from 'vite-plugin-mock-dev-server';
29
27
  ${i}
30
28
  const exporters = [${c}];
@@ -42,10 +40,18 @@ const mockList = exporters.map((raw) => {
42
40
  }
43
41
  return mockConfig
44
42
  });
45
- export default transformMockData(mockList);`}async function St(e,o,t){var r;try{let n=await(0,Te.build)({entryPoints:[e],outfile:"out.js",write:!1,target:["node14.18","node16"],platform:"node",bundle:!0,metafile:!0,format:"esm",define:o,plugins:[ne(t),te,oe,re]});return{code:n.outputFiles[0].text,deps:((r=n.metafile)==null?void 0:r.inputs)||{}}}catch(n){console.error(n)}return{code:"",deps:{}}}var st=f(require("cors"),1),it=require("path-to-regexp");var de=require("buffer"),ze=f(require("cookies"),1),Ge=f(require("http-status"),1),Qe=f(require("lodash.sortby"),1),G=f(require("mime-types"),1),fe=require("path-to-regexp"),R=f(require("picocolors"),1);var ie=f(require("co-body"),1),Ue=f(require("formidable"),1);async function Ae(e,o){var n;let t=e.method.toUpperCase();if(["GET","DELETE","HEAD"].includes(t))return;let r=((n=e.headers["content-type"])==null?void 0:n.toLocaleLowerCase())||"";try{if(r.startsWith("application/json"))return await ie.default.json(e);if(r.startsWith("application/x-www-form-urlencoded"))return await ie.default.form(e);if(r.startsWith("text/plain"))return await ie.default.text(e);if(r.startsWith("multipart/form-data"))return await Ot(e,o)}catch(s){console.error(s)}}async function Ot(e,o){let t=(0,Ue.default)(o);return new Promise((r,n)=>{t.parse(e,(s,i,c)=>{if(s){n(s);return}r({...i,...c})})})}function Be(e,o){return _(e.headers,o.headers)&&_(e.body,o.body)&&_(e.params,o.params)&&_(e.query,o.query)&&_(e.refererQuery,o.refererQuery)}function _(e,o){if(!o)return!0;for(let t in o)if(!Je(e[t],o[t]))return!1;return!0}function Je(e,o){if(M(e)&&M(o)){let t=new Set;return o.every(r=>e.some((n,s)=>{if(t.has(s))return!1;let i=Je(n,r);return i&&t.add(s),i}))}return U(e)&&U(o)?_(e,o):Object.is(e,o)}var Ct=/:/g;function ke(e,{formidableOptions:o={},proxies:t,cookiesOptions:r}){return async function(n,s,i){let c=Date.now(),{query:a,pathname:p}=P(n.url);if(!p||t.length===0||!t.some(v=>A(v,n.url)))return i();let k=e.mockData,x=(0,Qe.default)(Object.keys(k),v=>{var B;return((B=v.match(Ct))==null?void 0:B.length)||0}).find(v=>(0,fe.pathToRegexp)(v).test(p));if(!x)return i();let{query:O}=P(n.headers.referer||""),I=await Ae(n,o),l=new ze.default(n,s,r),u=l.get.bind(l),m=n.method.toUpperCase(),d=jt(k[x],{pathname:p,method:m,request:{query:a,refererQuery:O,body:I,headers:n.headers,getCookie:u}});if(!d)return i();E("middleware: ",m,n.url);let g=n,y=s;g.body=I,g.query=a,g.refererQuery=O,g.params=q(d.url,p),g.getCookie=u,y.setCookie=l.set.bind(l);let{body:h,delay:C,type:W="json",response:$,status:T=200,statusText:F}=d;if(me(y,T,F),await Pt(g,y,d),await Rt(g,y,d),h){try{let v=D(h)?await h(g):h;await qe(c,C),Wt(y,v,W)}catch(v){j.error(`${R.default.red("[body error]")} ${n.url}
46
- `,`file: ${R.default.cyan(d.__filepath__)}`,v),me(y,500),s.end("")}return}if($){try{await qe(c,C),await $(g,y,i)}catch(v){j.error(`${R.default.red("[response error]")} ${n.url}
47
- `,`file: ${R.default.cyan(d.__filepath__)}`,v),me(y,500),s.end("")}return}s.end("")}}function jt(e,{pathname:o,method:t,request:r}){return e.find(n=>{if(!o||!n||!n.url||n.ws===!0||!(n.method?M(n.method)?n.method:[n.method]:["GET","POST"]).includes(t))return!1;let i=(0,fe.pathToRegexp)(n.url).test(o);if(i&&n.validator){let c=q(n.url,o);if(D(n.validator))return n.validator({params:c,...r});try{return Be({params:c,...r},n.validator)}catch(a){return j.error(`${R.default.red("[validator error]")} ${o}
48
- `,`file: ${R.default.cyan(n.__filepath__)}`,a),!1}}return i})}function me(e,o=200,t){e.statusCode=o,e.statusMessage=t||Dt(o)}async function Pt(e,o,t){let{headers:r,type:n="json"}=t,s=t.__filepath__,i=G.contentType(n)||G.contentType(G.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=D(r)?await r(e):r;Object.keys(c).forEach(a=>{o.setHeader(a,c[a])})}catch(c){j.error(`${R.default.red("[headers error]")} ${e.url}
49
- `,c)}}async function Rt(e,o,{cookies:t}){if(t)try{let r=D(t)?await t(e):t;Object.keys(r).forEach(n=>{let s=r[n];if(M(s)){let[i,c]=s;o.setCookie(n,i,c)}else o.setCookie(n,s)})}catch(r){j.error(`${R.default.red("[cookies error]")} ${e.url}
50
- `,r)}}function Wt(e,o,t){if(De(o))o.pipe(e);else if(de.Buffer.isBuffer(o))e.end(t==="text"||t==="json"?o.toString("utf-8"):o);else{let r=typeof o=="string"?o:JSON.stringify(o);e.end(t==="buffer"?de.Buffer.from(r):r)}}async function qe(e,o){if(!o||typeof o=="number"&&o<=0||M(o)&&o.length!==2)return;let t=0;if(M(o)){let[r,n]=o;t=Math.floor(Math.random()*(n-r+1))+r}else t=o-(Date.now()-e);t>0&&await Ee(t)}function Dt(e){return Ge.default[e]||"Unknown"}var Ke=f(require("events"),1),ce=f(require("fs"),1),Xe=require("module"),ye=f(require("path"),1),Ye=require("url"),he=f(require("chokidar"),1),Ze=require("esbuild"),et=f(require("fast-glob"),1),L=require("vite");var Ve=f(require("lodash.sortby"),1);function ge(e){let o=[];for(let[,r]of e.entries())r&&(M(r)?o.push(...r):o.push(r));let t={};return o.filter(r=>U(r)&&r.enabled!==!1&&r.url).forEach(r=>{let{pathname:n,query:s}=P(r.url),i=t[n]??=[],c={...r,url:n};if(c.ws!==!0){let a=c.validator;le(s)||(D(a)?c.validator=function(p){return _(p.query,s)&&a(p)}:a?(c.validator={...a},c.validator.query=c.validator.query?{...s,...c.validator.query}:s):c.validator={query:s})}i.push(c)}),Object.keys(t).forEach(r=>{t[r]=(0,Ve.default)(t[r],n=>{if(n.ws===!0)return 0;let{validator:s}=n;return!s||le(s)?2:D(s)?0:1/Object.keys(s).reduce((c,a)=>c+Et(s[a]),0)})}),t}function Et(e){return e?Object.keys(e).length:0}var _t=_e(b),H=(0,Xe.createRequire)(_t),ae=class extends Ke.default{constructor(t){super();this.options=t;this.cwd=t.cwd||process.cwd();try{let r=J(this.cwd,["package.json"]);this.moduleType=r&&JSON.parse(r).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:t,exclude:r}=this.options,n=(0,L.createFilter)(t,r,{resolve:!1});(0,et.default)(t,{cwd:this.cwd}).then(i=>Promise.all(i.filter(n).map(c=>this.loadMock(c)))).then(()=>this.updateMockList()),this.watchMockEntry(),this.watchDeps();let s=null;this.on("mock:update",async i=>{n(i)&&(await this.loadMock(i),s&&clearImmediate(s),s=setImmediate(()=>{this.updateMockList(),this.emit("mock:update-end",i),s=null}))}),this.on("mock:unlink",async i=>{n(i)&&(this.moduleCache.delete(i),this.updateMockList(),this.emit("mock:update-end",i))})}watchMockEntry(){let{include:t}=this.options,[r,...n]=t,s=he.default.watch(r,{ignoreInitial:!0,cwd:this.cwd});n.length>0&&n.forEach(i=>s.add(i)),s.on("add",async i=>{i=(0,L.normalizePath)(i),this.emit("mock:update",i),E("watcher:add",i)}),s.on("change",async i=>{i=(0,L.normalizePath)(i),this.emit("mock:update",i),E("watcher:change",i)}),s.on("unlink",async i=>{i=(0,L.normalizePath)(i),this.emit("mock:unlink",i),E("watcher:unlink",i)}),this.mockWatcher=s}watchDeps(){let t=[];this.depsWatcher=he.default.watch([],{ignoreInitial:!0,cwd:this.cwd}),this.depsWatcher.on("change",r=>{r=(0,L.normalizePath)(r);let n=this.moduleDeps.get(r);n&&n.forEach(s=>{this.emit("mock:update",s)})}),this.depsWatcher.on("unlink",r=>{r=(0,L.normalizePath)(r),this.moduleDeps.delete(r)}),this.on("update:deps",()=>{let r=[];for(let[s]of this.moduleDeps.entries())r.push(s);let n=r.filter(s=>!t.includes(s));n.length>0&&this.depsWatcher.add(n)})}close(){var t,r;(t=this.mockWatcher)==null||t.close(),(r=this.depsWatcher)==null||r.close()}updateMockList(){this._mockData=ge(this.moduleCache)}updateModuleDeps(t,r){Object.keys(r).forEach(n=>{r[n].imports.map(i=>i.path).forEach(i=>{this.moduleDeps.has(i)||this.moduleDeps.set(i,new Set),this.moduleDeps.get(i).add(t)})}),this.emit("update:deps")}async loadMock(t){if(!t)return;let r=!1;/\.m[jt]s$/.test(t)?r=!0:/\.c[jt]s$/.test(t)?r=!1:r=this.moduleType==="esm";let{code:n,deps:s}=await this.transformWithEsbuild(t,r);try{let i=await this.loadFromCode(t,n,r)||{},c;i.default?c=i.default:(c=[],Object.keys(i).forEach(a=>{M(i[a])?c.push(...i[a]):c.push(i[a])})),M(c)?c.forEach(a=>a.__filepath__=t):c.__filepath__=t,this.moduleCache.set(t,c),this.updateModuleDeps(t,s)}catch(i){console.error(i)}}async loadFromCode(t,r,n){if(n){let s=`${t}.timestamp-${Date.now()}`,i=`${s}.mjs`,c=`${(0,Ye.pathToFileURL)(s)}.mjs`;await ce.default.promises.writeFile(i,r,"utf8");try{return await import(c)}finally{try{ce.default.unlinkSync(i)}catch{}}}else{t=ye.default.resolve(this.cwd,t);let s=ye.default.extname(t),i=ce.default.realpathSync(t),c=s in H.extensions?s:".js",a=H.extensions[c];H.extensions[c]=(k,x)=>{x===i?k._compile(r,x):a(k,x)},delete H.cache[H.resolve(t)];let p=H(t);return H.extensions[c]=a,p.__esModule?p:{default:p}}}async transformWithEsbuild(t,r){var n;try{let s=await(0,Ze.build)({entryPoints:[t],outfile:"out.js",write:!1,target:["node14.18","node16"],platform:"node",bundle:!0,metafile:!0,format:r?"esm":"cjs",define:this.options.define,plugins:[ne(this.options.alias),te,re,oe]});return{code:s.outputFiles[0].text,deps:((n=s.metafile)==null?void 0:n.inputs)||{}}}catch(s){console.error(s)}return{code:"",deps:{}}}};var ot=f(require("cookies"),1),ve=require("path-to-regexp"),rt=f(require("picocolors"),1),nt=require("ws");function Me(e,o,t,r){var I;let n=new Map,s=new Map,i=new WeakMap,c=l=>{let u=s.get(l);return!u&&s.set(l,u=new Map),u},a=(l,u)=>{let m=l.get(u);return!m&&l.set(u,m=new nt.WebSocketServer({noServer:!0})),m},p=(l,u)=>{let m=n.get(l);!m&&n.set(l,m=new Set),m.add(u)},k=(l,u,m,d,g,y)=>{var h;try{(h=m.setup)==null||h.call(m,u,d),u.on("close",()=>l.delete(g))}catch(C){j.error(`${rt.default.red("[websocket server error]")} ${y}
51
- `,C)}},x=(l,u,m,d)=>{l.emit("connection",u,m),u.on("close",()=>{let g=d.findIndex(y=>y.ws===u);g!==-1&&d.splice(g,1)})},O=(l,u,m,d,g)=>{let{cleanupList:y,connectionList:h,context:C}=i.get(u);tt(y),h.forEach(({ws:W})=>W.removeAllListeners()),u.removeAllListeners(),k(l,u,m,C,d,g),h.forEach(({ws:W,req:$})=>x(u,W,$,h))};(I=e.on)==null||I.call(e,"mock:update-end",l=>{if(!n.has(l))return;let u=n.get(l);if(u)for(let m of u.values())for(let d of e.mockData[m]){if(!d.ws||d.__filepath__!==l)return;let g=c(m);for(let[y,h]of g.entries())O(g,h,d,y,l)}}),o==null||o.on("upgrade",(l,u,m)=>{let{pathname:d,query:g}=P(l.url);if(!d||t.length===0||!t.some(w=>A(w,l.url)))return;let y=e.mockData,h=Object.keys(y).find(w=>(0,ve.pathToRegexp)(w).test(d));if(!h)return;let C=y[h].find(w=>w.url&&w.ws&&(0,ve.pathToRegexp)(w.url).test(d));if(!C)return;let W=C.__filepath__;p(W,h);let $=c(h),T=a($,d),F=i.get(T);if(!F){let w=[],we={onCleanup:at=>w.push(at)};F={cleanupList:w,context:we,connectionList:[]},i.set(T,F),k($,T,C,we,d,W)}let v=l,B=new ot.default(l,l,r),{query:ct}=P(l.headers.referer||"");v.query=g,v.refererQuery=ct,v.params=q(h,d),v.getCookie=B.get.bind(B),T.handleUpgrade(v,u,m,w=>{E(`websocket-mock: ${l.url} connected`),F.connectionList.push({req:v,ws:w}),x(T,w,v,F.connectionList)})}),o==null||o.on("close",()=>{for(let l of s.values()){for(let u of l.values()){let m=i.get(u);tt(m.cleanupList),u.close()}l.clear()}s.clear(),n.clear()})}function tt(e){let o;for(;o=e.shift();)o==null||o()}function be(e,o,t,r){let n=new ae({include:S(o.include),exclude:S(o.exclude),define:ee(e),alias:e.resolve.alias});n.load(),n.on("mock:update-end",()=>{o.reload&&(r==null||r.send({type:"full-reload"}))}),t==null||t.on("close",()=>n.close());let{httpProxies:s}=Y(e.server.proxy||{}),c=[...S(o.prefix),...s];Me(n,t,S(o.wsPrefix),o.cookiesOptions);let a=[];return a.push(Lt(n,c,e,o),ke(n,{formidableOptions:o.formidableOptions,proxies:c,cookiesOptions:o.cookiesOptions})),a.filter(Boolean)}function Lt(e,o,t,r){let n={},s=r.cors!==!1||t.server.cors!==!1;return t.server.cors!==!1&&(n={...n,...typeof t.server.cors=="boolean"?{}:t.server.cors}),r.cors!==!1&&(n={...n,...typeof r.cors=="boolean"?{}:r.cors}),s?function(i,c,a){let{pathname:p}=P(i.url);if(!p||o.length===0||!o.some(O=>A(O,i.url)))return a();let k=e.mockData;if(!Object.keys(k).find(O=>(0,it.pathToRegexp)(O).test(p)))return a();(0,st.default)(n)(i,c,a)}:void 0}function xe({prefix:e=[],wsPrefix:o=[],include:t=["mock/**/*.mock.{js,ts,cjs,mjs,json,json5}"],exclude:r=["**/node_modules/**","**/.vscode/**","**/.git/**"],reload:n=!1,cors:s=!0,formidableOptions:i={},build:c=!1,cookiesOptions:a={}}={}){let p={prefix:e,wsPrefix:o,include:t,exclude:r,reload:n,cors:s,cookiesOptions:a,formidableOptions:{multiples:!0,...i},build:c?Object.assign({serverPort:8080,dist:"mockServer"},typeof c=="object"?c:{}):!1},k=[$t(p)];return p.build&&k.push(It(p)),k}function It(e){let o={};return{name:"vite-plugin-mock-dev-server-generator",enforce:"post",apply:"build",configResolved(t){o=t,t.logger.warn("")},async buildEnd(t){t||o.command==="build"&&await He(this,o,e)}}}function $t(e){let o={};return{name:"vite-plugin-mock-dev-server",enforce:"pre",apply:"serve",config(t){var s;let r=S(e.wsPrefix);if(r.length===0||!((s=t.server)!=null&&s.proxy)||Object.keys(t.server.proxy).length===0)return;let n={};Object.keys(t.server.proxy).forEach(i=>{r.includes(i)||(n[i]=t.server.proxy[i])}),t.server.proxy=n},configResolved(t){o=t,t.logger.warn("")},configureServer({middlewares:t,config:r,httpServer:n,ws:s}){be(r,e,n,s).forEach(c=>t.use(c))},configurePreviewServer({middlewares:t,httpServer:r}){be(o,e,r).forEach(s=>t.use(s))}}}function Tt(e){return e}function Ft(e){return t=>(M(t)?t=t.map(r=>e(r)||r):t=e(t)||t,t)}var Nt=xe;0&&(module.exports={baseMiddleware,createDefineMock,defineMock,mockDevServerPlugin,mockWebSocket,transformMockData});
43
+ export default transformMockData(mockList);`}var J=require("@pengzhanbo/utils"),ot=f(require("cors"),1),rt=require("path-to-regexp");var fe=require("buffer"),y=require("@pengzhanbo/utils"),Ve=f(require("cookies"),1),Ke=f(require("http-status"),1),Y=f(require("mime-types"),1),ge=require("path-to-regexp"),b=f(require("picocolors"),1);var le=f(require("co-body"),1),Je=f(require("formidable"),1);async function Ae(t,o){var s;let e=t.method.toUpperCase();if(["GET","DELETE","HEAD"].includes(e))return;let n=((s=t.headers["content-type"])==null?void 0:s.toLocaleLowerCase())||"";try{if(n.startsWith("application/json"))return await le.default.json(t);if(n.startsWith("application/x-www-form-urlencoded"))return await le.default.form(t);if(n.startsWith("text/plain"))return await le.default.text(t);if(n.startsWith("multipart/form-data"))return await Ct(t,o)}catch(r){console.error(r)}}async function Ct(t,o){let e=(0,Je.default)(o);return new Promise((n,s)=>{e.parse(t,(r,i,c)=>{if(r){s(r);return}n({...i,...c})})})}var G=require("@pengzhanbo/utils");function ze(t,o){return _(t.headers,o.headers)&&_(t.body,o.body)&&_(t.params,o.params)&&_(t.query,o.query)&&_(t.refererQuery,o.refererQuery)}function _(t,o){if(!o)return!0;for(let e in o)if(!Ge(t[e],o[e]))return!1;return!0}function Ge(t,o){if((0,G.isArray)(t)&&(0,G.isArray)(o)){let e=new Set;return o.every(n=>t.some((s,r)=>{if(e.has(r))return!1;let i=Ge(s,n);return i&&e.add(r),i}))}return(0,G.isObject)(t)&&(0,G.isObject)(o)?_(t,o):Object.is(t,o)}var Pt=/:/g;function ke(t,{formidableOptions:o={},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(R=>z(R,r.url)))return c();let h=t.mockData,S=(0,y.sortBy)(Object.keys(h),R=>{var x;return((x=R.match(Pt))==null?void 0:x.length)||0}).find(R=>(0,ge.pathToRegexp)(R).test(m));if(!S)return c();let{query:E}=W(r.headers.referer||""),j=await Ae(r,o),l=new Ve.default(r,i,n),u=l.get.bind(l),d=r.method.toUpperCase(),g=Wt(h[S],s,{pathname:m,method:d,request:{query:p,refererQuery:E,body:j,headers:r.headers,getCookie:u}});if(!g)return c();let k=r,v=i;k.body=j,k.query=p,k.refererQuery=E,k.params=V(g.url,m),k.getCookie=u,v.setCookie=l.set.bind(l);let{body:M,delay:O,type:L="json",response:T,status:N=200,statusText:H,log:P,__filepath__:A}=g;if(de(v,N,H),await jt(k,v,g,s),await Lt(k,v,g,s),s.info(_t(k,A),P),M){try{let R=(0,y.isFunction)(M)?await M(k):M;await Qe(a,O),Et(v,R,L)}catch(R){s.error(`${b.default.red(`mock error at ${m}`)}
44
+ ${R}
45
+ at body (${b.default.underline(A)})`,P),de(v,500),i.end("")}return}if(T){try{await Qe(a,O),await T(k,v,c)}catch(R){s.error(`${b.default.red(`mock error at ${m}`)}
46
+ ${R}
47
+ at response (${b.default.underline(A)})`,P),de(v,500),i.end("")}return}i.end("")}}function Wt(t,o,{pathname:e,method:n,request:s}){return t.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,ge.pathToRegexp)(r.url).test(e);if(c&&r.validator){let a=V(r.url,e);if((0,y.isFunction)(r.validator))return r.validator({params:a,...s});try{return ze({params:a,...s},r.validator)}catch(p){let m=r.__filepath__;return o.error(`${b.default.red(`mock error at ${e}`)}
48
+ ${p}
49
+ at validator (${b.default.underline(m)})`,r.log),!1}}return c})}function de(t,o=200,e){t.statusCode=o,t.statusMessage=e||$t(o)}async function jt(t,o,e,n){let{headers:s,type:r="json"}=e,i=e.__filepath__,c=Y.contentType(r)||Y.contentType(Y.lookup(r)||"");if(c&&o.setHeader("Content-Type",c),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",i),!!s)try{let a=(0,y.isFunction)(s)?await s(t):s;Object.keys(a).forEach(p=>{o.setHeader(p,a[p])})}catch(a){n.error(`${b.default.red(`mock error at ${t.url.split("?")[0]}`)}
50
+ ${a}
51
+ at headers (${b.default.underline(i)})`,e.log)}}async function Lt(t,o,e,n){let{cookies:s}=e,r=e.__filepath__;if(s)try{let i=(0,y.isFunction)(s)?await s(t):s;Object.keys(i).forEach(c=>{let a=i[c];if((0,y.isArray)(a)){let[p,m]=a;o.setCookie(c,p,m)}else o.setCookie(c,a)})}catch(i){n.error(`${b.default.red(`mock error at ${t.url.split("?")[0]}`)}
52
+ ${i}
53
+ at cookies (${b.default.underline(r)})`,e.log)}}function Et(t,o,e){if(Le(o))o.pipe(t);else if(fe.Buffer.isBuffer(o))t.end(e==="text"||e==="json"?o.toString("utf-8"):o);else{let n=typeof o=="string"?o:JSON.stringify(o);t.end(e==="buffer"?fe.Buffer.from(n):n)}}async function Qe(t,o){if(!o||typeof o=="number"&&o<=0||(0,y.isArray)(o)&&o.length!==2)return;let e=0;if((0,y.isArray)(o)){let[n,s]=o;e=(0,y.random)(n,s)}else e=o-((0,y.timestamp)()-t);e>0&&await(0,y.sleep)(e)}function $t(t){return Ke.default[t]||"Unknown"}function _t(t,o){let{url:e,method:n,query:s,params:r,body:i}=t,{pathname:c}=new URL(e,"http://example.com");c=b.default.green(decodeURIComponent(c));let a=(j,l)=>!l||(0,y.isEmptyObject)(l)?"":` ${b.default.gray(`${j}:`)}${JSON.stringify(l)}`,p=b.default.magenta(b.default.bold(n)),m=a("query",s),h=a("params",r),S=a("body",i),E=` ${b.default.dim(b.default.underline(`(${o})`))}`;return`${p} ${c}${m}${h}${S}${E}`}var Xe=f(require("events"),1),I=require("@pengzhanbo/utils"),he=f(require("chokidar"),1),Ye=f(require("fast-glob"),1),D=require("vite");var C=require("@pengzhanbo/utils");function ye(t){let o=[];for(let[,n]of t.entries())n&&((0,C.isArray)(n)?o.push(...n):o.push(n));let e={};return o.filter(n=>(0,C.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,C.isEmptyObject)(r)||((0,C.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,C.sortBy)(e[n],s=>{if(s.ws===!0)return 0;let{validator:r}=s;return!r||(0,C.isEmptyObject)(r)?2:(0,C.isFunction)(r)?0:1/Object.keys(r).reduce((c,a)=>c+Dt(r[a]),0)})}),e}function Dt(t){return t?Object.keys(t).length:0}var me=class extends Xe.default{constructor(e){super();this.options=e;this.cwd=e.cwd||process.cwd();try{let n=Q(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,D.createFilter)(e,n,{resolve:!1});(0,Ye.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=he.default.watch(n,{ignoreInitial:!0,cwd:this.cwd});s.length>0&&s.forEach(i=>r.add(i)),r.on("add",async i=>{i=(0,D.normalizePath)(i),this.emit("mock:update",i),re("watcher:add",i)}),r.on("change",async i=>{i=(0,D.normalizePath)(i),this.emit("mock:update",i),re("watcher:change",i)}),r.on("unlink",async i=>{i=(0,D.normalizePath)(i),this.emit("mock:unlink",i),re("watcher:unlink",i)}),this.mockWatcher=r}watchDeps(){let e=[];this.depsWatcher=he.default.watch([],{ignoreInitial:!0,cwd:this.cwd}),this.depsWatcher.on("change",n=>{n=(0,D.normalizePath)(n);let s=this.moduleDeps.get(n);s&&s.forEach(r=>{this.emit("mock:update",r)})}),this.depsWatcher.on("unlink",n=>{n=(0,D.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=ye(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 ie(e,{isESM:n,define:s,alias:r});try{let a=await Te(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 et=f(require("cookies"),1),ve=require("path-to-regexp"),B=f(require("picocolors"),1),tt=require("ws");function Me({loader:t,httpServer:o,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 tt.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
+ ${O}
55
+ at setup (${v})`,d.log)})}catch(O){s.error(`${B.default.red(`WebSocket mock error at ${u.path}`)}
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)})},E=(l,u,d,g,k)=>{let{cleanupList:v,connectionList:M,context:O}=c.get(u);Ze(v),M.forEach(({ws:L})=>L.removeAllListeners()),u.removeAllListeners(),h(l,u,d,O,g,k),M.forEach(({ws:L,req:T})=>S(u,L,T,M))};(j=t.on)==null||j.call(t,"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 t.mockData[d]){if(!g.ws||g.__filepath__!==l)return;let k=a(d);for(let[v,M]of k.entries())E(k,M,g,v,l)}}),o==null||o.on("upgrade",(l,u,d)=>{let{pathname:g,query:k}=W(l.url);if(!g||e.length===0||!e.some(x=>z(x,l.url)))return;let v=t.mockData,M=Object.keys(v).find(x=>(0,ve.pathToRegexp)(x).test(g));if(!M)return;let O=v[M].find(x=>x.url&&x.ws&&(0,ve.pathToRegexp)(x.url).test(g));if(!O)return;let L=O.__filepath__;m(L,M);let T=a(M),N=p(T,g),H=c.get(N);if(!H){let x=[],we={onCleanup:it=>x.push(it)};H={cleanupList:x,context:we,connectionList:[]},c.set(N,H),h(T,N,O,we,g,L)}let P=l,A=new et.default(l,l,n),{query:R}=W(l.headers.referer||"");P.query=k,P.refererQuery=R,P.params=V(M,g),P.getCookie=A.get.bind(A),N.handleUpgrade(P,u,d,x=>{s.info(`${B.default.magenta(B.default.bold("WebSocket"))} ${B.default.green(l.url)} connected ${B.default.dim(`(${L})`)}`,O.log),H.connectionList.push({req:P,ws:x}),S(N,x,P,H.connectionList)})}),o==null||o.on("close",()=>{for(let l of i.values()){for(let u of l.values()){let d=c.get(u);Ze(d.cleanupList),u.close()}l.clear()}i.clear(),r.clear()})}function Ze(t){let o;for(;o=t.shift();)o==null||o()}function be(t,o,e,n){let s=ce("vite:mock",(0,J.isBoolean)(o.log)?o.log?"info":"error":o.log),r=new me({include:(0,J.toArray)(o.include),exclude:(0,J.toArray)(o.exclude),define:ae(t),alias:t.resolve.alias});r.load(),r.on("mock:update-end",()=>{o.reload&&(n==null||n.send({type:"full-reload"}))}),e==null||e.on("close",()=>r.close());let{httpProxies:i}=ne(t.server.proxy||{}),a=[...(0,J.toArray)(o.prefix),...i];Me({loader:r,httpServer:e,proxies:(0,J.toArray)(o.wsPrefix),cookiesOptions:o.cookiesOptions,logger:s});let p=[];return p.push(It(r,a,t,o),ke(r,{formidableOptions:o.formidableOptions,proxies:a,cookiesOptions:o.cookiesOptions,logger:s})),p.filter(Boolean)}function It(t,o,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||o.length===0||!o.some(S=>z(S,i.url)))return a();let m=t.mockData;if(!Object.keys(m).find(S=>(0,rt.pathToRegexp)(S).test(p)))return a();(0,ot.default)(s)(i,c,a)}:void 0}function xe({prefix:t=[],wsPrefix:o=[],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:t,wsPrefix:o,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=[Nt(m)];return m.build&&h.push(Tt(m)),h}function Tt(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 Be(this,o,t)}}}function Nt(t){let o={};return{name:"vite-plugin-mock-dev-server",enforce:"pre",apply:"serve",config(e){var r;let n=(0,nt.toArray)(t.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){o=e,e.logger.warn("")},configureServer({middlewares:e,config:n,httpServer:s,ws:r}){be(n,t,s,r).forEach(c=>e.use(c))},configurePreviewServer({middlewares:e,httpServer:n}){be(o,t,n).forEach(r=>e.use(r))}}}var st=require("@pengzhanbo/utils");function Ht(t){return t}function Ft(t){return e=>((0,st.isArray)(e)?e=e.map(n=>t(n)||n):e=t(e)||e,e)}var Ut=xe;0&&(module.exports={baseMiddleware,createDefineMock,defineMock,mockDevServerPlugin,mockWebSocket,transformMockData});
@@ -0,0 +1,570 @@
1
+ import { LogLevel, Connect, Plugin, ResolvedConfig } from 'vite';
2
+ import { Buffer } from 'node:buffer';
3
+ import http from 'node:http';
4
+ import { Readable } from 'node:stream';
5
+ import Cookies from 'cookies';
6
+ import { CorsOptions } from 'cors';
7
+ import formidable from 'formidable';
8
+ import { WebSocketServer } from 'ws';
9
+ import EventEmitter from 'node:events';
10
+ import chokidar from 'chokidar';
11
+
12
+ /**
13
+ * Configure plugin
14
+ *
15
+ * 插件配置项
16
+ */
17
+ interface MockServerPluginOptions {
18
+ /**
19
+ * To configure the path matching rules for http mock services,
20
+ * any request path starting with prefix will be intercepted and proxied.
21
+ * If the prefix starts with `^`, it will be recognized as a `RegExp`.
22
+ *
23
+ * 为 http mock 服务配置 路径匹配规则,任何请求路径以 prefix 开头的都将被拦截代理。
24
+ * 如果 prefix 以 `^` 开头,将被识别为 `RegExp`。
25
+ * @default []
26
+ * @example ['^/api']
27
+ */
28
+ prefix?: string | string[];
29
+ /**
30
+ * Configure path matching rules for WebSocket mock service.
31
+ * Any ws/wss requests with a request path starting with wsPrefix
32
+ * will be intercepted by the proxy.
33
+ * If wsPrefix starts with `^`, it will be recognized as a `RegExp`.
34
+ *
35
+ * 为 websocket mock 服务配置 路径匹配规则, 任何请求路径以 wsPrefix 开头的 ws/wss请求,
36
+ * 都将被代理拦截。
37
+ * 如果 wsPrefix 以 `^` 开头,将被识别为 `RegExp`。
38
+ * @default []
39
+ * @example ['/socket.io']
40
+ */
41
+ wsPrefix?: string | string[];
42
+ /**
43
+ * glob string matching mock includes files
44
+ *
45
+ * glob 字符串匹配 mock 包含的文件
46
+ * @see [picomatch](https://github.com/micromatch/picomatch#globbing-features)
47
+ * @default []
48
+ */
49
+ include?: string | string[];
50
+ /**
51
+ * glob string matching mock excluded files
52
+ *
53
+ * glob 字符串匹配 mock 排除的文件
54
+ * @see [picomatch](https://github.com/micromatch/picomatch#globbing-features)
55
+ */
56
+ exclude?: string | string[];
57
+ /**
58
+ * Enable log and configure log level
59
+ *
60
+ * 开启日志,或配置 日志级别
61
+ * @default 'info'
62
+ */
63
+ log?: boolean | LogLevel;
64
+ /**
65
+ * When the mock resource is hot updated, only the data content is updated,
66
+ * but the page is not refreshed by default.
67
+ * If you want to refresh the page every time you modify a mock file,
68
+ * you can open this option.
69
+ *
70
+ * mock资源热更新时,仅更新了数据内容,但是默认不重新刷新页面。
71
+ * 当你希望每次修改mock文件都刷新页面时,可以打开此选项。
72
+ * @default false
73
+ */
74
+ reload?: boolean;
75
+ /**
76
+ * Configure to `cors`
77
+ *
78
+ * 配置 `cors`
79
+ * @default true
80
+ * @see [cors](https://github.com/expressjs/cors#configuration-options)
81
+ */
82
+ cors?: boolean | CorsOptions;
83
+ /**
84
+ * formidable options
85
+ * @see [formidable](https://github.com/node-formidable/formidable#options)
86
+ */
87
+ formidableOptions?: formidable.Options;
88
+ /**
89
+ * cookies options
90
+ * @see [cookies](https://github.com/pillarjs/cookies#new-cookiesrequest-response--options)
91
+ */
92
+ cookiesOptions?: Cookies.Option;
93
+ /**
94
+ * When you need to build a small mock service, you can configure this option.
95
+ *
96
+ * 当需要构建一个小型mock服务时,可配置此项
97
+ * @default false
98
+ */
99
+ build?: boolean | ServerBuildOption;
100
+ }
101
+ interface ServerBuildOption {
102
+ /**
103
+ * Service startup port
104
+ *
105
+ * 服务启动端口
106
+ * @default 8080
107
+ */
108
+ serverPort?: number;
109
+ /**
110
+ * Service application output directory
111
+ *
112
+ * 服务应用输出目录
113
+ * @default 'dist/mockServer'
114
+ */
115
+ dist?: string;
116
+ }
117
+ type Method = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'TRACE' | 'OPTIONS';
118
+ type Headers = http.IncomingHttpHeaders;
119
+ type ResponseBody = Record<string, any> | any[] | string | number | Readable | Buffer | null;
120
+ /**
121
+ * 扩展 request,添加额外的属性和方法
122
+ */
123
+ interface ExtraRequest {
124
+ /**
125
+ * The query string located after `?` in the request address has been parsed into JSON.
126
+ *
127
+ * 请求地址中位于 `?` 后面的 queryString,已解析为 json
128
+ */
129
+ query: Record<string, any>;
130
+ /**
131
+ * The queryString located after `?` in the referer request has been parsed as JSON.
132
+ *
133
+ * 请求 referer 中位于 `?` 后面的 queryString,已解析为 json
134
+ */
135
+ refererQuery: Record<string, any>;
136
+ /**
137
+ * Body data in the request
138
+ *
139
+ * 请求体中 body 数据
140
+ */
141
+ body: Record<string, any>;
142
+ /**
143
+ * The params parameter parsed from the `/api/id/:id` in the request address.
144
+ *
145
+ * 请求地址中,`/api/id/:id` 解析后的 params 参数
146
+ */
147
+ params: Record<string, any>;
148
+ /**
149
+ * headers data in the request
150
+ * 请求体中 headers
151
+ */
152
+ headers: Headers;
153
+ /**
154
+ * Get the cookie carried in the request.
155
+ *
156
+ * 获取 请求中携带的 cookie
157
+ * @see [cookies](https://github.com/pillarjs/cookies#cookiesgetname--options)
158
+ */
159
+ getCookie: (name: string, option?: Cookies.GetOption) => string | undefined;
160
+ }
161
+ type MockRequest = Connect.IncomingMessage & ExtraRequest;
162
+ type MockResponse = http.ServerResponse<http.IncomingMessage> & {
163
+ /**
164
+ * Set cookie in response
165
+ *
166
+ * 向请求响应中设置 cookie
167
+ * @see [cookies](https://github.com/pillarjs/cookies#cookiessetname--values--options)
168
+ */
169
+ setCookie: (name: string, value?: string | null, option?: Cookies.SetOption) => void;
170
+ };
171
+ type ResponseBodyFn = (request: MockRequest) => ResponseBody | Promise<ResponseBody>;
172
+ type ResponseHeaderFn = (request: MockRequest) => Headers | Promise<Headers>;
173
+ type CookieValue = string | [string, Cookies.SetOption];
174
+ type ResponseCookies = Record<string, CookieValue>;
175
+ type ResponseCookiesFn = (request: MockRequest) => ResponseCookies | Promise<ResponseCookies>;
176
+ interface MockBaseItem {
177
+ /**
178
+ * The interface address that needs to be mocked,
179
+ * supported by `path-to-regexp` for path matching.
180
+ *
181
+ * 需要进行 mock 的接口地址, 由 `path-to-regexp` 提供路径匹配支持
182
+ * @see [path-to-regexp](https://github.com/pillarjs/path-to-regexp)
183
+ * @example
184
+ * ```txt
185
+ * /api/login
186
+ * /api/post/:id
187
+ * /api/post/:id
188
+ * ```
189
+ */
190
+ url: string;
191
+ /**
192
+ * Enable WebSocket interface simulation
193
+ *
194
+ * 开启 websocket 接口模拟
195
+ *
196
+ * @default false
197
+ */
198
+ ws?: boolean;
199
+ /**
200
+ * Whether to enable mock for this interface.
201
+ * In most scenarios, we only need to mock some interfaces instead of all requests that
202
+ * have been configured with mock.
203
+ * Therefore, it is important to be able to configure whether to enable it or not.
204
+ *
205
+ * 是否启动对该接口的mock,在多数场景下,我们仅需要对部分接口进行 mock,
206
+ * 而不是对所有配置了mock的请求进行全量mock,所以是否能够配置是否启用很重要
207
+ * @default true
208
+ */
209
+ enabled?: boolean;
210
+ /**
211
+ * Enable log and configure log level
212
+ *
213
+ * 开启日志,或配置 日志级别
214
+ * @default 'info'
215
+ */
216
+ log?: boolean | LogLevel;
217
+ }
218
+ interface MockHttpItem extends MockBaseItem {
219
+ /**
220
+ * The interface allows request methods, and by default allows both GET and POST.
221
+ *
222
+ * 该接口允许的 请求方法,默认同时支持 GET 和 POST
223
+ * @default ['POST','GET']
224
+ */
225
+ method?: Method | Method[];
226
+ /**
227
+ * Configure the response body headers
228
+ *
229
+ * 配置响应体 headers
230
+ * @default
231
+ * ```json
232
+ * { "Content-Type": "application/json" }
233
+ * ```
234
+ */
235
+ headers?: Headers | ResponseHeaderFn;
236
+ /**
237
+ * Configure Response Header Status Code
238
+ *
239
+ * 配置 响应头状态码
240
+ * @default 200
241
+ */
242
+ status?: number;
243
+ /**
244
+ * Configure response header status text
245
+ *
246
+ * 配置响应头状态文本
247
+ * @default 'OK'
248
+ */
249
+ statusText?: string;
250
+ /**
251
+ * Configure response delay time,
252
+ * If an array is passed in, it represents the range of delay time.
253
+ * unit: `ms`
254
+ *
255
+ * 配置响应延迟时间, 如果传入的是一个数组,则代表延迟时间的范围
256
+ * 单位: `ms`
257
+ * @default 0
258
+ */
259
+ delay?: number | [number, number];
260
+ /**
261
+ * Configure response body cookies
262
+ *
263
+ * 设置响应体 cookies
264
+ * @example
265
+ * ```ts
266
+ * export default {
267
+ * cookies: {
268
+ * 'token1': '1234567',
269
+ * 'token2': ['1234567', { path: '/' }],
270
+ * },
271
+ * }
272
+ * ```
273
+ * @example
274
+ * ```ts
275
+ * export default {
276
+ * cookies: function (request) {
277
+ * return {
278
+ * 'token1': '1234567',
279
+ * 'token2': ['1234567', { path: '/' }],
280
+ * }
281
+ * },
282
+ * }
283
+ * ```
284
+ */
285
+ cookies?: ResponseCookies | ResponseCookiesFn;
286
+ /**
287
+ * Response body data type, optional values include `text, json, buffer`.
288
+ *
289
+ * And also support types included in `mime-db`.
290
+ * When the response body returns a file and you are not sure which type to use,
291
+ * you can pass the file name as the value. The plugin will internally search for matching
292
+ * `content-type` based on the file name suffix.
293
+ *
294
+ * However, if it is a TypeScript file such as `a.ts`, it may not be correctly matched
295
+ * as a JavaScript script. You need to modify `a.ts` to `a.js` as the value passed
296
+ * in order to recognize it correctly.
297
+ *
298
+ * 响应体数据类型, 可选值包括 `text, json, buffer`,
299
+ *
300
+ * 还支持`mime-db`中的包含的类型。
301
+ * 当响应体返回的是一个文件,而你不确定应该使用哪个类型时,可以将文件名作为值传入,
302
+ * 插件内部会根据文件名后缀查找匹配的`content-type`。
303
+ *
304
+ * 但如果是 `typescript`文件如 `a.ts`,可能不会被正确匹配为 `javascript`脚本,
305
+ * 你需要将 `a.ts` 修改为 `a.js`作为值传入才能正确识别。
306
+ * @see [mime-db](https://github.com/jshttp/mime-db)
307
+ * @default 'json'
308
+ * @example
309
+ * ```txt
310
+ * json
311
+ * buffer
312
+ * my-app.dmg
313
+ * music.mp4
314
+ * ```
315
+ */
316
+ type?: 'text' | 'json' | 'buffer' | string;
317
+ /**
318
+ * Configure response body data content
319
+ *
320
+ * 配置响应体数据内容
321
+ * @default ''
322
+ * @example
323
+ * ```ts
324
+ * export default {
325
+ * body: { a: 1 },
326
+ * }
327
+ * ```
328
+ * @example
329
+ * ```ts
330
+ * export default {
331
+ * body: function(request) {
332
+ * return { a: 1, query: request.query }
333
+ * },
334
+ * }
335
+ * ```
336
+ */
337
+ body?: ResponseBody | ResponseBodyFn;
338
+ /**
339
+ * If you need to set complex response content, you can use the response method,
340
+ * which is a middleware. Here, you can get information such as req
341
+ * and res of the http request,
342
+ * and then return response data through res.write() | res.end().
343
+ * Otherwise, you need to execute next() method.
344
+ * In `req`, you can also get parsed request information such as
345
+ * `query`, `params`, `body` and `refererQuery`.
346
+ *
347
+ * 如果需要设置复杂的响应内容,可以使用 response 方法,
348
+ * 该方法是一个 middleware,你可以在这里拿到 http 请求的 req、res等信息,
349
+ * 然后通过 res.write() | res.end() 返回响应数据, 否则需要执行 next() 方法。
350
+ * 在 `req` 中,还可以拿到 query、params、body, refererQuery 等已解析的请求信息。
351
+ *
352
+ * @see [connect](https://github.com/senchalabs/connect#appusefn)
353
+ * @example
354
+ * ```ts
355
+ * export default {
356
+ * response(req, res) {
357
+ * res.setHeader('Content-Type', 'application/json')
358
+ * res.end(JSON.stringify({ a: 1 }))
359
+ * },
360
+ * }
361
+ * ```
362
+ *
363
+ */
364
+ response?: (req: MockRequest, res: MockResponse, next: Connect.NextFunction) => void | Promise<void>;
365
+ /**
366
+ * Request Validator
367
+ *
368
+ * Sometimes, for the same API request, data needs to be returned based
369
+ * on different request parameters.
370
+ * However, if all of this is written in a single mock's body or response,
371
+ * the content can become cumbersome and difficult to manage.
372
+ * The function of a validator allows you to configure multiple mocks with
373
+ * the same URL simultaneously and determine which mock should be used through validation.
374
+ *
375
+ * 请求验证器
376
+ *
377
+ * 有时候,一个相同的API请求,需要根据不同的请求参数,来决定返回数据,
378
+ * 但全部都在单个 mock中的 body或者 response 中写,内容会很庞杂,不好管理,
379
+ * 验证器的功能,允许你同时配置多条相同url的mock,通过验证器来判断使哪个mock生效。
380
+ * @example
381
+ * ```ts
382
+ * export default {
383
+ * validator: {
384
+ * query: { id: 123 }
385
+ * }
386
+ * }
387
+ * ```
388
+ * @example
389
+ * ```ts
390
+ * export default {
391
+ * validator: function(request) {
392
+ * return request.query.id === 123
393
+ * }
394
+ * }
395
+ * ```
396
+ */
397
+ validator?: Partial<Omit<ExtraRequest, 'getCookie'>> | ((request: ExtraRequest) => boolean);
398
+ ws?: false;
399
+ }
400
+ interface MockWebsocketItem extends MockBaseItem {
401
+ ws: true;
402
+ /**
403
+ * Configure Websocket Server
404
+ *
405
+ * 配置 Websocket Server
406
+ * @example
407
+ * ```ts
408
+ * export default {
409
+ * ws: true
410
+ * setup: (wss, { onCleanup }) => {
411
+ * wss.on('connection', (ws,req) => {
412
+ * ws.on('message', (raw) => console.log(raw))
413
+ * const timer = setInterval(
414
+ * () => ws.send(JSON.stringify({ type: 'connected' })),
415
+ * 1000,
416
+ * )
417
+ * onCleanup(() => clearInterval(timer))
418
+ * })
419
+ * wss.on('error', (error) => console.error(error))
420
+ * }
421
+ * }
422
+ * ```
423
+ */
424
+ setup: (wss: WebSocketServer, context: WebSocketSetupContext) => void;
425
+ }
426
+ interface WebSocketSetupContext {
427
+ /**
428
+ * When defining WSS, you may perform some automatic or looping tasks.
429
+ * However, when hot updating, the plugin will re-execute `setup()`,
430
+ * which may result in duplicate registration of listening events and looping tasks
431
+ * such as setTimeout. You can use `onCleanup()` to clear these automatic or looping tasks.
432
+ *
433
+ * 当你在定义 WSS 时,可能会执行一些自动任务或循环任务,
434
+ * 但是当热更新时,插件内部会重新执行 setup() ,
435
+ * 这可能导致出现 重复注册监听事件 和 循环任务如 `setTimeout` 等。
436
+ * 通过 `onCleanup()` 可以来清除这些自动任务或循环任务。
437
+ * @example
438
+ * ``` ts
439
+ * onCleanup(() => clearTimeout(timeId))
440
+ * ```
441
+ */
442
+ onCleanup: (cleanup: () => void) => void;
443
+ }
444
+ type MockOptions = (MockHttpItem | MockWebsocketItem)[];
445
+ type FormidableFile = formidable.File | formidable.File[];
446
+
447
+ declare function mockDevServerPlugin({ prefix, wsPrefix, include, exclude, reload, log, cors, formidableOptions, build, cookiesOptions, }?: MockServerPluginOptions): Plugin[];
448
+
449
+ /**
450
+ * mock config Type helper
451
+ *
452
+ * mock配置 类型帮助函数
453
+ * @param config
454
+ * @example
455
+ * Mock Http Request
456
+ * ```ts
457
+ * export default defineMock({
458
+ * url: '/api/example',
459
+ * method: ['GET', 'POST'],
460
+ * body: { a: 1 },
461
+ * })
462
+ * ```
463
+ * @example
464
+ * Mock WebSocket
465
+ * ```ts
466
+ * export default defineMock({
467
+ * url: '/socket.io',
468
+ * ws: true,
469
+ * setup(wss) {
470
+ * wss.on('connection', (ws) => {
471
+ * ws.on('message', (rawData) => console.log(rawData))
472
+ * ws.send('data')
473
+ * })
474
+ * },
475
+ * })
476
+ * ```
477
+ */
478
+ declare function defineMock(config: MockHttpItem): MockHttpItem;
479
+ declare function defineMock(config: MockWebsocketItem): MockWebsocketItem;
480
+ declare function defineMock(config: MockOptions): MockOptions;
481
+ /**
482
+ * Return a custom defineMock function to support preprocessing of mock config.
483
+ *
484
+ * 返回一个自定义的 defineMock 函数,用于支持对 mock config 的预处理。
485
+ * @param transformer preprocessing function
486
+ * @example
487
+ * ```ts
488
+ * const definePostMock = createDefineMock((mock) => {
489
+ * mock.url = '/api/post/' + mock.url
490
+ * })
491
+ * export default definePostMock({
492
+ * url: 'list',
493
+ * body: [{ title: '1' }, { title: '2' }],
494
+ * })
495
+ * ```
496
+ */
497
+ declare function createDefineMock(transformer: (mock: MockHttpItem | MockWebsocketItem) => MockHttpItem | MockWebsocketItem | void): typeof defineMock;
498
+
499
+ interface Logger {
500
+ info(msg: string, level?: boolean | LogLevel): void;
501
+ warn(msg: string, level?: boolean | LogLevel): void;
502
+ error(msg: string, level?: boolean | LogLevel): void;
503
+ }
504
+
505
+ interface MockLoaderOptions {
506
+ cwd?: string;
507
+ include: string[];
508
+ exclude: string[];
509
+ define: Record<string, any>;
510
+ alias: ResolvedConfig['resolve']['alias'];
511
+ }
512
+ /**
513
+ * mock配置加载器
514
+ */
515
+ declare class MockLoader extends EventEmitter {
516
+ options: MockLoaderOptions;
517
+ moduleCache: Map<string, MockOptions | MockHttpItem | MockWebsocketItem>;
518
+ moduleDeps: Map<string, Set<string>>;
519
+ cwd: string;
520
+ mockWatcher: chokidar.FSWatcher;
521
+ depsWatcher: chokidar.FSWatcher;
522
+ moduleType: 'cjs' | 'esm';
523
+ private _mockData;
524
+ constructor(options: MockLoaderOptions);
525
+ get mockData(): Record<string, MockOptions>;
526
+ load(): void;
527
+ private watchMockEntry;
528
+ /**
529
+ * 监听 mock文件依赖的本地文件变动,
530
+ * mock依赖文件更新,mock文件也一并更新
531
+ */
532
+ private watchDeps;
533
+ close(): void;
534
+ private updateMockList;
535
+ private updateModuleDeps;
536
+ private loadMock;
537
+ }
538
+
539
+ interface BaseMiddlewareOptions {
540
+ formidableOptions: MockServerPluginOptions['formidableOptions'];
541
+ cookiesOptions: MockServerPluginOptions['cookiesOptions'];
542
+ proxies: string[];
543
+ logger: Logger;
544
+ }
545
+ declare function baseMiddleware(mockLoader: MockLoader, { formidableOptions, proxies, cookiesOptions, logger, }: BaseMiddlewareOptions): Connect.NextHandleFunction;
546
+
547
+ /**
548
+ * 不复用 `viteConfig.server.proxy` 中 websocket proxy的原因是,
549
+ * 很难通过一种令人满意的方式,检查 mock 文件中是否有 websocket 相关的 mock 配置,
550
+ * 对比 `server.proxy` 中被使用的,并从 `viteConfig.server.proxy` 中删除。
551
+ * 由于不确定 mock 文件的规模,解析所有mock文件后找出相对应的路径匹配规则再修改 `viteConfig`,
552
+ * 这个链路的时间开销,已经影响了 vite 开发服务的启动时间,这有违 vite 和插件的预期。
553
+ * 且如果 新增的 mock 文件中 又有其他的规则需要再次 修改 `viteConfig` 导致 vite 服务重启,
554
+ * 这其实并不是一个合适的处理方案,很难符合用户的预期。
555
+ * 比较合适的方案还是提供 `wsPrefix` 配置项给用户自定义,并由用户确保 `wsPrefix` 中的项不存在
556
+ * 于 `server.proxy` 中,避免 vite 内的 http-proxy ws 与 插件的 ws 的冲突。
557
+ */
558
+
559
+ interface MockSocketOptions {
560
+ loader: MockLoader;
561
+ httpServer: http.Server | null;
562
+ proxies: string[];
563
+ cookiesOptions: MockServerPluginOptions['cookiesOptions'];
564
+ logger: Logger;
565
+ }
566
+ declare function mockWebSocket({ loader, httpServer, proxies, cookiesOptions, logger, }: MockSocketOptions): void;
567
+
568
+ declare function transformMockData(mockList: Map<string, MockHttpItem | MockWebsocketItem | MockOptions> | (MockHttpItem | MockWebsocketItem | MockOptions)[]): Record<string, MockOptions>;
569
+
570
+ export { BaseMiddlewareOptions, FormidableFile, MockHttpItem, MockOptions, MockRequest, MockServerPluginOptions, MockSocketOptions, MockWebsocketItem, baseMiddleware, createDefineMock, mockDevServerPlugin as default, defineMock, mockDevServerPlugin, mockWebSocket, transformMockData };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Connect, Plugin, ResolvedConfig } from 'vite';
1
+ import { LogLevel, Connect, Plugin, ResolvedConfig } from 'vite';
2
2
  import { Buffer } from 'node:buffer';
3
3
  import http from 'node:http';
4
4
  import { Readable } from 'node:stream';
@@ -54,6 +54,13 @@ interface MockServerPluginOptions {
54
54
  * @see [picomatch](https://github.com/micromatch/picomatch#globbing-features)
55
55
  */
56
56
  exclude?: string | string[];
57
+ /**
58
+ * Enable log and configure log level
59
+ *
60
+ * 开启日志,或配置 日志级别
61
+ * @default 'info'
62
+ */
63
+ log?: boolean | LogLevel;
57
64
  /**
58
65
  * When the mock resource is hot updated, only the data content is updated,
59
66
  * but the page is not refreshed by default.
@@ -200,6 +207,13 @@ interface MockBaseItem {
200
207
  * @default true
201
208
  */
202
209
  enabled?: boolean;
210
+ /**
211
+ * Enable log and configure log level
212
+ *
213
+ * 开启日志,或配置 日志级别
214
+ * @default 'info'
215
+ */
216
+ log?: boolean | LogLevel;
203
217
  }
204
218
  interface MockHttpItem extends MockBaseItem {
205
219
  /**
@@ -430,7 +444,7 @@ interface WebSocketSetupContext {
430
444
  type MockOptions = (MockHttpItem | MockWebsocketItem)[];
431
445
  type FormidableFile = formidable.File | formidable.File[];
432
446
 
433
- declare function mockDevServerPlugin({ prefix, wsPrefix, include, exclude, reload, cors, formidableOptions, build, cookiesOptions, }?: MockServerPluginOptions): Plugin[];
447
+ declare function mockDevServerPlugin({ prefix, wsPrefix, include, exclude, reload, log, cors, formidableOptions, build, cookiesOptions, }?: MockServerPluginOptions): Plugin[];
434
448
 
435
449
  /**
436
450
  * mock config Type helper
@@ -482,6 +496,12 @@ declare function defineMock(config: MockOptions): MockOptions;
482
496
  */
483
497
  declare function createDefineMock(transformer: (mock: MockHttpItem | MockWebsocketItem) => MockHttpItem | MockWebsocketItem | void): typeof defineMock;
484
498
 
499
+ interface Logger {
500
+ info(msg: string, level?: boolean | LogLevel): void;
501
+ warn(msg: string, level?: boolean | LogLevel): void;
502
+ error(msg: string, level?: boolean | LogLevel): void;
503
+ }
504
+
485
505
  interface MockLoaderOptions {
486
506
  cwd?: string;
487
507
  include: string[];
@@ -514,16 +534,15 @@ declare class MockLoader extends EventEmitter {
514
534
  private updateMockList;
515
535
  private updateModuleDeps;
516
536
  private loadMock;
517
- private loadFromCode;
518
- private transformWithEsbuild;
519
537
  }
520
538
 
521
539
  interface BaseMiddlewareOptions {
522
540
  formidableOptions: MockServerPluginOptions['formidableOptions'];
523
541
  cookiesOptions: MockServerPluginOptions['cookiesOptions'];
524
542
  proxies: string[];
543
+ logger: Logger;
525
544
  }
526
- declare function baseMiddleware(mockLoader: MockLoader, { formidableOptions, proxies, cookiesOptions }: BaseMiddlewareOptions): Connect.NextHandleFunction;
545
+ declare function baseMiddleware(mockLoader: MockLoader, { formidableOptions, proxies, cookiesOptions, logger, }: BaseMiddlewareOptions): Connect.NextHandleFunction;
527
546
 
528
547
  /**
529
548
  * 不复用 `viteConfig.server.proxy` 中 websocket proxy的原因是,
@@ -537,8 +556,15 @@ declare function baseMiddleware(mockLoader: MockLoader, { formidableOptions, pro
537
556
  * 于 `server.proxy` 中,避免 vite 内的 http-proxy ws 与 插件的 ws 的冲突。
538
557
  */
539
558
 
540
- declare function mockWebSocket(loader: MockLoader, httpServer: http.Server | null, proxies: string[], cookiesOptions: MockServerPluginOptions['cookiesOptions']): void;
559
+ interface MockSocketOptions {
560
+ loader: MockLoader;
561
+ httpServer: http.Server | null;
562
+ proxies: string[];
563
+ cookiesOptions: MockServerPluginOptions['cookiesOptions'];
564
+ logger: Logger;
565
+ }
566
+ declare function mockWebSocket({ loader, httpServer, proxies, cookiesOptions, logger, }: MockSocketOptions): void;
541
567
 
542
568
  declare function transformMockData(mockList: Map<string, MockHttpItem | MockWebsocketItem | MockOptions> | (MockHttpItem | MockWebsocketItem | MockOptions)[]): Record<string, MockOptions>;
543
569
 
544
- export { BaseMiddlewareOptions, FormidableFile, MockHttpItem, MockOptions, MockRequest, MockServerPluginOptions, MockWebsocketItem, baseMiddleware, createDefineMock, mockDevServerPlugin as default, defineMock, mockDevServerPlugin, mockWebSocket, transformMockData };
570
+ export { BaseMiddlewareOptions, FormidableFile, MockHttpItem, MockOptions, MockRequest, MockServerPluginOptions, MockSocketOptions, MockWebsocketItem, baseMiddleware, createDefineMock, mockDevServerPlugin as default, defineMock, mockDevServerPlugin, mockWebSocket, transformMockData };
package/dist/index.js CHANGED
@@ -1,6 +1,4 @@
1
- import qe from"node:fs";import Z from"node:fs/promises";import U from"node:path";import{build as ze}from"esbuild";import Ge from"fast-glob";import Qe from"is-core-module";import{createFilter as Ve,normalizePath as Ke}from"vite";var ue="vite-plugin-mock-dev-server",me="1.2.1";import ne from"picocolors";import te from"node:fs";import oe from"node:path";import{parse as Ie}from"node:querystring";import{URL as $e,fileURLToPath as Te}from"node:url";import Fe from"debug";import{match as Ne}from"path-to-regexp";import de from"picocolors";var v=t=>Array.isArray(t),W=t=>typeof t=="function",N=t=>Object.prototype.toString.call(t)==="[object Object]",re=t=>N(t)&&Object.keys(t).length===0,He=t=>t!==null&&typeof t=="object"&&typeof t.pipe=="function",fe=t=>He(t)&&t.readable!==!1&&typeof t._read=="function"&&typeof t._readableState=="object";function ke(t){return new Promise(o=>setTimeout(o,t))}function ge(t){return oe.dirname(Te(t))}var D=Fe("vite:plugin-mock-dev-server"),S=t=>v(t)?t:t==null?[]:[t],P={info(...t){console.info(de.cyan("mock-dev-server: "),...t)},error(...t){console.error(`
2
- `,de.cyan("mock-dev-server: "),...t,`
3
- `)}};function B(t,o,e){for(let n of o){let s=oe.join(t,n);if(te.existsSync(s)&&te.statSync(s).isFile()){let i=e!=null&&e.pathOnly?s:te.readFileSync(s,"utf-8");if(!(e!=null&&e.predicate)||e.predicate(i))return i}}let r=oe.dirname(t);if(r!==t&&(!(e!=null&&e.rootDir)||r.startsWith(e==null?void 0:e.rootDir)))return B(r,o,e)}var G=(t={})=>{let o=[],e=[];return Object.keys(t).forEach(r=>{var s,i;let n=t[r];typeof n=="string"||!n.ws&&!((s=n.target)!=null&&s.toString().startsWith("ws:"))&&!((i=n.target)!=null&&i.toString().startsWith("wss:"))?o.push(r):e.push(r)}),{httpProxies:o,wsProxies:e}};function H(t,o){return t[0]==="^"&&new RegExp(t).test(o)||o.startsWith(t)}function J(t,o){return(Ne(t,{decode:decodeURIComponent})(o)||{params:{}}).params||{}}function j(t){let o=new $e(t,"http://example.com"),e=decodeURIComponent(o.pathname),r=Ie(o.search.replace(/^\?/,""));return{pathname:e,query:r}}var Ue=/import\.meta\.env\.(.+)/;function Q(t){let o={},e=process.env.NODE_ENV||t.mode;Object.assign(o,{"process.env.NODE_ENV":JSON.stringify(e),"global.process.env.NODE_ENV":JSON.stringify(e),"globalThis.process.env.NODE_ENV":JSON.stringify(e),__vite_process_env_NODE_ENV:JSON.stringify(e)});let r={},n={},s=[];for(let a in t.define){let p=t.define[a];if(typeof p=="string")try{JSON.parse(p),r[a]=p}catch{s.push(a)}else r[a]=JSON.stringify(p);let f=a.match(Ue);f&&r[a]&&(n[f[1]]=`__vite__define__${r[a]}`)}s.length&&P.error(`${ne.yellow("[warn]")} The following keys: ${ne.yellow(ne.underline(s.join(", ")))} declared in 'define' cannot be parsed as regular code snippets.`);let i={},c={};i["import.meta.hot"]="undefined";for(let a in t.env)i[`import.meta.env.${a}`]=JSON.stringify(t.env[a]);return Object.assign(c,{"import.meta.env":JSON.stringify({...t.env,...n}).replace(/"__vite__define__(.+?)"([,}])/g,(a,p,f)=>`${p.replace(/(^\\")|(\\"$)/g,'"')}${f}`)}),{...i,...r,...c,...o}}import ye from"node:fs/promises";import Ae from"node:path";import Be from"json5";var V={name:"externalize-deps",setup(t){t.onResolve({filter:/.*/},({path:o})=>{if(o[0]!=="."&&!Ae.isAbsolute(o))return{external:!0}})}},K={name:"json5-loader",setup(t){t.onLoad({filter:/\.json5$/},async({path:o})=>{let e=await ye.readFile(o,"utf-8");return{contents:`export default ${JSON.stringify(Be.parse(e))}`,loader:"js"}})}},X={name:"json-loader",setup(t){t.onLoad({filter:/\.json$/},async({path:o})=>({contents:`export default ${await ye.readFile(o,"utf-8")}`,loader:"js"}))}},Y=t=>({name:"alias-plugin",setup(o){o.onResolve({filter:/.*/},async({path:e})=>{let r=t.find(({find:c})=>Je(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 Je(t,o){return t instanceof RegExp?t.test(o):o.length<t.length?!1:o===t?!0:o.startsWith(`${t}/`)}async function he(t,o,e){let r=S(e.include),n=S(e.exclude),s=Q(o),{httpProxies:i}=G(o.server.proxy||{});i.push(...S(e.prefix));let c=S(e.wsPrefix),a={};try{let m=B(o.root,["package.json"]);m&&(a=JSON.parse(m))}catch{}let p=e.build.dist,f=await et(process.cwd(),r,n),M=U.join(o.root,`mock-data-${Date.now()}.js`);await Z.writeFile(M,f,"utf-8");let{code:O,deps:L}=await tt(M,s,o.resolve.alias),l=Xe(L);await Z.unlink(M);let u=[{filename:U.join(p,"mock-data.js"),source:O},{filename:U.join(p,"index.js"),source:Ze(i,c,e.cookiesOptions,e.build.serverPort)},{filename:U.join(p,"package.json"),source:Ye(a,l)}];try{if(U.isAbsolute(p)){await Z.rm(p,{recursive:!0}),qe.mkdirSync(p,{recursive:!0});for(let{filename:m,source:d}of u)await Z.writeFile(m,d,"utf-8")}else for(let{filename:m,source:d}of u)t.emitFile({type:"asset",fileName:m,source:d})}catch{}}function Xe(t){let o=new Set,e=[ue,"connect","cors"];return Object.keys(t).forEach(r=>{t[r].imports.filter(s=>s.external&&!s.path.startsWith("<define:")).map(s=>s.path).forEach(s=>{!e.includes(s)&&!Qe(s)&&o.add(s)})}),Array.from(o)}function Ye(t,o){let{dependencies:e={},devDependencies:r={}}=t,n={...e,...r},s={name:"mock-server",type:"module",scripts:{start:"node index.js"},dependencies:{connect:"^3.7.0","vite-plugin-mock-dev-server":`^${me}`,cors:"^2.8.5"},pnpm:{peerDependencyRules:{ignoreMissing:["vite"]}}};return o.forEach(i=>{s.dependencies[i]=n[i]||"latest"}),JSON.stringify(s,null,2)}function Ze(t,o,e={},r=8080){return`import { createServer } from 'node:http';
1
+ import{toArray as Jt}from"@pengzhanbo/utils";import rt from"node:fs";import K from"node:fs/promises";import H from"node:path";import{toArray as X}from"@pengzhanbo/utils";import nt from"fast-glob";import st from"is-core-module";import{createFilter as it,normalizePath as ct}from"vite";var me="vite-plugin-mock-dev-server",ue="1.3.0-beta.0";import ge,{promises as se}from"node:fs";import{createRequire as Ae}from"node:module";import ne from"node:path";import{pathToFileURL as ze}from"node:url";import{build as Ge}from"esbuild";import Qe from"json5";import oe from"node:fs";import re from"node:path";import{parse as He}from"node:querystring";import{URL as Fe,fileURLToPath as qe}from"node:url";import Ue from"debug";import{match as Be}from"path-to-regexp";var Je=o=>o!==null&&typeof o=="object"&&typeof o.pipe=="function",de=o=>Je(o)&&o.readable!==!1&&typeof o._read=="function"&&typeof o._readableState=="object";function fe(o){return re.dirname(qe(o))}var A=Ue("vite:mock-dev-server");function q(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 q(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 U(o,t){return(Be(o,{decode:decodeURIComponent})(t)||{params:{}}).params||{}}function R(o){let t=new Fe(o,"http://example.com"),e=decodeURIComponent(t.pathname),n=He(t.search.replace(/^\?/,""));return{pathname:e,query:n}}var Ve={name:"externalize-deps",setup(o){o.onResolve({filter:/.*/},({path:t})=>{if(t[0]!=="."&&!ne.isAbsolute(t))return{external:!0}})}},Ke={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(Qe.parse(e))}`,loader:"js"}})}},Xe={name:"json-loader",setup(o){o.onLoad({filter:/\.json$/},async({path:t})=>({contents:`export default ${await se.readFile(t,"utf-8")}`,loader:"js"}))}},Ye=o=>({name:"alias-plugin",setup(t){t.onResolve({filter:/.*/},async({path:e})=>{let n=o.find(({find:c})=>Ze(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 Ze(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 Ge({entryPoints:[o],outfile:"out.js",write:!1,target:["node14.18","node16"],platform:"node",bundle:!0,metafile:!0,format:e?"esm":"cjs",define:n,plugins:[Ye(s),Ve,Xe,Ke]});return{code:i.outputFiles[0].text,deps:((r=i.metafile)==null?void 0:r.inputs)||{}}}catch(i){console.error(i)}return{code:"",deps:{}}}var et=fe(import.meta.url),_=Ae(et);async function ke(o,t,e,n){if(e){let s=`${o}.timestamp-${Date.now()}`,r=`${s}.mjs`,i=`${ze(s)}.mjs`;await se.writeFile(r,t,"utf8");try{return await import(i)}finally{try{ge.unlinkSync(r)}catch{}}}else{o=ne.resolve(n,o);let s=ne.extname(o),r=ge.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 he from"picocolors";import{isBoolean as tt}from"@pengzhanbo/utils";import I from"picocolors";var ye={silent:0,error:1,warn:2,info:3};function Q(o,t="info"){o=`[${o}]`;function e(s,r,i){if(i=tt(i)?i?t:"error":i,ye[i]>=ye[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 ot=/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(ot);k&&s[p]&&(r[k[1]]=`__vite__define__${s[p]}`)}i.length&&t.warn(`The following keys: ${he.yellow(he.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 ve(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=q(t.root,["package.json"]);u&&(a=JSON.parse(u))}catch{}let p=e.build.dist,m=await mt(process.cwd(),n,s),k=H.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=at(j);await K.unlink(k);let l=[{filename:H.join(p,"mock-data.js"),source:w},{filename:H.join(p,"index.js"),source:lt(i,c,e.cookiesOptions,e.build.serverPort)},{filename:H.join(p,"package.json"),source:pt(a,P)}];try{if(H.isAbsolute(p)){await K.rm(p,{recursive:!0}),rt.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 at(o){let t=new Set,e=[me,"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)&&!st(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":`^${ue}`,cors:"^2.8.5"},pnpm:{peerDependencyRules:{ignoreMissing:["vite"]}}};return t.forEach(i=>{r.dependencies[i]=s[i]||"latest"}),JSON.stringify(r,null,2)}function lt(o,t,e={},n=8080){return`import { createServer } from 'node:http';
4
2
  import connect from 'connect';
5
3
  import corsMiddleware from 'cors';
6
4
  import { baseMiddleware, mockWebSocket } from 'vite-plugin-mock-dev-server';
@@ -8,11 +6,11 @@ import mockData from './mock-data.js';
8
6
 
9
7
  const app = connect();
10
8
  const server = createServer(app);
11
- const httpProxies = ${JSON.stringify(t)};
12
- const wxProxies = ${JSON.stringify(o)};
9
+ const httpProxies = ${JSON.stringify(o)};
10
+ const wsProxies = ${JSON.stringify(t)};
13
11
  const cookiesOptions = ${JSON.stringify(e)};
14
12
 
15
- mockWebSocket({ mockData }, server, wxProxies, cookiesOptions);
13
+ mockWebSocket({ mockData }, server, wsProxies, cookiesOptions);
16
14
 
17
15
  app.use(corsMiddleware());
18
16
  app.use(baseMiddleware({ mockData }, {
@@ -21,10 +19,10 @@ app.use(baseMiddleware({ mockData }, {
21
19
  cookiesOptions,
22
20
  }));
23
21
 
24
- server.listen(${r});
22
+ server.listen(${n});
25
23
 
26
- console.log('listen: http://localhost:${r}');
27
- `}async function et(t,o,e){let r=await Ge(o,{cwd:t}),n=Ve(o,e,{resolve:!1}),s=r.filter(n),i="",c="";return s.forEach((a,p)=>{let f=Ke(U.join(t,a));i+=`import * as m${p} from '${f}';
24
+ console.log('listen: http://localhost:${n}');
25
+ `}async function mt(o,t,e){let n=await nt(t,{cwd:o}),s=it(t,e,{resolve:!1}),r=n.filter(s),i="",c="";return r.forEach((a,p)=>{let m=ct(H.join(o,a));i+=`import * as m${p} from '${m}';
28
26
  `,c+=`m${p}, `}),`import { transformMockData } from 'vite-plugin-mock-dev-server';
29
27
  ${i}
30
28
  const exporters = [${c}];
@@ -42,10 +40,18 @@ const mockList = exporters.map((raw) => {
42
40
  }
43
41
  return mockConfig
44
42
  });
45
- export default transformMockData(mockList);`}async function tt(t,o,e){var r;try{let n=await ze({entryPoints:[t],outfile:"out.js",write:!1,target:["node14.18","node16"],platform:"node",bundle:!0,metafile:!0,format:"esm",define:o,plugins:[Y(e),V,K,X]});return{code:n.outputFiles[0].text,deps:((r=n.metafile)==null?void 0:r.inputs)||{}}}catch(n){console.error(n)}return{code:"",deps:{}}}import Ot from"cors";import{pathToRegexp as Ct}from"path-to-regexp";import{Buffer as xe}from"node:buffer";import nt from"cookies";import st from"http-status";import it from"lodash.sortby";import*as q from"mime-types";import{pathToRegexp as Se}from"path-to-regexp";import _ from"picocolors";import se from"co-body";import ot from"formidable";async function ve(t,o){var n;let e=t.method.toUpperCase();if(["GET","DELETE","HEAD"].includes(e))return;let r=((n=t.headers["content-type"])==null?void 0:n.toLocaleLowerCase())||"";try{if(r.startsWith("application/json"))return await se.json(t);if(r.startsWith("application/x-www-form-urlencoded"))return await se.form(t);if(r.startsWith("text/plain"))return await se.text(t);if(r.startsWith("multipart/form-data"))return await rt(t,o)}catch(s){console.error(s)}}async function rt(t,o){let e=ot(o);return new Promise((r,n)=>{e.parse(t,(s,i,c)=>{if(s){n(s);return}r({...i,...c})})})}function Me(t,o){return E(t.headers,o.headers)&&E(t.body,o.body)&&E(t.params,o.params)&&E(t.query,o.query)&&E(t.refererQuery,o.refererQuery)}function E(t,o){if(!o)return!0;for(let e in o)if(!be(t[e],o[e]))return!1;return!0}function be(t,o){if(v(t)&&v(o)){let e=new Set;return o.every(r=>t.some((n,s)=>{if(e.has(s))return!1;let i=be(n,r);return i&&e.add(s),i}))}return N(t)&&N(o)?E(t,o):Object.is(t,o)}var ct=/:/g;function Oe(t,{formidableOptions:o={},proxies:e,cookiesOptions:r}){return async function(n,s,i){let c=Date.now(),{query:a,pathname:p}=j(n.url);if(!p||e.length===0||!e.some(h=>H(h,n.url)))return i();let f=t.mockData,M=it(Object.keys(f),h=>{var A;return((A=h.match(ct))==null?void 0:A.length)||0}).find(h=>Se(h).test(p));if(!M)return i();let{query:O}=j(n.headers.referer||""),L=await ve(n,o),l=new nt(n,s,r),u=l.get.bind(l),m=n.method.toUpperCase(),d=at(f[M],{pathname:p,method:m,request:{query:a,refererQuery:O,body:L,headers:n.headers,getCookie:u}});if(!d)return i();D("middleware: ",m,n.url);let k=n,g=s;k.body=L,k.query=a,k.refererQuery=O,k.params=J(d.url,p),k.getCookie=u,g.setCookie=l.set.bind(l);let{body:y,delay:C,type:R="json",response:I,status:$=200,statusText:T}=d;if(ie(g,$,T),await pt(k,g,d),await lt(k,g,d),y){try{let h=W(y)?await y(k):y;await we(c,C),ut(g,h,R)}catch(h){P.error(`${_.red("[body error]")} ${n.url}
46
- `,`file: ${_.cyan(d.__filepath__)}`,h),ie(g,500),s.end("")}return}if(I){try{await we(c,C),await I(k,g,i)}catch(h){P.error(`${_.red("[response error]")} ${n.url}
47
- `,`file: ${_.cyan(d.__filepath__)}`,h),ie(g,500),s.end("")}return}s.end("")}}function at(t,{pathname:o,method:e,request:r}){return t.find(n=>{if(!o||!n||!n.url||n.ws===!0||!(n.method?v(n.method)?n.method:[n.method]:["GET","POST"]).includes(e))return!1;let i=Se(n.url).test(o);if(i&&n.validator){let c=J(n.url,o);if(W(n.validator))return n.validator({params:c,...r});try{return Me({params:c,...r},n.validator)}catch(a){return P.error(`${_.red("[validator error]")} ${o}
48
- `,`file: ${_.cyan(n.__filepath__)}`,a),!1}}return i})}function ie(t,o=200,e){t.statusCode=o,t.statusMessage=e||mt(o)}async function pt(t,o,e){let{headers:r,type:n="json"}=e,s=e.__filepath__,i=q.contentType(n)||q.contentType(q.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=W(r)?await r(t):r;Object.keys(c).forEach(a=>{o.setHeader(a,c[a])})}catch(c){P.error(`${_.red("[headers error]")} ${t.url}
49
- `,c)}}async function lt(t,o,{cookies:e}){if(e)try{let r=W(e)?await e(t):e;Object.keys(r).forEach(n=>{let s=r[n];if(v(s)){let[i,c]=s;o.setCookie(n,i,c)}else o.setCookie(n,s)})}catch(r){P.error(`${_.red("[cookies error]")} ${t.url}
50
- `,r)}}function ut(t,o,e){if(fe(o))o.pipe(t);else if(xe.isBuffer(o))t.end(e==="text"||e==="json"?o.toString("utf-8"):o);else{let r=typeof o=="string"?o:JSON.stringify(o);t.end(e==="buffer"?xe.from(r):r)}}async function we(t,o){if(!o||typeof o=="number"&&o<=0||v(o)&&o.length!==2)return;let e=0;if(v(o)){let[r,n]=o;e=Math.floor(Math.random()*(n-r+1))+r}else e=o-(Date.now()-t);e>0&&await ke(e)}function mt(t){return st[t]||"Unknown"}import kt from"node:events";import ce from"node:fs";import{createRequire as gt}from"node:module";import Pe from"node:path";import{pathToFileURL as yt}from"node:url";import je from"chokidar";import{build as ht}from"esbuild";import vt from"fast-glob";import{createFilter as Mt,normalizePath as z}from"vite";import dt from"lodash.sortby";function Ce(t){let o=[];for(let[,r]of t.entries())r&&(v(r)?o.push(...r):o.push(r));let e={};return o.filter(r=>N(r)&&r.enabled!==!1&&r.url).forEach(r=>{let{pathname:n,query:s}=j(r.url),i=e[n]??=[],c={...r,url:n};if(c.ws!==!0){let a=c.validator;re(s)||(W(a)?c.validator=function(p){return E(p.query,s)&&a(p)}:a?(c.validator={...a},c.validator.query=c.validator.query?{...s,...c.validator.query}:s):c.validator={query:s})}i.push(c)}),Object.keys(e).forEach(r=>{e[r]=dt(e[r],n=>{if(n.ws===!0)return 0;let{validator:s}=n;return!s||re(s)?2:W(s)?0:1/Object.keys(s).reduce((c,a)=>c+ft(s[a]),0)})}),e}function ft(t){return t?Object.keys(t).length:0}var bt=ge(import.meta.url),F=gt(bt),ee=class extends kt{constructor(e){super();this.options=e;this.cwd=e.cwd||process.cwd();try{let r=B(this.cwd,["package.json"]);this.moduleType=r&&JSON.parse(r).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:r}=this.options,n=Mt(e,r,{resolve:!1});vt(e,{cwd:this.cwd}).then(i=>Promise.all(i.filter(n).map(c=>this.loadMock(c)))).then(()=>this.updateMockList()),this.watchMockEntry(),this.watchDeps();let s=null;this.on("mock:update",async i=>{n(i)&&(await this.loadMock(i),s&&clearImmediate(s),s=setImmediate(()=>{this.updateMockList(),this.emit("mock:update-end",i),s=null}))}),this.on("mock:unlink",async i=>{n(i)&&(this.moduleCache.delete(i),this.updateMockList(),this.emit("mock:update-end",i))})}watchMockEntry(){let{include:e}=this.options,[r,...n]=e,s=je.watch(r,{ignoreInitial:!0,cwd:this.cwd});n.length>0&&n.forEach(i=>s.add(i)),s.on("add",async i=>{i=z(i),this.emit("mock:update",i),D("watcher:add",i)}),s.on("change",async i=>{i=z(i),this.emit("mock:update",i),D("watcher:change",i)}),s.on("unlink",async i=>{i=z(i),this.emit("mock:unlink",i),D("watcher:unlink",i)}),this.mockWatcher=s}watchDeps(){let e=[];this.depsWatcher=je.watch([],{ignoreInitial:!0,cwd:this.cwd}),this.depsWatcher.on("change",r=>{r=z(r);let n=this.moduleDeps.get(r);n&&n.forEach(s=>{this.emit("mock:update",s)})}),this.depsWatcher.on("unlink",r=>{r=z(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=Ce(this.moduleCache)}updateModuleDeps(e,r){Object.keys(r).forEach(n=>{r[n].imports.map(i=>i.path).forEach(i=>{this.moduleDeps.has(i)||this.moduleDeps.set(i,new Set),this.moduleDeps.get(i).add(e)})}),this.emit("update:deps")}async loadMock(e){if(!e)return;let r=!1;/\.m[jt]s$/.test(e)?r=!0:/\.c[jt]s$/.test(e)?r=!1:r=this.moduleType==="esm";let{code:n,deps:s}=await this.transformWithEsbuild(e,r);try{let i=await this.loadFromCode(e,n,r)||{},c;i.default?c=i.default:(c=[],Object.keys(i).forEach(a=>{v(i[a])?c.push(...i[a]):c.push(i[a])})),v(c)?c.forEach(a=>a.__filepath__=e):c.__filepath__=e,this.moduleCache.set(e,c),this.updateModuleDeps(e,s)}catch(i){console.error(i)}}async loadFromCode(e,r,n){if(n){let s=`${e}.timestamp-${Date.now()}`,i=`${s}.mjs`,c=`${yt(s)}.mjs`;await ce.promises.writeFile(i,r,"utf8");try{return await import(c)}finally{try{ce.unlinkSync(i)}catch{}}}else{e=Pe.resolve(this.cwd,e);let s=Pe.extname(e),i=ce.realpathSync(e),c=s in F.extensions?s:".js",a=F.extensions[c];F.extensions[c]=(f,M)=>{M===i?f._compile(r,M):a(f,M)},delete F.cache[F.resolve(e)];let p=F(e);return F.extensions[c]=a,p.__esModule?p:{default:p}}}async transformWithEsbuild(e,r){var n;try{let s=await ht({entryPoints:[e],outfile:"out.js",write:!1,target:["node14.18","node16"],platform:"node",bundle:!0,metafile:!0,format:r?"esm":"cjs",define:this.options.define,plugins:[Y(this.options.alias),V,X,K]});return{code:s.outputFiles[0].text,deps:((n=s.metafile)==null?void 0:n.inputs)||{}}}catch(s){console.error(s)}return{code:"",deps:{}}}};import xt from"cookies";import{pathToRegexp as Re}from"path-to-regexp";import wt from"picocolors";import{WebSocketServer as St}from"ws";function De(t,o,e,r){var L;let n=new Map,s=new Map,i=new WeakMap,c=l=>{let u=s.get(l);return!u&&s.set(l,u=new Map),u},a=(l,u)=>{let m=l.get(u);return!m&&l.set(u,m=new St({noServer:!0})),m},p=(l,u)=>{let m=n.get(l);!m&&n.set(l,m=new Set),m.add(u)},f=(l,u,m,d,k,g)=>{var y;try{(y=m.setup)==null||y.call(m,u,d),u.on("close",()=>l.delete(k))}catch(C){P.error(`${wt.red("[websocket server error]")} ${g}
51
- `,C)}},M=(l,u,m,d)=>{l.emit("connection",u,m),u.on("close",()=>{let k=d.findIndex(g=>g.ws===u);k!==-1&&d.splice(k,1)})},O=(l,u,m,d,k)=>{let{cleanupList:g,connectionList:y,context:C}=i.get(u);We(g),y.forEach(({ws:R})=>R.removeAllListeners()),u.removeAllListeners(),f(l,u,m,C,d,k),y.forEach(({ws:R,req:I})=>M(u,R,I,y))};(L=t.on)==null||L.call(t,"mock:update-end",l=>{if(!n.has(l))return;let u=n.get(l);if(u)for(let m of u.values())for(let d of t.mockData[m]){if(!d.ws||d.__filepath__!==l)return;let k=c(m);for(let[g,y]of k.entries())O(k,y,d,g,l)}}),o==null||o.on("upgrade",(l,u,m)=>{let{pathname:d,query:k}=j(l.url);if(!d||e.length===0||!e.some(b=>H(b,l.url)))return;let g=t.mockData,y=Object.keys(g).find(b=>Re(b).test(d));if(!y)return;let C=g[y].find(b=>b.url&&b.ws&&Re(b.url).test(d));if(!C)return;let R=C.__filepath__;p(R,y);let I=c(y),$=a(I,d),T=i.get($);if(!T){let b=[],pe={onCleanup:Le=>b.push(Le)};T={cleanupList:b,context:pe,connectionList:[]},i.set($,T),f(I,$,C,pe,d,R)}let h=l,A=new xt(l,l,r),{query:_e}=j(l.headers.referer||"");h.query=k,h.refererQuery=_e,h.params=J(y,d),h.getCookie=A.get.bind(A),$.handleUpgrade(h,u,m,b=>{D(`websocket-mock: ${l.url} connected`),T.connectionList.push({req:h,ws:b}),M($,b,h,T.connectionList)})}),o==null||o.on("close",()=>{for(let l of s.values()){for(let u of l.values()){let m=i.get(u);We(m.cleanupList),u.close()}l.clear()}s.clear(),n.clear()})}function We(t){let o;for(;o=t.shift();)o==null||o()}function ae(t,o,e,r){let n=new ee({include:S(o.include),exclude:S(o.exclude),define:Q(t),alias:t.resolve.alias});n.load(),n.on("mock:update-end",()=>{o.reload&&(r==null||r.send({type:"full-reload"}))}),e==null||e.on("close",()=>n.close());let{httpProxies:s}=G(t.server.proxy||{}),c=[...S(o.prefix),...s];De(n,e,S(o.wsPrefix),o.cookiesOptions);let a=[];return a.push(Pt(n,c,t,o),Oe(n,{formidableOptions:o.formidableOptions,proxies:c,cookiesOptions:o.cookiesOptions})),a.filter(Boolean)}function Pt(t,o,e,r){let n={},s=r.cors!==!1||e.server.cors!==!1;return e.server.cors!==!1&&(n={...n,...typeof e.server.cors=="boolean"?{}:e.server.cors}),r.cors!==!1&&(n={...n,...typeof r.cors=="boolean"?{}:r.cors}),s?function(i,c,a){let{pathname:p}=j(i.url);if(!p||o.length===0||!o.some(O=>H(O,i.url)))return a();let f=t.mockData;if(!Object.keys(f).find(O=>Ct(O).test(p)))return a();Ot(n)(i,c,a)}:void 0}function Ee({prefix:t=[],wsPrefix:o=[],include:e=["mock/**/*.mock.{js,ts,cjs,mjs,json,json5}"],exclude:r=["**/node_modules/**","**/.vscode/**","**/.git/**"],reload:n=!1,cors:s=!0,formidableOptions:i={},build:c=!1,cookiesOptions:a={}}={}){let p={prefix:t,wsPrefix:o,include:e,exclude:r,reload:n,cors:s,cookiesOptions:a,formidableOptions:{multiples:!0,...i},build:c?Object.assign({serverPort:8080,dist:"mockServer"},typeof c=="object"?c:{}):!1},f=[Rt(p)];return p.build&&f.push(jt(p)),f}function jt(t){let o={};return{name:"vite-plugin-mock-dev-server-generator",enforce:"post",apply:"build",configResolved(e){o=e,e.logger.warn("")},async buildEnd(e){e||o.command==="build"&&await he(this,o,t)}}}function Rt(t){let o={};return{name:"vite-plugin-mock-dev-server",enforce:"pre",apply:"serve",config(e){var s;let r=S(t.wsPrefix);if(r.length===0||!((s=e.server)!=null&&s.proxy)||Object.keys(e.server.proxy).length===0)return;let n={};Object.keys(e.server.proxy).forEach(i=>{r.includes(i)||(n[i]=e.server.proxy[i])}),e.server.proxy=n},configResolved(e){o=e,e.logger.warn("")},configureServer({middlewares:e,config:r,httpServer:n,ws:s}){ae(r,t,n,s).forEach(c=>e.use(c))},configurePreviewServer({middlewares:e,httpServer:r}){ae(o,t,r).forEach(s=>e.use(s))}}}function fr(t){return t}function kr(t){return e=>(v(e)?e=e.map(r=>t(r)||r):e=t(e)||e,e)}var vr=Ee;export{Oe as baseMiddleware,kr as createDefineMock,vr as default,fr as defineMock,Ee as mockDevServerPlugin,De as mockWebSocket,Ce as transformMockData};
43
+ export default transformMockData(mockList);`}import{isBoolean as Ft,toArray as te}from"@pengzhanbo/utils";import qt from"cors";import{pathToRegexp as Ut}from"path-to-regexp";import{Buffer as Oe}from"node:buffer";import{isArray as Y,isEmptyObject as ft,isFunction as Z,random as gt,sleep as kt,sortBy as yt,timestamp as Re}from"@pengzhanbo/utils";import ht from"cookies";import vt from"http-status";import*as B from"mime-types";import{pathToRegexp as Pe}from"path-to-regexp";import M from"picocolors";import ie from"co-body";import ut from"formidable";async function Me(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 dt(o,t)}catch(r){console.error(r)}}async function dt(o,t){let e=ut(t);return new Promise((n,s)=>{e.parse(o,(r,i,c)=>{if(r){s(r);return}n({...i,...c})})})}import{isArray as be,isObject as xe}from"@pengzhanbo/utils";function we(o,t){return L(o.headers,t.headers)&&L(o.body,t.body)&&L(o.params,t.params)&&L(o.query,t.query)&&L(o.refererQuery,t.refererQuery)}function L(o,t){if(!t)return!0;for(let e in t)if(!Se(o[e],t[e]))return!1;return!0}function Se(o,t){if(be(o)&&be(t)){let e=new Set;return t.every(n=>o.some((s,r)=>{if(e.has(r))return!1;let i=Se(s,n);return i&&e.add(r),i}))}return xe(o)&&xe(t)?L(o,t):Object.is(o,t)}var Mt=/:/g;function We(o,{formidableOptions:t={},proxies:e,cookiesOptions:n,logger:s}){return async function(r,i,c){let a=Re(),{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=yt(Object.keys(k),O=>{var v;return((v=O.match(Mt))==null?void 0:v.length)||0}).find(O=>Pe(O).test(m));if(!w)return c();let{query:j}=R(r.headers.referer||""),P=await Me(r,t),l=new ht(r,i,n),u=l.get.bind(l),d=r.method.toUpperCase(),f=bt(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=U(f.url,m),g.getCookie=u,y.setCookie=l.set.bind(l);let{body:h,delay:S,type:W="json",response:E,status:$=200,statusText:D,log:C,__filepath__:T}=f;if(ce(y,$,D),await xt(g,y,f,s),await wt(g,y,f,s),s.info(Ct(g,T),C),h){try{let O=Z(h)?await h(g):h;await Ce(a,S),St(y,O,W)}catch(O){s.error(`${M.red(`mock error at ${m}`)}
44
+ ${O}
45
+ at body (${M.underline(T)})`,C),ce(y,500),i.end("")}return}if(E){try{await Ce(a,S),await E(g,y,c)}catch(O){s.error(`${M.red(`mock error at ${m}`)}
46
+ ${O}
47
+ at response (${M.underline(T)})`,C),ce(y,500),i.end("")}return}i.end("")}}function bt(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=Pe(r.url).test(e);if(c&&r.validator){let a=U(r.url,e);if(Z(r.validator))return r.validator({params:a,...s});try{return we({params:a,...s},r.validator)}catch(p){let m=r.__filepath__;return t.error(`${M.red(`mock error at ${e}`)}
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||Ot(t)}async function xt(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
+ ${a}
51
+ at headers (${M.underline(i)})`,e.log)}}async function wt(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
+ ${i}
53
+ at cookies (${M.underline(r)})`,e.log)}}function St(o,t,e){if(de(t))t.pipe(o);else if(Oe.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"?Oe.from(n):n)}}async function Ce(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=gt(n,s)}else e=t-(Re()-o);e>0&&await kt(e)}function Ot(o){return vt[o]||"Unknown"}function Ct(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||ft(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 Lt from"node:events";import{hasOwn as Et,isArray as $t,promiseParallel as Dt,toArray as _t}from"@pengzhanbo/utils";import $e from"chokidar";import It from"fast-glob";import{createFilter as Tt,normalizePath as J}from"vite";import{isArray as Rt,isEmptyObject as je,isFunction as Le,isObject as Pt,sortBy as Wt}from"@pengzhanbo/utils";function Ee(o){let t=[];for(let[,n]of o.entries())n&&(Rt(n)?t.push(...n):t.push(n));let e={};return t.filter(n=>Pt(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;je(r)||(Le(a)?c.validator=function(p){return L(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]=Wt(e[n],s=>{if(s.ws===!0)return 0;let{validator:r}=s;return!r||je(r)?2:Le(r)?0:1/Object.keys(r).reduce((c,a)=>c+jt(r[a]),0)})}),e}function jt(o){return o?Object.keys(o).length:0}var ee=class extends Lt{constructor(e){super();this.options=e;this.cwd=e.cwd||process.cwd();try{let n=q(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=Tt(e,n,{resolve:!1});It(e,{cwd:this.cwd}).then(i=>i.filter(s).map(c=>()=>this.loadMock(c))).then(i=>Dt(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=$e.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)}),this.mockWatcher=r}watchDeps(){let e=[];this.depsWatcher=$e.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=Ee(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 ke(e,i,n,this.cwd)||{},p;Et(a,"default")?p=a.default:(p=[],Object.keys(a).forEach(m=>p.push(..._t(a[m])))),$t(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 Nt from"cookies";import{pathToRegexp as De}from"path-to-regexp";import F from"picocolors";import{WebSocketServer as Ht}from"ws";function Ie({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 Ht({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(`${F.red(`WebSocket mock error at ${u.path}`)}
54
+ ${S}
55
+ at setup (${y})`,d.log)})}catch(S){s.error(`${F.red(`WebSocket mock error at ${u.path}`)}
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);_e(y),h.forEach(({ws:W})=>W.removeAllListeners()),u.removeAllListeners(),k(l,u,d,S,f,g),h.forEach(({ws:W,req:E})=>w(u,W,E,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=>De(v).test(f));if(!h)return;let S=y[h].find(v=>v.url&&v.ws&&De(v.url).test(f));if(!S)return;let W=S.__filepath__;m(W,h);let E=a(h),$=p(E,f),D=c.get($);if(!D){let v=[],pe={onCleanup:Ne=>v.push(Ne)};D={cleanupList:v,context:pe,connectionList:[]},c.set($,D),k(E,$,S,pe,f,W)}let C=l,T=new Nt(l,l,n),{query:O}=R(l.headers.referer||"");C.query=g,C.refererQuery=O,C.params=U(h,f),C.getCookie=T.get.bind(T),$.handleUpgrade(C,u,d,v=>{s.info(`${F.magenta(F.bold("WebSocket"))} ${F.green(l.url)} connected ${F.dim(`(${W})`)}`,S.log),D.connectionList.push({req:C,ws:v}),w($,v,C,D.connectionList)})}),t==null||t.on("close",()=>{for(let l of i.values()){for(let u of l.values()){let d=c.get(u);_e(d.cleanupList),u.close()}l.clear()}i.clear(),r.clear()})}function _e(o){let t;for(;t=o.shift();)t==null||t()}function ae(o,t,e,n){let s=Q("vite:mock",Ft(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];Ie({loader:r,httpServer:e,proxies:te(t.wsPrefix),cookiesOptions:t.cookiesOptions,logger:s});let p=[];return p.push(Bt(r,a,o,t),We(r,{formidableOptions:t.formidableOptions,proxies:a,cookiesOptions:t.cookiesOptions,logger:s})),p.filter(Boolean)}function Bt(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=>Ut(w).test(p)))return a();qt(s)(i,c,a)}:void 0}function Te({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=[zt(m)];return m.build&&k.push(At(m)),k}function At(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 ve(this,t,o)}}}function zt(o){let t={};return{name:"vite-plugin-mock-dev-server",enforce:"pre",apply:"serve",config(e){var r;let n=Jt(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 Gt}from"@pengzhanbo/utils";function Tr(o){return o}function Nr(o){return e=>(Gt(e)?e=e.map(n=>o(n)||n):e=o(e)||e,e)}var Ur=Te;export{We as baseMiddleware,Nr as createDefineMock,Ur as default,Tr as defineMock,Te as mockDevServerPlugin,Ie as mockWebSocket,Ee as transformMockData};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vite-plugin-mock-dev-server",
3
- "version": "1.2.1",
3
+ "version": "1.3.0-beta.0",
4
4
  "keywords": [
5
5
  "vite",
6
6
  "plugin",
@@ -19,9 +19,14 @@
19
19
  "type": "module",
20
20
  "exports": {
21
21
  ".": {
22
- "types": "./dist/index.d.ts",
23
- "require": "./dist/index.cjs",
24
- "import": "./dist/index.js"
22
+ "require": {
23
+ "default": "./dist/index.cjs",
24
+ "types": "./dist/index.d.cts"
25
+ },
26
+ "import": {
27
+ "default": "./dist/index.js",
28
+ "types": "./dist/index.d.ts"
29
+ }
25
30
  },
26
31
  "./package.json": "./package.json"
27
32
  },
@@ -33,57 +38,56 @@
33
38
  ],
34
39
  "prettier": "@pengzhanbo/prettier-config",
35
40
  "dependencies": {
41
+ "@pengzhanbo/utils": "^1.0.8",
36
42
  "chokidar": "^3.5.3",
37
43
  "co-body": "^6.1.0",
38
44
  "cookies": "^0.8.0",
39
45
  "cors": "^2.8.5",
40
46
  "debug": "^4.3.4",
41
- "esbuild": "^0.18.4",
42
- "fast-glob": "^3.2.12",
43
- "formidable": "^2.1.1",
47
+ "esbuild": "^0.18.15",
48
+ "fast-glob": "^3.3.1",
49
+ "formidable": "2.1.1",
44
50
  "http-status": "^1.6.2",
45
51
  "is-core-module": "^2.12.1",
46
52
  "json5": "^2.2.3",
47
- "lodash.sortby": "^4.7.0",
48
53
  "mime-types": "^2.1.35",
49
54
  "path-to-regexp": "^6.2.1",
50
55
  "picocolors": "^1.0.0",
51
56
  "ws": "^8.13.0"
52
57
  },
53
58
  "devDependencies": {
54
- "@pengzhanbo/eslint-config": "^0.3.14",
55
- "@pengzhanbo/prettier-config": "^0.3.14",
59
+ "@pengzhanbo/eslint-config": "^0.4.0",
60
+ "@pengzhanbo/prettier-config": "^0.4.0",
56
61
  "@types/co-body": "^6.1.0",
57
62
  "@types/cookies": "^0.7.7",
58
63
  "@types/cors": "^2.8.13",
59
64
  "@types/debug": "^4.1.8",
60
- "@types/formidable": "^2.0.6",
65
+ "@types/formidable": "2.0.6",
61
66
  "@types/is-core-module": "^2.2.0",
62
- "@types/lodash.sortby": "^4.7.7",
63
67
  "@types/mime-types": "^2.1.1",
64
- "@types/node": "^18.16.18",
68
+ "@types/node": "^20.4.3",
65
69
  "@types/ws": "^8.5.5",
66
70
  "bumpp": "^9.1.1",
67
71
  "conventional-changelog-cli": "^3.0.0",
68
- "eslint": "^8.43.0",
72
+ "eslint": "^8.45.0",
69
73
  "mockjs": "^1.1.0",
70
- "prettier": "^2.8.8",
71
- "tsup": "^7.0.0",
72
- "typescript": "^5.1.3",
73
- "vite": "^4.3.9",
74
- "vitepress": "1.0.0-beta.2"
74
+ "prettier": "^3.0.0",
75
+ "tsup": "^7.1.0",
76
+ "typescript": "^5.1.6",
77
+ "vite": "^4.4.6",
78
+ "vitepress": "1.0.0-beta.6"
75
79
  },
76
80
  "peerDependencies": {
77
81
  "vite": ">=3.0.0"
78
82
  },
79
- "packageManager": "pnpm@8.6.2",
83
+ "packageManager": "pnpm@8.6.9",
80
84
  "engines": {
81
85
  "node": "^14.18.0 || >=16"
82
86
  },
83
87
  "scripts": {
84
88
  "build": "tsup",
85
- "dev": "DEBUG=vite:plugin-mock-dev-server vite example --config ./example/vite.config.ts",
86
- "example:build": "DEBUG=vite:plugin-mock-dev-server vite build example --config ./example/vite.config.ts",
89
+ "dev": "DEBUG=vite:mock-dev-server vite example --config ./example/vite.config.ts",
90
+ "example:build": "DEBUG=vite:mock-dev-server vite build example --config ./example/vite.config.ts",
87
91
  "docs:build": "vitepress build docs",
88
92
  "docs:dev": "vitepress dev docs",
89
93
  "docs:preview": "vitepress preview docs",