vite-plugin-mock-dev-server 2.1.1 → 2.1.2
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/dist/index.js +3 -3
- package/dist/server-B6gUVmAa.js +2 -0
- package/dist/server.js +1 -1
- package/package.json +7 -7
- package/dist/server-DnEpYtlk.js +0 -2
package/dist/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import{a as e,c as t,d as n,f as r,i,l as a,n as o,o as s,p as c,r as l,s as u,t as d,u as f}from"./server-
|
|
1
|
+
import{a as e,c as t,d as n,f as r,i,l as a,n as o,o as s,p as c,r as l,s as u,t as d,u as f}from"./server-B6gUVmAa.js";import{createDefineMock as p,createSSEStream as m,defineMock as h,defineMockData as g}from"./helper.js";import _ from"node:process";import{attempt as v,attemptAsync as y,isArray as ee,isBoolean as te,promiseParallel as b,toArray as x,uniq as ne}from"@pengzhanbo/utils";import S from"node:path";import{pathToFileURL as C}from"node:url";import w from"node:fs/promises";import T from"json5";import{createHash as E}from"node:crypto";import D,{promises as O}from"node:fs";import k from"node:events";import{watch as A}from"chokidar";import{getPackageInfoSync as j,loadPackageJSON as M,loadPackageJSONSync as re}from"local-pkg";import{glob as N}from"tinyglobby";import P from"ansis";import ie from"is-core-module";function ae(e){let t={},n=_.env.NODE_ENV||e.mode;Object.assign(t,{"process.env.NODE_ENV":JSON.stringify(n),"global.process.env.NODE_ENV":JSON.stringify(n),"globalThis.process.env.NODE_ENV":JSON.stringify(n)});let r={},i={};for(let t in e.define){let n=e.define[t],a=t.startsWith(`import.meta.env.`);typeof n==`string`?se(n)&&(r[t]=n,a&&(i[t.slice(16)]=n)):(r[t]=F(n),a&&(i[t.slice(16)]=n))}let a={},o={},s={};a[`import.meta.hot`]=`undefined`;for(let t in e.env){let n=JSON.stringify(e.env[t]);a[`import.meta.env.${t}`]=n,o[t]=n}s[`import.meta.env`]=`undefined`;let c={...t,...a,...r,...s};return`import.meta.env`in c&&(c[`import.meta.env`]=oe({...o,...i})),c}function oe(e){let t=`{`,n=Object.keys(e);for(let r=0;r<n.length;r++){let i=n[r],a=e[i];t+=`${JSON.stringify(i)}: ${F(a)}`,r!==n.length-1&&(t+=`, `)}return`${t}}`}function F(e){return e===void 0?`undefined`:typeof e==`string`?e:JSON.stringify(e)}function se(e){try{return JSON.parse(e),!0}catch{return!1}}const ce={name:`externalize-deps`,setup(e){e.onResolve({filter:/.*/},({path:e})=>{if(e[0]!==`.`&&!S.isAbsolute(e))return{external:!0}})}},I={name:`json5-loader`,setup(e){e.onLoad({filter:/\.json5$/},async({path:e})=>{let t=await w.readFile(e,`utf-8`);return{contents:`export default ${JSON.stringify(T.parse(t))}`,loader:`js`}})}},L={name:`json-loader`,setup(e){e.onLoad({filter:/\.json$/},async({path:e})=>({contents:`export default ${await w.readFile(e,`utf-8`)}`,loader:`js`}))}},R={name:`rename-plugin`,setup(e){e.onResolve({filter:/.*/},({path:e})=>e===`vite-plugin-mock-dev-server`?{path:`vite-plugin-mock-dev-server/helper`,external:!0}:null)}};function z(e){return{name:`alias-plugin`,setup(t){t.onResolve({filter:/.*/},async({path:n})=>{let r=e.find(({find:e})=>B(e,n));if(!r)return null;let{find:i,replacement:a}=r;return{path:(await t.resolve(n.replace(i,a),{kind:`import-statement`,resolveDir:a,namespace:`file`})).path,external:!1}})}}}function B(e,t){return e instanceof RegExp?e.test(t):t.length<e.length?!1:t===e?!0:t.startsWith(`${e}/`)}let V=null;async function H(){return V||=(await import(`esbuild`)).build,V}async function U(e,{isESM:t=!0,define:r,alias:i,cwd:a=_.cwd()}){let o=S.resolve(a,e),s=S.basename(e),c=S.dirname(o);try{let l=await(await H())({entryPoints:[e],outfile:`out.js`,write:!1,target:[`node18`],platform:`node`,bundle:!0,metafile:!0,format:t?`esm`:`cjs`,define:{...r,__dirname:JSON.stringify(c),__filename:JSON.stringify(s),...t?{}:{"import.meta.url":JSON.stringify(C(o))}},plugins:[z(i),R,ce,L,I],absWorkingDir:a}),u=new Set,d=l.metafile?.inputs||{};return Object.keys(d).forEach(e=>d[e].imports.forEach(e=>u.add(n(e.path)))),{code:l.outputFiles[0].text,deps:Array.from(u)}}catch(e){console.error(e)}return{code:``,deps:[]}}async function W({filepath:e,code:t,isESM:n,cwd:r}){e=S.resolve(r,e);let i=n?`.mjs`:`.cjs`,a=`${e}.${le(t)}${i}`;await O.writeFile(a,t,`utf8`);let[,o]=await y(G,String(C(a)));return v(D.unlinkSync,a),o}async function G(e){let t=await import(e);return t.default||t}function le(e){return E(`md5`).update(e).digest(`hex`)}const ue={name:`vite-mock:rename-plugin`,resolveId(e){if(e===`vite-plugin-mock-dev-server`)return{id:`vite-plugin-mock-dev-server/helper`,external:!0}}},de={name:`vite-mock:json5-plugin`,transform:{filter:{id:/\.json5$/},handler:e=>({code:`export default ${T.stringify(T.parse(e))}`})}};let K=null;async function fe(){return K||={build:(await import(`rolldown`)).build,aliasPlugin:(await import(`rolldown/experimental`)).viteAliasPlugin},K}async function pe(e,{isESM:t=!0,define:r,alias:i,cwd:a=_.cwd()}){let o=S.resolve(a,e),s=S.basename(e),c=S.dirname(o),l=e=>!!i.find(({find:t})=>B(t,e));try{let{build:u,aliasPlugin:d}=await fe(),f=await u({input:e,write:!1,cwd:a,output:{format:t?`esm`:`cjs`,sourcemap:!1,file:`out.js`},platform:`node`,transform:{define:{...r,__dirname:JSON.stringify(c),__filename:JSON.stringify(s),...t?{}:{"import.meta.url":JSON.stringify(C(o))}}},external(e){if(l(e))return!1;if(e[0]!==`.`&&!S.isAbsolute(e)&&e!==`vite-plugin-mock-dev-server`)return!0},plugins:[d({entries:i}),ue,de],onLog(e,t,n){t.code===`PLUGIN_TIMINGS`&&t.message.includes(`vite-mock`)||n(e,t)}});return{code:f.output[0].code,deps:f.output[0].moduleIds.filter(e=>!e.endsWith(s)).map(e=>n(S.relative(a,e)))}}catch(e){console.error(e)}return{code:``,deps:[]}}let q;async function J(e,t){if(q??=await r(`rolldown`)?`rolldown`:await r(`esbuild`)?`esbuild`:`none`,q===`rolldown`)return pe(e,t);if(q===`esbuild`)return U(e,t);throw Error(`rolldown or esbuild not found`)}async function me(e,t){let n=!1;n=/\.m[jt]s$/.test(e)?!0:/\.c[jt]s$/.test(e)?!1:t.isESM||!1;let{code:r,deps:i}=await J(e,{...t,isESM:n});return{data:await W({filepath:e,code:r,isESM:n,cwd:t.cwd||_.cwd()})||{},deps:i}}var he=class extends k{moduleCache=new Map;moduleDeps=new Map;cwd;mockWatcher;depsWatcher;isESM=!1;_mockData={};options;constructor(e){super(),this.options=e,this.cwd=e.cwd||_.cwd();try{let e=re(this.cwd);this.isESM=e?.type===`module`}catch{}}get mockData(){return this._mockData}run(e){let{include:t,exclude:r}=this.options,{pattern:i,ignore:a,isMatch:o}=c(t,r);if(N(i,{ignore:a,cwd:S.join(this.cwd,this.options.dir)}).then(e=>e.map(e=>()=>this.load(n(S.join(this.options.dir,e))))).then(e=>b(e,64)).then(()=>this.updateMockData()),!e)return;this.watchMockEntry(o),this.watchDeps();let s=null;this.on(`mock:update`,async e=>{o(e)&&(await this.load(e),s&&clearImmediate(s),s=setImmediate(()=>{this.updateMockData(),this.emit(`mock:update-end`,n(e)),s=null}))}),this.on(`mock:unlink`,async e=>{o(e)&&(e=n(S.join(this.options.dir,e)),this.moduleCache.delete(e),this.updateMockData(),this.emit(`mock:update-end`,e))})}close(){this.mockWatcher?.close(),this.depsWatcher?.close()}async load(e){if(e)try{let{define:n,alias:r}=this.options,{data:i,deps:a}=await me(e,{cwd:this.cwd,isESM:this.isESM,define:n,alias:r});this.moduleCache.set(e,t(i,e)),this.updateModuleDeps(e,a)}catch(e){console.error(e)}}updateMockData(){this._mockData=u(this.moduleCache)}updateModuleDeps(e,t){for(let n of t)this.moduleDeps.has(n)||this.moduleDeps.set(n,new Set),this.moduleDeps.get(n).add(e);this.emit(`update:deps`)}watchMockEntry(e){let t=this.mockWatcher=A(this.options.dir,{ignoreInitial:!0,cwd:this.cwd,ignored:(t,r)=>t.includes(`node_modules`)?!0:!!r?.isFile()&&!e(n(t))});t.on(`add`,async e=>{e=n(e),this.emit(`mock:update`,e),f(`watcher:add`,e)}),t.on(`change`,async e=>{e=n(e),this.emit(`mock:update`,e),f(`watcher:change`,e)}),t.on(`unlink`,async e=>{e=n(e),this.emit(`mock:unlink`,e),f(`watcher:unlink`,e)})}watchDeps(){let e=[...this.moduleDeps.keys()],t=this.depsWatcher=A([...e],{ignoreInitial:!0,cwd:this.cwd});t.on(`change`,e=>{e=n(e),this.moduleDeps.get(e)?.forEach(e=>this.emit(`mock:update`,e))}),t.on(`unlink`,e=>{e=n(e),this.moduleDeps.delete(e)}),this.on(`update:deps`,()=>{let n=[...this.moduleDeps.keys()],r=n.filter(t=>!e.includes(t));e=n,r.length>0&&t.add(r)})}};function Y(e,t,n){let r=new he(e);r.run(!!t),r.on(`mock:update-end`,()=>{e.reload&&n?.send({type:`full-reload`})}),t?.on(`close`,()=>r.close()),l(r,t,e);let a=[];return a.push(i(r,e)),a}function X({prefix:e=[],wsPrefix:t=[],cwd:n,dir:r=`mock`,include:i=[`**/*.mock.{js,ts,cjs,mjs,json,json5}`],exclude:a=[],reload:o=!1,log:s=`info`,cors:c=!0,formidableOptions:l={},build:u=!1,cookiesOptions:f={},bodyParserOptions:p={},priority:m={},record:h=!1,replay:g},v){let y=n||_.cwd(),b=d(`vite:mock`,te(s)?s?`info`:`error`:s),{httpProxies:S}=ge(v.server.proxy||{}),C=ne([...x(e),...S]),w=x(t);!C.length&&!w.length&&b.warn(`No proxy was configured, mock server will not work. See ${P.cyan(`https://vite-plugin-mock-dev-server.netlify.app/guide/usage`)}`);let T=c===!1?!1:v.server.cors!==!1,E={};T&&v.server.cors!==!1&&(E={...E,...typeof v.server.cors==`boolean`?{}:v.server.cors}),T&&c!==!1&&(E={...E,...typeof c==`boolean`?{}:c});let D=[],O=v.resolve.alias||[];ee(O)?D.push(...O):Object.entries(O).forEach(([e,t])=>{D.push({find:e,replacement:t})});let k=Z(y,r,h);return{enabled:!0,cwd:y,dir:r,include:i,exclude:a,context:v.root,reload:o,cors:T?E:!1,cookiesOptions:f,log:s,formidableOptions:{multiples:!0,...l},bodyParserOptions:p,priority:m,build:u?{serverPort:8080,dist:`mockServer`,log:`error`,includeRecord:g??k.enabled??!1,...typeof u==`object`?u:{}}:!1,proxies:C,wsProxies:w,logger:b,alias:D,define:ae(v),record:k,replay:g??k.enabled??!1}}function ge(e={}){let t=[],n=[];return Object.keys(e).forEach(r=>{let i=e[r];typeof i==`string`||!i.ws&&!i.target?.toString().startsWith(`ws:`)&&!i.target?.toString().startsWith(`wss:`)?t.push(r):n.push(r)}),{httpProxies:t,wsProxies:n}}function Z(e,t,n){let r=typeof n==`boolean`?{enabled:n}:n,i=r?.expires??0;return{enabled:r?.enabled??!1,cwd:e,dir:S.join(t,r?.dir||`.recordings`),overwrite:r?.overwrite??!0,status:x(r?.status).map(Number),expires:i===0?2**53-1:i*1e3,gitignore:r?.gitignore??!0,filter:r?.filter||(()=>!0)}}async function _e(e,t,r,i){let{pattern:a,ignore:o}=c(r,i),s=await N(a,{ignore:o,cwd:S.join(e,t)}),l=``,u=[];return s.forEach((r,i)=>{let a=n(S.join(e,t,r));l+=`import * as m${i} from '${a}';\n`,u.push(`[m${i}, '${n(S.join(t,r))}']`)}),`import { processMockData, processRawData } from 'vite-plugin-mock-dev-server/server';
|
|
2
2
|
${l}
|
|
3
3
|
const exporters = [\n ${u.join(`,
|
|
4
4
|
`)}\n];
|
|
5
5
|
const mockList = exporters.map(([mod, filepath]) => processRawData(mod.default || mod, filepath));
|
|
6
|
-
export default processMockData(mockList);`}var Q=`vite-plugin-mock-dev-server`,
|
|
6
|
+
export default processMockData(mockList);`}var Q=`vite-plugin-mock-dev-server`,ve=`2.1.2`;function ye(e,t){let n=new Set,r=[Q,`connect`,`cors`],i=e=>t.find(({find:t})=>B(t,e));return e.forEach(e=>{let t=be(e);t.startsWith(`<define:`)||i(t)||ie(t)||t[0]===`/`||t.startsWith(`./`)||t.startsWith(`../`)||r.includes(t)||n.add(t)}),Array.from(n)}function be(e){let[t,n]=e.split(`/`);return t[0]===`@`?`${t}/${n}`:t}function xe(e,t){let{dependencies:n={},devDependencies:r={}}=e,i={...n,...r},a={name:`mock-server`,type:`module`,scripts:{start:`node index.js`},dependencies:{connect:`^3.7.0`,[Q]:`^${ve}`,cors:`^2.8.5`},pnpm:{peerDependencyRules:{ignoreMissing:[`vite`]}}},o=[`catalog:`,`file:`,`workspace:`];for(let e of t){let t=i[e];if(!t||o.some(e=>t.startsWith(e))){let t=j(e);a.dependencies[e]=t?.version?`^${t.version}`:`latest`}else a.dependencies[e]=`latest`}return JSON.stringify(a,null,2)}function Se({proxies:e,wsProxies:t,cookiesOptions:n,bodyParserOptions:r,priority:i,build:a,cors:o,record:s,replay:c}){let{serverPort:l,log:u}=a;return`import { createServer } from 'node:http';
|
|
7
7
|
import process from 'node:process';
|
|
8
8
|
import connect from 'connect';
|
|
9
9
|
import { createMockMiddleware, createLogger, mockWebSocket } from 'vite-plugin-mock-dev-server/server';
|
|
@@ -45,4 +45,4 @@ app.use(createMockMiddleware(compiler, {
|
|
|
45
45
|
server.listen(${l});
|
|
46
46
|
|
|
47
47
|
console.log('listen: http://localhost:${l}');
|
|
48
|
-
`}async function
|
|
48
|
+
`}async function Ce(e,t){let n=x(t.include),r=x(t.exclude),i=t.cwd||_.cwd(),a=t.dir,o=t.build,s=await M(t.context)||{},c=o.dist,l=await _e(i,a,n,r),u=S.join(i,`mock-data-${Date.now()}.js`);await w.writeFile(u,l,`utf-8`);let{code:d,deps:f}=await J(u,t),p=ye(f,t.alias);await w.unlink(u);let m=[{filename:S.join(c,`mock-data.js`),source:d},{filename:S.join(c,`index.js`),source:Se(t)},{filename:S.join(c,`package.json`),source:xe(s,p)}];if(t.record.enabled&&o.includeRecord){let e=await N(S.join(t.record.dir,`**/*.json`),{cwd:t.cwd,dot:!0});for(let n of e)m.push({filename:S.join(c,n),source:await w.readFile(S.join(t.cwd,n),`utf-8`)})}try{if(S.isAbsolute(c)){for(let{filename:e}of m)D.existsSync(e)&&await w.rm(e);t.logger.info(`${P.green(`✓`)} generate mock server in ${P.cyan(c)}`);for(let{filename:e,source:n}of m){D.mkdirSync(S.dirname(e),{recursive:!0}),await w.writeFile(e,n,`utf-8`);let r=(n.length/1024).toFixed(2),i=S.relative(c,e),a=i.length<30?` `.repeat(30-i.length):``;t.logger.info(` ${P.green(i)}${a}${P.bold.dim(`${r} kB`)}`)}}else for(let{filename:t,source:n}of m)e.emitFile({type:`asset`,fileName:t,source:n})}catch(e){console.error(e)}}function $(e={}){if(e.enabled===!1)return[];let t=[Te(e)];return e.build&&t.push(we(e)),t}function we(e){let t={},n;return{name:`vite-plugin-mock-dev-server-generator`,enforce:`post`,apply:`build`,configResolved(r){t=r,n=X(e,r),r.logger.warn(``)},async buildEnd(e){e||t.command!==`build`||await Ce(this,n)}}}function Te(t){let n;return{name:`vite-plugin-mock-dev-server`,enforce:`pre`,apply:`serve`,config(n){let r=x(t.wsPrefix);if(r.length&&n.server?.proxy){let e={};Object.keys(n.server.proxy).forEach(t=>{r.includes(t)||(e[t]=n.server.proxy[t])}),n.server.proxy=e}e(n);let{cwd:i,dir:a}=t,o=Z(i||_.cwd(),a||`mock`,t.record);o.enabled&&new s(o).setup(n)},configResolved(e){n=X(t,e),e.logger.warn(``)},configureServer({middlewares:e,httpServer:t,ws:r}){Y(n,t,r).forEach(t=>e.use(t))},configurePreviewServer({middlewares:e,httpServer:t}){Y(n,t).forEach(t=>e.use(t))}}}export{p as createDefineMock,d as createLogger,i as createMockMiddleware,m as createSSEStream,h as defineMock,g as defineMockData,o as logLevels,$ as mockDevServerPlugin,l as mockWebSocket,u as processMockData,t as processRawData,a as sortByValidator};
|
|
@@ -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:crypto";import D from"node:fs";import O from"cors";import k from"ansis";import A from"co-body";import j from"formidable";import M from"node:http";import{Buffer as N}from"node:buffer";import P from"node:zlib";import F from"http-status";import*as I from"mime-types";import{WebSocketServer as L}from"ws";function R(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 ee(e,t){return e[0]===`^`&&new RegExp(e).test(t)||t.startsWith(e)}function te(e){return typeof e==`object`&&!!e&&typeof e.pipe==`function`}function ne(e){return te(e)&&e.readable!==!1&&typeof e._read==`function`&&typeof e._readableState==`object`}const z={};async function re(e){if(r(z,e))return z[e];try{return import.meta.resolve?z[e]=!!import.meta.resolve(e):(await import(e),z[e]=!0),z[e]}catch{}return z[e]=!1,!1}function ie(e){return[`text`,`json`,`xml`].some(t=>e.includes(t))}function B(e,t){if(!t)return!0;for(let n in t)if(!ae(e[n],t[n]))return!1;return!0}function ae(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=ae(e,t);return i&&n.add(r),i}))}return c(e)&&c(t)?B(e,t):Object.is(e,t)}const oe=new Map;function V(e,t){let n=oe.get(e);return n||(n=x(e).regexp,oe.set(e,n)),n.test(t)}const se=w(`vite:mock-dev-server`),ce=/\\/g,le=S.platform()===`win32`;function ue(e){return e.replace(ce,`/`)}function de(e){return C.posix.normalize(le?ue(e):e)}function H(e){let t=new URL(e,`http://example.com`);return{pathname:decodeURIComponent(t.pathname),query:T(t.search.replace(/^\?/,``))}}function fe(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 pe(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}=H(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 B(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]=me(n[e])}),n}function me(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+he(t[n]),0)})}function he(e){return e?Object.keys(e).length:0}function ge(e){let t=e?O(e):void 0;return t?(e,n)=>new Promise((r,i)=>t(e,n,e=>{e?i(e):r()})):void 0}async function _e(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 A.json(e,{limit:c||o,...u});if(a.startsWith(`application/x-www-form-urlencoded`))return await A.form(e,{limit:s||o,...u});if(a.startsWith(`text/plain`))return await A.text(e,{limit:l||o,...u});if(a.startsWith(`multipart/form-data`))return await ye(e,n)}catch(e){t.error(e)}}const ve={keepExtensions:!0,filename(e,t,n){return n?.originalFilename||`${e}.${Date.now()}${t?`.${t}`:``}`}};async function ye(e,t){let n=j({...ve,...t});return new Promise((t,r)=>{n.parse(e,(e,n,i)=>{if(e){r(e);return}t({...n,...i})})})}const be=new Map;function U(e,t){let n=be.get(e);n||(n=y(e,{decode:decodeURIComponent}),be.set(e,n));let r=n(t);return r?r.params:{}}function xe(e,t){return B(e.headers,t.headers)&&B(e.body,t.body)&&B(e.params,t.params)&&B(e.query,t.query)&&B(e.refererQuery,t.refererQuery)}function W(e,t){return!t||o(t)?``:` ${k.gray(`${e}:`)}${JSON.stringify(t)}`}function Se(e,t,n){let{url:r,method:i,query:a,params:o,body:s}=e,{pathname:c}=new URL(r,`http://example.com`);c=k.green(decodeURIComponent(c));let l=k.magenta.bold(i),u=W(`query`,a),d=W(`params`,o),f=W(`body`,s),p=n?` 🎲 ${k.bgYellow(`ERR`)}`:``,m=` ${k.dim.underline(`(${t})`)}`;return`${l}${p} ${c}${u}${d}${f}${m}`}function Ce(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=V(t.url,r);if(c&&t.validator){let i=U(t.url,r);if(s(t.validator))return t.validator({params:i,...o});{let[a,s]=e(xe,{params:i,...o},t.validator);if(a){let e=t.__filepath__;return n.error(`${k.red(`mock error at ${r}`)}\n${a}\n at validator (${k.underline(e)})`,t.log),!1}return s}}return c})}const G={};function K(e){if(G[e])return G[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),G[e]=t,t}function we(e){let t=e.map(e=>K(e).length);return t=t.length===0?[1]:t,Math.max(...t)+2}function Te(e,t){let n=K(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,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 Ee(e){let t=we(e);return e.sort((e,n)=>Te(e,t)-Te(n,t))}function De(e,t,n){let r=Ee(e.filter(e=>V(e,t))),{global:a=[],special:s={}}=n;if(a.length===0&&o(s)||r.length===0)return r;let[c,l]=d(r,e=>K(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 q=/^[\t\u0020-\u007E\u0080-\u00FF]+$/,Oe=/^(?:low|medium|high)$/i,J=Object.create(null),ke=/[\^$\\.*+?()[\]{}|]/g,Ae=/[;=]/,je=/;/,Me=/^(?:lax|none|strict)$/i;var Ne=class{name;value;maxAge;expires;path=`/`;domain;secure=!1;httpOnly=!0;sameSite=!1;overwrite=!1;priority;partitioned;constructor(e,t,n={}){if(!q.test(e)||Ae.test(e))throw TypeError(`argument name is invalid`);if(t&&(!q.test(t)||je.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&&!q.test(this.path))throw TypeError(`[Cookie] option path is invalid`);if(this.domain&&!q.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&&!Oe.test(this.priority))throw TypeError(`[Cookie] option priority is invalid`);if(this.sameSite&&this.sameSite!==!0&&!Me.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 Pe(e,t){if(e.length!==t.length)return!1;if(E.timingSafeEqual)return E.timingSafeEqual(e,t);for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}function Fe(e,t){return E.createHmac(`sha256`,e).update(t).digest()}function Ie(e,t){let n=String(e),r=String(t),i=E.randomBytes(32);return Pe(Fe(i,n),Fe(i,r))&&e===t}const Le=/[/+=]/g,Re={"/":`_`,"+":`-`,"=":``};var ze=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 E.createHmac(this.algorithm,t).update(e).digest(this.encoding).replace(Le,e=>Re[e])}index(e,t){for(let n=0,r=this.keys.length;n<r;n++)if(Ie(t,this.sign(e,this.keys[n])))return n;return-1}verify(e,t){return this.index(e,t)>-1}},Be=class{request;response;secure;keys;constructor(e,t,n={}){this.request=e,this.response=t,this.secure=n.secure,n.keys instanceof ze?this.keys=n.keys:i(n.keys)&&(this.keys=new ze(n.keys))}set(e,t,n){let r=this.request,i=this.response,a=g(i.getHeader(`Set-Cookie`)),o=new Ne(e,t,n),s=n?.signed??!!this.keys,c=this.secure===void 0?r.protocol===`https`||He(r):!!this.secure;if(!c&&n?.secure)throw Error(`Cannot send secure cookie over unencrypted connection`);if(o.secure=n?.secure??c,Ue(a,o),s&&n){if(!this.keys)throw Error(`.keys required for signed cookies`);o.value=this.keys.sign(o.toString()),o.name+=`.sig`,Ue(a,o)}return(i.set?M.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(Ve(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 Ve(e){return J[e]||(J[e]=RegExp(`(?:^|;) *${e.replace(ke,`\\$&`)}=([^;]*)`)),J[e]}function He(e){return!!(e.socket?e.socket.encrypted:e.connection.encrypted)}function Ue(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 We=`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 Ge(e,t){try{switch(t.toLowerCase()){case`gzip`:case`x-gzip`:return{body:await Je(e),encoding:`identity`};case`deflate`:case`x-deflate`:return{body:await Ye(e),encoding:`identity`};case`br`:return{body:await qe(e),encoding:`identity`};case`zstd`:return{body:await Ke(e),encoding:`identity`}}}catch{}return{body:e,encoding:t}}let Y=null;async function Ke(e){if(P.zstdDecompress)return new Promise((t,n)=>{P.zstdDecompress(e,(e,r)=>{e?n(e):t(r)})});if(!Y){let{ZstdCodec:e}=await import(`zstd-codec`);Y=await new Promise(t=>{e.run(e=>{t(new e.Streaming)})})}return Y.decompress(e,e.length)}async function qe(e){return new Promise((t,n)=>{P.brotliDecompress(e,(e,r)=>{e?n(e):t(r)})})}async function Je(e){return new Promise((t,n)=>{P.gunzip(e,(e,r)=>{e?n(e):t(r)})})}async function Ye(e){return new Promise((t,n)=>{P.inflate(e,(e,r)=>{e?n(e):t(r)})})}const Xe=new Intl.DateTimeFormat(`en-US`,{year:`numeric`,month:`numeric`,day:`numeric`,hour:`numeric`,minute:`numeric`,second:`numeric`,hour12:!1});function Ze(e,t,n){let{query:i}=H(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]})),N.isBuffer(n)&&(n=n.toString(),o=`buffer`),{method:a,pathname:t,query:i,bodyType:o,body:n}}async function Qe(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&&!We.includes(e)&&(i[t]=String(n))}let a=ie(i[`content-type`]||``);if(a){let{body:e,encoding:n}=await Ge(t,i[`content-encoding`]||``);t=N.from(e),i[`content-encoding`]=n}return{status:n,statusText:r,headers:i,body:t.toString(a?`utf-8`:`base64`)}}function $e(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=N.from(t.body),r=N.from(e.body);if(n.length!==r.length||!n.equals(r))return!1}return!!n(e.body,t.body)}function et(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}=R(n,r);return t=>e(t.pathname)}return e=>n.some(t=>V(t,e.pathname))&&r.every(t=>!V(t,e.pathname))}function tt(e,t){return C.join(t,`${l(e)}.json`)}const X=new Map;async function nt(e){if(X.has(e))return X.get(e);try{if(!D.existsSync(e))return[];let t=await D.promises.readFile(e,`utf-8`)||`[]`,n=JSON.parse(t);return X.set(e,n),n}catch(t){return console.error(`Error reading record file ${e}:`,t),[]}}async function rt(e,t){try{X.set(e,t),await D.promises.mkdir(C.dirname(e),{recursive:!0}),await D.promises.writeFile(e,JSON.stringify(t,null,2),`utf-8`)}catch(t){console.error(`Error writing record file ${e}:`,t)}}const Z=new WeakMap;function it(e,t,n){Z.set(e,{body:n,pathname:t,timestamp:Date.now()})}var at=class{options;filter;constructor(e){this.options=e,this.filter=et(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,N.concat(r)),r=null})})}}}),this.addGitignore()}async record(e,t,n){if(!Z.has(e))return;let{body:r,pathname:i,timestamp:a}=Z.get(e);if(Z.delete(e),!i)return;let o=Ze(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:Xe.format(a),referer:e.headers.referer||`unknown`},req:o,res:await Qe(t,n)},p=tt(i,c);f.meta.filepath=p;let m=C.join(s,p),h=(await nt(m)).filter(e=>a-e.meta.timestamp<=u),g=h.findIndex(e=>$e(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 rt(m,h)}async addGitignore(){let e=this.options;if(!e.gitignore)return;let t=C.join(e.cwd,e.dir);await D.promises.mkdir(t,{recursive:!0}),D.existsSync(C.join(t,`.gitignore`))||await D.promises.writeFile(C.join(t,`.gitignore`),`*
|
|
2
|
+
`,`utf-8`)}};async function ot(e,t,n,r){let i=Ze(e,t,n),a=C.join(r.cwd,tt(i.pathname,r.dir)),o=Date.now(),s=await nt(a),c=s.filter(e=>o-e.meta.timestamp<r.expires&&$e(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=ie(l.res.headers[`content-type`]||``);return{url:l.req.pathname,status:l.res.status,statusText:l.res.statusText,headers:l.res.headers,body:N.from(l.res.body,e?`utf-8`:`base64`),type:`buffer`,__filepath__:l.meta.filepath}}}const Q=new WeakMap;function st(e){let t=[];e.addListener(`data`,e=>{t?.push(N.from(e))}),e.addListener(`end`,()=>{t?.length&&Q.set(e,N.concat(t)),t=null})}function ct(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=Q.get(t);n&&(Q.delete(t),e.headersSent||e.setHeader(`Content-Length`,n.byteLength),e.writableEnded||e.write(n))})}}})}function lt(e){return F[e]||`Unknown`}function $(e,t=200,n){e.statusCode=t,e.statusMessage=n||lt(t)}async function ut(e,n,r,i){let{headers:a,type:o=`json`}=r,c=r.__filepath__,l=I.contentType(o)||I.contentType(I.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(`${k.red(`mock error at ${e.url.split(`?`)[0]}`)}\n${d}\n at headers (${k.underline(c)})`,r.log);return}u(f).forEach(e=>n.setHeader(e,f[e]))}async function dt(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(`${k.red(`mock error at ${e.url.split(`?`)[0]}`)}\n${c}\n at cookies (${k.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 ft(e,t,n){if(ne(t))t.pipe(e);else if(N.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`?N.from(r):r)}}async function pt(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 mt(e,{formidableOptions:n={},bodyParserOptions:r={},proxies:i,cookiesOptions:a,logger:o,priority:c={},cors:l,record:u,replay:d}){let f=ge(l);return async function(l,p,m){let g=h(),{query:_,pathname:v}=H(l.url);if(!v||i.length===0||!i.some(e=>ee(e,l.url)))return m();let y=e.mockData,b=De(Object.keys(y),v,c);if(b.length===0&&!u.enabled)return m();st(l);let x=new Be(l,p,a),S,C,w=l.method.toUpperCase(),T={query:_,refererQuery:H(l.headers.referer||``).query,body:await _e(l,o,n,r),headers:l.headers,getCookie:x.get.bind(x)};for(let e of b)if(S=Ce(y[e],o,{pathname:v,method:w,request:T}),S){C=e;break}if(d&&!S&&(S=await ot(l,v,T.body,u)),!S){u.enabled&&it(l,v,T.body);let e=b.map(e=>e===C?k.underline.bold(e):k.dim(e)).join(`, `);return e.length&&o.warn(`${k.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=U(S.url,v),D.setCookie=x.set.bind(x);let{delay:O,type:A=`json`,response:j,log:M,error:N,__filepath__:P}=S,{body:F,status:I=200,statusText:L}=S,R=N&&(N.probability??.5)>Math.random();if(R&&(I=N.status??500,L=N.statusText,F=N.body),$(D,I,L),await ut(E,D,S,o),await dt(E,D,S,o),o.info(Se(E,P,R),M),o.debug(`${k.magenta(`DEBUG`)} ${k.underline(v)} matches: [ ${b.map(e=>e===C?k.underline.bold(e):k.dim(e)).join(`, `)} ]\n`),F){let[e]=await t(async()=>{let e=s(F)?await F(E):F;await pt(g,O),ft(D,e,A)});e&&(o.error(`${k.red(`mock error at ${v}`)}\n ${e}\n at body (${k.underline.gray(P)})`,M),$(D,500),p.end(``));return}if(j){let[e]=await t(async()=>{await pt(g,O),await j(E,D,m)});e&&(o.error(`${k.red(`mock error at ${v}`)}\n ${e}\n at response (${k.underline.gray(P)})`,M),$(D,500),p.end(``));return}p.end(``)}}function ht(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 L({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(`${k.red(`WebSocket mock error at ${t.path}`)}\n${e}\n at setup (${o})`,n.log)})}catch(e){i.error(`${k.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);gt(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}=H(t.url);if(!p||n.length===0||!n.some(e=>ee(e,t.url)))return;let h=e.mockData,g=Object.keys(h).find(e=>V(e,p));if(!g)return;let _=h[g].find(e=>e.url&&e.ws&&V(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 Be(t,t,r),{query:w}=H(t.headers.referer||``);S.query=m,S.refererQuery=w,S.params=U(g,p),S.getCookie=C.get.bind(C),b.handleUpgrade(S,a,o,e=>{i.info(`${k.magenta.bold(`WebSocket`)} ${k.green(t.url)} connected ${k.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())gt(s.get(t).cleanupList),t.close();e.clear()}o.clear(),a.clear()})}function gt(e){let t;for(;t=e.shift();)t?.()}const _t={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,_t[i]>=_t[n]){let t=n===`info`||n===`debug`?`log`:n,i=n===`debug`?k.magenta.bold(e):n===`info`?k.cyan.bold(e):n===`warn`?k.yellow.bold(e):k.red.bold(e),a=`${k.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{ct as a,fe as c,de as d,re as f,mt as i,me as l,_t as n,at as o,R as p,ht as r,pe as s,vt as t,se as u};
|
package/dist/server.js
CHANGED
|
@@ -1 +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"./server-
|
|
1
|
+
import{c as e,i as t,l as n,n as r,r as i,s as a,t as o}from"./server-B6gUVmAa.js";export{o as createLogger,t as createMockMiddleware,r as logLevels,i as mockWebSocket,a as processMockData,e as processRawData,n as sortByValidator};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vite-plugin-mock-dev-server",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "2.1.
|
|
4
|
+
"version": "2.1.2",
|
|
5
5
|
"description": "Vite Plugin for API mock dev server.",
|
|
6
6
|
"author": "pengzhanbo <q942450674@outlook.com> (https://github.com/pengzhanbo)",
|
|
7
7
|
"license": "MIT",
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
}
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
|
-
"@pengzhanbo/utils": "^3.
|
|
67
|
+
"@pengzhanbo/utils": "^3.6.0",
|
|
68
68
|
"ansis": "^4.2.0",
|
|
69
69
|
"chokidar": "^5.0.0",
|
|
70
70
|
"co-body": "^6.2.0",
|
|
@@ -76,15 +76,15 @@
|
|
|
76
76
|
"json5": "^2.2.3",
|
|
77
77
|
"local-pkg": "^1.1.2",
|
|
78
78
|
"mime-types": "^3.0.2",
|
|
79
|
-
"path-to-regexp": "^8.
|
|
79
|
+
"path-to-regexp": "^8.4.2",
|
|
80
80
|
"picomatch": "^4.0.4",
|
|
81
|
-
"tinyglobby": "^0.2.
|
|
81
|
+
"tinyglobby": "^0.2.16",
|
|
82
82
|
"ws": "^8.20.0"
|
|
83
83
|
},
|
|
84
84
|
"devDependencies": {
|
|
85
|
-
"esbuild": "^0.
|
|
86
|
-
"rolldown": "^1.0.0-rc.
|
|
87
|
-
"vite": "^8.0.
|
|
85
|
+
"esbuild": "^0.28.0",
|
|
86
|
+
"rolldown": "^1.0.0-rc.18",
|
|
87
|
+
"vite": "^8.0.10",
|
|
88
88
|
"zstd-codec": "^0.1.5"
|
|
89
89
|
},
|
|
90
90
|
"publishConfig": {
|
package/dist/server-DnEpYtlk.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
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};
|