vite-plugin-mock-dev-server 2.0.6 → 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-DF6NPJx4.d.mts → config-7dnQWJSY.d.ts} +501 -173
- package/dist/helper.d.ts +271 -0
- package/dist/helper.js +4 -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/dist/types.js +1 -0
- package/package.json +30 -25
- package/dist/helper-ChmPhNrY.mjs +0 -176
- package/dist/helper.d.mts +0 -3
- package/dist/helper.mjs +0 -3
- package/dist/index-u_3ZZqGO.d.mts +0 -126
- package/dist/index.d.mts +0 -9
- package/dist/index.mjs +0 -824
- package/dist/server-BetGF1ME.mjs +0 -1005
- package/dist/server-CvrNrvvb.d.mts +0 -89
- package/dist/server.d.mts +0 -3
- package/dist/server.mjs +0 -3
- package/dist/types.d.mts +0 -2
- package/dist/types.mjs +0 -1
package/dist/helper.d.ts
ADDED
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import { C as MockResponse, D as SetCookieOption, E as GetCookieOption, S as MockRequest, T as CookiesOption, _ as RecordedRes, a as MockHttpItem, b as Headers, c as LogType, d as MockServerPluginOptions, f as ServerBuildOption, g as RecordedRequest, h as RecordedReq, i as MockErrorConfig, l as MockMatchPriority, m as RecordedMeta, n as MockWebsocketItem, o as BodyParserOptions, p as RecordOptions, r as WebSocketSetupContext, s as LogLevel, t as MockOptions, u as MockMatchSpecialPriority, v as ResolvedRecordOptions, w as ResponseBody, x as Method, y as ExtraRequest } from "./config-7dnQWJSY.js";
|
|
2
|
+
import { FormidableFile } from "./types.js";
|
|
3
|
+
import { IncomingMessage, OutgoingHttpHeaders, ServerResponse } from "node:http";
|
|
4
|
+
import { Transform } from "node:stream";
|
|
5
|
+
|
|
6
|
+
//#region src/helpers/createSSEStream.d.ts
|
|
7
|
+
/**
|
|
8
|
+
* Server-sent events message interface
|
|
9
|
+
*
|
|
10
|
+
* Server-sent events 消息接口
|
|
11
|
+
*/
|
|
12
|
+
interface SSEMessage {
|
|
13
|
+
/**
|
|
14
|
+
* Message data
|
|
15
|
+
*
|
|
16
|
+
* 消息数据
|
|
17
|
+
*/
|
|
18
|
+
data?: string | object;
|
|
19
|
+
/**
|
|
20
|
+
* Comment
|
|
21
|
+
*
|
|
22
|
+
* 注释
|
|
23
|
+
*/
|
|
24
|
+
comment?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Event name
|
|
27
|
+
*
|
|
28
|
+
* 事件名称
|
|
29
|
+
*/
|
|
30
|
+
event?: string;
|
|
31
|
+
/**
|
|
32
|
+
* Event ID
|
|
33
|
+
*
|
|
34
|
+
* 事件 ID
|
|
35
|
+
*/
|
|
36
|
+
id?: string;
|
|
37
|
+
/**
|
|
38
|
+
* Retry interval
|
|
39
|
+
*
|
|
40
|
+
* 重试间隔
|
|
41
|
+
*/
|
|
42
|
+
retry?: number;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Write headers interface
|
|
46
|
+
*
|
|
47
|
+
* 写入头信息接口
|
|
48
|
+
*/
|
|
49
|
+
interface WriteHeaders {
|
|
50
|
+
/**
|
|
51
|
+
* Write HTTP headers
|
|
52
|
+
*
|
|
53
|
+
* 写入 HTTP 头信息
|
|
54
|
+
*/
|
|
55
|
+
writeHead?: (statusCode: number, headers?: OutgoingHttpHeaders) => WriteHeaders;
|
|
56
|
+
/**
|
|
57
|
+
* Flush headers
|
|
58
|
+
*
|
|
59
|
+
* 刷新头信息
|
|
60
|
+
*/
|
|
61
|
+
flushHeaders?: () => void;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Header stream type
|
|
65
|
+
*
|
|
66
|
+
* 头信息流类型
|
|
67
|
+
*/
|
|
68
|
+
type HeaderStream = NodeJS.WritableStream & WriteHeaders;
|
|
69
|
+
/**
|
|
70
|
+
* Transforms "messages" to W3C event stream content.
|
|
71
|
+
* See https://html.spec.whatwg.org/multipage/server-sent-events.html
|
|
72
|
+
* A message is an object with one or more of the following properties:
|
|
73
|
+
* - data (String or object, which gets turned into JSON)
|
|
74
|
+
* - event
|
|
75
|
+
* - id
|
|
76
|
+
* - retry
|
|
77
|
+
* - comment
|
|
78
|
+
*
|
|
79
|
+
* If constructed with a HTTP Request, it will optimise the socket for streaming.
|
|
80
|
+
* If this stream is piped to an HTTP Response, it will set appropriate headers.
|
|
81
|
+
*
|
|
82
|
+
* 将 "messages" 转换为 W3C 事件流内容。
|
|
83
|
+
* 参见 https://html.spec.whatwg.org/multipage/server-sent-events.html
|
|
84
|
+
* 消息是一个具有以下一个或多个属性的对象:
|
|
85
|
+
* - data (字符串或对象,会被转换为 JSON)
|
|
86
|
+
* - event
|
|
87
|
+
* - id
|
|
88
|
+
* - retry
|
|
89
|
+
* - comment
|
|
90
|
+
*
|
|
91
|
+
* 如果使用 HTTP 请求构造,它将优化套接字以进行流式传输。
|
|
92
|
+
* 如果此流被管道传输到 HTTP 响应,它将设置适当的头信息。
|
|
93
|
+
*/
|
|
94
|
+
declare class SSEStream extends Transform {
|
|
95
|
+
/**
|
|
96
|
+
* Constructor
|
|
97
|
+
*
|
|
98
|
+
* 构造函数
|
|
99
|
+
*
|
|
100
|
+
* @param req - HTTP request object / HTTP 请求对象
|
|
101
|
+
*/
|
|
102
|
+
constructor(req: IncomingMessage);
|
|
103
|
+
/**
|
|
104
|
+
* Pipe the stream to a destination
|
|
105
|
+
*
|
|
106
|
+
* 将流管道传输到目标
|
|
107
|
+
*
|
|
108
|
+
* @template T - Type of destination stream / 目标流的类型
|
|
109
|
+
* @param destination - Destination stream / 目标流
|
|
110
|
+
* @param options - Pipe options / 管道选项
|
|
111
|
+
* @param options.end - Whether to end the stream after piping / 是否在管道传输后结束流
|
|
112
|
+
* @returns Destination stream / 目标流
|
|
113
|
+
*/
|
|
114
|
+
pipe<T extends HeaderStream>(destination: T, options?: {
|
|
115
|
+
end?: boolean;
|
|
116
|
+
}): T;
|
|
117
|
+
/**
|
|
118
|
+
* Transform message to SSE format
|
|
119
|
+
*
|
|
120
|
+
* 将消息转换为 SSE 格式
|
|
121
|
+
*
|
|
122
|
+
* @param message - SSE message / SSE 消息
|
|
123
|
+
* @param encoding - Encoding / 编码
|
|
124
|
+
* @param callback - Callback function / 回调函数
|
|
125
|
+
*/
|
|
126
|
+
_transform(message: SSEMessage, encoding: string, callback: (error?: (Error | null), data?: any) => void): void;
|
|
127
|
+
/**
|
|
128
|
+
* Write message to the stream
|
|
129
|
+
*
|
|
130
|
+
* 向流写入消息
|
|
131
|
+
*
|
|
132
|
+
* @param message - SSE message / SSE 消息
|
|
133
|
+
* @param encoding - Encoding / 编码
|
|
134
|
+
* @param cb - Callback function / 回调函数
|
|
135
|
+
* @returns Whether the write was successful / 写入是否成功
|
|
136
|
+
*/
|
|
137
|
+
write(message: SSEMessage, encoding?: BufferEncoding, cb?: (error: Error | null | undefined) => void): boolean;
|
|
138
|
+
/**
|
|
139
|
+
* Write message to the stream
|
|
140
|
+
*
|
|
141
|
+
* 向流写入消息
|
|
142
|
+
*
|
|
143
|
+
* @param message - SSE message / SSE 消息
|
|
144
|
+
* @param cb - Callback function / 回调函数
|
|
145
|
+
* @returns Whether the write was successful / 写入是否成功
|
|
146
|
+
*/
|
|
147
|
+
write(message: SSEMessage, cb?: (error: Error | null | undefined) => void): boolean;
|
|
148
|
+
/**
|
|
149
|
+
* Destroy the stream
|
|
150
|
+
*
|
|
151
|
+
* 销毁流
|
|
152
|
+
*
|
|
153
|
+
* @param error - Error object / 错误对象
|
|
154
|
+
* @returns This stream / 此流
|
|
155
|
+
*/
|
|
156
|
+
destroy(error?: Error): this;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Create a Server-sent events write stream for simulating EventSource
|
|
160
|
+
*
|
|
161
|
+
* 创建一个 Server-sent events 写入流,用于支持模拟 EventSource
|
|
162
|
+
*
|
|
163
|
+
* @example
|
|
164
|
+
* ```ts
|
|
165
|
+
* import { createSSEStream, defineMock } from 'vite-plugin-mock-dev-server'
|
|
166
|
+
*
|
|
167
|
+
* export default defineMock({
|
|
168
|
+
* url: '/api',
|
|
169
|
+
* response: (req, res) => {
|
|
170
|
+
* const sse = createSSEStream(req, res)
|
|
171
|
+
* sse.write({ event: 'message', data: { message: 'hello world' } })
|
|
172
|
+
* }
|
|
173
|
+
* })
|
|
174
|
+
* ```
|
|
175
|
+
*
|
|
176
|
+
* @param req - HTTP request object / HTTP 请求对象
|
|
177
|
+
* @param res - HTTP response object / HTTP 响应对象
|
|
178
|
+
* @returns SSE stream instance / SSE 流实例
|
|
179
|
+
*/
|
|
180
|
+
declare function createSSEStream(req: IncomingMessage, res: ServerResponse): SSEStream;
|
|
181
|
+
//#endregion
|
|
182
|
+
//#region src/helpers/defineMock.d.ts
|
|
183
|
+
/**
|
|
184
|
+
* Mock config Type helper
|
|
185
|
+
*
|
|
186
|
+
* mock配置 类型帮助函数
|
|
187
|
+
* @param config see config docs:
|
|
188
|
+
* {@link https://vite-plugin-mock-dev-server.netlify.app/guide/mock-config en-US DOC} |
|
|
189
|
+
* {@link https://vite-plugin-mock-dev-server.netlify.app/zh/guide/mock-config zh-CN DOC}
|
|
190
|
+
*
|
|
191
|
+
* @example
|
|
192
|
+
* Mock Http Request
|
|
193
|
+
* ```ts
|
|
194
|
+
* export default defineMock({
|
|
195
|
+
* url: '/api/example',
|
|
196
|
+
* method: ['GET', 'POST'],
|
|
197
|
+
* body: { a: 1 },
|
|
198
|
+
* })
|
|
199
|
+
* ```
|
|
200
|
+
* ```ts
|
|
201
|
+
* export default defineMock({
|
|
202
|
+
* url: '/api/example',
|
|
203
|
+
* method: 'GET',
|
|
204
|
+
* body: ({ query }) => ({ a: 1, b: query.b }),
|
|
205
|
+
* })
|
|
206
|
+
* ```
|
|
207
|
+
* @example
|
|
208
|
+
* Mock WebSocket
|
|
209
|
+
* ```ts
|
|
210
|
+
* export default defineMock({
|
|
211
|
+
* url: '/socket.io',
|
|
212
|
+
* ws: true,
|
|
213
|
+
* setup(wss) {
|
|
214
|
+
* wss.on('connection', (ws) => {
|
|
215
|
+
* ws.on('message', (rawData) => console.log(rawData))
|
|
216
|
+
* ws.send('data')
|
|
217
|
+
* })
|
|
218
|
+
* },
|
|
219
|
+
* })
|
|
220
|
+
* ```
|
|
221
|
+
*/
|
|
222
|
+
declare function defineMock(config: MockHttpItem): MockHttpItem;
|
|
223
|
+
declare function defineMock(config: MockWebsocketItem): MockWebsocketItem;
|
|
224
|
+
declare function defineMock(config: MockOptions): MockOptions;
|
|
225
|
+
/**
|
|
226
|
+
* Return a custom defineMock function to support preprocessing of mock config.
|
|
227
|
+
*
|
|
228
|
+
* 返回一个自定义的 defineMock 函数,用于支持对 mock config 的预处理。
|
|
229
|
+
* @param transformer preprocessing function
|
|
230
|
+
* @example
|
|
231
|
+
* ```ts
|
|
232
|
+
* const definePostMock = createDefineMock((mock) => {
|
|
233
|
+
* mock.url = '/api/post/' + mock.url
|
|
234
|
+
* })
|
|
235
|
+
* export default definePostMock({
|
|
236
|
+
* url: 'list',
|
|
237
|
+
* body: [{ title: '1' }, { title: '2' }],
|
|
238
|
+
* })
|
|
239
|
+
* ```
|
|
240
|
+
*/
|
|
241
|
+
declare function createDefineMock(transformer: (mock: MockHttpItem | MockWebsocketItem) => MockHttpItem | MockWebsocketItem | void): typeof defineMock;
|
|
242
|
+
//#endregion
|
|
243
|
+
//#region src/helpers/defineMockData.d.ts
|
|
244
|
+
/**
|
|
245
|
+
* Mock data type with getter, setter, and value property
|
|
246
|
+
*
|
|
247
|
+
* 带有 getter、setter 和 value 属性的 Mock 数据类型
|
|
248
|
+
*
|
|
249
|
+
* @template T - Type of mock data / Mock 数据的类型
|
|
250
|
+
*/
|
|
251
|
+
type MockData<T = any> = readonly [() => T, (val: T | ((val: T) => T | void)) => void] & {
|
|
252
|
+
/**
|
|
253
|
+
* Current value
|
|
254
|
+
*
|
|
255
|
+
* 当前值
|
|
256
|
+
*/
|
|
257
|
+
value: T;
|
|
258
|
+
};
|
|
259
|
+
/**
|
|
260
|
+
* Define mock data with memory-based sharing mechanism
|
|
261
|
+
*
|
|
262
|
+
* 定义带有基于内存的共享机制的 Mock 数据
|
|
263
|
+
*
|
|
264
|
+
* @template T - Type of mock data / Mock 数据的类型
|
|
265
|
+
* @param key - Unique key for mock data / Mock 数据的唯一键
|
|
266
|
+
* @param initialData - Initial data value / 初始数据值
|
|
267
|
+
* @returns MockData object with getter, setter, and value property / 带有 getter、setter 和 value 属性的 MockData 对象
|
|
268
|
+
*/
|
|
269
|
+
declare function defineMockData<T = any>(key: string, initialData: T): MockData<T>;
|
|
270
|
+
//#endregion
|
|
271
|
+
export { BodyParserOptions, CookiesOption, ExtraRequest, FormidableFile, GetCookieOption, HeaderStream, Headers, LogLevel, LogType, Method, MockData, MockErrorConfig, MockHttpItem, MockMatchPriority, MockMatchSpecialPriority, MockOptions, MockRequest, MockResponse, MockServerPluginOptions, MockWebsocketItem, RecordOptions, RecordedMeta, RecordedReq, RecordedRequest, RecordedRes, ResolvedRecordOptions, ResponseBody, SSEMessage, ServerBuildOption, SetCookieOption, WebSocketSetupContext, createDefineMock, createSSEStream, defineMock, defineMockData };
|
package/dist/helper.js
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{deepClone as e,deepEqual as t,isArray as n,isFunction as r}from"@pengzhanbo/utils";import{Transform as i}from"node:stream";var a=class extends i{constructor(e){super({objectMode:!0}),e.socket.setKeepAlive(!0),e.socket.setNoDelay(!0),e.socket.setTimeout(0)}pipe(e,t){return e.writeHead&&(e.writeHead(200,{"Content-Type":`text/event-stream; charset=utf-8`,"Transfer-Encoding":`identity`,"Cache-Control":`no-cache`,Connection:`keep-alive`}),e.flushHeaders?.()),e.write(`:ok
|
|
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=n(t)?t.map(t=>e(t)||t):e(t)||t,t)}const u=new Map,d=new WeakMap;var f=class{value;#e;#t;constructor(t){this.value=t,this.#e=e(t),this.#t=Date.now()}hotUpdate(n){Date.now()-this.#t<70||t(n,this.#e)||(this.value=n,this.#e=e(n),this.#t=Date.now())}};function p(e,t){let n=u.get(e);if(!n){let r=new f(t),i=u.get(e);i?n=i:(u.set(e,r),n=r)}if(n.hotUpdate(t),d.has(n))return d.get(n);let i=[()=>n.value,e=>{r(e)&&(e=e(n.value)??n.value),n.value=e}];return Object.defineProperty(i,`value`,{get(){return n.value},set(e){n.value=e}}),d.set(n,i),i}export{l as createDefineMock,s as createSSEStream,c as defineMock,p as defineMockData};
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { a as MockHttpItem, d as MockServerPluginOptions, f as ServerBuildOption, n as MockWebsocketItem, s as LogLevel, t as MockOptions, v as ResolvedRecordOptions } from "./config-7dnQWJSY.js";
|
|
2
|
+
import { Matcher } from "picomatch";
|
|
3
|
+
import EventEmitter from "node:events";
|
|
4
|
+
import { CorsOptions } from "cors";
|
|
5
|
+
import { Server } from "node:http";
|
|
6
|
+
import { Alias, Connect, Plugin } from "vite";
|
|
7
|
+
import { Http2SecureServer } from "node:http2";
|
|
8
|
+
|
|
9
|
+
//#region src/core/logger.d.ts
|
|
10
|
+
/**
|
|
11
|
+
* Logger interface
|
|
12
|
+
*
|
|
13
|
+
* 日志接口
|
|
14
|
+
*/
|
|
15
|
+
interface Logger {
|
|
16
|
+
/**
|
|
17
|
+
* Debug log
|
|
18
|
+
*
|
|
19
|
+
* 调试日志
|
|
20
|
+
*/
|
|
21
|
+
debug: (msg: string, level?: boolean | LogLevel) => void;
|
|
22
|
+
/**
|
|
23
|
+
* Info log
|
|
24
|
+
*
|
|
25
|
+
* 信息日志
|
|
26
|
+
*/
|
|
27
|
+
info: (msg: string, level?: boolean | LogLevel) => void;
|
|
28
|
+
/**
|
|
29
|
+
* Warning log
|
|
30
|
+
*
|
|
31
|
+
* 警告日志
|
|
32
|
+
*/
|
|
33
|
+
warn: (msg: string, level?: boolean | LogLevel) => void;
|
|
34
|
+
/**
|
|
35
|
+
* Error log
|
|
36
|
+
*
|
|
37
|
+
* 错误日志
|
|
38
|
+
*/
|
|
39
|
+
error: (msg: string, level?: boolean | LogLevel) => void;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Log levels mapping
|
|
43
|
+
*
|
|
44
|
+
* 日志级别映射
|
|
45
|
+
*/
|
|
46
|
+
declare const logLevels: Record<LogLevel, number>;
|
|
47
|
+
/**
|
|
48
|
+
* Create logger instance
|
|
49
|
+
*
|
|
50
|
+
* 创建日志实例
|
|
51
|
+
*
|
|
52
|
+
* @param prefix - Log prefix / 日志前缀
|
|
53
|
+
* @param defaultLevel - Default log level / 默认日志级别
|
|
54
|
+
* @returns Logger instance / 日志实例
|
|
55
|
+
*/
|
|
56
|
+
declare function createLogger(prefix: string, defaultLevel?: LogLevel): Logger;
|
|
57
|
+
//#endregion
|
|
58
|
+
//#region src/core/options.d.ts
|
|
59
|
+
type ResolvedMockServerPluginOptions = Required<Omit<MockServerPluginOptions, "build" | "cors" | "wsPrefix" | "prefix" | "record">> & {
|
|
60
|
+
context: string;
|
|
61
|
+
logger: Logger;
|
|
62
|
+
alias: Alias[];
|
|
63
|
+
define: Record<string, any>;
|
|
64
|
+
proxies: string[];
|
|
65
|
+
wsProxies: string[];
|
|
66
|
+
build: false | ServerBuildOption;
|
|
67
|
+
cors: false | CorsOptions;
|
|
68
|
+
record: ResolvedRecordOptions;
|
|
69
|
+
};
|
|
70
|
+
//#endregion
|
|
71
|
+
//#region src/core/plugin.d.ts
|
|
72
|
+
/**
|
|
73
|
+
* Create mock dev server plugin
|
|
74
|
+
*
|
|
75
|
+
* 创建 Mock 开发服务器插件
|
|
76
|
+
*
|
|
77
|
+
* @param options - Plugin options / 插件配置项
|
|
78
|
+
* @returns Array of Vite plugin objects / Vite 插件对象数组
|
|
79
|
+
*/
|
|
80
|
+
declare function mockDevServerPlugin(options?: MockServerPluginOptions): Plugin[];
|
|
81
|
+
//#endregion
|
|
82
|
+
//#region src/compiler/types.d.ts
|
|
83
|
+
type MockRawData = MockOptions | MockHttpItem | MockWebsocketItem | Record<string, MockOptions | MockHttpItem | MockWebsocketItem>;
|
|
84
|
+
//#endregion
|
|
85
|
+
//#region src/compiler/processData.d.ts
|
|
86
|
+
declare function processRawData(raw: MockRawData, __filepath__: string): MockOptions | MockHttpItem | MockWebsocketItem;
|
|
87
|
+
declare function processMockData(mockList: Map<string, MockHttpItem | MockWebsocketItem | MockOptions> | (MockHttpItem | MockWebsocketItem | MockOptions)[]): Record<string, MockOptions>;
|
|
88
|
+
declare function sortByValidator(mocks: MockOptions): (MockHttpItem | MockWebsocketItem)[];
|
|
89
|
+
//#endregion
|
|
90
|
+
//#region src/compiler/compiler.d.ts
|
|
91
|
+
/**
|
|
92
|
+
* Mock file loading and compilation, converting to Mock data
|
|
93
|
+
*
|
|
94
|
+
* Mock 文件加载编译,并转换为 Mock 数据
|
|
95
|
+
*/
|
|
96
|
+
declare class Compiler extends EventEmitter {
|
|
97
|
+
/**
|
|
98
|
+
* Cache for mock modules
|
|
99
|
+
*
|
|
100
|
+
* Mock 模块缓存
|
|
101
|
+
*/
|
|
102
|
+
private moduleCache;
|
|
103
|
+
/**
|
|
104
|
+
* Dependencies mapping for mock modules
|
|
105
|
+
*
|
|
106
|
+
* Mock 模块依赖映射
|
|
107
|
+
*/
|
|
108
|
+
private moduleDeps;
|
|
109
|
+
/**
|
|
110
|
+
* Current working directory
|
|
111
|
+
*
|
|
112
|
+
* 当前工作目录
|
|
113
|
+
*/
|
|
114
|
+
cwd: string;
|
|
115
|
+
/**
|
|
116
|
+
* File watcher for mock files
|
|
117
|
+
*
|
|
118
|
+
* Mock 文件监视器
|
|
119
|
+
*/
|
|
120
|
+
private mockWatcher;
|
|
121
|
+
/**
|
|
122
|
+
* File watcher for dependency files
|
|
123
|
+
*
|
|
124
|
+
* 依赖文件监视器
|
|
125
|
+
*/
|
|
126
|
+
private depsWatcher;
|
|
127
|
+
/**
|
|
128
|
+
* Whether the project uses ES modules
|
|
129
|
+
*
|
|
130
|
+
* 项目是否使用 ES 模块
|
|
131
|
+
*/
|
|
132
|
+
private isESM;
|
|
133
|
+
/**
|
|
134
|
+
* Processed mock data
|
|
135
|
+
*
|
|
136
|
+
* 处理后的 Mock 数据
|
|
137
|
+
*/
|
|
138
|
+
private _mockData;
|
|
139
|
+
/**
|
|
140
|
+
* Resolved plugin options
|
|
141
|
+
*
|
|
142
|
+
* 解析后的插件配置项
|
|
143
|
+
*/
|
|
144
|
+
options: ResolvedMockServerPluginOptions;
|
|
145
|
+
/**
|
|
146
|
+
* Constructor
|
|
147
|
+
*
|
|
148
|
+
* 构造函数
|
|
149
|
+
*
|
|
150
|
+
* @param options - Resolved plugin options / 解析后的插件配置项
|
|
151
|
+
*/
|
|
152
|
+
constructor(options: ResolvedMockServerPluginOptions);
|
|
153
|
+
/**
|
|
154
|
+
* Get processed mock data
|
|
155
|
+
*
|
|
156
|
+
* 获取处理后的 Mock 数据
|
|
157
|
+
*
|
|
158
|
+
* @returns Processed mock data / 处理后的 Mock 数据
|
|
159
|
+
*/
|
|
160
|
+
get mockData(): Record<string, MockOptions>;
|
|
161
|
+
/**
|
|
162
|
+
* Run the compiler
|
|
163
|
+
*
|
|
164
|
+
* 运行编译器
|
|
165
|
+
*
|
|
166
|
+
* @param watch - Whether to watch for file changes / 是否监视文件变化
|
|
167
|
+
*/
|
|
168
|
+
run(watch?: boolean): void;
|
|
169
|
+
/**
|
|
170
|
+
* Close the compiler and watchers
|
|
171
|
+
*
|
|
172
|
+
* 关闭编译器和监视器
|
|
173
|
+
*/
|
|
174
|
+
close(): void;
|
|
175
|
+
/**
|
|
176
|
+
* Load and compile a mock file
|
|
177
|
+
*
|
|
178
|
+
* 加载并编译 Mock 文件
|
|
179
|
+
*
|
|
180
|
+
* @param filepath - Path to the mock file / Mock 文件路径
|
|
181
|
+
*/
|
|
182
|
+
private load;
|
|
183
|
+
/**
|
|
184
|
+
* Update mock data from module cache
|
|
185
|
+
*
|
|
186
|
+
* 从模块缓存更新 Mock 数据
|
|
187
|
+
*/
|
|
188
|
+
private updateMockData;
|
|
189
|
+
/**
|
|
190
|
+
* Update module dependencies
|
|
191
|
+
*
|
|
192
|
+
* 更新模块依赖
|
|
193
|
+
*
|
|
194
|
+
* @param filepath - Path to the mock file / Mock 文件路径
|
|
195
|
+
* @param deps - Dependencies of the mock file / Mock 文件的依赖
|
|
196
|
+
*/
|
|
197
|
+
private updateModuleDeps;
|
|
198
|
+
/**
|
|
199
|
+
* Watch mock entry files
|
|
200
|
+
*
|
|
201
|
+
* 监视 Mock 入口文件
|
|
202
|
+
*
|
|
203
|
+
* @param isMatch - Function to check if a file matches the include/exclude pattern / 检查文件是否匹配包含/排除模式的函数
|
|
204
|
+
*/
|
|
205
|
+
watchMockEntry(isMatch: Matcher): void;
|
|
206
|
+
/**
|
|
207
|
+
* Watch dependency files
|
|
208
|
+
*
|
|
209
|
+
* 监视依赖文件
|
|
210
|
+
*/
|
|
211
|
+
watchDeps(): void;
|
|
212
|
+
}
|
|
213
|
+
//#endregion
|
|
214
|
+
//#region src/mockHttp/middleware.d.ts
|
|
215
|
+
interface CreateMockMiddlewareOptions extends Pick<ResolvedMockServerPluginOptions, "formidableOptions" | "cookiesOptions" | "bodyParserOptions" | "priority" | "record" | "replay"> {
|
|
216
|
+
proxies: string[];
|
|
217
|
+
logger: Logger;
|
|
218
|
+
cors: false | CorsOptions;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Create mock middleware
|
|
222
|
+
*
|
|
223
|
+
* 创建 Mock 中间件
|
|
224
|
+
*
|
|
225
|
+
* @param compiler - Compiler instance / 编译器实例
|
|
226
|
+
* @param options - Middleware options / 中间件配置项
|
|
227
|
+
* @param options.formidableOptions - Formidable options / Formidable 配置项
|
|
228
|
+
* @param options.bodyParserOptions - Body parser options / 请求体解析配置项
|
|
229
|
+
* @param options.proxies - Proxy paths / 代理路径
|
|
230
|
+
* @param options.cookiesOptions - Cookies options / Cookies 配置项
|
|
231
|
+
* @param options.logger - Logger instance / 日志实例
|
|
232
|
+
* @param options.priority - Path matching priority / 路径匹配优先级
|
|
233
|
+
* @param options.cors - CORS options / CORS 配置项
|
|
234
|
+
* @param options.record - Record options / 录制配置项
|
|
235
|
+
* @param options.replay - Replay options / 回放配置项
|
|
236
|
+
*
|
|
237
|
+
* @returns Connect middleware function / Connect 中间件函数
|
|
238
|
+
*/
|
|
239
|
+
declare function createMockMiddleware(compiler: Compiler, {
|
|
240
|
+
formidableOptions,
|
|
241
|
+
bodyParserOptions,
|
|
242
|
+
proxies,
|
|
243
|
+
cookiesOptions,
|
|
244
|
+
logger,
|
|
245
|
+
priority,
|
|
246
|
+
cors: corsOptions,
|
|
247
|
+
record,
|
|
248
|
+
replay
|
|
249
|
+
}: CreateMockMiddlewareOptions): Connect.NextHandleFunction;
|
|
250
|
+
//#endregion
|
|
251
|
+
//#region src/mockWebsocket/server.d.ts
|
|
252
|
+
/**
|
|
253
|
+
* Mock WebSocket server
|
|
254
|
+
*
|
|
255
|
+
* Mock WebSocket 服务器
|
|
256
|
+
*
|
|
257
|
+
* @param compiler - Compiler instance / 编译器实例
|
|
258
|
+
* @param server - HTTP server instance / HTTP 服务器实例
|
|
259
|
+
* @param options - Resolved plugin options / 解析后的插件配置
|
|
260
|
+
* @param options.wsProxies - WebSocket proxy prefixes / WebSocket 代理前缀
|
|
261
|
+
* @param options.cookiesOptions - Cookies options / Cookies 配置项
|
|
262
|
+
* @param options.logger - Logger instance / 日志实例
|
|
263
|
+
*/
|
|
264
|
+
declare function mockWebSocket(compiler: Compiler, server: Server | Http2SecureServer | null, {
|
|
265
|
+
wsProxies: proxies,
|
|
266
|
+
cookiesOptions,
|
|
267
|
+
logger
|
|
268
|
+
}: ResolvedMockServerPluginOptions): void;
|
|
269
|
+
//#endregion
|
|
270
|
+
export { processRawData as a, Logger as c, processMockData as i, createLogger as l, CreateMockMiddlewareOptions as n, sortByValidator as o, createMockMiddleware as r, mockDevServerPlugin as s, mockWebSocket as t, logLevels as u };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { C as MockResponse, D as SetCookieOption, E as GetCookieOption, S as MockRequest, T as CookiesOption, _ as RecordedRes, a as MockHttpItem, b as Headers, c as LogType, d as MockServerPluginOptions, f as ServerBuildOption, g as RecordedRequest, h as RecordedReq, i as MockErrorConfig, l as MockMatchPriority, m as RecordedMeta, n as MockWebsocketItem, o as BodyParserOptions, p as RecordOptions, r as WebSocketSetupContext, s as LogLevel, t as MockOptions, u as MockMatchSpecialPriority, v as ResolvedRecordOptions, w as ResponseBody, x as Method, y as ExtraRequest } from "./config-7dnQWJSY.js";
|
|
2
|
+
import { FormidableFile } from "./types.js";
|
|
3
|
+
import { HeaderStream, MockData, SSEMessage, createDefineMock, createSSEStream, defineMock, defineMockData } from "./helper.js";
|
|
4
|
+
import { a as processRawData, c as Logger, i as processMockData, l as createLogger, n as CreateMockMiddlewareOptions, o as sortByValidator, r as createMockMiddleware, s as mockDevServerPlugin, t as mockWebSocket, u as logLevels } from "./index-x4QPVyiP.js";
|
|
5
|
+
import "./server.js";
|
|
6
|
+
export { BodyParserOptions, CookiesOption, CreateMockMiddlewareOptions, ExtraRequest, type FormidableFile, GetCookieOption, HeaderStream, Headers, LogLevel, LogType, Logger, Method, MockData, MockErrorConfig, type MockHttpItem, MockMatchPriority, MockMatchSpecialPriority, type MockOptions, type MockRequest, MockResponse, type MockServerPluginOptions, type MockWebsocketItem, RecordOptions, RecordedMeta, RecordedReq, RecordedRequest, RecordedRes, ResolvedRecordOptions, ResponseBody, SSEMessage, ServerBuildOption, SetCookieOption, WebSocketSetupContext, createDefineMock, createLogger, createMockMiddleware, createSSEStream, defineMock, defineMockData, logLevels, mockDevServerPlugin, mockWebSocket, processMockData, processRawData, sortByValidator };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import{a as e,c as t,d as n,f as r,i,l as a,n as o,o as s,p as c,r as l,s as u,t as d,u as f}from"./logger-C-7qpBNh.js";import{createDefineMock as p,createSSEStream as m,defineMock as h,defineMockData as g}from"./helper.js";import"./server.js";import _ from"node:process";import{isArray as ee,isBoolean as v,promiseParallel as y,toArray as b,uniq as x}from"@pengzhanbo/utils";import S from"node:path";import{pathToFileURL as C}from"node:url";import w from"node:fs/promises";import T from"json5";import E,{promises as D}from"node:fs";import O from"node:events";import{watch as k}from"chokidar";import{getPackageInfoSync as A,loadPackageJSON as j,loadPackageJSONSync as M}from"local-pkg";import{glob as N}from"tinyglobby";import P from"ansis";import te from"is-core-module";function ne(e){let t={},n=_.env.NODE_ENV||e.mode;Object.assign(t,{"process.env.NODE_ENV":JSON.stringify(n),"global.process.env.NODE_ENV":JSON.stringify(n),"globalThis.process.env.NODE_ENV":JSON.stringify(n)});let r={},i={};for(let t in e.define){let n=e.define[t],a=t.startsWith(`import.meta.env.`);typeof n==`string`?ie(n)&&(r[t]=n,a&&(i[t.slice(16)]=n)):(r[t]=F(n),a&&(i[t.slice(16)]=n))}let a={},o={},s={};a[`import.meta.hot`]=`undefined`;for(let t in e.env){let n=JSON.stringify(e.env[t]);a[`import.meta.env.${t}`]=n,o[t]=n}s[`import.meta.env`]=`undefined`;let c={...t,...a,...r,...s};return`import.meta.env`in c&&(c[`import.meta.env`]=re({...o,...i})),c}function re(e){let t=`{`,n=Object.keys(e);for(let r=0;r<n.length;r++){let i=n[r],a=e[i];t+=`${JSON.stringify(i)}: ${F(a)}`,r!==n.length-1&&(t+=`, `)}return`${t}}`}function F(e){return e===void 0?`undefined`:typeof e==`string`?e:JSON.stringify(e)}function ie(e){try{return JSON.parse(e),!0}catch{return!1}}const ae={name:`externalize-deps`,setup(e){e.onResolve({filter:/.*/},({path:e})=>{if(e[0]!==`.`&&!S.isAbsolute(e))return{external:!0}})}},oe={name:`json5-loader`,setup(e){e.onLoad({filter:/\.json5$/},async({path:e})=>{let t=await w.readFile(e,`utf-8`);return{contents:`export default ${JSON.stringify(T.parse(t))}`,loader:`js`}})}},I={name:`json-loader`,setup(e){e.onLoad({filter:/\.json$/},async({path:e})=>({contents:`export default ${await w.readFile(e,`utf-8`)}`,loader:`js`}))}},L={name:`rename-plugin`,setup(e){e.onResolve({filter:/.*/},({path:e})=>e===`vite-plugin-mock-dev-server`?{path:`vite-plugin-mock-dev-server/helper`,external:!0}:null)}};function R(e){return{name:`alias-plugin`,setup(t){t.onResolve({filter:/.*/},async({path:n})=>{let r=e.find(({find:e})=>z(e,n));if(!r)return null;let{find:i,replacement:a}=r;return{path:(await t.resolve(n.replace(i,a),{kind:`import-statement`,resolveDir:a,namespace:`file`})).path,external:!1}})}}}function z(e,t){return e instanceof RegExp?e.test(t):t.length<e.length?!1:t===e?!0:t.startsWith(`${e}/`)}let B=null;async function V(){return B||=(await import(`esbuild`)).build,B}async function H(e,{isESM:t=!0,define:r,alias:i,cwd:a=_.cwd()}){let o=S.resolve(a,e),s=S.basename(e),c=S.dirname(o);try{let l=await(await V())({entryPoints:[e],outfile:`out.js`,write:!1,target:[`node18`],platform:`node`,bundle:!0,metafile:!0,format:t?`esm`:`cjs`,define:{...r,__dirname:JSON.stringify(c),__filename:JSON.stringify(s),...t?{}:{"import.meta.url":JSON.stringify(C(o))}},plugins:[R(i),L,ae,I,oe],absWorkingDir:a}),u=new Set,d=l.metafile?.inputs||{};return Object.keys(d).forEach(e=>d[e].imports.forEach(e=>u.add(n(e.path)))),{code:l.outputFiles[0].text,deps:Array.from(u)}}catch(e){console.error(e)}return{code:``,deps:[]}}async function U({filepath:e,code:t,isESM:n,cwd:r}){e=S.resolve(r,e);let i=n?`.mjs`:`.cjs`,a=`${e}.timestamp-${Date.now()}${i}`,o=C(a).toString();await D.writeFile(a,t,`utf8`);try{let e=await import(o);return e.default||e}finally{try{E.unlinkSync(a)}catch{}}}const W={name:`vite-mock:rename-plugin`,resolveId(e){if(e===`vite-plugin-mock-dev-server`)return{id:`vite-plugin-mock-dev-server/helper`,external:!0}}},G={name:`vite-mock:json5-plugin`,transform:{filter:{id:/\.json5$/},handler:e=>({code:`export default ${T.stringify(T.parse(e))}`})}};let K=null;async function se(){return K||={build:(await import(`rolldown`)).build,aliasPlugin:(await import(`rolldown/experimental`)).viteAliasPlugin},K}async function ce(e,{isESM:t=!0,define:r,alias:i,cwd:a=_.cwd()}){let o=S.resolve(a,e),s=S.basename(e),c=S.dirname(o),l=e=>!!i.find(({find:t})=>z(t,e));try{let{build:u,aliasPlugin:d}=await se(),f=await u({input:e,write:!1,cwd:a,output:{format:t?`esm`:`cjs`,sourcemap:!1,file:`out.js`},platform:`node`,transform:{define:{...r,__dirname:JSON.stringify(c),__filename:JSON.stringify(s),...t?{}:{"import.meta.url":JSON.stringify(C(o))}}},external(e){if(l(e))return!1;if(e[0]!==`.`&&!S.isAbsolute(e)&&e!==`vite-plugin-mock-dev-server`)return!0},plugins:[d({entries:i}),W,G],onLog(e,t,n){t.code===`PLUGIN_TIMINGS`&&t.message.includes(`vite-mock`)||n(e,t)}});return{code:f.output[0].code,deps:f.output[0].imports.map(n)}}catch(e){console.error(e)}return{code:``,deps:[]}}let q;async function J(e,t){if(q??=await r(`rolldown`)?`rolldown`:await r(`esbuild`)?`esbuild`:`none`,q===`rolldown`)return ce(e,t);if(q===`esbuild`)return H(e,t);throw Error(`rolldown or esbuild not found`)}async function le(e,t){let n=!1;n=/\.m[jt]s$/.test(e)?!0:/\.c[jt]s$/.test(e)?!1:t.isESM||!1;let{code:r,deps:i}=await J(e,{...t,isESM:n});return{data:await U({filepath:e,code:r,isESM:n,cwd:t.cwd||_.cwd()})||{},deps:i}}var ue=class extends O{moduleCache=new Map;moduleDeps=new Map;cwd;mockWatcher;depsWatcher;isESM=!1;_mockData={};options;constructor(e){super(),this.options=e,this.cwd=e.cwd||_.cwd();try{this.isESM=M(this.cwd)?.type===`module`}catch{}}get mockData(){return this._mockData}run(e){let{include:t,exclude:r}=this.options,{pattern:i,ignore:a,isMatch:o}=c(t,r);if(N(i,{ignore:a,cwd:S.join(this.cwd,this.options.dir)}).then(e=>e.map(e=>()=>this.load(n(S.join(this.options.dir,e))))).then(e=>y(e,64)).then(()=>this.updateMockData()),!e)return;this.watchMockEntry(o),this.watchDeps();let s=null;this.on(`mock:update`,async e=>{o(e)&&(await this.load(e),s&&clearImmediate(s),s=setImmediate(()=>{this.updateMockData(),this.emit(`mock:update-end`,n(e)),s=null}))}),this.on(`mock:unlink`,async e=>{o(e)&&(e=n(S.join(this.options.dir,e)),this.moduleCache.delete(e),this.updateMockData(),this.emit(`mock:update-end`,e))})}close(){this.mockWatcher?.close(),this.depsWatcher?.close()}async load(e){if(e)try{let{define:n,alias:r}=this.options,{data:i,deps:a}=await le(e,{cwd:this.cwd,isESM:this.isESM,define:n,alias:r});this.moduleCache.set(e,t(i,e)),this.updateModuleDeps(e,a)}catch(e){console.error(e)}}updateMockData(){this._mockData=u(this.moduleCache)}updateModuleDeps(e,t){for(let n of t)this.moduleDeps.has(n)||this.moduleDeps.set(n,new Set),this.moduleDeps.get(n).add(e);this.emit(`update:deps`)}watchMockEntry(e){let t=this.mockWatcher=k(this.options.dir,{ignoreInitial:!0,cwd:this.cwd,ignored:(t,r)=>t.includes(`node_modules`)?!0:!!r?.isFile()&&!e(n(t))});t.on(`add`,async e=>{e=n(e),this.emit(`mock:update`,e),f(`watcher:add`,e)}),t.on(`change`,async e=>{e=n(e),this.emit(`mock:update`,e),f(`watcher:change`,e)}),t.on(`unlink`,async e=>{e=n(e),this.emit(`mock:unlink`,e),f(`watcher:unlink`,e)})}watchDeps(){let e=[...this.moduleDeps.keys()],t=this.depsWatcher=k([...e],{ignoreInitial:!0,cwd:this.cwd});t.on(`change`,e=>{e=n(e),this.moduleDeps.get(e)?.forEach(e=>this.emit(`mock:update`,e))}),t.on(`unlink`,e=>{e=n(e),this.moduleDeps.delete(e)}),this.on(`update:deps`,()=>{let n=[...this.moduleDeps.keys()],r=n.filter(t=>!e.includes(t));e=n,r.length>0&&t.add(r)})}};function Y(e,t,n){let r=new ue(e);r.run(!!t),r.on(`mock:update-end`,()=>{e.reload&&n?.send({type:`full-reload`})}),t?.on(`close`,()=>r.close()),l(r,t,e);let a=[];return a.push(i(r,e)),a}function X({prefix:e=[],wsPrefix:t=[],cwd:n,dir:r=`mock`,include:i=[`**/*.mock.{js,ts,cjs,mjs,json,json5}`],exclude:a=[],reload:o=!1,log:s=`info`,cors:c=!0,formidableOptions:l={},build:u=!1,cookiesOptions:f={},bodyParserOptions:p={},priority:m={},record:h=!1,replay:g},y){let S=n||_.cwd(),C=d(`vite:mock`,v(s)?s?`info`:`error`:s),{httpProxies:w}=de(y.server.proxy||{}),T=x([...b(e),...w]),E=b(t);!T.length&&!E.length&&C.warn(`No proxy was configured, mock server will not work. See ${P.cyan(`https://vite-plugin-mock-dev-server.netlify.app/guide/usage`)}`);let D=c===!1?!1:y.server.cors!==!1,O={};D&&y.server.cors!==!1&&(O={...O,...typeof y.server.cors==`boolean`?{}:y.server.cors}),D&&c!==!1&&(O={...O,...typeof c==`boolean`?{}:c});let k=[],A=y.resolve.alias||[];ee(A)?k.push(...A):Object.entries(A).forEach(([e,t])=>{k.push({find:e,replacement:t})});let j=Z(S,r,h);return{cwd:S,dir:r,include:i,exclude:a,context:y.root,reload:o,cors:D?O:!1,cookiesOptions:f,log:s,formidableOptions:{multiples:!0,...l},bodyParserOptions:p,priority:m,build:u?{serverPort:8080,dist:`mockServer`,log:`error`,includeRecord:g??j.enabled??!1,...typeof u==`object`?u:{}}:!1,proxies:T,wsProxies:E,logger:C,alias:k,define:ne(y),record:j,replay:g??j.enabled??!1}}function de(e={}){let t=[],n=[];return Object.keys(e).forEach(r=>{let i=e[r];typeof i==`string`||!i.ws&&!i.target?.toString().startsWith(`ws:`)&&!i.target?.toString().startsWith(`wss:`)?t.push(r):n.push(r)}),{httpProxies:t,wsProxies:n}}function Z(e,t,n){let r=typeof n==`boolean`?{enabled:n}:n,i=r?.expires??0;return{enabled:r?.enabled??!1,cwd:e,dir:S.join(t,r?.dir||`.recordings`),overwrite:r?.overwrite??!0,status:b(r?.status).map(Number),expires:i===0?2**53-1:i*1e3,gitignore:r?.gitignore??!0,filter:r?.filter||(()=>!0)}}async function fe(e,t,r,i){let{pattern:a,ignore:o}=c(r,i),s=await N(a,{ignore:o,cwd:S.join(e,t)}),l=``,u=[];return s.forEach((r,i)=>{let a=n(S.join(e,t,r));l+=`import * as m${i} from '${a}';\n`,u.push(`[m${i}, '${n(S.join(t,r))}']`)}),`import { processMockData, processRawData } from 'vite-plugin-mock-dev-server/server';
|
|
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 Q=`vite-plugin-mock-dev-server`,pe=`2.1.0`;function me(e,t){let n=new Set,r=[Q,`connect`,`cors`],i=e=>t.find(({find:t})=>z(t,e));return e.forEach(e=>{let t=he(e);t.startsWith(`<define:`)||i(t)||te(t)||t[0]===`/`||t.startsWith(`./`)||t.startsWith(`../`)||r.includes(t)||n.add(t)}),Array.from(n)}function he(e){let[t,n]=e.split(`/`);return t[0]===`@`?`${t}/${n}`:t}function ge(e,t){let{dependencies:n={},devDependencies:r={}}=e,i={...n,...r},a={name:`mock-server`,type:`module`,scripts:{start:`node index.js`},dependencies:{connect:`^3.7.0`,[Q]:`^${pe}`,cors:`^2.8.5`},pnpm:{peerDependencyRules:{ignoreMissing:[`vite`]}}},o=[`catalog:`,`file:`,`workspace:`];for(let e of t){let t=i[e];if(!t||o.some(e=>t.startsWith(e))){let t=A(e);a.dependencies[e]=t?.version?`^${t.version}`:`latest`}else a.dependencies[e]=`latest`}return JSON.stringify(a,null,2)}function $({proxies:e,wsProxies:t,cookiesOptions:n,bodyParserOptions:r,priority:i,build:a,cors:o,record:s,replay:c}){let{serverPort:l,log:u}=a;return`import { createServer } from 'node:http';
|
|
7
|
+
import process from 'node:process';
|
|
8
|
+
import connect from 'connect';
|
|
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', '${u}');
|
|
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 cors = ${JSON.stringify(o)};
|
|
21
|
+
const record = {
|
|
22
|
+
enabled: ${s.enabled?`true`:`false`},
|
|
23
|
+
cwd: process.cwd(),
|
|
24
|
+
dir: ${JSON.stringify(s.dir)},
|
|
25
|
+
expires: ${s.expires===2**53-1?`Number.MAX_SAFE_INTEGER`:s.expires},
|
|
26
|
+
status: ${JSON.stringify(s.status)},
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const compiler = { mockData }
|
|
30
|
+
|
|
31
|
+
mockWebSocket(compiler, server, { wsProxies, cookiesOptions, logger });
|
|
32
|
+
|
|
33
|
+
app.use(createMockMiddleware(compiler, {
|
|
34
|
+
formidableOptions: { multiples: true },
|
|
35
|
+
proxies,
|
|
36
|
+
priority,
|
|
37
|
+
cookiesOptions,
|
|
38
|
+
bodyParserOptions,
|
|
39
|
+
logger,
|
|
40
|
+
cors,
|
|
41
|
+
record,
|
|
42
|
+
replay: ${c?`true`:`false`},
|
|
43
|
+
}));
|
|
44
|
+
|
|
45
|
+
server.listen(${l});
|
|
46
|
+
|
|
47
|
+
console.log('listen: http://localhost:${l}');
|
|
48
|
+
`}async function _e(e,t){let n=b(t.include),r=b(t.exclude),i=t.cwd||_.cwd(),a=t.dir,o=t.build,s=await j(t.context)||{},c=o.dist,l=await fe(i,a,n,r),u=S.join(i,`mock-data-${Date.now()}.js`);await w.writeFile(u,l,`utf-8`);let{code:d,deps:f}=await J(u,t),p=me(f,t.alias);await w.unlink(u);let m=[{filename:S.join(c,`mock-data.js`),source:d},{filename:S.join(c,`index.js`),source:$(t)},{filename:S.join(c,`package.json`),source:ge(s,p)}];if(t.record.enabled&&o.includeRecord){let e=await N(S.join(t.record.dir,`**/*.json`),{cwd:t.cwd,dot:!0});for(let n of e)m.push({filename:S.join(c,n),source:await w.readFile(S.join(t.cwd,n),`utf-8`)})}try{if(S.isAbsolute(c)){for(let{filename:e}of m)E.existsSync(e)&&await w.rm(e);t.logger.info(`${P.green(`✓`)} generate mock server in ${P.cyan(c)}`);for(let{filename:e,source:n}of m){E.mkdirSync(S.dirname(e),{recursive:!0}),await w.writeFile(e,n,`utf-8`);let r=(n.length/1024).toFixed(2),i=S.relative(c,e),a=i.length<30?` `.repeat(30-i.length):``;t.logger.info(` ${P.green(i)}${a}${P.bold.dim(`${r} kB`)}`)}}else for(let{filename:t,source:n}of m)e.emitFile({type:`asset`,fileName:t,source:n})}catch(e){console.error(e)}}function ve(e={}){if(e.enabled===!1)return[];let t=[be(e)];return e.build&&t.push(ye(e)),t}function ye(e){let t={},n;return{name:`vite-plugin-mock-dev-server-generator`,enforce:`post`,apply:`build`,configResolved(r){t=r,n=X(e,r),r.logger.warn(``)},async buildEnd(e){e||t.command!==`build`||await _e(this,n)}}}function be(t){let n;return{name:`vite-plugin-mock-dev-server`,enforce:`pre`,apply:`serve`,config(n){let r=b(t.wsPrefix);if(r.length&&n.server?.proxy){let e={};Object.keys(n.server.proxy).forEach(t=>{r.includes(t)||(e[t]=n.server.proxy[t])}),n.server.proxy=e}e(n);let{cwd:i,dir:a}=t,o=Z(i||_.cwd(),a||`mock`,t.record);o.enabled&&new s(o).setup(n)},configResolved(e){n=X(t,e),e.logger.warn(``)},configureServer({middlewares:e,httpServer:t,ws:r}){Y(n,t,r).forEach(t=>e.use(t))},configurePreviewServer({middlewares:e,httpServer:t}){Y(n,t).forEach(t=>e.use(t))}}}export{p as createDefineMock,d as createLogger,i as createMockMiddleware,m as createSSEStream,h as defineMock,g as defineMockData,o as logLevels,ve as mockDevServerPlugin,l as mockWebSocket,u as processMockData,t as processRawData,a as sortByValidator};
|