UNPKG

esmock

Version:

provides native ESM import and globals mocking for unit tests

3 lines (2 loc) 3.72 kB
import G from"node:fs";import L from"node:module";import x from"process";var A=(e,o)=>new Error(`invalid moduleId: "${e}" (used by ${o})`),F=(e,o)=>new Error(`un-mocked moduleId: "${e}" (used by ${o})`),T=()=>new Error("For versions of node prior to v20.6.0, the loader chain process must include esmock. start the process using --loader=esmock."),v=(e,o)=>new Error(`no mocks provided for module: "${e}" (used by ${o})`),y={errModuleIdNotFound:A,errModuleIdNotMocked:F,errMissingLoader:T,errModuleIdNoDefs:v};var[$,D]=x.versions.node.split(".").map(e=>+e),N=$<16||$===16&&D<12,u=import.meta.url,O=/\?esmkgdefs=.*/,E=/.*\?esmkgdefs=/,I=/#-#esmkdefs/,b=/^file:\/\/\/import\?/,V=/file:\/\/\/import\?([^#]*)/,W=/\bimport,|,import\b|\bimport\b/g,h=/esmkTreeId=\d*/,z=/esmkModuleId=([^&]*)/,w=/\?esmk=\d*/,k=/.*exportNames=(.*)/,B=/.*#-#/,H=/isesm=true/,J=/isfound=false/,P=/^(commonjs|module)$/,q=/strict=3/,M=/^(#![^\n]*\n)/,Q=e=>e.indexOf("+")>=0?e.replace(/(?!\\)\+/g,"\\+"):e,S=(e,o)=>new RegExp(`.*(${Q(e)}(\\?${o}(?:(?!#-#).)*)).*`),R=global.mockKeys=global.mockKeys||{},g=global.mockKeysSource=global.mockKeysSource||{};var te=!L.register&&(({port:e})=>(e.addEventListener("message",o=>o.data.keysource?g[o.data.keysource]=o.data.source:R[o.data.key]=o.data.keylong),e.unref(),"global.postMessageEsmk = d => port.postMessage(d)")),re=L.register&&(e=>{e&&e.port&&e.port.on("message",o=>{o.keysource?g[o.keysource]=o.source:R[o.key]=o.keylong})}),U=e=>{let[o,s]=e.match(V)||[];return[o,k.test(s)&&s.replace(k,"$1").split(",")]},X=e=>{let o=e.split(I)[1]||"",s=U(o),n=e.replace(E,""),t=U(n);return[s[0]||t[0],[...new Set([s[1]||[],t[1]||[]].flat())]]},j=e=>w.test(e)&&R[e.match(w)[0].split("=")[1]],C=async(e,o,s)=>s.parentURL&&(s.conditions.slice(-1)[0]==="node-addons"||s.importAssertions||N)?e(o,s):e(o),ce=async(e,o,s)=>{let{parentURL:n}=o,t=j(n)||n;if(!h.test(t))return C(s,e,o);let[l]=String(t).match(h),[c,d]=t.split(I),r=c&&c.replace(E,"");if(t.includes(`esmkModuleId=${e}&isfound=false`)){let p=S(`file:///${e}`,l),f=(r.match(p)||d.match(p)||[])[2];if(f)return{shortCircuit:!0,url:u+f}}if(b.test(e))return{shortCircuit:!0,url:e.replace(b,u+"?")};let i=await C(s,e,o),m=S(i.url,l),a=m.test(d)&&d.replace(m,"$1")||m.test(r)&&r.replace(m,"$1");if(a?i.url=H.test(a)?a:u+"#-#"+a:r&&r!=="0"&&(i.url.startsWith("node:")||(i.url+="?esmkgdefs="+r)),q.test(t)&&!a)throw y.errModuleIdNotMocked(i.url,t.split("?")[0]);return i},K=u+"?esmock-loader=true",ne=(e=>async()=>e=e||(await import(K)).default===!0)(),Y=async(e,o,s)=>{if(e===K)return{format:"module",shortCircuit:!0,responseURL:e,source:"export default true"};let n=j(e)||e,t=n&&(n.match(h)||[])[0];if(t){let[c,d]=X(n);if(d&&d.length){let r=await s(e,o);if(!P.test(r.format))return r;let i=r.source===null||r.source===void 0,m=String(i?G.readFileSync(new URL(e)):r.source),a=(m.match(M)||[])[0]||"",p=a?m.replace(M,""):m,f=r.format==="commonjs"?`const {${d}} = global.esmockCacheGet("${c}");`:`import {${d}} from '${c}';`;return{format:r.format,shortCircuit:!0,responseURL:encodeURI(e),source:a+f+p}}}if(I.test(e))return s(e,o);e=e.replace(O,""),e.startsWith(u)&&(e=e.replace(B,""),J.test(e)&&(e=e.replace(u,`file:///${e.match(z)[1]}`)));let l=k.test(e)&&e.replace(k,"$1").replace(W,"").split(",");return l&&l[0]?g[e]?{format:"json",shortCircuit:!0,responseURL:encodeURI(e),source:g[e]}:{format:"module",shortCircuit:!0,responseURL:encodeURI(e),source:l.map(c=>c==="default"?`export default global.esmockCacheGet("${e}").default`:`export const ${c} = global.esmockCacheGet("${e}").${c}`).join(` `)}:(t&&!e.includes(t)&&(e=e+"?esmk="+t.split("=")[1]),s(e,o))},de=N&&Y;export{ne as default,de as getSource,te as globalPreload,re as initialize,Y as load,ce as resolve};