rspack-plugin-mock 1.3.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "rspack-plugin-mock",
3
3
  "type": "module",
4
- "version": "1.3.0",
4
+ "version": "2.1.0",
5
5
  "description": "inject api mock server to development server",
6
6
  "author": "pengzhanbo <q942450674@outlook.com> (https://github.com/pengzhanbo)",
7
7
  "license": "MIT",
@@ -19,37 +19,37 @@
19
19
  "rsbuild-plugin"
20
20
  ],
21
21
  "imports": {
22
- "#json5-loader": "./dist/json5-loader.cjs"
22
+ "#json5-loader": "./dist/json5-loader.mjs"
23
23
  },
24
24
  "exports": {
25
25
  ".": {
26
26
  "import": {
27
- "types": "./dist/index.d.mts",
28
- "default": "./dist/index.mjs"
27
+ "types": "./dist/index.d.ts",
28
+ "default": "./dist/index.js"
29
29
  }
30
30
  },
31
31
  "./server": {
32
32
  "import": {
33
- "types": "./dist/server.d.mts",
34
- "default": "./dist/server.mjs"
33
+ "types": "./dist/server.d.ts",
34
+ "default": "./dist/server.js"
35
35
  }
36
36
  },
37
37
  "./rsbuild": {
38
38
  "import": {
39
- "types": "./dist/rsbuild.d.mts",
40
- "default": "./dist/rsbuild.mjs"
39
+ "types": "./dist/rsbuild.d.ts",
40
+ "default": "./dist/rsbuild.js"
41
41
  }
42
42
  },
43
43
  "./helper": {
44
44
  "import": {
45
- "types": "./dist/helper.d.mts",
46
- "default": "./dist/helper.mjs"
45
+ "types": "./dist/helper.d.ts",
46
+ "default": "./dist/helper.js"
47
47
  }
48
48
  },
49
49
  "./package.json": "./package.json"
50
50
  },
51
- "main": "dist/index.mjs",
52
- "types": "dist/index.d.mts",
51
+ "main": "dist/index.js",
52
+ "types": "dist/index.d.ts",
53
53
  "files": [
54
54
  "dist"
55
55
  ],
@@ -58,8 +58,9 @@
58
58
  "pnpm": ">=9"
59
59
  },
60
60
  "peerDependencies": {
61
- "@rsbuild/core": ">=1.0.0",
62
- "@rspack/core": ">=1.0.0"
61
+ "@rsbuild/core": ">=2.0.0",
62
+ "@rspack/core": ">=2.0.0",
63
+ "zstd-codec": ">=0.1.5"
63
64
  },
64
65
  "peerDependenciesMeta": {
65
66
  "@rsbuild/core": {
@@ -67,48 +68,51 @@
67
68
  },
68
69
  "@rspack/core": {
69
70
  "optional": true
71
+ },
72
+ "zstd-codec": {
73
+ "optional": true
70
74
  }
71
75
  },
72
76
  "dependencies": {
73
- "@pengzhanbo/utils": "^2.1.2",
77
+ "@pengzhanbo/utils": "^3.6.0",
74
78
  "ansis": "^4.2.0",
75
79
  "chokidar": "^5.0.0",
76
80
  "co-body": "^6.2.0",
77
- "cors": "^2.8.5",
81
+ "cors": "^2.8.6",
78
82
  "debug": "^4.4.3",
79
83
  "formidable": "^3.5.4",
80
84
  "http-status": "^2.1.0",
81
85
  "is-core-module": "^2.16.1",
82
86
  "json5": "^2.2.3",
83
87
  "local-pkg": "^1.1.2",
84
- "memfs": "^4.51.1",
88
+ "memfs": "^4.57.2",
85
89
  "mime-types": "^3.0.2",
86
- "path-to-regexp": "^8.3.0",
87
- "picomatch": "^4.0.3",
88
- "portfinder": "^1.0.38",
89
- "tinyglobby": "^0.2.15",
90
- "ws": "^8.18.3"
90
+ "path-to-regexp": "^8.4.2",
91
+ "picomatch": "^4.0.4",
92
+ "tinyglobby": "^0.2.16",
93
+ "ws": "^8.20.0"
91
94
  },
92
95
  "devDependencies": {
93
- "@pengzhanbo/eslint-config": "^1.45.0",
94
- "@rsbuild/core": "^1.6.15",
95
- "@rspack/core": "^1.6.8",
96
+ "@pengzhanbo/eslint-config": "^2.4.0",
97
+ "@rsbuild/core": "^2.0.3",
98
+ "@rspack/core": "^2.0.1",
96
99
  "@types/co-body": "^6.1.3",
97
100
  "@types/cors": "^2.8.19",
98
- "@types/debug": "^4.1.12",
99
- "@types/formidable": "^3.4.6",
101
+ "@types/debug": "^4.1.13",
102
+ "@types/formidable": "^3.5.1",
100
103
  "@types/is-core-module": "^2.2.2",
101
104
  "@types/mime-types": "^3.0.1",
102
- "@types/node": "^25.0.3",
103
- "@types/picomatch": "^4.0.2",
105
+ "@types/node": "^25.6.0",
106
+ "@types/picomatch": "^4.0.3",
104
107
  "@types/ws": "^8.18.1",
105
- "bumpp": "^10.3.2",
108
+ "bumpp": "^11.0.1",
106
109
  "conventional-changelog-cli": "^5.0.0",
107
- "eslint": "^9.39.2",
110
+ "eslint": "^10.3.0",
108
111
  "husky": "^9.1.7",
109
- "lint-staged": "^16.2.7",
110
- "tsdown": "^0.18.3",
111
- "typescript": "^5.9.3"
112
+ "lint-staged": "^16.4.0",
113
+ "tsdown": "^0.21.10",
114
+ "typescript": "^6.0.3",
115
+ "zstd-codec": "^0.1.5"
112
116
  },
113
117
  "lint-staged": {
114
118
  "*": "eslint --fix"
package/dist/helper.mjs DELETED
@@ -1,4 +0,0 @@
1
- import{Transform as e}from"node:stream";import{deepClone as t,deepEqual as n,isArray as r,isFunction as i}from"@pengzhanbo/utils";var a=class extends e{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
-
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=r(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(e){this.value=e,this.#e=t(e),this.#t=Date.now()}hotUpdate(e){Date.now()-this.#t<70||n(e,this.#e)||(this.value=e,this.#e=t(e),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 r=[()=>n.value,e=>{i(e)&&(e=e(n.value)??n.value),n.value=e}];return Object.defineProperty(r,`value`,{get(){return n.value},set(e){n.value=e}}),d.set(n,r),r}export{l as createDefineMock,s as createSSEStream,c as defineMock,p as defineMockData};
package/dist/index.d.mts DELETED
@@ -1,13 +0,0 @@
1
- import { _ as WebSocketSetupContext, a as LogType, c as MockMatchPriority, d as MockRequest, f as MockResponse, g as ServerBuildOption, h as ResponseBody, i as LogLevel, l as MockMatchSpecialPriority, m as MockWebsocketItem, n as ExtraRequest, o as Method, p as MockServerPluginOptions, r as FormidableFile, s as MockHttpItem, t as BodyParserOptions, u as MockOptions } from "./types-Bt_OTa7I.mjs";
2
- import { HeaderStream, MockData, SSEMessage, createDefineMock, createSSEStream, defineMock, defineMockData } from "./helper.mjs";
3
- import { a as processMockData, c as Logger, i as baseMiddleware, l as createLogger, n as mockWebSocket, o as processRawData, r as BaseMiddlewareOptions, s as sortByValidator, t as MockSocketOptions, u as logLevels } from "./server-4ETytB7L.mjs";
4
- import { Compiler, RspackPluginInstance } from "@rspack/core";
5
-
6
- //#region src/rspack.d.ts
7
- declare class MockServerPlugin implements RspackPluginInstance {
8
- options: MockServerPluginOptions;
9
- constructor(options?: MockServerPluginOptions);
10
- apply(compiler: Compiler): void;
11
- }
12
- //#endregion
13
- export { BaseMiddlewareOptions, BodyParserOptions, ExtraRequest, type FormidableFile, HeaderStream, LogLevel, LogType, Logger, Method, MockData, type MockHttpItem, MockMatchPriority, MockMatchSpecialPriority, type MockOptions, type MockRequest, MockResponse, MockServerPlugin, type MockServerPluginOptions, MockSocketOptions, type MockWebsocketItem, ResponseBody, SSEMessage, ServerBuildOption, WebSocketSetupContext, baseMiddleware, createDefineMock, createLogger, createSSEStream, defineMock, defineMockData, logLevels, mockWebSocket, processMockData, processRawData, sortByValidator };
package/dist/index.mjs DELETED
@@ -1 +0,0 @@
1
- import{createDefineMock as e,createSSEStream as t,defineMock as n,defineMockData as r}from"./helper.mjs";import{a as i,d as a,f as o,i as s,n as c,o as l,r as u,s as d,t as f}from"./ws-BM06pHhL.mjs";import{i as p,n as m,r as h,t as g}from"./options-BUfaThYe.mjs";import"./server.mjs";import{isString as _,toArray as v}from"@pengzhanbo/utils";import y from"node:path";import b from"node:process";import x from"@rspack/core";const S=`rspack-plugin-mock`;var C=class{constructor(e={}){this.options=e}apply(e){let t=e.options,n=w(e,this.options);if(b.env.NODE_ENV!==`production`){let r=p(n),i=m(r,n),a=t.devServer?.setupMiddlewares,o=d(e=>{f(r,e,n)});t.devServer={...t.devServer,setupMiddlewares:(e,t)=>(e=a?.(e,t)||e,e=i(e,()=>{t.webSocketServer?.clients&&t.sendMessage(t.webSocketServer.clients,`static-changed`)})||e,o(()=>t.server),e)};let s=v(n.wsPrefix);if(t.devServer?.proxy?.length){let e=t.devServer.proxy;t.devServer.proxy=e.filter(e=>typeof e!=`function`&&e.ws===!0&&s.length?!v(e.context).filter(_).some(e=>s.includes(e)):!0).map(e=>{if(typeof e!=`function`&&!e.ws){let t=e.onProxyReq;e.onProxyReq=(e,n,...r)=>{t?.(e,n,...r),u(e,n)}}return e})}e.hooks.watchRun.tap(S,()=>r.run()),e.hooks.watchClose.tap(S,()=>r.close())}else n.build!==!1&&e.hooks.afterEmit.tap(S,()=>h(n,t.output.path||y.resolve(b.cwd(),`dist`)))}};function w(e,t={}){let n=e.options,r=n.resolve?.alias||{},i=n.context,a=n.plugins?.find(e=>e instanceof x.DefinePlugin),o=(n.devServer?.proxy||[]).flatMap(e=>typeof e!=`function`&&e.context&&!e.ws?e.context:[]);return g(t,{alias:r,context:i,plugins:v(a),proxies:o})}export{C as MockServerPlugin,c as baseMiddleware,e as createDefineMock,a as createLogger,t as createSSEStream,n as defineMock,r as defineMockData,o as logLevels,f as mockWebSocket,s as processMockData,i as processRawData,l as sortByValidator};
@@ -1 +0,0 @@
1
- var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`json5`);c=s(c),module.exports=function(e){return e?`export default ${JSON.stringify(c.default.parse(e))}`:`export default {}`};
@@ -1,43 +0,0 @@
1
- import{_ as e,a as t,c as n,d as r,g as i,h as a,i as o,l as s,m as c,n as l,p as u,u as d}from"./ws-BM06pHhL.mjs";import{createRequire as f}from"node:module";import{isBoolean as p,toArray as m,uniq as h}from"@pengzhanbo/utils";import g from"node:path";import _ from"node:process";import*as v from"@rspack/core";import y,{promises as b}from"node:fs";import x from"node:fs/promises";import S from"ansis";import{glob as C}from"tinyglobby";import w from"is-core-module";import{loadPackageJSONSync as T}from"local-pkg";import{pathToFileURL as E}from"node:url";import D from"node:events";import O from"chokidar";import k from"cors";const A=f(import.meta.url);function j(e,t){let n=P(e),r=n.watch===!0;async function i(n,i){let a=`[rspack:mock]`,o=(...e)=>{i?i.compilation.getLogger(a).error(...e):console.error(S.red(a),...e)};if(n){o(n.stack||n),`details`in n&&o(n.details);return}i?.hasErrors()&&o(i.toJson().errors);let s=d.readFileSync(`/output.js`,`utf-8`),c=[];if(!r){let t=i?.toJson().modules||[],n=Object.keys(e.alias||{}).map(e=>e.replace(/\$$/g,``));for(let{name:e}of t)if(e?.startsWith(`external`)){let t=N(e);!w(t)&&!n.includes(t)&&c.push(N(e))}}await t({code:s,externals:c})}let a=v.rspack(n);return a.outputFileSystem=d,r?a.watch({},i):a.run(async(...e)=>{await i(...e),a.close(()=>{})}),a}function M(e){return new Promise(t=>{j({...e,watch:!1},e=>{t(e)})})}function N(e){let t=e.replace(`external `,``).slice(1,-1),[n,r]=t.split(`/`);return t[0]===`@`?`${n}/${r}`:n}function P({cwd:e,isEsm:t=!0,entryFile:n,plugins:r,alias:i,watch:a=!1}){let o=[`node >= 18.0.0`];i&&`@swc/helpers`in i&&delete i[`@swc/helpers`];let s=c(e),l=RegExp(`^(${s.join(`|`)})($|/)`,`i`);return{mode:`production`,context:e,entry:n,watch:a,target:`node${(_.versions.node||``).replace(/\.\d+$/,``)}`,externalsType:t?`module`:`commonjs2`,externals:[l],resolve:{alias:i,extensions:[`.js`,`.ts`,`.cjs`,`.mjs`,`.json5`,`.json`]},plugins:r,output:{library:{type:t?`module`:`commonjs2`},filename:`output.js`,module:t,path:`/`},experiments:{outputModule:t},optimization:{minimize:!a},node:{__dirname:!1,__filename:!1},module:{rules:[{test:/\.json5?$/,loader:A.resolve(`#json5-loader`),type:`javascript/auto`},{test:/\.[cm]?js$/,use:[{loader:`builtin:swc-loader`,options:{jsc:{parser:{syntax:`ecmascript`}},env:{targets:o}}}]},{test:/\.[cm]?ts$/,use:[{loader:`builtin:swc-loader`,options:{jsc:{parser:{syntax:`typescript`}},env:{targets:o}}}]}]}}}async function F({filepath:e,code:t,isESM:n,cwd:r}){e=g.resolve(r,e);let i=n?`.mjs`:`.cjs`,a=`${e}.timestamp-${Date.now()}${i}`,o=E(a).toString();await b.writeFile(a,t,`utf8`);try{let e=await import(o);return e.default||e}finally{try{y.unlinkSync(a)}catch{}}}function I(e){return new L(e)}var L=class extends D{cwd;mockWatcher;entryFile;deps=[];isESM=!1;_mockData={};watchInfo;compiler;constructor(e){super(),this.options=e,this.cwd=e.cwd||_.cwd();try{this.isESM=T(this.cwd)?.type===`module`}catch{}this.entryFile=g.resolve(_.cwd(),`node_modules/.cache/mock-server/mock-server.ts`)}get mockData(){return this._mockData}async run(){let{include:n,exclude:r}=this.options,{pattern:i,ignore:a,isMatch:c}=e(n,r);this.deps=(await C(i,{ignore:a,cwd:g.join(this.cwd,this.options.dir)})).map(e=>s(e)),this.updateMockEntry(),this.watchMockFiles(c);let{plugins:l,alias:u}=this.options;this.compiler=j({isEsm:this.isESM,cwd:this.cwd,plugins:l,entryFile:this.entryFile,alias:u,watch:!0},async({code:e})=>{try{this._mockData=o(t(await F({filepath:`mock.bundle.js`,code:e,isESM:this.isESM,cwd:this.cwd}))),this.emit(`update`,this.watchInfo||{})}catch(e){this.options.logger.error(e.stack||e.message)}})}close(){this.mockWatcher.close(),this.compiler?.close(()=>{}),this.emit(`close`)}updateAlias(e){this.options.alias={...this.options.alias,...e}}async updateMockEntry(){await H(this.entryFile,this.deps,this.cwd,this.options.dir)}watchMockFiles(e){let t=this.mockWatcher=O.watch(this.options.dir,{ignoreInitial:!0,cwd:this.cwd,ignored:(t,n)=>t.includes(`node_modules`)?!0:!!n?.isFile()&&!e(t)});t.on(`add`,t=>{t=s(t),e(t)&&(this.watchInfo={filepath:t,type:`add`},this.deps=h([...this.deps,t]),this.updateMockEntry())}),t.on(`change`,t=>{t=s(t),e(t)&&(this.watchInfo={filepath:t,type:`change`})}),t.on(`unlink`,async t=>{t=s(t),e(t)&&(this.watchInfo={filepath:t,type:`unlink`},this.deps=this.deps.filter(e=>e!==t),this.updateMockEntry())})}},R=`rspack-plugin-mock`,z=`1.3.0`;function B(e,t){let n=a(e.context),r=[R,`connect`,`cors`],i={name:`mock-server`,type:`module`,scripts:{start:`node index.js`},dependencies:{connect:`^3.7.0`,[R]:`^${z}`,cors:`^2.8.5`}};return t.filter(e=>!r.includes(e)).forEach(e=>{i.dependencies[e]=n[e]||`latest`}),JSON.stringify(i,null,2)}function V({proxies:e,wsPrefix:t,cookiesOptions:n,bodyParserOptions:r,priority:i,build:a}){let{serverPort:o,log:s}=a;return`import { createServer } from 'node:http';
2
- import connect from 'connect';
3
- import corsMiddleware from 'cors';
4
- import {
5
- baseMiddleware,
6
- createLogger,
7
- mockWebSocket,
8
- processMockData,
9
- processRawData
10
- } from 'rspack-plugin-mock/server';
11
- import rawData from './mock-data.js';
12
-
13
- const app = connect();
14
- const server = createServer(app);
15
- const logger = createLogger('mock-server', '${s}');
16
- const proxies = ${JSON.stringify(e)};
17
- const wsProxies = ${JSON.stringify(m(t))};
18
- const cookiesOptions = ${JSON.stringify(n)};
19
- const bodyParserOptions = ${JSON.stringify(r)};
20
- const priority = ${JSON.stringify(i)};
21
- const mockConfig = {
22
- mockData: processMockData(processRawData(rawData)),
23
- on: () => {},
24
- };
25
-
26
- mockWebSocket(mockConfig, server, { wsProxies, cookiesOptions, logger });
27
-
28
- app.use(corsMiddleware());
29
- app.use(baseMiddleware(mockConfig, {
30
- formidableOptions: { multiples: true },
31
- proxies,
32
- priority,
33
- cookiesOptions,
34
- bodyParserOptions,
35
- logger,
36
- }));
37
-
38
- server.listen(${o});
39
-
40
- console.log('listen: http://localhost:${o}');
41
- `}async function H(e,t,n,r){let i=[],a=[];for(let[e,o]of t.entries()){let t=s(g.join(r,o)),c=s(g.join(n,t));i.push(`import * as m${e} from '${c}'`),a.push(`[m${e}, '${t}']`)}let o=`${i.join(`
42
- `)}\n\nexport default [\n ${a.join(`,
43
- `)}\n]`,c=g.dirname(e);y.existsSync(c)||await x.mkdir(c,{recursive:!0}),await x.writeFile(e,o,`utf8`)}async function U(t,n){let r=g.resolve(_.cwd(),`node_modules/.cache/mock-server/mock-server.ts`),{pattern:i,ignore:a}=e(t.include,t.exclude);await H(r,await C(i,{ignore:a,cwd:g.join(t.cwd,t.dir)}),t.cwd,t.dir);let{code:o,externals:s}=await M({entryFile:r,cwd:t.cwd,plugins:t.plugins,alias:t.alias});await x.unlink(r);let c=[{filename:`mock-data.js`,source:o},{filename:`index.js`,source:V(t)},{filename:`package.json`,source:B(t,s)}],l=g.resolve(n,t.build.dist);t.logger.info(`${S.green(`✓`)} generate mock server in ${S.cyan(g.relative(_.cwd(),l))}`),y.existsSync(l)||await x.mkdir(l,{recursive:!0});for(let{filename:e,source:n}of c){await x.writeFile(g.join(l,e),n,`utf8`);let r=(n.length/1024).toFixed(2),i=e.length<24?` `.repeat(24-e.length):``;t.logger.info(` ${S.green(e)}${i}${S.bold.dim(`${r} kB`)}`)}}function W(e,t){let r={},a=t.cors!==!1;a&&(r={...r,...typeof t.cors==`boolean`?{}:t.cors});let o=t.proxies;return a?function(t,a,s){let{pathname:c}=n(t.url);if(!c||o.length===0||!o.some(e=>i(e,t.url,t)))return s();let l=e.mockData;if(!Object.keys(l).find(e=>u(e,c)))return s();k(r)(t,a,s)}:void 0}function G(e,t){return function(n,r){n.unshift(l(e,t));let i=W(e,t);return i&&n.unshift(i),t.reload&&e.on(`update`,()=>r?.()),n}}function K({prefix:e=[],wsPrefix:t=[],cwd:n,dir:i=`mock`,include:a=[`**/*.mock.{js,ts,cjs,mjs,json,json5}`],exclude:o=[],reload:s=!1,log:c=`info`,cors:l=!0,formidableOptions:u={},build:d=!1,cookiesOptions:f={},bodyParserOptions:h={},priority:g={}},{alias:v,context:y,plugins:b,proxies:x}){let C=r(`rspack:mock`,p(c)?c?`info`:`error`:c),w=[...m(e),...x],T=m(t);return!w.length&&!T.length&&C.warn(`No proxy was configured, mock server will not work. See ${S.cyan(`https://vite-plugin-mock-dev-server.netlify.app/guide/usage`)}`),{prefix:e,wsPrefix:t,cwd:n||y||_.cwd(),dir:i,include:a,exclude:o,reload:s,cors:l,cookiesOptions:f,log:c,formidableOptions:{multiples:!0,...u},bodyParserOptions:h,priority:g,build:d?{serverPort:8080,dist:`mockServer`,log:`error`,...typeof d==`object`?d:{}}:!1,alias:v,plugins:b,proxies:w,wsProxies:T,logger:C}}export{I as i,G as n,U as r,K as t};
@@ -1,7 +0,0 @@
1
- import { _ as WebSocketSetupContext, a as LogType, c as MockMatchPriority, d as MockRequest, f as MockResponse, g as ServerBuildOption, h as ResponseBody, i as LogLevel, l as MockMatchSpecialPriority, m as MockWebsocketItem, n as ExtraRequest, o as Method, p as MockServerPluginOptions, r as FormidableFile, s as MockHttpItem, t as BodyParserOptions, u as MockOptions } from "./types-Bt_OTa7I.mjs";
2
- import { RsbuildPlugin } from "@rsbuild/core";
3
-
4
- //#region src/rsbuild.d.ts
5
- declare function pluginMockServer(options?: MockServerPluginOptions): RsbuildPlugin;
6
- //#endregion
7
- export { BodyParserOptions, ExtraRequest, FormidableFile, LogLevel, LogType, Method, MockHttpItem, MockMatchPriority, MockMatchSpecialPriority, MockOptions, MockRequest, MockResponse, MockServerPluginOptions, MockWebsocketItem, ResponseBody, ServerBuildOption, WebSocketSetupContext, pluginMockServer };
package/dist/rsbuild.mjs DELETED
@@ -1 +0,0 @@
1
- import{r as e,t}from"./ws-BM06pHhL.mjs";import{i as n,n as r,r as i,t as a}from"./options-BUfaThYe.mjs";import{isArray as o,toArray as s}from"@pengzhanbo/utils";import c from"node:path";import l from"node:process";import u from"@rspack/core";import d from"ansis";import{createServer as f}from"node:http";import{getPortPromise as p}from"portfinder";function m(e={}){return{name:`plugin-mock-server`,setup(o){let d=o.getRsbuildConfig(),m=a(e,{proxies:v(d),alias:{},context:o.context.rootPath,plugins:[new u.DefinePlugin(d.source?.define||{})]});if(l.env.NODE_ENV===`production`){m.build&&o.onAfterBuild(async()=>{let e=o.getNormalizedConfig();await i(m,c.resolve(l.cwd(),e.output.distPath.root||`dist`))});return}let h=n(m);o.modifyRsbuildConfig(e=>{g(e);let t=r(h,m);e.dev??={},e.dev.setupMiddlewares=s(e.dev.setupMiddlewares),e.dev.setupMiddlewares.push((e,n)=>{t(e,()=>n.sockWrite(`static-changed`))})});let y=3079,b=s(m.wsPrefix).length>0;b&&o.modifyRsbuildConfig(async t=>{y=await p({port:(t.server?.port||y)+1}),_(t,e.wsPrefix||[],y)});let x;function S(){h.run(),b&&(x=f(),t(h,x,m),x.listen(y))}function C(){h.close(),x?.close()}o.onAfterCreateCompiler(({compiler:e})=>{`compilers`in e?e.compilers.forEach(e=>{h.updateAlias(e.options.resolve?.alias||{})}):h.updateAlias(e.options.resolve?.alias||{})}),o.onAfterStartDevServer(S),o.onAfterStartProdServer(S),o.onExit(C)}}}function h(e,t,n){console.error(d.red(e?.stack||e.message)),n.statusCode=500,n.end()}function g(t){if(t.server?.proxy){if(o(t.server.proxy))t.server.proxy=t.server.proxy.map(t=>{if(typeof t!=`function`&&!t.ws){let n=t.onProxyReq,r=t.onError;return{...t,onError:r||h,onProxyReq:(t,r,...i)=>{n?.(t,r,...i),e(t,r)}}}return t});else if(`target`in t.server.proxy){let n=t.server.proxy.onProxyReq;t.server.proxy.onProxyReq=(t,r,...i)=>{n?.(t,r,...i),e(t,r)},t.server.proxy.onError??=h}else if(t.server.proxy){let n=t.server.proxy;Object.keys(n).forEach(t=>{let r=n[t],i=typeof r==`string`?{target:r}:r;if(i.ws)return;let{onProxyReq:a,onError:o,...s}=i;n[t]={...s,onProxyReq:(t,n,...r)=>{a?.(t,n,...r),e(t,n)},onError:o||h}})}}}function _(e,t,n){e.server??={};let r=e.server.proxy??={},i=`ws://localhost:${n}`,a=s(t),c=e=>typeof e==`string`&&a.includes(e),l=new Set;function u(e){o(e.context)?e.context=e.context.filter(c):c(e.context)&&(l.add(e.context),e.target=i)}if(o(r)){for(let e of r)typeof e!=`function`&&e.context&&e.ws&&u(e);a.filter(e=>!l.has(e)).forEach(e=>r.push({context:e,target:i}))}else if(`target`in r){if(r.ws){u(r);let t=e.server.proxy=[r];a.filter(e=>!l.has(e)).forEach(e=>t.push({context:e,target:i}))}}else Object.entries(r).forEach(([,e])=>{typeof e!=`string`&&e.ws&&u(e)}),a.filter(e=>!l.has(e)).forEach(e=>{r[e]={target:i,ws:!0}})}function v(e){e.server??={};let t=e.server.proxy??={},n=[];if(o(t))for(let e of t)typeof e!=`function`&&e.context&&!e.ws&&n.push(...s(e.context));else `target`in t?t.ws||n.push(...s(t.context)):Object.entries(t).forEach(([e,t])=>{(typeof t==`string`||!t.ws)&&n.push(e)});return n}export{m as pluginMockServer};
@@ -1,89 +0,0 @@
1
- import { g as ServerBuildOption, i as LogLevel, m as MockWebsocketItem, p as MockServerPluginOptions, s as MockHttpItem, u as MockOptions } from "./types-Bt_OTa7I.mjs";
2
- import { Compiler, RspackOptionsNormalized, RspackPluginInstance } from "@rspack/core";
3
- import { Matcher } from "picomatch";
4
- import Debug from "debug";
5
- import "memfs";
6
- import EventEmitter from "node:events";
7
- import { FSWatcher } from "chokidar";
8
- import { Server } from "node:http";
9
- import { Http2SecureServer } from "node:http2";
10
-
11
- //#region src/utils/logger.d.ts
12
- interface Logger {
13
- debug: (msg: string, level?: boolean | LogLevel) => void;
14
- info: (msg: string, level?: boolean | LogLevel) => void;
15
- warn: (msg: string, level?: boolean | LogLevel) => void;
16
- error: (msg: string, level?: boolean | LogLevel) => void;
17
- }
18
- declare const logLevels: Record<LogLevel, number>;
19
- declare function createLogger(prefix: string, defaultLevel?: LogLevel): Logger;
20
- //#endregion
21
- //#region src/options.d.ts
22
- interface ResolvedCompilerOptions {
23
- alias: Record<string, false | string | (string | false)[]>;
24
- proxies: (string | ((pathname: string, req: any) => boolean))[];
25
- wsProxies: (string | ((pathname: string, req: any) => boolean))[];
26
- plugins: RspackPluginInstance[];
27
- context?: string;
28
- }
29
- type ResolvePluginOptions = Required<Omit<MockServerPluginOptions, "build">> & ResolvedCompilerOptions & {
30
- logger: Logger;
31
- build: false | ServerBuildOption;
32
- };
33
- //#endregion
34
- //#region src/compiler/processData.d.ts
35
- declare function processRawData(rawData: (readonly [any, string])[]): (MockHttpItem | MockWebsocketItem | MockOptions)[];
36
- declare function processMockData(mockList: (MockHttpItem | MockWebsocketItem | MockOptions)[]): Record<string, MockOptions>;
37
- declare function sortByValidator(mocks: MockOptions): (MockHttpItem | MockWebsocketItem)[];
38
- //#endregion
39
- //#region src/compiler/mockCompiler.d.ts
40
- declare class MockCompiler extends EventEmitter {
41
- options: ResolvePluginOptions;
42
- cwd: string;
43
- mockWatcher: FSWatcher;
44
- entryFile: string;
45
- deps: string[];
46
- isESM: boolean;
47
- private _mockData;
48
- private watchInfo?;
49
- compiler?: Compiler | null;
50
- constructor(options: ResolvePluginOptions);
51
- get mockData(): Record<string, MockOptions>;
52
- run(): Promise<void>;
53
- close(): void;
54
- updateAlias(alias: Record<string, false | string | (string | false)[]>): void;
55
- updateMockEntry(): Promise<void>;
56
- watchMockFiles(isMatch: Matcher): void;
57
- }
58
- //#endregion
59
- //#region src/core/types.d.ts
60
- type SetupMiddlewaresFn = NonNullable<NonNullable<RspackOptionsNormalized["devServer"]>["setupMiddlewares"]>;
61
- type Middleware = SetupMiddlewaresFn extends ((middlewares: (infer T)[], devServer: any) => void) ? T : never;
62
- //#endregion
63
- //#region src/core/mockMiddleware.d.ts
64
- interface BaseMiddlewareOptions extends Pick<MockServerPluginOptions, "formidableOptions" | "cookiesOptions" | "bodyParserOptions" | "priority"> {
65
- proxies: (string | ((pathname: string, req: any) => boolean))[];
66
- logger: Logger;
67
- }
68
- declare function baseMiddleware(compiler: MockCompiler, {
69
- formidableOptions,
70
- bodyParserOptions,
71
- proxies,
72
- cookiesOptions,
73
- logger,
74
- priority
75
- }: BaseMiddlewareOptions): Middleware;
76
- //#endregion
77
- //#region src/core/ws.d.ts
78
- interface MockSocketOptions {
79
- wsProxies: (string | ((pathname: string, req: any) => boolean))[];
80
- cookiesOptions: MockServerPluginOptions["cookiesOptions"];
81
- logger: Logger;
82
- }
83
- declare function mockWebSocket(compiler: MockCompiler, httpServer: Server | Http2SecureServer, {
84
- wsProxies: proxies,
85
- cookiesOptions,
86
- logger
87
- }: MockSocketOptions): void;
88
- //#endregion
89
- export { processMockData as a, Logger as c, baseMiddleware as i, createLogger as l, mockWebSocket as n, processRawData as o, BaseMiddlewareOptions as r, sortByValidator as s, MockSocketOptions as t, logLevels as u };
package/dist/server.d.mts DELETED
@@ -1,3 +0,0 @@
1
- import "./types-Bt_OTa7I.mjs";
2
- import { a as processMockData, c as Logger, i as baseMiddleware, l as createLogger, n as mockWebSocket, o as processRawData, r as BaseMiddlewareOptions, s as sortByValidator, t as MockSocketOptions, u as logLevels } from "./server-4ETytB7L.mjs";
3
- export { BaseMiddlewareOptions, Logger, MockSocketOptions, baseMiddleware, createLogger, logLevels, mockWebSocket, processMockData, processRawData, sortByValidator };
package/dist/server.mjs DELETED
@@ -1 +0,0 @@
1
- import{a as e,d as t,f as n,i as r,n as i,o as a,t as o}from"./ws-BM06pHhL.mjs";export{i as baseMiddleware,t as createLogger,n as logLevels,o as mockWebSocket,r as processMockData,e as processRawData,a as sortByValidator};
@@ -1 +0,0 @@
1
- import{isArray as e,isBoolean as t,isEmptyObject as n,isFunction as r,isPlainObject as i,random as a,sleep as o,sortBy as s,timestamp as c,toArray as l,uniq as u}from"@pengzhanbo/utils";import d from"node:path";import f from"ansis";import p from"picomatch";import{loadPackageJSONSync as m}from"local-pkg";import{match as h,parse as g,pathToRegexp as _}from"path-to-regexp";import v from"node:os";import{fileURLToPath as y}from"node:url";import b from"debug";import{Volume as x,createFsFromVolume as S}from"memfs";import{parse as C}from"node:querystring";import w from"co-body";import T from"formidable";import E from"node:http";import D from"node:crypto";import{Buffer as O}from"node:buffer";import k from"http-status";import*as A from"mime-types";import{WebSocketServer as j}from"ws";function ee(e,t){let n=[],r=[`**/node_modules/**`,...l(t)];return l(e).forEach(e=>{e[0]===`!`?r.push(e.slice(1)):n.push(e)}),{pattern:n,ignore:r,isMatch:p(n,{ignore:r})}}function M(e,t,n){return typeof e==`function`?e(t,n):e[0]===`^`&&new RegExp(e).test(t)||t.startsWith(e)}function N(e){let{dependencies:t,devDependencies:n,peerDependencies:r,optionalDependencies:i}=m(e)||{};return{...t,...n,...r,...i}}function P(e){let t=N(e);return u(Object.keys(t))}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`}function F(e,t){if(!t)return!0;for(let n in t)if(!I(e[n],t[n]))return!1;return!0}function I(t,n){if(e(t)&&e(n)){let e=new Set;return n.every(n=>t.some((t,r)=>{if(e.has(r))return!1;let i=I(t,n);return i&&e.add(r),i}))}return i(t)&&i(n)?F(t,n):Object.is(t,n)}const L=new Map;function R(e,t){let n=L.get(e);return n||(n=_(e).regexp,L.set(e,n)),n.test(t)}const z={silent:0,error:1,warn:2,info:3,debug:4};function re(e,n=`info`){e=`[${e}]`;function r(r,i,a){if(a=t(a)?a?n:`error`:a,z[a]>=z[r]){let t=r===`info`||r===`debug`?`log`:r,n=r===`debug`?f.magenta.bold(e):r===`info`?f.cyan.bold(e):r===`warn`?f.yellow.bold(e):f.red.bold(e),a=`${f.dim(new Date().toLocaleTimeString())} ${n} ${i}`;console[t](a)}}return{debug(e,t=n){r(`debug`,e,t)},info(e,t=n){r(`info`,e,t)},warn(e,t=n){r(`warn`,e,t)},error(e,t=n){r(`error`,e,t)}}}ae(import.meta.url);const ie=S(new x);function ae(e){return d.dirname(y(e))}b(`vite:mock-dev-server`);const oe=/\\/g,se=v.platform()===`win32`;function ce(e){return e.replace(oe,`/`)}function le(e){return d.posix.normalize(se?ce(e):e)}function B(e){let t=new URL(e,`http://example.com`);return{pathname:decodeURIComponent(t.pathname),query:C(t.search.replace(/^\?/,``))}}function ue(e,t=5){return function n(r,i=0){let a=r();a?e(a):i<t&&setTimeout(()=>n(r,i+1),100)}}function de(e){return e.filter(e=>e[0]).map(([e,t])=>{let n;return e.default?n=Array.isArray(e.default)?e.default.map(e=>({...e,__filepath__:t})):{...e.default,__filepath__:t}:`url`in e?n={...e,__filepath__:t}:(n=[],Object.keys(e||{}).forEach(r=>{Array.isArray(e[r])?n.push(...e[r].map(e=>({...e,__filepath__:t}))):n.push({...e[r],__filepath__:t})})),n})}function fe(e){let t=[];for(let[,n]of e.entries())n&&t.push(...l(n));let a={};return t.filter(e=>i(e)&&e.enabled!==!1&&e.url).forEach(e=>{let{pathname:t,query:i}=B(e.url),o=a[t]??=[],s={...e,url:t};if(s.ws!==!0){let e=s.validator;n(i)||(r(e)?s.validator=function(t){return F(t.query,i)&&e(t)}:e?(s.validator={...e},s.validator.query=s.validator.query?{...i,...s.validator.query}:i):s.validator={query:i})}o.push(s)}),Object.keys(a).forEach(e=>{a[e]=V(a[e])}),a}function V(e){return s(e,e=>{if(e.ws===!0)return 0;let{validator:t}=e;return!t||n(t)?2:r(t)?0:1/Object.keys(t).reduce((e,n)=>e+pe(t[n]),0)})}function pe(e){return e?Object.keys(e).length:0}async function me(e,t,n={}){let r=e.method.toUpperCase();if([`HEAD`,`OPTIONS`].includes(r))return;let i=e.headers[`content-type`]?.toLocaleLowerCase()||``,{limit:a,formLimit:o,jsonLimit:s,textLimit:c,...l}=n;try{if(i.startsWith(`application/json`))return await w.json(e,{limit:s||a,...l});if(i.startsWith(`application/x-www-form-urlencoded`))return await w.form(e,{limit:o||a,...l});if(i.startsWith(`text/plain`))return await w.text(e,{limit:c||a,...l});if(i.startsWith(`multipart/form-data`))return await ge(e,t)}catch(e){console.error(e)}}const he={keepExtensions:!0,filename(e,t,n){return n?.originalFilename||`${e}.${Date.now()}${t?`.${t}`:``}`}};async function ge(e,t){let n=T({...he,...t});return new Promise((t,r)=>{n.parse(e,(e,n,i)=>{if(e){r(e);return}t({...n,...i})})})}const H=new Map;function U(e,t){let n=H.get(e);n||(n=h(e,{decode:decodeURIComponent}),H.set(e,n));let r=n(t);return r?r.params:{}}function _e(e,t){return F(e.headers,t.headers)&&F(e.body,t.body)&&F(e.params,t.params)&&F(e.query,t.query)&&F(e.refererQuery,t.refererQuery)}function W(e,t){return!t||n(t)?``:` ${f.gray(`${e}:`)}${JSON.stringify(t)}`}function ve(e,t){let{url:n,method:r,query:i,params:a,body:o}=e,{pathname:s}=new URL(n,`http://example.com`);s=f.green(decodeURIComponent(s));let c=f.magenta.bold(r),l=W(`query`,i),u=W(`params`,a),d=W(`body`,o),p=` ${f.dim.underline(`(${t})`)}`;return`${c} ${s}${l}${u}${d}${p}`}function ye(t,n,{pathname:i,method:a,request:o}){return t.find(t=>{if(!i||!t||!t.url||t.ws||!(t.method?e(t.method)?t.method:[t.method]:[`GET`,`POST`]).includes(a))return!1;let s=R(t.url,i);if(s&&t.validator){let e=U(t.url,i);if(r(t.validator))return t.validator({params:e,...o});try{return _e({params:e,...o},t.validator)}catch(e){let r=t.__filepath__;return n.error(`${f.red(`mock error at ${i}`)}\n${e}\n at validator (${f.underline(r)})`,t.log),!1}}return s})}const G=/^[\t\u0020-\u007E\u0080-\u00FF]+$/,be=/^(?:low|medium|high)$/i,K=Object.create(null),xe=/[\^$\\.*+?()[\]{}|]/g,Se=/[;=]/,Ce=/;/,we=/^(?:lax|none|strict)$/i;var Te=class{name;value;maxAge;expires;path=`/`;domain;secure=!1;httpOnly=!0;sameSite=!1;overwrite=!1;priority;partitioned;constructor(e,t,n={}){if(!G.test(e)||Se.test(e))throw TypeError(`argument name is invalid`);if(t&&(!G.test(t)||Ce.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&&!G.test(this.path))throw TypeError(`[Cookie] option path is invalid`);if(this.domain&&!G.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&&!be.test(this.priority))throw TypeError(`[Cookie] option priority is invalid`);if(this.sameSite&&this.sameSite!==!0&&!we.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 Ee(e,t){if(e.length!==t.length)return!1;if(D.timingSafeEqual)return D.timingSafeEqual(e,t);for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}function q(e,t){return D.createHmac(`sha256`,e).update(t).digest()}function De(e,t){let n=String(e),r=String(t),i=D.randomBytes(32);return Ee(q(i,n),q(i,r))&&e===t}const Oe=/[/+=]/g,ke={"/":`_`,"+":`-`,"=":``};var J=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 D.createHmac(this.algorithm,t).update(e).digest(this.encoding).replace(Oe,e=>ke[e])}index(e,t){for(let n=0,r=this.keys.length;n<r;n++)if(De(t,this.sign(e,this.keys[n])))return n;return-1}verify(e,t){return this.index(e,t)>-1}},Y=class{request;response;secure;keys;constructor(t,n,r={}){this.request=t,this.response=n,this.secure=r.secure,r.keys instanceof J?this.keys=r.keys:e(r.keys)&&(this.keys=new J(r.keys))}set(e,t,n){let r=this.request,i=this.response,a=l(i.getHeader(`Set-Cookie`)),o=new Te(e,t,n),s=n?.signed??!!this.keys,c=this.secure===void 0?r.protocol===`https`||je(r):!!this.secure;if(!c&&n?.secure)throw Error(`Cannot send secure cookie over unencrypted connection`);if(o.secure=n?.secure??c,Me(a,o),s&&n){if(!this.keys)throw Error(`.keys required for signed cookies`);o.value=this.keys.sign(o.toString()),o.name+=`.sig`,Me(a,o)}return(i.set?E.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(Ae(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 Ae(e){return K[e]||(K[e]=RegExp(`(?:^|;) *${e.replace(xe,`\\$&`)}=([^;]*)`)),K[e]}function je(e){return!!(e.socket?e.socket.encrypted:e.connection.encrypted)}function Me(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 X={};function Z(e){if(X[e])return X[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(g(e).tokens),X[e]=t,t}function Ne(e){let t=e.map(e=>Z(e).length);return t=t.length===0?[1]:t,Math.max(...t)+2}function Pe(e){let t=Z(e),n=0;for(let e=0;e<t.length;e++)t[e].type!==`text`&&(n+=10**(e+1)),n+=10**(e+1);return n}function Fe(e){let t=[],n=[];for(let t of e){let e=Z(t).filter(e=>e.type!==`text`).length;n[e]||(n[e]=[]),n[e].push(t)}for(let e of n.filter(e=>e&&e.length>0))t=[...t,...s(e,Pe).reverse()];return t}function Ie(e){let t=Ne(e);return s(e,e=>{let n=Z(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 Le(t,r,i){let a=Ie(Fe(t.filter(e=>R(e,r)))),{global:o=[],special:s={}}=i;if(o.length===0&&n(s)||a.length===0)return a;let[c,l]=Re(a),d=o.filter(e=>l.includes(e));if(d.length>0&&(a=u([...c,...d,...l])),n(s))return a;let f=Object.keys(s).filter(e=>a.includes(e))[0];if(!f)return a;let p=s[f],{rules:m,when:h}=e(p)?{rules:p,when:[]}:p;return m.includes(a[0])&&(h.length===0||h.some(e=>_(e).regexp.test(r)))&&(a=u([f,...a])),a}function Re(e){let t=[],n=[];for(let r of e)Z(r).filter(e=>e.type!==`text`).length>0?n.push(r):t.push(r);return[t,n]}const Q=new WeakMap;function ze(e){let t=[];e.addListener(`data`,e=>{t.push(O.from(e))}),e.addListener(`end`,()=>{t.length&&Q.set(e,O.concat(t))})}function Be(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 Ve(e){return k[e]||`Unknown`}function $(e,t=200,n){e.statusCode=t,e.statusMessage=n||Ve(t)}async function He(e,t,n,i){let{headers:a,type:o=`json`}=n,s=n.__filepath__,c=A.contentType(o)||A.contentType(A.lookup(o)||``);if(c&&t.setHeader(`Content-Type`,c),t.setHeader(`Cache-Control`,`no-cache,max-age=0`),t.setHeader(`X-Mock-Power-By`,`vite-plugin-mock-dev-server`),s&&t.setHeader(`X-File-Path`,s),a)try{let n=r(a)?await a(e):a;Object.keys(n).forEach(e=>{t.setHeader(e,n[e])})}catch(t){i.error(`${f.red(`mock error at ${e.url.split(`?`)[0]}`)}\n${t}\n at headers (${f.underline(s)})`,n.log)}}async function Ue(t,n,i,a){let{cookies:o}=i,s=i.__filepath__;if(o)try{let i=r(o)?await o(t):o;Object.keys(i).forEach(t=>{let r=i[t];if(e(r)){let[e,i]=r;n.setCookie(t,e,i)}else n.setCookie(t,r)})}catch(e){a.error(`${f.red(`mock error at ${t.url.split(`?`)[0]}`)}\n${e}\n at cookies (${f.underline(s)})`,i.log)}}function We(e,t,n){if(ne(t))t.pipe(e);else if(O.isBuffer(t))e.end(n===`text`||n===`json`?t.toString(`utf-8`):t);else{let r=typeof t==`string`?t:JSON.stringify(t);e.end(n===`buffer`?O.from(r):r)}}async function Ge(t,n){if(!n||typeof n==`number`&&n<=0||e(n)&&n.length!==2)return;let r=0;if(e(n)){let[e,t]=n;r=a(e,t)}else r=n-(c()-t);r>0&&await o(r)}function Ke(e,{formidableOptions:t={},bodyParserOptions:n={},proxies:i,cookiesOptions:a,logger:o,priority:s={}}){return async function(l,u,d){let p=c(),{query:m,pathname:h}=B(l.url);if(!h||i.length===0||!i.some(e=>M(e,l.url,l)))return d();let g=e.mockData,_=Le(Object.keys(g),h,s);if(_.length===0)return d();ze(l);let{query:v}=B(l.headers.referer||``),y=await me(l,t,n),b=new Y(l,u,a),x=b.get.bind(b),S=l.method.toUpperCase(),C,w;for(let e of _)if(C=ye(g[e],o,{pathname:h,method:S,request:{query:m,refererQuery:v,body:y,headers:l.headers,getCookie:x}}),C){w=e;break}if(!C){let e=_.map(e=>e===w?f.underline.bold(e):f.dim(e)).join(`, `);return o.warn(`${f.green(h)} matches ${e} , but mock data is not found.`),d()}let T=l,E=u;T.body=y,T.query=m,T.refererQuery=v,T.params=U(C.url,h),T.getCookie=x,E.setCookie=b.set.bind(b);let{body:D,delay:O,type:k=`json`,response:A,status:j=200,statusText:ee,log:N,__filepath__:P}=C;if($(E,j,ee),await He(T,E,C,o),await Ue(T,E,C,o),o.info(ve(T,P),N),o.debug(`${f.magenta(`DEBUG`)} ${f.underline(h)} matches: [ ${_.map(e=>e===w?f.underline.bold(e):f.dim(e)).join(`, `)} ]\n`),D){try{let e=r(D)?await D(T):D;await Ge(p,O),We(E,e,k)}catch(e){o.error(`${f.red(`mock error at ${h}`)}\n${e}\n at body (${f.underline(P)})`,N),$(E,500),u.end(``)}return}if(A){try{await Ge(p,O),await A(T,E,d)}catch(e){o.error(`${f.red(`mock error at ${h}`)}\n${e}\n at response (${f.underline(P)})`,N),$(E,500),u.end(``)}return}u.end(``)}}function qe(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=a.get(e);n||a.set(e,n=new Set),n.add(t)},u=(e,t,n,r,a,o)=>{try{n.setup?.(t,r),t.on(`close`,()=>e.delete(a)),t.on(`error`,e=>{i.error(`${f.red(`WebSocket mock error at ${t.path}`)}\n${e}\n at setup (${o})`,n.log)})}catch(e){i.error(`${f.red(`WebSocket mock error at ${t.path}`)}\n${e}\n at setup (${o})`,n.log)}},d=(e,t,n,r,i)=>{let{cleanupList:a,connectionList:o,context:c}=s.get(t);Xe(a),o.forEach(({ws:e})=>e.removeAllListeners()),t.removeAllListeners(),u(e,t,n,c,r,i),o.forEach(({ws:e,req:n})=>Ye(t,e,n,o))};e.on(`update`,({filepath: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())d(e,i,n,r,t)}}),t?.on(`upgrade`,(t,a,o)=>{let{pathname:d,query:p}=B(t.url);if(!d||n.length===0||!n.some(e=>M(e,t.url,t)))return;let m=e.mockData,h=Object.keys(m).find(e=>R(e,d));if(!h)return;let g=m[h].find(e=>e.url&&e.ws&&R(e.url,d));if(!g)return;let _=g.__filepath__;l(_,h);let v=c(h),y=Je(v,d),b=s.get(y);if(!b){let e=[],t={onCleanup:t=>e.push(t)};b={cleanupList:e,context:t,connectionList:[]},s.set(y,b),u(v,y,g,t,d,_)}let x=t,S=new Y(t,t,r),{query:C}=B(t.headers.referer||``);x.query=p,x.refererQuery=C,x.params=U(h,d),x.getCookie=S.get.bind(S),y.handleUpgrade(x,a,o,e=>{i.info(`${f.magenta(f.bold(`WebSocket`))} ${f.green(t.url)} connected ${f.dim(`(${_})`)}`,g.log),b.connectionList.push({req:x,ws:e}),Ye(y,e,x,b.connectionList)})}),t?.on(`close`,()=>{for(let e of o.values()){for(let t of e.values())Xe(s.get(t).cleanupList),t.close();e.clear()}o.clear(),a.clear()})}function Je(e,t){let n=e.get(t);return n||e.set(t,n=new j({noServer:!0})),n}function Ye(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)})}function Xe(e){let t;for(;t=e.shift();)t?.()}export{ee as _,de as a,B as c,re as d,z as f,M as g,N as h,fe as i,le as l,P as m,Ke as n,V as o,R as p,Be as r,ue as s,qe as t,ie as u};