vite-plugin-mock-dev-server 1.1.4 → 1.1.5

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.
Files changed (3) hide show
  1. package/dist/index.cjs +17 -993
  2. package/dist/index.js +17 -948
  3. package/package.json +6 -2
package/dist/index.cjs CHANGED
@@ -1,305 +1,6 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name2 in all)
10
- __defProp(target, name2, { get: all[name2], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
-
30
- // src/index.ts
31
- var src_exports = {};
32
- __export(src_exports, {
33
- baseMiddleware: () => baseMiddleware,
34
- createDefineMock: () => createDefineMock,
35
- default: () => src_default,
36
- defineMock: () => defineMock,
37
- mockDevServerPlugin: () => mockDevServerPlugin,
38
- transformMockData: () => transformMockData
39
- });
40
- module.exports = __toCommonJS(src_exports);
41
-
42
- // node_modules/.pnpm/tsup@6.7.0_typescript@5.0.4/node_modules/tsup/assets/cjs_shims.js
43
- var getImportMetaUrl = () => typeof document === "undefined" ? new URL("file:" + __filename).href : document.currentScript && document.currentScript.src || new URL("main.js", document.baseURI).href;
44
- var importMetaUrl = /* @__PURE__ */ getImportMetaUrl();
45
-
46
- // src/build.ts
47
- var import_node_fs2 = __toESM(require("fs"), 1);
48
- var import_promises2 = __toESM(require("fs/promises"), 1);
49
- var import_node_path3 = __toESM(require("path"), 1);
50
- var import_esbuild = require("esbuild");
51
- var import_fast_glob = __toESM(require("fast-glob"), 1);
52
- var import_is_core_module = __toESM(require("is-core-module"), 1);
53
- var import_vite = require("vite");
54
-
55
- // package.json
56
- var name = "vite-plugin-mock-dev-server";
57
- var version = "1.1.4";
58
-
59
- // src/esbuildPlugin.ts
60
- var import_promises = __toESM(require("fs/promises"), 1);
61
- var import_node_path = __toESM(require("path"), 1);
62
- var import_json5 = __toESM(require("json5"), 1);
63
- var externalizeDeps = {
64
- name: "externalize-deps",
65
- setup(build3) {
66
- build3.onResolve({ filter: /.*/ }, ({ path: id }) => {
67
- if (id[0] !== "." && !import_node_path.default.isAbsolute(id)) {
68
- return {
69
- external: true
70
- };
71
- }
72
- });
73
- }
74
- };
75
- var json5Loader = {
76
- name: "json5-loader",
77
- setup(build3) {
78
- build3.onLoad({ filter: /\.json5$/ }, async ({ path: path5 }) => {
79
- const content = await import_promises.default.readFile(path5, "utf-8");
80
- return {
81
- contents: `export default ${JSON.stringify(import_json5.default.parse(content))}`,
82
- loader: "js"
83
- };
84
- });
85
- }
86
- };
87
- var jsonLoader = {
88
- name: "json-loader",
89
- setup(build3) {
90
- build3.onLoad({ filter: /\.json$/ }, async ({ path: path5 }) => {
91
- const content = await import_promises.default.readFile(path5, "utf-8");
92
- return {
93
- contents: `export default ${content}`,
94
- loader: "js"
95
- };
96
- });
97
- }
98
- };
99
- var aliasPlugin = (alias) => {
100
- return {
101
- name: "alias-plugin",
102
- setup(build3) {
103
- build3.onResolve({ filter: /.*/ }, async ({ path: id }) => {
104
- const matchedEntry = alias.find(({ find: find2 }) => matches(find2, id));
105
- if (!matchedEntry) {
106
- return null;
107
- }
108
- const { find, replacement } = matchedEntry;
109
- const result = await build3.resolve(id.replace(find, replacement), {
110
- kind: "import-statement",
111
- resolveDir: replacement,
112
- namespace: "file"
113
- });
114
- return {
115
- path: result.path,
116
- external: false
117
- };
118
- });
119
- }
120
- };
121
- };
122
- function matches(pattern, importee) {
123
- if (pattern instanceof RegExp) {
124
- return pattern.test(importee);
125
- }
126
- if (importee.length < pattern.length) {
127
- return false;
128
- }
129
- if (importee === pattern) {
130
- return true;
131
- }
132
- return importee.startsWith(`${pattern}/`);
133
- }
134
-
135
- // src/utils.ts
136
- var import_node_fs = __toESM(require("fs"), 1);
137
- var import_node_path2 = __toESM(require("path"), 1);
138
- var import_node_url = require("url");
139
- var import_debug = __toESM(require("debug"), 1);
140
- var import_path_to_regexp = require("path-to-regexp");
141
- var import_picocolors = __toESM(require("picocolors"), 1);
142
- var isArray = (val) => Array.isArray(val);
143
- var isFunction = (val) => typeof val === "function";
144
- var isStream = (stream) => stream !== null && typeof stream === "object" && typeof stream.pipe === "function";
145
- var isReadableStream = (stream) => isStream(stream) && stream.readable !== false && typeof stream._read === "function" && typeof stream._readableState === "object";
146
- function sleep(timeout) {
147
- return new Promise((resolve) => setTimeout(resolve, timeout));
148
- }
149
- function getDirname(importMetaUrl2) {
150
- return import_node_path2.default.dirname((0, import_node_url.fileURLToPath)(importMetaUrl2));
151
- }
152
- var debug = (0, import_debug.default)("vite:plugin-mock-dev-server");
153
- var ensureArray = (thing) => {
154
- if (isArray(thing))
155
- return thing;
156
- if (thing === null || thing === void 0)
157
- return [];
158
- return [thing];
159
- };
160
- var log = {
161
- info(...args) {
162
- console.info(import_picocolors.default.cyan("mock-dev-server: "), ...args);
163
- },
164
- error(...args) {
165
- console.error("\n", import_picocolors.default.cyan("mock-dev-server: "), ...args, "\n");
166
- }
167
- };
168
- function lookupFile(dir, formats, options) {
169
- for (const format of formats) {
170
- const fullPath = import_node_path2.default.join(dir, format);
171
- if (import_node_fs.default.existsSync(fullPath) && import_node_fs.default.statSync(fullPath).isFile()) {
172
- const result = (options == null ? void 0 : options.pathOnly) ? fullPath : import_node_fs.default.readFileSync(fullPath, "utf-8");
173
- if (!(options == null ? void 0 : options.predicate) || options.predicate(result)) {
174
- return result;
175
- }
176
- }
177
- }
178
- const parentDir = import_node_path2.default.dirname(dir);
179
- if (parentDir !== dir && (!(options == null ? void 0 : options.rootDir) || parentDir.startsWith(options == null ? void 0 : options.rootDir))) {
180
- return lookupFile(parentDir, formats, options);
181
- }
182
- }
183
- var ensureProxies = (serverProxy = {}) => {
184
- const proxies = Object.keys(serverProxy).map((key) => {
185
- var _a, _b;
186
- const value = serverProxy[key];
187
- return typeof value === "string" ? key : value.ws || ((_a = value.target) == null ? void 0 : _a.toString().startsWith("ws:")) || ((_b = value.target) == null ? void 0 : _b.toString().startsWith("wss:")) ? "" : key;
188
- }).filter(Boolean);
189
- return proxies;
190
- };
191
- function parseParams(pattern, url) {
192
- const urlMatch = (0, import_path_to_regexp.match)(pattern, { decode: decodeURIComponent })(url) || {
193
- params: {}
194
- };
195
- return urlMatch.params || {};
196
- }
197
-
198
- // src/build.ts
199
- async function generateMockServer(ctx, config, options) {
200
- const include = ensureArray(options.include);
201
- const exclude = ensureArray(options.exclude);
202
- const define = {};
203
- if (config.define) {
204
- for (const key in config.define) {
205
- const val = config.define[key];
206
- define[key] = typeof val === "string" ? val : JSON.stringify(val);
207
- }
208
- }
209
- const proxies = ensureProxies(config.server.proxy || {});
210
- const prefix = ensureArray(options.prefix);
211
- let pkg = {};
212
- try {
213
- const pkgStr = lookupFile(config.root, ["package.json"]);
214
- if (pkgStr) {
215
- pkg = JSON.parse(pkgStr);
216
- }
217
- } catch {
218
- }
219
- const outputDir = options.build.dist;
220
- const content = await generateMockEntryCode(process.cwd(), include, exclude);
221
- const mockEntry = import_node_path3.default.join(config.root, `mock-data-${Date.now()}.js`);
222
- await import_promises2.default.writeFile(mockEntry, content, "utf-8");
223
- const { code, deps } = await buildMockEntry(
224
- mockEntry,
225
- define,
226
- config.resolve.alias
227
- );
228
- const mockDeps = getMockDependencies(deps);
229
- await import_promises2.default.unlink(mockEntry);
230
- const outputList = [
231
- {
232
- filename: import_node_path3.default.join(outputDir, "mock-data.js"),
233
- source: code
234
- },
235
- {
236
- filename: import_node_path3.default.join(outputDir, "index.js"),
237
- source: generatorServerEntryCode(
238
- [...prefix, ...proxies],
239
- options.cookiesOptions,
240
- options.build.serverPort
241
- )
242
- },
243
- {
244
- filename: import_node_path3.default.join(outputDir, "package.json"),
245
- source: generatePackageJson(pkg, mockDeps)
246
- }
247
- ];
248
- try {
249
- if (import_node_path3.default.isAbsolute(outputDir)) {
250
- await import_promises2.default.rm(outputDir, { recursive: true });
251
- import_node_fs2.default.mkdirSync(outputDir, { recursive: true });
252
- for (const { filename, source } of outputList) {
253
- await import_promises2.default.writeFile(filename, source, "utf-8");
254
- }
255
- } else {
256
- for (const { filename, source } of outputList) {
257
- ctx.emitFile({
258
- type: "asset",
259
- fileName: filename,
260
- source
261
- });
262
- }
263
- }
264
- } catch {
265
- }
266
- }
267
- function getMockDependencies(deps) {
268
- const list = /* @__PURE__ */ new Set();
269
- const excludeDeps = [name, "connect", "cors"];
270
- Object.keys(deps).forEach((mPath) => {
271
- const imports = deps[mPath].imports.filter((_) => _.external).map((_) => _.path);
272
- imports.forEach((dep) => {
273
- if (!excludeDeps.includes(dep) && !(0, import_is_core_module.default)(dep)) {
274
- list.add(dep);
275
- }
276
- });
277
- });
278
- return Array.from(list);
279
- }
280
- function generatePackageJson(pkg, mockDeps) {
281
- const { dependencies = {}, devDependencies = {} } = pkg;
282
- const dependents = { ...dependencies, ...devDependencies };
283
- const mockPkg = {
284
- name: "mock-server",
285
- type: "module",
286
- scripts: {
287
- start: "node index.js"
288
- },
289
- dependencies: {
290
- "connect": "^3.7.0",
291
- "vite-plugin-mock-dev-server": `^${version}`,
292
- "cors": "^2.8.5"
293
- },
294
- pnpm: { peerDependencyRules: { ignoreMissing: ["vite"] } }
295
- };
296
- mockDeps.forEach((dep) => {
297
- mockPkg.dependencies[dep] = dependents[dep] || "latest";
298
- });
299
- return JSON.stringify(mockPkg, null, 2);
300
- }
301
- function generatorServerEntryCode(proxies, cookiesOptions = {}, port = 8080) {
302
- return `import connect from 'connect';
1
+ "use strict";var Ge=Object.create;var J=Object.defineProperty;var Qe=Object.getOwnPropertyDescriptor;var Xe=Object.getOwnPropertyNames;var Ke=Object.getPrototypeOf,Ve=Object.prototype.hasOwnProperty;var Ye=(t,o)=>{for(var e in o)J(t,e,{get:o[e],enumerable:!0})},le=(t,o,e,r)=>{if(o&&typeof o=="object"||typeof o=="function")for(let n of Xe(o))!Ve.call(t,n)&&n!==e&&J(t,n,{get:()=>o[n],enumerable:!(r=Qe(o,n))||r.enumerable});return t};var l=(t,o,e)=>(e=t!=null?Ge(Ke(t)):{},le(o||!t||!t.__esModule?J(e,"default",{value:t,enumerable:!0}):e,t)),Ze=t=>le(J({},"__esModule",{value:!0}),t);var xt={};Ye(xt,{baseMiddleware:()=>te,createDefineMock:()=>bt,default:()=>Mt,defineMock:()=>vt,mockDevServerPlugin:()=>ae,transformMockData:()=>oe});module.exports=Ze(xt);var et=()=>typeof document>"u"?new URL("file:"+__filename).href:document.currentScript&&document.currentScript.src||new URL("main.js",document.baseURI).href,f=et();var je=l(require("fs"),1),F=l(require("fs/promises"),1),w=l(require("path"),1),Re=require("esbuild"),Se=l(require("fast-glob"),1),Pe=l(require("is-core-module"),1),H=require("vite");var de="vite-plugin-mock-dev-server",me="1.1.5";var Q=l(require("fs/promises"),1),fe=l(require("path"),1),ge=l(require("json5"),1),U={name:"externalize-deps",setup(t){t.onResolve({filter:/.*/},({path:o})=>{if(o[0]!=="."&&!fe.default.isAbsolute(o))return{external:!0}})}},ye={name:"json5-loader",setup(t){t.onLoad({filter:/\.json5$/},async({path:o})=>{let e=await Q.default.readFile(o,"utf-8");return{contents:`export default ${JSON.stringify(ge.default.parse(e))}`,loader:"js"}})}},ke={name:"json-loader",setup(t){t.onLoad({filter:/\.json$/},async({path:o})=>({contents:`export default ${await Q.default.readFile(o,"utf-8")}`,loader:"js"}))}},A=t=>({name:"alias-plugin",setup(o){o.onResolve({filter:/.*/},async({path:e})=>{let r=t.find(({find:a})=>tt(a,e));if(!r)return null;let{find:n,replacement:s}=r;return{path:(await o.resolve(e.replace(n,s),{kind:"import-statement",resolveDir:s,namespace:"file"})).path,external:!1}})}});function tt(t,o){return t instanceof RegExp?t.test(o):o.length<t.length?!1:o===t?!0:o.startsWith(`${t}/`)}var _=l(require("fs"),1),q=l(require("path"),1),he=require("url"),ve=l(require("debug"),1),be=require("path-to-regexp"),X=l(require("picocolors"),1),v=t=>Array.isArray(t),b=t=>typeof t=="function",ot=t=>Object.prototype.toString.call(t)==="[object Object]",Me=t=>ot(t)&&Object.keys(t).length===0,rt=t=>t!==null&&typeof t=="object"&&typeof t.pipe=="function",xe=t=>rt(t)&&t.readable!==!1&&typeof t._read=="function"&&typeof t._readableState=="object";function we(t){return new Promise(o=>setTimeout(o,t))}function Oe(t){return q.default.dirname((0,he.fileURLToPath)(t))}var S=(0,ve.default)("vite:plugin-mock-dev-server"),M=t=>v(t)?t:t==null?[]:[t],P={info(...t){console.info(X.default.cyan("mock-dev-server: "),...t)},error(...t){console.error(`
2
+ `,X.default.cyan("mock-dev-server: "),...t,`
3
+ `)}};function E(t,o,e){for(let n of o){let s=q.default.join(t,n);if(_.default.existsSync(s)&&_.default.statSync(s).isFile()){let i=e!=null&&e.pathOnly?s:_.default.readFileSync(s,"utf-8");if(!(e!=null&&e.predicate)||e.predicate(i))return i}}let r=q.default.dirname(t);if(r!==t&&(!(e!=null&&e.rootDir)||r.startsWith(e==null?void 0:e.rootDir)))return E(r,o,e)}var z=(t={})=>Object.keys(t).map(e=>{var n,s;let r=t[e];return typeof r=="string"?e:r.ws||(n=r.target)!=null&&n.toString().startsWith("ws:")||(s=r.target)!=null&&s.toString().startsWith("wss:")?"":e}).filter(Boolean);function K(t,o){return((0,be.match)(t,{decode:decodeURIComponent})(o)||{params:{}}).params||{}}async function De(t,o,e){let r=M(e.include),n=M(e.exclude),s={};if(o.define)for(let g in o.define){let m=o.define[g];s[g]=typeof m=="string"?m:JSON.stringify(m)}let i=z(o.server.proxy||{}),a=M(e.prefix),c={};try{let g=E(o.root,["package.json"]);g&&(c=JSON.parse(g))}catch{}let p=e.build.dist,d=await at(process.cwd(),r,n),u=w.default.join(o.root,`mock-data-${Date.now()}.js`);await F.default.writeFile(u,d,"utf-8");let{code:W,deps:N}=await ct(u,s,o.resolve.alias),R=nt(N);await F.default.unlink(u);let C=[{filename:w.default.join(p,"mock-data.js"),source:W},{filename:w.default.join(p,"index.js"),source:it([...a,...i],e.cookiesOptions,e.build.serverPort)},{filename:w.default.join(p,"package.json"),source:st(c,R)}];try{if(w.default.isAbsolute(p)){await F.default.rm(p,{recursive:!0}),je.default.mkdirSync(p,{recursive:!0});for(let{filename:g,source:m}of C)await F.default.writeFile(g,m,"utf-8")}else for(let{filename:g,source:m}of C)t.emitFile({type:"asset",fileName:g,source:m})}catch{}}function nt(t){let o=new Set,e=[de,"connect","cors"];return Object.keys(t).forEach(r=>{t[r].imports.filter(s=>s.external).map(s=>s.path).forEach(s=>{!e.includes(s)&&!(0,Pe.default)(s)&&o.add(s)})}),Array.from(o)}function st(t,o){let{dependencies:e={},devDependencies:r={}}=t,n={...e,...r},s={name:"mock-server",type:"module",scripts:{start:"node index.js"},dependencies:{connect:"^3.7.0","vite-plugin-mock-dev-server":`^${me}`,cors:"^2.8.5"},pnpm:{peerDependencyRules:{ignoreMissing:["vite"]}}};return o.forEach(i=>{s.dependencies[i]=n[i]||"latest"}),JSON.stringify(s,null,2)}function it(t,o={},e=8080){return`import connect from 'connect';
303
4
  import corsMiddleware from 'cors';
304
5
  import { baseMiddleware } from 'vite-plugin-mock-dev-server';
305
6
  import mockData from './mock-data.js';
@@ -308,701 +9,24 @@ const app = connect();
308
9
  app.use(corsMiddleware());
309
10
  app.use(baseMiddleware({ mockData }, {
310
11
  formidableOptions: { multiples: true },
311
- proxies: ${JSON.stringify(proxies)}
312
- cookiesOptions: ${JSON.stringify(cookiesOptions)}
12
+ proxies: ${JSON.stringify(t)}
13
+ cookiesOptions: ${JSON.stringify(o)}
313
14
  }));
314
- app.listen(${port});
15
+ app.listen(${e});
315
16
 
316
- console.log('listen: http://localhost:${port}');
317
- `;
318
- }
319
- async function generateMockEntryCode(cwd, include, exclude) {
320
- const includePaths = await (0, import_fast_glob.default)(include, { cwd });
321
- const includeFilter = (0, import_vite.createFilter)(include, exclude, {
322
- resolve: false
323
- });
324
- const mockFiles = includePaths.filter(includeFilter);
325
- let importers = "";
326
- let exporters = "";
327
- mockFiles.forEach((filepath, index) => {
328
- const file = (0, import_vite.normalizePath)(import_node_path3.default.join(cwd, filepath));
329
- importers += `import * as m${index} from '${file}';
330
- `;
331
- exporters += `m${index}, `;
332
- });
333
- return `import { transformMockData } from 'vite-plugin-mock-dev-server';
334
- ${importers}
335
- const exporters = [${exporters}];
17
+ console.log('listen: http://localhost:${e}');
18
+ `}async function at(t,o,e){let r=await(0,Se.default)(o,{cwd:t}),n=(0,H.createFilter)(o,e,{resolve:!1}),s=r.filter(n),i="",a="";return s.forEach((c,p)=>{let d=(0,H.normalizePath)(w.default.join(t,c));i+=`import * as m${p} from '${d}';
19
+ `,a+=`m${p}, `}),`import { transformMockData } from 'vite-plugin-mock-dev-server';
20
+ ${i}
21
+ const exporters = [${a}];
336
22
  const mockList = exporters.map((raw) => raw && raw.default
337
23
  ? raw.default
338
24
  : Object.keys(raw || {}).map((key) => raw[key])
339
25
  )
340
26
  export default transformMockData(mockList);
341
- `;
342
- }
343
- async function buildMockEntry(inputFile, define, alias) {
344
- var _a;
345
- try {
346
- const result = await (0, import_esbuild.build)({
347
- entryPoints: [inputFile],
348
- outfile: "out.js",
349
- write: false,
350
- target: ["node14.18", "node16"],
351
- platform: "node",
352
- bundle: true,
353
- metafile: true,
354
- format: "esm",
355
- define,
356
- plugins: [aliasPlugin(alias), externalizeDeps, json5Loader, jsonLoader]
357
- });
358
- return {
359
- code: result.outputFiles[0].text,
360
- deps: ((_a = result.metafile) == null ? void 0 : _a.inputs) || {}
361
- };
362
- } catch (e) {
363
- console.error(e);
364
- }
365
- return { code: "", deps: {} };
366
- }
367
-
368
- // src/baseMiddleware.ts
369
- var import_node_buffer = require("buffer");
370
- var import_node_url2 = require("url");
371
- var import_cookies = __toESM(require("cookies"), 1);
372
- var import_http_status = __toESM(require("http-status"), 1);
373
- var mime = __toESM(require("mime-types"), 1);
374
- var import_path_to_regexp2 = require("path-to-regexp");
375
- var import_picocolors2 = __toESM(require("picocolors"), 1);
376
-
377
- // src/parseReqBody.ts
378
- var import_co_body = __toESM(require("co-body"), 1);
379
- var import_formidable = __toESM(require("formidable"), 1);
380
- async function parseReqBody(req, options) {
381
- var _a;
382
- const method = req.method.toUpperCase();
383
- if (["GET", "DELETE", "HEAD"].includes(method))
384
- return void 0;
385
- const type = ((_a = req.headers["content-type"]) == null ? void 0 : _a.toLocaleLowerCase()) || "";
386
- try {
387
- if (type.startsWith("application/json")) {
388
- return await import_co_body.default.json(req);
389
- }
390
- if (type.startsWith("application/x-www-form-urlencoded")) {
391
- return await import_co_body.default.form(req);
392
- }
393
- if (type.startsWith("text/plain")) {
394
- return await import_co_body.default.text(req);
395
- }
396
- if (type.startsWith("multipart/form-data")) {
397
- return await parseMultipart(req, options);
398
- }
399
- } catch (e) {
400
- console.error(e);
401
- }
402
- return void 0;
403
- }
404
- async function parseMultipart(req, options) {
405
- const form = (0, import_formidable.default)(options);
406
- return new Promise((resolve, reject) => {
407
- form.parse(req, (error, fields, files) => {
408
- if (error) {
409
- reject(error);
410
- return;
411
- }
412
- resolve({ ...fields, ...files });
413
- });
414
- });
415
- }
416
-
417
- // src/validator.ts
418
- function validate(request, validator) {
419
- return equalObj(request.headers, validator.headers) && equalObj(request.body, validator.body) && equalObj(request.params, validator.params) && equalObj(request.query, validator.query) && equalObj(request.refererQuery, validator.refererQuery);
420
- }
421
- function equalObj(left, right) {
422
- if (!right)
423
- return true;
424
- for (const key in right) {
425
- if (right[key] !== left[key])
426
- return false;
427
- }
428
- return true;
429
- }
430
-
431
- // src/baseMiddleware.ts
432
- function baseMiddleware(mockLoader, { formidableOptions = {}, proxies, cookiesOptions }) {
433
- return async function(req, res, next) {
434
- const startTime = Date.now();
435
- const { query, pathname } = (0, import_node_url2.parse)(req.url, true);
436
- if (!pathname || proxies.length === 0 || !proxies.some((context) => doesProxyContextMatchUrl(context, req.url))) {
437
- return next();
438
- }
439
- const mockData = mockLoader.mockData;
440
- const mockUrl = Object.keys(mockData).find((key) => {
441
- return (0, import_path_to_regexp2.pathToRegexp)(key).test(pathname);
442
- });
443
- if (!mockUrl)
444
- return next();
445
- const { query: refererQuery } = (0, import_node_url2.parse)(req.headers.referer || "", true);
446
- const reqBody = await parseReqBody(req, formidableOptions);
447
- const cookies = new import_cookies.default(req, res, cookiesOptions);
448
- const getCookie = cookies.get.bind(cookies);
449
- const method = req.method.toUpperCase();
450
- const mock = fineMock(mockData[mockUrl], {
451
- pathname,
452
- method,
453
- request: {
454
- query,
455
- refererQuery,
456
- body: reqBody,
457
- headers: req.headers,
458
- getCookie
459
- }
460
- });
461
- if (!mock)
462
- return next();
463
- debug("middleware: ", method, pathname);
464
- const request = req;
465
- const response = res;
466
- request.body = reqBody;
467
- request.query = query;
468
- request.refererQuery = refererQuery;
469
- request.params = parseParams(mock.url, pathname);
470
- request.getCookie = getCookie;
471
- response.setCookie = cookies.set.bind(cookies);
472
- const {
473
- body,
474
- delay,
475
- type = "json",
476
- response: responseFn,
477
- status = 200,
478
- statusText
479
- } = mock;
480
- responseStatus(response, status, statusText);
481
- await provideHeaders(request, response, mock);
482
- await provideCookies(request, response, mock);
483
- if (body) {
484
- try {
485
- const content = isFunction(body) ? await body(request) : body;
486
- await realDelay(startTime, delay);
487
- sendData(response, content, type);
488
- } catch (e) {
489
- log.error(`${import_picocolors2.default.red("[body error]")} ${req.url}
490
- `, e);
491
- responseStatus(response, 500);
492
- res.end("");
493
- }
494
- return;
495
- }
496
- if (responseFn) {
497
- try {
498
- await realDelay(startTime, delay);
499
- await responseFn(request, response, next);
500
- } catch (e) {
501
- log.error(`${import_picocolors2.default.red("[response error]")} ${req.url}
502
- `, e);
503
- responseStatus(response, 500);
504
- res.end("");
505
- }
506
- return;
507
- }
508
- res.end("");
509
- };
510
- }
511
- function fineMock(mockList, {
512
- pathname,
513
- method,
514
- request
515
- }) {
516
- return mockList.find((mock) => {
517
- if (!pathname || !mock || !mock.url)
518
- return false;
519
- const methods = mock.method ? isArray(mock.method) ? mock.method : [mock.method] : ["GET", "POST"];
520
- if (!methods.includes(method))
521
- return false;
522
- const hasMock = (0, import_path_to_regexp2.pathToRegexp)(mock.url).test(pathname);
523
- if (hasMock && mock.validator) {
524
- const params = parseParams(mock.url, pathname);
525
- if (isFunction(mock.validator)) {
526
- return mock.validator({ params, ...request });
527
- } else {
528
- return validate({ params, ...request }, mock.validator);
529
- }
530
- }
531
- return hasMock;
532
- });
533
- }
534
- function responseStatus(response, status = 200, statusText) {
535
- response.statusCode = status;
536
- response.statusMessage = statusText || getHTTPStatusText(status);
537
- }
538
- async function provideHeaders(req, res, { headers, type = "json" }) {
539
- const contentType2 = mime.contentType(type) || mime.contentType(mime.lookup(type) || "");
540
- contentType2 && res.setHeader("Content-Type", contentType2);
541
- res.setHeader("Cache-Control", "no-cache,max-age=0");
542
- res.setHeader("X-Mock", "generate by vite:plugin-mock-dev-server");
543
- if (!headers)
544
- return;
545
- try {
546
- const raw = isFunction(headers) ? await headers(req) : headers;
547
- Object.keys(raw).forEach((key) => {
548
- res.setHeader(key, raw[key]);
549
- });
550
- } catch (e) {
551
- log.error(`${import_picocolors2.default.red("[headers error]")} ${req.url}
552
- `, e);
553
- }
554
- }
555
- async function provideCookies(req, res, { cookies }) {
556
- if (!cookies)
557
- return;
558
- try {
559
- const raw = isFunction(cookies) ? await cookies(req) : cookies;
560
- Object.keys(raw).forEach((key) => {
561
- const cookie = raw[key];
562
- if (isArray(cookie)) {
563
- const [value, options] = cookie;
564
- res.setCookie(key, value, options);
565
- } else {
566
- res.setCookie(key, cookie);
567
- }
568
- });
569
- } catch (e) {
570
- log.error(`${import_picocolors2.default.red("[cookies error]")} ${req.url}
571
- `, e);
572
- }
573
- }
574
- function sendData(res, raw, type) {
575
- if (isReadableStream(raw)) {
576
- raw.pipe(res);
577
- } else if (import_node_buffer.Buffer.isBuffer(raw)) {
578
- res.end(type === "text" || type === "json" ? raw.toString("utf-8") : raw);
579
- } else {
580
- const content = typeof raw === "string" ? raw : JSON.stringify(raw);
581
- res.end(type === "buffer" ? import_node_buffer.Buffer.from(content) : content);
582
- }
583
- }
584
- async function realDelay(startTime, delay) {
585
- if (!delay || delay <= 0)
586
- return;
587
- const diff = Date.now() - startTime;
588
- const realDelay2 = delay - diff;
589
- if (realDelay2 > 0)
590
- await sleep(realDelay2);
591
- }
592
- function doesProxyContextMatchUrl(context, url) {
593
- return context.startsWith("^") && new RegExp(context).test(url) || url.startsWith(context);
594
- }
595
- function getHTTPStatusText(status) {
596
- return import_http_status.default[status] || "Unknown";
597
- }
598
-
599
- // src/MockLoader.ts
600
- var import_node_events = __toESM(require("events"), 1);
601
- var import_node_fs3 = __toESM(require("fs"), 1);
602
- var import_node_module = require("module");
603
- var import_node_path4 = __toESM(require("path"), 1);
604
- var import_node_url4 = require("url");
605
- var import_chokidar = __toESM(require("chokidar"), 1);
606
- var import_esbuild2 = require("esbuild");
607
- var import_fast_glob2 = __toESM(require("fast-glob"), 1);
608
- var import_json52 = __toESM(require("json5"), 1);
609
- var import_vite2 = require("vite");
610
-
611
- // src/transform.ts
612
- var import_node_url3 = require("url");
613
- function transformMockData(mockList) {
614
- const list = [];
615
- for (const [, handle] of mockList.entries()) {
616
- if (handle) {
617
- isArray(handle) ? list.push(...handle) : list.push(handle);
618
- }
619
- }
620
- const mocks = {};
621
- list.filter(
622
- (mock) => (mock.enabled || typeof mock.enabled === "undefined") && mock.url
623
- ).forEach((mock) => {
624
- const { pathname, query } = (0, import_node_url3.parse)(mock.url, true);
625
- const list2 = mocks[pathname] ?? (mocks[pathname] = []);
626
- const current = Object.assign({}, mock, { url: pathname });
627
- if (query && !isFunction(current.validator)) {
628
- current.validator = Object.assign({}, current.validator || {});
629
- current.validator.query = Object.assign(
630
- query,
631
- current.validator.query || {}
632
- );
633
- }
634
- current.validator ? list2.unshift(current) : list2.push(current);
635
- });
636
- return mocks;
637
- }
638
-
639
- // src/MockLoader.ts
640
- var _dirname = getDirname(importMetaUrl);
641
- var _require = (0, import_node_module.createRequire)(_dirname);
642
- var _MockLoader = class extends import_node_events.default {
643
- constructor(options) {
644
- super();
645
- this.options = options;
646
- this.moduleCache = /* @__PURE__ */ new Map();
647
- this.moduleDeps = /* @__PURE__ */ new Map();
648
- this.moduleType = "cjs";
649
- this._mockData = {};
650
- this.cwd = options.cwd || process.cwd();
651
- try {
652
- const pkg = lookupFile(this.cwd, ["package.json"]);
653
- this.moduleType = !!pkg && JSON.parse(pkg).type === "module" ? "esm" : "cjs";
654
- } catch (e) {
655
- }
656
- }
657
- get mockData() {
658
- return this._mockData;
659
- }
660
- async load() {
661
- const { include, exclude } = this.options;
662
- const includePaths = await (0, import_fast_glob2.default)(include, {
663
- cwd: this.cwd
664
- });
665
- const includeFilter = (0, import_vite2.createFilter)(include, exclude, {
666
- resolve: false
667
- });
668
- this.watchMockEntry();
669
- this.watchDeps();
670
- for (const filepath of includePaths.filter(includeFilter)) {
671
- await this.loadMock(filepath);
672
- }
673
- this.updateMockList();
674
- this.on("mock:update", async (filepath) => {
675
- if (!includeFilter(filepath))
676
- return;
677
- await this.loadMock(filepath);
678
- this.updateMockList();
679
- this.emit("mock:update-end");
680
- });
681
- this.on("mock:unlink", async (filepath) => {
682
- if (!includeFilter(filepath))
683
- return;
684
- this.moduleCache.delete(filepath);
685
- this.updateMockList();
686
- this.emit("mock:update-end");
687
- });
688
- }
689
- watchMockEntry() {
690
- const { include } = this.options;
691
- const [firstGlob, ...otherGlob] = include;
692
- const watcher = import_chokidar.default.watch(firstGlob, {
693
- ignoreInitial: true,
694
- cwd: this.cwd
695
- });
696
- otherGlob.length > 0 && otherGlob.forEach((glob) => watcher.add(glob));
697
- watcher.on("add", async (filepath) => {
698
- filepath = (0, import_vite2.normalizePath)(filepath);
699
- this.emit("mock:update", filepath);
700
- debug("watcher:add", filepath);
701
- });
702
- watcher.on("change", async (filepath) => {
703
- filepath = (0, import_vite2.normalizePath)(filepath);
704
- this.emit("mock:update", filepath);
705
- debug("watcher:change", filepath);
706
- });
707
- watcher.on("unlink", async (filepath) => {
708
- filepath = (0, import_vite2.normalizePath)(filepath);
709
- this.emit("mock:unlink", filepath);
710
- debug("watcher:unlink", filepath);
711
- });
712
- this.mockWatcher = watcher;
713
- }
714
- /**
715
- * 监听 mock文件依赖的本地文件变动,
716
- * mock依赖文件更新,mock文件也一并更新
717
- */
718
- watchDeps() {
719
- const oldDeps = [];
720
- this.depsWatcher = import_chokidar.default.watch([], {
721
- ignoreInitial: true,
722
- cwd: this.cwd
723
- });
724
- this.depsWatcher.on("change", (filepath) => {
725
- filepath = (0, import_vite2.normalizePath)(filepath);
726
- const mockFiles = this.moduleDeps.get(filepath);
727
- mockFiles && mockFiles.forEach((file) => {
728
- this.emit("mock:update", file);
729
- });
730
- });
731
- this.depsWatcher.on("unlink", (filepath) => {
732
- filepath = (0, import_vite2.normalizePath)(filepath);
733
- this.moduleDeps.delete(filepath);
734
- });
735
- this.on("update:deps", () => {
736
- const deps = [];
737
- for (const [dep] of this.moduleDeps.entries()) {
738
- deps.push(dep);
739
- }
740
- const exactDeps = deps.filter((dep) => !oldDeps.includes(dep));
741
- exactDeps.length > 0 && this.depsWatcher.add(exactDeps);
742
- });
743
- }
744
- close() {
745
- var _a, _b;
746
- (_a = this.mockWatcher) == null ? void 0 : _a.close();
747
- (_b = this.depsWatcher) == null ? void 0 : _b.close();
748
- }
749
- updateMockList() {
750
- this._mockData = transformMockData(this.moduleCache);
751
- }
752
- updateModuleDeps(filepath, deps) {
753
- Object.keys(deps).forEach((mPath) => {
754
- const imports = deps[mPath].imports.map((_) => _.path);
755
- imports.forEach((dep) => {
756
- if (!this.moduleDeps.has(dep)) {
757
- this.moduleDeps.set(dep, /* @__PURE__ */ new Set());
758
- }
759
- const cur = this.moduleDeps.get(dep);
760
- cur.add(filepath);
761
- });
762
- });
763
- this.emit("update:deps");
764
- }
765
- async loadMock(filepath) {
766
- if (!filepath)
767
- return;
768
- if (_MockLoader.EXT_JSON.test(filepath)) {
769
- await this.loadJson(filepath);
770
- } else {
771
- await this.loadModule(filepath);
772
- }
773
- }
774
- async loadJson(filepath) {
775
- const content = await import_node_fs3.default.promises.readFile(filepath, "utf-8");
776
- try {
777
- const mockConfig = import_json52.default.parse(content);
778
- this.moduleCache.set(filepath, mockConfig);
779
- } catch (e) {
780
- }
781
- }
782
- async loadModule(filepath) {
783
- if (!filepath)
784
- return;
785
- let isESM = false;
786
- if (/\.m[jt]s$/.test(filepath)) {
787
- isESM = true;
788
- } else if (/\.c[jt]s$/.test(filepath)) {
789
- isESM = false;
790
- } else {
791
- isESM = this.moduleType === "esm";
792
- }
793
- const { code, deps } = await this.transformWithEsbuild(filepath, isESM);
794
- try {
795
- const raw = await this.loadFromCode(filepath, code, isESM);
796
- const mockConfig = raw && raw.default ? raw.default : Object.keys(raw || {}).map((key) => raw[key]);
797
- this.moduleCache.set(filepath, mockConfig);
798
- this.updateModuleDeps(filepath, deps);
799
- } catch (e) {
800
- console.error(e);
801
- }
802
- }
803
- async loadFromCode(filepath, code, isESM) {
804
- if (isESM) {
805
- const fileBase = `${filepath}.timestamp-${Date.now()}`;
806
- const fileNameTmp = `${fileBase}.mjs`;
807
- const fileUrl = `${(0, import_node_url4.pathToFileURL)(fileBase)}.mjs`;
808
- await import_node_fs3.default.promises.writeFile(fileNameTmp, code, "utf8");
809
- try {
810
- return await import(fileUrl);
811
- } finally {
812
- try {
813
- import_node_fs3.default.unlinkSync(fileNameTmp);
814
- } catch {
815
- }
816
- }
817
- } else {
818
- filepath = import_node_path4.default.resolve(this.cwd, filepath);
819
- const extension = import_node_path4.default.extname(filepath);
820
- const realFileName = import_node_fs3.default.realpathSync(filepath);
821
- const loaderExt = extension in _require.extensions ? extension : ".js";
822
- const defaultLoader = _require.extensions[loaderExt];
823
- _require.extensions[loaderExt] = (module2, filename) => {
824
- if (filename === realFileName) {
825
- ;
826
- module2._compile(code, filename);
827
- } else {
828
- defaultLoader(module2, filename);
829
- }
830
- };
831
- delete _require.cache[_require.resolve(filepath)];
832
- const raw = _require(filepath);
833
- _require.extensions[loaderExt] = defaultLoader;
834
- return raw.__esModule ? raw : { default: raw };
835
- }
836
- }
837
- async transformWithEsbuild(filepath, isESM) {
838
- var _a;
839
- try {
840
- const result = await (0, import_esbuild2.build)({
841
- entryPoints: [filepath],
842
- outfile: "out.js",
843
- write: false,
844
- target: ["node14.18", "node16"],
845
- platform: "node",
846
- bundle: true,
847
- metafile: true,
848
- format: isESM ? "esm" : "cjs",
849
- define: this.options.define,
850
- plugins: [aliasPlugin(this.options.alias), externalizeDeps]
851
- });
852
- return {
853
- code: result.outputFiles[0].text,
854
- deps: ((_a = result.metafile) == null ? void 0 : _a.inputs) || {}
855
- };
856
- } catch (e) {
857
- }
858
- return {
859
- code: "",
860
- deps: {}
861
- };
862
- }
863
- };
864
- var MockLoader = _MockLoader;
865
- MockLoader.EXT_JSON = /\.json5?$/;
866
-
867
- // src/mockMiddleware.ts
868
- async function mockServerMiddleware(config, options, httpServer, ws) {
869
- const include = ensureArray(options.include);
870
- const exclude = ensureArray(options.exclude);
871
- const define = {};
872
- if (config.define) {
873
- for (const key in config.define) {
874
- const val = config.define[key];
875
- define[key] = typeof val === "string" ? val : JSON.stringify(val);
876
- }
877
- }
878
- const loader = new MockLoader({
879
- include,
880
- exclude,
881
- define,
882
- alias: config.resolve.alias
883
- });
884
- await loader.load();
885
- httpServer == null ? void 0 : httpServer.on("close", () => loader.close());
886
- loader.on("mock:update-end", () => {
887
- if (options.reload) {
888
- ws == null ? void 0 : ws.send({ type: "full-reload" });
889
- }
890
- });
891
- const proxies = ensureProxies(config.server.proxy || {});
892
- const prefix = ensureArray(options.prefix);
893
- return baseMiddleware(loader, {
894
- formidableOptions: options.formidableOptions,
895
- proxies: [...prefix, ...proxies],
896
- cookiesOptions: options.cookiesOptions
897
- });
898
- }
899
-
900
- // src/plugin.ts
901
- function mockDevServerPlugin({
902
- prefix = [],
903
- include = ["mock/**/*.mock.{js,ts,cjs,mjs,json,json5}"],
904
- exclude = ["**/node_modules/**", "**/.vscode/**", "**/.git/**"],
905
- reload = false,
906
- formidableOptions = {},
907
- build: build3 = false,
908
- cookiesOptions = {}
909
- } = {}) {
910
- const pluginOptions = {
911
- prefix,
912
- include,
913
- exclude,
914
- reload,
915
- cookiesOptions,
916
- formidableOptions: {
917
- multiples: true,
918
- ...formidableOptions
919
- },
920
- build: build3 ? Object.assign(
921
- {
922
- serverPort: 8080,
923
- dist: "mockServer"
924
- },
925
- typeof build3 === "object" ? build3 : {}
926
- ) : false
927
- };
928
- const plugins = [serverPlugin(pluginOptions)];
929
- if (pluginOptions.build) {
930
- plugins.push(buildPlugin(pluginOptions));
931
- }
932
- return plugins;
933
- }
934
- function buildPlugin(pluginOptions) {
935
- let viteConfig = {};
936
- return {
937
- name: "vite-plugin-mock-dev-server-generator",
938
- enforce: "post",
939
- apply: "build",
940
- configResolved(config) {
941
- viteConfig = config;
942
- config.logger.warn("");
943
- },
944
- async buildEnd(error) {
945
- if (error)
946
- return;
947
- if (viteConfig.command !== "build")
948
- return;
949
- await generateMockServer(this, viteConfig, pluginOptions);
950
- }
951
- };
952
- }
953
- function serverPlugin(pluginOptions) {
954
- let viteConfig = {};
955
- return {
956
- name: "vite-plugin-mock-dev-server",
957
- enforce: "pre",
958
- apply: "serve",
959
- configResolved(config) {
960
- viteConfig = config;
961
- config.logger.warn("");
962
- },
963
- async configureServer({ middlewares, config, httpServer, ws }) {
964
- const middleware = await mockServerMiddleware(
965
- config,
966
- pluginOptions,
967
- httpServer,
968
- ws
969
- );
970
- middlewares.use(middleware);
971
- },
972
- async configurePreviewServer({ middlewares, httpServer }) {
973
- const middleware = await mockServerMiddleware(
974
- viteConfig,
975
- pluginOptions,
976
- httpServer
977
- );
978
- middlewares.use(middleware);
979
- }
980
- };
981
- }
982
-
983
- // src/define.ts
984
- function defineMock(config) {
985
- return config;
986
- }
987
- function createDefineMock(transformer) {
988
- const define = (config) => {
989
- if (isArray(config)) {
990
- config = config.map((item) => transformer(item) || item);
991
- } else {
992
- config = transformer(config) || config;
993
- }
994
- return config;
995
- };
996
- return define;
997
- }
998
-
999
- // src/index.ts
1000
- var src_default = mockDevServerPlugin;
1001
- // Annotate the CommonJS export names for ESM import in node:
1002
- 0 && (module.exports = {
1003
- baseMiddleware,
1004
- createDefineMock,
1005
- defineMock,
1006
- mockDevServerPlugin,
1007
- transformMockData
1008
- });
27
+ `}async function ct(t,o,e){var r;try{let n=await(0,Re.build)({entryPoints:[t],outfile:"out.js",write:!1,target:["node14.18","node16"],platform:"node",bundle:!0,metafile:!0,format:"esm",define:o,plugins:[A(e),U,ye,ke]});return{code:n.outputFiles[0].text,deps:((r=n.metafile)==null?void 0:r.inputs)||{}}}catch(n){console.error(n)}return{code:"",deps:{}}}var Y=require("buffer"),Z=require("url"),$e=l(require("cookies"),1),Le=l(require("http-status"),1),T=l(require("mime-types"),1),ee=require("path-to-regexp"),D=l(require("picocolors"),1);var G=l(require("co-body"),1),Ce=l(require("formidable"),1);async function Ee(t,o){var n;let e=t.method.toUpperCase();if(["GET","DELETE","HEAD"].includes(e))return;let r=((n=t.headers["content-type"])==null?void 0:n.toLocaleLowerCase())||"";try{if(r.startsWith("application/json"))return await G.default.json(t);if(r.startsWith("application/x-www-form-urlencoded"))return await G.default.form(t);if(r.startsWith("text/plain"))return await G.default.text(t);if(r.startsWith("multipart/form-data"))return await pt(t,o)}catch(s){console.error(s)}}async function pt(t,o){let e=(0,Ce.default)(o);return new Promise((r,n)=>{e.parse(t,(s,i,a)=>{if(s){n(s);return}r({...i,...a})})})}function Fe(t,o){return O(t.headers,o.headers)&&O(t.body,o.body)&&O(t.params,o.params)&&O(t.query,o.query)&&O(t.refererQuery,o.refererQuery)}function O(t,o){if(!o)return!0;for(let e in o)if(o[e]!==t[e])return!1;return!0}function te(t,{formidableOptions:o={},proxies:e,cookiesOptions:r}){return async function(n,s,i){let a=Date.now(),{query:c,pathname:p}=(0,Z.parse)(n.url,!0);if(!p||e.length===0||!e.some(k=>ft(k,n.url)))return i();let d=t.mockData,u=Object.keys(d).find(k=>(0,ee.pathToRegexp)(k).test(p));if(!u)return i();let{query:W}=(0,Z.parse)(n.headers.referer||"",!0),N=await Ee(n,o),R=new $e.default(n,s,r),C=R.get.bind(R),g=n.method.toUpperCase(),m=lt(d[u],{pathname:p,method:g,request:{query:c,refererQuery:W,body:N,headers:n.headers,getCookie:C}});if(!m)return i();S("middleware: ",g,n.url);let y=n,h=s;y.body=N,y.query=c,y.refererQuery=W,y.params=K(m.url,p),y.getCookie=C,h.setCookie=R.set.bind(R);let{body:B,delay:ce,type:qe="json",response:pe,status:ze=200,statusText:He}=m;if(V(h,ze,He),await ut(y,h,m),await dt(y,h,m),B){try{let k=b(B)?await B(y):B;await Te(a,ce),mt(h,k,qe)}catch(k){P.error(`${D.default.red("[body error]")} ${n.url}
28
+ `,k),V(h,500),s.end("")}return}if(pe){try{await Te(a,ce),await pe(y,h,i)}catch(k){P.error(`${D.default.red("[response error]")} ${n.url}
29
+ `,k),V(h,500),s.end("")}return}s.end("")}}function lt(t,{pathname:o,method:e,request:r}){return t.find(n=>{if(!o||!n||!n.url||!(n.method?v(n.method)?n.method:[n.method]:["GET","POST"]).includes(e))return!1;let i=(0,ee.pathToRegexp)(n.url).test(o);if(i&&n.validator){let a=K(n.url,o);if(b(n.validator))return n.validator({params:a,...r});try{return Fe({params:a,...r},n.validator)}catch(c){return P.error(`${D.default.red("[validator error]")} ${o}
30
+ `,c),!1}}return i})}function V(t,o=200,e){t.statusCode=o,t.statusMessage=e||gt(o)}async function ut(t,o,{headers:e,type:r="json"}){let n=T.contentType(r)||T.contentType(T.lookup(r)||"");if(n&&o.setHeader("Content-Type",n),o.setHeader("Cache-Control","no-cache,max-age=0"),o.setHeader("X-Mock","generate by vite:plugin-mock-dev-server"),!!e)try{let s=b(e)?await e(t):e;Object.keys(s).forEach(i=>{o.setHeader(i,s[i])})}catch(s){P.error(`${D.default.red("[headers error]")} ${t.url}
31
+ `,s)}}async function dt(t,o,{cookies:e}){if(e)try{let r=b(e)?await e(t):e;Object.keys(r).forEach(n=>{let s=r[n];if(v(s)){let[i,a]=s;o.setCookie(n,i,a)}else o.setCookie(n,s)})}catch(r){P.error(`${D.default.red("[cookies error]")} ${t.url}
32
+ `,r)}}function mt(t,o,e){if(xe(o))o.pipe(t);else if(Y.Buffer.isBuffer(o))t.end(e==="text"||e==="json"?o.toString("utf-8"):o);else{let r=typeof o=="string"?o:JSON.stringify(o);t.end(e==="buffer"?Y.Buffer.from(r):r)}}async function Te(t,o){if(!o||o<=0)return;let e=Date.now()-t,r=o-e;r>0&&await we(r)}function ft(t,o){return t[0]==="^"&&new RegExp(t).test(o)||o.startsWith(t)}function gt(t){return Le.default[t]||"Unknown"}var Ne=l(require("events"),1),L=l(require("fs"),1),Be=require("module"),re=l(require("path"),1),Je=require("url"),ne=l(require("chokidar"),1),Ue=require("esbuild"),Ae=l(require("fast-glob"),1),_e=l(require("json5"),1),x=require("vite");var Ie=require("url"),We=l(require("lodash.sortby"),1);function oe(t){let o=[];for(let[,r]of t.entries())r&&(v(r)?o.push(...r):o.push(r));let e={};return o.filter(r=>(r.enabled||typeof r.enabled>"u")&&r.url).forEach(r=>{let{pathname:n,query:s}=(0,Ie.parse)(r.url,!0),i=e[n]??(e[n]=[]),a={...r,url:n},c=a.validator;Me(s)||(b(c)?a.validator=function(p){return O(p.query,s)&&c(p)}:c?(a.validator={...c},a.validator.query=a.validator.query?{...s,...a.validator.query}:s):a.validator={query:s}),i.push(a)}),Object.keys(e).forEach(r=>{e[r]=(0,We.default)(e[r],({validator:n})=>{if(!n)return 2;if(b(n))return 0;let{query:s,params:i,headers:a,body:c,refererQuery:p}=n;return 1/($(s)+$(i)+$(a)+$(c)+$(p))})}),e}function $(t){return t?Object.keys(t).length:0}var yt=Oe(f),j=(0,Be.createRequire)(yt),se=class extends Ne.default{constructor(e){super();this.options=e;this.moduleCache=new Map;this.moduleDeps=new Map;this.moduleType="cjs";this._mockData={};this.cwd=e.cwd||process.cwd();try{let r=E(this.cwd,["package.json"]);this.moduleType=r&&JSON.parse(r).type==="module"?"esm":"cjs"}catch{}}get mockData(){return this._mockData}async load(){let{include:e,exclude:r}=this.options,n=await(0,Ae.default)(e,{cwd:this.cwd}),s=(0,x.createFilter)(e,r,{resolve:!1});this.watchMockEntry(),this.watchDeps();for(let i of n.filter(s))await this.loadMock(i);this.updateMockList(),this.on("mock:update",async i=>{s(i)&&(await this.loadMock(i),this.updateMockList(),this.emit("mock:update-end"))}),this.on("mock:unlink",async i=>{s(i)&&(this.moduleCache.delete(i),this.updateMockList(),this.emit("mock:update-end"))})}watchMockEntry(){let{include:e}=this.options,[r,...n]=e,s=ne.default.watch(r,{ignoreInitial:!0,cwd:this.cwd});n.length>0&&n.forEach(i=>s.add(i)),s.on("add",async i=>{i=(0,x.normalizePath)(i),this.emit("mock:update",i),S("watcher:add",i)}),s.on("change",async i=>{i=(0,x.normalizePath)(i),this.emit("mock:update",i),S("watcher:change",i)}),s.on("unlink",async i=>{i=(0,x.normalizePath)(i),this.emit("mock:unlink",i),S("watcher:unlink",i)}),this.mockWatcher=s}watchDeps(){let e=[];this.depsWatcher=ne.default.watch([],{ignoreInitial:!0,cwd:this.cwd}),this.depsWatcher.on("change",r=>{r=(0,x.normalizePath)(r);let n=this.moduleDeps.get(r);n&&n.forEach(s=>{this.emit("mock:update",s)})}),this.depsWatcher.on("unlink",r=>{r=(0,x.normalizePath)(r),this.moduleDeps.delete(r)}),this.on("update:deps",()=>{let r=[];for(let[s]of this.moduleDeps.entries())r.push(s);let n=r.filter(s=>!e.includes(s));n.length>0&&this.depsWatcher.add(n)})}close(){var e,r;(e=this.mockWatcher)==null||e.close(),(r=this.depsWatcher)==null||r.close()}updateMockList(){this._mockData=oe(this.moduleCache)}updateModuleDeps(e,r){Object.keys(r).forEach(n=>{r[n].imports.map(i=>i.path).forEach(i=>{this.moduleDeps.has(i)||this.moduleDeps.set(i,new Set),this.moduleDeps.get(i).add(e)})}),this.emit("update:deps")}async loadMock(e){e&&(se.EXT_JSON.test(e)?await this.loadJson(e):await this.loadModule(e))}async loadJson(e){let r=await L.default.promises.readFile(e,"utf-8");try{let n=_e.default.parse(r);this.moduleCache.set(e,n)}catch{}}async loadModule(e){if(!e)return;let r=!1;/\.m[jt]s$/.test(e)?r=!0:/\.c[jt]s$/.test(e)?r=!1:r=this.moduleType==="esm";let{code:n,deps:s}=await this.transformWithEsbuild(e,r);try{let i=await this.loadFromCode(e,n,r),a=i&&i.default?i.default:Object.keys(i||{}).map(c=>i[c]);this.moduleCache.set(e,a),this.updateModuleDeps(e,s)}catch(i){console.error(i)}}async loadFromCode(e,r,n){if(n){let s=`${e}.timestamp-${Date.now()}`,i=`${s}.mjs`,a=`${(0,Je.pathToFileURL)(s)}.mjs`;await L.default.promises.writeFile(i,r,"utf8");try{return await import(a)}finally{try{L.default.unlinkSync(i)}catch{}}}else{e=re.default.resolve(this.cwd,e);let s=re.default.extname(e),i=L.default.realpathSync(e),a=s in j.extensions?s:".js",c=j.extensions[a];j.extensions[a]=(d,u)=>{u===i?d._compile(r,u):c(d,u)},delete j.cache[j.resolve(e)];let p=j(e);return j.extensions[a]=c,p.__esModule?p:{default:p}}}async transformWithEsbuild(e,r){var n;try{let s=await(0,Ue.build)({entryPoints:[e],outfile:"out.js",write:!1,target:["node14.18","node16"],platform:"node",bundle:!0,metafile:!0,format:r?"esm":"cjs",define:this.options.define,plugins:[A(this.options.alias),U]});return{code:s.outputFiles[0].text,deps:((n=s.metafile)==null?void 0:n.inputs)||{}}}catch{}return{code:"",deps:{}}}},I=se;I.EXT_JSON=/\.json5?$/;async function ie(t,o,e,r){let n=M(o.include),s=M(o.exclude),i={};if(t.define)for(let d in t.define){let u=t.define[d];i[d]=typeof u=="string"?u:JSON.stringify(u)}let a=new I({include:n,exclude:s,define:i,alias:t.resolve.alias});await a.load(),e==null||e.on("close",()=>a.close()),a.on("mock:update-end",()=>{o.reload&&(r==null||r.send({type:"full-reload"}))});let c=z(t.server.proxy||{}),p=M(o.prefix);return te(a,{formidableOptions:o.formidableOptions,proxies:[...p,...c],cookiesOptions:o.cookiesOptions})}function ae({prefix:t=[],include:o=["mock/**/*.mock.{js,ts,cjs,mjs,json,json5}"],exclude:e=["**/node_modules/**","**/.vscode/**","**/.git/**"],reload:r=!1,formidableOptions:n={},build:s=!1,cookiesOptions:i={}}={}){let a={prefix:t,include:o,exclude:e,reload:r,cookiesOptions:i,formidableOptions:{multiples:!0,...n},build:s?Object.assign({serverPort:8080,dist:"mockServer"},typeof s=="object"?s:{}):!1},c=[ht(a)];return a.build&&c.push(kt(a)),c}function kt(t){let o={};return{name:"vite-plugin-mock-dev-server-generator",enforce:"post",apply:"build",configResolved(e){o=e,e.logger.warn("")},async buildEnd(e){e||o.command==="build"&&await De(this,o,t)}}}function ht(t){let o={};return{name:"vite-plugin-mock-dev-server",enforce:"pre",apply:"serve",configResolved(e){o=e,e.logger.warn("")},async configureServer({middlewares:e,config:r,httpServer:n,ws:s}){let i=await ie(r,t,n,s);e.use(i)},async configurePreviewServer({middlewares:e,httpServer:r}){let n=await ie(o,t,r);e.use(n)}}}function vt(t){return t}function bt(t){return e=>(v(e)?e=e.map(r=>t(r)||r):e=t(e)||e,e)}var Mt=ae;0&&(module.exports={baseMiddleware,createDefineMock,defineMock,mockDevServerPlugin,transformMockData});