vite-plugin-mock-dev-server 2.0.6 → 2.1.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.
@@ -0,0 +1,2 @@
1
+ import{attempt as e,attemptAsync as t,deepEqual as n,hasOwn as r,isArray as i,isBoolean as a,isEmptyObject as o,isFunction as s,isPlainObject as c,kebabCase as l,objectKeys as u,partition as d,random as f,sleep as p,sortBy as m,timestamp as h,toArray as g,uniq as _}from"@pengzhanbo/utils";import v from"picomatch";import{match as y,parse as b,pathToRegexp as x}from"path-to-regexp";import S from"node:os";import C from"node:path";import w from"debug";import{parse as T}from"node:querystring";import E from"node:fs";import D from"cors";import O from"ansis";import k from"co-body";import ee from"formidable";import A from"node:http";import j from"node:crypto";import{Buffer as M}from"node:buffer";import N from"node:zlib";import P from"http-status";import*as F from"mime-types";import{WebSocketServer as I}from"ws";function L(e,t){let n=[],r=[`**/node_modules/**`,...g(t)];return g(e).forEach(e=>{e[0]===`!`?r.push(e.slice(1)):n.push(e)}),{pattern:n,ignore:r,isMatch:v(n,{ignore:r})}}function te(e,t){return e[0]===`^`&&new RegExp(e).test(t)||t.startsWith(e)}function ne(e){return typeof e==`object`&&!!e&&typeof e.pipe==`function`}function re(e){return ne(e)&&e.readable!==!1&&typeof e._read==`function`&&typeof e._readableState==`object`}const R={};async function ie(e){if(r(R,e))return R[e];try{return import.meta.resolve?R[e]=!!import.meta.resolve(e):(await import(e),R[e]=!0),R[e]}catch{}return R[e]=!1,!1}function ae(e){return[`text`,`json`,`xml`].some(t=>e.includes(t))}function z(e,t){if(!t)return!0;for(let n in t)if(!oe(e[n],t[n]))return!1;return!0}function oe(e,t){if(i(e)&&i(t)){let n=new Set;return t.every(t=>e.some((e,r)=>{if(n.has(r))return!1;let i=oe(e,t);return i&&n.add(r),i}))}return c(e)&&c(t)?z(e,t):Object.is(e,t)}const se=new Map;function B(e,t){let n=se.get(e);return n||(n=x(e).regexp,se.set(e,n)),n.test(t)}const ce=w(`vite:mock-dev-server`),le=/\\/g,ue=S.platform()===`win32`;function de(e){return e.replace(le,`/`)}function fe(e){return C.posix.normalize(ue?de(e):e)}function V(e){let t=new URL(e,`http://example.com`);return{pathname:decodeURIComponent(t.pathname),query:T(t.search.replace(/^\?/,``))}}function pe(e,t){let n;return i(e)?n=e.map(e=>({...e,__filepath__:t})):`url`in e?n={...e,__filepath__:t}:(n=[],Object.keys(e).forEach(r=>{let a=e[r];i(a)?n.push(...a.map(e=>({...e,__filepath__:t}))):n.push({...a,__filepath__:t})})),n}function me(e){let t=[];for(let[,n]of e.entries())n&&t.push(...g(n));let n={};return t.filter(e=>c(e)&&e.enabled!==!1&&e.url).forEach(e=>{let{pathname:t,query:r}=V(e.url),i=n[t]??=[],a={...e,url:t};if(a.ws!==!0){let e=a.validator;o(r)||(s(e)?a.validator=function(t){return z(t.query,r)&&e(t)}:e?(a.validator={...e},a.validator.query=a.validator.query?{...r,...a.validator.query}:r):a.validator={query:r})}i.push(a)}),Object.keys(n).forEach(e=>{n[e]=he(n[e])}),n}function he(e){return m(e,e=>{if(e.ws===!0)return 0;let{validator:t}=e;return!t||o(t)?2:s(t)?0:1/Object.keys(t).reduce((e,n)=>e+ge(t[n]),0)})}function ge(e){return e?Object.keys(e).length:0}function _e(e){let t=e?D(e):void 0;return t?(e,n)=>new Promise((r,i)=>t(e,n,e=>{e?i(e):r()})):void 0}async function ve(e,t,n,r={}){let i=e.method.toUpperCase();if([`HEAD`,`OPTIONS`].includes(i))return;let a=e.headers[`content-type`]?.toLocaleLowerCase()||``,{limit:o,formLimit:s,jsonLimit:c,textLimit:l,...u}=r;try{if(a.startsWith(`application/json`))return await k.json(e,{limit:c||o,...u});if(a.startsWith(`application/x-www-form-urlencoded`))return await k.form(e,{limit:s||o,...u});if(a.startsWith(`text/plain`))return await k.text(e,{limit:l||o,...u});if(a.startsWith(`multipart/form-data`))return await be(e,n)}catch(e){t.error(e)}}const ye={keepExtensions:!0,filename(e,t,n){return n?.originalFilename||`${e}.${Date.now()}${t?`.${t}`:``}`}};async function be(e,t){let n=ee({...ye,...t});return new Promise((t,r)=>{n.parse(e,(e,n,i)=>{if(e){r(e);return}t({...n,...i})})})}const xe=new Map;function H(e,t){let n=xe.get(e);n||(n=y(e,{decode:decodeURIComponent}),xe.set(e,n));let r=n(t);return r?r.params:{}}function Se(e,t){return z(e.headers,t.headers)&&z(e.body,t.body)&&z(e.params,t.params)&&z(e.query,t.query)&&z(e.refererQuery,t.refererQuery)}function U(e,t){return!t||o(t)?``:` ${O.gray(`${e}:`)}${JSON.stringify(t)}`}function Ce(e,t,n){let{url:r,method:i,query:a,params:o,body:s}=e,{pathname:c}=new URL(r,`http://example.com`);c=O.green(decodeURIComponent(c));let l=O.magenta.bold(i),u=U(`query`,a),d=U(`params`,o),f=U(`body`,s),p=n?` 🎲 ${O.bgYellow(`ERR`)}`:``,m=` ${O.dim.underline(`(${t})`)}`;return`${l}${p} ${c}${u}${d}${f}${m}`}function we(t,n,{pathname:r,method:a,request:o}){return t.find(t=>{if(!r||!t||!t.url||t.ws||!(t.method?i(t.method)?t.method:[t.method]:[`GET`,`POST`]).includes(a))return!1;let c=B(t.url,r);if(c&&t.validator){let i=H(t.url,r);if(s(t.validator))return t.validator({params:i,...o});{let[a,s]=e(Se,{params:i,...o},t.validator);if(a){let e=t.__filepath__;return n.error(`${O.red(`mock error at ${r}`)}\n${a}\n at validator (${O.underline(e)})`,t.log),!1}return s}}return c})}const W={};function G(e){if(W[e])return W[e];let t=[],n=(e,r=!1)=>{for(let i of e)if(i.type===`text`){let e=i.value.split(`/`).filter(Boolean);e.length&&t.push(...e.map(e=>({type:`text`,value:e})))}else i.type===`group`?n(i.tokens,!0):(r&&(i.optional=!0),t.push(i))};return n(b(e).tokens),W[e]=t,t}function Te(e){let t=e.map(e=>G(e).length);return t=t.length===0?[1]:t,Math.max(...t)+2}function Ee(e,t){let n=G(e),r=n.filter(e=>e.type!==`text`);if(r.length===0)return 0;let i=r.length,a=0;for(let e=0;e<n.length;e++){let r=n[e],o=r.type!==`text`,s=r.type===`wildcard`,c=!!r.optional;a+=o?1:0,e===n.length-1&&s?i+=(c?5:4)*10**(n.length===1?t+1:t):(s?i+=3*10**(t-1):i+=2*10**a,c&&(i+=10**a))}return i}function De(e){let t=Te(e);return e.sort((e,n)=>Ee(e,t)-Ee(n,t))}function Oe(e,t,n){let r=De(e.filter(e=>B(e,t))),{global:a=[],special:s={}}=n;if(a.length===0&&o(s)||r.length===0)return r;let[c,l]=d(r,e=>G(e).filter(e=>e.type!==`text`).length>0),u=a.filter(e=>c.includes(e));if(u.length>0&&(r=_([...l,...u,...c])),o(s))return r;let f=Object.keys(s).filter(e=>r.includes(e))[0];if(!f)return r;let p=s[f],{rules:m,when:h}=i(p)?{rules:p,when:[]}:p;return m.includes(r[0])&&(h.length===0||h.some(e=>x(e).regexp.test(t)))&&(r=_([f,...r])),r}const K=/^[\t\u0020-\u007E\u0080-\u00FF]+$/,ke=/^(?:low|medium|high)$/i,q=Object.create(null),Ae=/[\^$\\.*+?()[\]{}|]/g,je=/[;=]/,Me=/;/,Ne=/^(?:lax|none|strict)$/i;var Pe=class{name;value;maxAge;expires;path=`/`;domain;secure=!1;httpOnly=!0;sameSite=!1;overwrite=!1;priority;partitioned;constructor(e,t,n={}){if(!K.test(e)||je.test(e))throw TypeError(`argument name is invalid`);if(t&&(!K.test(t)||Me.test(t)))throw TypeError(`argument value is invalid`);if(this.name=e,this.value=t,Object.assign(this,n),this.value||(this.expires=new Date(0),this.maxAge=void 0),this.path&&!K.test(this.path))throw TypeError(`[Cookie] option path is invalid`);if(this.domain&&!K.test(this.domain))throw TypeError(`[Cookie] option domain is invalid`);if(typeof this.maxAge==`number`?Number.isNaN(this.maxAge)||!Number.isFinite(this.maxAge):this.maxAge)throw TypeError(`[Cookie] option maxAge is invalid`);if(this.priority&&!ke.test(this.priority))throw TypeError(`[Cookie] option priority is invalid`);if(this.sameSite&&this.sameSite!==!0&&!Ne.test(this.sameSite))throw TypeError(`[Cookie] option sameSite is invalid`)}toString(){return`${this.name}=${this.value}`}toHeader(){let e=this.toString();return this.maxAge&&(this.expires=new Date(Date.now()+this.maxAge)),this.path&&(e+=`; path=${this.path}`),this.expires&&(e+=`; expires=${this.expires.toUTCString()}`),this.domain&&(e+=`; domain=${this.domain}`),this.priority&&(e+=`; priority=${this.priority.toLowerCase()}`),this.sameSite&&(e+=`; samesite=${this.sameSite===!0?`strict`:this.sameSite.toLowerCase()}`),this.secure&&(e+=`; secure`),this.httpOnly&&(e+=`; httponly`),this.partitioned&&(e+=`; partitioned`),e}};function Fe(e,t){if(e.length!==t.length)return!1;if(j.timingSafeEqual)return j.timingSafeEqual(e,t);for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}function Ie(e,t){return j.createHmac(`sha256`,e).update(t).digest()}function Le(e,t){let n=String(e),r=String(t),i=j.randomBytes(32);return Fe(Ie(i,n),Ie(i,r))&&e===t}const Re=/[/+=]/g,ze={"/":`_`,"+":`-`,"=":``};var Be=class{algorithm;encoding;keys=[];constructor(e,t,n){this.keys=e,this.algorithm=t||`sha256`,this.encoding=n||`base64`}sign(e,t=this.keys[0]){return j.createHmac(this.algorithm,t).update(e).digest(this.encoding).replace(Re,e=>ze[e])}index(e,t){for(let n=0,r=this.keys.length;n<r;n++)if(Le(t,this.sign(e,this.keys[n])))return n;return-1}verify(e,t){return this.index(e,t)>-1}},Ve=class{request;response;secure;keys;constructor(e,t,n={}){this.request=e,this.response=t,this.secure=n.secure,n.keys instanceof Be?this.keys=n.keys:i(n.keys)&&(this.keys=new Be(n.keys))}set(e,t,n){let r=this.request,i=this.response,a=g(i.getHeader(`Set-Cookie`)),o=new Pe(e,t,n),s=n?.signed??!!this.keys,c=this.secure===void 0?r.protocol===`https`||Ue(r):!!this.secure;if(!c&&n?.secure)throw Error(`Cannot send secure cookie over unencrypted connection`);if(o.secure=n?.secure??c,We(a,o),s&&n){if(!this.keys)throw Error(`.keys required for signed cookies`);o.value=this.keys.sign(o.toString()),o.name+=`.sig`,We(a,o)}return(i.set?A.OutgoingMessage.prototype.setHeader:i.setHeader).call(i,`Set-Cookie`,a),this}get(e,t){let n=`${e}.sig`,r=t?.signed??!!this.keys,i=this.request.headers.cookie;if(!i)return;let a=i.match(He(e));if(!a)return;let o=a[1];if(o[0]===`"`&&(o=o.slice(1,-1)),!t||!r)return o;let s=this.get(n);if(!s)return;let c=`${e}=${o}`;if(!this.keys)throw Error(`.keys required for signed cookies`);let l=this.keys.index(c,s);if(l<0)this.set(n,null,{path:`/`,signed:!1});else return l&&this.set(n,this.keys.sign(c),{signed:!1}),o}};function He(e){return q[e]||(q[e]=RegExp(`(?:^|;) *${e.replace(Ae,`\\$&`)}=([^;]*)`)),q[e]}function Ue(e){return!!(e.socket?e.socket.encrypted:e.connection.encrypted)}function We(e,t){if(t.overwrite)for(let n=e.length-1;n>=0;n--)e[n].indexOf(`${t.name}=`)===0&&e.splice(n,1);e.push(t.toHeader())}const Ge=`date.expires.last-modified.server.x-powered-by.x-aspnet-version.x-nginx-version.via.cache-control.etag.age.connection.keep-alive.proxy-authenticate.proxy-authorization.proxy-connection.trailer.access-control-allow-origin.access-control-allow-credentials.access-control-allow-methods.access-control-allow-headers.access-control-expose-headers.access-control-max-age.origin.p3p.pragma.x-request-id.x-correlation-id.x-trace-id.x-varnish.x-cache.x-cache-hits.x-cache-status.cf-cache-status.cf-ray.cf-request-id.server-timing.x-dns-prefetch-control`.split(`.`);async function Ke(e,t){try{switch(t.toLowerCase()){case`gzip`:case`x-gzip`:return{body:await Ye(e),encoding:`identity`};case`deflate`:case`x-deflate`:return{body:await Xe(e),encoding:`identity`};case`br`:return{body:await Je(e),encoding:`identity`};case`zstd`:return{body:await qe(e),encoding:`identity`}}}catch{}return{body:e,encoding:t}}let J=null;async function qe(e){if(N.zstdDecompress)return new Promise((t,n)=>{N.zstdDecompress(e,(e,r)=>{e?n(e):t(r)})});if(!J){let{ZstdCodec:e}=await import(`zstd-codec`);J=await new Promise(t=>{e.run(e=>{t(new e.Streaming)})})}return J.decompress(e,e.length)}async function Je(e){return new Promise((t,n)=>{N.brotliDecompress(e,(e,r)=>{e?n(e):t(r)})})}async function Ye(e){return new Promise((t,n)=>{N.gunzip(e,(e,r)=>{e?n(e):t(r)})})}async function Xe(e){return new Promise((t,n)=>{N.inflate(e,(e,r)=>{e?n(e):t(r)})})}const Ze=new Intl.DateTimeFormat(`en-US`,{year:`numeric`,month:`numeric`,day:`numeric`,hour:`numeric`,minute:`numeric`,second:`numeric`,hour12:!1});function Qe(e,t,n){let{query:i}=V(e.url),a=e.method.toUpperCase(),o=(e.headers[`content-type`]||``).split(`;`)[0].trim();return o.startsWith(`multipart/form-data`)&&c(n)&&(n={...n},u(n).forEach(e=>{let t=n[e];c(t)&&r(t,`filepath`)&&r(t,`mimetype`)&&delete n[e]})),M.isBuffer(n)&&(n=n.toString(),o=`buffer`),{method:a,pathname:t,query:i,bodyType:o,body:n}}async function $e(e,t){let n=e.statusCode||200,r=e.statusMessage||`OK`,i={};for(let[t,n]of Object.entries(e.headers)){let e=t.toLowerCase();n!==void 0&&!Ge.includes(e)&&(i[t]=String(n))}let a=ae(i[`content-type`]||``);if(a){let{body:e,encoding:n}=await Ke(t,i[`content-encoding`]||``);t=M.from(e),i[`content-encoding`]=n}return{status:n,statusText:r,headers:i,body:t.toString(a?`utf-8`:`base64`)}}function et(e,t){if(e.pathname!==t.pathname||e.method!==t.method||e.bodyType!==t.bodyType||!n(e.query,t.query))return!1;if(t.bodyType===`buffer`&&e.bodyType===`buffer`){let n=M.from(t.body),r=M.from(e.body);if(n.length!==r.length||!n.equals(r))return!1}return!!n(e.body,t.body)}function tt(e){if(s(e))return e;let{mode:t=`glob`}=e,n=g(e.include),r=g(e.exclude);if(t===`glob`){let{isMatch:e}=L(n,r);return t=>e(t.pathname)}return e=>n.some(t=>B(t,e.pathname))&&r.every(t=>!B(t,e.pathname))}function nt(e,t){return C.join(t,`${l(e)}.json`)}const Y=new Map;async function rt(e){if(Y.has(e))return Y.get(e);try{if(!E.existsSync(e))return[];let t=await E.promises.readFile(e,`utf-8`)||`[]`,n=JSON.parse(t);return Y.set(e,n),n}catch(t){return console.error(`Error reading record file ${e}:`,t),[]}}async function it(e,t){try{Y.set(e,t),await E.promises.mkdir(C.dirname(e),{recursive:!0}),await E.promises.writeFile(e,JSON.stringify(t,null,2),`utf-8`)}catch(t){console.error(`Error writing record file ${e}:`,t)}}const X=new WeakMap;function at(e,t,n){X.set(e,{body:n,pathname:t,timestamp:Date.now()})}var ot=class{options;filter;constructor(e){this.options=e,this.filter=tt(e.filter)}setup(e){let t=this.options;if(!e.server||!t.enabled)return;let n=this.record.bind(this),r=e.server.proxy||{};u(r).forEach(e=>{let t=r[e],i=typeof t==`string`?{target:t}:t;if(i.ws)return;let{configure:a,...o}=i;r[e]={...o,configure(e,t){a?.call(this,e,t),e.on(`proxyRes`,(e,t)=>{let r=[];e.on(`data`,e=>e&&r.push(e)),e.on(`end`,()=>{n(t,e,M.concat(r)),r=null})})}}}),this.addGitignore()}async record(e,t,n){if(!X.has(e))return;let{body:r,pathname:i,timestamp:a}=X.get(e);if(X.delete(e),!i)return;let o=Qe(e,i,r);if(!this.filter(o))return;let{cwd:s,dir:c,status:l,expires:u,overwrite:d}=this.options;if(l.length!==0&&!l.includes(t.statusCode||200))return;let f={meta:{timestamp:a,filepath:``,createAt:Ze.format(a),referer:e.headers.referer||`unknown`},req:o,res:await $e(t,n)},p=nt(i,c);f.meta.filepath=p;let m=C.join(s,p),h=(await rt(m)).filter(e=>a-e.meta.timestamp<=u),g=h.findIndex(e=>et(e.req,f.req)&&e.res.status===f.res.status);g===-1?h.push(f):(d||a-h[g].meta.timestamp>u)&&(h[g]=f),await it(m,h)}async addGitignore(){let e=this.options;if(!e.gitignore)return;let t=C.join(e.cwd,e.dir);await E.promises.mkdir(t,{recursive:!0}),E.existsSync(C.join(t,`.gitignore`))||await E.promises.writeFile(C.join(t,`.gitignore`),`*
2
+ `,`utf-8`)}};async function st(e,t,n,r){let i=Qe(e,t,n),a=C.join(r.cwd,nt(i.pathname,r.dir)),o=Date.now(),s=await rt(a),c=s.filter(e=>o-e.meta.timestamp<r.expires&&et(e.req,i)),l;if(l=r.status.length===0?c.find(e=>e.res.status===200)||s[0]:c.find(e=>r.status.includes(e.res.status)),l){let e=ae(l.res.headers[`content-type`]||``);return{url:l.req.pathname,status:l.res.status,statusText:l.res.statusText,headers:l.res.headers,body:M.from(l.res.body,e?`utf-8`:`base64`),type:`buffer`,__filepath__:l.meta.filepath}}}const Z=new WeakMap;function ct(e){let t=[];e.addListener(`data`,e=>{t?.push(M.from(e))}),e.addListener(`end`,()=>{t?.length&&Z.set(e,M.concat(t)),t=null})}function lt(e){if(!e.server)return;let t=e.server.proxy||{};u(t).forEach(e=>{let n=t[e],r=typeof n==`string`?{target:n}:n;if(r.ws)return;let{configure:i,...a}=r;t[e]={...a,configure(e,t){i?.(e,t),e.on(`proxyReq`,(e,t)=>{let n=Z.get(t);n&&(Z.delete(t),e.headersSent||e.setHeader(`Content-Length`,n.byteLength),e.writableEnded||e.write(n))})}}})}function ut(e){return P[e]||`Unknown`}function Q(e,t=200,n){e.statusCode=t,e.statusMessage=n||ut(t)}async function dt(e,n,r,i){let{headers:a,type:o=`json`}=r,c=r.__filepath__,l=F.contentType(o)||F.contentType(F.lookup(o)||``);if(l&&n.setHeader(`Content-Type`,l),n.setHeader(`Cache-Control`,`no-cache,max-age=0`),n.setHeader(`X-Mock-Power-By`,`vite-plugin-mock-dev-server`),c&&n.setHeader(`X-File-Path`,c),!a)return;let[d,f]=await t(async()=>s(a)?await a(e):a);if(d){i.error(`${O.red(`mock error at ${e.url.split(`?`)[0]}`)}\n${d}\n at headers (${O.underline(c)})`,r.log);return}u(f).forEach(e=>n.setHeader(e,f[e]))}async function ft(e,n,r,a){let{cookies:o}=r;if(!o)return;let[c,l]=await t(async()=>s(o)?await o(e):o);if(c){let t=r.__filepath__;a.error(`${O.red(`mock error at ${e.url.split(`?`)[0]}`)}\n${c}\n at cookies (${O.underline(t)})`,r.log);return}u(l).forEach(e=>{let t=l[e],[r,a]=i(t)?t:[t];n.setCookie(e,r,a)})}function pt(e,t,n){if(re(t))t.pipe(e);else if(M.isBuffer(t))e.end(n===`text`||n===`json`?t.toString(`utf-8`):t);else{let r=typeof t==`string`?t:JSON.stringify(t);e.end(n===`buffer`?M.from(r):r)}}async function mt(e,t){if(!t||typeof t==`number`&&t<=0||i(t)&&t.length!==2)return;let n=0;if(i(t)){let[e,r]=t;n=f(e,r)}else n=t-(h()-e);n>0&&await p(n)}function ht(e,{formidableOptions:n={},bodyParserOptions:r={},proxies:i,cookiesOptions:a,logger:o,priority:c={},cors:l,record:u,replay:d}){let f=_e(l);return async function(l,p,m){let g=h(),{query:_,pathname:v}=V(l.url);if(!v||i.length===0||!i.some(e=>te(e,l.url)))return m();let y=e.mockData,b=Oe(Object.keys(y),v,c);if(b.length===0&&!u.enabled)return m();ct(l);let x=new Ve(l,p,a),S,C,w=l.method.toUpperCase(),T={query:_,refererQuery:V(l.headers.referer||``).query,body:await ve(l,o,n,r),headers:l.headers,getCookie:x.get.bind(x)};for(let e of b)if(S=we(y[e],o,{pathname:v,method:w,request:T}),S){C=e;break}if(d&&!S&&(S=await st(l,v,T.body,u)),!S){u.enabled&&at(l,v,T.body);let e=b.map(e=>e===C?O.underline.bold(e):O.dim(e)).join(`, `);return e.length&&o.warn(`${O.green(v)} matches ${e}, but mock data is not found.`),m()}if(f){let[e]=await t(f,l,p);if(e)return o.error(`CORS error: ${e}`),m(e)}let E=l,D=p;Object.assign(E,T),E.params=H(S.url,v),D.setCookie=x.set.bind(x);let{delay:k,type:ee=`json`,response:A,log:j,error:M,__filepath__:N}=S,{body:P,status:F=200,statusText:I}=S,L=M&&(M.probability??.5)>Math.random();if(L&&(F=M.status??500,I=M.statusText,P=M.body),Q(D,F,I),await dt(E,D,S,o),await ft(E,D,S,o),o.info(Ce(E,N,L),j),o.debug(`${O.magenta(`DEBUG`)} ${O.underline(v)} matches: [ ${b.map(e=>e===C?O.underline.bold(e):O.dim(e)).join(`, `)} ]\n`),P){let[e]=await t(async()=>{let e=s(P)?await P(E):P;await mt(g,k),pt(D,e,ee)});e&&(o.error(`${O.red(`mock error at ${v}`)}\n${e}\n at body (${O.underline(N)})`,j),Q(D,500),p.end(``));return}if(A){let[e]=await t(async()=>{await mt(g,k),await A(E,D,m)});e&&(o.error(`${O.red(`mock error at ${v}`)}\n${e}\n at response (${O.underline(N)})`,j),Q(D,500),p.end(``));return}p.end(``)}}function gt(e,t,{wsProxies:n,cookiesOptions:r,logger:i}){let a=new Map,o=new Map,s=new WeakMap,c=e=>{let t=o.get(e);return t||o.set(e,t=new Map),t},l=(e,t)=>{let n=e.get(t);return n||e.set(t,n=new I({noServer:!0})),n},u=(e,t)=>{let n=a.get(e);n||a.set(e,n=new Set),n.add(t)},d=(e,t,n,r,a,o)=>{try{n.setup?.(t,r),t.on(`close`,()=>e.delete(a)),t.on(`error`,e=>{i.error(`${O.red(`WebSocket mock error at ${t.path}`)}\n${e}\n at setup (${o})`,n.log)})}catch(e){i.error(`${O.red(`WebSocket mock error at ${t.path}`)}\n${e}\n at setup (${o})`,n.log)}},f=(e,t,n,r)=>{e.emit(`connection`,t,n),t.on(`close`,()=>{let e=r.findIndex(e=>e.ws===t);e!==-1&&r.splice(e,1)})},p=(e,t,n,r,i)=>{let{cleanupList:a,connectionList:o,context:c}=s.get(t);_t(a),o.forEach(({ws:e})=>e.removeAllListeners()),t.removeAllListeners(),d(e,t,n,c,r,i),o.forEach(({ws:e,req:n})=>f(t,e,n,o))};e.on?.(`mock:update-end`,t=>{if(!a.has(t))return;let n=a.get(t);if(n)for(let r of n.values())for(let n of e.mockData[r]){if(!n.ws||n.__filepath__!==t)return;let e=c(r);for(let[r,i]of e.entries())p(e,i,n,r,t)}}),t?.on(`upgrade`,(t,a,o)=>{let{pathname:p,query:m}=V(t.url);if(!p||n.length===0||!n.some(e=>te(e,t.url)))return;let h=e.mockData,g=Object.keys(h).find(e=>B(e,p));if(!g)return;let _=h[g].find(e=>e.url&&e.ws&&B(e.url,p));if(!_)return;let v=_.__filepath__;u(v,g);let y=c(g),b=l(y,p),x=s.get(b);if(!x){let e=[],t={onCleanup:t=>e.push(t)};x={cleanupList:e,context:t,connectionList:[]},s.set(b,x),d(y,b,_,t,p,v)}let S=t,C=new Ve(t,t,r),{query:w}=V(t.headers.referer||``);S.query=m,S.refererQuery=w,S.params=H(g,p),S.getCookie=C.get.bind(C),b.handleUpgrade(S,a,o,e=>{i.info(`${O.magenta.bold(`WebSocket`)} ${O.green(t.url)} connected ${O.dim(`(${v})`)}`,_.log),x.connectionList.push({req:S,ws:e}),f(b,e,S,x.connectionList)})}),t?.on(`close`,()=>{for(let e of o.values()){for(let t of e.values())_t(s.get(t).cleanupList),t.close();e.clear()}o.clear(),a.clear()})}function _t(e){let t;for(;t=e.shift();)t?.()}const $={silent:0,error:1,warn:2,info:3,debug:4};function vt(e,t=`info`){e=`[${e}]`;function n(n,r,i){if(i=a(i)?i?t:`error`:i,$[i]>=$[n]){let t=n===`info`||n===`debug`?`log`:n,i=n===`debug`?O.magenta.bold(e):n===`info`?O.cyan.bold(e):n===`warn`?O.yellow.bold(e):O.red.bold(e),a=`${O.dim(new Date().toLocaleTimeString())} ${i} ${r}`;console[t](a)}}return{debug(e,r=t){n(`debug`,e,r)},info(e,r=t){n(`info`,e,r)},warn(e,r=t){n(`warn`,e,r)},error(e,r=t){n(`error`,e,r)}}}export{lt as a,pe as c,fe as d,ie as f,ht as i,he as l,$ as n,ot as o,L as p,gt as r,me as s,vt as t,ce as u};
@@ -0,0 +1,3 @@
1
+ import "./config-7dnQWJSY.js";
2
+ import { a as processRawData, c as Logger, i as processMockData, l as createLogger, n as CreateMockMiddlewareOptions, o as sortByValidator, r as createMockMiddleware, t as mockWebSocket, u as logLevels } from "./index-x4QPVyiP.js";
3
+ export { CreateMockMiddlewareOptions, Logger, createLogger, createMockMiddleware, logLevels, mockWebSocket, processMockData, processRawData, sortByValidator };
package/dist/server.js ADDED
@@ -0,0 +1 @@
1
+ import{c as e,i as t,l as n,n as r,r as i,s as a,t as o}from"./logger-C-7qpBNh.js";export{o as createLogger,t as createMockMiddleware,r as logLevels,i as mockWebSocket,a as processMockData,e as processRawData,n as sortByValidator};
@@ -0,0 +1,7 @@
1
+ import { C as MockResponse, D as SetCookieOption, E as GetCookieOption, S as MockRequest, T as CookiesOption, _ as RecordedRes, a as MockHttpItem, b as Headers, c as LogType, d as MockServerPluginOptions, f as ServerBuildOption, g as RecordedRequest, h as RecordedReq, i as MockErrorConfig, l as MockMatchPriority, m as RecordedMeta, n as MockWebsocketItem, o as BodyParserOptions, p as RecordOptions, r as WebSocketSetupContext, s as LogLevel, t as MockOptions, u as MockMatchSpecialPriority, v as ResolvedRecordOptions, w as ResponseBody, x as Method, y as ExtraRequest } from "./config-7dnQWJSY.js";
2
+ import formidable from "formidable";
3
+
4
+ //#region src/types/index.d.ts
5
+ type FormidableFile = formidable.File | formidable.File[];
6
+ //#endregion
7
+ export { BodyParserOptions, CookiesOption, ExtraRequest, FormidableFile, GetCookieOption, Headers, LogLevel, LogType, Method, MockErrorConfig, MockHttpItem, MockMatchPriority, MockMatchSpecialPriority, MockOptions, MockRequest, MockResponse, MockServerPluginOptions, MockWebsocketItem, RecordOptions, RecordedMeta, RecordedReq, RecordedRequest, RecordedRes, ResolvedRecordOptions, ResponseBody, ServerBuildOption, SetCookieOption, WebSocketSetupContext };
package/dist/types.js ADDED
@@ -0,0 +1 @@
1
+ export{};
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "vite-plugin-mock-dev-server",
3
3
  "type": "module",
4
- "version": "2.0.6",
4
+ "version": "2.1.0",
5
+ "description": "Vite Plugin for API mock dev server.",
5
6
  "author": "pengzhanbo <q942450674@outlook.com> (https://github.com/pengzhanbo)",
6
7
  "license": "MIT",
7
8
  "homepage": "https://vite-plugin-mock-dev-server.netlify.app",
@@ -19,37 +20,37 @@
19
20
  ],
20
21
  "exports": {
21
22
  ".": {
22
- "import": {
23
- "types": "./dist/index.d.mts",
24
- "default": "./dist/index.mjs"
25
- }
23
+ "types": "./dist/index.d.ts",
24
+ "import": "./dist/index.js"
26
25
  },
27
26
  "./helper": {
28
- "import": {
29
- "types": "./dist/helper.d.mts",
30
- "default": "./dist/helper.mjs"
31
- }
27
+ "types": "./dist/helper.d.ts",
28
+ "import": "./dist/helper.js"
32
29
  },
33
30
  "./server": {
34
- "import": {
35
- "types": "./dist/server.d.mts",
36
- "default": "./dist/server.mjs"
37
- }
31
+ "types": "./dist/server.d.ts",
32
+ "import": "./dist/server.js"
33
+ },
34
+ "./types": {
35
+ "types": "./dist/types.d.ts",
36
+ "import": "./dist/types.js"
38
37
  },
39
38
  "./package.json": "./package.json"
40
39
  },
41
- "main": "dist/index.mjs",
42
- "types": "dist/index.d.mts",
40
+ "main": "dist/index.js",
41
+ "module": "dist/index.js",
42
+ "types": "dist/index.d.ts",
43
43
  "files": [
44
44
  "dist"
45
45
  ],
46
46
  "engines": {
47
- "node": "^18 || ^20 || >=22"
47
+ "node": "^20 || >=22"
48
48
  },
49
49
  "peerDependencies": {
50
50
  "esbuild": ">=0.21.0",
51
- "rolldown": ">=1.0.0-beta.34",
52
- "vite": ">=4.0.0"
51
+ "rolldown": ">=1.0.0-beta.1",
52
+ "vite": ">=5.0.0",
53
+ "zstd-codec": ">=0.1.5"
53
54
  },
54
55
  "peerDependenciesMeta": {
55
56
  "esbuild": {
@@ -57,14 +58,17 @@
57
58
  },
58
59
  "rolldown": {
59
60
  "optional": true
61
+ },
62
+ "zstd-codec": {
63
+ "optional": true
60
64
  }
61
65
  },
62
66
  "dependencies": {
63
- "@pengzhanbo/utils": "^2.1.2",
67
+ "@pengzhanbo/utils": "^3.3.1",
64
68
  "ansis": "^4.2.0",
65
- "chokidar": "^4.0.3",
69
+ "chokidar": "^5.0.0",
66
70
  "co-body": "^6.2.0",
67
- "cors": "^2.8.5",
71
+ "cors": "^2.8.6",
68
72
  "debug": "^4.4.3",
69
73
  "formidable": "3.5.4",
70
74
  "http-status": "^2.1.0",
@@ -75,12 +79,13 @@
75
79
  "path-to-regexp": "^8.3.0",
76
80
  "picomatch": "^4.0.3",
77
81
  "tinyglobby": "^0.2.15",
78
- "ws": "^8.18.3"
82
+ "ws": "^8.19.0"
79
83
  },
80
84
  "devDependencies": {
81
- "esbuild": "^0.27.0",
82
- "rolldown": "^1.0.0-beta.51",
83
- "vite": "npm:rolldown-vite@latest"
85
+ "esbuild": "^0.27.3",
86
+ "rolldown": "^1.0.0-rc.6",
87
+ "vite": "^8.0.0-beta.16",
88
+ "zstd-codec": "^0.1.5"
84
89
  },
85
90
  "publishConfig": {
86
91
  "access": "public",
@@ -1,176 +0,0 @@
1
- import { deepClone, deepEqual, isArray, isFunction } from "@pengzhanbo/utils";
2
- import { Transform } from "node:stream";
3
-
4
- //#region src/helper/createSSEStream.ts
5
- /**
6
- * Transforms "messages" to W3C event stream content.
7
- * See https://html.spec.whatwg.org/multipage/server-sent-events.html
8
- * A message is an object with one or more of the following properties:
9
- * - data (String or object, which gets turned into JSON)
10
- * - event
11
- * - id
12
- * - retry
13
- * - comment
14
- *
15
- * If constructed with a HTTP Request, it will optimise the socket for streaming.
16
- * If this stream is piped to an HTTP Response, it will set appropriate headers.
17
- */
18
- var SSEStream = class extends Transform {
19
- constructor(req) {
20
- super({ objectMode: true });
21
- req.socket.setKeepAlive(true);
22
- req.socket.setNoDelay(true);
23
- req.socket.setTimeout(0);
24
- }
25
- pipe(destination, options) {
26
- if (destination.writeHead) {
27
- destination.writeHead(200, {
28
- "Content-Type": "text/event-stream; charset=utf-8",
29
- "Transfer-Encoding": "identity",
30
- "Cache-Control": "no-cache",
31
- "Connection": "keep-alive"
32
- });
33
- destination.flushHeaders?.();
34
- }
35
- destination.write(":ok\n\n");
36
- return super.pipe(destination, options);
37
- }
38
- _transform(message, encoding, callback) {
39
- if (message.comment) this.push(`: ${message.comment}\n`);
40
- if (message.event) this.push(`event: ${message.event}\n`);
41
- if (message.id) this.push(`id: ${message.id}\n`);
42
- if (message.retry) this.push(`retry: ${message.retry}\n`);
43
- if (message.data) this.push(dataString(message.data));
44
- this.push("\n");
45
- callback();
46
- }
47
- write(message, ...args) {
48
- return super.write(message, ...args);
49
- }
50
- destroy(error) {
51
- if (error) this.write({
52
- event: "error",
53
- data: error.message
54
- });
55
- this.end();
56
- return this;
57
- }
58
- };
59
- function dataString(data) {
60
- if (typeof data === "object") return dataString(JSON.stringify(data));
61
- return data.split(/\r\n|\r|\n/).map((line) => `data: ${line}\n`).join("");
62
- }
63
- /**
64
- * 创建一个 Server-sent events 写入流,用于支持模拟 EventSource
65
- *
66
- * @example
67
- * ```ts
68
- * import { createSSEStream, defineMock } from 'vite-plugin-mock-dev-server'
69
- *
70
- * export default defineMock({
71
- * url: '/api',
72
- * response: (req, res) => {
73
- * const sse = createSSEStream(req, res)
74
- * sse.write({ event: 'message', data: { message: 'hello world' } })
75
- * }
76
- * })
77
- * ```
78
- */
79
- function createSSEStream(req, res) {
80
- const sse = new SSEStream(req);
81
- sse.pipe(res);
82
- return sse;
83
- }
84
-
85
- //#endregion
86
- //#region src/helper/defineMock.ts
87
- function defineMock(config) {
88
- return config;
89
- }
90
- /**
91
- * Return a custom defineMock function to support preprocessing of mock config.
92
- *
93
- * 返回一个自定义的 defineMock 函数,用于支持对 mock config 的预处理。
94
- * @param transformer preprocessing function
95
- * @example
96
- * ```ts
97
- * const definePostMock = createDefineMock((mock) => {
98
- * mock.url = '/api/post/' + mock.url
99
- * })
100
- * export default definePostMock({
101
- * url: 'list',
102
- * body: [{ title: '1' }, { title: '2' }],
103
- * })
104
- * ```
105
- */
106
- function createDefineMock(transformer) {
107
- const define = (config) => {
108
- if (isArray(config)) config = config.map((item) => transformer(item) || item);
109
- else config = transformer(config) || config;
110
- return config;
111
- };
112
- return define;
113
- }
114
-
115
- //#endregion
116
- //#region src/helper/defineMockData.ts
117
- /**
118
- * 由于插件是 分别独立对 `*.mock.*` 等文件作为单独入口进行编译的,
119
- * 这导致了 mock 文件编译后的依赖关系不一致,每个 mock 文件拥有独立的作用域,
120
- * 使得即使多个 `*.mock.*` 虽然引入了同一个 `data.ts` 文件,然而确是完全不同两份 `data`,
121
- * 使得对 `data` 的操作,在不同的 `*.mock.*` 文件中并不能共享。
122
- *
123
- * 为此,插件提供了一种基于 memory 的数据共享机制。
124
- */
125
- const mockDataCache = /* @__PURE__ */ new Map();
126
- const responseCache = /* @__PURE__ */ new WeakMap();
127
- const staleInterval = 70;
128
- var CacheImpl = class {
129
- value;
130
- #initialValue;
131
- #lastUpdate;
132
- constructor(value) {
133
- this.value = value;
134
- this.#initialValue = deepClone(value);
135
- this.#lastUpdate = Date.now();
136
- }
137
- hotUpdate(value) {
138
- if (Date.now() - this.#lastUpdate < staleInterval) return;
139
- if (!deepEqual(value, this.#initialValue)) {
140
- this.value = value;
141
- this.#initialValue = deepClone(value);
142
- this.#lastUpdate = Date.now();
143
- }
144
- }
145
- };
146
- function defineMockData(key, initialData) {
147
- let cache = mockDataCache.get(key);
148
- if (!cache) {
149
- const newCache = new CacheImpl(initialData);
150
- const existing = mockDataCache.get(key);
151
- if (existing) cache = existing;
152
- else {
153
- mockDataCache.set(key, newCache);
154
- cache = newCache;
155
- }
156
- }
157
- cache.hotUpdate(initialData);
158
- if (responseCache.has(cache)) return responseCache.get(cache);
159
- const res = [() => cache.value, (val) => {
160
- if (isFunction(val)) val = val(cache.value) ?? cache.value;
161
- cache.value = val;
162
- }];
163
- Object.defineProperty(res, "value", {
164
- get() {
165
- return cache.value;
166
- },
167
- set(val) {
168
- cache.value = val;
169
- }
170
- });
171
- responseCache.set(cache, res);
172
- return res;
173
- }
174
-
175
- //#endregion
176
- export { createSSEStream as i, createDefineMock as n, defineMock as r, defineMockData as t };
package/dist/helper.d.mts DELETED
@@ -1,3 +0,0 @@
1
- import { _ as WebSocketSetupContext, a as LogType, c as MockMatchPriority, d as MockRequest, f as MockResponse, g as ServerBuildOption, h as ResponseBody, i as LogLevel, l as MockMatchSpecialPriority, m as MockWebsocketItem, n as ExtraRequest, o as Method, p as MockServerPluginOptions, r as FormidableFile, s as MockHttpItem, t as BodyParserOptions, u as MockOptions } from "./types-DF6NPJx4.mjs";
2
- import { a as HeaderStream, i as defineMock, n as defineMockData, o as SSEMessage, r as createDefineMock, s as createSSEStream, t as MockData } from "./index-u_3ZZqGO.mjs";
3
- export { BodyParserOptions, ExtraRequest, FormidableFile, HeaderStream, LogLevel, LogType, Method, MockData, MockHttpItem, MockMatchPriority, MockMatchSpecialPriority, MockOptions, MockRequest, MockResponse, MockServerPluginOptions, MockWebsocketItem, ResponseBody, SSEMessage, ServerBuildOption, WebSocketSetupContext, createDefineMock, createSSEStream, defineMock, defineMockData };
package/dist/helper.mjs DELETED
@@ -1,3 +0,0 @@
1
- import { i as createSSEStream, n as createDefineMock, r as defineMock, t as defineMockData } from "./helper-ChmPhNrY.mjs";
2
-
3
- export { createDefineMock, createSSEStream, defineMock, defineMockData };
@@ -1,126 +0,0 @@
1
- import { m as MockWebsocketItem, s as MockHttpItem, u as MockOptions } from "./types-DF6NPJx4.mjs";
2
- import { IncomingMessage, OutgoingHttpHeaders, ServerResponse } from "node:http";
3
- import { Transform } from "node:stream";
4
-
5
- //#region src/helper/createSSEStream.d.ts
6
- interface SSEMessage {
7
- data?: string | object;
8
- comment?: string;
9
- event?: string;
10
- id?: string;
11
- retry?: number;
12
- }
13
- interface WriteHeaders {
14
- writeHead?: (statusCode: number, headers?: OutgoingHttpHeaders) => WriteHeaders;
15
- flushHeaders?: () => void;
16
- }
17
- type HeaderStream = NodeJS.WritableStream & WriteHeaders;
18
- /**
19
- * Transforms "messages" to W3C event stream content.
20
- * See https://html.spec.whatwg.org/multipage/server-sent-events.html
21
- * A message is an object with one or more of the following properties:
22
- * - data (String or object, which gets turned into JSON)
23
- * - event
24
- * - id
25
- * - retry
26
- * - comment
27
- *
28
- * If constructed with a HTTP Request, it will optimise the socket for streaming.
29
- * If this stream is piped to an HTTP Response, it will set appropriate headers.
30
- */
31
- declare class SSEStream extends Transform {
32
- constructor(req: IncomingMessage);
33
- pipe<T extends HeaderStream>(destination: T, options?: {
34
- end?: boolean;
35
- }): T;
36
- _transform(message: SSEMessage, encoding: string, callback: (error?: (Error | null), data?: any) => void): void;
37
- write(message: SSEMessage, encoding?: BufferEncoding, cb?: (error: Error | null | undefined) => void): boolean;
38
- write(message: SSEMessage, cb?: (error: Error | null | undefined) => void): boolean;
39
- destroy(error?: Error): this;
40
- }
41
- /**
42
- * 创建一个 Server-sent events 写入流,用于支持模拟 EventSource
43
- *
44
- * @example
45
- * ```ts
46
- * import { createSSEStream, defineMock } from 'vite-plugin-mock-dev-server'
47
- *
48
- * export default defineMock({
49
- * url: '/api',
50
- * response: (req, res) => {
51
- * const sse = createSSEStream(req, res)
52
- * sse.write({ event: 'message', data: { message: 'hello world' } })
53
- * }
54
- * })
55
- * ```
56
- */
57
- declare function createSSEStream(req: IncomingMessage, res: ServerResponse): SSEStream;
58
- //#endregion
59
- //#region src/helper/defineMock.d.ts
60
- /**
61
- * mock config Type helper
62
- *
63
- * mock配置 类型帮助函数
64
- * @param config see config docs:
65
- * {@link https://vite-plugin-mock-dev-server.netlify.app/guide/mock-config en-US DOC} |
66
- * {@link https://vite-plugin-mock-dev-server.netlify.app/zh/guide/mock-config zh-CN DOC}
67
- *
68
- * @example
69
- * Mock Http Request
70
- * ```ts
71
- * export default defineMock({
72
- * url: '/api/example',
73
- * method: ['GET', 'POST'],
74
- * body: { a: 1 },
75
- * })
76
- * ```
77
- * ```ts
78
- * export default defineMock({
79
- * url: '/api/example',
80
- * method: 'GET',
81
- * body: ({ query }) => ({ a: 1, b: query.b }),
82
- * })
83
- * ```
84
- * @example
85
- * Mock WebSocket
86
- * ```ts
87
- * export default defineMock({
88
- * url: '/socket.io',
89
- * ws: true,
90
- * setup(wss) {
91
- * wss.on('connection', (ws) => {
92
- * ws.on('message', (rawData) => console.log(rawData))
93
- * ws.send('data')
94
- * })
95
- * },
96
- * })
97
- * ```
98
- */
99
- declare function defineMock(config: MockHttpItem): MockHttpItem;
100
- declare function defineMock(config: MockWebsocketItem): MockWebsocketItem;
101
- declare function defineMock(config: MockOptions): MockOptions;
102
- /**
103
- * Return a custom defineMock function to support preprocessing of mock config.
104
- *
105
- * 返回一个自定义的 defineMock 函数,用于支持对 mock config 的预处理。
106
- * @param transformer preprocessing function
107
- * @example
108
- * ```ts
109
- * const definePostMock = createDefineMock((mock) => {
110
- * mock.url = '/api/post/' + mock.url
111
- * })
112
- * export default definePostMock({
113
- * url: 'list',
114
- * body: [{ title: '1' }, { title: '2' }],
115
- * })
116
- * ```
117
- */
118
- declare function createDefineMock(transformer: (mock: MockHttpItem | MockWebsocketItem) => MockHttpItem | MockWebsocketItem | void): typeof defineMock;
119
- //#endregion
120
- //#region src/helper/defineMockData.d.ts
121
- type MockData<T = any> = readonly [() => T, (val: T | ((val: T) => T | void)) => void] & {
122
- value: T;
123
- };
124
- declare function defineMockData<T = any>(key: string, initialData: T): MockData<T>;
125
- //#endregion
126
- export { HeaderStream as a, defineMock as i, defineMockData as n, SSEMessage as o, createDefineMock as r, createSSEStream as s, MockData as t };
package/dist/index.d.mts DELETED
@@ -1,9 +0,0 @@
1
- import { _ as WebSocketSetupContext, a as LogType, c as MockMatchPriority, d as MockRequest, f as MockResponse, g as ServerBuildOption, h as ResponseBody, i as LogLevel, l as MockMatchSpecialPriority, m as MockWebsocketItem, n as ExtraRequest, o as Method, p as MockServerPluginOptions, r as FormidableFile, s as MockHttpItem, t as BodyParserOptions, u as MockOptions } from "./types-DF6NPJx4.mjs";
2
- import { a as HeaderStream, i as defineMock, n as defineMockData, o as SSEMessage, r as createDefineMock, s as createSSEStream, t as MockData } from "./index-u_3ZZqGO.mjs";
3
- import { a as createLogger, c as processRawData, i as Logger, l as sortByValidator, n as CreateMockMiddlewareOptions, o as logLevels, r as createMockMiddleware, s as processMockData, t as mockWebSocket } from "./server-CvrNrvvb.mjs";
4
- import { Plugin } from "vite";
5
-
6
- //#region src/plugin.d.ts
7
- declare function mockDevServerPlugin(options?: MockServerPluginOptions): Plugin[];
8
- //#endregion
9
- export { BodyParserOptions, CreateMockMiddlewareOptions, ExtraRequest, type FormidableFile, HeaderStream, LogLevel, LogType, Logger, Method, MockData, type MockHttpItem, MockMatchPriority, MockMatchSpecialPriority, type MockOptions, type MockRequest, MockResponse, type MockServerPluginOptions, type MockWebsocketItem, ResponseBody, SSEMessage, ServerBuildOption, WebSocketSetupContext, createDefineMock, createLogger, createMockMiddleware, createSSEStream, defineMock, defineMockData, logLevels, mockDevServerPlugin, mockWebSocket, processMockData, processRawData, sortByValidator };