UNPKG

vite-plugin-mock-dev-server

Version:
37 lines (32 loc) 13.7 kB
import{a as e,c as t,d as n,f as r,h as i,i as a,l as o,m as s,n as c,o as l,p as u,r as d,s as f,t as p,u as m}from"./server-BEkc6AaK.mjs";import{createDefineMock as h,createSSEStream as g,defineMock as _,defineMockData as v}from"./helper.mjs";import{isArray as y,isBoolean as ee,promiseParallel as b,toArray as x,uniq as te}from"@pengzhanbo/utils";import S,{promises as C}from"node:fs";import w from"node:fs/promises";import T from"node:path";import E from"node:process";import D from"ansis";import{getPackageInfoSync as ne,loadPackageJSON as O,loadPackageJSONSync as k}from"local-pkg";import{pathToFileURL as A}from"node:url";import j from"json5";import re from"node:events";import{watch as M}from"chokidar";import{glob as N}from"tinyglobby";import ie from"is-core-module";import ae from"cors";const oe={name:`externalize-deps`,setup(e){e.onResolve({filter:/.*/},({path:e})=>{if(e[0]!==`.`&&!T.isAbsolute(e))return{external:!0}})}},P={name:`json5-loader`,setup(e){e.onLoad({filter:/\.json5$/},async({path:e})=>{let t=await w.readFile(e,`utf-8`);return{contents:`export default ${JSON.stringify(j.parse(t))}`,loader:`js`}})}},F={name:`json-loader`,setup(e){e.onLoad({filter:/\.json$/},async({path:e})=>({contents:`export default ${await w.readFile(e,`utf-8`)}`,loader:`js`}))}},I={name:`rename-plugin`,setup(e){e.onResolve({filter:/.*/},({path:e})=>e===`vite-plugin-mock-dev-server`?{path:`vite-plugin-mock-dev-server/helper`,external:!0}:null)}};function L(e){return{name:`alias-plugin`,setup(t){t.onResolve({filter:/.*/},async({path:n})=>{let r=e.find(({find:e})=>R(e,n));if(!r)return null;let{find:i,replacement:a}=r;return{path:(await t.resolve(n.replace(i,a),{kind:`import-statement`,resolveDir:a,namespace:`file`})).path,external:!1}})}}}function R(e,t){return e instanceof RegExp?e.test(t):t.length<e.length?!1:t===e?!0:t.startsWith(`${e}/`)}let z=null;async function B(){return z||=(await import(`esbuild`)).build,z}async function V(e,{isESM:t=!0,define:n,alias:r,cwd:i=E.cwd()}){let a=T.resolve(i,e),o=T.basename(e),s=T.dirname(a);try{let c=await(await B())({entryPoints:[e],outfile:`out.js`,write:!1,target:[`node18`],platform:`node`,bundle:!0,metafile:!0,format:t?`esm`:`cjs`,define:{...n,__dirname:JSON.stringify(s),__filename:JSON.stringify(o),...t?{}:{"import.meta.url":JSON.stringify(A(a))}},plugins:[L(r),I,oe,F,P],absWorkingDir:i}),l=new Set,u=c.metafile?.inputs||{};return Object.keys(u).forEach(e=>u[e].imports.forEach(e=>l.add(e.path))),{code:c.outputFiles[0].text,deps:Array.from(l)}}catch(e){console.error(e)}return{code:``,deps:[]}}async function H({filepath:e,code:t,isESM:n,cwd:r}){e=T.resolve(r,e);let i=n?`.mjs`:`.cjs`,a=`${e}.timestamp-${Date.now()}${i}`,o=A(a).toString();await C.writeFile(a,t,`utf8`);try{let e=await import(o);return e.default||e}finally{try{S.unlinkSync(a)}catch{}}}const U={name:`vite-mock:rename-plugin`,resolveId(e){if(e===`vite-plugin-mock-dev-server`)return{id:`vite-plugin-mock-dev-server/helper`,external:!0}}},W={name:`vite-mock:json5-plugin`,transform:{filter:{id:/\.json5$/},handler:e=>({code:`export default ${j.stringify(j.parse(e))}`})}};let G=null;async function K(){return G||={build:(await import(`rolldown`)).build,aliasPlugin:(await import(`rolldown/experimental`)).viteAliasPlugin},G}async function q(e,{isESM:t=!0,define:n,alias:r,cwd:i=E.cwd()}){let a=T.resolve(i,e),o=T.basename(e),s=T.dirname(a),c=e=>!!r.find(({find:t})=>R(t,e));try{let{build:l,aliasPlugin:u}=await K(),d=await l({input:e,write:!1,cwd:i,output:{format:t?`esm`:`cjs`,sourcemap:!1,file:`out.js`},platform:`node`,transform:{define:{...n,__dirname:JSON.stringify(s),__filename:JSON.stringify(o),...t?{}:{"import.meta.url":JSON.stringify(A(a))}}},external(e){if(c(e))return!1;if(e[0]!==`.`&&!T.isAbsolute(e)&&e!==`vite-plugin-mock-dev-server`)return!0},plugins:[u({entries:r}),U,W],onLog(e,t,n){t.code===`PLUGIN_TIMINGS`&&t.message.includes(`vite-mock`)||n(e,t)}});return{code:d.output[0].code,deps:d.output[0].imports}}catch(e){console.error(e)}return{code:``,deps:[]}}async function J(e,t){if(await u(`rolldown`))return q(e,t);if(await u(`esbuild`))return V(e,t);throw Error(`rolldown or esbuild not found`)}async function se(e,t){let n=!1;n=/\.m[jt]s$/.test(e)?!0:/\.c[jt]s$/.test(e)?!1:t.isESM||!1;let{code:r,deps:i}=await J(e,{...t,isESM:n});return{data:await H({filepath:e,code:r,isESM:n,cwd:t.cwd||E.cwd()})||{},deps:i}}var ce=class extends re{moduleCache=new Map;moduleDeps=new Map;cwd;mockWatcher;depsWatcher;isESM=!1;_mockData={};options;constructor(e){super(),this.options=e,this.cwd=e.cwd||E.cwd();try{this.isESM=k(this.cwd)?.type===`module`}catch{}}get mockData(){return this._mockData}run(e){let{include:t,exclude:n}=this.options,{pattern:r,ignore:a,isMatch:s}=i(t,n);if(N(r,{ignore:a,cwd:T.join(this.cwd,this.options.dir)}).then(e=>e.map(e=>()=>this.load(o(T.join(this.options.dir,e))))).then(e=>b(e,64)).then(()=>this.updateMockData()),!e)return;this.watchMockEntry(s),this.watchDeps();let c=null;this.on(`mock:update`,async e=>{s(e)&&(await this.load(e),c&&clearImmediate(c),c=setImmediate(()=>{this.updateMockData(),this.emit(`mock:update-end`,o(e)),c=null}))}),this.on(`mock:unlink`,async e=>{s(e)&&(e=o(T.join(this.options.dir,e)),this.moduleCache.delete(e),this.updateMockData(),this.emit(`mock:update-end`,e))})}close(){this.mockWatcher?.close(),this.depsWatcher?.close()}async load(t){if(t)try{let{define:n,alias:r}=this.options,{data:i,deps:a}=await se(t,{cwd:this.cwd,isESM:this.isESM,define:n,alias:r});this.moduleCache.set(t,e(i,t)),this.updateModuleDeps(t,a)}catch(e){console.error(e)}}updateMockData(){this._mockData=a(this.moduleCache)}updateModuleDeps(e,t){for(let n of t)this.moduleDeps.has(n)||this.moduleDeps.set(n,new Set),this.moduleDeps.get(n).add(e);this.emit(`update:deps`)}watchMockEntry(e){let n=this.mockWatcher=M(this.options.dir,{ignoreInitial:!0,cwd:this.cwd,ignored:(t,n)=>t.includes(`node_modules`)?!0:!!n?.isFile()&&!e(t)});n.on(`add`,async e=>{e=o(e),this.emit(`mock:update`,e),t(`watcher:add`,e)}),n.on(`change`,async e=>{e=o(e),this.emit(`mock:update`,e),t(`watcher:change`,e)}),n.on(`unlink`,async e=>{e=o(e),this.emit(`mock:unlink`,e),t(`watcher:unlink`,e)})}watchDeps(){let e=[...this.moduleDeps.keys()],t=this.depsWatcher=M([...e],{ignoreInitial:!0,cwd:this.cwd});t.on(`change`,e=>{e=o(e),this.moduleDeps.get(e)?.forEach(e=>this.emit(`mock:update`,e))}),t.on(`unlink`,e=>{e=o(e),this.moduleDeps.delete(e)}),this.on(`update:deps`,()=>{let n=[...this.moduleDeps.keys()],r=n.filter(t=>!e.includes(t));e=n,r.length>0&&t.add(r)})}};async function le(e,t,n,r){let{pattern:a,ignore:s}=i(n,r),c=await N(a,{ignore:s,cwd:T.join(e,t)}),l=``,u=[];return c.forEach((n,r)=>{let i=o(T.join(e,t,n));l+=`import * as m${r} from '${i}';\n`,u.push(`[m${r}, '${o(T.join(t,n))}']`)}),`import { processMockData, processRawData } from 'vite-plugin-mock-dev-server/server'; ${l} const exporters = [\n ${u.join(`, `)}\n]; const mockList = exporters.map(([mod, filepath]) => processRawData(mod.default || mod, filepath)); export default processMockData(mockList);`}var Y=`vite-plugin-mock-dev-server`,ue=`2.0.7`;function de(e,t){let n=new Set,r=[Y,`connect`,`cors`],i=e=>t.find(({find:t})=>R(t,e));return e.forEach(e=>{let t=fe(e);t.startsWith(`<define:`)||i(t)||ie(t)||t[0]===`/`||t.startsWith(`./`)||t.startsWith(`../`)||r.includes(t)||n.add(t)}),Array.from(n)}function fe(e){let[t,n]=e.split(`/`);return t[0]===`@`?`${t}/${n}`:t}function pe(e,t){let{dependencies:n={},devDependencies:r={}}=e,i={...n,...r},a={name:`mock-server`,type:`module`,scripts:{start:`node index.js`},dependencies:{connect:`^3.7.0`,[Y]:`^${ue}`,cors:`^2.8.5`},pnpm:{peerDependencyRules:{ignoreMissing:[`vite`]}}},o=[`catalog:`,`file:`,`workspace:`];for(let e of t){let t=i[e];if(!t||o.some(e=>t.startsWith(e))){let t=ne(e);a.dependencies[e]=t?.version?`^${t.version}`:`latest`}else a.dependencies[e]=`latest`}return JSON.stringify(a,null,2)}function me({proxies:e,wsProxies:t,cookiesOptions:n,bodyParserOptions:r,priority:i,build:a}){let{serverPort:o,log:s}=a;return`import { createServer } from 'node:http'; import connect from 'connect'; import corsMiddleware from 'cors'; import { createMockMiddleware, createLogger, mockWebSocket } from 'vite-plugin-mock-dev-server/server'; import mockData from './mock-data.js'; const app = connect(); const server = createServer(app); const logger = createLogger('mock-server', '${s}'); const proxies = ${JSON.stringify(e)}; const wsProxies = ${JSON.stringify(t)}; const cookiesOptions = ${JSON.stringify(n)}; const bodyParserOptions = ${JSON.stringify(r)}; const priority = ${JSON.stringify(i)}; const compiler = { mockData } mockWebSocket(compiler, server, { wsProxies, cookiesOptions, logger }); app.use(corsMiddleware()); app.use(createMockMiddleware(compiler, { formidableOptions: { multiples: true }, proxies, priority, cookiesOptions, bodyParserOptions, logger, })); server.listen(${o}); console.log('listen: http://localhost:${o}'); `}async function he(e,t){let n=x(t.include),r=x(t.exclude),i=t.cwd||E.cwd(),a=t.dir,o=await O(t.context)||{},s=t.build.dist,c=await le(i,a,n,r),l=T.join(i,`mock-data-${Date.now()}.js`);await w.writeFile(l,c,`utf-8`);let{code:u,deps:d}=await J(l,t),f=de(d,t.alias);await w.unlink(l);let p=[{filename:T.join(s,`mock-data.js`),source:u},{filename:T.join(s,`index.js`),source:me(t)},{filename:T.join(s,`package.json`),source:pe(o,f)}];try{if(T.isAbsolute(s)){for(let{filename:e}of p)S.existsSync(e)&&await w.rm(e);t.logger.info(`${D.green(`✓`)} generate mock server in ${D.cyan(s)}`);for(let{filename:e,source:n}of p){S.mkdirSync(T.dirname(e),{recursive:!0}),await w.writeFile(e,n,`utf-8`);let r=(n.length/1024).toFixed(2),i=T.relative(s,e),a=i.length<30?` `.repeat(30-i.length):``;t.logger.info(` ${D.green(i)}${a}${D.bold.dim(`${r} kB`)}`)}}else for(let{filename:t,source:n}of p)e.emitFile({type:`asset`,fileName:t,source:n})}catch(e){console.error(e)}}function ge(e,{proxies:t,cors:n}){return n?function(i,a,o){let{pathname:c}=f(i.url);if(!c||t.length===0||!t.some(e=>s(e,i.url)))return o();let l=e.mockData;if(!Object.keys(l).find(e=>r(e,c)))return o();ae(n)(i,a,o)}:void 0}function X(e){let t={},n=E.env.NODE_ENV||e.mode;Object.assign(t,{"process.env.NODE_ENV":JSON.stringify(n),"global.process.env.NODE_ENV":JSON.stringify(n),"globalThis.process.env.NODE_ENV":JSON.stringify(n)});let r={},i={};for(let t in e.define){let n=e.define[t],a=t.startsWith(`import.meta.env.`);typeof n==`string`?ve(n)&&(r[t]=n,a&&(i[t.slice(16)]=n)):(r[t]=Z(n),a&&(i[t.slice(16)]=n))}let a={},o={},s={};for(let t in a[`import.meta.hot`]=`undefined`,e.env){let n=JSON.stringify(e.env[t]);a[`import.meta.env.${t}`]=n,o[t]=n}s[`import.meta.env`]=`undefined`;let c={...t,...a,...r,...s};return`import.meta.env`in c&&(c[`import.meta.env`]=_e({...o,...i})),c}function _e(e){let t=`{`,n=Object.keys(e);for(let r=0;r<n.length;r++){let i=n[r],a=e[i];t+=`${JSON.stringify(i)}: ${Z(a)}`,r!==n.length-1&&(t+=`, `)}return`${t}}`}function Z(e){return e===void 0?`undefined`:typeof e==`string`?e:JSON.stringify(e)}function ve(e){try{return JSON.parse(e),!0}catch{return!1}}function Q(e,t,n){let r=new ce(e);r.run(!!t),r.on(`mock:update-end`,()=>{e.reload&&n?.send({type:`full-reload`})}),t?.on(`close`,()=>r.close()),p(r,t,e);let i=[];return i.push(ge(r,e),c(r,e)),i.filter(Boolean)}function $({prefix:e=[],wsPrefix:t=[],cwd:n,dir:r=`mock`,include:i=[`**/*.mock.{js,ts,cjs,mjs,json,json5}`],exclude:a=[],reload:o=!1,log:s=`info`,cors:c=!0,formidableOptions:l={},build:u=!1,cookiesOptions:d={},bodyParserOptions:f={},priority:p={}},h){let g=m(`vite:mock`,ee(s)?s?`info`:`error`:s),{httpProxies:_}=ye(h.server.proxy||{}),v=te([...x(e),..._]),b=x(t);!v.length&&!b.length&&g.warn(`No proxy was configured, mock server will not work. See ${D.cyan(`https://vite-plugin-mock-dev-server.netlify.app/guide/usage`)}`);let S=c===!1?!1:h.server.cors!==!1,C={};S&&h.server.cors!==!1&&(C={...C,...typeof h.server.cors==`boolean`?{}:h.server.cors}),S&&c!==!1&&(C={...C,...typeof c==`boolean`?{}:c});let w=[],T=h.resolve.alias||[];return y(T)?w.push(...T):Object.entries(T).forEach(([e,t])=>{w.push({find:e,replacement:t})}),{cwd:n||E.cwd(),dir:r,include:i,exclude:a,context:h.root,reload:o,cors:S?C:!1,cookiesOptions:d,log:s,formidableOptions:{multiples:!0,...l},bodyParserOptions:f,priority:p,build:u?{serverPort:8080,dist:`mockServer`,log:`error`,...typeof u==`object`?u:{}}:!1,proxies:v,wsProxies:b,logger:g,alias:w,define:X(h)}}function ye(e={}){let t=[],n=[];return Object.keys(e).forEach(r=>{let i=e[r];typeof i==`string`||!i.ws&&!i.target?.toString().startsWith(`ws:`)&&!i.target?.toString().startsWith(`wss:`)?t.push(r):n.push(r)}),{httpProxies:t,wsProxies:n}}function be(e={}){let t=[Se(e)];return e.build&&t.push(xe(e)),t}function xe(e){let t={},n;return{name:`vite-plugin-mock-dev-server-generator`,enforce:`post`,apply:`build`,configResolved(r){t=r,n=$(e,r),r.logger.warn(``)},async buildEnd(e){e||t.command!==`build`||await he(this,n)}}}function Se(e){let t;return{name:`vite-plugin-mock-dev-server`,enforce:`pre`,apply:`serve`,config(t){let n=x(e.wsPrefix);if(n.length&&t.server?.proxy){let e={};Object.keys(t.server.proxy).forEach(r=>{n.includes(r)||(e[r]=t.server.proxy[r])}),t.server.proxy=e}d(t)},configResolved(n){t=$(e,n),n.logger.warn(``)},configureServer({middlewares:e,httpServer:n,ws:r}){Q(t,n,r).forEach(t=>e.use(t))},configurePreviewServer({middlewares:e,httpServer:n}){Q(t,n).forEach(t=>e.use(t))}}}export{h as createDefineMock,m as createLogger,c as createMockMiddleware,g as createSSEStream,_ as defineMock,v as defineMockData,n as logLevels,be as mockDevServerPlugin,p as mockWebSocket,a as processMockData,e as processRawData,l as sortByValidator};