esmock
Version:
provides native ESM import and globals mocking for unit tests
4 lines (3 loc) • 13.5 kB
JavaScript
var Ye=Object.defineProperty;var et=(e,t)=>{for(var s in t)Ye(e,s,{get:t[s],enumerable:!0})};import Xe from"node:module";var v={};et(v,{default:()=>C,getSource:()=>St,globalPreload:()=>ht,initialize:()=>bt,load:()=>ue,resolve:()=>It});import ct from"node:fs";import ne from"node:module";import nt from"process";var tt=(e,t)=>new Error(`invalid moduleId: "${e}" (used by ${t})`),st=(e,t)=>new Error(`un-mocked moduleId: "${e}" (used by ${t})`),ot=()=>new Error("For versions of node prior to v20.6.0, the loader chain process must include esmock. start the process using --loader=esmock."),rt=(e,t)=>new Error(`no mocks provided for module: "${e}" (used by ${t})`),f={errModuleIdNotFound:tt,errModuleIdNotMocked:st,errMissingLoader:ot,errModuleIdNoDefs:rt};var[Y,it]=nt.versions.node.split(".").map(e=>+e),ie=Y<16||Y===16&&it<12,g=import.meta.url,at=/\?esmkgdefs=.*/,ae=/.*\?esmkgdefs=/,R=/#-#esmkdefs/,ee=/^file:\/\/\/import\?/,lt=/file:\/\/\/import\?([^#]*)/,pt=/\bimport,|,import\b|\bimport\b/g,O=/esmkTreeId=\d*/,ut=/esmkModuleId=([^&]*)/,te=/\?esmk=\d*/,I=/.*exportNames=(.*)/,mt=/.*#-#/,dt=/isesm=true/,ft=/isfound=false/,gt=/^(commonjs|module)$/,kt=/strict=3/,se=/^(#![^\n]*\n)/,yt=e=>e.indexOf("+")>=0?e.replace(/(?!\\)\+/g,"\\+"):e,oe=(e,t)=>new RegExp(`.*(${yt(e)}(\\?${t}(?:(?!#-#).)*)).*`),E=global.mockKeys=global.mockKeys||{},S=global.mockKeysSource=global.mockKeysSource||{};var ht=!ne.register&&(({port:e})=>(e.addEventListener("message",t=>t.data.keysource?S[t.data.keysource]=t.data.source:E[t.data.key]=t.data.keylong),e.unref(),"global.postMessageEsmk = d => port.postMessage(d)")),bt=ne.register&&(e=>{e&&e.port&&e.port.on("message",t=>{t.keysource?S[t.keysource]=t.source:E[t.key]=t.keylong})}),re=e=>{let[t,s]=e.match(lt)||[];return[t,I.test(s)&&s.replace(I,"$1").split(",")]},jt=e=>{let t=e.split(R)[1]||"",s=re(t),o=e.replace(ae,""),r=re(o);return[s[0]||r[0],[...new Set([s[1]||[],r[1]||[]].flat())]]},le=e=>te.test(e)&&E[e.match(te)[0].split("=")[1]],ce=async(e,t,s)=>s.parentURL&&(s.conditions.slice(-1)[0]==="node-addons"||s.importAssertions||ie)?e(t,s):e(t),It=async(e,t,s)=>{let{parentURL:o}=t,r=le(o)||o;if(!O.test(r))return ce(s,e,t);let[c]=String(r).match(O),[n,l]=r.split(R),a=n&&n.replace(ae,"");if(r.includes(`esmkModuleId=${e}&isfound=false`)){let b=oe(`file:///${e}`,c),j=(a.match(b)||l.match(b)||[])[2];if(j)return{shortCircuit:!0,url:g+j}}if(ee.test(e))return{shortCircuit:!0,url:e.replace(ee,g+"?")};let u=await ce(s,e,t),m=oe(u.url,c),d=m.test(l)&&l.replace(m,"$1")||m.test(a)&&a.replace(m,"$1");if(d?u.url=dt.test(d)?d:g+"#-#"+d:a&&a!=="0"&&(u.url.startsWith("node:")||(u.url+="?esmkgdefs="+a)),kt.test(r)&&!d)throw f.errModuleIdNotMocked(u.url,r.split("?")[0]);return u},pe=g+"?esmock-loader=true",C=(e=>async()=>e=e||(await import(pe)).default===!0)(),ue=async(e,t,s)=>{if(e===pe)return{format:"module",shortCircuit:!0,responseURL:e,source:"export default true"};let o=le(e)||e,r=o&&(o.match(O)||[])[0];if(r){let[n,l]=jt(o);if(l&&l.length){let a=await s(e,t);if(!gt.test(a.format))return a;let u=a.source===null||a.source===void 0,m=String(u?ct.readFileSync(new URL(e)):a.source),d=(m.match(se)||[])[0]||"",b=d?m.replace(se,""):m,j=a.format==="commonjs"?`const {${l}} = global.esmockCacheGet("${n}");`:`import {${l}} from '${n}';`;return{format:a.format,shortCircuit:!0,responseURL:encodeURI(e),source:d+j+b}}}if(R.test(e))return s(e,t);e=e.replace(at,""),e.startsWith(g)&&(e=e.replace(mt,""),ft.test(e)&&(e=e.replace(g,`file:///${e.match(ut)[1]}`)));let c=I.test(e)&&e.replace(I,"$1").replace(pt,"").split(",");return c&&c[0]?S[e]?{format:"json",shortCircuit:!0,responseURL:encodeURI(e),source:S[e]}:{format:"module",shortCircuit:!0,responseURL:encodeURI(e),source:c.map(n=>n==="default"?`export default global.esmockCacheGet("${e}").default`:`export const ${n} = global.esmockCacheGet("${e}").${n}`).join(`
`)}:(r&&!e.includes(r)&&(e=e+"?esmk="+r.split("=")[1]),s(e,t))},St=ie&&ue;import Ve from"fs";import Qt from"url";import ye from"fs";import he from"url";import i from"path";import be from"module";var je=be.createRequire(import.meta.url),me=ye.realpathSync.native,Ie=new RegExp("^(?:node:)?("+be.builtinModules.join("|").replace("/","/")+")$"),G=/^\.?\.?([a-zA-Z]:)?(\/|\\)/,W=/^.\.?(?=\/|\\)/,de=/\\/g,Mt=/index.[tj]sx?$/,wt=/[\\/]resolvewithplus[\\/]/,fe=/\.js$/,$t=/\.ts$/,xt=/(^@[^/]*\/[^/]*|^[^/]*)\/?(.*)$/,F=/^#/,Se=/(\*)/g,Me=/([./])/g,Ot=/^node:/,Rt=/^file:/,we=[".js",".mjs",".ts",".tsx",".json",".node"],Et=we.map(e=>`index${e}`),ge="node_modules",w="package.json",$e="node",M="default",Ct="browser",xe="import",P=":spectype",Oe="module",Re="import",Ee="commonjs",vt="require",K=".",z=e=>e&&typeof e=="object",A={},T=e=>({[Oe]:Re,[Ee]:vt})[e]||null,Kt=e=>Ot.test(e)?e:`node:${e}`,Nt=e=>e&&he.pathToFileURL(e).href,Ft=e=>Ie.test(e),Pt=e=>Rt.test(e)?he.fileURLToPath(e):e,At=e=>i.resolve(i.extname(e)?i.dirname(e):e)+i.sep,D=e=>de.test(e)?e.replace(de,i.posix.sep):e,k=(e,t)=>{try{t=ye.statSync(e)}catch{t=!1}return t&&(t.isFile()||t.isFIFO())},Ce=(e,t)=>t.packagejsonmap&&t.packagejsonmap[e]||k(e)&&je(e),Tt=(e,t)=>{let s=t.find(o=>k(e+o))||null;return s&&e+s},Dt=(e,t)=>{let s=t.find(o=>k(i.join(e,o)))||null;return s&&i.join(e,s)},ve=(e,t=e.split(i.sep))=>{let s=(o,r=[[],[]])=>{if(!o.length)return r[1];if(o[0]===ge&&wt.test(e))return s(o.slice(1),r);let c=r[0].length?i.join(r[0].slice(-1)[0],o[0]):o[0]||i.sep;return r[0].push(c),r[1].push(i.resolve(i.join(c,ge))),s(o.slice(1),r)};return s(t)},Gt=e=>{let t=e.split(i.sep).slice(1).reduce((s,o,r)=>(s.push(i.resolve(i.join(r?s[r-1]:i.sep,o))),s),[]).reverse().find(s=>k(i.join(s,w)));return t&&i.join(t,w)},Wt=e=>(String(e).match(xt)||[]).slice(1),ke=(e,t)=>new RegExp("^"+e.replace(Me,"\\$1").replace(Se,".*")+"$").test(t),zt=(e,t,s)=>{let o=new RegExp(e.replace(Me,"\\$1").replace(Se,"(.*)")),r=(s.match(o)||[])[1];return r&&t.replace("*",r)},Ut=(e,t,s)=>{let o=t.indexOf("*")||0,r=t.slice(0,o),c=t.slice(o+1);if(!(e.startsWith(r)&&e.endsWith(c)))return null;let n=e.slice(-c.length).slice(r.length);return s.replace("*",n)},Ke=(e,t,s,o,r=!1)=>{if(ke(e,s))if(String(t).includes("*"))ke(t,s)?r=s:e.includes("*")&&e!==t&&(r=zt(e,t,s));else{if(z(t)&&e.includes("*")){let c=Object.keys(t).reduce((n,l)=>(n[l]=Ut(s,e,t[l]),n),{});return p(c,s,o)}r=r||t}return r},Ne=(e,t,s,o,r=e[0])=>e.length?(F.test(s)?F.test(r):W.test(r))&&(typeof t[r]=="string"||z(t[r]))&&Ke(r,t[r],s,o)||Ne(e.slice(1),t,s,o):null,p=(e,t,s={})=>{let o=s.priority||[$e,M],r=!1;return typeof e=="string"?e:(!r&&Array.isArray(e)&&(r=e.reduce((c,n)=>c||p(n,t,s),null)),!r&&z(e)&&(typeof e[t]=="string"&&(r=e[t]),r||(r=o.reduce((c,n)=>c||(n=n===P?G.test(t)?T(s.packagejsontype):t:n,p(e[n],t,s)),!1)),!r&&e[M]&&(r=p(e[M],t)),!r&&e[t]&&(r=p(e[t],t,s)),r||(r=Ne(Object.keys(e),e,t,s)),!r&&e[K]&&(o.includes(t)?r=o.reduce((c,n)=>c||(n=n===P?T(s.packagejsontype):n,p(e[K],n,s)),!1):r=p(e[K],t,s))),r)},$=(e,t={})=>{var s=null,o=t.istypescript&&fe.test(e)&&e.replace(fe,".ts");return k(o)?s=o:k(e)?s=e:s=Tt(e,we),s},U=e=>e.type||"exports"in e&&Oe||Ee,N=(e,t={},s="")=>{let o=s?i.join(s,e):e;return $(o,t)||!Mt.test(e)&&$(i.join(o,"index"))},Bt=(e,t={},s="",o=!1)=>{let r=U(e);return t.isspectype!==!1&&(o=e[r]||e[T(r)],o=o&&N(o,t,s)),!o&&(t.priority||[]).includes(Re)&&e.module&&(o=N(e.module,t,s)),!o&&e.main&&(o=N(e.main,t,s)),o||null},Fe=(e,t={},s="",o)=>{let r=U(e),c=Object.assign({packagejsontype:r},t);return t.isbrowser&&e.browser&&(o=p(e.browser,xe,c),o=o&&!G.test(o)?i.join(s,o):o),o||(o=Bt(e,c,s)),o},Pe=(e,t)=>{let s=i.join(e,w),o=Ce(s,t);return(o?Fe(o,t,e):!1)||Dt(e,Et)},Ae=(e,t,s)=>{let o=W.test(e)?i.join(t,e):e;return $(o,s)||Pe(o,s)},Jt=(e,t,s,o)=>{let r=s&&s.imports,c=p(r,t,o);return c&&(W.test(c)?i.join(e,c):De(c,e,{isposixpath:!0}))},_t=(e,t,s,o,r)=>{let c=p(o&&o.exports,s?"./"+s:xe,r);return c&&i.join(e,t,c)},qt=(e,t,s,o)=>{let r=i.join(e,t,w),c=Ce(r,o),n=c&&U(c);return c&&_t(e,t,s,c,Object.assign({packagejsontype:n},o))},Vt=(e,t,s)=>{let o=Gt(t),r=i.dirname(o);return o&&Jt(r,e,je(o),s)},Zt=(e,t,s)=>{let[o,r]=Wt(e);if(F.test(o))return Vt(e,t,s);let c=ve(t);return(function n(l,a){return a--?qt(i.join(l[a]),o,r,s)||Ae(i.join(l[a],e),null,s)||n(c,a):null})(c,c.length)},Ht=(e,t,s)=>{var o=null;return t=typeof t=="string"?At(Pt(decodeURI(t))):process.cwd(),Ie.test(e)?o=Kt(e):(o=G.test(e)?Ae(D(e),t,s):Zt(e,t,s),o=o&&(s.isposixpath?me(o):Nt(D(me(o))))),o},Te=(e,t,s)=>{let o=(r,c)=>typeof r=="boolean"?r:c;return s=s||{},s.istypescript=o(s.istypescript,$t.test(t)),s.isbrowser=o(s.isbrowser,!1),s.isspectype=o(s.isspectype,!0),s.packagejsonmap=s.packagejsonmap||null,Array.isArray(s.priority)||(s.priority=s.isbrowser?[Ct]:[],s.priority.push(P),s.priority.push($e),s.priority.push(M)),s},De=(e,t,s)=>{let o=A[e+t];return o||(s=Te(e,t,s),o=Ht(e,t,s),A[e+t]=o)},x=Object.assign(De,{pathToPosix:D,getasnode_module_paths:ve,getesmkeyvalmatch:Ke,getasfilesync:$,getasdirsync:Pe,gettargetindex:Fe,iscoremodule:Ft,createopts:Te,esmparse:p,cache:A});var Ge=/(^\s*|[});\n]\s*)(import\s+(['"]|(\*\s+as\s+)?[^"'()\n;]+\s+from\s+['"]|\{)|export\s+\*\s+from\s+["']|export\s+(\{|default|function|class|var|const|let|async\s+function))/;import We from"node:module";import ze from"node:worker_threads";var B=ze.MessageChannel&&new ze.MessageChannel,Ue=(e=>()=>(typeof e=="boolean"||(e=!!We.register)&&We.register("./esmockLoader.js",{parentURL:import.meta.url,data:{port:B.port2},transferList:[B.port2]}),e))(),J=Object.assign(e=>{Ue()?B.port1.postMessage(e):typeof global.postMessageEsmk=="function"&&global.postMessageEsmk(e)},{register:Ue});var _={isESM:{},mockDefs:{}},Be=(e,t)=>(J({keysource:e,source:t}),global.mockKeysSource[String(e)]=t);var Je=(e,t)=>(J({key:e,keylong:t}),global.mockKeys[String(e)]=t),q=e=>global.mockKeys[String(e)],V=(e,t)=>global.esmockCache.mockDefs[e]=t,Lt=e=>global.esmockCache.mockDefs[e],_e=e=>_.isESM[e],qe=(e,t)=>_.isESM[e]=t;Object.assign(global,{esmockCache:_,esmockCacheGet:Lt,esmockTreeIdGet:q,mockKeys:global.mockKeys||{},mockKeysSource:global.mockKeysSource||{}});var Z=e=>typeof e=="object"&&e,H=e=>Z(e)&&"default"in e,Xt=/^\.?\.?([a-zA-Z]:)?(\/|\\)/,Yt=((e=0)=>()=>++e)(),es=Object.getPrototypeOf({}),ts=e=>Object.getPrototypeOf(e)===es,Ze=x.iscoremodule,Q=/\.json$/i,ss=/(^|,)(static|module\.exports)($|,)/g,os=(e,t)=>ts(e)?Object.assign({},e,t):Object.assign(Object.keys(e).reduce((s,o)=>(Object.defineProperty(s,o,{value:e[o],writable:!0}),s),Object.create(e)),t),rs=(e,t)=>Z(e)&&Z(t)?os(e,t):t,cs=(e,t,s)=>s===null||Q.test(s)?Object.assign({},e||{},t):Array.isArray(t)?{default:t.slice()}:(t=Object.assign({},e||{},{default:rs(H(e)&&e.default,H(t)?t.default:t)},t),!Ze(s)&&Object.isExtensible(t.default)&&(t.default.default=t.default),t),ns=(e,t)=>(t=_e(e),typeof t=="boolean"||(t=!Ze(e)&&Xt.test(e)&&Ge.test(Ve.readFileSync(e,"utf-8")),qe(e,t)),t),is=(e,t)=>{let s=H(e)&&e.default;return/boolean|string|number/.test(typeof s)?e:Object.isExtensible(s)?Object.assign(s,e,{esmkTreeId:t}):Object.assign({},s,e,{esmkTreeId:t})},as=e=>{let t=c=>c==="null"||V(c,null),s=q(e.split("esmk=")[1]),[o,r]=s.split("#-#esmkdefs=");String(r).split("#-#").forEach(t),String(o.split("esmkgdefs=")[1]).split("#-#").forEach(t)},ls=async e=>Q.test(e)?JSON.parse(Ve.readFileSync(new Qt.URL(e),"utf-8")):import(e),ps=async(e,t,s,o,r)=>{t=cs(r.strict||!o||await ls(o),t,o);let c=(o||"file:///"+s)+"?"+["esmkTreeId="+e,"esmkModuleId="+s,"isfound="+!!o,"isesm="+ns(o),"exportNames="+Object.keys(t).sort().join().replace(ss,n=>n.startsWith(",")&&n.endsWith(",")?",":"")].join("&");return Q.test(o)&&Be(c,JSON.stringify(t)),V(c,t),c},L=async(e,t,s,o,r,c,n)=>{if(o=o||Object.keys(s),n=o[0],c=c||[],!n)return c;let l=r.resolver(n,e);if(!l&&r.isModuleNotFoundError!==!1&&n!=="import")throw f.errModuleIdNotFound(n,e);return c.push(await ps(t,s[n],n,l,r)),L(e,t,s,o.slice(1),r,c)},us=async(e,t,s,o,r)=>{let c=r.resolver(e,t);if(!c)throw f.errModuleIdNotFound(e,t);let n=o?Object.keys(o):[],l=s?Object.keys(s):[];if(r.strict===3&&!n.length&&!l.length)throw f.errModuleIdNoDefs(e,t);let a=typeof r.id=="number"?r.id:Yt(),u=`${c}?key=${a}&strict=${r.strict}?`+["esmkgdefs="+(n.length&&(await L(t,a,o,n,r)).join("#-#")||0),"esmkdefs=",l.length&&(await L(t,a,s,l,r)).join("#-#")||0].join("#-#");return Je(String(a),u),c+`?esmk=${a}`},h=Object.assign(us,{purge:as,sanitize:is});import{isBuiltin as ms}from"node:module";import{pathToFileURL as ds}from"node:url";var He=process.versions.pnp&&(await import("pnpapi")).default,Le=He&&((e,t)=>{if(ms(e))return e.startsWith("node:")?e:`node:${e}`;if(e==="import")return null;let s=null;try{s=He.resolveRequest(e,t)}catch{}return s!==null?ds(s).href:null});var fs=/^.*(\(|at )(.*):[\d]*:[\d]*.*$/,gs=Le||x,Qe=(e,t)=>(e=typeof e[1]=="string"?e:[e[0],new Error().stack.split(`
`)[3].replace(fs,"$2"),...e.slice(1)],e[4]={resolver:gs,...e[4],...t},e);var y=e=>async(...t)=>{let[s,o,r,c,n]=Qe(t,e);if(!Xe.register&&!await C())throw f.errMissingLoader();let l=await h(s,o,r,c,n),a=await import(l);return n.purge!==!1&&h.purge(l),h.sanitize(a,l)},X=e=>e&&/object|function/.test(typeof e)&&"esmkTreeId"in e&&h.purge(e.esmkTreeId),ks=Object.assign(y({strict:1}),{purge:X,p:y({strict:1,purge:!1})}),ys=Object.assign(y({strict:3}),{purge:X,p:y({strict:3,purge:!1})}),eo=Object.assign(y(),{purge:X,p:y({purge:!1}),strict:ks,strictest:ys});var hs=Xe.register?{}:v,{load:to,resolve:so,getSource:oo,initialize:ro,globalPreload:co}=hs;export{eo as default,oo as getSource,co as globalPreload,ro as initialize,to as load,so as resolve,ks as strict,ys as strictest};