vite-plugin-mock-dev-server 2.1.2 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/helper.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { C as MockRequest, D as GetCookieOption, E as CookiesOption, O as SetCookieOption, S as Method, T as ResponseBody, _ as RecordedRequest, a as MockErrorConfig, b as ExtraRequest, c as LogLevel, d as MockMatchSpecialPriority, f as MockServerPluginOptions, g as RecordedReq, h as RecordedMeta, i as WebSocketSetupContext, l as LogType, m as RecordOptions, n as MockOptions, o as MockHttpItem, p as ServerBuildOption, r as MockWebsocketItem, s as BodyParserOptions, t as FormidableFile, u as MockMatchPriority, v as RecordedRes, w as MockResponse, x as Headers, y as ResolvedRecordOptions } from "./index-HOrR1VyK.js";
1
+ import { C as MockRequest, D as GetCookieOption, E as CookiesOption, O as SetCookieOption, S as Method, T as ResponseBody, _ as RecordedRequest, a as MockErrorConfig, b as ExtraRequest, c as LogLevel, d as MockMatchSpecialPriority, f as MockServerPluginOptions, g as RecordedReq, h as RecordedMeta, i as WebSocketSetupContext, l as LogType, m as RecordOptions, n as MockOptions, o as MockHttpItem, p as ServerBuildOption, r as MockWebsocketItem, s as BodyParserOptions, t as FormidableFile, u as MockMatchPriority, v as RecordedRes, w as MockResponse, x as Headers, y as ResolvedRecordOptions } from "./index-BmZUk72e.js";
2
2
  import { IncomingMessage, OutgoingHttpHeaders, ServerResponse } from "node:http";
3
3
  import { Transform } from "node:stream";
4
4
 
@@ -1,8 +1,8 @@
1
+ import { Buffer } from "node:buffer";
1
2
  import { CorsOptions } from "cors";
2
3
  import { Options } from "co-body";
3
4
  import formidable from "formidable";
4
5
  import http from "node:http";
5
- import { Buffer } from "node:buffer";
6
6
  import { WebSocketServer } from "ws";
7
7
  import { Readable } from "node:stream";
8
8
  import { Connect } from "vite";
@@ -668,6 +668,17 @@ interface MockServerPluginOptions {
668
668
  */
669
669
  priority?: MockMatchPriority;
670
670
  /**
671
+ * Active scenario(s) for filtering mocks.
672
+ * Only mocks whose `scene` intersects with this value (or have no `scene` configured)
673
+ * will be considered for matching.
674
+ * Can be overridden per-request via the `X-Mock-Scene` header.
675
+ *
676
+ * 当前激活的场景,用于过滤 mock。
677
+ * 只有 `scene` 与此有交集的 mock(或未配置 `scene` 的 mock)才会被考虑匹配。
678
+ * 可通过 `X-Mock-Scene` 请求头按请求覆盖。
679
+ */
680
+ activeScene?: string | string[];
681
+ /**
671
682
  * Record and replay configuration
672
683
  * Can be abbreviated as: record: true
673
684
  *
@@ -675,6 +686,7 @@ interface MockServerPluginOptions {
675
686
  * 可简写为:record: true
676
687
  *
677
688
  * @default false
689
+ *
678
690
  * @example
679
691
  * ```ts
680
692
  * // Enable with default settings
@@ -685,7 +697,6 @@ interface MockServerPluginOptions {
685
697
  * enabled: true,
686
698
  * dir: 'mock/.recordings',
687
699
  * overwrite: true,
688
- * sensitiveFields: ['password', 'token']
689
700
  * }
690
701
  * ```
691
702
  */
@@ -730,7 +741,7 @@ interface MockBaseItem {
730
741
  ws?: boolean;
731
742
  /**
732
743
  * Whether to enable mock for this interface.
733
- * In most scenarios, we only need to mock some interfaces instead of all requests that
744
+ * In most scenerios, we only need to mock some interfaces instead of all requests that
734
745
  * have been configured with mock.
735
746
  * Therefore, it is important to be able to configure whether to enable it or not.
736
747
  *
@@ -746,6 +757,17 @@ interface MockBaseItem {
746
757
  * @default 'info'
747
758
  */
748
759
  log?: boolean | LogLevel;
760
+ /**
761
+ * Scenario identifier for this mock.
762
+ * When not configured, the mock is universal and always matches regardless of active scenario.
763
+ * When configured, the mock only matches when at least one of its scenarios matches
764
+ * one of the active scenarios.
765
+ *
766
+ * 该 mock 的场景标识。
767
+ * 未配置时,该 mock 为全场景通用,不受 activeScene 限制。
768
+ * 配置后,只有 scene 中任意一项与 activeScene 中任意一项匹配时,该 mock 才会激活。
769
+ */
770
+ scene?: string | string[];
749
771
  }
750
772
  //#endregion
751
773
  //#region src/types/httpConfig.d.ts
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { C as MockRequest, D as GetCookieOption, E as CookiesOption, O as SetCookieOption, S as Method, T as ResponseBody, _ as RecordedRequest, a as MockErrorConfig, b as ExtraRequest, c as LogLevel, d as MockMatchSpecialPriority, f as MockServerPluginOptions, g as RecordedReq, h as RecordedMeta, i as WebSocketSetupContext, l as LogType, m as RecordOptions, n as MockOptions, o as MockHttpItem, p as ServerBuildOption, r as MockWebsocketItem, s as BodyParserOptions, t as FormidableFile, u as MockMatchPriority, v as RecordedRes, w as MockResponse, x as Headers, y as ResolvedRecordOptions } from "./index-HOrR1VyK.js";
1
+ import { C as MockRequest, D as GetCookieOption, E as CookiesOption, O as SetCookieOption, S as Method, T as ResponseBody, _ as RecordedRequest, a as MockErrorConfig, b as ExtraRequest, c as LogLevel, d as MockMatchSpecialPriority, f as MockServerPluginOptions, g as RecordedReq, h as RecordedMeta, i as WebSocketSetupContext, l as LogType, m as RecordOptions, n as MockOptions, o as MockHttpItem, p as ServerBuildOption, r as MockWebsocketItem, s as BodyParserOptions, t as FormidableFile, u as MockMatchPriority, v as RecordedRes, w as MockResponse, x as Headers, y as ResolvedRecordOptions } from "./index-BmZUk72e.js";
2
2
  import { DefineMockDataOptions, HeaderStream, MockData, SSEMessage, createDefineMock, createSSEStream, defineMock, defineMockData } from "./helper.js";
3
- import { a as processRawData, c as Logger, i as processMockData, l as createLogger, n as CreateMockMiddlewareOptions, o as sortByValidator, r as createMockMiddleware, s as mockDevServerPlugin, t as mockWebSocket, u as logLevels } from "./server-ypJ-wM5S.js";
3
+ import { a as processRawData, c as Logger, i as processMockData, l as createLogger, n as CreateMockMiddlewareOptions, o as sortByValidator, r as createMockMiddleware, s as mockDevServerPlugin, t as mockWebSocket, u as logLevels } from "./server-a8HL1JRZ.js";
4
4
  export { BodyParserOptions, CookiesOption, CreateMockMiddlewareOptions, DefineMockDataOptions, ExtraRequest, type FormidableFile, GetCookieOption, HeaderStream, Headers, LogLevel, LogType, Logger, Method, MockData, MockErrorConfig, type MockHttpItem, MockMatchPriority, MockMatchSpecialPriority, type MockOptions, type MockRequest, MockResponse, type MockServerPluginOptions, type MockWebsocketItem, RecordOptions, RecordedMeta, RecordedReq, RecordedRequest, RecordedRes, ResolvedRecordOptions, ResponseBody, SSEMessage, ServerBuildOption, SetCookieOption, WebSocketSetupContext, createDefineMock, createLogger, createMockMiddleware, createSSEStream, defineMock, defineMockData, logLevels, mockDevServerPlugin, mockWebSocket, processMockData, processRawData, sortByValidator };
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-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';
1
+ import{a as e,c as t,d as n,f as r,i,l as a,m as o,n as s,o as c,p as l,r as u,s as d,t as f,u as p}from"./server-B4Hh46_a.js";import{createDefineMock as m,createSSEStream as h,defineMock as g,defineMockData as _}from"./helper.js";import v from"node:process";import{attemptAsync as y,isArray as b,isBoolean as ee,promiseParallel as x,toArray as S,uniq as te}from"@pengzhanbo/utils";import C from"node:path";import{pathToFileURL as w}from"node:url";import T from"ansis";import E from"node:fs/promises";import D from"json5";import O,{promises as k}from"node:fs";import A from"node:events";import{watch as j}from"chokidar";import{getPackageInfoSync as M,loadPackageJSON as N,loadPackageJSONSync as P}from"local-pkg";import{glob as F}from"tinyglobby";import ne from"is-core-module";function re(e){let t={},n=v.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`?ae(n)&&(r[t]=n,a&&(i[t.slice(16)]=n)):(r[t]=I(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`]=ie({...o,...i})),c}function ie(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)}: ${I(a)}`,r!==n.length-1&&(t+=`, `)}return`${t}}`}function I(e){return e===void 0?`undefined`:typeof e==`string`?e:JSON.stringify(e)}function ae(e){try{return JSON.parse(e),!0}catch{return!1}}const oe={name:`externalize-deps`,setup(e){e.onResolve({filter:/.*/},({path:e})=>{if(e[0]!==`.`&&!C.isAbsolute(e))return{external:!0}})}},se={name:`json5-loader`,setup(e){e.onLoad({filter:/\.json5$/},async({path:e})=>{let t=await E.readFile(e,`utf-8`);return{contents:`export default ${JSON.stringify(D.parse(t))}`,loader:`js`}})}},ce={name:`json-loader`,setup(e){e.onLoad({filter:/\.json$/},async({path:e})=>({contents:`export default ${await E.readFile(e,`utf-8`)}`,loader:`js`}))}},L={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 R(e){return{name:`alias-plugin`,setup(t){t.onResolve({filter:/.*/},async({path:n})=>{let r=e.find(({find:e})=>z(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 z(e,t){return e instanceof RegExp?e.test(t):t.length<e.length?!1:t===e?!0:t.startsWith(`${e}/`)}let B=null;async function V(){return B||=(await import(`esbuild`)).build,B}async function H(e,{isESM:t=!0,define:n,alias:i,cwd:a=v.cwd(),logger:o}){let s=C.resolve(a,e),c=C.basename(e),l=C.dirname(s);try{let o=await(await V())({entryPoints:[e],outfile:`out.js`,write:!1,target:[`node20`],platform:`node`,bundle:!0,metafile:!0,format:t?`esm`:`cjs`,define:{...n,__dirname:JSON.stringify(l),__filename:JSON.stringify(c),...t?{}:{"import.meta.url":JSON.stringify(w(s))}},plugins:[R(i),L,oe,ce,se],absWorkingDir:a}),u=new Set,d=o.metafile?.inputs||{};return Object.keys(d).forEach(e=>d[e].imports.forEach(e=>u.add(r(e.path)))),{code:o.outputFiles[0].text,deps:Array.from(u)}}catch(e){o.error(`Failed to transform ${T.yellow.underline(s)}`),console.error(e)}return{code:``,deps:[]}}const U=new Set;async function W({filepath:e,code:t,isESM:r,cwd:i}){e=C.resolve(i,e);let a=r?`.mjs`:`.cjs`,o=`${e}.${n(t)}${a}`;await k.writeFile(o,t,`utf8`),U.add(o);let[,s]=await y(G,String(w(o)));return await y(le,o),s}async function G(e){let t=await import(e);return t.default||t}async function le(e){await k.unlink(e),U.delete(e)}async function ue(){for(let e of U)O.existsSync(e)&&await y(k.unlink,e)}v.on(`exit`,ue);const de={name:`vite-mock:rename-plugin`,resolveId(e){if(e===`vite-plugin-mock-dev-server`)return{id:`vite-plugin-mock-dev-server/helper`,external:!0}}},fe={name:`vite-mock:json5-plugin`,transform:{filter:{id:/\.json5$/},handler:e=>({code:`export default ${D.stringify(D.parse(e))}`})}};let K=null;async function pe(){return K||={build:(await import(`rolldown`)).build,aliasPlugin:(await import(`rolldown/experimental`)).viteAliasPlugin},K}async function me(e,{isESM:t=!0,define:n,alias:i,cwd:a=v.cwd(),logger:o}){let s=C.resolve(a,e),c=C.basename(e),l=C.dirname(s),u=e=>!!i.find(({find:t})=>z(t,e));try{let{build:o,aliasPlugin:d}=await pe(),f=await o({input:e,write:!1,cwd:a,output:{format:t?`esm`:`cjs`,sourcemap:!1,file:`out.js`},platform:`node`,transform:{define:{...n,__dirname:JSON.stringify(l),__filename:JSON.stringify(c),...t?{}:{"import.meta.url":JSON.stringify(w(s))}}},external(e){if(u(e))return!1;if(e[0]!==`.`&&!C.isAbsolute(e)&&e!==`vite-plugin-mock-dev-server`)return!0},plugins:[d({entries:i}),de,fe],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(c)).map(e=>r(C.relative(a,e)))}}catch(e){o.error(`Failed to transform ${T.yellow.underline(s)}`),console.error(e)}return{code:``,deps:[]}}let q;async function J(e,t){if(q??=await l(`rolldown`)?`rolldown`:await l(`esbuild`)?`esbuild`:`none`,q===`rolldown`)return me(e,t);if(q===`esbuild`)return H(e,t);throw Error(`rolldown or esbuild not found`)}async function he(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||v.cwd()})||{},deps:i}}var ge=class extends A{moduleCache=new Map;moduleDeps=new Map;cwd;mockWatcher;depsWatcher;isESM=!1;_mockData={};options;constructor(e){super(),this.options=e,this.cwd=e.cwd||v.cwd();try{let e=P(this.cwd);this.isESM=e?.type===`module`}catch{}}get mockData(){return this._mockData}run(e){let{include:t,exclude:n}=this.options,{pattern:i,ignore:a,isMatch:s}=o(t,n);if(F(i,{ignore:a,cwd:r(C.join(this.cwd,this.options.dir))}).then(e=>e.map(e=>()=>this.load(r(C.join(this.options.dir,e))))).then(e=>x(e,64)).then(()=>this.updateMockData()).catch(this.options.logger.error),!e)return;this.watchMockEntry(s),this.watchDeps();let c=null;this.on(`mock:update`,async e=>{s(e)&&(await this.load(e),c&&clearImmediate(c),c=setImmediate(()=>{this.updateMockData(),this.emit(`mock:update-end`,r(e)),c=null}))}),this.on(`mock:unlink`,async e=>{s(e)&&(e=r(C.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,logger:i}=this.options,{data:a,deps:o}=await he(e,{cwd:this.cwd,isESM:this.isESM,define:n,alias:r,logger:i});this.moduleCache.set(e,t(a,e)),this.updateModuleDeps(e,o)}catch(e){console.error(e)}}updateMockData(){this._mockData=d(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=j(this.options.dir,{ignoreInitial:!0,cwd:this.cwd,ignored:(t,n)=>t.includes(`node_modules`)?!0:!!n?.isFile()&&!e(r(t))});t.on(`add`,async e=>{e=r(e),this.emit(`mock:update`,e),p(`watcher:add`,e)}),t.on(`change`,async e=>{e=r(e),this.emit(`mock:update`,e),p(`watcher:change`,e)}),t.on(`unlink`,async e=>{e=r(e),this.emit(`mock:unlink`,e),p(`watcher:unlink`,e)})}watchDeps(){let e=[...this.moduleDeps.keys()],t=this.depsWatcher=j([...e],{ignoreInitial:!0,cwd:this.cwd});t.on(`change`,e=>{e=r(e),this.moduleDeps.get(e)?.forEach(e=>this.emit(`mock:update`,e))}),t.on(`unlink`,e=>{e=r(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 ge(e);r.run(!!t),r.on(`mock:update-end`,()=>{e.reload&&n?.send({type:`full-reload`})}),t?.on(`close`,()=>r.close()),u(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:d={},bodyParserOptions:p={},priority:m={},activeScene:h=[],record:g=!1,replay:_},y){let x=n||v.cwd(),C=f(`vite:mock`,ee(s)?s?`info`:`error`:s),{httpProxies:w}=_e(y.server.proxy||{}),E=te([...S(e),...w]),D=S(t);!E.length&&!D.length&&C.warn(`No proxy was configured, mock server will not work. See ${T.cyan(`https://vite-plugin-mock-dev-server.netlify.app/guide/usage`)}`);let O=c===!1?!1:y.server.cors!==!1,k={};O&&y.server.cors!==!1&&(k={...k,...typeof y.server.cors==`boolean`?{}:y.server.cors}),O&&c!==!1&&(k={...k,...typeof c==`boolean`?{}:c});let A=[],j=y.resolve.alias||[];b(j)?A.push(...j):Object.entries(j).forEach(([e,t])=>{A.push({find:e,replacement:t})});let M=Z(x,r,g);return{enabled:!0,cwd:x,dir:r,include:i,exclude:a,context:y.root,reload:o,cors:O?k:!1,cookiesOptions:d,log:s,formidableOptions:{multiples:!0,...l},bodyParserOptions:p,priority:m,build:u?{serverPort:8080,dist:`mockServer`,log:`error`,includeRecord:_??M.enabled??!1,...typeof u==`object`?u:{}}:!1,proxies:E,wsProxies:D,activeScene:S(h),logger:C,alias:A,define:re(y),record:M,replay:_??M.enabled??!1}}function _e(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:C.join(t,r?.dir||`.recordings`),overwrite:r?.overwrite??!0,status:S(r?.status).map(Number),expires:i===0?2**53-1:i*1e3,gitignore:r?.gitignore??!0,filter:r?.filter||(()=>!0)}}async function ve(e,t,n,i){let{pattern:a,ignore:s}=o(n,i),c=await F(a,{ignore:s,cwd:C.join(e,t)}),l=``,u=[];return c.forEach((n,i)=>{let a=r(C.join(e,t,n));l+=`import * as m${i} from '${a}';\n`,u.push(`[m${i}, '${r(C.join(t,n))}']`)}),`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`,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';
6
+ export default processMockData(mockList);`}var Q=`vite-plugin-mock-dev-server`,ye=`2.2.1`;function be(e,t){let n=new Set,r=[Q,`connect`,`cors`],i=e=>t.find(({find:t})=>z(t,e));return e.forEach(e=>{let t=$(e);t.startsWith(`<define:`)||i(t)||ne(t)||t[0]===`/`||t.startsWith(`./`)||t.startsWith(`../`)||r.includes(t)||n.add(t)}),Array.from(n)}function $(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]:`^${ye}`,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=M(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 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};
48
+ `}async function Ce(e,t){let n=S(t.include),r=S(t.exclude),i=t.cwd||v.cwd(),a=t.dir,o=t.build,s=await N(t.context)||{},c=o.dist,l=await ve(i,a,n,r),u=C.join(i,`mock-data-${Date.now()}.js`);await E.writeFile(u,l,`utf-8`);let{code:d,deps:f}=await J(u,t),p=be(f,t.alias);await E.unlink(u);let m=[{filename:C.join(c,`mock-data.js`),source:d},{filename:C.join(c,`index.js`),source:Se(t)},{filename:C.join(c,`package.json`),source:xe(s,p)}];if(t.record.enabled&&o.includeRecord){let e=await F(C.join(t.record.dir,`**/*.json`),{cwd:t.cwd,dot:!0});for(let n of e)m.push({filename:C.join(c,n),source:await E.readFile(C.join(t.cwd,n),`utf-8`)})}try{if(C.isAbsolute(c)){for(let{filename:e}of m)O.existsSync(e)&&await E.rm(e);t.logger.info(`${T.green(`✓`)} generate mock server in ${T.cyan(c)}`);for(let{filename:e,source:n}of m){await E.mkdir(C.dirname(e),{recursive:!0}),await E.writeFile(e,n,`utf-8`);let r=(n.length/1024).toFixed(2),i=C.relative(c,e),a=i.length<30?` `.repeat(30-i.length):``;t.logger.info(` ${T.green(i)}${a}${T.bold.dim(`${r} kB`)}`)}}else for(let{filename:t,source:n}of m)e.emitFile({type:`asset`,fileName:t,source:n})}catch(e){t.logger.error(`Failed to generate mock server`),console.error(e)}}function we(e={}){if(e.enabled===!1)return[];let t=[Ee(e)];return e.build&&t.push(Te(e)),t}function Te(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 Ee(t){let n;return{name:`vite-plugin-mock-dev-server`,enforce:`pre`,apply:`serve`,config(n){let r=S(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||v.cwd(),a||`mock`,t.record);o.enabled&&new c(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{m as createDefineMock,f as createLogger,i as createMockMiddleware,h as createSSEStream,g as defineMock,_ as defineMockData,s as logLevels,we as mockDevServerPlugin,u as mockWebSocket,d as processMockData,t as processRawData,a as sortByValidator};
@@ -0,0 +1,2 @@
1
+ import{LRUCache as e,attempt as t,attemptAsync as n,deepEqual as r,findFirstThen as i,hasOwn as a,isArray as o,isBoolean as s,isEmptyObject as c,isFunction as l,isNil as u,isPlainObject as d,isPrimitive as f,isString as p,kebabCase as m,objectKeys as h,partition as g,random as _,remove as v,sleep as y,sortBy as b,timestamp as x,toArray as S,uniq as C}from"@pengzhanbo/utils";import w from"picomatch";import{match as T,parse as E,pathToRegexp as D}from"path-to-regexp";import{Buffer as O}from"node:buffer";import k,{createHash as ee}from"node:crypto";import A from"node:os";import j from"node:path";import te from"debug";import{parse as ne}from"node:querystring";import M from"ansis";import N,{promises as P}from"node:fs";import F from"cors";import I from"co-body";import L from"formidable";import R from"node:http";import z from"node:zlib";import re from"http-status";import*as ie from"mime-types";import{WebSocketServer as ae}from"ws";function oe(e,t){let n=[],r=[`**/node_modules/**`,...S(t)];return S(e).forEach(e=>{e[0]===`!`?r.push(e.slice(1)):n.push(e)}),{pattern:n,ignore:r,isMatch:w(n,{ignore:r})}}const se=new e({maxSize:100});function ce(e,t){if(e[0]===`^`){let n=se.get(e);return n||se.set(e,n=new RegExp(e)),n.test(t)}return t.startsWith(e)}function le(e){return typeof e==`object`&&!!e&&typeof e.pipe==`function`}function ue(e){return le(e)&&e.readable!==!1&&typeof e._read==`function`&&typeof e._readableState==`object`}const B={};async function de(e){if(a(B,e))return B[e];try{return import.meta.resolve?B[e]=!!import.meta.resolve(e):(await import(e),B[e]=!0),B[e]}catch{}return B[e]=!1,!1}function fe(e){return[`text`,`json`,`xml`].some(t=>e.includes(t))}function V(e,t){if(!t)return!0;for(let n in t)if(!pe(e[n],t[n]))return!1;return!0}function pe(e,t){if(o(e)&&o(t)){let n=new Set;return t.every(t=>e.some((e,r)=>{if(n.has(r))return!1;let i=pe(e,t);return i&&n.add(r),i}))}return d(e)&&d(t)?V(e,t):Object.is(e,t)}const me=new Map;function H(e,t){let n=me.get(e);return n||(n=D(e).regexp,me.set(e,n)),n.test(t)}function he(e,t){if(!t)return!0;let n=S(t);return e.length===0&&n.length>0?!1:n.length===0?!0:n.some(t=>e.includes(t))}const ge=te(`vite:mock-dev-server`),_e=/\\/g,ve=A.platform()===`win32`;function ye(e){return e.replace(_e,`/`)}function be(e){return j.posix.normalize(ve?ye(e):e)}function xe(e){return e=f(e)?String(e):JSON.stringify(e),ee(`md5`).update(O.from(e)).digest(`hex`)}function U(e){try{let t=new URL(e,`http://example.com`);return{pathname:decodeURIComponent(t.pathname),query:ne(t.search.replace(/^\?/,``))}}catch{return console.error(`${M.red(`[vite:mock]`)} Failed to parse URL, input: ${M.yellow.underline(e)}`),{pathname:``,query:{}}}}function Se(e,t){let n;return o(e)?n=e.map(e=>({...e,__filepath__:t})):`url`in e?n={...e,__filepath__:t}:(n=[],h(e).forEach(r=>{let i=e[r];o(i)?n.push(...i.map(e=>({...e,__filepath__:t}))):n.push({...i,__filepath__:t})})),n}function Ce(e){let t=[];for(let[,n]of e.entries())n&&t.push(...S(n));let n={};return t.filter(e=>d(e)&&e.enabled!==!1&&e.url).forEach(e=>{let{pathname:t,query:r}=U(e.url),i=n[t]??=[],a={...e,url:t};if(a.ws!==!0){let e=a.validator;c(r)||(l(e)?a.validator=function(t){return V(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)}),h(n).forEach(e=>{n[e]=we(n[e])}),n}function we(e){return b(e,e=>{if(e.ws===!0)return 0;let t=S(e.scene).length>0?0:1,{validator:n}=e;return!n||c(n)?2+t:l(n)?0+t:1/Object.keys(n).reduce((e,t)=>e+Te(n[t]),0)+t})}function Te(e){return e?h(e).length:0}function Ee(e){let t=e?F(e):void 0;return t?(e,n)=>new Promise((r,i)=>t(e,n,e=>{e?i(e):r()})):void 0}async function De(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 I.json(e,{limit:c||o,...u});if(a.startsWith(`application/x-www-form-urlencoded`))return await I.form(e,{limit:s||o,...u});if(a.startsWith(`text/plain`))return await I.text(e,{limit:l||o,...u});if(a.startsWith(`multipart/form-data`))return await ke(e,n)}catch(e){t.error(e)}}const Oe={keepExtensions:!0,filename(e,t,n){return n?.originalFilename||`${e}.${Date.now()}${t?`.${t}`:``}`}};async function ke(e,t){let n=L({...Oe,...t});return new Promise((t,r)=>{n.parse(e,(e,n,i)=>{if(e){r(e);return}t({...n,...i})})})}const Ae=new Map;function W(e,t){let n=Ae.get(e);n||(n=T(e,{decode:decodeURIComponent}),Ae.set(e,n));let r=n(t);return r?r.params:{}}function je(e,t){return V(e.headers,t.headers)&&V(e.body,t.body)&&V(e.params,t.params)&&V(e.query,t.query)&&V(e.refererQuery,t.refererQuery)}function G(e,t){return!t||c(t)?``:` ${M.gray(`${e}:`)}${JSON.stringify(t)}`}function Me(e,t,n){let{url:r,method:i,query:a,params:o,body:s}=e,{pathname:c}=new URL(r,`http://example.com`);c=M.green(decodeURIComponent(c));let l=M.magenta.bold(i),u=G(`query`,a),d=G(`params`,o),f=G(`body`,s),p=n?` 🎲 ${M.bgYellow(`ERR`)}`:``,m=` ${M.dim.underline(`(${t})`)}`;return`${l}${p} ${c}${u}${d}${f}${m}`}function Ne(e,n,{pathname:r,method:i,request:a,activeScene:s}){return e.find(e=>{if(!r||!e||!e.url||e.ws||!(e.method?o(e.method)?e.method:[e.method]:[`GET`,`POST`]).includes(i)||!he(s,e.scene))return!1;let c=H(e.url,r);if(c&&e.validator){let i=W(e.url,r);if(l(e.validator))return e.validator({params:i,...a});{let[o,s]=t(je,{params:i,...a},e.validator);if(o){let t=e.__filepath__;return n.error(`${M.red(`mock error at ${r}`)}\n${o}\n at validator (${M.underline(t)})`,e.log),!1}return s}}return c})}const K={};function q(e){if(K[e])return K[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(E(e).tokens),K[e]=t,t}function Pe(e){let t=e.map(e=>q(e).length);return t=t.length===0?[1]:t,Math.max(...t)+2}function Fe(e,t){let n=q(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 Ie(e){let t=Pe(e);return e.sort((e,n)=>Fe(e,t)-Fe(n,t))}function Le(e,t,n){let r=Ie(e.filter(e=>H(e,t))),{global:i=[],special:a={}}=n;if(i.length===0&&c(a)||r.length===0)return r;let[s,l]=g(r,e=>q(e).filter(e=>e.type!==`text`).length>0),u=i.filter(e=>s.includes(e));if(u.length>0&&(r=C([...l,...u,...s])),c(a))return r;let d=Object.keys(a).filter(e=>r.includes(e))[0];if(!d)return r;let f=a[d],{rules:p,when:m}=o(f)?{rules:f,when:[]}:f;return p.includes(r[0])&&(m.length===0||m.some(e=>D(e).regexp.test(t)))&&(r=C([d,...r])),r}const J=/^[\t\u0020-\u007E\u0080-\u00FF]+$/,Re=/^(?:low|medium|high)$/i,Y=Object.create(null),ze=/[\^$\\.*+?()[\]{}|]/g,Be=/[;=]/,Ve=/;/,He=/^(?:lax|none|strict)$/i;var Ue=class{name;value;maxAge;expires;path=`/`;domain;secure=!1;httpOnly=!0;sameSite=!1;overwrite=!1;priority;partitioned;constructor(e,t,n={}){if(!J.test(e)||Be.test(e))throw TypeError(`argument name is invalid`);if(t&&(!J.test(t)||Ve.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&&!J.test(this.path))throw TypeError(`[Cookie] option path is invalid`);if(this.domain&&!J.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&&!Re.test(this.priority))throw TypeError(`[Cookie] option priority is invalid`);if(this.sameSite&&this.sameSite!==!0&&!He.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 We(e,t){if(e.length!==t.length)return!1;if(k.timingSafeEqual)return k.timingSafeEqual(e,t);for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}function Ge(e,t){return k.createHmac(`sha256`,e).update(t).digest()}function Ke(e,t){let n=String(e),r=String(t),i=k.randomBytes(32);return We(Ge(i,n),Ge(i,r))&&e===t}const qe=/[/+=]/g,Je={"/":`_`,"+":`-`,"=":``};var Ye=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 k.createHmac(this.algorithm,t).update(e).digest(this.encoding).replace(qe,e=>Je[e])}index(e,t){for(let n=0,r=this.keys.length;n<r;n++)if(Ke(t,this.sign(e,this.keys[n])))return n;return-1}verify(e,t){return this.index(e,t)>-1}},Xe=class{request;response;secure;keys;constructor(e,t,n={}){this.request=e,this.response=t,this.secure=n.secure,n.keys instanceof Ye?this.keys=n.keys:o(n.keys)&&(this.keys=new Ye(n.keys))}set(e,t,n){let r=this.request,i=this.response,a=S(i.getHeader(`Set-Cookie`)),o=new Ue(e,t,n),s=n?.signed??!!this.keys,c=this.secure===void 0?r.protocol===`https`||Qe(r):!!this.secure;if(!c&&n?.secure)throw Error(`Cannot send secure cookie over unencrypted connection`);if(o.secure=n?.secure??c,$e(a,o),s&&n){if(!this.keys)throw Error(`.keys required for signed cookies`);o.value=this.keys.sign(o.toString()),o.name+=`.sig`,$e(a,o)}return(i.set?R.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(Ze(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 Ze(e){return Y[e]||(Y[e]=RegExp(`(?:^|;) *${e.replace(ze,`\\$&`)}=([^;]*)`)),Y[e]}function Qe(e){return!!(e.socket?e.socket.encrypted:e.connection.encrypted)}function $e(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 et=`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 tt(e,t){try{switch(t.toLowerCase()){case`gzip`:case`x-gzip`:return{body:await at(e),encoding:`identity`};case`deflate`:case`x-deflate`:return{body:await ot(e),encoding:`identity`};case`br`:return{body:await it(e),encoding:`identity`};case`zstd`:return{body:await rt(e),encoding:`identity`}}}catch{}return{body:e,encoding:t}}let nt=null;async function rt(e){if(z.zstdDecompress)return new Promise((t,n)=>{z.zstdDecompress(e,(e,r)=>{e?n(e):t(r)})});if(!nt){let{ZstdCodec:e}=await import(`zstd-codec`);nt=await new Promise(t=>{e.run(e=>{t(new e.Streaming)})})}return nt.decompress(e,e.length)}async function it(e){return new Promise((t,n)=>{z.brotliDecompress(e,(e,r)=>{e?n(e):t(r)})})}async function at(e){return new Promise((t,n)=>{z.gunzip(e,(e,r)=>{e?n(e):t(r)})})}async function ot(e){return new Promise((t,n)=>{z.inflate(e,(e,r)=>{e?n(e):t(r)})})}const st=new Intl.DateTimeFormat(`en-US`,{year:`numeric`,month:`numeric`,day:`numeric`,hour:`numeric`,minute:`numeric`,second:`numeric`,hour12:!1});function ct(e,t,n){let{query:r}=U(e.url),i=e.method.toUpperCase(),o=(e.headers[`content-type`]||``).split(`;`)[0].trim();return o.startsWith(`multipart/form-data`)&&d(n)&&(n={...n},h(n).forEach(e=>{let t=n[e];d(t)&&a(t,`filepath`)&&a(t,`mimetype`)&&delete n[e]})),O.isBuffer(n)&&(n=n.toString(),o=`buffer`),{method:i,pathname:t,query:r,bodyType:o,body:n}}async function lt(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&&!et.includes(e)&&(i[t]=String(n))}let a=fe(i[`content-type`]||``);if(a){let{body:e,encoding:n}=await tt(t,i[`content-encoding`]||``);t=O.from(e),i[`content-encoding`]=n}return{status:n,statusText:r,headers:i,body:t.toString(a?`utf-8`:`base64`)}}function ut(e,t){if(e.pathname!==t.pathname||e.method!==t.method||e.bodyType!==t.bodyType||!r(e.query,t.query))return!1;if(t.bodyType===`buffer`&&e.bodyType===`buffer`){let n=O.from(t.body),r=O.from(e.body);if(n.length!==r.length||!n.equals(r))return!1}return!!r(e.body,t.body)}function dt(e){if(l(e))return e;let{mode:t=`glob`}=e,n=S(e.include),r=S(e.exclude);if(t===`glob`){let{isMatch:e}=oe(n,r);return t=>e(t.pathname)}return e=>n.some(t=>H(t,e.pathname))&&r.every(t=>!H(t,e.pathname))}function ft(e,t){return j.join(t,`${m(e)}.json`)}const X=new Map;async function pt(e){if(X.has(e))return X.get(e);try{if(!N.existsSync(e))return[];let t=await N.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 mt(e,t){try{X.set(e,t),await N.promises.mkdir(j.dirname(e),{recursive:!0}),await N.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 ht(e,t,n){Z.set(e,{body:n,pathname:t,timestamp:Date.now()})}var gt=class{options;filter;constructor(e){this.options=e,this.filter=dt(e.filter)}setup(e){let t=this.options;if(!e.server||!t.enabled)return;let n=this.record.bind(this),r=e.server.proxy||{};h(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,O.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=ct(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:st.format(a),referer:e.headers.referer||`unknown`},req:o,res:await lt(t,n)},p=ft(i,c);f.meta.filepath=p;let m=j.join(s,p),h=(await pt(m)).filter(e=>a-e.meta.timestamp<=u),g=h.findIndex(e=>ut(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 mt(m,h)}async addGitignore(){let e=this.options;if(!e.gitignore)return;let t=j.join(e.cwd,e.dir);await P.mkdir(t,{recursive:!0}),N.existsSync(j.join(t,`.gitignore`))||await P.writeFile(j.join(t,`.gitignore`),`*
2
+ `,`utf-8`)}};async function _t(e,t,n,r){let i=ct(e,t,n),a=j.join(r.cwd,ft(i.pathname,r.dir)),o=Date.now(),s=(await pt(a)).filter(e=>o-e.meta.timestamp<r.expires&&ut(e.req,i)),c;if(c=r.status.length===0?s.find(e=>e.res.status===200)||s[0]:s.find(e=>r.status.includes(e.res.status)),c){let e=fe(c.res.headers[`content-type`]||``);return{url:c.req.pathname,status:c.res.status,statusText:c.res.statusText,headers:c.res.headers,body:O.from(c.res.body,e?`utf-8`:`base64`),type:`buffer`,__filepath__:c.meta.filepath}}}const vt=new WeakMap;function yt(e){let t=[];e.addListener(`data`,e=>{t?.push(O.from(e))}),e.addListener(`end`,()=>{t?.length&&vt.set(e,O.concat(t)),t=null})}function bt(e){if(!e.server)return;let t=e.server.proxy||{};h(t).forEach(e=>{let n=t[e],r=p(n)?{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=vt.get(t);n&&(vt.delete(t),e.headersSent||e.setHeader(`Content-Length`,n.byteLength),e.writableEnded||e.write(n))})}}})}function xt(e){return re[e]||`Unknown`}function Q(e,t=200,n){e.statusCode=t,e.statusMessage=n||xt(t)}async function St(e,t,r,i){let{headers:a,type:o=`json`}=r,s=r.__filepath__,c=ie.contentType(o)||ie.contentType(ie.lookup(o)||``);if(c&&t.setHeader(`Content-Type`,c),t.setHeader(`Cache-Control`,`no-cache,max-age=0`),t.setHeader(`X-Mock-Power-By`,`vite-plugin-mock-dev-server`),s&&t.setHeader(`X-File-Path`,s),!a)return;let[u,d]=await n(async()=>l(a)?await a(e):a);if(u){i.error(`${M.red(`mock error at ${e.url.split(`?`)[0]}`)}\n${u}\n at headers (${M.underline(s)})`,r.log);return}h(d).forEach(e=>t.setHeader(e,d[e]))}async function Ct(e,t,r,i){let{cookies:a}=r;if(!a)return;let[s,c]=await n(async()=>l(a)?await a(e):a);if(s){let t=r.__filepath__;i.error(`${M.red(`mock error at ${e.url.split(`?`)[0]}`)}\n${s}\n at cookies (${M.underline(t)})`,r.log);return}h(c).forEach(e=>{let n=c[e],[r,i]=o(n)?n:[n];t.setCookie(e,r,i)})}function wt(e,t,n){if(ue(t))t.pipe(e);else if(O.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`?O.from(r):r)}}async function Tt(e,t){if(!t||typeof t==`number`&&t<=0||o(t)&&t.length!==2)return;let n=0;if(o(t)){let[e,r]=t;n=_(e,r)}else n=t-(x()-e);n>0&&await y(n)}function Et(e,{formidableOptions:t={},bodyParserOptions:r={},proxies:i,cookiesOptions:a,logger:o,priority:s={},cors:c,record:d,replay:f,activeScene:p}){let m=Ee(c);return async function(c,h,g){let _=x(),{query:v,pathname:y}=U(c.url);if(!y||i.length===0||!i.some(e=>ce(e,c.url)))return g();let b=e.mockData,C=Le(Object.keys(b),y,s);if(C.length===0&&!d.enabled)return g();yt(c);let w=new Xe(c,h,a),T,E,D=c.method.toUpperCase(),O={query:v,refererQuery:c.headers.referer?U(c.headers.referer).query:{},body:await De(c,o,t,r),headers:c.headers,getCookie:w.get.bind(w)},k=c.headers[`x-mock-scene`],ee=k?S(k).map(e=>e.split(`,`).map(e=>e.trim())).flat().filter(Boolean):p;for(let e of C)if(T=Ne(b[e],o,{pathname:y,method:D,request:O,activeScene:ee}),T){E=e;break}if(f&&!T&&(T=await _t(c,y,O.body,d)),!T){d.enabled&&ht(c,y,O.body);let e=C.map(e=>e===E?M.underline.bold(e):M.dim(e)).join(`, `);return e.length&&o.warn(`${M.green(y)} matches ${e}, but mock data is not found.`),g()}if(m){let[e]=await n(m,c,h);if(e)return o.error(`CORS error: ${e}`),g(e)}let A=c,j=h;Object.assign(A,O),A.params=W(T.url,y),j.setCookie=w.set.bind(w);let{delay:te,type:ne=`json`,response:N,log:P,error:F,__filepath__:I}=T,{body:L,status:R=200,statusText:z}=T,re=F&&(F.probability??.5)>Math.random();if(re&&(R=F.status??500,z=F.statusText,L=F.body),Q(j,R,z),await St(A,j,T,o),await Ct(A,j,T,o),o.info(Me(A,I,re),P),o.debug(`${M.magenta(`DEBUG`)} ${M.underline(y)} matches: [ ${C.map(e=>e===E?M.underline.bold(e):M.dim(e)).join(`, `)} ]\n`),!u(L)){let[e]=await n(async()=>{let e=l(L)?await L(A):L;await Tt(_,te),wt(j,e,ne)});e&&(o.error(`${M.red(`mock error at ${y}`)}\n ${e}\n at body (${M.underline.gray(I)})`,P),Q(j,500),h.end(``));return}if(N){let[e]=await n(async()=>{await Tt(_,te),await N(A,j,g)});e&&(o.error(`${M.red(`mock error at ${y}`)}\n ${e}\n at response (${M.underline.gray(I)})`,P),Q(j,500),h.end(``));return}h.end(``)}}function Dt(e,t,{wsProxies:n,cookiesOptions:r,logger:a,activeScene:o}){let s=new Map,c=new Map,l=new WeakMap,u=e=>{let t=c.get(e);return t||c.set(e,t=new Map),t},d=(e,t)=>{let n=e.get(t);return n||e.set(t,n=new ae({noServer:!0})),n},f=(e,t)=>{let n=s.get(e);n||s.set(e,n=new Set),n.add(t)},p=(e,t,n,r,i,o)=>{try{n.setup?.(t,r),t.on(`close`,()=>e.delete(i)),t.on(`error`,e=>{a.error(`${M.red(`WebSocket mock error at ${t.path}`)}\n${e}\n at setup (${o})`,n.log)})}catch(e){a.error(`${M.red(`WebSocket mock error at ${t.path}`)}\n${e}\n at setup (${o})`,n.log)}},m=(e,t,n,r)=>{e.emit(`connection`,t,n),t.on(`close`,()=>{i(r,e=>e.ws===t,e=>v(r,e))})},g=(e,t,n,r,i)=>{let{cleanupList:a,connectionList:o,context:s}=l.get(t);Ot(a),o.forEach(({ws:e})=>e.removeAllListeners()),t.removeAllListeners(),p(e,t,n,s,r,i),o.forEach(({ws:e,req:n})=>m(t,e,n,o))};e.on?.(`mock:update-end`,t=>{if(!s.has(t))return;let n=s.get(t);if(n)for(let r of n.values())for(let n of e.mockData[r]){if(!n.ws||n.__filepath__!==t)continue;let e=u(r);for(let[r,i]of e.entries())g(e,i,n,r,t);return}});let _=S(o);t?.on(`upgrade`,(t,i,o)=>{let{pathname:s,query:c}=U(t.url);if(!s||n.length===0||!n.some(e=>ce(e,t.url)))return;let g=e.mockData,v=h(g).find(e=>H(e,s));if(!v)return;let y=g[v].find(e=>e.url&&e.ws&&he(_,e.scene)&&H(e.url,s));if(!y)return;let b=y.__filepath__;f(b,v);let x=u(v),S=d(x,s),C=l.get(S);if(!C){let e=[],t={onCleanup:t=>e.push(t)};C={cleanupList:e,context:t,connectionList:[]},l.set(S,C),p(x,S,y,t,s,b)}let w=t,T=new Xe(t,t,r),{query:E}=U(t.headers.referer||``);w.query=c,w.refererQuery=E,w.params=W(v,s),w.getCookie=T.get.bind(T),S.handleUpgrade(w,i,o,e=>{a.info(`${M.magenta.bold(`WebSocket`)} ${M.green(t.url)} connected ${M.dim(`(${b})`)}`,y.log),C.connectionList.push({req:w,ws:e}),m(S,e,w,C.connectionList)})}),t?.on(`close`,()=>{for(let e of c.values()){for(let t of e.values())Ot(l.get(t).cleanupList),t.close();e.clear()}c.clear(),s.clear()})}function Ot(e){let t;for(;t=e.shift();)t?.()}const $={silent:0,error:1,warn:2,info:3,debug:4};function kt(e,t=`info`){e=`[${e}]`;function n(n,r,i){if(i=s(i)?i?t:`error`:i,$[i]>=$[n]){let t=n===`info`||n===`debug`?`log`:n,i=n===`debug`?M.magenta.bold(e):n===`info`?M.cyan.bold(e):n===`warn`?M.yellow.bold(e):M.red.bold(e),a=`${M.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{bt as a,Se as c,xe as d,be as f,Et as i,we as l,oe as m,$ as n,gt as o,de as p,Dt as r,Ce as s,kt as t,ge as u};
@@ -1,4 +1,4 @@
1
- import { c as LogLevel, f as MockServerPluginOptions, n as MockOptions, o as MockHttpItem, p as ServerBuildOption, r as MockWebsocketItem, y as ResolvedRecordOptions } from "./index-HOrR1VyK.js";
1
+ import { c as LogLevel, f as MockServerPluginOptions, n as MockOptions, o as MockHttpItem, p as ServerBuildOption, r as MockWebsocketItem, y as ResolvedRecordOptions } from "./index-BmZUk72e.js";
2
2
  import { Matcher } from "picomatch";
3
3
  import EventEmitter from "node:events";
4
4
  import { CorsOptions } from "cors";
@@ -56,13 +56,14 @@ declare const logLevels: Record<LogLevel, number>;
56
56
  declare function createLogger(prefix: string, defaultLevel?: LogLevel): Logger;
57
57
  //#endregion
58
58
  //#region src/core/options.d.ts
59
- type ResolvedMockServerPluginOptions = Required<Omit<MockServerPluginOptions, "build" | "cors" | "wsPrefix" | "prefix" | "record">> & {
59
+ type ResolvedMockServerPluginOptions = Required<Omit<MockServerPluginOptions, "build" | "cors" | "wsPrefix" | "prefix" | "record" | "activeScene">> & {
60
60
  context: string;
61
61
  logger: Logger;
62
62
  alias: Alias[];
63
63
  define: Record<string, any>;
64
64
  proxies: string[];
65
65
  wsProxies: string[];
66
+ activeScene: string[];
66
67
  build: false | ServerBuildOption;
67
68
  cors: false | CorsOptions;
68
69
  record: ResolvedRecordOptions;
@@ -212,7 +213,7 @@ declare class Compiler extends EventEmitter {
212
213
  }
213
214
  //#endregion
214
215
  //#region src/mockHttp/middleware.d.ts
215
- interface CreateMockMiddlewareOptions extends Pick<ResolvedMockServerPluginOptions, "formidableOptions" | "cookiesOptions" | "bodyParserOptions" | "priority" | "record" | "replay"> {
216
+ interface CreateMockMiddlewareOptions extends Pick<ResolvedMockServerPluginOptions, "formidableOptions" | "cookiesOptions" | "bodyParserOptions" | "priority" | "record" | "replay" | "activeScene"> {
216
217
  proxies: string[];
217
218
  logger: Logger;
218
219
  cors: false | CorsOptions;
@@ -233,6 +234,7 @@ interface CreateMockMiddlewareOptions extends Pick<ResolvedMockServerPluginOptio
233
234
  * @param options.cors - CORS options / CORS 配置项
234
235
  * @param options.record - Record options / 录制配置项
235
236
  * @param options.replay - Replay options / 回放配置项
237
+ * @param options.activeScene - Active scene / 活动场景
236
238
  *
237
239
  * @returns Connect middleware function / Connect 中间件函数
238
240
  */
@@ -245,7 +247,8 @@ declare function createMockMiddleware(compiler: Compiler, {
245
247
  priority,
246
248
  cors: corsOptions,
247
249
  record,
248
- replay
250
+ replay,
251
+ activeScene
249
252
  }: CreateMockMiddlewareOptions): Connect.NextHandleFunction;
250
253
  //#endregion
251
254
  //#region src/mockWebsocket/server.d.ts
@@ -260,11 +263,13 @@ declare function createMockMiddleware(compiler: Compiler, {
260
263
  * @param options.wsProxies - WebSocket proxy prefixes / WebSocket 代理前缀
261
264
  * @param options.cookiesOptions - Cookies options / Cookies 配置项
262
265
  * @param options.logger - Logger instance / 日志实例
266
+ * @param options.activeScene - Active scene / 当前场景
263
267
  */
264
268
  declare function mockWebSocket(compiler: Compiler, server: Server | Http2SecureServer | null, {
265
269
  wsProxies: proxies,
266
270
  cookiesOptions,
267
- logger
271
+ logger,
272
+ activeScene
268
273
  }: ResolvedMockServerPluginOptions): void;
269
274
  //#endregion
270
275
  export { processRawData as a, Logger as c, processMockData as i, createLogger as l, CreateMockMiddlewareOptions as n, sortByValidator as o, createMockMiddleware as r, mockDevServerPlugin as s, mockWebSocket as t, logLevels as u };
package/dist/server.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- 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 "./server-ypJ-wM5S.js";
1
+ 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 "./server-a8HL1JRZ.js";
2
2
  export { CreateMockMiddlewareOptions, Logger, createLogger, createMockMiddleware, logLevels, mockWebSocket, processMockData, processRawData, sortByValidator };
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-B6gUVmAa.js";export{o as createLogger,t as createMockMiddleware,r as logLevels,i as mockWebSocket,a as processMockData,e as processRawData,n as sortByValidator};
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-B4Hh46_a.js";export{o as createLogger,t as createMockMiddleware,r as logLevels,i as mockWebSocket,a as processMockData,e as processRawData,n as sortByValidator};
package/dist/types.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { C as MockRequest, D as GetCookieOption, E as CookiesOption, O as SetCookieOption, S as Method, T as ResponseBody, _ as RecordedRequest, a as MockErrorConfig, b as ExtraRequest, c as LogLevel, d as MockMatchSpecialPriority, f as MockServerPluginOptions, g as RecordedReq, h as RecordedMeta, i as WebSocketSetupContext, l as LogType, m as RecordOptions, n as MockOptions, o as MockHttpItem, p as ServerBuildOption, r as MockWebsocketItem, s as BodyParserOptions, t as FormidableFile, u as MockMatchPriority, v as RecordedRes, w as MockResponse, x as Headers, y as ResolvedRecordOptions } from "./index-HOrR1VyK.js";
1
+ import { C as MockRequest, D as GetCookieOption, E as CookiesOption, O as SetCookieOption, S as Method, T as ResponseBody, _ as RecordedRequest, a as MockErrorConfig, b as ExtraRequest, c as LogLevel, d as MockMatchSpecialPriority, f as MockServerPluginOptions, g as RecordedReq, h as RecordedMeta, i as WebSocketSetupContext, l as LogType, m as RecordOptions, n as MockOptions, o as MockHttpItem, p as ServerBuildOption, r as MockWebsocketItem, s as BodyParserOptions, t as FormidableFile, u as MockMatchPriority, v as RecordedRes, w as MockResponse, x as Headers, y as ResolvedRecordOptions } from "./index-BmZUk72e.js";
2
2
  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/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.2",
4
+ "version": "2.2.1",
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.6.0",
67
+ "@pengzhanbo/utils": "^3.7.2",
68
68
  "ansis": "^4.2.0",
69
69
  "chokidar": "^5.0.0",
70
70
  "co-body": "^6.2.0",
@@ -72,7 +72,7 @@
72
72
  "debug": "^4.4.3",
73
73
  "formidable": "3.5.4",
74
74
  "http-status": "^2.1.0",
75
- "is-core-module": "^2.16.1",
75
+ "is-core-module": "^2.16.2",
76
76
  "json5": "^2.2.3",
77
77
  "local-pkg": "^1.1.2",
78
78
  "mime-types": "^3.0.2",
@@ -83,8 +83,8 @@
83
83
  },
84
84
  "devDependencies": {
85
85
  "esbuild": "^0.28.0",
86
- "rolldown": "^1.0.0-rc.18",
87
- "vite": "^8.0.10",
86
+ "rolldown": "^1.0.0",
87
+ "vite": "^8.0.11",
88
88
  "zstd-codec": "^0.1.5"
89
89
  },
90
90
  "publishConfig": {
@@ -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: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};