vite-plugin-mock-dev-server 1.1.16 → 1.2.1
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/README.md +9 -1
- package/README.zh-CN.md +9 -1
- package/dist/index.cjs +11 -11
- package/dist/index.d.ts +11 -2
- package/dist/index.js +11 -11
- package/package.json +19 -16
package/README.md
CHANGED
|
@@ -98,7 +98,7 @@ The plugin will also read the `define` configuration, which supports direct use
|
|
|
98
98
|
|
|
99
99
|
By default, write mock data in the `mock` directory of your project's root directory:
|
|
100
100
|
|
|
101
|
-
`mock
|
|
101
|
+
`mock/**/*.mock.ts` :
|
|
102
102
|
``` ts
|
|
103
103
|
import { defineMock } from 'vite-plugin-mock-dev-server'
|
|
104
104
|
|
|
@@ -174,6 +174,14 @@ export default defineConfig({
|
|
|
174
174
|
|
|
175
175
|
When the mock resource is hot updated, only the data content is updated, but the page is not refreshed by default. If you want to refresh the page every time you modify the mock file, you can open this option.
|
|
176
176
|
|
|
177
|
+
- `options.cors`
|
|
178
|
+
|
|
179
|
+
**Type:** `boolean | CorsOptions`
|
|
180
|
+
|
|
181
|
+
Enable by default.
|
|
182
|
+
|
|
183
|
+
Configure to `cors`, see [cors](https://github.com/expressjs/cors#configuration-options)
|
|
184
|
+
|
|
177
185
|
|
|
178
186
|
**Default:** `false`
|
|
179
187
|
|
package/README.zh-CN.md
CHANGED
|
@@ -98,7 +98,7 @@ export default defineConfig({
|
|
|
98
98
|
|
|
99
99
|
默认配置,在你的项目根目录的 `mock` 目录中编写mock数据:
|
|
100
100
|
|
|
101
|
-
`mock
|
|
101
|
+
`mock/**/*.mock.ts` :
|
|
102
102
|
```ts
|
|
103
103
|
import { defineMock } from 'vite-plugin-mock-dev-server'
|
|
104
104
|
|
|
@@ -173,6 +173,14 @@ export default defineConfig({
|
|
|
173
173
|
|
|
174
174
|
**Default:** `false`
|
|
175
175
|
|
|
176
|
+
- `options.cors`
|
|
177
|
+
|
|
178
|
+
**Type:** `boolean | CorsOptions`
|
|
179
|
+
|
|
180
|
+
默认启用.
|
|
181
|
+
|
|
182
|
+
配置 `cors`, 查看 [cors](https://github.com/expressjs/cors#configuration-options)
|
|
183
|
+
|
|
176
184
|
- `options.formidableOptions`
|
|
177
185
|
|
|
178
186
|
配置 `formidable`,查看 [formidable options](https://github.com/node-formidable/formidable#options)
|
package/dist/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var pt=Object.create;var Q=Object.defineProperty;var lt=Object.getOwnPropertyDescriptor;var ut=Object.getOwnPropertyNames;var mt=Object.getPrototypeOf,dt=Object.prototype.hasOwnProperty;var ft=(e,o)=>{for(var t in o)Q(e,t,{get:o[t],enumerable:!0})},Se=(e,o,t,r)=>{if(o&&typeof o=="object"||typeof o=="function")for(let n of ut(o))!dt.call(e,n)&&n!==t&&Q(e,n,{get:()=>o[n],enumerable:!(r=lt(o,n))||r.enumerable});return e};var f=(e,o,t)=>(t=e!=null?pt(mt(e)):{},Se(o||!e||!e.__esModule?Q(t,"default",{value:e,enumerable:!0}):t,e)),kt=e=>Se(Q({},"__esModule",{value:!0}),e);var Ht={};ft(Ht,{baseMiddleware:()=>ke,createDefineMock:()=>Ft,default:()=>Nt,defineMock:()=>Tt,mockDevServerPlugin:()=>xe,mockWebSocket:()=>Me,transformMockData:()=>ge});module.exports=kt(Ht);var gt=()=>typeof document>"u"?new URL("file:"+__filename).href:document.currentScript&&document.currentScript.src||new URL("main.js",document.baseURI).href,b=gt();var $e=f(require("fs"),1),z=f(require("fs/promises"),1),N=f(require("path"),1),Te=require("esbuild"),Fe=f(require("fast-glob"),1),Ne=f(require("is-core-module"),1),se=require("vite");var Ce="vite-plugin-mock-dev-server",je="1.2.1";var Z=f(require("picocolors"),1);var V=f(require("fs"),1),K=f(require("path"),1),Pe=require("querystring"),X=require("url"),Re=f(require("debug"),1),We=require("path-to-regexp"),pe=f(require("picocolors"),1),M=e=>Array.isArray(e),D=e=>typeof e=="function",U=e=>Object.prototype.toString.call(e)==="[object Object]",le=e=>U(e)&&Object.keys(e).length===0,yt=e=>e!==null&&typeof e=="object"&&typeof e.pipe=="function",De=e=>yt(e)&&e.readable!==!1&&typeof e._read=="function"&&typeof e._readableState=="object";function Ee(e){return new Promise(o=>setTimeout(o,e))}function _e(e){return K.default.dirname((0,X.fileURLToPath)(e))}var E=(0,Re.default)("vite:plugin-mock-dev-server"),S=e=>M(e)?e:e==null?[]:[e],j={info(...e){console.info(pe.default.cyan("mock-dev-server: "),...e)},error(...e){console.error(`
|
|
2
2
|
`,pe.default.cyan("mock-dev-server: "),...e,`
|
|
3
|
-
`)}};function
|
|
3
|
+
`)}};function J(e,o,t){for(let n of o){let s=K.default.join(e,n);if(V.default.existsSync(s)&&V.default.statSync(s).isFile()){let i=t!=null&&t.pathOnly?s:V.default.readFileSync(s,"utf-8");if(!(t!=null&&t.predicate)||t.predicate(i))return i}}let r=K.default.dirname(e);if(r!==e&&(!(t!=null&&t.rootDir)||r.startsWith(t==null?void 0:t.rootDir)))return J(r,o,t)}var Y=(e={})=>{let o=[],t=[];return Object.keys(e).forEach(r=>{var s,i;let n=e[r];typeof n=="string"||!n.ws&&!((s=n.target)!=null&&s.toString().startsWith("ws:"))&&!((i=n.target)!=null&&i.toString().startsWith("wss:"))?o.push(r):t.push(r)}),{httpProxies:o,wsProxies:t}};function A(e,o){return e[0]==="^"&&new RegExp(e).test(o)||o.startsWith(e)}function q(e,o){return((0,We.match)(e,{decode:decodeURIComponent})(o)||{params:{}}).params||{}}function P(e){let o=new X.URL(e,"http://example.com"),t=decodeURIComponent(o.pathname),r=(0,Pe.parse)(o.search.replace(/^\?/,""));return{pathname:t,query:r}}var ht=/import\.meta\.env\.(.+)/;function ee(e){let o={},t=process.env.NODE_ENV||e.mode;Object.assign(o,{"process.env.NODE_ENV":JSON.stringify(t),"global.process.env.NODE_ENV":JSON.stringify(t),"globalThis.process.env.NODE_ENV":JSON.stringify(t),__vite_process_env_NODE_ENV:JSON.stringify(t)});let r={},n={},s=[];for(let a in e.define){let p=e.define[a];if(typeof p=="string")try{JSON.parse(p),r[a]=p}catch{s.push(a)}else r[a]=JSON.stringify(p);let k=a.match(ht);k&&r[a]&&(n[k[1]]=`__vite__define__${r[a]}`)}s.length&&j.error(`${Z.default.yellow("[warn]")} The following keys: ${Z.default.yellow(Z.default.underline(s.join(", ")))} declared in 'define' cannot be parsed as regular code snippets.`);let i={},c={};i["import.meta.hot"]="undefined";for(let a in e.env)i[`import.meta.env.${a}`]=JSON.stringify(e.env[a]);return Object.assign(c,{"import.meta.env":JSON.stringify({...e.env,...n}).replace(/"__vite__define__(.+?)"([,}])/g,(a,p,k)=>`${p.replace(/(^\\")|(\\"$)/g,'"')}${k}`)}),{...i,...r,...c,...o}}var ue=f(require("fs/promises"),1),Le=f(require("path"),1),Ie=f(require("json5"),1),te={name:"externalize-deps",setup(e){e.onResolve({filter:/.*/},({path:o})=>{if(o[0]!=="."&&!Le.default.isAbsolute(o))return{external:!0}})}},oe={name:"json5-loader",setup(e){e.onLoad({filter:/\.json5$/},async({path:o})=>{let t=await ue.default.readFile(o,"utf-8");return{contents:`export default ${JSON.stringify(Ie.default.parse(t))}`,loader:"js"}})}},re={name:"json-loader",setup(e){e.onLoad({filter:/\.json$/},async({path:o})=>({contents:`export default ${await ue.default.readFile(o,"utf-8")}`,loader:"js"}))}},ne=e=>({name:"alias-plugin",setup(o){o.onResolve({filter:/.*/},async({path:t})=>{let r=e.find(({find:c})=>vt(c,t));if(!r)return null;let{find:n,replacement:s}=r;return{path:(await o.resolve(t.replace(n,s),{kind:"import-statement",resolveDir:s,namespace:"file"})).path,external:!1}})}});function vt(e,o){return e instanceof RegExp?e.test(o):o.length<e.length?!1:o===e?!0:o.startsWith(`${e}/`)}async function He(e,o,t){let r=S(t.include),n=S(t.exclude),s=ee(o),{httpProxies:i}=Y(o.server.proxy||{});i.push(...S(t.prefix));let c=S(t.wsPrefix),a={};try{let m=J(o.root,["package.json"]);m&&(a=JSON.parse(m))}catch{}let p=t.build.dist,k=await wt(process.cwd(),r,n),x=N.default.join(o.root,`mock-data-${Date.now()}.js`);await z.default.writeFile(x,k,"utf-8");let{code:O,deps:I}=await St(x,s,o.resolve.alias),l=Mt(I);await z.default.unlink(x);let u=[{filename:N.default.join(p,"mock-data.js"),source:O},{filename:N.default.join(p,"index.js"),source:xt(i,c,t.cookiesOptions,t.build.serverPort)},{filename:N.default.join(p,"package.json"),source:bt(a,l)}];try{if(N.default.isAbsolute(p)){await z.default.rm(p,{recursive:!0}),$e.default.mkdirSync(p,{recursive:!0});for(let{filename:m,source:d}of u)await z.default.writeFile(m,d,"utf-8")}else for(let{filename:m,source:d}of u)e.emitFile({type:"asset",fileName:m,source:d})}catch{}}function Mt(e){let o=new Set,t=[Ce,"connect","cors"];return Object.keys(e).forEach(r=>{e[r].imports.filter(s=>s.external&&!s.path.startsWith("<define:")).map(s=>s.path).forEach(s=>{!t.includes(s)&&!(0,Ne.default)(s)&&o.add(s)})}),Array.from(o)}function bt(e,o){let{dependencies:t={},devDependencies:r={}}=e,n={...t,...r},s={name:"mock-server",type:"module",scripts:{start:"node index.js"},dependencies:{connect:"^3.7.0","vite-plugin-mock-dev-server":`^${je}`,cors:"^2.8.5"},pnpm:{peerDependencyRules:{ignoreMissing:["vite"]}}};return o.forEach(i=>{s.dependencies[i]=n[i]||"latest"}),JSON.stringify(s,null,2)}function xt(e,o,t={},r=8080){return`import { createServer } from 'node:http';
|
|
4
4
|
import connect from 'connect';
|
|
5
5
|
import corsMiddleware from 'cors';
|
|
6
6
|
import { baseMiddleware, mockWebSocket } from 'vite-plugin-mock-dev-server';
|
|
@@ -24,8 +24,8 @@ app.use(baseMiddleware({ mockData }, {
|
|
|
24
24
|
server.listen(${r});
|
|
25
25
|
|
|
26
26
|
console.log('listen: http://localhost:${r}');
|
|
27
|
-
`}async function
|
|
28
|
-
`,c+=`m${
|
|
27
|
+
`}async function wt(e,o,t){let r=await(0,Fe.default)(o,{cwd:e}),n=(0,se.createFilter)(o,t,{resolve:!1}),s=r.filter(n),i="",c="";return s.forEach((a,p)=>{let k=(0,se.normalizePath)(N.default.join(e,a));i+=`import * as m${p} from '${k}';
|
|
28
|
+
`,c+=`m${p}, `}),`import { transformMockData } from 'vite-plugin-mock-dev-server';
|
|
29
29
|
${i}
|
|
30
30
|
const exporters = [${c}];
|
|
31
31
|
const mockList = exporters.map((raw) => {
|
|
@@ -42,10 +42,10 @@ const mockList = exporters.map((raw) => {
|
|
|
42
42
|
}
|
|
43
43
|
return mockConfig
|
|
44
44
|
});
|
|
45
|
-
export default transformMockData(mockList);`}async function
|
|
46
|
-
`,`file: ${
|
|
47
|
-
`,`file: ${
|
|
48
|
-
`,`file: ${
|
|
49
|
-
`,c)}}async function
|
|
50
|
-
`,r)}}function
|
|
51
|
-
`,
|
|
45
|
+
export default transformMockData(mockList);`}async function St(e,o,t){var r;try{let n=await(0,Te.build)({entryPoints:[e],outfile:"out.js",write:!1,target:["node14.18","node16"],platform:"node",bundle:!0,metafile:!0,format:"esm",define:o,plugins:[ne(t),te,oe,re]});return{code:n.outputFiles[0].text,deps:((r=n.metafile)==null?void 0:r.inputs)||{}}}catch(n){console.error(n)}return{code:"",deps:{}}}var st=f(require("cors"),1),it=require("path-to-regexp");var de=require("buffer"),ze=f(require("cookies"),1),Ge=f(require("http-status"),1),Qe=f(require("lodash.sortby"),1),G=f(require("mime-types"),1),fe=require("path-to-regexp"),R=f(require("picocolors"),1);var ie=f(require("co-body"),1),Ue=f(require("formidable"),1);async function Ae(e,o){var n;let t=e.method.toUpperCase();if(["GET","DELETE","HEAD"].includes(t))return;let r=((n=e.headers["content-type"])==null?void 0:n.toLocaleLowerCase())||"";try{if(r.startsWith("application/json"))return await ie.default.json(e);if(r.startsWith("application/x-www-form-urlencoded"))return await ie.default.form(e);if(r.startsWith("text/plain"))return await ie.default.text(e);if(r.startsWith("multipart/form-data"))return await Ot(e,o)}catch(s){console.error(s)}}async function Ot(e,o){let t=(0,Ue.default)(o);return new Promise((r,n)=>{t.parse(e,(s,i,c)=>{if(s){n(s);return}r({...i,...c})})})}function Be(e,o){return _(e.headers,o.headers)&&_(e.body,o.body)&&_(e.params,o.params)&&_(e.query,o.query)&&_(e.refererQuery,o.refererQuery)}function _(e,o){if(!o)return!0;for(let t in o)if(!Je(e[t],o[t]))return!1;return!0}function Je(e,o){if(M(e)&&M(o)){let t=new Set;return o.every(r=>e.some((n,s)=>{if(t.has(s))return!1;let i=Je(n,r);return i&&t.add(s),i}))}return U(e)&&U(o)?_(e,o):Object.is(e,o)}var Ct=/:/g;function ke(e,{formidableOptions:o={},proxies:t,cookiesOptions:r}){return async function(n,s,i){let c=Date.now(),{query:a,pathname:p}=P(n.url);if(!p||t.length===0||!t.some(v=>A(v,n.url)))return i();let k=e.mockData,x=(0,Qe.default)(Object.keys(k),v=>{var B;return((B=v.match(Ct))==null?void 0:B.length)||0}).find(v=>(0,fe.pathToRegexp)(v).test(p));if(!x)return i();let{query:O}=P(n.headers.referer||""),I=await Ae(n,o),l=new ze.default(n,s,r),u=l.get.bind(l),m=n.method.toUpperCase(),d=jt(k[x],{pathname:p,method:m,request:{query:a,refererQuery:O,body:I,headers:n.headers,getCookie:u}});if(!d)return i();E("middleware: ",m,n.url);let g=n,y=s;g.body=I,g.query=a,g.refererQuery=O,g.params=q(d.url,p),g.getCookie=u,y.setCookie=l.set.bind(l);let{body:h,delay:C,type:W="json",response:$,status:T=200,statusText:F}=d;if(me(y,T,F),await Pt(g,y,d),await Rt(g,y,d),h){try{let v=D(h)?await h(g):h;await qe(c,C),Wt(y,v,W)}catch(v){j.error(`${R.default.red("[body error]")} ${n.url}
|
|
46
|
+
`,`file: ${R.default.cyan(d.__filepath__)}`,v),me(y,500),s.end("")}return}if($){try{await qe(c,C),await $(g,y,i)}catch(v){j.error(`${R.default.red("[response error]")} ${n.url}
|
|
47
|
+
`,`file: ${R.default.cyan(d.__filepath__)}`,v),me(y,500),s.end("")}return}s.end("")}}function jt(e,{pathname:o,method:t,request:r}){return e.find(n=>{if(!o||!n||!n.url||n.ws===!0||!(n.method?M(n.method)?n.method:[n.method]:["GET","POST"]).includes(t))return!1;let i=(0,fe.pathToRegexp)(n.url).test(o);if(i&&n.validator){let c=q(n.url,o);if(D(n.validator))return n.validator({params:c,...r});try{return Be({params:c,...r},n.validator)}catch(a){return j.error(`${R.default.red("[validator error]")} ${o}
|
|
48
|
+
`,`file: ${R.default.cyan(n.__filepath__)}`,a),!1}}return i})}function me(e,o=200,t){e.statusCode=o,e.statusMessage=t||Dt(o)}async function Pt(e,o,t){let{headers:r,type:n="json"}=t,s=t.__filepath__,i=G.contentType(n)||G.contentType(G.lookup(n)||"");if(i&&o.setHeader("Content-Type",i),o.setHeader("Cache-Control","no-cache,max-age=0"),o.setHeader("X-Mock-Power-By","vite-plugin-mock-dev-server"),o.setHeader("X-File-Path",s),!!r)try{let c=D(r)?await r(e):r;Object.keys(c).forEach(a=>{o.setHeader(a,c[a])})}catch(c){j.error(`${R.default.red("[headers error]")} ${e.url}
|
|
49
|
+
`,c)}}async function Rt(e,o,{cookies:t}){if(t)try{let r=D(t)?await t(e):t;Object.keys(r).forEach(n=>{let s=r[n];if(M(s)){let[i,c]=s;o.setCookie(n,i,c)}else o.setCookie(n,s)})}catch(r){j.error(`${R.default.red("[cookies error]")} ${e.url}
|
|
50
|
+
`,r)}}function Wt(e,o,t){if(De(o))o.pipe(e);else if(de.Buffer.isBuffer(o))e.end(t==="text"||t==="json"?o.toString("utf-8"):o);else{let r=typeof o=="string"?o:JSON.stringify(o);e.end(t==="buffer"?de.Buffer.from(r):r)}}async function qe(e,o){if(!o||typeof o=="number"&&o<=0||M(o)&&o.length!==2)return;let t=0;if(M(o)){let[r,n]=o;t=Math.floor(Math.random()*(n-r+1))+r}else t=o-(Date.now()-e);t>0&&await Ee(t)}function Dt(e){return Ge.default[e]||"Unknown"}var Ke=f(require("events"),1),ce=f(require("fs"),1),Xe=require("module"),ye=f(require("path"),1),Ye=require("url"),he=f(require("chokidar"),1),Ze=require("esbuild"),et=f(require("fast-glob"),1),L=require("vite");var Ve=f(require("lodash.sortby"),1);function ge(e){let o=[];for(let[,r]of e.entries())r&&(M(r)?o.push(...r):o.push(r));let t={};return o.filter(r=>U(r)&&r.enabled!==!1&&r.url).forEach(r=>{let{pathname:n,query:s}=P(r.url),i=t[n]??=[],c={...r,url:n};if(c.ws!==!0){let a=c.validator;le(s)||(D(a)?c.validator=function(p){return _(p.query,s)&&a(p)}:a?(c.validator={...a},c.validator.query=c.validator.query?{...s,...c.validator.query}:s):c.validator={query:s})}i.push(c)}),Object.keys(t).forEach(r=>{t[r]=(0,Ve.default)(t[r],n=>{if(n.ws===!0)return 0;let{validator:s}=n;return!s||le(s)?2:D(s)?0:1/Object.keys(s).reduce((c,a)=>c+Et(s[a]),0)})}),t}function Et(e){return e?Object.keys(e).length:0}var _t=_e(b),H=(0,Xe.createRequire)(_t),ae=class extends Ke.default{constructor(t){super();this.options=t;this.cwd=t.cwd||process.cwd();try{let r=J(this.cwd,["package.json"]);this.moduleType=r&&JSON.parse(r).type==="module"?"esm":"cjs"}catch{}}moduleCache=new Map;moduleDeps=new Map;cwd;mockWatcher;depsWatcher;moduleType="cjs";_mockData={};get mockData(){return this._mockData}load(){let{include:t,exclude:r}=this.options,n=(0,L.createFilter)(t,r,{resolve:!1});(0,et.default)(t,{cwd:this.cwd}).then(i=>Promise.all(i.filter(n).map(c=>this.loadMock(c)))).then(()=>this.updateMockList()),this.watchMockEntry(),this.watchDeps();let s=null;this.on("mock:update",async i=>{n(i)&&(await this.loadMock(i),s&&clearImmediate(s),s=setImmediate(()=>{this.updateMockList(),this.emit("mock:update-end",i),s=null}))}),this.on("mock:unlink",async i=>{n(i)&&(this.moduleCache.delete(i),this.updateMockList(),this.emit("mock:update-end",i))})}watchMockEntry(){let{include:t}=this.options,[r,...n]=t,s=he.default.watch(r,{ignoreInitial:!0,cwd:this.cwd});n.length>0&&n.forEach(i=>s.add(i)),s.on("add",async i=>{i=(0,L.normalizePath)(i),this.emit("mock:update",i),E("watcher:add",i)}),s.on("change",async i=>{i=(0,L.normalizePath)(i),this.emit("mock:update",i),E("watcher:change",i)}),s.on("unlink",async i=>{i=(0,L.normalizePath)(i),this.emit("mock:unlink",i),E("watcher:unlink",i)}),this.mockWatcher=s}watchDeps(){let t=[];this.depsWatcher=he.default.watch([],{ignoreInitial:!0,cwd:this.cwd}),this.depsWatcher.on("change",r=>{r=(0,L.normalizePath)(r);let n=this.moduleDeps.get(r);n&&n.forEach(s=>{this.emit("mock:update",s)})}),this.depsWatcher.on("unlink",r=>{r=(0,L.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=>!t.includes(s));n.length>0&&this.depsWatcher.add(n)})}close(){var t,r;(t=this.mockWatcher)==null||t.close(),(r=this.depsWatcher)==null||r.close()}updateMockList(){this._mockData=ge(this.moduleCache)}updateModuleDeps(t,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(t)})}),this.emit("update:deps")}async loadMock(t){if(!t)return;let r=!1;/\.m[jt]s$/.test(t)?r=!0:/\.c[jt]s$/.test(t)?r=!1:r=this.moduleType==="esm";let{code:n,deps:s}=await this.transformWithEsbuild(t,r);try{let i=await this.loadFromCode(t,n,r)||{},c;i.default?c=i.default:(c=[],Object.keys(i).forEach(a=>{M(i[a])?c.push(...i[a]):c.push(i[a])})),M(c)?c.forEach(a=>a.__filepath__=t):c.__filepath__=t,this.moduleCache.set(t,c),this.updateModuleDeps(t,s)}catch(i){console.error(i)}}async loadFromCode(t,r,n){if(n){let s=`${t}.timestamp-${Date.now()}`,i=`${s}.mjs`,c=`${(0,Ye.pathToFileURL)(s)}.mjs`;await ce.default.promises.writeFile(i,r,"utf8");try{return await import(c)}finally{try{ce.default.unlinkSync(i)}catch{}}}else{t=ye.default.resolve(this.cwd,t);let s=ye.default.extname(t),i=ce.default.realpathSync(t),c=s in H.extensions?s:".js",a=H.extensions[c];H.extensions[c]=(k,x)=>{x===i?k._compile(r,x):a(k,x)},delete H.cache[H.resolve(t)];let p=H(t);return H.extensions[c]=a,p.__esModule?p:{default:p}}}async transformWithEsbuild(t,r){var n;try{let s=await(0,Ze.build)({entryPoints:[t],outfile:"out.js",write:!1,target:["node14.18","node16"],platform:"node",bundle:!0,metafile:!0,format:r?"esm":"cjs",define:this.options.define,plugins:[ne(this.options.alias),te,re,oe]});return{code:s.outputFiles[0].text,deps:((n=s.metafile)==null?void 0:n.inputs)||{}}}catch(s){console.error(s)}return{code:"",deps:{}}}};var ot=f(require("cookies"),1),ve=require("path-to-regexp"),rt=f(require("picocolors"),1),nt=require("ws");function Me(e,o,t,r){var I;let n=new Map,s=new Map,i=new WeakMap,c=l=>{let u=s.get(l);return!u&&s.set(l,u=new Map),u},a=(l,u)=>{let m=l.get(u);return!m&&l.set(u,m=new nt.WebSocketServer({noServer:!0})),m},p=(l,u)=>{let m=n.get(l);!m&&n.set(l,m=new Set),m.add(u)},k=(l,u,m,d,g,y)=>{var h;try{(h=m.setup)==null||h.call(m,u,d),u.on("close",()=>l.delete(g))}catch(C){j.error(`${rt.default.red("[websocket server error]")} ${y}
|
|
51
|
+
`,C)}},x=(l,u,m,d)=>{l.emit("connection",u,m),u.on("close",()=>{let g=d.findIndex(y=>y.ws===u);g!==-1&&d.splice(g,1)})},O=(l,u,m,d,g)=>{let{cleanupList:y,connectionList:h,context:C}=i.get(u);tt(y),h.forEach(({ws:W})=>W.removeAllListeners()),u.removeAllListeners(),k(l,u,m,C,d,g),h.forEach(({ws:W,req:$})=>x(u,W,$,h))};(I=e.on)==null||I.call(e,"mock:update-end",l=>{if(!n.has(l))return;let u=n.get(l);if(u)for(let m of u.values())for(let d of e.mockData[m]){if(!d.ws||d.__filepath__!==l)return;let g=c(m);for(let[y,h]of g.entries())O(g,h,d,y,l)}}),o==null||o.on("upgrade",(l,u,m)=>{let{pathname:d,query:g}=P(l.url);if(!d||t.length===0||!t.some(w=>A(w,l.url)))return;let y=e.mockData,h=Object.keys(y).find(w=>(0,ve.pathToRegexp)(w).test(d));if(!h)return;let C=y[h].find(w=>w.url&&w.ws&&(0,ve.pathToRegexp)(w.url).test(d));if(!C)return;let W=C.__filepath__;p(W,h);let $=c(h),T=a($,d),F=i.get(T);if(!F){let w=[],we={onCleanup:at=>w.push(at)};F={cleanupList:w,context:we,connectionList:[]},i.set(T,F),k($,T,C,we,d,W)}let v=l,B=new ot.default(l,l,r),{query:ct}=P(l.headers.referer||"");v.query=g,v.refererQuery=ct,v.params=q(h,d),v.getCookie=B.get.bind(B),T.handleUpgrade(v,u,m,w=>{E(`websocket-mock: ${l.url} connected`),F.connectionList.push({req:v,ws:w}),x(T,w,v,F.connectionList)})}),o==null||o.on("close",()=>{for(let l of s.values()){for(let u of l.values()){let m=i.get(u);tt(m.cleanupList),u.close()}l.clear()}s.clear(),n.clear()})}function tt(e){let o;for(;o=e.shift();)o==null||o()}function be(e,o,t,r){let n=new ae({include:S(o.include),exclude:S(o.exclude),define:ee(e),alias:e.resolve.alias});n.load(),n.on("mock:update-end",()=>{o.reload&&(r==null||r.send({type:"full-reload"}))}),t==null||t.on("close",()=>n.close());let{httpProxies:s}=Y(e.server.proxy||{}),c=[...S(o.prefix),...s];Me(n,t,S(o.wsPrefix),o.cookiesOptions);let a=[];return a.push(Lt(n,c,e,o),ke(n,{formidableOptions:o.formidableOptions,proxies:c,cookiesOptions:o.cookiesOptions})),a.filter(Boolean)}function Lt(e,o,t,r){let n={},s=r.cors!==!1||t.server.cors!==!1;return t.server.cors!==!1&&(n={...n,...typeof t.server.cors=="boolean"?{}:t.server.cors}),r.cors!==!1&&(n={...n,...typeof r.cors=="boolean"?{}:r.cors}),s?function(i,c,a){let{pathname:p}=P(i.url);if(!p||o.length===0||!o.some(O=>A(O,i.url)))return a();let k=e.mockData;if(!Object.keys(k).find(O=>(0,it.pathToRegexp)(O).test(p)))return a();(0,st.default)(n)(i,c,a)}:void 0}function xe({prefix:e=[],wsPrefix:o=[],include:t=["mock/**/*.mock.{js,ts,cjs,mjs,json,json5}"],exclude:r=["**/node_modules/**","**/.vscode/**","**/.git/**"],reload:n=!1,cors:s=!0,formidableOptions:i={},build:c=!1,cookiesOptions:a={}}={}){let p={prefix:e,wsPrefix:o,include:t,exclude:r,reload:n,cors:s,cookiesOptions:a,formidableOptions:{multiples:!0,...i},build:c?Object.assign({serverPort:8080,dist:"mockServer"},typeof c=="object"?c:{}):!1},k=[$t(p)];return p.build&&k.push(It(p)),k}function It(e){let o={};return{name:"vite-plugin-mock-dev-server-generator",enforce:"post",apply:"build",configResolved(t){o=t,t.logger.warn("")},async buildEnd(t){t||o.command==="build"&&await He(this,o,e)}}}function $t(e){let o={};return{name:"vite-plugin-mock-dev-server",enforce:"pre",apply:"serve",config(t){var s;let r=S(e.wsPrefix);if(r.length===0||!((s=t.server)!=null&&s.proxy)||Object.keys(t.server.proxy).length===0)return;let n={};Object.keys(t.server.proxy).forEach(i=>{r.includes(i)||(n[i]=t.server.proxy[i])}),t.server.proxy=n},configResolved(t){o=t,t.logger.warn("")},configureServer({middlewares:t,config:r,httpServer:n,ws:s}){be(r,e,n,s).forEach(c=>t.use(c))},configurePreviewServer({middlewares:t,httpServer:r}){be(o,e,r).forEach(s=>t.use(s))}}}function Tt(e){return e}function Ft(e){return t=>(M(t)?t=t.map(r=>e(r)||r):t=e(t)||t,t)}var Nt=xe;0&&(module.exports={baseMiddleware,createDefineMock,defineMock,mockDevServerPlugin,mockWebSocket,transformMockData});
|
package/dist/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { Buffer } from 'node:buffer';
|
|
|
3
3
|
import http from 'node:http';
|
|
4
4
|
import { Readable } from 'node:stream';
|
|
5
5
|
import Cookies from 'cookies';
|
|
6
|
+
import { CorsOptions } from 'cors';
|
|
6
7
|
import formidable from 'formidable';
|
|
7
8
|
import { WebSocketServer } from 'ws';
|
|
8
9
|
import EventEmitter from 'node:events';
|
|
@@ -64,6 +65,14 @@ interface MockServerPluginOptions {
|
|
|
64
65
|
* @default false
|
|
65
66
|
*/
|
|
66
67
|
reload?: boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Configure to `cors`
|
|
70
|
+
*
|
|
71
|
+
* 配置 `cors`
|
|
72
|
+
* @default true
|
|
73
|
+
* @see [cors](https://github.com/expressjs/cors#configuration-options)
|
|
74
|
+
*/
|
|
75
|
+
cors?: boolean | CorsOptions;
|
|
67
76
|
/**
|
|
68
77
|
* formidable options
|
|
69
78
|
* @see [formidable](https://github.com/node-formidable/formidable#options)
|
|
@@ -421,7 +430,7 @@ interface WebSocketSetupContext {
|
|
|
421
430
|
type MockOptions = (MockHttpItem | MockWebsocketItem)[];
|
|
422
431
|
type FormidableFile = formidable.File | formidable.File[];
|
|
423
432
|
|
|
424
|
-
declare function mockDevServerPlugin({ prefix, wsPrefix, include, exclude, reload, formidableOptions, build, cookiesOptions, }?: MockServerPluginOptions): Plugin[];
|
|
433
|
+
declare function mockDevServerPlugin({ prefix, wsPrefix, include, exclude, reload, cors, formidableOptions, build, cookiesOptions, }?: MockServerPluginOptions): Plugin[];
|
|
425
434
|
|
|
426
435
|
/**
|
|
427
436
|
* mock config Type helper
|
|
@@ -453,8 +462,8 @@ declare function mockDevServerPlugin({ prefix, wsPrefix, include, exclude, reloa
|
|
|
453
462
|
* ```
|
|
454
463
|
*/
|
|
455
464
|
declare function defineMock(config: MockHttpItem): MockHttpItem;
|
|
456
|
-
declare function defineMock(config: MockOptions): MockOptions;
|
|
457
465
|
declare function defineMock(config: MockWebsocketItem): MockWebsocketItem;
|
|
466
|
+
declare function defineMock(config: MockOptions): MockOptions;
|
|
458
467
|
/**
|
|
459
468
|
* Return a custom defineMock function to support preprocessing of mock config.
|
|
460
469
|
*
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import qe from"node:fs";import Z from"node:fs/promises";import U from"node:path";import{build as ze}from"esbuild";import Ge from"fast-glob";import Qe from"is-core-module";import{createFilter as Ve,normalizePath as Ke}from"vite";var ue="vite-plugin-mock-dev-server",me="1.2.1";import ne from"picocolors";import te from"node:fs";import oe from"node:path";import{parse as Ie}from"node:querystring";import{URL as $e,fileURLToPath as Te}from"node:url";import Fe from"debug";import{match as Ne}from"path-to-regexp";import de from"picocolors";var v=t=>Array.isArray(t),W=t=>typeof t=="function",N=t=>Object.prototype.toString.call(t)==="[object Object]",re=t=>N(t)&&Object.keys(t).length===0,He=t=>t!==null&&typeof t=="object"&&typeof t.pipe=="function",fe=t=>He(t)&&t.readable!==!1&&typeof t._read=="function"&&typeof t._readableState=="object";function ke(t){return new Promise(o=>setTimeout(o,t))}function ge(t){return oe.dirname(Te(t))}var D=Fe("vite:plugin-mock-dev-server"),S=t=>v(t)?t:t==null?[]:[t],P={info(...t){console.info(de.cyan("mock-dev-server: "),...t)},error(...t){console.error(`
|
|
2
2
|
`,de.cyan("mock-dev-server: "),...t,`
|
|
3
|
-
`)}};function
|
|
3
|
+
`)}};function B(t,o,e){for(let n of o){let s=oe.join(t,n);if(te.existsSync(s)&&te.statSync(s).isFile()){let i=e!=null&&e.pathOnly?s:te.readFileSync(s,"utf-8");if(!(e!=null&&e.predicate)||e.predicate(i))return i}}let r=oe.dirname(t);if(r!==t&&(!(e!=null&&e.rootDir)||r.startsWith(e==null?void 0:e.rootDir)))return B(r,o,e)}var G=(t={})=>{let o=[],e=[];return Object.keys(t).forEach(r=>{var s,i;let n=t[r];typeof n=="string"||!n.ws&&!((s=n.target)!=null&&s.toString().startsWith("ws:"))&&!((i=n.target)!=null&&i.toString().startsWith("wss:"))?o.push(r):e.push(r)}),{httpProxies:o,wsProxies:e}};function H(t,o){return t[0]==="^"&&new RegExp(t).test(o)||o.startsWith(t)}function J(t,o){return(Ne(t,{decode:decodeURIComponent})(o)||{params:{}}).params||{}}function j(t){let o=new $e(t,"http://example.com"),e=decodeURIComponent(o.pathname),r=Ie(o.search.replace(/^\?/,""));return{pathname:e,query:r}}var Ue=/import\.meta\.env\.(.+)/;function Q(t){let o={},e=process.env.NODE_ENV||t.mode;Object.assign(o,{"process.env.NODE_ENV":JSON.stringify(e),"global.process.env.NODE_ENV":JSON.stringify(e),"globalThis.process.env.NODE_ENV":JSON.stringify(e),__vite_process_env_NODE_ENV:JSON.stringify(e)});let r={},n={},s=[];for(let a in t.define){let p=t.define[a];if(typeof p=="string")try{JSON.parse(p),r[a]=p}catch{s.push(a)}else r[a]=JSON.stringify(p);let f=a.match(Ue);f&&r[a]&&(n[f[1]]=`__vite__define__${r[a]}`)}s.length&&P.error(`${ne.yellow("[warn]")} The following keys: ${ne.yellow(ne.underline(s.join(", ")))} declared in 'define' cannot be parsed as regular code snippets.`);let i={},c={};i["import.meta.hot"]="undefined";for(let a in t.env)i[`import.meta.env.${a}`]=JSON.stringify(t.env[a]);return Object.assign(c,{"import.meta.env":JSON.stringify({...t.env,...n}).replace(/"__vite__define__(.+?)"([,}])/g,(a,p,f)=>`${p.replace(/(^\\")|(\\"$)/g,'"')}${f}`)}),{...i,...r,...c,...o}}import ye from"node:fs/promises";import Ae from"node:path";import Be from"json5";var V={name:"externalize-deps",setup(t){t.onResolve({filter:/.*/},({path:o})=>{if(o[0]!=="."&&!Ae.isAbsolute(o))return{external:!0}})}},K={name:"json5-loader",setup(t){t.onLoad({filter:/\.json5$/},async({path:o})=>{let e=await ye.readFile(o,"utf-8");return{contents:`export default ${JSON.stringify(Be.parse(e))}`,loader:"js"}})}},X={name:"json-loader",setup(t){t.onLoad({filter:/\.json$/},async({path:o})=>({contents:`export default ${await ye.readFile(o,"utf-8")}`,loader:"js"}))}},Y=t=>({name:"alias-plugin",setup(o){o.onResolve({filter:/.*/},async({path:e})=>{let r=t.find(({find:c})=>Je(c,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 Je(t,o){return t instanceof RegExp?t.test(o):o.length<t.length?!1:o===t?!0:o.startsWith(`${t}/`)}async function he(t,o,e){let r=S(e.include),n=S(e.exclude),s=Q(o),{httpProxies:i}=G(o.server.proxy||{});i.push(...S(e.prefix));let c=S(e.wsPrefix),a={};try{let m=B(o.root,["package.json"]);m&&(a=JSON.parse(m))}catch{}let p=e.build.dist,f=await et(process.cwd(),r,n),M=U.join(o.root,`mock-data-${Date.now()}.js`);await Z.writeFile(M,f,"utf-8");let{code:O,deps:L}=await tt(M,s,o.resolve.alias),l=Xe(L);await Z.unlink(M);let u=[{filename:U.join(p,"mock-data.js"),source:O},{filename:U.join(p,"index.js"),source:Ze(i,c,e.cookiesOptions,e.build.serverPort)},{filename:U.join(p,"package.json"),source:Ye(a,l)}];try{if(U.isAbsolute(p)){await Z.rm(p,{recursive:!0}),qe.mkdirSync(p,{recursive:!0});for(let{filename:m,source:d}of u)await Z.writeFile(m,d,"utf-8")}else for(let{filename:m,source:d}of u)t.emitFile({type:"asset",fileName:m,source:d})}catch{}}function Xe(t){let o=new Set,e=[ue,"connect","cors"];return Object.keys(t).forEach(r=>{t[r].imports.filter(s=>s.external&&!s.path.startsWith("<define:")).map(s=>s.path).forEach(s=>{!e.includes(s)&&!Qe(s)&&o.add(s)})}),Array.from(o)}function Ye(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 Ze(t,o,e={},r=8080){return`import { createServer } from 'node:http';
|
|
4
4
|
import connect from 'connect';
|
|
5
5
|
import corsMiddleware from 'cors';
|
|
6
6
|
import { baseMiddleware, mockWebSocket } from 'vite-plugin-mock-dev-server';
|
|
@@ -24,8 +24,8 @@ app.use(baseMiddleware({ mockData }, {
|
|
|
24
24
|
server.listen(${r});
|
|
25
25
|
|
|
26
26
|
console.log('listen: http://localhost:${r}');
|
|
27
|
-
`}async function et(t,o,e){let r=await Ge(o,{cwd:t}),n=Ve(o,e,{resolve:!1}),s=r.filter(n),i="",c="";return s.forEach((a,
|
|
28
|
-
`,c+=`m${
|
|
27
|
+
`}async function et(t,o,e){let r=await Ge(o,{cwd:t}),n=Ve(o,e,{resolve:!1}),s=r.filter(n),i="",c="";return s.forEach((a,p)=>{let f=Ke(U.join(t,a));i+=`import * as m${p} from '${f}';
|
|
28
|
+
`,c+=`m${p}, `}),`import { transformMockData } from 'vite-plugin-mock-dev-server';
|
|
29
29
|
${i}
|
|
30
30
|
const exporters = [${c}];
|
|
31
31
|
const mockList = exporters.map((raw) => {
|
|
@@ -42,10 +42,10 @@ const mockList = exporters.map((raw) => {
|
|
|
42
42
|
}
|
|
43
43
|
return mockConfig
|
|
44
44
|
});
|
|
45
|
-
export default transformMockData(mockList);`}async function tt(t,o,e){var r;try{let n=await ze({entryPoints:[t],outfile:"out.js",write:!1,target:["node14.18","node16"],platform:"node",bundle:!0,metafile:!0,format:"esm",define:o,plugins:[Y(e),V,K,X]});return{code:n.outputFiles[0].text,deps:((r=n.metafile)==null?void 0:r.inputs)||{}}}catch(n){console.error(n)}return{code:"",deps:{}}}import{Buffer as xe}from"buffer";import nt from"cookies";import st from"http-status";import it from"lodash.sortby";import*as
|
|
46
|
-
`,`file: ${
|
|
47
|
-
`,`file: ${
|
|
48
|
-
`,`file: ${
|
|
49
|
-
`,c)}}async function lt(t,o,{cookies:e}){if(e)try{let r=
|
|
50
|
-
`,r)}}function ut(t,o,e){if(fe(o))o.pipe(t);else if(xe.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"?xe.from(r):r)}}async function we(t,o){if(!o||typeof o=="number"&&o<=0||v(o)&&o.length!==2)return;let e=0;if(v(o)){let[r,n]=o;e=Math.floor(Math.random()*(n-r+1))+r}else e=o-(Date.now()-t);e>0&&await ke(e)}function mt(t){return st[t]||"Unknown"}import kt from"events";import ce from"fs";import{createRequire as gt}from"module";import
|
|
51
|
-
`,
|
|
45
|
+
export default transformMockData(mockList);`}async function tt(t,o,e){var r;try{let n=await ze({entryPoints:[t],outfile:"out.js",write:!1,target:["node14.18","node16"],platform:"node",bundle:!0,metafile:!0,format:"esm",define:o,plugins:[Y(e),V,K,X]});return{code:n.outputFiles[0].text,deps:((r=n.metafile)==null?void 0:r.inputs)||{}}}catch(n){console.error(n)}return{code:"",deps:{}}}import Ot from"cors";import{pathToRegexp as Ct}from"path-to-regexp";import{Buffer as xe}from"node:buffer";import nt from"cookies";import st from"http-status";import it from"lodash.sortby";import*as q from"mime-types";import{pathToRegexp as Se}from"path-to-regexp";import _ from"picocolors";import se from"co-body";import ot from"formidable";async function ve(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 se.json(t);if(r.startsWith("application/x-www-form-urlencoded"))return await se.form(t);if(r.startsWith("text/plain"))return await se.text(t);if(r.startsWith("multipart/form-data"))return await rt(t,o)}catch(s){console.error(s)}}async function rt(t,o){let e=ot(o);return new Promise((r,n)=>{e.parse(t,(s,i,c)=>{if(s){n(s);return}r({...i,...c})})})}function Me(t,o){return E(t.headers,o.headers)&&E(t.body,o.body)&&E(t.params,o.params)&&E(t.query,o.query)&&E(t.refererQuery,o.refererQuery)}function E(t,o){if(!o)return!0;for(let e in o)if(!be(t[e],o[e]))return!1;return!0}function be(t,o){if(v(t)&&v(o)){let e=new Set;return o.every(r=>t.some((n,s)=>{if(e.has(s))return!1;let i=be(n,r);return i&&e.add(s),i}))}return N(t)&&N(o)?E(t,o):Object.is(t,o)}var ct=/:/g;function Oe(t,{formidableOptions:o={},proxies:e,cookiesOptions:r}){return async function(n,s,i){let c=Date.now(),{query:a,pathname:p}=j(n.url);if(!p||e.length===0||!e.some(h=>H(h,n.url)))return i();let f=t.mockData,M=it(Object.keys(f),h=>{var A;return((A=h.match(ct))==null?void 0:A.length)||0}).find(h=>Se(h).test(p));if(!M)return i();let{query:O}=j(n.headers.referer||""),L=await ve(n,o),l=new nt(n,s,r),u=l.get.bind(l),m=n.method.toUpperCase(),d=at(f[M],{pathname:p,method:m,request:{query:a,refererQuery:O,body:L,headers:n.headers,getCookie:u}});if(!d)return i();D("middleware: ",m,n.url);let k=n,g=s;k.body=L,k.query=a,k.refererQuery=O,k.params=J(d.url,p),k.getCookie=u,g.setCookie=l.set.bind(l);let{body:y,delay:C,type:R="json",response:I,status:$=200,statusText:T}=d;if(ie(g,$,T),await pt(k,g,d),await lt(k,g,d),y){try{let h=W(y)?await y(k):y;await we(c,C),ut(g,h,R)}catch(h){P.error(`${_.red("[body error]")} ${n.url}
|
|
46
|
+
`,`file: ${_.cyan(d.__filepath__)}`,h),ie(g,500),s.end("")}return}if(I){try{await we(c,C),await I(k,g,i)}catch(h){P.error(`${_.red("[response error]")} ${n.url}
|
|
47
|
+
`,`file: ${_.cyan(d.__filepath__)}`,h),ie(g,500),s.end("")}return}s.end("")}}function at(t,{pathname:o,method:e,request:r}){return t.find(n=>{if(!o||!n||!n.url||n.ws===!0||!(n.method?v(n.method)?n.method:[n.method]:["GET","POST"]).includes(e))return!1;let i=Se(n.url).test(o);if(i&&n.validator){let c=J(n.url,o);if(W(n.validator))return n.validator({params:c,...r});try{return Me({params:c,...r},n.validator)}catch(a){return P.error(`${_.red("[validator error]")} ${o}
|
|
48
|
+
`,`file: ${_.cyan(n.__filepath__)}`,a),!1}}return i})}function ie(t,o=200,e){t.statusCode=o,t.statusMessage=e||mt(o)}async function pt(t,o,e){let{headers:r,type:n="json"}=e,s=e.__filepath__,i=q.contentType(n)||q.contentType(q.lookup(n)||"");if(i&&o.setHeader("Content-Type",i),o.setHeader("Cache-Control","no-cache,max-age=0"),o.setHeader("X-Mock-Power-By","vite-plugin-mock-dev-server"),o.setHeader("X-File-Path",s),!!r)try{let c=W(r)?await r(t):r;Object.keys(c).forEach(a=>{o.setHeader(a,c[a])})}catch(c){P.error(`${_.red("[headers error]")} ${t.url}
|
|
49
|
+
`,c)}}async function lt(t,o,{cookies:e}){if(e)try{let r=W(e)?await e(t):e;Object.keys(r).forEach(n=>{let s=r[n];if(v(s)){let[i,c]=s;o.setCookie(n,i,c)}else o.setCookie(n,s)})}catch(r){P.error(`${_.red("[cookies error]")} ${t.url}
|
|
50
|
+
`,r)}}function ut(t,o,e){if(fe(o))o.pipe(t);else if(xe.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"?xe.from(r):r)}}async function we(t,o){if(!o||typeof o=="number"&&o<=0||v(o)&&o.length!==2)return;let e=0;if(v(o)){let[r,n]=o;e=Math.floor(Math.random()*(n-r+1))+r}else e=o-(Date.now()-t);e>0&&await ke(e)}function mt(t){return st[t]||"Unknown"}import kt from"node:events";import ce from"node:fs";import{createRequire as gt}from"node:module";import Pe from"node:path";import{pathToFileURL as yt}from"node:url";import je from"chokidar";import{build as ht}from"esbuild";import vt from"fast-glob";import{createFilter as Mt,normalizePath as z}from"vite";import dt from"lodash.sortby";function Ce(t){let o=[];for(let[,r]of t.entries())r&&(v(r)?o.push(...r):o.push(r));let e={};return o.filter(r=>N(r)&&r.enabled!==!1&&r.url).forEach(r=>{let{pathname:n,query:s}=j(r.url),i=e[n]??=[],c={...r,url:n};if(c.ws!==!0){let a=c.validator;re(s)||(W(a)?c.validator=function(p){return E(p.query,s)&&a(p)}:a?(c.validator={...a},c.validator.query=c.validator.query?{...s,...c.validator.query}:s):c.validator={query:s})}i.push(c)}),Object.keys(e).forEach(r=>{e[r]=dt(e[r],n=>{if(n.ws===!0)return 0;let{validator:s}=n;return!s||re(s)?2:W(s)?0:1/Object.keys(s).reduce((c,a)=>c+ft(s[a]),0)})}),e}function ft(t){return t?Object.keys(t).length:0}var bt=ge(import.meta.url),F=gt(bt),ee=class extends kt{constructor(e){super();this.options=e;this.cwd=e.cwd||process.cwd();try{let r=B(this.cwd,["package.json"]);this.moduleType=r&&JSON.parse(r).type==="module"?"esm":"cjs"}catch{}}moduleCache=new Map;moduleDeps=new Map;cwd;mockWatcher;depsWatcher;moduleType="cjs";_mockData={};get mockData(){return this._mockData}load(){let{include:e,exclude:r}=this.options,n=Mt(e,r,{resolve:!1});vt(e,{cwd:this.cwd}).then(i=>Promise.all(i.filter(n).map(c=>this.loadMock(c)))).then(()=>this.updateMockList()),this.watchMockEntry(),this.watchDeps();let s=null;this.on("mock:update",async i=>{n(i)&&(await this.loadMock(i),s&&clearImmediate(s),s=setImmediate(()=>{this.updateMockList(),this.emit("mock:update-end",i),s=null}))}),this.on("mock:unlink",async i=>{n(i)&&(this.moduleCache.delete(i),this.updateMockList(),this.emit("mock:update-end",i))})}watchMockEntry(){let{include:e}=this.options,[r,...n]=e,s=je.watch(r,{ignoreInitial:!0,cwd:this.cwd});n.length>0&&n.forEach(i=>s.add(i)),s.on("add",async i=>{i=z(i),this.emit("mock:update",i),D("watcher:add",i)}),s.on("change",async i=>{i=z(i),this.emit("mock:update",i),D("watcher:change",i)}),s.on("unlink",async i=>{i=z(i),this.emit("mock:unlink",i),D("watcher:unlink",i)}),this.mockWatcher=s}watchDeps(){let e=[];this.depsWatcher=je.watch([],{ignoreInitial:!0,cwd:this.cwd}),this.depsWatcher.on("change",r=>{r=z(r);let n=this.moduleDeps.get(r);n&&n.forEach(s=>{this.emit("mock:update",s)})}),this.depsWatcher.on("unlink",r=>{r=z(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=Ce(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){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)||{},c;i.default?c=i.default:(c=[],Object.keys(i).forEach(a=>{v(i[a])?c.push(...i[a]):c.push(i[a])})),v(c)?c.forEach(a=>a.__filepath__=e):c.__filepath__=e,this.moduleCache.set(e,c),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`,c=`${yt(s)}.mjs`;await ce.promises.writeFile(i,r,"utf8");try{return await import(c)}finally{try{ce.unlinkSync(i)}catch{}}}else{e=Pe.resolve(this.cwd,e);let s=Pe.extname(e),i=ce.realpathSync(e),c=s in F.extensions?s:".js",a=F.extensions[c];F.extensions[c]=(f,M)=>{M===i?f._compile(r,M):a(f,M)},delete F.cache[F.resolve(e)];let p=F(e);return F.extensions[c]=a,p.__esModule?p:{default:p}}}async transformWithEsbuild(e,r){var n;try{let s=await ht({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:[Y(this.options.alias),V,X,K]});return{code:s.outputFiles[0].text,deps:((n=s.metafile)==null?void 0:n.inputs)||{}}}catch(s){console.error(s)}return{code:"",deps:{}}}};import xt from"cookies";import{pathToRegexp as Re}from"path-to-regexp";import wt from"picocolors";import{WebSocketServer as St}from"ws";function De(t,o,e,r){var L;let n=new Map,s=new Map,i=new WeakMap,c=l=>{let u=s.get(l);return!u&&s.set(l,u=new Map),u},a=(l,u)=>{let m=l.get(u);return!m&&l.set(u,m=new St({noServer:!0})),m},p=(l,u)=>{let m=n.get(l);!m&&n.set(l,m=new Set),m.add(u)},f=(l,u,m,d,k,g)=>{var y;try{(y=m.setup)==null||y.call(m,u,d),u.on("close",()=>l.delete(k))}catch(C){P.error(`${wt.red("[websocket server error]")} ${g}
|
|
51
|
+
`,C)}},M=(l,u,m,d)=>{l.emit("connection",u,m),u.on("close",()=>{let k=d.findIndex(g=>g.ws===u);k!==-1&&d.splice(k,1)})},O=(l,u,m,d,k)=>{let{cleanupList:g,connectionList:y,context:C}=i.get(u);We(g),y.forEach(({ws:R})=>R.removeAllListeners()),u.removeAllListeners(),f(l,u,m,C,d,k),y.forEach(({ws:R,req:I})=>M(u,R,I,y))};(L=t.on)==null||L.call(t,"mock:update-end",l=>{if(!n.has(l))return;let u=n.get(l);if(u)for(let m of u.values())for(let d of t.mockData[m]){if(!d.ws||d.__filepath__!==l)return;let k=c(m);for(let[g,y]of k.entries())O(k,y,d,g,l)}}),o==null||o.on("upgrade",(l,u,m)=>{let{pathname:d,query:k}=j(l.url);if(!d||e.length===0||!e.some(b=>H(b,l.url)))return;let g=t.mockData,y=Object.keys(g).find(b=>Re(b).test(d));if(!y)return;let C=g[y].find(b=>b.url&&b.ws&&Re(b.url).test(d));if(!C)return;let R=C.__filepath__;p(R,y);let I=c(y),$=a(I,d),T=i.get($);if(!T){let b=[],pe={onCleanup:Le=>b.push(Le)};T={cleanupList:b,context:pe,connectionList:[]},i.set($,T),f(I,$,C,pe,d,R)}let h=l,A=new xt(l,l,r),{query:_e}=j(l.headers.referer||"");h.query=k,h.refererQuery=_e,h.params=J(y,d),h.getCookie=A.get.bind(A),$.handleUpgrade(h,u,m,b=>{D(`websocket-mock: ${l.url} connected`),T.connectionList.push({req:h,ws:b}),M($,b,h,T.connectionList)})}),o==null||o.on("close",()=>{for(let l of s.values()){for(let u of l.values()){let m=i.get(u);We(m.cleanupList),u.close()}l.clear()}s.clear(),n.clear()})}function We(t){let o;for(;o=t.shift();)o==null||o()}function ae(t,o,e,r){let n=new ee({include:S(o.include),exclude:S(o.exclude),define:Q(t),alias:t.resolve.alias});n.load(),n.on("mock:update-end",()=>{o.reload&&(r==null||r.send({type:"full-reload"}))}),e==null||e.on("close",()=>n.close());let{httpProxies:s}=G(t.server.proxy||{}),c=[...S(o.prefix),...s];De(n,e,S(o.wsPrefix),o.cookiesOptions);let a=[];return a.push(Pt(n,c,t,o),Oe(n,{formidableOptions:o.formidableOptions,proxies:c,cookiesOptions:o.cookiesOptions})),a.filter(Boolean)}function Pt(t,o,e,r){let n={},s=r.cors!==!1||e.server.cors!==!1;return e.server.cors!==!1&&(n={...n,...typeof e.server.cors=="boolean"?{}:e.server.cors}),r.cors!==!1&&(n={...n,...typeof r.cors=="boolean"?{}:r.cors}),s?function(i,c,a){let{pathname:p}=j(i.url);if(!p||o.length===0||!o.some(O=>H(O,i.url)))return a();let f=t.mockData;if(!Object.keys(f).find(O=>Ct(O).test(p)))return a();Ot(n)(i,c,a)}:void 0}function Ee({prefix:t=[],wsPrefix:o=[],include:e=["mock/**/*.mock.{js,ts,cjs,mjs,json,json5}"],exclude:r=["**/node_modules/**","**/.vscode/**","**/.git/**"],reload:n=!1,cors:s=!0,formidableOptions:i={},build:c=!1,cookiesOptions:a={}}={}){let p={prefix:t,wsPrefix:o,include:e,exclude:r,reload:n,cors:s,cookiesOptions:a,formidableOptions:{multiples:!0,...i},build:c?Object.assign({serverPort:8080,dist:"mockServer"},typeof c=="object"?c:{}):!1},f=[Rt(p)];return p.build&&f.push(jt(p)),f}function jt(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 he(this,o,t)}}}function Rt(t){let o={};return{name:"vite-plugin-mock-dev-server",enforce:"pre",apply:"serve",config(e){var s;let r=S(t.wsPrefix);if(r.length===0||!((s=e.server)!=null&&s.proxy)||Object.keys(e.server.proxy).length===0)return;let n={};Object.keys(e.server.proxy).forEach(i=>{r.includes(i)||(n[i]=e.server.proxy[i])}),e.server.proxy=n},configResolved(e){o=e,e.logger.warn("")},configureServer({middlewares:e,config:r,httpServer:n,ws:s}){ae(r,t,n,s).forEach(c=>e.use(c))},configurePreviewServer({middlewares:e,httpServer:r}){ae(o,t,r).forEach(s=>e.use(s))}}}function fr(t){return t}function kr(t){return e=>(v(e)?e=e.map(r=>t(r)||r):e=t(e)||e,e)}var vr=Ee;export{Oe as baseMiddleware,kr as createDefineMock,vr as default,fr as defineMock,Ee as mockDevServerPlugin,De as mockWebSocket,Ce as transformMockData};
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vite-plugin-mock-dev-server",
|
|
3
|
-
"version": "1.1
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"keywords": [
|
|
5
5
|
"vite",
|
|
6
6
|
"plugin",
|
|
7
7
|
"vite-plugin",
|
|
8
8
|
"mock",
|
|
9
|
-
"mock-server"
|
|
9
|
+
"mock-server",
|
|
10
|
+
"development"
|
|
10
11
|
],
|
|
11
12
|
"homepage": "https://vite-plugin-mock-dev-server.netlify.app",
|
|
12
13
|
"repository": {
|
|
@@ -35,8 +36,9 @@
|
|
|
35
36
|
"chokidar": "^3.5.3",
|
|
36
37
|
"co-body": "^6.1.0",
|
|
37
38
|
"cookies": "^0.8.0",
|
|
39
|
+
"cors": "^2.8.5",
|
|
38
40
|
"debug": "^4.3.4",
|
|
39
|
-
"esbuild": "^0.
|
|
41
|
+
"esbuild": "^0.18.4",
|
|
40
42
|
"fast-glob": "^3.2.12",
|
|
41
43
|
"formidable": "^2.1.1",
|
|
42
44
|
"http-status": "^1.6.2",
|
|
@@ -49,31 +51,32 @@
|
|
|
49
51
|
"ws": "^8.13.0"
|
|
50
52
|
},
|
|
51
53
|
"devDependencies": {
|
|
52
|
-
"@pengzhanbo/eslint-config": "^0.3.
|
|
53
|
-
"@pengzhanbo/prettier-config": "^0.3.
|
|
54
|
+
"@pengzhanbo/eslint-config": "^0.3.14",
|
|
55
|
+
"@pengzhanbo/prettier-config": "^0.3.14",
|
|
54
56
|
"@types/co-body": "^6.1.0",
|
|
55
57
|
"@types/cookies": "^0.7.7",
|
|
56
|
-
"@types/
|
|
58
|
+
"@types/cors": "^2.8.13",
|
|
59
|
+
"@types/debug": "^4.1.8",
|
|
57
60
|
"@types/formidable": "^2.0.6",
|
|
58
61
|
"@types/is-core-module": "^2.2.0",
|
|
59
62
|
"@types/lodash.sortby": "^4.7.7",
|
|
60
63
|
"@types/mime-types": "^2.1.1",
|
|
61
|
-
"@types/node": "^18.16.
|
|
62
|
-
"@types/ws": "^8.5.
|
|
63
|
-
"bumpp": "^9.1.
|
|
64
|
-
"conventional-changelog-cli": "^
|
|
65
|
-
"eslint": "^8.
|
|
64
|
+
"@types/node": "^18.16.18",
|
|
65
|
+
"@types/ws": "^8.5.5",
|
|
66
|
+
"bumpp": "^9.1.1",
|
|
67
|
+
"conventional-changelog-cli": "^3.0.0",
|
|
68
|
+
"eslint": "^8.43.0",
|
|
66
69
|
"mockjs": "^1.1.0",
|
|
67
70
|
"prettier": "^2.8.8",
|
|
68
|
-
"tsup": "^
|
|
69
|
-
"typescript": "^5.
|
|
70
|
-
"vite": "^4.3.
|
|
71
|
-
"vitepress": "1.0.0-
|
|
71
|
+
"tsup": "^7.0.0",
|
|
72
|
+
"typescript": "^5.1.3",
|
|
73
|
+
"vite": "^4.3.9",
|
|
74
|
+
"vitepress": "1.0.0-beta.2"
|
|
72
75
|
},
|
|
73
76
|
"peerDependencies": {
|
|
74
77
|
"vite": ">=3.0.0"
|
|
75
78
|
},
|
|
76
|
-
"packageManager": "pnpm@8.
|
|
79
|
+
"packageManager": "pnpm@8.6.2",
|
|
77
80
|
"engines": {
|
|
78
81
|
"node": "^14.18.0 || >=16"
|
|
79
82
|
},
|