vite-plugin-mock-dev-server 2.1.0 → 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/helper.d.ts CHANGED
@@ -1,5 +1,4 @@
1
- import { C as MockResponse, D as SetCookieOption, E as GetCookieOption, S as MockRequest, T as CookiesOption, _ as RecordedRes, a as MockHttpItem, b as Headers, c as LogType, d as MockServerPluginOptions, f as ServerBuildOption, g as RecordedRequest, h as RecordedReq, i as MockErrorConfig, l as MockMatchPriority, m as RecordedMeta, n as MockWebsocketItem, o as BodyParserOptions, p as RecordOptions, r as WebSocketSetupContext, s as LogLevel, t as MockOptions, u as MockMatchSpecialPriority, v as ResolvedRecordOptions, w as ResponseBody, x as Method, y as ExtraRequest } from "./config-7dnQWJSY.js";
2
- import { FormidableFile } from "./types.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-HOrR1VyK.js";
3
2
  import { IncomingMessage, OutgoingHttpHeaders, ServerResponse } from "node:http";
4
3
  import { Transform } from "node:stream";
5
4
 
@@ -242,6 +241,21 @@ declare function createDefineMock(transformer: (mock: MockHttpItem | MockWebsock
242
241
  //#endregion
243
242
  //#region src/helpers/defineMockData.d.ts
244
243
  /**
244
+ * Options for defineMockData
245
+ *
246
+ * defineMockData 的选项
247
+ */
248
+ interface DefineMockDataOptions {
249
+ /**
250
+ * Whether to persist the data value on HMR (Hot Module Replacement).
251
+ *
252
+ * 热更新时是否保持数据值
253
+ *
254
+ * @default false
255
+ */
256
+ persistOnHMR?: boolean;
257
+ }
258
+ /**
245
259
  * Mock data type with getter, setter, and value property
246
260
  *
247
261
  * 带有 getter、setter 和 value 属性的 Mock 数据类型
@@ -264,8 +278,9 @@ type MockData<T = any> = readonly [() => T, (val: T | ((val: T) => T | void)) =>
264
278
  * @template T - Type of mock data / Mock 数据的类型
265
279
  * @param key - Unique key for mock data / Mock 数据的唯一键
266
280
  * @param initialData - Initial data value / 初始数据值
281
+ * @param options - Options / 选项
267
282
  * @returns MockData object with getter, setter, and value property / 带有 getter、setter 和 value 属性的 MockData 对象
268
283
  */
269
- declare function defineMockData<T = any>(key: string, initialData: T): MockData<T>;
284
+ declare function defineMockData<T = any>(key: string, initialData: T, options?: DefineMockDataOptions): MockData<T>;
270
285
  //#endregion
271
- export { BodyParserOptions, CookiesOption, ExtraRequest, FormidableFile, GetCookieOption, HeaderStream, Headers, LogLevel, LogType, Method, MockData, MockErrorConfig, MockHttpItem, MockMatchPriority, MockMatchSpecialPriority, MockOptions, MockRequest, MockResponse, MockServerPluginOptions, MockWebsocketItem, RecordOptions, RecordedMeta, RecordedReq, RecordedRequest, RecordedRes, ResolvedRecordOptions, ResponseBody, SSEMessage, ServerBuildOption, SetCookieOption, WebSocketSetupContext, createDefineMock, createSSEStream, defineMock, defineMockData };
286
+ export { BodyParserOptions, CookiesOption, DefineMockDataOptions, ExtraRequest, FormidableFile, GetCookieOption, HeaderStream, Headers, LogLevel, LogType, Method, MockData, MockErrorConfig, MockHttpItem, MockMatchPriority, MockMatchSpecialPriority, MockOptions, MockRequest, MockResponse, MockServerPluginOptions, MockWebsocketItem, RecordOptions, RecordedMeta, RecordedReq, RecordedRequest, RecordedRes, ResolvedRecordOptions, ResponseBody, SSEMessage, ServerBuildOption, SetCookieOption, WebSocketSetupContext, createDefineMock, createSSEStream, defineMock, defineMockData };
package/dist/helper.js CHANGED
@@ -1,4 +1,4 @@
1
- import{deepClone as e,deepEqual as t,isArray as n,isFunction as r}from"@pengzhanbo/utils";import{Transform as i}from"node:stream";var a=class extends i{constructor(e){super({objectMode:!0}),e.socket.setKeepAlive(!0),e.socket.setNoDelay(!0),e.socket.setTimeout(0)}pipe(e,t){return e.writeHead&&(e.writeHead(200,{"Content-Type":`text/event-stream; charset=utf-8`,"Transfer-Encoding":`identity`,"Cache-Control":`no-cache`,Connection:`keep-alive`}),e.flushHeaders?.()),e.write(`:ok
1
+ import{deepClone as e,isArray as t,isFunction as n}from"@pengzhanbo/utils";import{createHash as r}from"node:crypto";import{Transform as i}from"node:stream";var a=class extends i{constructor(e){super({objectMode:!0}),e.socket.setKeepAlive(!0),e.socket.setNoDelay(!0),e.socket.setTimeout(0)}pipe(e,t){return e.writeHead&&(e.writeHead(200,{"Content-Type":`text/event-stream; charset=utf-8`,"Transfer-Encoding":`identity`,"Cache-Control":`no-cache`,Connection:`keep-alive`}),e.flushHeaders?.()),e.write(`:ok
2
2
 
3
3
  `),super.pipe(e,t)}_transform(e,t,n){e.comment&&this.push(`: ${e.comment}\n`),e.event&&this.push(`event: ${e.event}\n`),e.id&&this.push(`id: ${e.id}\n`),e.retry&&this.push(`retry: ${e.retry}\n`),e.data&&this.push(o(e.data)),this.push(`
4
- `),n()}write(e,...t){return super.write(e,...t)}destroy(e){return e&&this.write({event:`error`,data:e.message}),this.end(),this}};function o(e){return typeof e==`object`?o(JSON.stringify(e)):e.split(/\r\n|\r|\n/).map(e=>`data: ${e}\n`).join(``)}function s(e,t){let n=new a(e);return n.pipe(t),n}function c(e){return e}function l(e){return t=>(t=n(t)?t.map(t=>e(t)||t):e(t)||t,t)}const u=new Map,d=new WeakMap;var f=class{value;#e;#t;constructor(t){this.value=t,this.#e=e(t),this.#t=Date.now()}hotUpdate(n){Date.now()-this.#t<70||t(n,this.#e)||(this.value=n,this.#e=e(n),this.#t=Date.now())}};function p(e,t){let n=u.get(e);if(!n){let r=new f(t),i=u.get(e);i?n=i:(u.set(e,r),n=r)}if(n.hotUpdate(t),d.has(n))return d.get(n);let i=[()=>n.value,e=>{r(e)&&(e=e(n.value)??n.value),n.value=e}];return Object.defineProperty(i,`value`,{get(){return n.value},set(e){n.value=e}}),d.set(n,i),i}export{l as createDefineMock,s as createSSEStream,c as defineMock,p as defineMockData};
4
+ `),n()}write(e,...t){return super.write(e,...t)}destroy(e){return e&&this.write({event:`error`,data:e.message}),this.end(),this}};function o(e){return typeof e==`object`?o(JSON.stringify(e)):e.split(/\r\n|\r|\n/).map(e=>`data: ${e}\n`).join(``)}function s(e,t){let n=new a(e);return n.pipe(t),n}function c(e){return e}function l(e){return n=>(n=t(n)?n.map(t=>e(t)||t):e(n)||n,n)}const u=new Map,d=new WeakMap;var f=class{value;#e;#t;#n;constructor(e,t){this.value=e,this.#e=m(e),this.#t=Date.now(),this.#n=t??!1}hotUpdate(t){if(this.#n||Date.now()-this.#t<70)return;let n=m(t);this.#e!==n&&(this.value=e(t),this.#e=n,this.#t=Date.now())}setPersistOnHMR(e){this.#n||=e}};function p(e,t,r){let i=u.get(e);if(i)i.setPersistOnHMR(r?.persistOnHMR??!1);else{let n=new f(t,r?.persistOnHMR),a=u.get(e);a?i=a:(u.set(e,n),i=n)}if(i.hotUpdate(t),d.has(i))return d.get(i);let a=[()=>i.value,e=>{n(e)&&(e=e(i.value)??i.value),i.value=e}];return Object.defineProperty(a,`value`,{get(){return i.value},set(e){i.value=e}}),d.set(i,a),a}function m(e){return r(`sha256`).update(JSON.stringify(e)).digest(`hex`)}export{l as createDefineMock,s as createSSEStream,c as defineMock,p as defineMockData};
@@ -1027,4 +1027,7 @@ interface WebSocketSetupContext {
1027
1027
  //#region src/types/config.d.ts
1028
1028
  type MockOptions = (MockHttpItem | MockWebsocketItem)[];
1029
1029
  //#endregion
1030
- export { MockResponse as C, SetCookieOption as D, GetCookieOption as E, MockRequest as S, CookiesOption as T, RecordedRes as _, MockHttpItem as a, Headers as b, LogType as c, MockServerPluginOptions as d, ServerBuildOption as f, RecordedRequest as g, RecordedReq as h, MockErrorConfig as i, MockMatchPriority as l, RecordedMeta as m, MockWebsocketItem as n, BodyParserOptions as o, RecordOptions as p, WebSocketSetupContext as r, LogLevel as s, MockOptions as t, MockMatchSpecialPriority as u, ResolvedRecordOptions as v, ResponseBody as w, Method as x, ExtraRequest as y };
1030
+ //#region src/types/index.d.ts
1031
+ type FormidableFile = formidable.File | formidable.File[];
1032
+ //#endregion
1033
+ export { MockRequest as C, GetCookieOption as D, CookiesOption as E, SetCookieOption as O, Method as S, ResponseBody as T, RecordedRequest as _, MockErrorConfig as a, ExtraRequest as b, LogLevel as c, MockMatchSpecialPriority as d, MockServerPluginOptions as f, RecordedReq as g, RecordedMeta as h, WebSocketSetupContext as i, LogType as l, RecordOptions as m, MockOptions as n, MockHttpItem as o, ServerBuildOption as p, MockWebsocketItem as r, BodyParserOptions as s, FormidableFile as t, MockMatchPriority as u, RecordedRes as v, MockResponse as w, Headers as x, ResolvedRecordOptions as y };
package/dist/index.d.ts CHANGED
@@ -1,6 +1,4 @@
1
- import { C as MockResponse, D as SetCookieOption, E as GetCookieOption, S as MockRequest, T as CookiesOption, _ as RecordedRes, a as MockHttpItem, b as Headers, c as LogType, d as MockServerPluginOptions, f as ServerBuildOption, g as RecordedRequest, h as RecordedReq, i as MockErrorConfig, l as MockMatchPriority, m as RecordedMeta, n as MockWebsocketItem, o as BodyParserOptions, p as RecordOptions, r as WebSocketSetupContext, s as LogLevel, t as MockOptions, u as MockMatchSpecialPriority, v as ResolvedRecordOptions, w as ResponseBody, x as Method, y as ExtraRequest } from "./config-7dnQWJSY.js";
2
- import { FormidableFile } from "./types.js";
3
- import { HeaderStream, MockData, SSEMessage, createDefineMock, createSSEStream, defineMock, defineMockData } from "./helper.js";
4
- 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 "./index-x4QPVyiP.js";
5
- import "./server.js";
6
- export { BodyParserOptions, CookiesOption, CreateMockMiddlewareOptions, 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 };
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";
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";
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"./logger-C-7qpBNh.js";import{createDefineMock as p,createSSEStream as m,defineMock as h,defineMockData as g}from"./helper.js";import"./server.js";import _ from"node:process";import{isArray as ee,isBoolean as v,promiseParallel as y,toArray as b,uniq as x}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 E,{promises as D}from"node:fs";import O from"node:events";import{watch as k}from"chokidar";import{getPackageInfoSync as A,loadPackageJSON as j,loadPackageJSONSync as M}from"local-pkg";import{glob as N}from"tinyglobby";import P from"ansis";import te from"is-core-module";function ne(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`?ie(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`]=re({...o,...i})),c}function re(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 ie(e){try{return JSON.parse(e),!0}catch{return!1}}const ae={name:`externalize-deps`,setup(e){e.onResolve({filter:/.*/},({path:e})=>{if(e[0]!==`.`&&!S.isAbsolute(e))return{external:!0}})}},oe={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`}})}},I={name:`json-loader`,setup(e){e.onLoad({filter:/\.json$/},async({path:e})=>({contents:`export default ${await w.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: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 V())({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:[R(i),L,ae,I,oe],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 U({filepath:e,code:t,isESM:n,cwd:r}){e=S.resolve(r,e);let i=n?`.mjs`:`.cjs`,a=`${e}.timestamp-${Date.now()}${i}`,o=C(a).toString();await D.writeFile(a,t,`utf8`);try{let e=await import(o);return e.default||e}finally{try{E.unlinkSync(a)}catch{}}}const W={name:`vite-mock:rename-plugin`,resolveId(e){if(e===`vite-plugin-mock-dev-server`)return{id:`vite-plugin-mock-dev-server/helper`,external:!0}}},G={name:`vite-mock:json5-plugin`,transform:{filter:{id:/\.json5$/},handler:e=>({code:`export default ${T.stringify(T.parse(e))}`})}};let K=null;async function se(){return K||={build:(await import(`rolldown`)).build,aliasPlugin:(await import(`rolldown/experimental`)).viteAliasPlugin},K}async function ce(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})=>z(t,e));try{let{build:u,aliasPlugin:d}=await se(),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}),W,G],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].imports.map(n)}}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 ce(e,t);if(q===`esbuild`)return H(e,t);throw Error(`rolldown or esbuild not found`)}async function le(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 U({filepath:e,code:r,isESM:n,cwd:t.cwd||_.cwd()})||{},deps:i}}var ue=class extends O{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{this.isESM=M(this.cwd)?.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=>y(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 le(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=k(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=k([...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 ue(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},y){let S=n||_.cwd(),C=d(`vite:mock`,v(s)?s?`info`:`error`:s),{httpProxies:w}=de(y.server.proxy||{}),T=x([...b(e),...w]),E=b(t);!T.length&&!E.length&&C.warn(`No proxy was configured, mock server will not work. See ${P.cyan(`https://vite-plugin-mock-dev-server.netlify.app/guide/usage`)}`);let D=c===!1?!1:y.server.cors!==!1,O={};D&&y.server.cors!==!1&&(O={...O,...typeof y.server.cors==`boolean`?{}:y.server.cors}),D&&c!==!1&&(O={...O,...typeof c==`boolean`?{}:c});let k=[],A=y.resolve.alias||[];ee(A)?k.push(...A):Object.entries(A).forEach(([e,t])=>{k.push({find:e,replacement:t})});let j=Z(S,r,h);return{cwd:S,dir:r,include:i,exclude:a,context:y.root,reload:o,cors:D?O:!1,cookiesOptions:f,log:s,formidableOptions:{multiples:!0,...l},bodyParserOptions:p,priority:m,build:u?{serverPort:8080,dist:`mockServer`,log:`error`,includeRecord:g??j.enabled??!1,...typeof u==`object`?u:{}}:!1,proxies:T,wsProxies:E,logger:C,alias:k,define:ne(y),record:j,replay:g??j.enabled??!1}}function de(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:b(r?.status).map(Number),expires:i===0?2**53-1:i*1e3,gitignore:r?.gitignore??!0,filter:r?.filter||(()=>!0)}}async function fe(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,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`,pe=`2.1.0`;function me(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=he(e);t.startsWith(`<define:`)||i(t)||te(t)||t[0]===`/`||t.startsWith(`./`)||t.startsWith(`../`)||r.includes(t)||n.add(t)}),Array.from(n)}function he(e){let[t,n]=e.split(`/`);return t[0]===`@`?`${t}/${n}`:t}function ge(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]:`^${pe}`,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=A(e);a.dependencies[e]=t?.version?`^${t.version}`:`latest`}else a.dependencies[e]=`latest`}return JSON.stringify(a,null,2)}function $({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`,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 _e(e,t){let n=b(t.include),r=b(t.exclude),i=t.cwd||_.cwd(),a=t.dir,o=t.build,s=await j(t.context)||{},c=o.dist,l=await fe(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=me(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:$(t)},{filename:S.join(c,`package.json`),source:ge(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)E.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){E.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 ve(e={}){if(e.enabled===!1)return[];let t=[be(e)];return e.build&&t.push(ye(e)),t}function ye(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 _e(this,n)}}}function be(t){let n;return{name:`vite-plugin-mock-dev-server`,enforce:`pre`,apply:`serve`,config(n){let r=b(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,ve as mockDevServerPlugin,l as mockWebSocket,u as processMockData,t as processRawData,a as sortByValidator};
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};
@@ -1,4 +1,4 @@
1
- import { a as MockHttpItem, d as MockServerPluginOptions, f as ServerBuildOption, n as MockWebsocketItem, s as LogLevel, t as MockOptions, v as ResolvedRecordOptions } from "./config-7dnQWJSY.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-HOrR1VyK.js";
2
2
  import { Matcher } from "picomatch";
3
3
  import EventEmitter from "node:events";
4
4
  import { CorsOptions } from "cors";
@@ -117,13 +117,13 @@ declare class Compiler extends EventEmitter {
117
117
  *
118
118
  * Mock 文件监视器
119
119
  */
120
- private mockWatcher;
120
+ private mockWatcher!;
121
121
  /**
122
122
  * File watcher for dependency files
123
123
  *
124
124
  * 依赖文件监视器
125
125
  */
126
- private depsWatcher;
126
+ private depsWatcher!;
127
127
  /**
128
128
  * Whether the project uses ES modules
129
129
  *
@@ -141,7 +141,7 @@ declare class Compiler extends EventEmitter {
141
141
  *
142
142
  * 解析后的插件配置项
143
143
  */
144
- options: ResolvedMockServerPluginOptions;
144
+ options!: ResolvedMockServerPluginOptions;
145
145
  /**
146
146
  * Constructor
147
147
  *
package/dist/server.d.ts CHANGED
@@ -1,3 +1,2 @@
1
- import "./config-7dnQWJSY.js";
2
- import { a as processRawData, c as Logger, i as processMockData, l as createLogger, n as CreateMockMiddlewareOptions, o as sortByValidator, r as createMockMiddleware, t as mockWebSocket, u as logLevels } from "./index-x4QPVyiP.js";
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";
3
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"./logger-C-7qpBNh.js";export{o as createLogger,t as createMockMiddleware,r as logLevels,i as mockWebSocket,a as processMockData,e as processRawData,n as sortByValidator};
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/dist/types.d.ts CHANGED
@@ -1,7 +1,2 @@
1
- import { C as MockResponse, D as SetCookieOption, E as GetCookieOption, S as MockRequest, T as CookiesOption, _ as RecordedRes, a as MockHttpItem, b as Headers, c as LogType, d as MockServerPluginOptions, f as ServerBuildOption, g as RecordedRequest, h as RecordedReq, i as MockErrorConfig, l as MockMatchPriority, m as RecordedMeta, n as MockWebsocketItem, o as BodyParserOptions, p as RecordOptions, r as WebSocketSetupContext, s as LogLevel, t as MockOptions, u as MockMatchSpecialPriority, v as ResolvedRecordOptions, w as ResponseBody, x as Method, y as ExtraRequest } from "./config-7dnQWJSY.js";
2
- import formidable from "formidable";
3
-
4
- //#region src/types/index.d.ts
5
- type FormidableFile = formidable.File | formidable.File[];
6
- //#endregion
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";
7
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.0",
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.3.1",
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.3.0",
80
- "picomatch": "^4.0.3",
81
- "tinyglobby": "^0.2.15",
82
- "ws": "^8.19.0"
79
+ "path-to-regexp": "^8.4.2",
80
+ "picomatch": "^4.0.4",
81
+ "tinyglobby": "^0.2.16",
82
+ "ws": "^8.20.0"
83
83
  },
84
84
  "devDependencies": {
85
- "esbuild": "^0.27.3",
86
- "rolldown": "^1.0.0-rc.6",
87
- "vite": "^8.0.0-beta.16",
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": {
@@ -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};