vite-plugin-mock-dev-server 2.0.7 → 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/dist/{types-C8ZwTU-4.d.mts → config-7dnQWJSY.d.ts} +501 -173
- package/dist/helper.d.ts +271 -0
- package/dist/index-x4QPVyiP.d.ts +270 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +48 -0
- package/dist/logger-C-7qpBNh.js +2 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.js +1 -0
- package/dist/types.d.ts +7 -0
- package/package.json +27 -22
- package/dist/helper.d.mts +0 -126
- package/dist/index.d.mts +0 -9
- package/dist/index.mjs +0 -37
- package/dist/server-BEkc6AaK.mjs +0 -1
- package/dist/server-lwszq3fl.d.mts +0 -89
- package/dist/server.d.mts +0 -2
- package/dist/server.mjs +0 -1
- package/dist/types.d.mts +0 -2
- /package/dist/{helper.mjs → helper.js} +0 -0
- /package/dist/{types.mjs → types.js} +0 -0
package/dist/server.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as e,i as t,l as n,n as r,r as i,s as a,t as o}from"./logger-C-7qpBNh.js";export{o as createLogger,t as createMockMiddleware,r as logLevels,i as mockWebSocket,a as processMockData,e as processRawData,n as sortByValidator};
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { C as MockResponse, D as SetCookieOption, E as GetCookieOption, S as MockRequest, T as CookiesOption, _ as RecordedRes, a as MockHttpItem, b as Headers, c as LogType, d as MockServerPluginOptions, f as ServerBuildOption, g as RecordedRequest, h as RecordedReq, i as MockErrorConfig, l as MockMatchPriority, m as RecordedMeta, n as MockWebsocketItem, o as BodyParserOptions, p as RecordOptions, r as WebSocketSetupContext, s as LogLevel, t as MockOptions, u as MockMatchSpecialPriority, v as ResolvedRecordOptions, w as ResponseBody, x as Method, y as ExtraRequest } from "./config-7dnQWJSY.js";
|
|
2
|
+
import formidable from "formidable";
|
|
3
|
+
|
|
4
|
+
//#region src/types/index.d.ts
|
|
5
|
+
type FormidableFile = formidable.File | formidable.File[];
|
|
6
|
+
//#endregion
|
|
7
|
+
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,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vite-plugin-mock-dev-server",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "2.0
|
|
4
|
+
"version": "2.1.0",
|
|
5
|
+
"description": "Vite Plugin for API mock dev server.",
|
|
5
6
|
"author": "pengzhanbo <q942450674@outlook.com> (https://github.com/pengzhanbo)",
|
|
6
7
|
"license": "MIT",
|
|
7
8
|
"homepage": "https://vite-plugin-mock-dev-server.netlify.app",
|
|
@@ -19,27 +20,26 @@
|
|
|
19
20
|
],
|
|
20
21
|
"exports": {
|
|
21
22
|
".": {
|
|
22
|
-
"
|
|
23
|
-
|
|
24
|
-
"default": "./dist/index.mjs"
|
|
25
|
-
}
|
|
23
|
+
"types": "./dist/index.d.ts",
|
|
24
|
+
"import": "./dist/index.js"
|
|
26
25
|
},
|
|
27
26
|
"./helper": {
|
|
28
|
-
"
|
|
29
|
-
|
|
30
|
-
"default": "./dist/helper.mjs"
|
|
31
|
-
}
|
|
27
|
+
"types": "./dist/helper.d.ts",
|
|
28
|
+
"import": "./dist/helper.js"
|
|
32
29
|
},
|
|
33
30
|
"./server": {
|
|
34
|
-
"
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
31
|
+
"types": "./dist/server.d.ts",
|
|
32
|
+
"import": "./dist/server.js"
|
|
33
|
+
},
|
|
34
|
+
"./types": {
|
|
35
|
+
"types": "./dist/types.d.ts",
|
|
36
|
+
"import": "./dist/types.js"
|
|
38
37
|
},
|
|
39
38
|
"./package.json": "./package.json"
|
|
40
39
|
},
|
|
41
|
-
"main": "dist/index.
|
|
42
|
-
"
|
|
40
|
+
"main": "dist/index.js",
|
|
41
|
+
"module": "dist/index.js",
|
|
42
|
+
"types": "dist/index.d.ts",
|
|
43
43
|
"files": [
|
|
44
44
|
"dist"
|
|
45
45
|
],
|
|
@@ -49,7 +49,8 @@
|
|
|
49
49
|
"peerDependencies": {
|
|
50
50
|
"esbuild": ">=0.21.0",
|
|
51
51
|
"rolldown": ">=1.0.0-beta.1",
|
|
52
|
-
"vite": ">=5.0.0"
|
|
52
|
+
"vite": ">=5.0.0",
|
|
53
|
+
"zstd-codec": ">=0.1.5"
|
|
53
54
|
},
|
|
54
55
|
"peerDependenciesMeta": {
|
|
55
56
|
"esbuild": {
|
|
@@ -57,14 +58,17 @@
|
|
|
57
58
|
},
|
|
58
59
|
"rolldown": {
|
|
59
60
|
"optional": true
|
|
61
|
+
},
|
|
62
|
+
"zstd-codec": {
|
|
63
|
+
"optional": true
|
|
60
64
|
}
|
|
61
65
|
},
|
|
62
66
|
"dependencies": {
|
|
63
|
-
"@pengzhanbo/utils": "^
|
|
67
|
+
"@pengzhanbo/utils": "^3.3.1",
|
|
64
68
|
"ansis": "^4.2.0",
|
|
65
69
|
"chokidar": "^5.0.0",
|
|
66
70
|
"co-body": "^6.2.0",
|
|
67
|
-
"cors": "^2.8.
|
|
71
|
+
"cors": "^2.8.6",
|
|
68
72
|
"debug": "^4.4.3",
|
|
69
73
|
"formidable": "3.5.4",
|
|
70
74
|
"http-status": "^2.1.0",
|
|
@@ -75,12 +79,13 @@
|
|
|
75
79
|
"path-to-regexp": "^8.3.0",
|
|
76
80
|
"picomatch": "^4.0.3",
|
|
77
81
|
"tinyglobby": "^0.2.15",
|
|
78
|
-
"ws": "^8.
|
|
82
|
+
"ws": "^8.19.0"
|
|
79
83
|
},
|
|
80
84
|
"devDependencies": {
|
|
81
|
-
"esbuild": "^0.27.
|
|
82
|
-
"rolldown": "^1.0.0-
|
|
83
|
-
"vite": "^8.0.0-beta.
|
|
85
|
+
"esbuild": "^0.27.3",
|
|
86
|
+
"rolldown": "^1.0.0-rc.6",
|
|
87
|
+
"vite": "^8.0.0-beta.16",
|
|
88
|
+
"zstd-codec": "^0.1.5"
|
|
84
89
|
},
|
|
85
90
|
"publishConfig": {
|
|
86
91
|
"access": "public",
|
package/dist/helper.d.mts
DELETED
|
@@ -1,126 +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-C8ZwTU-4.mjs";
|
|
2
|
-
import { IncomingMessage, OutgoingHttpHeaders, ServerResponse } from "node:http";
|
|
3
|
-
import { Transform } from "node:stream";
|
|
4
|
-
|
|
5
|
-
//#region src/helper/createSSEStream.d.ts
|
|
6
|
-
interface SSEMessage {
|
|
7
|
-
data?: string | object;
|
|
8
|
-
comment?: string;
|
|
9
|
-
event?: string;
|
|
10
|
-
id?: string;
|
|
11
|
-
retry?: number;
|
|
12
|
-
}
|
|
13
|
-
interface WriteHeaders {
|
|
14
|
-
writeHead?: (statusCode: number, headers?: OutgoingHttpHeaders) => WriteHeaders;
|
|
15
|
-
flushHeaders?: () => void;
|
|
16
|
-
}
|
|
17
|
-
type HeaderStream = NodeJS.WritableStream & WriteHeaders;
|
|
18
|
-
/**
|
|
19
|
-
* Transforms "messages" to W3C event stream content.
|
|
20
|
-
* See https://html.spec.whatwg.org/multipage/server-sent-events.html
|
|
21
|
-
* A message is an object with one or more of the following properties:
|
|
22
|
-
* - data (String or object, which gets turned into JSON)
|
|
23
|
-
* - event
|
|
24
|
-
* - id
|
|
25
|
-
* - retry
|
|
26
|
-
* - comment
|
|
27
|
-
*
|
|
28
|
-
* If constructed with a HTTP Request, it will optimise the socket for streaming.
|
|
29
|
-
* If this stream is piped to an HTTP Response, it will set appropriate headers.
|
|
30
|
-
*/
|
|
31
|
-
declare class SSEStream extends Transform {
|
|
32
|
-
constructor(req: IncomingMessage);
|
|
33
|
-
pipe<T extends HeaderStream>(destination: T, options?: {
|
|
34
|
-
end?: boolean;
|
|
35
|
-
}): T;
|
|
36
|
-
_transform(message: SSEMessage, encoding: string, callback: (error?: (Error | null), data?: any) => void): void;
|
|
37
|
-
write(message: SSEMessage, encoding?: BufferEncoding, cb?: (error: Error | null | undefined) => void): boolean;
|
|
38
|
-
write(message: SSEMessage, cb?: (error: Error | null | undefined) => void): boolean;
|
|
39
|
-
destroy(error?: Error): this;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* 创建一个 Server-sent events 写入流,用于支持模拟 EventSource
|
|
43
|
-
*
|
|
44
|
-
* @example
|
|
45
|
-
* ```ts
|
|
46
|
-
* import { createSSEStream, defineMock } from 'vite-plugin-mock-dev-server'
|
|
47
|
-
*
|
|
48
|
-
* export default defineMock({
|
|
49
|
-
* url: '/api',
|
|
50
|
-
* response: (req, res) => {
|
|
51
|
-
* const sse = createSSEStream(req, res)
|
|
52
|
-
* sse.write({ event: 'message', data: { message: 'hello world' } })
|
|
53
|
-
* }
|
|
54
|
-
* })
|
|
55
|
-
* ```
|
|
56
|
-
*/
|
|
57
|
-
declare function createSSEStream(req: IncomingMessage, res: ServerResponse): SSEStream;
|
|
58
|
-
//#endregion
|
|
59
|
-
//#region src/helper/defineMock.d.ts
|
|
60
|
-
/**
|
|
61
|
-
* mock config Type helper
|
|
62
|
-
*
|
|
63
|
-
* mock配置 类型帮助函数
|
|
64
|
-
* @param config see config docs:
|
|
65
|
-
* {@link https://vite-plugin-mock-dev-server.netlify.app/guide/mock-config en-US DOC} |
|
|
66
|
-
* {@link https://vite-plugin-mock-dev-server.netlify.app/zh/guide/mock-config zh-CN DOC}
|
|
67
|
-
*
|
|
68
|
-
* @example
|
|
69
|
-
* Mock Http Request
|
|
70
|
-
* ```ts
|
|
71
|
-
* export default defineMock({
|
|
72
|
-
* url: '/api/example',
|
|
73
|
-
* method: ['GET', 'POST'],
|
|
74
|
-
* body: { a: 1 },
|
|
75
|
-
* })
|
|
76
|
-
* ```
|
|
77
|
-
* ```ts
|
|
78
|
-
* export default defineMock({
|
|
79
|
-
* url: '/api/example',
|
|
80
|
-
* method: 'GET',
|
|
81
|
-
* body: ({ query }) => ({ a: 1, b: query.b }),
|
|
82
|
-
* })
|
|
83
|
-
* ```
|
|
84
|
-
* @example
|
|
85
|
-
* Mock WebSocket
|
|
86
|
-
* ```ts
|
|
87
|
-
* export default defineMock({
|
|
88
|
-
* url: '/socket.io',
|
|
89
|
-
* ws: true,
|
|
90
|
-
* setup(wss) {
|
|
91
|
-
* wss.on('connection', (ws) => {
|
|
92
|
-
* ws.on('message', (rawData) => console.log(rawData))
|
|
93
|
-
* ws.send('data')
|
|
94
|
-
* })
|
|
95
|
-
* },
|
|
96
|
-
* })
|
|
97
|
-
* ```
|
|
98
|
-
*/
|
|
99
|
-
declare function defineMock(config: MockHttpItem): MockHttpItem;
|
|
100
|
-
declare function defineMock(config: MockWebsocketItem): MockWebsocketItem;
|
|
101
|
-
declare function defineMock(config: MockOptions): MockOptions;
|
|
102
|
-
/**
|
|
103
|
-
* Return a custom defineMock function to support preprocessing of mock config.
|
|
104
|
-
*
|
|
105
|
-
* 返回一个自定义的 defineMock 函数,用于支持对 mock config 的预处理。
|
|
106
|
-
* @param transformer preprocessing function
|
|
107
|
-
* @example
|
|
108
|
-
* ```ts
|
|
109
|
-
* const definePostMock = createDefineMock((mock) => {
|
|
110
|
-
* mock.url = '/api/post/' + mock.url
|
|
111
|
-
* })
|
|
112
|
-
* export default definePostMock({
|
|
113
|
-
* url: 'list',
|
|
114
|
-
* body: [{ title: '1' }, { title: '2' }],
|
|
115
|
-
* })
|
|
116
|
-
* ```
|
|
117
|
-
*/
|
|
118
|
-
declare function createDefineMock(transformer: (mock: MockHttpItem | MockWebsocketItem) => MockHttpItem | MockWebsocketItem | void): typeof defineMock;
|
|
119
|
-
//#endregion
|
|
120
|
-
//#region src/helper/defineMockData.d.ts
|
|
121
|
-
type MockData<T = any> = readonly [() => T, (val: T | ((val: T) => T | void)) => void] & {
|
|
122
|
-
value: T;
|
|
123
|
-
};
|
|
124
|
-
declare function defineMockData<T = any>(key: string, initialData: T): MockData<T>;
|
|
125
|
-
//#endregion
|
|
126
|
-
export { BodyParserOptions, ExtraRequest, FormidableFile, HeaderStream, LogLevel, LogType, Method, MockData, MockHttpItem, MockMatchPriority, MockMatchSpecialPriority, MockOptions, MockRequest, MockResponse, MockServerPluginOptions, MockWebsocketItem, ResponseBody, SSEMessage, ServerBuildOption, WebSocketSetupContext, createDefineMock, createSSEStream, defineMock, defineMockData };
|
package/dist/index.d.mts
DELETED
|
@@ -1,9 +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-C8ZwTU-4.mjs";
|
|
2
|
-
import { HeaderStream, MockData, SSEMessage, createDefineMock, createSSEStream, defineMock, defineMockData } from "./helper.mjs";
|
|
3
|
-
import { a as createLogger, c as processRawData, i as Logger, l as sortByValidator, n as CreateMockMiddlewareOptions, o as logLevels, r as createMockMiddleware, s as processMockData, t as mockWebSocket } from "./server-lwszq3fl.mjs";
|
|
4
|
-
import { Plugin } from "vite";
|
|
5
|
-
|
|
6
|
-
//#region src/plugin.d.ts
|
|
7
|
-
declare function mockDevServerPlugin(options?: MockServerPluginOptions): Plugin[];
|
|
8
|
-
//#endregion
|
|
9
|
-
export { BodyParserOptions, CreateMockMiddlewareOptions, ExtraRequest, type FormidableFile, HeaderStream, LogLevel, LogType, Logger, Method, MockData, type MockHttpItem, MockMatchPriority, MockMatchSpecialPriority, type MockOptions, type MockRequest, MockResponse, type MockServerPluginOptions, type MockWebsocketItem, ResponseBody, SSEMessage, ServerBuildOption, WebSocketSetupContext, createDefineMock, createLogger, createMockMiddleware, createSSEStream, defineMock, defineMockData, logLevels, mockDevServerPlugin, mockWebSocket, processMockData, processRawData, sortByValidator };
|
package/dist/index.mjs
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import{a as e,c as t,d as n,f as r,h as i,i as a,l as o,m as s,n as c,o as l,p as u,r as d,s as f,t as p,u as m}from"./server-BEkc6AaK.mjs";import{createDefineMock as h,createSSEStream as g,defineMock as _,defineMockData as v}from"./helper.mjs";import{isArray as y,isBoolean as ee,promiseParallel as b,toArray as x,uniq as te}from"@pengzhanbo/utils";import S,{promises as C}from"node:fs";import w from"node:fs/promises";import T from"node:path";import E from"node:process";import D from"ansis";import{getPackageInfoSync as ne,loadPackageJSON as O,loadPackageJSONSync as k}from"local-pkg";import{pathToFileURL as A}from"node:url";import j from"json5";import re from"node:events";import{watch as M}from"chokidar";import{glob as N}from"tinyglobby";import ie from"is-core-module";import ae from"cors";const oe={name:`externalize-deps`,setup(e){e.onResolve({filter:/.*/},({path:e})=>{if(e[0]!==`.`&&!T.isAbsolute(e))return{external:!0}})}},P={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(j.parse(t))}`,loader:`js`}})}},F={name:`json-loader`,setup(e){e.onLoad({filter:/\.json$/},async({path:e})=>({contents:`export default ${await w.readFile(e,`utf-8`)}`,loader:`js`}))}},I={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 L(e){return{name:`alias-plugin`,setup(t){t.onResolve({filter:/.*/},async({path:n})=>{let r=e.find(({find:e})=>R(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 R(e,t){return e instanceof RegExp?e.test(t):t.length<e.length?!1:t===e?!0:t.startsWith(`${e}/`)}let z=null;async function B(){return z||=(await import(`esbuild`)).build,z}async function V(e,{isESM:t=!0,define:n,alias:r,cwd:i=E.cwd()}){let a=T.resolve(i,e),o=T.basename(e),s=T.dirname(a);try{let c=await(await B())({entryPoints:[e],outfile:`out.js`,write:!1,target:[`node18`],platform:`node`,bundle:!0,metafile:!0,format:t?`esm`:`cjs`,define:{...n,__dirname:JSON.stringify(s),__filename:JSON.stringify(o),...t?{}:{"import.meta.url":JSON.stringify(A(a))}},plugins:[L(r),I,oe,F,P],absWorkingDir:i}),l=new Set,u=c.metafile?.inputs||{};return Object.keys(u).forEach(e=>u[e].imports.forEach(e=>l.add(e.path))),{code:c.outputFiles[0].text,deps:Array.from(l)}}catch(e){console.error(e)}return{code:``,deps:[]}}async function H({filepath:e,code:t,isESM:n,cwd:r}){e=T.resolve(r,e);let i=n?`.mjs`:`.cjs`,a=`${e}.timestamp-${Date.now()}${i}`,o=A(a).toString();await C.writeFile(a,t,`utf8`);try{let e=await import(o);return e.default||e}finally{try{S.unlinkSync(a)}catch{}}}const U={name:`vite-mock:rename-plugin`,resolveId(e){if(e===`vite-plugin-mock-dev-server`)return{id:`vite-plugin-mock-dev-server/helper`,external:!0}}},W={name:`vite-mock:json5-plugin`,transform:{filter:{id:/\.json5$/},handler:e=>({code:`export default ${j.stringify(j.parse(e))}`})}};let G=null;async function K(){return G||={build:(await import(`rolldown`)).build,aliasPlugin:(await import(`rolldown/experimental`)).viteAliasPlugin},G}async function q(e,{isESM:t=!0,define:n,alias:r,cwd:i=E.cwd()}){let a=T.resolve(i,e),o=T.basename(e),s=T.dirname(a),c=e=>!!r.find(({find:t})=>R(t,e));try{let{build:l,aliasPlugin:u}=await K(),d=await l({input:e,write:!1,cwd:i,output:{format:t?`esm`:`cjs`,sourcemap:!1,file:`out.js`},platform:`node`,transform:{define:{...n,__dirname:JSON.stringify(s),__filename:JSON.stringify(o),...t?{}:{"import.meta.url":JSON.stringify(A(a))}}},external(e){if(c(e))return!1;if(e[0]!==`.`&&!T.isAbsolute(e)&&e!==`vite-plugin-mock-dev-server`)return!0},plugins:[u({entries:r}),U,W],onLog(e,t,n){t.code===`PLUGIN_TIMINGS`&&t.message.includes(`vite-mock`)||n(e,t)}});return{code:d.output[0].code,deps:d.output[0].imports}}catch(e){console.error(e)}return{code:``,deps:[]}}async function J(e,t){if(await u(`rolldown`))return q(e,t);if(await u(`esbuild`))return V(e,t);throw Error(`rolldown or esbuild not found`)}async function se(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 H({filepath:e,code:r,isESM:n,cwd:t.cwd||E.cwd()})||{},deps:i}}var ce=class extends re{moduleCache=new Map;moduleDeps=new Map;cwd;mockWatcher;depsWatcher;isESM=!1;_mockData={};options;constructor(e){super(),this.options=e,this.cwd=e.cwd||E.cwd();try{this.isESM=k(this.cwd)?.type===`module`}catch{}}get mockData(){return this._mockData}run(e){let{include:t,exclude:n}=this.options,{pattern:r,ignore:a,isMatch:s}=i(t,n);if(N(r,{ignore:a,cwd:T.join(this.cwd,this.options.dir)}).then(e=>e.map(e=>()=>this.load(o(T.join(this.options.dir,e))))).then(e=>b(e,64)).then(()=>this.updateMockData()),!e)return;this.watchMockEntry(s),this.watchDeps();let c=null;this.on(`mock:update`,async e=>{s(e)&&(await this.load(e),c&&clearImmediate(c),c=setImmediate(()=>{this.updateMockData(),this.emit(`mock:update-end`,o(e)),c=null}))}),this.on(`mock:unlink`,async e=>{s(e)&&(e=o(T.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(t){if(t)try{let{define:n,alias:r}=this.options,{data:i,deps:a}=await se(t,{cwd:this.cwd,isESM:this.isESM,define:n,alias:r});this.moduleCache.set(t,e(i,t)),this.updateModuleDeps(t,a)}catch(e){console.error(e)}}updateMockData(){this._mockData=a(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 n=this.mockWatcher=M(this.options.dir,{ignoreInitial:!0,cwd:this.cwd,ignored:(t,n)=>t.includes(`node_modules`)?!0:!!n?.isFile()&&!e(t)});n.on(`add`,async e=>{e=o(e),this.emit(`mock:update`,e),t(`watcher:add`,e)}),n.on(`change`,async e=>{e=o(e),this.emit(`mock:update`,e),t(`watcher:change`,e)}),n.on(`unlink`,async e=>{e=o(e),this.emit(`mock:unlink`,e),t(`watcher:unlink`,e)})}watchDeps(){let e=[...this.moduleDeps.keys()],t=this.depsWatcher=M([...e],{ignoreInitial:!0,cwd:this.cwd});t.on(`change`,e=>{e=o(e),this.moduleDeps.get(e)?.forEach(e=>this.emit(`mock:update`,e))}),t.on(`unlink`,e=>{e=o(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)})}};async function le(e,t,n,r){let{pattern:a,ignore:s}=i(n,r),c=await N(a,{ignore:s,cwd:T.join(e,t)}),l=``,u=[];return c.forEach((n,r)=>{let i=o(T.join(e,t,n));l+=`import * as m${r} from '${i}';\n`,u.push(`[m${r}, '${o(T.join(t,n))}']`)}),`import { processMockData, processRawData } from 'vite-plugin-mock-dev-server/server';
|
|
2
|
-
${l}
|
|
3
|
-
const exporters = [\n ${u.join(`,
|
|
4
|
-
`)}\n];
|
|
5
|
-
const mockList = exporters.map(([mod, filepath]) => processRawData(mod.default || mod, filepath));
|
|
6
|
-
export default processMockData(mockList);`}var Y=`vite-plugin-mock-dev-server`,ue=`2.0.7`;function de(e,t){let n=new Set,r=[Y,`connect`,`cors`],i=e=>t.find(({find:t})=>R(t,e));return e.forEach(e=>{let t=fe(e);t.startsWith(`<define:`)||i(t)||ie(t)||t[0]===`/`||t.startsWith(`./`)||t.startsWith(`../`)||r.includes(t)||n.add(t)}),Array.from(n)}function fe(e){let[t,n]=e.split(`/`);return t[0]===`@`?`${t}/${n}`:t}function pe(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`,[Y]:`^${ue}`,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=ne(e);a.dependencies[e]=t?.version?`^${t.version}`:`latest`}else a.dependencies[e]=`latest`}return JSON.stringify(a,null,2)}function me({proxies:e,wsProxies:t,cookiesOptions:n,bodyParserOptions:r,priority:i,build:a}){let{serverPort:o,log:s}=a;return`import { createServer } from 'node:http';
|
|
7
|
-
import connect from 'connect';
|
|
8
|
-
import corsMiddleware from 'cors';
|
|
9
|
-
import { createMockMiddleware, createLogger, mockWebSocket } from 'vite-plugin-mock-dev-server/server';
|
|
10
|
-
import mockData from './mock-data.js';
|
|
11
|
-
|
|
12
|
-
const app = connect();
|
|
13
|
-
const server = createServer(app);
|
|
14
|
-
const logger = createLogger('mock-server', '${s}');
|
|
15
|
-
const proxies = ${JSON.stringify(e)};
|
|
16
|
-
const wsProxies = ${JSON.stringify(t)};
|
|
17
|
-
const cookiesOptions = ${JSON.stringify(n)};
|
|
18
|
-
const bodyParserOptions = ${JSON.stringify(r)};
|
|
19
|
-
const priority = ${JSON.stringify(i)};
|
|
20
|
-
const compiler = { mockData }
|
|
21
|
-
|
|
22
|
-
mockWebSocket(compiler, server, { wsProxies, cookiesOptions, logger });
|
|
23
|
-
|
|
24
|
-
app.use(corsMiddleware());
|
|
25
|
-
app.use(createMockMiddleware(compiler, {
|
|
26
|
-
formidableOptions: { multiples: true },
|
|
27
|
-
proxies,
|
|
28
|
-
priority,
|
|
29
|
-
cookiesOptions,
|
|
30
|
-
bodyParserOptions,
|
|
31
|
-
logger,
|
|
32
|
-
}));
|
|
33
|
-
|
|
34
|
-
server.listen(${o});
|
|
35
|
-
|
|
36
|
-
console.log('listen: http://localhost:${o}');
|
|
37
|
-
`}async function he(e,t){let n=x(t.include),r=x(t.exclude),i=t.cwd||E.cwd(),a=t.dir,o=await O(t.context)||{},s=t.build.dist,c=await le(i,a,n,r),l=T.join(i,`mock-data-${Date.now()}.js`);await w.writeFile(l,c,`utf-8`);let{code:u,deps:d}=await J(l,t),f=de(d,t.alias);await w.unlink(l);let p=[{filename:T.join(s,`mock-data.js`),source:u},{filename:T.join(s,`index.js`),source:me(t)},{filename:T.join(s,`package.json`),source:pe(o,f)}];try{if(T.isAbsolute(s)){for(let{filename:e}of p)S.existsSync(e)&&await w.rm(e);t.logger.info(`${D.green(`✓`)} generate mock server in ${D.cyan(s)}`);for(let{filename:e,source:n}of p){S.mkdirSync(T.dirname(e),{recursive:!0}),await w.writeFile(e,n,`utf-8`);let r=(n.length/1024).toFixed(2),i=T.relative(s,e),a=i.length<30?` `.repeat(30-i.length):``;t.logger.info(` ${D.green(i)}${a}${D.bold.dim(`${r} kB`)}`)}}else for(let{filename:t,source:n}of p)e.emitFile({type:`asset`,fileName:t,source:n})}catch(e){console.error(e)}}function ge(e,{proxies:t,cors:n}){return n?function(i,a,o){let{pathname:c}=f(i.url);if(!c||t.length===0||!t.some(e=>s(e,i.url)))return o();let l=e.mockData;if(!Object.keys(l).find(e=>r(e,c)))return o();ae(n)(i,a,o)}:void 0}function X(e){let t={},n=E.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`?ve(n)&&(r[t]=n,a&&(i[t.slice(16)]=n)):(r[t]=Z(n),a&&(i[t.slice(16)]=n))}let a={},o={},s={};for(let t in a[`import.meta.hot`]=`undefined`,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`]=_e({...o,...i})),c}function _e(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)}: ${Z(a)}`,r!==n.length-1&&(t+=`, `)}return`${t}}`}function Z(e){return e===void 0?`undefined`:typeof e==`string`?e:JSON.stringify(e)}function ve(e){try{return JSON.parse(e),!0}catch{return!1}}function Q(e,t,n){let r=new ce(e);r.run(!!t),r.on(`mock:update-end`,()=>{e.reload&&n?.send({type:`full-reload`})}),t?.on(`close`,()=>r.close()),p(r,t,e);let i=[];return i.push(ge(r,e),c(r,e)),i.filter(Boolean)}function $({prefix:e=[],wsPrefix:t=[],cwd:n,dir:r=`mock`,include:i=[`**/*.mock.{js,ts,cjs,mjs,json,json5}`],exclude:a=[],reload:o=!1,log:s=`info`,cors:c=!0,formidableOptions:l={},build:u=!1,cookiesOptions:d={},bodyParserOptions:f={},priority:p={}},h){let g=m(`vite:mock`,ee(s)?s?`info`:`error`:s),{httpProxies:_}=ye(h.server.proxy||{}),v=te([...x(e),..._]),b=x(t);!v.length&&!b.length&&g.warn(`No proxy was configured, mock server will not work. See ${D.cyan(`https://vite-plugin-mock-dev-server.netlify.app/guide/usage`)}`);let S=c===!1?!1:h.server.cors!==!1,C={};S&&h.server.cors!==!1&&(C={...C,...typeof h.server.cors==`boolean`?{}:h.server.cors}),S&&c!==!1&&(C={...C,...typeof c==`boolean`?{}:c});let w=[],T=h.resolve.alias||[];return y(T)?w.push(...T):Object.entries(T).forEach(([e,t])=>{w.push({find:e,replacement:t})}),{cwd:n||E.cwd(),dir:r,include:i,exclude:a,context:h.root,reload:o,cors:S?C:!1,cookiesOptions:d,log:s,formidableOptions:{multiples:!0,...l},bodyParserOptions:f,priority:p,build:u?{serverPort:8080,dist:`mockServer`,log:`error`,...typeof u==`object`?u:{}}:!1,proxies:v,wsProxies:b,logger:g,alias:w,define:X(h)}}function ye(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 be(e={}){let t=[Se(e)];return e.build&&t.push(xe(e)),t}function xe(e){let t={},n;return{name:`vite-plugin-mock-dev-server-generator`,enforce:`post`,apply:`build`,configResolved(r){t=r,n=$(e,r),r.logger.warn(``)},async buildEnd(e){e||t.command!==`build`||await he(this,n)}}}function Se(e){let t;return{name:`vite-plugin-mock-dev-server`,enforce:`pre`,apply:`serve`,config(t){let n=x(e.wsPrefix);if(n.length&&t.server?.proxy){let e={};Object.keys(t.server.proxy).forEach(r=>{n.includes(r)||(e[r]=t.server.proxy[r])}),t.server.proxy=e}d(t)},configResolved(n){t=$(e,n),n.logger.warn(``)},configureServer({middlewares:e,httpServer:n,ws:r}){Q(t,n,r).forEach(t=>e.use(t))},configurePreviewServer({middlewares:e,httpServer:n}){Q(t,n).forEach(t=>e.use(t))}}}export{h as createDefineMock,m as createLogger,c as createMockMiddleware,g as createSSEStream,_ as defineMock,v as defineMockData,n as logLevels,be as mockDevServerPlugin,p as mockWebSocket,a as processMockData,e as processRawData,l as sortByValidator};
|
package/dist/server-BEkc6AaK.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{hasOwn as e,isArray as t,isBoolean as n,isEmptyObject as r,isFunction as i,isPlainObject as a,random as o,sleep as s,sortBy as c,timestamp as l,toArray as u,uniq as d}from"@pengzhanbo/utils";import f from"node:path";import p from"ansis";import m from"picomatch";import{match as h,parse as g,pathToRegexp as _}from"path-to-regexp";import v from"node:os";import y from"debug";import{parse as b}from"node:querystring";import x from"co-body";import S from"formidable";import C from"node:http";import w from"node:crypto";import{Buffer as T}from"node:buffer";import E from"http-status";import*as D from"mime-types";import{WebSocketServer as O}from"ws";function k(e,t){let n=[],r=[`**/node_modules/**`,...u(t)];return u(e).forEach(e=>{e[0]===`!`?r.push(e.slice(1)):n.push(e)}),{pattern:n,ignore:r,isMatch:m(n,{ignore:r})}}function A(e,t){return e[0]===`^`&&new RegExp(e).test(t)||t.startsWith(e)}function j(e){return typeof e==`object`&&!!e&&typeof e.pipe==`function`}function M(e){return j(e)&&e.readable!==!1&&typeof e._read==`function`&&typeof e._readableState==`object`}const N={};async function P(t){if(e(N,t))return N[t];try{return import.meta.resolve?N[t]=!!import.meta.resolve(t):(await import(t),N[t]=!0),N[t]}catch{}return N[t]=!1,!1}function F(e,t){if(!t)return!0;for(let n in t)if(!ee(e[n],t[n]))return!1;return!0}function ee(e,n){if(t(e)&&t(n)){let t=new Set;return n.every(n=>e.some((e,r)=>{if(t.has(r))return!1;let i=ee(e,n);return i&&t.add(r),i}))}return a(e)&&a(n)?F(e,n):Object.is(e,n)}const I=new Map;function L(e,t){let n=I.get(e);return n||(n=_(e).regexp,I.set(e,n)),n.test(t)}const R={silent:0,error:1,warn:2,info:3,debug:4};function te(e,t=`info`){e=`[${e}]`;function r(r,i,a){if(a=n(a)?a?t:`error`:a,R[a]>=R[r]){let t=r===`info`||r===`debug`?`log`:r,n=r===`debug`?p.magenta.bold(e):r===`info`?p.cyan.bold(e):r===`warn`?p.yellow.bold(e):p.red.bold(e),a=`${p.dim(new Date().toLocaleTimeString())} ${n} ${i}`;console[t](a)}}return{debug(e,n=t){r(`debug`,e,n)},info(e,n=t){r(`info`,e,n)},warn(e,n=t){r(`warn`,e,n)},error(e,n=t){r(`error`,e,n)}}}const ne=y(`vite:mock-dev-server`),re=/\\/g,ie=v.platform()===`win32`;function ae(e){return e.replace(re,`/`)}function oe(e){return f.posix.normalize(ie?ae(e):e)}function z(e){let t=new URL(e,`http://example.com`);return{pathname:decodeURIComponent(t.pathname),query:b(t.search.replace(/^\?/,``))}}function se(e,n){let r;return t(e)?r=e.map(e=>({...e,__filepath__:n})):`url`in e?r={...e,__filepath__:n}:(r=[],Object.keys(e).forEach(i=>{let a=e[i];t(a)?r.push(...a.map(e=>({...e,__filepath__:n}))):r.push({...a,__filepath__:n})})),r}function ce(e){let t=[];for(let[,n]of e.entries())n&&t.push(...u(n));let n={};return t.filter(e=>a(e)&&e.enabled!==!1&&e.url).forEach(e=>{let{pathname:t,query:a}=z(e.url),o=n[t]??=[],s={...e,url:t};if(s.ws!==!0){let e=s.validator;r(a)||(i(e)?s.validator=function(t){return F(t.query,a)&&e(t)}:e?(s.validator={...e},s.validator.query=s.validator.query?{...a,...s.validator.query}:a):s.validator={query:a})}o.push(s)}),Object.keys(n).forEach(e=>{n[e]=B(n[e])}),n}function B(e){return c(e,e=>{if(e.ws===!0)return 0;let{validator:t}=e;return!t||r(t)?2:i(t)?0:1/Object.keys(t).reduce((e,n)=>e+le(t[n]),0)})}function le(e){return e?Object.keys(e).length:0}async function ue(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 x.json(e,{limit:s||a,...l});if(i.startsWith(`application/x-www-form-urlencoded`))return await x.form(e,{limit:o||a,...l});if(i.startsWith(`text/plain`))return await x.text(e,{limit:c||a,...l});if(i.startsWith(`multipart/form-data`))return await fe(e,t)}catch(e){console.error(e)}}const de={keepExtensions:!0,filename(e,t,n){return n?.originalFilename||`${e}.${Date.now()}${t?`.${t}`:``}`}};async function fe(e,t){let n=S({...de,...t});return new Promise((t,r)=>{n.parse(e,(e,n,i)=>{if(e){r(e);return}t({...n,...i})})})}const V=new Map;function H(e,t){let n=V.get(e);n||(n=h(e,{decode:decodeURIComponent}),V.set(e,n));let r=n(t);return r?r.params:{}}function pe(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 U(e,t){return!t||r(t)?``:` ${p.gray(`${e}:`)}${JSON.stringify(t)}`}function me(e,t){let{url:n,method:r,query:i,params:a,body:o}=e,{pathname:s}=new URL(n,`http://example.com`);s=p.green(decodeURIComponent(s));let c=p.magenta.bold(r),l=U(`query`,i),u=U(`params`,a),d=U(`body`,o),f=` ${p.dim.underline(`(${t})`)}`;return`${c} ${s}${l}${u}${d}${f}`}function he(e,n,{pathname:r,method:a,request:o}){return e.find(e=>{if(!r||!e||!e.url||e.ws||!(e.method?t(e.method)?e.method:[e.method]:[`GET`,`POST`]).includes(a))return!1;let s=L(e.url,r);if(s&&e.validator){let t=H(e.url,r);if(i(e.validator))return e.validator({params:t,...o});try{return pe({params:t,...o},e.validator)}catch(t){let i=e.__filepath__;return n.error(`${p.red(`mock error at ${r}`)}\n${t}\n at validator (${p.underline(i)})`,e.log),!1}}return s})}const W=/^[\t\u0020-\u007E\u0080-\u00FF]+$/,ge=/^(?:low|medium|high)$/i,G=Object.create(null),_e=/[\^$\\.*+?()[\]{}|]/g,ve=/[;=]/,ye=/;/,be=/^(?:lax|none|strict)$/i;var xe=class{name;value;maxAge;expires;path=`/`;domain;secure=!1;httpOnly=!0;sameSite=!1;overwrite=!1;priority;partitioned;constructor(e,t,n={}){if(!W.test(e)||ve.test(e))throw TypeError(`argument name is invalid`);if(t&&(!W.test(t)||ye.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&&!W.test(this.path))throw TypeError(`[Cookie] option path is invalid`);if(this.domain&&!W.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&&!ge.test(this.priority))throw TypeError(`[Cookie] option priority is invalid`);if(this.sameSite&&this.sameSite!==!0&&!be.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 Se(e,t){if(e.length!==t.length)return!1;if(w.timingSafeEqual)return w.timingSafeEqual(e,t);for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}function K(e,t){return w.createHmac(`sha256`,e).update(t).digest()}function Ce(e,t){let n=String(e),r=String(t),i=w.randomBytes(32);return Se(K(i,n),K(i,r))&&e===t}const we=/[/+=]/g,Te={"/":`_`,"+":`-`,"=":``};var q=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 w.createHmac(this.algorithm,t).update(e).digest(this.encoding).replace(we,e=>Te[e])}index(e,t){for(let n=0,r=this.keys.length;n<r;n++)if(Ce(t,this.sign(e,this.keys[n])))return n;return-1}verify(e,t){return this.index(e,t)>-1}},J=class{request;response;secure;keys;constructor(e,n,r={}){this.request=e,this.response=n,this.secure=r.secure,r.keys instanceof q?this.keys=r.keys:t(r.keys)&&(this.keys=new q(r.keys))}set(e,t,n){let r=this.request,i=this.response,a=u(i.getHeader(`Set-Cookie`)),o=new xe(e,t,n),s=n?.signed??!!this.keys,c=this.secure===void 0?r.protocol===`https`||De(r):!!this.secure;if(!c&&n?.secure)throw Error(`Cannot send secure cookie over unencrypted connection`);if(o.secure=n?.secure??c,Y(a,o),s&&n){if(!this.keys)throw Error(`.keys required for signed cookies`);o.value=this.keys.sign(o.toString()),o.name+=`.sig`,Y(a,o)}return(i.set?C.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(Ee(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 Ee(e){return G[e]||(G[e]=RegExp(`(?:^|;) *${e.replace(_e,`\\$&`)}=([^;]*)`)),G[e]}function De(e){return!!(e.socket?e.socket.encrypted:e.connection.encrypted)}function Y(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 Oe(e){let t=e.map(e=>Z(e).length);return t=t.length===0?[1]:t,Math.max(...t)+2}function ke(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 Ae(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,...c(e,ke).reverse()];return t}function je(e){let t=Oe(e);return c(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 Me(e,n,i){let a=je(Ae(e.filter(e=>L(e,n)))),{global:o=[],special:s={}}=i;if(o.length===0&&r(s)||a.length===0)return a;let[c,l]=Ne(a),u=o.filter(e=>l.includes(e));if(u.length>0&&(a=d([...c,...u,...l])),r(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}=t(p)?{rules:p,when:[]}:p;return m.includes(a[0])&&(h.length===0||h.some(e=>_(e).regexp.test(n)))&&(a=d([f,...a])),a}function Ne(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 Pe(e){let t=[];e.addListener(`data`,e=>{t.push(T.from(e))}),e.addListener(`end`,()=>{t.length&&Q.set(e,T.concat(t))})}function Fe(e){if(!e.server)return;let t=e.server.proxy||{};Object.keys(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 Ie(e){return E[e]||`Unknown`}function $(e,t=200,n){e.statusCode=t,e.statusMessage=n||Ie(t)}async function Le(e,t,n,r){let{headers:a,type:o=`json`}=n,s=n.__filepath__,c=D.contentType(o)||D.contentType(D.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=i(a)?await a(e):a;Object.keys(n).forEach(e=>{t.setHeader(e,n[e])})}catch(t){r.error(`${p.red(`mock error at ${e.url.split(`?`)[0]}`)}\n${t}\n at headers (${p.underline(s)})`,n.log)}}async function Re(e,n,r,a){let{cookies:o}=r,s=r.__filepath__;if(o)try{let r=i(o)?await o(e):o;Object.keys(r).forEach(e=>{let i=r[e];if(t(i)){let[t,r]=i;n.setCookie(e,t,r)}else n.setCookie(e,i)})}catch(t){a.error(`${p.red(`mock error at ${e.url.split(`?`)[0]}`)}\n${t}\n at cookies (${p.underline(s)})`,r.log)}}function ze(e,t,n){if(M(t))t.pipe(e);else if(T.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`?T.from(r):r)}}async function Be(e,n){if(!n||typeof n==`number`&&n<=0||t(n)&&n.length!==2)return;let r=0;if(t(n)){let[e,t]=n;r=o(e,t)}else r=n-(l()-e);r>0&&await s(r)}function Ve(e,{formidableOptions:t={},bodyParserOptions:n={},proxies:r,cookiesOptions:a,logger:o,priority:s={}}){return async function(c,u,d){let f=l(),{query:m,pathname:h}=z(c.url);if(!h||r.length===0||!r.some(e=>A(e,c.url)))return d();let g=e.mockData,_=Me(Object.keys(g),h,s);if(_.length===0)return d();Pe(c);let{query:v}=z(c.headers.referer||``),y=await ue(c,t,n),b=new J(c,u,a),x=b.get.bind(b),S=c.method.toUpperCase(),C,w;for(let e of _)if(C=he(g[e],o,{pathname:h,method:S,request:{query:m,refererQuery:v,body:y,headers:c.headers,getCookie:x}}),C){w=e;break}if(!C){let e=_.map(e=>e===w?p.underline.bold(e):p.dim(e)).join(`, `);return o.warn(`${p.green(h)} matches ${e} , but mock data is not found.`),d()}let T=c,E=u;T.body=y,T.query=m,T.refererQuery=v,T.params=H(C.url,h),T.getCookie=x,E.setCookie=b.set.bind(b);let{body:D,delay:O,type:k=`json`,response:j,status:M=200,statusText:N,log:P,__filepath__:F}=C;if($(E,M,N),await Le(T,E,C,o),await Re(T,E,C,o),o.info(me(T,F),P),o.debug(`${p.magenta(`DEBUG`)} ${p.underline(h)} matches: [ ${_.map(e=>e===w?p.underline.bold(e):p.dim(e)).join(`, `)} ]\n`),D){try{let e=i(D)?await D(T):D;await Be(f,O),ze(E,e,k)}catch(e){o.error(`${p.red(`mock error at ${h}`)}\n${e}\n at body (${p.underline(F)})`,P),$(E,500),u.end(``)}return}if(j){try{await Be(f,O),await j(T,E,d)}catch(e){o.error(`${p.red(`mock error at ${h}`)}\n${e}\n at response (${p.underline(F)})`,P),$(E,500),u.end(``)}return}u.end(``)}}function He(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 O({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(`${p.red(`WebSocket mock error at ${t.path}`)}\n${e}\n at setup (${o})`,n.log)})}catch(e){i.error(`${p.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)})},m=(e,t,n,r,i)=>{let{cleanupList:a,connectionList:o,context:c}=s.get(t);Ue(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())m(e,i,n,r,t)}}),t?.on(`upgrade`,(t,a,o)=>{let{pathname:m,query:h}=z(t.url);if(!m||n.length===0||!n.some(e=>A(e,t.url)))return;let g=e.mockData,_=Object.keys(g).find(e=>L(e,m));if(!_)return;let v=g[_].find(e=>e.url&&e.ws&&L(e.url,m));if(!v)return;let y=v.__filepath__;u(y,_);let b=c(_),x=l(b,m),S=s.get(x);if(!S){let e=[],t={onCleanup:t=>e.push(t)};S={cleanupList:e,context:t,connectionList:[]},s.set(x,S),d(b,x,v,t,m,y)}let C=t,w=new J(t,t,r),{query:T}=z(t.headers.referer||``);C.query=h,C.refererQuery=T,C.params=H(_,m),C.getCookie=w.get.bind(w),x.handleUpgrade(C,a,o,e=>{i.info(`${p.magenta.bold(`WebSocket`)} ${p.green(t.url)} connected ${p.dim(`(${y})`)}`,v.log),S.connectionList.push({req:C,ws:e}),f(x,e,C,S.connectionList)})}),t?.on(`close`,()=>{for(let e of o.values()){for(let t of e.values())Ue(s.get(t).cleanupList),t.close();e.clear()}o.clear(),a.clear()})}function Ue(e){let t;for(;t=e.shift();)t?.()}export{se as a,ne as c,R as d,L as f,k as h,ce as i,oe as l,A as m,Ve as n,B as o,P as p,Fe as r,z as s,He as t,te as u};
|
|
@@ -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-C8ZwTU-4.mjs";
|
|
2
|
-
import { Matcher } from "picomatch";
|
|
3
|
-
import Debug from "debug";
|
|
4
|
-
import EventEmitter from "node:events";
|
|
5
|
-
import { CorsOptions } from "cors";
|
|
6
|
-
import { Server } from "node:http";
|
|
7
|
-
import { Alias, Connect } from "vite";
|
|
8
|
-
import { Http2SecureServer } from "node:http2";
|
|
9
|
-
|
|
10
|
-
//#region src/compiler/types.d.ts
|
|
11
|
-
|
|
12
|
-
type MockRawData = MockOptions | MockHttpItem | MockWebsocketItem | Record<string, MockOptions | MockHttpItem | MockWebsocketItem>;
|
|
13
|
-
//#endregion
|
|
14
|
-
//#region src/compiler/processData.d.ts
|
|
15
|
-
declare function processRawData(raw: MockRawData, __filepath__: string): MockOptions | MockHttpItem | MockWebsocketItem;
|
|
16
|
-
declare function processMockData(mockList: Map<string, MockHttpItem | MockWebsocketItem | MockOptions> | (MockHttpItem | MockWebsocketItem | MockOptions)[]): Record<string, MockOptions>;
|
|
17
|
-
declare function sortByValidator(mocks: MockOptions): (MockHttpItem | MockWebsocketItem)[];
|
|
18
|
-
//#endregion
|
|
19
|
-
//#region src/utils/logger.d.ts
|
|
20
|
-
interface Logger {
|
|
21
|
-
debug: (msg: string, level?: boolean | LogLevel) => void;
|
|
22
|
-
info: (msg: string, level?: boolean | LogLevel) => void;
|
|
23
|
-
warn: (msg: string, level?: boolean | LogLevel) => void;
|
|
24
|
-
error: (msg: string, level?: boolean | LogLevel) => void;
|
|
25
|
-
}
|
|
26
|
-
declare const logLevels: Record<LogLevel, number>;
|
|
27
|
-
declare function createLogger(prefix: string, defaultLevel?: LogLevel): Logger;
|
|
28
|
-
//#endregion
|
|
29
|
-
//#region src/options.d.ts
|
|
30
|
-
type ResolvedMockServerPluginOptions = Required<Omit<MockServerPluginOptions, "build" | "cors" | "wsPrefix" | "prefix">> & {
|
|
31
|
-
context: string;
|
|
32
|
-
logger: Logger;
|
|
33
|
-
alias: Alias[];
|
|
34
|
-
define: Record<string, any>;
|
|
35
|
-
proxies: string[];
|
|
36
|
-
wsProxies: string[];
|
|
37
|
-
build: false | ServerBuildOption;
|
|
38
|
-
cors: false | CorsOptions;
|
|
39
|
-
};
|
|
40
|
-
//#endregion
|
|
41
|
-
//#region src/compiler/compiler.d.ts
|
|
42
|
-
/**
|
|
43
|
-
* Mock 文件加载编译,并转换为 Mock 数据
|
|
44
|
-
*/
|
|
45
|
-
declare class Compiler extends EventEmitter {
|
|
46
|
-
private moduleCache;
|
|
47
|
-
private moduleDeps;
|
|
48
|
-
cwd: string;
|
|
49
|
-
private mockWatcher;
|
|
50
|
-
private depsWatcher;
|
|
51
|
-
private isESM;
|
|
52
|
-
private _mockData;
|
|
53
|
-
options: ResolvedMockServerPluginOptions;
|
|
54
|
-
constructor(options: ResolvedMockServerPluginOptions);
|
|
55
|
-
get mockData(): Record<string, MockOptions>;
|
|
56
|
-
run(watch?: boolean): void;
|
|
57
|
-
close(): void;
|
|
58
|
-
private load;
|
|
59
|
-
private updateMockData;
|
|
60
|
-
private updateModuleDeps;
|
|
61
|
-
watchMockEntry(isMatch: Matcher): void;
|
|
62
|
-
watchDeps(): void;
|
|
63
|
-
}
|
|
64
|
-
//#endregion
|
|
65
|
-
//#region src/core/mockMiddleware.d.ts
|
|
66
|
-
interface CreateMockMiddlewareOptions extends Pick<MockServerPluginOptions, "formidableOptions" | "cookiesOptions" | "bodyParserOptions" | "priority"> {
|
|
67
|
-
proxies: string[];
|
|
68
|
-
logger: Logger;
|
|
69
|
-
}
|
|
70
|
-
declare function createMockMiddleware(compiler: Compiler, {
|
|
71
|
-
formidableOptions,
|
|
72
|
-
bodyParserOptions,
|
|
73
|
-
proxies,
|
|
74
|
-
cookiesOptions,
|
|
75
|
-
logger,
|
|
76
|
-
priority
|
|
77
|
-
}: CreateMockMiddlewareOptions): Connect.NextHandleFunction;
|
|
78
|
-
//#endregion
|
|
79
|
-
//#region src/core/ws.d.ts
|
|
80
|
-
/**
|
|
81
|
-
* mock websocket
|
|
82
|
-
*/
|
|
83
|
-
declare function mockWebSocket(compiler: Compiler, server: Server | Http2SecureServer | null, {
|
|
84
|
-
wsProxies: proxies,
|
|
85
|
-
cookiesOptions,
|
|
86
|
-
logger
|
|
87
|
-
}: ResolvedMockServerPluginOptions): void;
|
|
88
|
-
//#endregion
|
|
89
|
-
export { createLogger as a, processRawData as c, Logger as i, sortByValidator as l, CreateMockMiddlewareOptions as n, logLevels as o, createMockMiddleware as r, processMockData as s, mockWebSocket as t };
|
package/dist/server.d.mts
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { a as createLogger, c as processRawData, i as Logger, l as sortByValidator, n as CreateMockMiddlewareOptions, o as logLevels, r as createMockMiddleware, s as processMockData, t as mockWebSocket } from "./server-lwszq3fl.mjs";
|
|
2
|
-
export { CreateMockMiddlewareOptions, Logger, createLogger, createMockMiddleware, logLevels, mockWebSocket, processMockData, processRawData, sortByValidator };
|
package/dist/server.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e,d as t,i as n,n as r,o as i,t as a,u as o}from"./server-BEkc6AaK.mjs";export{o as createLogger,r as createMockMiddleware,t as logLevels,a as mockWebSocket,n as processMockData,e as processRawData,i as sortByValidator};
|
package/dist/types.d.mts
DELETED
|
@@ -1,2 +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-C8ZwTU-4.mjs";
|
|
2
|
-
export { BodyParserOptions, ExtraRequest, FormidableFile, LogLevel, LogType, Method, MockHttpItem, MockMatchPriority, MockMatchSpecialPriority, MockOptions, MockRequest, MockResponse, MockServerPluginOptions, MockWebsocketItem, ResponseBody, ServerBuildOption, WebSocketSetupContext };
|
|
File without changes
|
|
File without changes
|