vite-plugin-mock-dev-server 2.1.2 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/helper.d.ts +1 -1
- package/dist/{index-HOrR1VyK.d.ts → index-DFfi42My.d.ts} +24 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +3 -3
- package/dist/server-BJ-Z5r-p.js +2 -0
- package/dist/{server-ypJ-wM5S.d.ts → server-CNOA4TyP.d.ts} +10 -5
- package/dist/server.d.ts +1 -1
- package/dist/server.js +1 -1
- package/dist/types.d.ts +1 -1
- package/package.json +1 -1
- package/dist/server-B6gUVmAa.js +0 -2
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-
|
|
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-DFfi42My.js";
|
|
2
2
|
import { IncomingMessage, OutgoingHttpHeaders, ServerResponse } from "node:http";
|
|
3
3
|
import { Transform } from "node:stream";
|
|
4
4
|
|
|
@@ -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
|
|
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-
|
|
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-DFfi42My.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-
|
|
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-CNOA4TyP.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,n as o,o as s,p as c,r as l,s as u,t as d,u as f}from"./server-BJ-Z5r-p.js";import{createDefineMock as p,createSSEStream as m,defineMock as h,defineMockData as g}from"./helper.js";import _ from"node:process";import{attemptAsync as v,isArray as ee,isBoolean as te,promiseParallel as y,toArray as b,uniq as ne}from"@pengzhanbo/utils";import x from"node:path";import{pathToFileURL as S}from"node:url";import C from"node:fs/promises";import w from"json5";import{createHash as T}from"node:crypto";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 re from"is-core-module";function ie(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`?oe(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`]=ae({...o,...i})),c}function ae(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 oe(e){try{return JSON.parse(e),!0}catch{return!1}}const se={name:`externalize-deps`,setup(e){e.onResolve({filter:/.*/},({path:e})=>{if(e[0]!==`.`&&!x.isAbsolute(e))return{external:!0}})}},ce={name:`json5-loader`,setup(e){e.onLoad({filter:/\.json5$/},async({path:e})=>{let t=await C.readFile(e,`utf-8`);return{contents:`export default ${JSON.stringify(w.parse(t))}`,loader:`js`}})}},I={name:`json-loader`,setup(e){e.onLoad({filter:/\.json$/},async({path:e})=>({contents:`export default ${await C.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=x.resolve(a,e),s=x.basename(e),c=x.dirname(o);try{let l=await(await V())({entryPoints:[e],outfile:`out.js`,write:!1,target:[`node20`],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(S(o))}},plugins:[R(i),L,se,I,ce],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=x.resolve(r,e);let i=n?`.mjs`:`.cjs`,a=`${e}.${G(t)}${i}`;await D.writeFile(a,t,`utf8`);let[,o]=await v(W,String(S(a)));return await v(D.unlink,a),o}async function W(e){let t=await import(e);return t.default||t}function G(e){return T(`md5`).update(e).digest(`hex`)}const le={name:`vite-mock:rename-plugin`,resolveId(e){if(e===`vite-plugin-mock-dev-server`)return{id:`vite-plugin-mock-dev-server/helper`,external:!0}}},ue={name:`vite-mock:json5-plugin`,transform:{filter:{id:/\.json5$/},handler:e=>({code:`export default ${w.stringify(w.parse(e))}`})}};let K=null;async function de(){return K||={build:(await import(`rolldown`)).build,aliasPlugin:(await import(`rolldown/experimental`)).viteAliasPlugin},K}async function fe(e,{isESM:t=!0,define:r,alias:i,cwd:a=_.cwd()}){let o=x.resolve(a,e),s=x.basename(e),c=x.dirname(o),l=e=>!!i.find(({find:t})=>z(t,e));try{let{build:u,aliasPlugin:d}=await de(),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(S(o))}}},external(e){if(l(e))return!1;if(e[0]!==`.`&&!x.isAbsolute(e)&&e!==`vite-plugin-mock-dev-server`)return!0},plugins:[d({entries:i}),le,ue],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(x.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 fe(e,t);if(q===`esbuild`)return H(e,t);throw Error(`rolldown or esbuild not found`)}async function pe(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 me=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{let e=M(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:x.join(this.cwd,this.options.dir)}).then(e=>e.map(e=>()=>this.load(n(x.join(this.options.dir,e))))).then(e=>y(e,64)).then(()=>this.updateMockData()).catch(console.error),!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(x.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 pe(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 me(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={},activeScene:h=[],record:g=!1,replay:v},y){let x=n||_.cwd(),S=d(`vite:mock`,te(s)?s?`info`:`error`:s),{httpProxies:C}=he(y.server.proxy||{}),w=ne([...b(e),...C]),T=b(t);!w.length&&!T.length&&S.warn(`No proxy was configured, mock server will not work. See ${P.cyan(`https://vite-plugin-mock-dev-server.netlify.app/guide/usage`)}`);let E=c===!1?!1:y.server.cors!==!1,D={};E&&y.server.cors!==!1&&(D={...D,...typeof y.server.cors==`boolean`?{}:y.server.cors}),E&&c!==!1&&(D={...D,...typeof c==`boolean`?{}:c});let O=[],k=y.resolve.alias||[];ee(k)?O.push(...k):Object.entries(k).forEach(([e,t])=>{O.push({find:e,replacement:t})});let A=Z(x,r,g);return{enabled:!0,cwd:x,dir:r,include:i,exclude:a,context:y.root,reload:o,cors:E?D:!1,cookiesOptions:f,log:s,formidableOptions:{multiples:!0,...l},bodyParserOptions:p,priority:m,build:u?{serverPort:8080,dist:`mockServer`,log:`error`,includeRecord:v??A.enabled??!1,...typeof u==`object`?u:{}}:!1,proxies:w,wsProxies:T,activeScene:b(h),logger:S,alias:O,define:ie(y),record:A,replay:v??A.enabled??!1}}function he(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:x.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 ge(e,t,r,i){let{pattern:a,ignore:o}=c(r,i),s=await N(a,{ignore:o,cwd:x.join(e,t)}),l=``,u=[];return s.forEach((r,i)=>{let a=n(x.join(e,t,r));l+=`import * as m${i} from '${a}';\n`,u.push(`[m${i}, '${n(x.join(t,r))}']`)}),`import { processMockData, processRawData } from 'vite-plugin-mock-dev-server/server';
|
|
2
2
|
${l}
|
|
3
3
|
const exporters = [\n ${u.join(`,
|
|
4
4
|
`)}\n];
|
|
5
5
|
const mockList = exporters.map(([mod, filepath]) => processRawData(mod.default || mod, filepath));
|
|
6
|
-
export default processMockData(mockList);`}var Q=`vite-plugin-mock-dev-server
|
|
6
|
+
export default processMockData(mockList);`}var Q=`vite-plugin-mock-dev-server`,$=`2.2.0`;function _e(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=ve(e);t.startsWith(`<define:`)||i(t)||re(t)||t[0]===`/`||t.startsWith(`./`)||t.startsWith(`../`)||r.includes(t)||n.add(t)}),Array.from(n)}function ve(e){let[t,n]=e.split(`/`);return t[0]===`@`?`${t}/${n}`:t}function ye(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]:`^${$}`,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 be({proxies:e,wsProxies:t,cookiesOptions:n,bodyParserOptions:r,priority:i,build:a,cors:o,record:s,replay:c}){let{serverPort:l,log:u}=a;return`import { createServer } from 'node:http';
|
|
7
7
|
import process from 'node:process';
|
|
8
8
|
import connect from 'connect';
|
|
9
9
|
import { createMockMiddleware, createLogger, mockWebSocket } from 'vite-plugin-mock-dev-server/server';
|
|
@@ -45,4 +45,4 @@ app.use(createMockMiddleware(compiler, {
|
|
|
45
45
|
server.listen(${l});
|
|
46
46
|
|
|
47
47
|
console.log('listen: http://localhost:${l}');
|
|
48
|
-
`}async function
|
|
48
|
+
`}async function xe(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 ge(i,a,n,r),u=x.join(i,`mock-data-${Date.now()}.js`);await C.writeFile(u,l,`utf-8`);let{code:d,deps:f}=await J(u,t),p=_e(f,t.alias);await C.unlink(u);let m=[{filename:x.join(c,`mock-data.js`),source:d},{filename:x.join(c,`index.js`),source:be(t)},{filename:x.join(c,`package.json`),source:ye(s,p)}];if(t.record.enabled&&o.includeRecord){let e=await N(x.join(t.record.dir,`**/*.json`),{cwd:t.cwd,dot:!0});for(let n of e)m.push({filename:x.join(c,n),source:await C.readFile(x.join(t.cwd,n),`utf-8`)})}try{if(x.isAbsolute(c)){for(let{filename:e}of m)E.existsSync(e)&&await C.rm(e);t.logger.info(`${P.green(`✓`)} generate mock server in ${P.cyan(c)}`);for(let{filename:e,source:n}of m){await C.mkdir(x.dirname(e),{recursive:!0}),await C.writeFile(e,n,`utf-8`);let r=(n.length/1024).toFixed(2),i=x.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 Se(e={}){if(e.enabled===!1)return[];let t=[we(e)];return e.build&&t.push(Ce(e)),t}function Ce(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 xe(this,n)}}}function we(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,Se 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,findFirstThen as r,hasOwn as i,isArray as a,isBoolean as o,isEmptyObject as s,isFunction as c,isPlainObject as l,kebabCase as u,objectKeys as d,partition as f,random as p,remove as m,sleep as h,sortBy as g,timestamp as _,toArray as v,uniq as y}from"@pengzhanbo/utils";import b from"picomatch";import{match as x,parse as S,pathToRegexp as C}from"path-to-regexp";import w from"node:os";import T from"node:path";import E from"debug";import{parse as D}from"node:querystring";import O from"node:crypto";import k,{promises as A}from"node:fs";import j from"cors";import M from"ansis";import N from"co-body";import ee from"formidable";import P from"node:http";import{Buffer as F}from"node:buffer";import I from"node:zlib";import L from"http-status";import*as R from"mime-types";import{WebSocketServer as z}from"ws";function B(e,t){let n=[],r=[`**/node_modules/**`,...v(t)];return v(e).forEach(e=>{e[0]===`!`?r.push(e.slice(1)):n.push(e)}),{pattern:n,ignore:r,isMatch:b(n,{ignore:r})}}const V=new Map;function te(e,t){if(e[0]===`^`){let n=V.get(e);return n||V.set(e,n=new RegExp(e)),n.test(t)}return 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 H={};async function ie(e){if(i(H,e))return H[e];try{return import.meta.resolve?H[e]=!!import.meta.resolve(e):(await import(e),H[e]=!0),H[e]}catch{}return H[e]=!1,!1}function ae(e){return[`text`,`json`,`xml`].some(t=>e.includes(t))}function U(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(a(e)&&a(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 l(e)&&l(t)?U(e,t):Object.is(e,t)}const se=new Map;function W(e,t){let n=se.get(e);return n||(n=C(e).regexp,se.set(e,n)),n.test(t)}function ce(e,t){if(!t)return!0;let n=v(t);return e.length===0&&n.length>0?!1:n.length===0?!0:n.some(t=>e.includes(t))}const le=E(`vite:mock-dev-server`),ue=/\\/g,de=w.platform()===`win32`;function fe(e){return e.replace(ue,`/`)}function pe(e){return T.posix.normalize(de?fe(e):e)}function G(e){let t=new URL(e,`http://example.com`);return{pathname:decodeURIComponent(t.pathname),query:D(t.search.replace(/^\?/,``))}}function me(e,t){let n;return a(e)?n=e.map(e=>({...e,__filepath__:t})):`url`in e?n={...e,__filepath__:t}:(n=[],d(e).forEach(r=>{let i=e[r];a(i)?n.push(...i.map(e=>({...e,__filepath__:t}))):n.push({...i,__filepath__:t})})),n}function he(e){let t=[];for(let[,n]of e.entries())n&&t.push(...v(n));let n={};return t.filter(e=>l(e)&&e.enabled!==!1&&e.url).forEach(e=>{let{pathname:t,query:r}=G(e.url),i=n[t]??=[],a={...e,url:t};if(a.ws!==!0){let e=a.validator;s(r)||(c(e)?a.validator=function(t){return U(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)}),d(n).forEach(e=>{n[e]=ge(n[e])}),n}function ge(e){return g(e,e=>{if(e.ws===!0)return 0;let t=v(e.scene).length>0?0:1,{validator:n}=e;return!n||s(n)?2+t:c(n)?0+t:1/Object.keys(n).reduce((e,t)=>e+_e(n[t]),0)+t})}function _e(e){return e?d(e).length:0}function ve(e){let t=e?j(e):void 0;return t?(e,n)=>new Promise((r,i)=>t(e,n,e=>{e?i(e):r()})):void 0}async function ye(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 N.json(e,{limit:c||o,...u});if(a.startsWith(`application/x-www-form-urlencoded`))return await N.form(e,{limit:s||o,...u});if(a.startsWith(`text/plain`))return await N.text(e,{limit:l||o,...u});if(a.startsWith(`multipart/form-data`))return await xe(e,n)}catch(e){t.error(e)}}const be={keepExtensions:!0,filename(e,t,n){return n?.originalFilename||`${e}.${Date.now()}${t?`.${t}`:``}`}};async function xe(e,t){let n=ee({...be,...t});return new Promise((t,r)=>{n.parse(e,(e,n,i)=>{if(e){r(e);return}t({...n,...i})})})}const Se=new Map;function K(e,t){let n=Se.get(e);n||(n=x(e,{decode:decodeURIComponent}),Se.set(e,n));let r=n(t);return r?r.params:{}}function Ce(e,t){return U(e.headers,t.headers)&&U(e.body,t.body)&&U(e.params,t.params)&&U(e.query,t.query)&&U(e.refererQuery,t.refererQuery)}function q(e,t){return!t||s(t)?``:` ${M.gray(`${e}:`)}${JSON.stringify(t)}`}function we(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=q(`query`,a),d=q(`params`,o),f=q(`body`,s),p=n?` 🎲 ${M.bgYellow(`ERR`)}`:``,m=` ${M.dim.underline(`(${t})`)}`;return`${l}${p} ${c}${u}${d}${f}${m}`}function Te(t,n,{pathname:r,method:i,request:o,activeScene:s}){return t.find(t=>{if(!r||!t||!t.url||t.ws||!(t.method?a(t.method)?t.method:[t.method]:[`GET`,`POST`]).includes(i)||!ce(s,t.scene))return!1;let l=W(t.url,r);if(l&&t.validator){let i=K(t.url,r);if(c(t.validator))return t.validator({params:i,...o});{let[a,s]=e(Ce,{params:i,...o},t.validator);if(a){let e=t.__filepath__;return n.error(`${M.red(`mock error at ${r}`)}\n${a}\n at validator (${M.underline(e)})`,t.log),!1}return s}}return l})}const J={};function Y(e){if(J[e])return J[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(S(e).tokens),J[e]=t,t}function Ee(e){let t=e.map(e=>Y(e).length);return t=t.length===0?[1]:t,Math.max(...t)+2}function De(e,t){let n=Y(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 Oe(e){let t=Ee(e);return e.sort((e,n)=>De(e,t)-De(n,t))}function ke(e,t,n){let r=Oe(e.filter(e=>W(e,t))),{global:i=[],special:o={}}=n;if(i.length===0&&s(o)||r.length===0)return r;let[c,l]=f(r,e=>Y(e).filter(e=>e.type!==`text`).length>0),u=i.filter(e=>c.includes(e));if(u.length>0&&(r=y([...l,...u,...c])),s(o))return r;let d=Object.keys(o).filter(e=>r.includes(e))[0];if(!d)return r;let p=o[d],{rules:m,when:h}=a(p)?{rules:p,when:[]}:p;return m.includes(r[0])&&(h.length===0||h.some(e=>C(e).regexp.test(t)))&&(r=y([d,...r])),r}const X=/^[\t\u0020-\u007E\u0080-\u00FF]+$/,Ae=/^(?:low|medium|high)$/i,Z=Object.create(null),je=/[\^$\\.*+?()[\]{}|]/g,Me=/[;=]/,Ne=/;/,Pe=/^(?:lax|none|strict)$/i;var Fe=class{name;value;maxAge;expires;path=`/`;domain;secure=!1;httpOnly=!0;sameSite=!1;overwrite=!1;priority;partitioned;constructor(e,t,n={}){if(!X.test(e)||Me.test(e))throw TypeError(`argument name is invalid`);if(t&&(!X.test(t)||Ne.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&&!X.test(this.path))throw TypeError(`[Cookie] option path is invalid`);if(this.domain&&!X.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&&!Ae.test(this.priority))throw TypeError(`[Cookie] option priority is invalid`);if(this.sameSite&&this.sameSite!==!0&&!Pe.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 Ie(e,t){if(e.length!==t.length)return!1;if(O.timingSafeEqual)return O.timingSafeEqual(e,t);for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}function Le(e,t){return O.createHmac(`sha256`,e).update(t).digest()}function Re(e,t){let n=String(e),r=String(t),i=O.randomBytes(32);return Ie(Le(i,n),Le(i,r))&&e===t}const ze=/[/+=]/g,Be={"/":`_`,"+":`-`,"=":``};var Ve=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 O.createHmac(this.algorithm,t).update(e).digest(this.encoding).replace(ze,e=>Be[e])}index(e,t){for(let n=0,r=this.keys.length;n<r;n++)if(Re(t,this.sign(e,this.keys[n])))return n;return-1}verify(e,t){return this.index(e,t)>-1}},He=class{request;response;secure;keys;constructor(e,t,n={}){this.request=e,this.response=t,this.secure=n.secure,n.keys instanceof Ve?this.keys=n.keys:a(n.keys)&&(this.keys=new Ve(n.keys))}set(e,t,n){let r=this.request,i=this.response,a=v(i.getHeader(`Set-Cookie`)),o=new Fe(e,t,n),s=n?.signed??!!this.keys,c=this.secure===void 0?r.protocol===`https`||We(r):!!this.secure;if(!c&&n?.secure)throw Error(`Cannot send secure cookie over unencrypted connection`);if(o.secure=n?.secure??c,Ge(a,o),s&&n){if(!this.keys)throw Error(`.keys required for signed cookies`);o.value=this.keys.sign(o.toString()),o.name+=`.sig`,Ge(a,o)}return(i.set?P.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(Ue(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 Ue(e){return Z[e]||(Z[e]=RegExp(`(?:^|;) *${e.replace(je,`\\$&`)}=([^;]*)`)),Z[e]}function We(e){return!!(e.socket?e.socket.encrypted:e.connection.encrypted)}function Ge(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 Ke=`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 qe(e,t){try{switch(t.toLowerCase()){case`gzip`:case`x-gzip`:return{body:await Ze(e),encoding:`identity`};case`deflate`:case`x-deflate`:return{body:await Qe(e),encoding:`identity`};case`br`:return{body:await Xe(e),encoding:`identity`};case`zstd`:return{body:await Ye(e),encoding:`identity`}}}catch{}return{body:e,encoding:t}}let Je=null;async function Ye(e){if(I.zstdDecompress)return new Promise((t,n)=>{I.zstdDecompress(e,(e,r)=>{e?n(e):t(r)})});if(!Je){let{ZstdCodec:e}=await import(`zstd-codec`);Je=await new Promise(t=>{e.run(e=>{t(new e.Streaming)})})}return Je.decompress(e,e.length)}async function Xe(e){return new Promise((t,n)=>{I.brotliDecompress(e,(e,r)=>{e?n(e):t(r)})})}async function Ze(e){return new Promise((t,n)=>{I.gunzip(e,(e,r)=>{e?n(e):t(r)})})}async function Qe(e){return new Promise((t,n)=>{I.inflate(e,(e,r)=>{e?n(e):t(r)})})}const $e=new Intl.DateTimeFormat(`en-US`,{year:`numeric`,month:`numeric`,day:`numeric`,hour:`numeric`,minute:`numeric`,second:`numeric`,hour12:!1});function et(e,t,n){let{query:r}=G(e.url),a=e.method.toUpperCase(),o=(e.headers[`content-type`]||``).split(`;`)[0].trim();return o.startsWith(`multipart/form-data`)&&l(n)&&(n={...n},d(n).forEach(e=>{let t=n[e];l(t)&&i(t,`filepath`)&&i(t,`mimetype`)&&delete n[e]})),F.isBuffer(n)&&(n=n.toString(),o=`buffer`),{method:a,pathname:t,query:r,bodyType:o,body:n}}async function tt(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&&!Ke.includes(e)&&(i[t]=String(n))}let a=ae(i[`content-type`]||``);if(a){let{body:e,encoding:n}=await qe(t,i[`content-encoding`]||``);t=F.from(e),i[`content-encoding`]=n}return{status:n,statusText:r,headers:i,body:t.toString(a?`utf-8`:`base64`)}}function nt(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=F.from(t.body),r=F.from(e.body);if(n.length!==r.length||!n.equals(r))return!1}return!!n(e.body,t.body)}function rt(e){if(c(e))return e;let{mode:t=`glob`}=e,n=v(e.include),r=v(e.exclude);if(t===`glob`){let{isMatch:e}=B(n,r);return t=>e(t.pathname)}return e=>n.some(t=>W(t,e.pathname))&&r.every(t=>!W(t,e.pathname))}function it(e,t){return T.join(t,`${u(e)}.json`)}const Q=new Map;async function at(e){if(Q.has(e))return Q.get(e);try{if(!k.existsSync(e))return[];let t=await k.promises.readFile(e,`utf-8`)||`[]`,n=JSON.parse(t);return Q.set(e,n),n}catch(t){return console.error(`Error reading record file ${e}:`,t),[]}}async function ot(e,t){try{Q.set(e,t),await k.promises.mkdir(T.dirname(e),{recursive:!0}),await k.promises.writeFile(e,JSON.stringify(t,null,2),`utf-8`)}catch(t){console.error(`Error writing record file ${e}:`,t)}}const $=new WeakMap;function st(e,t,n){$.set(e,{body:n,pathname:t,timestamp:Date.now()})}var ct=class{options;filter;constructor(e){this.options=e,this.filter=rt(e.filter)}setup(e){let t=this.options;if(!e.server||!t.enabled)return;let n=this.record.bind(this),r=e.server.proxy||{};d(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,F.concat(r)),r=null})})}}}),this.addGitignore()}async record(e,t,n){if(!$.has(e))return;let{body:r,pathname:i,timestamp:a}=$.get(e);if($.delete(e),!i)return;let o=et(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:$e.format(a),referer:e.headers.referer||`unknown`},req:o,res:await tt(t,n)},p=it(i,c);f.meta.filepath=p;let m=T.join(s,p),h=(await at(m)).filter(e=>a-e.meta.timestamp<=u),g=h.findIndex(e=>nt(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 ot(m,h)}async addGitignore(){let e=this.options;if(!e.gitignore)return;let t=T.join(e.cwd,e.dir);await A.mkdir(t,{recursive:!0}),k.existsSync(T.join(t,`.gitignore`))||await A.writeFile(T.join(t,`.gitignore`),`*
|
|
2
|
+
`,`utf-8`)}};async function lt(e,t,n,r){let i=et(e,t,n),a=T.join(r.cwd,it(i.pathname,r.dir)),o=Date.now(),s=await at(a),c=s.filter(e=>o-e.meta.timestamp<r.expires&&nt(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:F.from(l.res.body,e?`utf-8`:`base64`),type:`buffer`,__filepath__:l.meta.filepath}}}const ut=new WeakMap;function dt(e){let t=[];e.addListener(`data`,e=>{t?.push(F.from(e))}),e.addListener(`end`,()=>{t?.length&&ut.set(e,F.concat(t)),t=null})}function ft(e){if(!e.server)return;let t=e.server.proxy||{};d(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=ut.get(t);n&&(ut.delete(t),e.headersSent||e.setHeader(`Content-Length`,n.byteLength),e.writableEnded||e.write(n))})}}})}function pt(e){return L[e]||`Unknown`}function mt(e,t=200,n){e.statusCode=t,e.statusMessage=n||pt(t)}async function ht(e,n,r,i){let{headers:a,type:o=`json`}=r,s=r.__filepath__,l=R.contentType(o)||R.contentType(R.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`),s&&n.setHeader(`X-File-Path`,s),!a)return;let[u,f]=await t(async()=>c(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}d(f).forEach(e=>n.setHeader(e,f[e]))}async function gt(e,n,r,i){let{cookies:o}=r;if(!o)return;let[s,l]=await t(async()=>c(o)?await o(e):o);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}d(l).forEach(e=>{let t=l[e],[r,i]=a(t)?t:[t];n.setCookie(e,r,i)})}function _t(e,t,n){if(re(t))t.pipe(e);else if(F.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`?F.from(r):r)}}async function vt(e,t){if(!t||typeof t==`number`&&t<=0||a(t)&&t.length!==2)return;let n=0;if(a(t)){let[e,r]=t;n=p(e,r)}else n=t-(_()-e);n>0&&await h(n)}function yt(e,{formidableOptions:n={},bodyParserOptions:r={},proxies:i,cookiesOptions:a,logger:o,priority:s={},cors:l,record:u,replay:d,activeScene:f}){let p=ve(l);return async function(l,m,h){let g=_(),{query:y,pathname:b}=G(l.url);if(!b||i.length===0||!i.some(e=>te(e,l.url)))return h();let x=e.mockData,S=ke(Object.keys(x),b,s);if(S.length===0&&!u.enabled)return h();dt(l);let C=new He(l,m,a),w,T,E=l.method.toUpperCase(),D={query:y,refererQuery:G(l.headers.referer||``).query,body:await ye(l,o,n,r),headers:l.headers,getCookie:C.get.bind(C)},O=l.headers[`x-mock-scene`],k=O?v(O).map(e=>e.split(`,`).map(e=>e.trim())).flat().filter(Boolean):f;for(let e of S)if(w=Te(x[e],o,{pathname:b,method:E,request:D,activeScene:k}),w){T=e;break}if(d&&!w&&(w=await lt(l,b,D.body,u)),!w){u.enabled&&st(l,b,D.body);let e=S.map(e=>e===T?M.underline.bold(e):M.dim(e)).join(`, `);return e.length&&o.warn(`${M.green(b)} matches ${e}, but mock data is not found.`),h()}if(p){let[e]=await t(p,l,m);if(e)return o.error(`CORS error: ${e}`),h(e)}let A=l,j=m;Object.assign(A,D),A.params=K(w.url,b),j.setCookie=C.set.bind(C);let{delay:N,type:ee=`json`,response:P,log:F,error:I,__filepath__:L}=w,{body:R,status:z=200,statusText:B}=w,V=I&&(I.probability??.5)>Math.random();if(V&&(z=I.status??500,B=I.statusText,R=I.body),mt(j,z,B),await ht(A,j,w,o),await gt(A,j,w,o),o.info(we(A,L,V),F),o.debug(`${M.magenta(`DEBUG`)} ${M.underline(b)} matches: [ ${S.map(e=>e===T?M.underline.bold(e):M.dim(e)).join(`, `)} ]\n`),R){let[e]=await t(async()=>{let e=c(R)?await R(A):R;await vt(g,N),_t(j,e,ee)});e&&(o.error(`${M.red(`mock error at ${b}`)}\n ${e}\n at body (${M.underline.gray(L)})`,F),mt(j,500),m.end(``));return}if(P){let[e]=await t(async()=>{await vt(g,N),await P(A,j,h)});e&&(o.error(`${M.red(`mock error at ${b}`)}\n ${e}\n at response (${M.underline.gray(L)})`,F),mt(j,500),m.end(``));return}m.end(``)}}function bt(e,t,{wsProxies:n,cookiesOptions:i,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},f=(e,t)=>{let n=e.get(t);return n||e.set(t,n=new z({noServer:!0})),n},p=(e,t)=>{let n=s.get(e);n||s.set(e,n=new Set),n.add(t)},h=(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)}},g=(e,t,n,i)=>{e.emit(`connection`,t,n),t.on(`close`,()=>{r(i,e=>e.ws===t,e=>m(i,e))})},_=(e,t,n,r,i)=>{let{cleanupList:a,connectionList:o,context:s}=l.get(t);xt(a),o.forEach(({ws:e})=>e.removeAllListeners()),t.removeAllListeners(),h(e,t,n,s,r,i),o.forEach(({ws:e,req:n})=>g(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())_(e,i,n,r,t);return}});let y=v(o);t?.on(`upgrade`,(t,r,o)=>{let{pathname:s,query:c}=G(t.url);if(!s||n.length===0||!n.some(e=>te(e,t.url)))return;let m=e.mockData,_=d(m).find(e=>W(e,s));if(!_)return;let v=m[_].find(e=>e.url&&e.ws&&ce(y,e.scene)&&W(e.url,s));if(!v)return;let b=v.__filepath__;p(b,_);let x=u(_),S=f(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),h(x,S,v,t,s,b)}let w=t,T=new He(t,t,i),{query:E}=G(t.headers.referer||``);w.query=c,w.refererQuery=E,w.params=K(_,s),w.getCookie=T.get.bind(T),S.handleUpgrade(w,r,o,e=>{a.info(`${M.magenta.bold(`WebSocket`)} ${M.green(t.url)} connected ${M.dim(`(${b})`)}`,v.log),C.connectionList.push({req:w,ws:e}),g(S,e,w,C.connectionList)})}),t?.on(`close`,()=>{for(let e of c.values()){for(let t of e.values())xt(l.get(t).cleanupList),t.close();e.clear()}c.clear(),s.clear()})}function xt(e){let t;for(;t=e.shift();)t?.()}const St={silent:0,error:1,warn:2,info:3,debug:4};function Ct(e,t=`info`){e=`[${e}]`;function n(n,r,i){if(i=o(i)?i?t:`error`:i,St[i]>=St[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{ft as a,me as c,pe as d,ie as f,yt as i,ge as l,St as n,ct as o,B as p,bt as r,he as s,Ct as t,le 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-
|
|
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-DFfi42My.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-
|
|
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-CNOA4TyP.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-
|
|
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-BJ-Z5r-p.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-
|
|
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-DFfi42My.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.
|
|
4
|
+
"version": "2.2.0",
|
|
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",
|
package/dist/server-B6gUVmAa.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{attempt as e,attemptAsync as t,deepEqual as n,hasOwn as r,isArray as i,isBoolean as a,isEmptyObject as o,isFunction as s,isPlainObject as c,kebabCase as l,objectKeys as u,partition as d,random as f,sleep as p,sortBy as m,timestamp as h,toArray as g,uniq as _}from"@pengzhanbo/utils";import v from"picomatch";import{match as y,parse as b,pathToRegexp as x}from"path-to-regexp";import S from"node:os";import C from"node:path";import w from"debug";import{parse as T}from"node:querystring";import E from"node: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};
|