diff --git a/.pnp.register.mjs b/.pnp.register.mjs new file mode 100644 index 0000000000..51ca28f9ad --- /dev/null +++ b/.pnp.register.mjs @@ -0,0 +1,6 @@ +// Register the PnP ESM loader hook so that ESM imports resolve through Yarn PnP. +// This file is intended to be used with --import (Node >= 20.6). +import { register } from 'node:module' + +const loaderURL = new URL('.pnp.loader.mjs', import.meta.url) +register(loaderURL, import.meta.url) diff --git a/.yarn/patches/esmock-npm-2.7.3-83624b28f6.patch b/.yarn/patches/esmock-npm-2.7.3-83624b28f6.patch new file mode 100644 index 0000000000..a9004a1bbe --- /dev/null +++ b/.yarn/patches/esmock-npm-2.7.3-83624b28f6.patch @@ -0,0 +1,9 @@ +diff --git a/src/esmock.js b/src/esmock.js +index 964b5a2c70ae730c0495871395ec65ad0d8bdf3e..73189c2c93d4c154a6c9cd5a1734cd874d2ae162 100644 +--- a/src/esmock.js ++++ b/src/esmock.js +@@ -1,3 +1,3 @@ + 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(` ++`)}:(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";import{fileURLToPath as _pnpFutp}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{let _t=t&&t.startsWith("file://")?_pnpFutp(t):t;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}; diff --git a/.yarnrc.yml b/.yarnrc.yml index 00da118190..0e9f67c019 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -7,10 +7,91 @@ enableScripts: true enableTelemetry: false -nodeLinker: node-modules +nodeLinker: pnp npmMinimalAgeGate: 3d +packageExtensions: + "bootstrap@*": + dependencies: + "@popperjs/core": "*" + jquery: "^3" + "@overleaf/settings@*": + peerDependencies: + "@overleaf/logger": "*" + "mongodb@*": + peerDependencies: + aws4: "*" + "bunyan@*": + peerDependencies: + source-map-support: "*" + "mocha-multi-reporters@*": + peerDependencies: + mocha-junit-reporter: "*" + "mongodb-legacy@*": + peerDependencies: + mongodb: "*" + "knex@*": + dependencies: + pg-query-stream: "*" + "zod-validation-error@*": + peerDependencies: + zod: "*" + "@vitejs/plugin-react@*": + peerDependencies: + vite: "*" + "@babel/preset-env@*": + peerDependencies: + core-js: "*" + "express@*": + dependencies: + pug: "*" + "@prettier/plugin-pug@*": + dependencies: + pug: "*" + pug-filters: "*" + pug-lexer: "*" + pug-linker: "*" + pug-load: "*" + pug-parser: "*" + pug-runtime: "*" + pug-strip-comments: "*" + pug-walk: "*" + "postcss-loader@*": + peerDependencies: + autoprefixer: "*" + tailwindcss: "*" + "@ai-sdk/gateway@*": + peerDependencies: + zod: "*" + "@ai-sdk/provider-utils@*": + peerDependencies: + zod: "*" + "ai@*": + peerDependencies: + zod: "*" + "@uppy/react@*": + peerDependencies: + "@uppy/status-bar": "*" + "inversify@*": + dependencies: + reflect-metadata: "*" + "sinon-mongoose@*": + dependencies: + mongoose: "*" + "react-linkify@*": + peerDependencies: + react: "*" + "socket.io-client@*": + dependencies: + ws: "*" + "debug@*": + peerDependenciesMeta: + supports-color: + optional: true + +pnpZipBackend: js + supportedArchitectures: cpu: - current diff --git a/libraries/access-token-encryptor/package.json b/libraries/access-token-encryptor/package.json index a009b784e8..992537da63 100644 --- a/libraries/access-token-encryptor/package.json +++ b/libraries/access-token-encryptor/package.json @@ -3,6 +3,10 @@ "version": "3.0.0", "description": "", "main": "index.js", + "exports": { + ".": "./index.js", + "./*": "./*" + }, "scripts": { "test": "yarn run lint && yarn run types:check && yarn run test:unit", "lint": "eslint --cache --cache-location ../../.cache/eslint/ --ext .cjs,.js,.jsx,.mjs,.ts --max-warnings 0 .", @@ -17,8 +21,10 @@ "lodash": "^4.18.1" }, "devDependencies": { + "@types/node": "^24.5.2", "chai": "^4.3.6", "chai-as-promised": "^7.1.1", + "eslint": "^10.4.0", "mocha": "^11.1.0", "mocha-junit-reporter": "^2.2.1", "mocha-multi-reporters": "^1.5.1", diff --git a/libraries/eslint-plugin/package.json b/libraries/eslint-plugin/package.json index 8533e49e56..0d2371fc36 100644 --- a/libraries/eslint-plugin/package.json +++ b/libraries/eslint-plugin/package.json @@ -9,13 +9,12 @@ }, "devDependencies": { "@eslint/json": "^2.0.0", + "@types/node": "^24.5.2", "@typescript-eslint/parser": "^8.59.4", + "eslint": "^10.4.0", "typescript": "^5.0.4", "vitest": "4.1.5" }, - "peerDependencies": { - "eslint": "^10.4.0" - }, "scripts": { "test": "yarn run lint && yarn run types:check && yarn run test:unit", "lint": "eslint --cache --cache-location ../../.cache/eslint/ --ext .cjs,.js,.jsx,.mjs,.ts --max-warnings 0 .", diff --git a/libraries/fetch-utils/package.json b/libraries/fetch-utils/package.json index c7d18f4995..41b709494d 100644 --- a/libraries/fetch-utils/package.json +++ b/libraries/fetch-utils/package.json @@ -20,9 +20,12 @@ "author": "Overleaf (https://www.overleaf.com)", "license": "AGPL-3.0-only", "devDependencies": { + "@types/lodash": "^4.17.24", + "@types/node": "^24.5.2", "@types/node-fetch": "^2.6.13", "chai": "^4.3.6", "chai-as-promised": "^7.1.1", + "eslint": "^10.4.0", "express": "4.22.1", "selfsigned": "^5.5.0", "typescript": "^5.0.4", diff --git a/libraries/logger/package.json b/libraries/logger/package.json index 0fd0a6642a..e0942ae297 100644 --- a/libraries/logger/package.json +++ b/libraries/logger/package.json @@ -7,6 +7,10 @@ "url": "https://github.com/overleaf/overleaf" }, "main": "index.js", + "exports": { + ".": "./index.js", + "./*": "./*" + }, "license": "AGPL-3.0-only", "version": "3.1.1", "scripts": { @@ -24,7 +28,9 @@ "bunyan": "^1.8.14" }, "devDependencies": { + "@types/node": "^24.5.2", "chai": "^4.3.6", + "eslint": "^10.4.0", "mocha": "^11.1.0", "mocha-junit-reporter": "^2.2.1", "mocha-multi-reporters": "^1.5.1", diff --git a/libraries/metrics/package.json b/libraries/metrics/package.json index ab8a8d8058..a36412c9d8 100644 --- a/libraries/metrics/package.json +++ b/libraries/metrics/package.json @@ -21,8 +21,11 @@ "yn": "^3.1.1" }, "devDependencies": { + "@overleaf/logger": "workspace:*", + "@types/node": "^24.5.2", "bunyan": "^1.0.0", "chai": "^4.3.6", + "eslint": "^10.4.0", "mocha": "^11.1.0", "mocha-junit-reporter": "^2.2.1", "mocha-multi-reporters": "^1.5.1", diff --git a/libraries/mongo-utils/package.json b/libraries/mongo-utils/package.json index 64cfaf0349..1fb4264713 100644 --- a/libraries/mongo-utils/package.json +++ b/libraries/mongo-utils/package.json @@ -3,6 +3,10 @@ "version": "0.0.1", "description": "utilities to help working with mongo", "main": "index.js", + "exports": { + ".": "./index.js", + "./*": "./*" + }, "scripts": { "test": "yarn run lint && yarn run types:check && yarn run test:unit", "test:unit": "mocha --exit test/**/*.{js,cjs}", @@ -18,7 +22,9 @@ "mongodb-legacy": "6.1.3" }, "devDependencies": { + "@types/node": "^24.5.2", "chai": "^4.3.6", + "eslint": "^10.4.0", "mocha": "^11.1.0", "mocha-junit-reporter": "^2.2.1", "mocha-multi-reporters": "^1.5.1", diff --git a/libraries/o-error/package.json b/libraries/o-error/package.json index 5670f04c22..334a367cd9 100644 --- a/libraries/o-error/package.json +++ b/libraries/o-error/package.json @@ -32,6 +32,7 @@ "@types/chai": "^4.3.0", "@types/node": "^24.5.2", "chai": "^4.3.6", + "eslint": "^10.4.0", "mocha": "^11.1.0", "mocha-junit-reporter": "^2.2.1", "mocha-multi-reporters": "^1.5.1", diff --git a/libraries/object-persistor/package.json b/libraries/object-persistor/package.json index 997a29276f..227ae5ef5b 100644 --- a/libraries/object-persistor/package.json +++ b/libraries/object-persistor/package.json @@ -3,6 +3,10 @@ "version": "1.0.2", "description": "Module for storing objects in multiple backends, with fallback on 404 to assist migration between them", "main": "index.js", + "exports": { + ".": "./index.js", + "./*": "./*" + }, "scripts": { "test": "yarn run lint && yarn run types:check && yarn run test:unit", "test:unit": "mocha --exit test/**/*.{js,cjs}", @@ -33,8 +37,11 @@ "tiny-async-pool": "^1.1.0" }, "devDependencies": { + "@types/lodash": "^4.17.24", + "@types/node": "^24.5.2", "chai": "^4.3.6", "chai-as-promised": "^7.1.1", + "eslint": "^10.4.0", "mocha": "^11.1.0", "mocha-junit-reporter": "^2.2.1", "mocha-multi-reporters": "^1.5.1", diff --git a/libraries/overleaf-editor-core/package.json b/libraries/overleaf-editor-core/package.json index 1ac4cec4cd..444579a0d4 100644 --- a/libraries/overleaf-editor-core/package.json +++ b/libraries/overleaf-editor-core/package.json @@ -3,6 +3,10 @@ "version": "1.0.0", "description": "Library shared between the editor server and clients.", "main": "index.js", + "exports": { + ".": "./index.js", + "./*": "./*" + }, "scripts": { "test": "yarn run lint && yarn run types:check && yarn run test:unit", "lint": "eslint --cache --cache-location ../../.cache/eslint/ --ext .cjs,.js,.jsx,.mjs,.ts --max-warnings 0 .", @@ -16,8 +20,12 @@ "private": true, "devDependencies": { "@types/check-types": "^7.3.7", + "@types/lodash": "^4.17.24", + "@types/mocha": "^10.0.6", + "@types/node": "^24.5.2", "@types/path-browserify": "^1.0.3", "chai": "^3.3.0", + "eslint": "^10.4.0", "mocha": "^11.1.0", "mocha-junit-reporter": "^2.2.1", "mocha-multi-reporters": "^1.5.1", diff --git a/libraries/promise-utils/package.json b/libraries/promise-utils/package.json index 35c3498e4f..24fcdd25d9 100644 --- a/libraries/promise-utils/package.json +++ b/libraries/promise-utils/package.json @@ -14,8 +14,10 @@ "author": "Overleaf (https://www.overleaf.com)", "license": "AGPL-3.0-only", "devDependencies": { + "@types/node": "^24.5.2", "chai": "^4.3.10", "chai-as-promised": "^7.1.1", + "eslint": "^10.4.0", "mocha": "^11.1.0", "mocha-junit-reporter": "^2.2.1", "mocha-multi-reporters": "^1.5.1", diff --git a/libraries/ranges-tracker/package.json b/libraries/ranges-tracker/package.json index 6fb7098042..023bd01d43 100644 --- a/libraries/ranges-tracker/package.json +++ b/libraries/ranges-tracker/package.json @@ -17,7 +17,10 @@ "types:check": "tsc --noEmit" }, "devDependencies": { + "@types/node": "^24.5.2", "chai": "^4.3.6", + "core-js": "~3.46.0", + "eslint": "^10.4.0", "mocha": "^11.1.0", "mocha-junit-reporter": "^2.2.1", "mocha-multi-reporters": "^1.5.1", diff --git a/libraries/redis-wrapper/package.json b/libraries/redis-wrapper/package.json index 0680c3774a..9f553d22ae 100644 --- a/libraries/redis-wrapper/package.json +++ b/libraries/redis-wrapper/package.json @@ -32,7 +32,9 @@ "devDependencies": { "@overleaf/logger": "workspace:*", "@overleaf/o-error": "workspace:*", + "@types/node": "^24.5.2", "chai": "^4.3.6", + "eslint": "^10.4.0", "mocha": "^11.1.0", "mocha-junit-reporter": "^2.2.1", "mocha-multi-reporters": "^1.5.1", diff --git a/libraries/settings/Settings.js b/libraries/settings/Settings.js index d028e633e8..24311bf557 100644 --- a/libraries/settings/Settings.js +++ b/libraries/settings/Settings.js @@ -1,6 +1,7 @@ /* eslint-disable no-console */ const fs = require('node:fs') const Path = require('node:path') +const { createRequire } = require('node:module') const { merge } = require('./merge') const CWD = process.cwd() @@ -16,6 +17,15 @@ if (SHARELATEX_CONFIG && SHARELATEX_CONFIG !== OVERLEAF_CONFIG) { ) } +// Under Yarn PnP, require() resolves dependencies based on the issuer package. +// Config files live in the consuming service (e.g. web), not in @overleaf/settings, +// so we create a require function anchored at each config file's location to ensure +// dependencies resolve from the service's PnP scope rather than this library's. +function requireFromFile(filePath) { + const absPath = Path.resolve(filePath) + return createRequire(absPath)(absPath) +} + let settings let settingsExist = false const defaultsPath = @@ -25,7 +35,7 @@ const defaultsPath = pathIfExists(Path.join(ENTRY_POINT_DIR, 'config/settings.defaults.js')) if (defaultsPath) { console.log(`Using default settings from ${defaultsPath}`) - settings = require(defaultsPath) + settings = requireFromFile(defaultsPath) settingsExist = true } else { settings = {} @@ -37,7 +47,7 @@ const overridesPath = pathIfExists(Path.join(CWD, `config/settings.${NODE_ENV}.js`)) if (overridesPath) { console.log(`Using settings from ${overridesPath}`) - settings = merge(require(overridesPath), settings) + settings = merge(requireFromFile(overridesPath), settings) settingsExist = true } diff --git a/libraries/settings/package.json b/libraries/settings/package.json index b489dfd908..568df93442 100644 --- a/libraries/settings/package.json +++ b/libraries/settings/package.json @@ -13,6 +13,8 @@ "types:check": "tsc --noEmit" }, "devDependencies": { + "@types/node": "^24.5.2", + "eslint": "^10.4.0", "mocha": "^11.1.0", "mocha-junit-reporter": "^2.2.1", "mocha-multi-reporters": "^1.5.1", diff --git a/libraries/stream-utils/package.json b/libraries/stream-utils/package.json index e8f20646c2..d1070b3396 100644 --- a/libraries/stream-utils/package.json +++ b/libraries/stream-utils/package.json @@ -14,8 +14,10 @@ "author": "Overleaf (https://www.overleaf.com)", "license": "AGPL-3.0-only", "devDependencies": { + "@types/node": "^24.5.2", "chai": "^4.3.6", "chai-as-promised": "^7.1.1", + "eslint": "^10.4.0", "mocha": "^11.1.0", "mocha-junit-reporter": "^2.2.1", "mocha-multi-reporters": "^1.5.1", diff --git a/libraries/validation-tools/package.json b/libraries/validation-tools/package.json index 7c158581bd..f951940ce5 100644 --- a/libraries/validation-tools/package.json +++ b/libraries/validation-tools/package.json @@ -24,6 +24,9 @@ "zod-validation-error": "^4.0.1" }, "devDependencies": { + "@types/express": "4.17.23", + "@types/node": "^24.5.2", + "eslint": "^10.4.0", "typescript": "^5.0.4", "vitest": "4.1.5" } diff --git a/package.json b/package.json index 6c119cfddd..0e6d656e36 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "eslint-plugin-promise": "^7.2.1", "eslint-plugin-unicorn": "^56.0.0", "globals": "^17.6.0", + "js-yaml": "^4.1.1", "prettier": "3.7.4", "prettier-plugin-groovy": "0.2.1", "typescript": "^5.9.3" @@ -210,6 +211,7 @@ "services/history-v1", "services/idp", "services/latexqc", + "services/linked-url-proxy", "services/notifications", "services/project-history", "services/real-time", @@ -221,5 +223,184 @@ "tools/npm-overrides-helper", "tools/saas-e2e", "tools/migrations" - ] + ], + "dependenciesMeta": { + "@babel/helper-string-parser@7.27.1": { + "unplugged": true + }, + "@babel/helper-validator-identifier@7.28.5": { + "unplugged": true + }, + "@babel/parser@7.29.2": { + "unplugged": true + }, + "@babel/types@7.29.0": { + "unplugged": true + }, + "@prettier/plugin-pug@3.4.2": { + "unplugged": true + }, + "acorn@7.4.1": { + "unplugged": true + }, + "asap@2.0.6": { + "unplugged": true + }, + "assert-never@1.4.0": { + "unplugged": true + }, + "async-function@1.0.0": { + "unplugged": true + }, + "async-generator-function@1.0.0": { + "unplugged": true + }, + "babel-walk@3.0.0-canary-5": { + "unplugged": true + }, + "call-bind-apply-helpers@1.0.2": { + "unplugged": true + }, + "call-bound@1.0.4": { + "unplugged": true + }, + "character-parser@2.2.0": { + "unplugged": true + }, + "constantinople@4.0.1": { + "unplugged": true + }, + "cypress-multi-reporters@2.0.5": { + "unplugged": true + }, + "doctypes@1.1.0": { + "unplugged": true + }, + "dunder-proto@1.0.1": { + "unplugged": true + }, + "es-define-property@1.0.1": { + "unplugged": true + }, + "es-errors@1.3.0": { + "unplugged": true + }, + "es-object-atoms@1.1.1": { + "unplugged": true + }, + "esmock@2.7.3": { + "unplugged": true + }, + "function-bind@1.1.2": { + "unplugged": true + }, + "generator-function@2.0.1": { + "unplugged": true + }, + "get-intrinsic@1.3.1": { + "unplugged": true + }, + "get-proto@1.0.1": { + "unplugged": true + }, + "gopd@1.2.0": { + "unplugged": true + }, + "has-symbols@1.1.0": { + "unplugged": true + }, + "has-tostringtag@1.0.2": { + "unplugged": true + }, + "hasown@2.0.2": { + "unplugged": true + }, + "is-core-module@2.16.1": { + "unplugged": true + }, + "is-expression@4.0.0": { + "unplugged": true + }, + "is-promise@2.2.2": { + "unplugged": true + }, + "is-regex@1.2.1": { + "unplugged": true + }, + "js-stringify@1.0.2": { + "unplugged": true + }, + "jstransformer@1.0.0": { + "unplugged": true + }, + "math-intrinsics@1.1.0": { + "unplugged": true + }, + "object-assign@4.1.1": { + "unplugged": true + }, + "path-parse@1.0.7": { + "unplugged": true + }, + "prettier@3.7.4": { + "unplugged": true + }, + "prettier-plugin-groovy@0.2.1": { + "unplugged": true + }, + "promise@7.3.1": { + "unplugged": true + }, + "pug@3.0.3": { + "unplugged": true + }, + "pug-attrs@3.0.0": { + "unplugged": true + }, + "pug-code-gen@3.0.4": { + "unplugged": true + }, + "pug-error@2.1.0": { + "unplugged": true + }, + "pug-filters@4.0.0": { + "unplugged": true + }, + "pug-lexer@5.0.1": { + "unplugged": true + }, + "pug-linker@4.0.0": { + "unplugged": true + }, + "pug-load@3.0.0": { + "unplugged": true + }, + "pug-parser@6.0.0": { + "unplugged": true + }, + "pug-runtime@3.0.1": { + "unplugged": true + }, + "pug-strip-comments@2.0.0": { + "unplugged": true + }, + "pug-walk@2.0.0": { + "unplugged": true + }, + "resolve@1.22.12": { + "unplugged": true + }, + "supports-preserve-symlinks-flag@1.0.0": { + "unplugged": true + }, + "token-stream@1.0.0": { + "unplugged": true + }, + "void-elements@3.1.0": { + "unplugged": true + }, + "with@7.0.2": { + "unplugged": true + } + } } diff --git a/server-ce/Dockerfile b/server-ce/Dockerfile index b76f50c15f..41e1919551 100644 --- a/server-ce/Dockerfile +++ b/server-ce/Dockerfile @@ -10,13 +10,12 @@ WORKDIR /overleaf # Add required source files for yarn install # ------------------------------------------- -COPY --parents libraries/*/package.json .yarn/patches/ services/*/package.json tools/migrations/ package.json yarn.lock .yarnrc.yml /overleaf/ +COPY --parents libraries/*/package.json .yarn/patches/ services/*/package.json tools/migrations/ package.json yarn.lock .yarnrc.yml .pnp.register.mjs /overleaf/ COPY server-ce/genScript.js server-ce/services.js /overleaf/ # Pre-install yarn via corepack so it is available at runtime for all users # ------------------------------------------------------------------------- # Corepack setup, shared between all the images. -ENV PATH="/overleaf/node_modules/.bin:$PATH" ENV COREPACK_HOME=/opt/corepack RUN corepack enable && corepack install -g yarn@4.14.1 ENV COREPACK_ENABLE_NETWORK=0 @@ -34,10 +33,14 @@ COPY --parents libraries/ services/ tools/migrations/ /overleaf/ RUN --mount=type=cache,target=/root/.cache \ --mount=type=cache,target=/root/.yarn/berry/cache,id=server-ce-yarn-cache \ --mount=type=cache,target=/usr/local/share/.cache/yarn,id=server-ce-yarn-fallback-cache \ - --mount=type=cache,target=/overleaf/services/web/node_modules/.cache,id=server-ce-webpack-cache \ + --mount=type=cache,target=/overleaf/services/web/.cache,id=server-ce-webpack-cache \ --mount=type=tmpfs,target=/tmp \ node genScript compile | bash +# Enable Yarn PnP resolution for all Node.js processes +# ----------------------------------------------------- +ENV NODE_OPTIONS="--require /overleaf/.pnp.cjs --import /overleaf/.pnp.register.mjs" + # Copy runit service startup scripts to its location # -------------------------------------------------- ADD server-ce/runit /etc/service diff --git a/services/chat/package.json b/services/chat/package.json index 79050b2b95..a3c3e6c76f 100644 --- a/services/chat/package.json +++ b/services/chat/package.json @@ -28,10 +28,12 @@ }, "devDependencies": { "@overleaf/migrations": "workspace:*", + "@types/node": "^24.5.2", "acorn": "^7.1.1", "ajv": "^6.12.0", "chai": "^4.3.6", "chai-as-promised": "^7.1.1", + "eslint": "^10.4.0", "mocha": "^11.1.0", "mocha-junit-reporter": "^2.2.1", "mocha-multi-reporters": "^1.5.1", diff --git a/services/clsi/package.json b/services/clsi/package.json index 07a0a1c626..ca827f942e 100644 --- a/services/clsi/package.json +++ b/services/clsi/package.json @@ -40,8 +40,10 @@ }, "devDependencies": { "@istanbuljs/esm-loader-hook": "^0.3.0", + "@types/node": "^24.5.2", "chai": "^4.3.6", "chai-as-promised": "^7.1.1", + "eslint": "^10.4.0", "form-data": "^4.0.5", "mocha": "^11.1.0", "mocha-junit-reporter": "^2.2.1", diff --git a/services/docstore/package.json b/services/docstore/package.json index 32913f971e..955b3c8718 100644 --- a/services/docstore/package.json +++ b/services/docstore/package.json @@ -30,14 +30,17 @@ "bunyan": "^1.8.15", "express": "4.22.1", "lodash": "^4.18.1", + "mongodb": "6.12.0", "mongodb-legacy": "6.1.3", "p-map": "^4.0.0" }, "devDependencies": { "@google-cloud/storage": "^7.19.0", "@overleaf/migrations": "workspace:*", + "@types/node": "^24.5.2", "chai": "^4.3.6", "chai-as-promised": "^7.1.1", + "eslint": "^10.4.0", "mocha": "^11.1.0", "mocha-junit-reporter": "^2.2.1", "mocha-multi-reporters": "^1.5.1", diff --git a/services/document-updater/package.json b/services/document-updater/package.json index ebc9f283e1..126bbecb04 100644 --- a/services/document-updater/package.json +++ b/services/document-updater/package.json @@ -33,15 +33,20 @@ "express": "4.22.1", "lodash": "^4.18.1", "minimist": "^1.2.8", + "mongodb": "6.12.0", "mongodb-legacy": "6.1.3", "overleaf-editor-core": "workspace:*" }, "devDependencies": { "@overleaf/migrations": "workspace:*", + "@types/ioredis": "^4.28.10", + "@types/mocha": "^10.0.6", + "@types/node": "^24.5.2", "basic-auth": "^2.0.1", "chai": "^4.3.6", "chai-as-promised": "^7.1.1", "cluster-key-slot": "^1.0.5", + "eslint": "^10.4.0", "mocha": "^11.1.0", "mocha-junit-reporter": "^2.2.1", "mocha-multi-reporters": "^1.5.1", diff --git a/services/document-updater/scripts/flush_projects_with_no_history_id.js b/services/document-updater/scripts/flush_projects_with_no_history_id.js index 80b6ddb042..e94a8a8149 100644 --- a/services/document-updater/scripts/flush_projects_with_no_history_id.js +++ b/services/document-updater/scripts/flush_projects_with_no_history_id.js @@ -204,7 +204,10 @@ async function scanNodes(nodes, batchSize = 1000) { } } - logger.info({ scanned, server: node.serverInfo.role }, 'Scanned node') + logger.info( + { scanned, server: /** @type {any} */ (node).serverInfo.role }, + 'Scanned node' + ) } } diff --git a/services/filestore/package.json b/services/filestore/package.json index fc782d6f8c..d79fcbb1ad 100644 --- a/services/filestore/package.json +++ b/services/filestore/package.json @@ -35,8 +35,10 @@ }, "devDependencies": { "@google-cloud/storage": "^7.19.0", + "@types/node": "^24.5.2", "chai": "^4.3.6", "chai-as-promised": "^7.1.1", + "eslint": "^10.4.0", "mocha": "^11.1.0", "mocha-junit-reporter": "^2.2.1", "mocha-multi-reporters": "^1.5.1", diff --git a/services/history-v1/package.json b/services/history-v1/package.json index c70e8cc83e..1b34977685 100644 --- a/services/history-v1/package.json +++ b/services/history-v1/package.json @@ -7,6 +7,7 @@ "private": true, "dependencies": { "@google-cloud/secret-manager": "^5.6.0", + "@google-cloud/storage": "^7.19.0", "@overleaf/fetch-utils": "workspace:*", "@overleaf/logger": "workspace:*", "@overleaf/metrics": "workspace:*", @@ -47,11 +48,16 @@ "zip-stream": "^7.0.2" }, "devDependencies": { + "@aws-sdk/client-s3": "^3.994.0", "@overleaf/migrations": "workspace:*", + "@types/chai-as-promised": "^7.1.8", + "@types/mocha": "^10.0.6", + "@types/node": "^24.5.2", "benny": "^3.7.1", "chai": "^4.3.6", "chai-as-promised": "^7.1.1", "chai-exclude": "^2.1.1", + "eslint": "^10.4.0", "mocha": "^11.1.0", "mocha-junit-reporter": "^2.2.1", "mocha-multi-reporters": "^1.5.1", diff --git a/services/history-v1/storage/scripts/back_fill_file_hash.mjs b/services/history-v1/storage/scripts/back_fill_file_hash.mjs index 8b25fb8bd6..7c2f031cfe 100644 --- a/services/history-v1/storage/scripts/back_fill_file_hash.mjs +++ b/services/history-v1/storage/scripts/back_fill_file_hash.mjs @@ -316,8 +316,9 @@ if (OUTPUT_FILE !== '-') { logger.initialize('file-migration', { streams: [ { - stream: - OUTPUT_FILE === '-' + stream: DISPLAY_REPORT + ? process.stderr + : OUTPUT_FILE === '-' ? process.stdout : fs.createWriteStream(OUTPUT_FILE, { flags: 'a' }), }, diff --git a/services/history-v1/storage/scripts/fix_string_backedUpBlobs_ids.mjs b/services/history-v1/storage/scripts/fix_string_backedUpBlobs_ids.mjs index 007eebea77..54a9d9c490 100644 --- a/services/history-v1/storage/scripts/fix_string_backedUpBlobs_ids.mjs +++ b/services/history-v1/storage/scripts/fix_string_backedUpBlobs_ids.mjs @@ -1,9 +1,11 @@ // @ts-check import { backedUpBlobs } from '../lib/mongodb.js' -import { mongoId } from '../lib/assert.js' +import assert from '../lib/assert.js' import { ObjectId } from 'mongodb' import commandLineArgs from 'command-line-args' +const { mongoId } = assert + const STATS = { total: 0, replaced: 0, diff --git a/services/history-v1/test/acceptance/js/storage/back_fill_file_hash.test.mjs b/services/history-v1/test/acceptance/js/storage/back_fill_file_hash.test.mjs index 14a1c811d6..5757fc511e 100644 --- a/services/history-v1/test/acceptance/js/storage/back_fill_file_hash.test.mjs +++ b/services/history-v1/test/acceptance/js/storage/back_fill_file_hash.test.mjs @@ -485,7 +485,7 @@ describe('back_fill_file_hash script', function () { * @param {Array} args * @return {Promise<{result: { stdout: string, stderr: string, status: number }, stats: any}>} */ - async function rawRunScript(args = []) { + async function rawRunScript(args = [], env = {}) { let result try { result = await promisify(execFile)( @@ -502,6 +502,7 @@ describe('back_fill_file_hash script', function () { ...process.env, AWS_SDK_JS_SUPPRESS_MAINTENANCE_MODE_MESSAGE: '1', LOG_LEVEL: 'warn', // Override LOG_LEVEL of acceptance tests + ...env, }, } ) @@ -1120,7 +1121,7 @@ describe('back_fill_file_hash script', function () { let output before('prepare environment', prepareEnvironment) before('run script', async function () { - output = await rawRunScript(['--report']) + output = await rawRunScript(['--report'], { LOG_LEVEL: 'error' }) }) it('should print the report', () => { expect(output.status).to.equal(0) diff --git a/services/history-v1/test/acceptance/js/storage/recover_zip.test.mjs b/services/history-v1/test/acceptance/js/storage/recover_zip.test.mjs index e0f8a99498..94b9723b6b 100644 --- a/services/history-v1/test/acceptance/js/storage/recover_zip.test.mjs +++ b/services/history-v1/test/acceptance/js/storage/recover_zip.test.mjs @@ -140,7 +140,7 @@ async function runRecoverZipScript(args) { try { result = await promisify(execFile)( 'node', - ['storage/scripts/recover_zip.js', ...args], + ['--no-deprecation', 'storage/scripts/recover_zip.js', ...args], { encoding: 'utf-8', timeout: TIMEOUT, diff --git a/services/notifications/package.json b/services/notifications/package.json index deec94eda8..513d3c2e70 100644 --- a/services/notifications/package.json +++ b/services/notifications/package.json @@ -29,14 +29,17 @@ "async": "^3.2.5", "bunyan": "^1.8.15", "express": "4.22.1", + "mongodb": "6.12.0", "mongodb-legacy": "6.1.3", "zod": "^4.1.7", "zod-validation-error": "^4.0.1" }, "devDependencies": { "@overleaf/migrations": "workspace:*", + "@types/node": "^24.5.2", "chai": "^4.3.6", "chai-as-promised": "^7.1.1", + "eslint": "^10.4.0", "mocha": "^11.1.0", "typescript": "^5.0.4", "vitest": "4.1.5" diff --git a/services/project-history/package.json b/services/project-history/package.json index f1a511d0f7..14c318d5f5 100644 --- a/services/project-history/package.json +++ b/services/project-history/package.json @@ -32,18 +32,22 @@ "express": "4.22.1", "lodash": "^4.18.1", "minimist": "^1.2.8", + "mongodb": "6.12.0", "mongodb-legacy": "6.1.3", "overleaf-editor-core": "workspace:*", "p-queue": "^8.1.0" }, "devDependencies": { "@overleaf/migrations": "workspace:*", + "@types/node": "^24.5.2", "chai": "^4.3.6", "chai-as-promised": "^7.1.1", - "esmock": "^2.7.3", + "eslint": "^10.4.0", + "esmock": "patch:esmock@npm%3A2.7.3#~/.yarn/patches/esmock-npm-2.7.3-83624b28f6.patch", "mocha": "^11.1.0", "mocha-junit-reporter": "^2.2.1", "mocha-multi-reporters": "^1.5.1", + "mongodb": "6.12.0", "nock": "^13.5.3", "sinon": "~9.0.1", "sinon-chai": "^3.7.0", diff --git a/services/real-time/package.json b/services/real-time/package.json index 531c54e829..d30bb64b9a 100644 --- a/services/real-time/package.json +++ b/services/real-time/package.json @@ -36,12 +36,15 @@ "proxy-addr": "^2.0.7", "socket.io": "github:overleaf/socket.io#0.9.19-overleaf-12", "socket.io-client": "https://github.com/overleaf/socket.io-client/archive/refs/tags/0.9.17-overleaf-6.tar.gz", + "zod": "^4.0.0", "zod-validation-error": "^4.0.1" }, "devDependencies": { + "@types/node": "^24.5.2", "chai": "^4.3.6", "chai-as-promised": "^7.1.1", "cookie-signature": "^1.1.0", + "eslint": "^10.4.0", "mocha": "^11.1.0", "mocha-junit-reporter": "^2.2.1", "mocha-multi-reporters": "^1.5.1", diff --git a/services/web/.gitignore b/services/web/.gitignore index 5475a79063..95f52a993a 100644 --- a/services/web/.gitignore +++ b/services/web/.gitignore @@ -22,6 +22,7 @@ cypress/screenshots/ cypress/videos/ cypress/downloads/ cypress/results/ +cypress/reporter/ # Ace themes for conversion frontend/js/features/source-editor/themes/ace/ diff --git a/services/web/cypress.config.ts b/services/web/cypress.config.ts index 2f24ab8091..c27c7d0925 100644 --- a/services/web/cypress.config.ts +++ b/services/web/cypress.config.ts @@ -1,10 +1,13 @@ import { defineConfig } from 'cypress' import { webpackConfig } from './cypress/support/webpack.cypress' +// Cypress's Electron process uses PackherdModuleLoader which doesn't go through +// PnP hooks. Reporter packages are materialized into /tmp/cypress-reporter by +// scripts/materialize-cypress-reporter.js at container startup. let reporterOptions = {} if (process.env.CI) { reporterOptions = { - reporter: 'cypress-multi-reporters', + reporter: '/tmp/cypress-reporter/node_modules/cypress-multi-reporters', reporterOptions: { configFile: 'cypress/cypress-multi-reporters.json', }, diff --git a/services/web/package.json b/services/web/package.json index b83e9fb2a8..40ff730a99 100644 --- a/services/web/package.json +++ b/services/web/package.json @@ -3,6 +3,10 @@ "description": "The HTTP front end for Overleaf", "private": true, "main": "app.mjs", + "exports": { + ".": "./app.mjs", + "./*": "./*" + }, "directories": { "public": "./public" }, @@ -36,8 +40,9 @@ "type-check:backend": "tsc -p tsconfig.backend.json --noEmit", "extract-translations": "i18next-scanner", "convert-themes": "node frontend/js/features/source-editor/themes/scripts/convert.js", - "cypress:open-ct": "OVERLEAF_CONFIG=$(pwd)/config/settings.webpack.js cypress open --component", - "cypress:run-ct": "OVERLEAF_CONFIG=$(pwd)/config/settings.webpack.js cypress run --component --browser chrome", + "materialize-reporter": "node ../../bin/shared/materialize-cypress-reporter.js /tmp/cypress-reporter", + "cypress:open-ct": "yarn run materialize-reporter && OVERLEAF_CONFIG=$(pwd)/config/settings.webpack.js cypress open --component", + "cypress:run-ct": "yarn run materialize-reporter && OVERLEAF_CONFIG=$(pwd)/config/settings.webpack.js cypress run --component --browser chrome", "cypress:docker:open-ct": "USER_UID=$(id -u) USER_GID=$(id -g) docker compose -f docker-compose.cypress.yml run --rm cypress yarn run cypress:open-ct", "cypress:docker:run-ct": "USER_UID=$(id -u) USER_GID=$(id -g) docker compose -f docker-compose.cypress.yml run --rm cypress yarn run cypress:run-ct --browser chrome", "lezer-latex:generate": "node scripts/lezer-latex/generate.mjs", @@ -151,6 +156,7 @@ "minimist": "^1.2.7", "mmmagic": "^0.5.3", "moment": "^2.29.4", + "mongodb": "6.12.0", "mongodb-legacy": "6.1.3", "mongoose": "8.22.1", "multer": "2.2.0", @@ -197,6 +203,7 @@ "@ai-sdk/react": "^3.0.172", "@babel/core": "^7.28.5", "@babel/plugin-proposal-decorators": "^7.28.0", + "@babel/plugin-transform-typescript": "^7.28.0", "@babel/preset-env": "^7.28.5", "@babel/preset-react": "^7.28.5", "@babel/preset-typescript": "^7.28.5", @@ -234,6 +241,7 @@ "@replit/codemirror-indentation-markers": "overleaf/codemirror-indentation-markers#371ce3b56f453a392eb0d3b85ab019c185c68e1f", "@replit/codemirror-vim": "overleaf/codemirror-vim#1bef138382d948018f3f9b8a4d7a70ab61774e4b", "@sentry/browser": "7.46.0", + "@sentry/types": "7.46.0", "@storybook/addon-a11y": "10.3.5", "@storybook/addon-designs": "^11.1.3", "@storybook/addon-docs": "10.3.5", @@ -255,15 +263,19 @@ "@types/async": "^3.2.25", "@types/bootstrap": "^5.2.10", "@types/chai": "^4.3.0", + "@types/chai-as-promised": "^8.0.2", "@types/dateformat": "^5.0.3", "@types/diff": "^5.2.3", "@types/dom-speech-recognition": "^0.0.7", "@types/events": "^3.0.3", "@types/express": "^4.17.23", + "@types/lodash": "^4.17.24", + "@types/mdast": "^4.0.4", "@types/minimist": "^1.2.5", "@types/mocha": "^9.1.0", "@types/mocha-each": "^2.0.4", "@types/node": "^24.5.2", + "@types/path-browserify": "^1.0.3", "@types/react": "^18.3.20", "@types/react-color": "^3.0.13", "@types/react-dom": "^18.3.6", @@ -272,15 +284,19 @@ "@types/react-syntax-highlighter": "^15.5.11", "@types/recurly__recurly-js": "^4.38.0", "@types/sanitize-html": "^2.14.0", + "@types/sinon": "^21.0.1", "@types/sinon-chai": "^3.2.12", "@types/utf-8-validate": "^5.0.2", "@types/uuid": "^10.0.0", + "@typescript-eslint/eslint-plugin": "^8.59.4", + "@typescript-eslint/parser": "^8.59.4", "@uppy/core": "^3.8.0", "@uppy/dashboard": "3.7.1", "@uppy/drag-drop": "3.0.3", "@uppy/file-input": "3.0.4", "@uppy/progress-bar": "3.0.4", "@uppy/react": "3.2.1", + "@uppy/status-bar": "^3.2.5", "@uppy/utils": "^5.7.0", "@uppy/xhr-upload": "3.6.0", "@vitest/coverage-istanbul": "^4.0.17", @@ -315,6 +331,8 @@ "core-js": "~3.46.0", "css-loader": "^7.1.4", "css-minimizer-webpack-plugin": "^8.0.0", + "csv-parse": "^6.2.1", + "csv-stringify": "^6.7.0", "cypress": "15.12.0", "cypress-multi-reporters": "^2.0.5", "cypress-plugin-tab": "^1.0.5", @@ -325,9 +343,11 @@ "downshift": "^9.0.9", "es6-promise": "^4.2.8", "escodegen": "^2.0.0", + "eslint": "^10.4.0", "eslint-config-prettier": "^10.1.8", "eslint-plugin-chai-expect": "^4.1.0", "eslint-plugin-chai-friendly": "^1.2.0", + "eslint-plugin-cypress": "^4.1.0", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-mocha": "^11.3.0", @@ -343,6 +363,7 @@ "fake-indexeddb": "^6.0.0", "fast-fuzzy": "^1.12.0", "fetch-mock": "^12.6.0", + "focus-trap": "^8.2.1", "formik": "^2.2.9", "glob": "^12.0.0", "globals": "^17.6.0", @@ -418,8 +439,9 @@ "timekeeper": "^2.2.0", "to-string-loader": "^1.2.0", "ts-loader": "^9.5.7", + "tslib": "^2.8.1", "tty-browserify": "^0.0.1", - "typescript": "^5.9.3", + "typescript": "^5.0.4", "unified": "^11.0.5", "unist-util-visit": "^5.0.0", "use-stick-to-bottom": "^1.1.1", diff --git a/services/web/test/acceptance/bootstrap.js b/services/web/test/acceptance/bootstrap.js index 03d956ef24..2166a43e62 100644 --- a/services/web/test/acceptance/bootstrap.js +++ b/services/web/test/acceptance/bootstrap.js @@ -1,3 +1,15 @@ +// Register PnP ESM loader via module.register() for synchronous ESM resolution +// (--experimental-loader from yarn only works for async resolution) +const { register } = require('node:module') +const { pathToFileURL } = require('node:url') +const path = require('node:path') +const pnpRegister = path.resolve(__dirname, '../../.pnp.register.mjs') +try { + register(pathToFileURL(pnpRegister), pathToFileURL(__filename)) +} catch { + // .pnp.register.mjs may not exist in non-PnP environments +} + const chai = require('chai') chai.should() chai.use(require('chai-as-promised')) diff --git a/services/web/test/acceptance/src/DeleteOrphanedDocsOnlineCheckTests.mjs b/services/web/test/acceptance/src/DeleteOrphanedDocsOnlineCheckTests.mjs index 8e951c5554..21e029e81a 100644 --- a/services/web/test/acceptance/src/DeleteOrphanedDocsOnlineCheckTests.mjs +++ b/services/web/test/acceptance/src/DeleteOrphanedDocsOnlineCheckTests.mjs @@ -119,7 +119,8 @@ describe('DeleteOrphanedDocsOnlineCheck', function () { // Hide verbose log messages `calling destroy for project in docstore` 'LOG_LEVEL=error', // Hide deprecation warnings for calling `db.collection.count` - 'NODE_OPTIONS=--no-deprecation', + // Preserve existing NODE_OPTIONS (e.g. PnP hooks) while adding --no-deprecation + `NODE_OPTIONS='${process.env.NODE_OPTIONS || ''} --no-deprecation'`, ]) .concat(['node', 'scripts/delete_orphaned_docs_online_check.mjs']) .join(' ') diff --git a/services/web/test/unit/src/Settings/Settings.test.mjs b/services/web/test/unit/src/Settings/Settings.test.mjs index 9d12011a93..e22b20a415 100644 --- a/services/web/test/unit/src/Settings/Settings.test.mjs +++ b/services/web/test/unit/src/Settings/Settings.test.mjs @@ -10,7 +10,9 @@ function clearSettingsCache() { const settingsDeps = Object.keys(require.cache).filter( x => x.includes('/@overleaf/settings') || + x.includes('/@overleaf-settings-virtual') || x.includes(`${monorepoPath}/libraries/settings`) || + x.includes('/libraries/settings/') || x.includes(`${monorepoPath}/services/web/config`) ) settingsDeps.forEach(dep => delete require.cache[dep]) diff --git a/services/web/tsconfig.json b/services/web/tsconfig.json index 4fc80342c8..9c552a397a 100644 --- a/services/web/tsconfig.json +++ b/services/web/tsconfig.json @@ -21,6 +21,9 @@ "@modules/*": ["./modules/*"], "@overleaf/o-error": ["../../libraries/o-error"], "@overleaf/ranges-tracker": ["../../libraries/ranges-tracker"], + "@overleaf/validation-tools": ["../../libraries/validation-tools"], + "overleaf-editor-core": ["../../libraries/overleaf-editor-core"], + "overleaf-editor-core/*": ["../../libraries/overleaf-editor-core/*"], "@ol-types/*": ["./types/*"], "@ol-storybook/*": ["./.storybook/*"], diff --git a/services/web/types/uppy-utils.d.ts b/services/web/types/uppy-utils.d.ts new file mode 100644 index 0000000000..1c72e0f426 --- /dev/null +++ b/services/web/types/uppy-utils.d.ts @@ -0,0 +1,11 @@ +// Ambient module declaration for @uppy/utils subpath imports. +// Under Yarn PnP, TypeScript cannot find the ambient declarations in +// @uppy/utils/types/index.d.ts for deep imports like +// @uppy/utils/lib/getDroppedFiles. Re-declare the subset we use here. +declare module '@uppy/utils/lib/getDroppedFiles' { + function getDroppedFiles( + dataTransfer: DataTransfer, + options?: Record + ): Promise + export default getDroppedFiles +} diff --git a/services/web/webpack.config.js b/services/web/webpack.config.js index 35c9c40819..2867cb541a 100644 --- a/services/web/webpack.config.js +++ b/services/web/webpack.config.js @@ -51,13 +51,11 @@ globSync( }) function getModuleDirectory(moduleName) { - const entrypointPath = require.resolve(moduleName) - const suffix = `node_modules/${moduleName}` - const idx = entrypointPath.indexOf(suffix) - if (idx === -1) { - throw new Error(`could not find Node module: ${moduleName}`) + try { + return path.dirname(require.resolve(`${moduleName}/package.json`)) + } catch (err) { + throw new Error(`could not find Node module: ${moduleName}`, { cause: err }) } - return entrypointPath.slice(0, idx + suffix.length) } const mathjaxDir = getModuleDirectory('mathjax') @@ -314,6 +312,21 @@ module.exports = { // Ensure all packages use the same jQuery instance (prevents duplicate // copies from Yarn hoisting breaking jQuery plugins like daterangepicker) jquery: require.resolve('jquery'), + // Under Yarn PnP, babel-injected core-js polyfill imports cannot be + // resolved from third-party packages (e.g. @uppy, pdfjs-dist) because + // they don't declare core-js as a dependency. Alias to the web + // workspace's copy so all packages can resolve it. + 'core-js': getModuleDirectory('core-js'), + // writefull's tsconfig uses importHelpers: true, which emits tslib + // imports that must be resolvable from the web workspace. + tslib: getModuleDirectory('tslib'), + // Under PnP, packages like cypress/react that import react/react-dom + // can't resolve them from their own scope. Alias to web's copies. + react: getModuleDirectory('react'), + 'react-dom': getModuleDirectory('react-dom'), + // ai-sdk packages declare zod as a peer dep but PnP can't resolve it + // from their scope in the Docker build. + zod: getModuleDirectory('zod'), }, // symlinks: false, // enable this while using `npm link` extensions: ['.js', '.jsx', '.ts', '.tsx', '.mjs', '.cjs', '.json'], diff --git a/tools/migrations/package.json b/tools/migrations/package.json index 6ee1d8d305..436b2b1aa3 100644 --- a/tools/migrations/package.json +++ b/tools/migrations/package.json @@ -5,6 +5,9 @@ "lint": "eslint --cache --cache-location ../../.cache/eslint/ --ext .cjs,.js,.jsx,.mjs,.ts --max-warnings 0 .", "lint:fix": "eslint --cache --cache-location ../../.cache/eslint/ --fix --ext .cjs,.js,.jsx,.mjs,.ts ." }, + "devDependencies": { + "eslint": "^10.4.0" + }, "dependencies": { "@overleaf/logger": "workspace:*", "@overleaf/mongo-utils": "workspace:*", diff --git a/tsconfig.backend.json b/tsconfig.backend.json index 31a45a1b15..8e4c4b392b 100644 --- a/tsconfig.backend.json +++ b/tsconfig.backend.json @@ -15,6 +15,7 @@ "@overleaf/logger": ["./libraries/logger"], "@overleaf/metrics": ["./libraries/metrics"], "@overleaf/mongo-utils": ["./libraries/mongo-utils"], + "@overleaf/mongo-utils/*": ["./libraries/mongo-utils/*"], "@overleaf/object-persistor": ["./libraries/object-persistor"], "@overleaf/o-error": ["./libraries/o-error"], "overleaf-editor-core": ["./libraries/overleaf-editor-core"], diff --git a/yarn.lock b/yarn.lock index be111cd84f..10d48fa7d0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1350,6 +1350,17 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/code-frame@npm:7.29.7" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.29.7" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.1.1" + checksum: 10c0/169fc2080169a40c1760155eaaaf739bcb882df0bec76a83adbda5493645bc17270a3434b8848c494b1933e96fe1d147370001e3cda09a39f43ae30f08ef2069 + languageName: node + linkType: hard + "@babel/compat-data@npm:^7.28.5, @babel/compat-data@npm:^7.28.6": version: 7.29.0 resolution: "@babel/compat-data@npm:7.29.0" @@ -1393,6 +1404,19 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/generator@npm:7.29.7" + dependencies: + "@babel/parser": "npm:^7.29.7" + "@babel/types": "npm:^7.29.7" + "@jridgewell/gen-mapping": "npm:^0.3.12" + "@jridgewell/trace-mapping": "npm:^0.3.28" + jsesc: "npm:^3.0.2" + checksum: 10c0/9bf72b01b5bd0ea5b1288a0e37dbd360bff2f2b1ce73342c0d40fb3db2ec3dc004ada5ffa925c5e12939a416eed59e600d562b8ecd938ce0d27dfd0eb6c6c2b7 + languageName: node + linkType: hard + "@babel/helper-annotate-as-pure@npm:^7.27.1, @babel/helper-annotate-as-pure@npm:^7.27.3": version: 7.27.3 resolution: "@babel/helper-annotate-as-pure@npm:7.27.3" @@ -1402,6 +1426,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-annotate-as-pure@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-annotate-as-pure@npm:7.29.7" + dependencies: + "@babel/types": "npm:^7.29.7" + checksum: 10c0/c56536b52d17632d89d49db2063ed6102f0e3bbadf6a0ccb74e6599d6a77173b644c7fe8c3ef17c7a162709d55b75ee5145ef6db917d16ba7f375fbffcf2e942 + languageName: node + linkType: hard + "@babel/helper-builder-react-jsx@npm:^7.27.1": version: 7.28.6 resolution: "@babel/helper-builder-react-jsx@npm:7.28.6" @@ -1442,6 +1475,23 @@ __metadata: languageName: node linkType: hard +"@babel/helper-create-class-features-plugin@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-create-class-features-plugin@npm:7.29.7" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.29.7" + "@babel/helper-member-expression-to-functions": "npm:^7.29.7" + "@babel/helper-optimise-call-expression": "npm:^7.29.7" + "@babel/helper-replace-supers": "npm:^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.29.7" + "@babel/traverse": "npm:^7.29.7" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/75f34905b5e708b473f1e9b33e07b2fcc8f4c60676df8bc74541bb91c77f387c32a948dd04d5071e469ba454d72d0a872e3ace40fbb1d1e7aaa8569efcf09ed4 + languageName: node + linkType: hard + "@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.27.1, @babel/helper-create-regexp-features-plugin@npm:^7.28.5": version: 7.28.5 resolution: "@babel/helper-create-regexp-features-plugin@npm:7.28.5" @@ -1477,6 +1527,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-globals@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-globals@npm:7.29.7" + checksum: 10c0/f38417c40b1129a1b2b519ca961b9040c8827d1444fd74068702286b91b77089431dc76b6b9d5c1496e5da2a4f3ad329c6946e688ba3fa0d1d0b3d2b4f34f36a + languageName: node + linkType: hard + "@babel/helper-member-expression-to-functions@npm:^7.28.5": version: 7.28.5 resolution: "@babel/helper-member-expression-to-functions@npm:7.28.5" @@ -1487,6 +1544,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-member-expression-to-functions@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-member-expression-to-functions@npm:7.29.7" + dependencies: + "@babel/traverse": "npm:^7.29.7" + "@babel/types": "npm:^7.29.7" + checksum: 10c0/eef7940ce0797208854a5af1049a98fee9abbffb5c619640c69ff5a555f8e3552295bb18756490b02bc6af7df8c1babcb83f12203aac2deb9dfecfc78846e12d + languageName: node + linkType: hard + "@babel/helper-module-imports@npm:^7.28.6": version: 7.28.6 resolution: "@babel/helper-module-imports@npm:7.28.6" @@ -1519,6 +1586,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-optimise-call-expression@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-optimise-call-expression@npm:7.29.7" + dependencies: + "@babel/types": "npm:^7.29.7" + checksum: 10c0/fd0244b9bfbb487db02d59aa2703c6991d654ea5f3f39d912682842bdca2e87b5ae8643b0ce8069bf5fbee39d1aa9db7abefeb5e6ba1aa650dca12777cf5b7e2 + languageName: node + linkType: hard + "@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.27.1, @babel/helper-plugin-utils@npm:^7.28.6": version: 7.28.6 resolution: "@babel/helper-plugin-utils@npm:7.28.6" @@ -1526,6 +1602,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-plugin-utils@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-plugin-utils@npm:7.29.7" + checksum: 10c0/380477a06133274a2759f9355929cb60a95e8b8fee624a1ae1fa349e1d1645b89daca456f72833f6d1062bffa12ee4271c5bf0cc5a61c0166cdc24c7591e2408 + languageName: node + linkType: hard + "@babel/helper-remap-async-to-generator@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-remap-async-to-generator@npm:7.27.1" @@ -1552,6 +1635,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-replace-supers@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-replace-supers@npm:7.29.7" + dependencies: + "@babel/helper-member-expression-to-functions": "npm:^7.29.7" + "@babel/helper-optimise-call-expression": "npm:^7.29.7" + "@babel/traverse": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/1c7ae37797f226e965ab85f6affa53d25a10c169c604a4daeb36f9df09e673471e6522f631c13761cf9fbafeca2ea14c241dea8d723a51039d561beb01d86ac4 + languageName: node + linkType: hard + "@babel/helper-skip-transparent-expression-wrappers@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.27.1" @@ -1562,6 +1658,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.29.7" + dependencies: + "@babel/traverse": "npm:^7.29.7" + "@babel/types": "npm:^7.29.7" + checksum: 10c0/8c59493621487fc491f27adfc200af82a6aca3b9a5511e4e6050f8716593b4b243472cb56c8d2016e828b7ae12d605a819205aa8600ca08ee291dcd58d65c832 + languageName: node + linkType: hard + "@babel/helper-string-parser@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-string-parser@npm:7.27.1" @@ -1629,7 +1735,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.27.2": +"@babel/parser@npm:^7.27.2, @babel/parser@npm:^7.29.7": version: 7.29.7 resolution: "@babel/parser@npm:7.29.7" dependencies: @@ -1809,6 +1915,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-typescript@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-syntax-typescript@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/c49883b0327e8683b770dc823205af5c697da216e590dcf5bf53f3f031e7e381de450b164f8f99853f0837a3de5cb793298e2be6697a0f6e452bb9dd34b5165e + languageName: node + linkType: hard + "@babel/plugin-syntax-unicode-sets-regex@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-syntax-unicode-sets-regex@npm:7.18.6" @@ -2492,6 +2609,21 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-typescript@npm:^7.28.0": + version: 7.29.7 + resolution: "@babel/plugin-transform-typescript@npm:7.29.7" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.29.7" + "@babel/helper-create-class-features-plugin": "npm:^7.29.7" + "@babel/helper-plugin-utils": "npm:^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.29.7" + "@babel/plugin-syntax-typescript": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/8bf6a89c6827af6f11d4b189f1f97a64b8d754cc4caa5cbae16a6a8b113294d7f310dd40efd82e87ebcff2a1c683584b872d6d8960abe88d48f441d42f94c4d1 + languageName: node + linkType: hard + "@babel/plugin-transform-typescript@npm:^7.28.5": version: 7.28.6 resolution: "@babel/plugin-transform-typescript@npm:7.28.6" @@ -2733,6 +2865,17 @@ __metadata: languageName: node linkType: hard +"@babel/template@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/template@npm:7.29.7" + dependencies: + "@babel/code-frame": "npm:^7.29.7" + "@babel/parser": "npm:^7.29.7" + "@babel/types": "npm:^7.29.7" + checksum: 10c0/8bb7f900dcab0e9e1c5ffbc33ca10e0d26b7b2e2ca804becb73ee771b9c4ed6e2908a4ae4a14c08560febb45d2b6b9a173955e42ad404d05f8b04840a14d9c58 + languageName: node + linkType: hard + "@babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.28.0, @babel/traverse@npm:^7.28.5, @babel/traverse@npm:^7.28.6, @babel/traverse@npm:^7.29.0": version: 7.29.0 resolution: "@babel/traverse@npm:7.29.0" @@ -2748,6 +2891,21 @@ __metadata: languageName: node linkType: hard +"@babel/traverse@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/traverse@npm:7.29.7" + dependencies: + "@babel/code-frame": "npm:^7.29.7" + "@babel/generator": "npm:^7.29.7" + "@babel/helper-globals": "npm:^7.29.7" + "@babel/parser": "npm:^7.29.7" + "@babel/template": "npm:^7.29.7" + "@babel/types": "npm:^7.29.7" + debug: "npm:^4.3.1" + checksum: 10c0/e256a1fbdb956555b76f3c285b1e453f6bedec8b3afb61751d99d933efd11c7d79caf5ddf2493570058a9f7deaa1b48324380d7c1aa1443fd9508becbf56331a + languageName: node + linkType: hard + "@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.7, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.28.2, @babel/types@npm:^7.28.5, @babel/types@npm:^7.28.6, @babel/types@npm:^7.29.0, @babel/types@npm:^7.4.4, @babel/types@npm:^7.6.1, @babel/types@npm:^7.9.6": version: 7.29.0 resolution: "@babel/types@npm:7.29.0" @@ -6693,8 +6851,10 @@ __metadata: version: 0.0.0-use.local resolution: "@overleaf/access-token-encryptor@workspace:libraries/access-token-encryptor" dependencies: + "@types/node": "npm:^24.5.2" chai: "npm:^4.3.6" chai-as-promised: "npm:^7.1.1" + eslint: "npm:^10.4.0" lodash: "npm:^4.18.1" mocha: "npm:^11.1.0" mocha-junit-reporter: "npm:^2.2.1" @@ -6724,6 +6884,7 @@ __metadata: "@pollyjs/adapter-node-http": "npm:^6.0.6" "@pollyjs/core": "npm:^6.0.6" "@pollyjs/persister-fs": "npm:^6.0.6" + "@types/node": "npm:^24.5.2" bluebird: "npm:^3.7.2" bull: "npm:^3.18.0" camelcase-keys: "npm:^4.2.0" @@ -6731,6 +6892,7 @@ __metadata: chai-as-promised: "npm:^7.1.1" csv: "npm:^5.4.0" east: "npm:^2.0.3" + eslint: "npm:^10.4.0" express: "npm:4.22.1" json2csv: "npm:^4.5.4" lodash: "npm:^4.18.1" @@ -6766,11 +6928,13 @@ __metadata: "@overleaf/mongo-utils": "npm:*" "@overleaf/promise-utils": "npm:*" "@overleaf/settings": "npm:*" + "@types/node": "npm:^24.5.2" acorn: "npm:^7.1.1" ajv: "npm:^6.12.0" async: "npm:^3.2.5" chai: "npm:^4.3.6" chai-as-promised: "npm:^7.1.1" + eslint: "npm:^10.4.0" exegesis-express: "npm:4.0.0" express: "npm:4.22.1" mocha: "npm:^11.1.0" @@ -6797,15 +6961,18 @@ __metadata: "@overleaf/settings": "workspace:*" "@overleaf/stream-utils": "workspace:*" "@overleaf/validation-tools": "workspace:*" + "@types/node": "npm:^24.5.2" bunyan: "npm:^1.8.15" chai: "npm:^4.3.6" chai-as-promised: "npm:^7.1.1" + eslint: "npm:^10.4.0" express: "npm:^4.22.1" mocha: "npm:^11.1.0" mocha-junit-reporter: "npm:^2.2.1" mocha-multi-reporters: "npm:^1.5.1" p-limit: "npm:^3.1.0" tar-fs: "npm:^3.1.1" + typescript: "npm:^5.0.4" languageName: unknown linkType: soft @@ -6818,7 +6985,9 @@ __metadata: "@overleaf/o-error": "workspace:*" "@overleaf/settings": "workspace:*" "@overleaf/stream-utils": "workspace:*" + "@types/node": "npm:^24.5.2" chai-as-promised: "npm:^7.1.1" + eslint: "npm:^10.4.0" express: "npm:4.22.1" gcp-metadata: "npm:^6.1.0" googleapis: "npm:^144.0.0" @@ -6836,10 +7005,12 @@ __metadata: "@overleaf/logger": "workspace:*" "@overleaf/o-error": "workspace:*" "@overleaf/settings": "workspace:*" + "@types/node": "npm:^24.5.2" bunyan: "npm:^1.8.15" chai: "npm:^4.3.6" chai-as-promised: "npm:^7.1.1" cookie: "npm:^0.4.1" + eslint: "npm:^10.4.0" express: "npm:4.22.1" glob: "npm:^12.0.0" mocha: "npm:^11.1.0" @@ -6863,12 +7034,14 @@ __metadata: "@overleaf/settings": "workspace:*" "@overleaf/stream-utils": "workspace:*" "@overleaf/validation-tools": "workspace:*" + "@types/node": "npm:^24.5.2" archiver: "npm:5.3.2" async: "npm:^3.2.5" bunyan: "npm:^1.8.15" chai: "npm:^4.3.6" chai-as-promised: "npm:^7.1.1" dockerode: "npm:^4.0.9" + eslint: "npm:^10.4.0" express: "npm:4.22.1" form-data: "npm:^4.0.5" lodash: "npm:^4.18.1" @@ -6927,15 +7100,18 @@ __metadata: "@overleaf/settings": "workspace:*" "@overleaf/stream-utils": "npm:^0.1.0" "@overleaf/validation-tools": "workspace:*" + "@types/node": "npm:^24.5.2" async: "npm:^3.2.5" bunyan: "npm:^1.8.15" chai: "npm:^4.3.6" chai-as-promised: "npm:^7.1.1" + eslint: "npm:^10.4.0" express: "npm:4.22.1" lodash: "npm:^4.18.1" mocha: "npm:^11.1.0" mocha-junit-reporter: "npm:^2.2.1" mocha-multi-reporters: "npm:^1.5.1" + mongodb: "npm:6.12.0" mongodb-legacy: "npm:6.1.3" p-map: "npm:^4.0.0" sinon: "npm:~9.0.2" @@ -6960,6 +7136,9 @@ __metadata: "@overleaf/redis-wrapper": "workspace:*" "@overleaf/settings": "workspace:*" "@types/chai-as-promised": "npm:^7.1.8" + "@types/ioredis": "npm:^4.28.10" + "@types/mocha": "npm:^10.0.6" + "@types/node": "npm:^24.5.2" async: "npm:^3.2.5" basic-auth: "npm:^2.0.1" bull: "npm:^3.18.0" @@ -6968,12 +7147,14 @@ __metadata: chai-as-promised: "npm:^7.1.1" cluster-key-slot: "npm:^1.0.5" diff-match-patch: "overleaf/diff-match-patch#89805f9c671a77a263fc53461acd62aa7498f688" + eslint: "npm:^10.4.0" express: "npm:4.22.1" lodash: "npm:^4.18.1" minimist: "npm:^1.2.8" mocha: "npm:^11.1.0" mocha-junit-reporter: "npm:^2.2.1" mocha-multi-reporters: "npm:^1.5.1" + mongodb: "npm:6.12.0" mongodb-legacy: "npm:6.1.3" overleaf-editor-core: "workspace:*" sandboxed-module: "npm:^2.0.4" @@ -6990,12 +7171,12 @@ __metadata: resolution: "@overleaf/eslint-plugin@workspace:libraries/eslint-plugin" dependencies: "@eslint/json": "npm:^2.0.0" + "@types/node": "npm:^24.5.2" "@typescript-eslint/parser": "npm:^8.59.4" + eslint: "npm:^10.4.0" lodash: "npm:^4.18.1" typescript: "npm:^5.0.4" vitest: "npm:4.1.5" - peerDependencies: - eslint: ^10.4.0 languageName: unknown linkType: soft @@ -7004,9 +7185,12 @@ __metadata: resolution: "@overleaf/fetch-utils@workspace:libraries/fetch-utils" dependencies: "@overleaf/o-error": "workspace:*" + "@types/lodash": "npm:^4.17.24" + "@types/node": "npm:^24.5.2" "@types/node-fetch": "npm:^2.6.13" chai: "npm:^4.3.6" chai-as-promised: "npm:^7.1.1" + eslint: "npm:^10.4.0" express: "npm:4.22.1" lodash: "npm:^4.18.1" node-fetch: "npm:^2.7.0" @@ -7028,9 +7212,11 @@ __metadata: "@overleaf/object-persistor": "workspace:*" "@overleaf/settings": "workspace:*" "@overleaf/stream-utils": "npm:^0.1.0" + "@types/node": "npm:^24.5.2" bunyan: "npm:^1.8.15" chai: "npm:^4.3.6" chai-as-promised: "npm:^7.1.1" + eslint: "npm:^10.4.0" express: "npm:4.22.1" glob: "npm:^12.0.0" lodash.once: "npm:^4.1.1" @@ -7054,6 +7240,7 @@ __metadata: resolution: "@overleaf/github-sync@workspace:services/github-sync" dependencies: "@octokit/request": "npm:^9.2.2" + "@octokit/request-error": "npm:^6.1.7" "@overleaf/access-token-encryptor": "workspace:*" "@overleaf/fetch-utils": "workspace:*" "@overleaf/logger": "workspace:*" @@ -7064,14 +7251,21 @@ __metadata: "@overleaf/promise-utils": "workspace:*" "@overleaf/settings": "workspace:*" "@overleaf/stream-utils": "workspace:*" + "@pollyjs/adapter-node-http": "npm:^6.0.6" + "@pollyjs/core": "npm:^6.0.6" + "@pollyjs/persister-fs": "npm:^6.0.6" + "@types/node": "npm:^24.5.2" base64-stream: "npm:^0.1.2" bunyan: "npm:^1.8.15" chai: "npm:^4.3.6" chai-as-promised: "npm:^7.1.1" + eslint: "npm:^10.4.0" express: "npm:4.22.1" + lodash: "npm:^4.18.1" mocha: "npm:^11.1.0" mocha-junit-reporter: "npm:^2.2.1" mocha-multi-reporters: "npm:^1.5.1" + mongodb: "npm:6.12.0" mongodb-legacy: "npm:6.1.3" nock: "npm:^14.0.0" randomstring: "npm:^1.1.5" @@ -7088,9 +7282,11 @@ __metadata: version: 0.0.0-use.local resolution: "@overleaf/idp@workspace:services/idp" dependencies: + "@types/node": "npm:^24.5.2" chai: "npm:^4.3.6" chai-as-promised: "npm:^7.1.1" ejs: "npm:^3.1.10" + eslint: "npm:^10.4.0" express: "npm:4.22.1" mocha: "npm:^11.1.0" mocha-junit-reporter: "npm:^2.2.1" @@ -7100,6 +7296,24 @@ __metadata: languageName: unknown linkType: soft +"@overleaf/linked-url-proxy@workspace:services/linked-url-proxy": + version: 0.0.0-use.local + resolution: "@overleaf/linked-url-proxy@workspace:services/linked-url-proxy" + dependencies: + "@types/node": "npm:^24.5.2" + chai-as-promised: "npm:^7.1.1" + eslint: "npm:^10.4.0" + express: "npm:^4.22.1" + ipaddr.js: "npm:^2.2.0" + node-fetch: "npm:^2.7.0" + sinon: "npm:^14.0.0" + sinon-chai: "npm:^3.7.0" + tsscmp: "npm:^1.0.6" + typescript: "npm:^5.0.4" + vitest: "npm:4.1.5" + languageName: unknown + linkType: soft + "@overleaf/logger@npm:*, @overleaf/logger@workspace:*, @overleaf/logger@workspace:libraries/logger": version: 0.0.0-use.local resolution: "@overleaf/logger@workspace:libraries/logger" @@ -7107,8 +7321,10 @@ __metadata: "@google-cloud/logging-bunyan": "npm:^5.1.0" "@overleaf/fetch-utils": "workspace:*" "@overleaf/o-error": "workspace:*" + "@types/node": "npm:^24.5.2" bunyan: "npm:^1.8.14" chai: "npm:^4.3.6" + eslint: "npm:^10.4.0" mocha: "npm:^11.1.0" mocha-junit-reporter: "npm:^2.2.1" mocha-multi-reporters: "npm:^1.5.1" @@ -7133,9 +7349,12 @@ __metadata: "@opentelemetry/resources": "npm:^2.8.0" "@opentelemetry/sdk-node": "npm:^0.219.0" "@opentelemetry/semantic-conventions": "npm:^1.41.1" + "@overleaf/logger": "workspace:*" + "@types/node": "npm:^24.5.2" bunyan: "npm:^1.0.0" chai: "npm:^4.3.6" compression: "npm:^1.7.4" + eslint: "npm:^10.4.0" mocha: "npm:^11.1.0" mocha-junit-reporter: "npm:^2.2.1" mocha-multi-reporters: "npm:^1.5.1" @@ -7160,6 +7379,7 @@ __metadata: "@overleaf/settings": "workspace:*" bcrypt: "npm:^6.0.0" east: "npm:2.0.3" + eslint: "npm:^10.4.0" mongodb: "npm:6.12.0" languageName: unknown linkType: soft @@ -7168,7 +7388,9 @@ __metadata: version: 0.0.0-use.local resolution: "@overleaf/mongo-utils@workspace:libraries/mongo-utils" dependencies: + "@types/node": "npm:^24.5.2" chai: "npm:^4.3.6" + eslint: "npm:^10.4.0" mocha: "npm:^11.1.0" mocha-junit-reporter: "npm:^2.2.1" mocha-multi-reporters: "npm:^1.5.1" @@ -7194,12 +7416,15 @@ __metadata: "@overleaf/promise-utils": "workspace:*" "@overleaf/settings": "workspace:*" "@overleaf/validation-tools": "workspace:*" + "@types/node": "npm:^24.5.2" async: "npm:^3.2.5" bunyan: "npm:^1.8.15" chai: "npm:^4.3.6" chai-as-promised: "npm:^7.1.1" + eslint: "npm:^10.4.0" express: "npm:4.22.1" mocha: "npm:^11.1.0" + mongodb: "npm:6.12.0" mongodb-legacy: "npm:6.1.3" typescript: "npm:^5.0.4" vitest: "npm:4.1.5" @@ -7215,6 +7440,7 @@ __metadata: "@types/chai": "npm:^4.3.0" "@types/node": "npm:^24.5.2" chai: "npm:^4.3.6" + eslint: "npm:^10.4.0" mocha: "npm:^11.1.0" mocha-junit-reporter: "npm:^2.2.1" mocha-multi-reporters: "npm:^1.5.1" @@ -7235,8 +7461,11 @@ __metadata: "@overleaf/metrics": "workspace:*" "@overleaf/o-error": "workspace:*" "@overleaf/stream-utils": "workspace:*" + "@types/lodash": "npm:^4.17.24" + "@types/node": "npm:^24.5.2" chai: "npm:^4.3.6" chai-as-promised: "npm:^7.1.1" + eslint: "npm:^10.4.0" fast-crc32c: "overleaf/node-fast-crc32c#aae6b2a4c7a7a159395df9cc6c38dfde702d6f51" glob: "npm:^12.0.0" mocha: "npm:^11.1.0" @@ -7257,7 +7486,9 @@ __metadata: resolution: "@overleaf/piece-table@workspace:libraries/piece-table" dependencies: "@overleaf/o-error": "workspace:*" + "@types/node": "npm:^24.5.2" chai: "npm:^4.3.6" + eslint: "npm:^10.4.0" mocha: "npm:^11.1.0" mocha-junit-reporter: "npm:^2.2.1" mocha-multi-reporters: "npm:^1.5.1" @@ -7280,18 +7511,21 @@ __metadata: "@overleaf/settings": "workspace:*" "@overleaf/stream-utils": "workspace:*" "@overleaf/validation-tools": "workspace:*" + "@types/node": "npm:^24.5.2" async: "npm:^3.2.5" bunyan: "npm:^1.8.15" chai: "npm:^4.3.6" chai-as-promised: "npm:^7.1.1" diff-match-patch: "overleaf/diff-match-patch#89805f9c671a77a263fc53461acd62aa7498f688" - esmock: "npm:^2.7.3" + eslint: "npm:^10.4.0" + esmock: "patch:esmock@npm%3A2.7.3#~/.yarn/patches/esmock-npm-2.7.3-83624b28f6.patch" express: "npm:4.22.1" lodash: "npm:^4.18.1" minimist: "npm:^1.2.8" mocha: "npm:^11.1.0" mocha-junit-reporter: "npm:^2.2.1" mocha-multi-reporters: "npm:^1.5.1" + mongodb: "npm:6.12.0" mongodb-legacy: "npm:6.1.3" nock: "npm:^13.5.3" overleaf-editor-core: "workspace:*" @@ -7307,8 +7541,10 @@ __metadata: version: 0.0.0-use.local resolution: "@overleaf/promise-utils@workspace:libraries/promise-utils" dependencies: + "@types/node": "npm:^24.5.2" chai: "npm:^4.3.10" chai-as-promised: "npm:^7.1.1" + eslint: "npm:^10.4.0" mocha: "npm:^11.1.0" mocha-junit-reporter: "npm:^2.2.1" mocha-multi-reporters: "npm:^1.5.1" @@ -7321,7 +7557,10 @@ __metadata: version: 0.0.0-use.local resolution: "@overleaf/ranges-tracker@workspace:libraries/ranges-tracker" dependencies: + "@types/node": "npm:^24.5.2" chai: "npm:^4.3.6" + core-js: "npm:~3.46.0" + eslint: "npm:^10.4.0" mocha: "npm:^11.1.0" mocha-junit-reporter: "npm:^2.2.1" mocha-multi-reporters: "npm:^1.5.1" @@ -7341,6 +7580,7 @@ __metadata: "@overleaf/redis-wrapper": "workspace:*" "@overleaf/settings": "workspace:*" "@overleaf/validation-tools": "workspace:*" + "@types/node": "npm:^24.5.2" async: "npm:^3.2.5" base64id: "npm:0.1.0" bunyan: "npm:^1.8.15" @@ -7349,6 +7589,7 @@ __metadata: connect-redis: "npm:^6.1.3" cookie-parser: "npm:^1.4.6" cookie-signature: "npm:^1.1.0" + eslint: "npm:^10.4.0" express: "npm:4.22.1" express-session: "npm:^1.17.1" lodash: "npm:^4.18.1" @@ -7366,6 +7607,7 @@ __metadata: uid-safe: "npm:^2.1.5" vitest: "npm:4.1.5" ws: "npm:^8.21.0" + zod: "npm:^4.0.0" zod-validation-error: "npm:^4.0.1" languageName: unknown linkType: soft @@ -7376,8 +7618,10 @@ __metadata: dependencies: "@overleaf/logger": "workspace:*" "@overleaf/o-error": "workspace:*" + "@types/node": "npm:^24.5.2" async: "npm:^3.2.5" chai: "npm:^4.3.6" + eslint: "npm:^10.4.0" ioredis: "npm:~4.27.1" mocha: "npm:^11.1.0" mocha-junit-reporter: "npm:^2.2.1" @@ -7404,6 +7648,7 @@ __metadata: adm-zip: "npm:^0.6.0" cypress: "npm:15.12.0" cypress-multi-reporters: "npm:^2.0.5" + eslint: "npm:^10.4.0" isomorphic-git: "npm:^1.33.1" mailtrap: "npm:^4.3.0" mocha: "npm:^11.7.5" @@ -7426,11 +7671,14 @@ __metadata: adm-zip: "npm:^0.6.0" cypress: "npm:15.12.0" cypress-multi-reporters: "npm:^2.0.5" + eslint: "npm:^10.4.0" express: "npm:4.22.1" isomorphic-git: "npm:^1.33.1" js-yaml: "npm:^4.1.1" + mocha: "npm:^11.7.5" mocha-junit-reporter: "npm:^2.2.1" pdfjs-dist: "npm:^5.1.91" + typescript: "npm:^5.0.4" uuid: "npm:^9.0.1" zod-validation-error: "npm:^4.0.1" languageName: unknown @@ -7440,6 +7688,8 @@ __metadata: version: 0.0.0-use.local resolution: "@overleaf/settings@workspace:libraries/settings" dependencies: + "@types/node": "npm:^24.5.2" + eslint: "npm:^10.4.0" mocha: "npm:^11.1.0" mocha-junit-reporter: "npm:^2.2.1" mocha-multi-reporters: "npm:^1.5.1" @@ -7451,8 +7701,10 @@ __metadata: version: 0.0.0-use.local resolution: "@overleaf/stream-utils@workspace:libraries/stream-utils" dependencies: + "@types/node": "npm:^24.5.2" chai: "npm:^4.3.6" chai-as-promised: "npm:^7.1.1" + eslint: "npm:^10.4.0" mocha: "npm:^11.1.0" mocha-junit-reporter: "npm:^2.2.1" mocha-multi-reporters: "npm:^1.5.1" @@ -7470,11 +7722,13 @@ __metadata: "@overleaf/migrations": "workspace:*" "@overleaf/promise-utils": "workspace:*" "@overleaf/settings": "workspace:*" + "@types/node": "npm:^24.5.2" args-js: "npm:0.10.12" async: "npm:^3.2.5" bunyan: "npm:^1.8.15" chai: "npm:^4.3.6" chai-as-promised: "npm:^7.1.1" + eslint: "npm:^10.4.0" express: "npm:4.22.1" install: "npm:^0.13.0" lodash: "npm:^4.18.1" @@ -7503,12 +7757,14 @@ __metadata: "@overleaf/o-error": "workspace:*" "@overleaf/promise-utils": "workspace:*" "@overleaf/settings": "workspace:*" + "@types/node": "npm:^24.5.2" async: "npm:^3.2.5" bunyan: "npm:^1.8.15" chai: "npm:^4.3.6" chai-as-promised: "npm:^7.1.1" chai-http: "npm:4.4.0" dropbox: "npm:^10.34.0" + eslint: "npm:^10.4.0" express: "npm:4.22.1" express-basic-auth: "npm:^1.2.0" ioredis: "npm:^4.16.0" @@ -7516,6 +7772,7 @@ __metadata: lru-cache: "npm:^4.1.5" minimatch: "npm:^10.2.2" minimist: "npm:^1.2.8" + mongodb: "npm:6.12.0" mongodb-legacy: "npm:6.1.3" node-fetch: "npm:^2.7.0" p-limit: "npm:^2.3.0" @@ -7539,17 +7796,21 @@ __metadata: "@overleaf/o-error": "workspace:*" "@overleaf/promise-utils": "workspace:*" "@overleaf/settings": "workspace:*" + "@types/mocha": "npm:^10.0.6" + "@types/node": "npm:^24.5.2" async: "npm:^3.2.5" bunyan: "npm:^1.8.15" chai: "npm:^4.3.6" chai-as-promised: "npm:^7.1.1" - esmock: "npm:^2.7.3" + eslint: "npm:^10.4.0" + esmock: "patch:esmock@npm%3A2.7.3#~/.yarn/patches/esmock-npm-2.7.3-83624b28f6.patch" express: "npm:4.22.1" lodash: "npm:^4.18.1" lru-cache: "npm:^5.1.1" mocha: "npm:^11.1.0" mocha-junit-reporter: "npm:^2.2.1" mocha-multi-reporters: "npm:^1.5.1" + mongodb: "npm:6.12.0" mongodb-legacy: "npm:6.1.3" oauth: "npm:0.9.15" request: "npm:2.88.2" @@ -7564,6 +7825,9 @@ __metadata: resolution: "@overleaf/validation-tools@workspace:libraries/validation-tools" dependencies: "@overleaf/o-error": "workspace:*" + "@types/express": "npm:4.17.23" + "@types/node": "npm:^24.5.2" + eslint: "npm:^10.4.0" mongodb: "npm:^6.12.0" typescript: "npm:^5.0.4" vitest: "npm:4.1.5" @@ -7583,6 +7847,7 @@ __metadata: "@aws-sdk/client-sesv2": "npm:^3.994.0" "@babel/core": "npm:^7.28.5" "@babel/plugin-proposal-decorators": "npm:^7.28.0" + "@babel/plugin-transform-typescript": "npm:^7.28.0" "@babel/preset-env": "npm:^7.28.5" "@babel/preset-react": "npm:^7.28.5" "@babel/preset-typescript": "npm:^7.28.5" @@ -7641,6 +7906,7 @@ __metadata: "@replit/codemirror-indentation-markers": "overleaf/codemirror-indentation-markers#371ce3b56f453a392eb0d3b85ab019c185c68e1f" "@replit/codemirror-vim": "overleaf/codemirror-vim#1bef138382d948018f3f9b8a4d7a70ab61774e4b" "@sentry/browser": "npm:7.46.0" + "@sentry/types": "npm:7.46.0" "@slack/webhook": "npm:^7.0.2" "@storybook/addon-a11y": "npm:10.3.5" "@storybook/addon-designs": "npm:^11.1.3" @@ -7665,15 +7931,19 @@ __metadata: "@types/async": "npm:^3.2.25" "@types/bootstrap": "npm:^5.2.10" "@types/chai": "npm:^4.3.0" + "@types/chai-as-promised": "npm:^8.0.2" "@types/dateformat": "npm:^5.0.3" "@types/diff": "npm:^5.2.3" "@types/dom-speech-recognition": "npm:^0.0.7" "@types/events": "npm:^3.0.3" "@types/express": "npm:^4.17.23" + "@types/lodash": "npm:^4.17.24" + "@types/mdast": "npm:^4.0.4" "@types/minimist": "npm:^1.2.5" "@types/mocha": "npm:^9.1.0" "@types/mocha-each": "npm:^2.0.4" "@types/node": "npm:^24.5.2" + "@types/path-browserify": "npm:^1.0.3" "@types/react": "npm:^18.3.20" "@types/react-color": "npm:^3.0.13" "@types/react-dom": "npm:^18.3.6" @@ -7682,15 +7952,19 @@ __metadata: "@types/react-syntax-highlighter": "npm:^15.5.11" "@types/recurly__recurly-js": "npm:^4.38.0" "@types/sanitize-html": "npm:^2.14.0" + "@types/sinon": "npm:^21.0.1" "@types/sinon-chai": "npm:^3.2.12" "@types/utf-8-validate": "npm:^5.0.2" "@types/uuid": "npm:^10.0.0" + "@typescript-eslint/eslint-plugin": "npm:^8.59.4" + "@typescript-eslint/parser": "npm:^8.59.4" "@uppy/core": "npm:^3.8.0" "@uppy/dashboard": "npm:3.7.1" "@uppy/drag-drop": "npm:3.0.3" "@uppy/file-input": "npm:3.0.4" "@uppy/progress-bar": "npm:3.0.4" "@uppy/react": "npm:3.2.1" + "@uppy/status-bar": "npm:^3.2.5" "@uppy/utils": "npm:^5.7.0" "@uppy/xhr-upload": "npm:3.6.0" "@vitest/coverage-istanbul": "npm:^4.0.17" @@ -7746,6 +8020,8 @@ __metadata: css-minimizer-webpack-plugin: "npm:^8.0.0" csurf: "npm:^1.11.0" csv: "npm:^6.2.5" + csv-parse: "npm:^6.2.1" + csv-stringify: "npm:^6.7.0" cypress: "npm:15.12.0" cypress-multi-reporters: "npm:^2.0.5" cypress-plugin-tab: "npm:^1.0.5" @@ -7759,9 +8035,11 @@ __metadata: email-addresses: "npm:^5.0.0" es6-promise: "npm:^4.2.8" escodegen: "npm:^2.0.0" + eslint: "npm:^10.4.0" eslint-config-prettier: "npm:^10.1.8" eslint-plugin-chai-expect: "npm:^4.1.0" eslint-plugin-chai-friendly: "npm:^1.2.0" + eslint-plugin-cypress: "npm:^4.1.0" eslint-plugin-import: "npm:^2.32.0" eslint-plugin-jsx-a11y: "npm:^6.10.2" eslint-plugin-mocha: "npm:^11.3.0" @@ -7783,6 +8061,7 @@ __metadata: fast-fuzzy: "npm:^1.12.0" fetch-mock: "npm:^12.6.0" file-type: "npm:^21.3.4" + focus-trap: "npm:^8.2.1" focus-trap-react: "npm:^11.0.4" form-data: "npm:^4.0.5" formik: "npm:^2.2.9" @@ -7827,6 +8106,7 @@ __metadata: mocha-junit-reporter: "npm:^2.2.1" mocha-multi-reporters: "npm:^1.5.1" moment: "npm:^2.29.4" + mongodb: "npm:6.12.0" mongodb-legacy: "npm:6.1.3" mongoose: "npm:8.22.1" multer: "npm:2.2.0" @@ -7905,9 +8185,10 @@ __metadata: to-string-loader: "npm:^1.2.0" tough-cookie: "npm:^4.0.0" ts-loader: "npm:^9.5.7" + tslib: "npm:^2.8.1" tsscmp: "npm:^1.0.6" tty-browserify: "npm:^0.0.1" - typescript: "npm:^5.9.3" + typescript: "npm:^5.0.4" uid-safe: "npm:^2.1.5" unified: "npm:^11.0.5" unist-util-visit: "npm:^5.0.0" @@ -8381,7 +8662,7 @@ __metadata: languageName: node linkType: hard -"@popperjs/core@npm:^2.11.8, @popperjs/core@npm:^2.9.2": +"@popperjs/core@npm:*, @popperjs/core@npm:^2.11.8, @popperjs/core@npm:^2.9.2": version: 2.11.8 resolution: "@popperjs/core@npm:2.11.8" checksum: 10c0/4681e682abc006d25eb380d0cf3efc7557043f53b6aea7a5057d0d1e7df849a00e281cd8ea79c902a35a414d7919621fc2ba293ecec05f413598e0b23d5a1e63 @@ -8870,7 +9151,16 @@ __metadata: languageName: node linkType: hard -"@sinonjs/commons@npm:^3.0.1": +"@sinonjs/commons@npm:^2.0.0": + version: 2.0.0 + resolution: "@sinonjs/commons@npm:2.0.0" + dependencies: + type-detect: "npm:4.0.8" + checksum: 10c0/babe3fdfc7dfb810f6918f2ae055032a1c7c18910595f1c6bfda87bb1737c1a57268d4ca78c3d8ad2fa4aae99ff79796fad76be735a5a38ab763c0b3cfad1ae7 + languageName: node + linkType: hard + +"@sinonjs/commons@npm:^3.0.0, @sinonjs/commons@npm:^3.0.1": version: 3.0.1 resolution: "@sinonjs/commons@npm:3.0.1" dependencies: @@ -8879,6 +9169,15 @@ __metadata: languageName: node linkType: hard +"@sinonjs/fake-timers@npm:^11.2.2": + version: 11.3.1 + resolution: "@sinonjs/fake-timers@npm:11.3.1" + dependencies: + "@sinonjs/commons": "npm:^3.0.1" + checksum: 10c0/c4f96ea7c3ab0e1a5fc1e2e1201e984a9302841a9fb10059120ce3b6789dae0f851c8827cf16b052a6f87db9a098cdd36f7067246e7a9b71da1d5a2c3d3a9f3d + languageName: node + linkType: hard + "@sinonjs/fake-timers@npm:^15.3.2": version: 15.4.0 resolution: "@sinonjs/fake-timers@npm:15.4.0" @@ -8897,6 +9196,15 @@ __metadata: languageName: node linkType: hard +"@sinonjs/fake-timers@npm:^9.1.2": + version: 9.1.2 + resolution: "@sinonjs/fake-timers@npm:9.1.2" + dependencies: + "@sinonjs/commons": "npm:^1.7.0" + checksum: 10c0/d9187f9130f03272562ff9845867299c6f7cf15157bbb3e6aca4a1f06d885b0eef54259d0ad41e2f8043dc530b4db730b6c9415b169033e7ba8fed0ad449ceec + languageName: node + linkType: hard + "@sinonjs/formatio@npm:^3.2.1": version: 3.2.2 resolution: "@sinonjs/formatio@npm:3.2.2" @@ -8949,7 +9257,18 @@ __metadata: languageName: node linkType: hard -"@sinonjs/text-encoding@npm:^0.7.1": +"@sinonjs/samsam@npm:^7.0.1": + version: 7.0.1 + resolution: "@sinonjs/samsam@npm:7.0.1" + dependencies: + "@sinonjs/commons": "npm:^2.0.0" + lodash.get: "npm:^4.4.2" + type-detect: "npm:^4.0.8" + checksum: 10c0/cc5e61e102dfa837ea3dd0102c924636de8a43e39d3e5ea009b57095be15fad807535feb8b2a3e90686f022451ab2dfa49c99167d68c661e7fab19a07227d467 + languageName: node + linkType: hard + +"@sinonjs/text-encoding@npm:^0.7.1, @sinonjs/text-encoding@npm:^0.7.2": version: 0.7.3 resolution: "@sinonjs/text-encoding@npm:0.7.3" checksum: 10c0/b112d1e97af7f99fbdc63c7dbcd35d6a60764dfec85cfcfff532e55cce8ecd8453f9fa2139e70aea47142c940fd90cd201d19f370b9a0141700d8a6de3116815 @@ -10326,6 +10645,15 @@ __metadata: languageName: node linkType: hard +"@types/chai-as-promised@npm:^8.0.2": + version: 8.0.2 + resolution: "@types/chai-as-promised@npm:8.0.2" + dependencies: + "@types/chai": "npm:*" + checksum: 10c0/94492694121ba3c8b16e61be5f3d91bf1996c37e7b5f85363f30e160344b32d42b7ad9606198e57a3b3c06eb3b36e345ac0494e7556fc406433d8e13f1b83a77 + languageName: node + linkType: hard + "@types/chai@npm:*, @types/chai@npm:^5.2.2": version: 5.2.3 resolution: "@types/chai@npm:5.2.3" @@ -10602,6 +10930,15 @@ __metadata: languageName: node linkType: hard +"@types/ioredis@npm:^4.28.10": + version: 4.28.10 + resolution: "@types/ioredis@npm:4.28.10" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/ff680fef6750721c465ee9d6060d3229e49e5b217d68503c4972c4b869b8f84b91cbd9b7d5195a40fb0bff6ab9a4f5e24a2cc17a368ddb0bfe2dfd4eb5fc1872 + languageName: node + linkType: hard + "@types/is-core-module@npm:^2.2.2": version: 2.2.2 resolution: "@types/is-core-module@npm:2.2.2" @@ -10664,7 +11001,7 @@ __metadata: languageName: node linkType: hard -"@types/lodash@npm:^4.14.175": +"@types/lodash@npm:^4.14.175, @types/lodash@npm:^4.17.24": version: 4.17.24 resolution: "@types/lodash@npm:4.17.24" checksum: 10c0/b72f60d4daacdad1fa643edb3faba204c02a01eb1ac00a83ff73496a6d236fc55e459c06106e8ced42277dba932d087d8fc090f8de4ef590d3f91e6d6f7ce85a @@ -10678,7 +11015,7 @@ __metadata: languageName: node linkType: hard -"@types/mdast@npm:^4.0.0": +"@types/mdast@npm:^4.0.0, @types/mdast@npm:^4.0.4": version: 4.0.4 resolution: "@types/mdast@npm:4.0.4" dependencies: @@ -11098,7 +11435,7 @@ __metadata: languageName: node linkType: hard -"@types/sinon@npm:*": +"@types/sinon@npm:*, @types/sinon@npm:^21.0.1": version: 21.0.1 resolution: "@types/sinon@npm:21.0.1" dependencies: @@ -16392,7 +16729,7 @@ __metadata: languageName: node linkType: hard -"diff@npm:^5.1.0": +"diff@npm:^5.0.0, diff@npm:^5.1.0": version: 5.2.2 resolution: "diff@npm:5.2.2" checksum: 10c0/52da594c54e9033423da26984b1449ae6accd782d5afc4431c9a192a8507ddc83120fe8f925d7220b9da5b5963c7b6f5e46add3660a00cb36df7a13420a09d4b @@ -17754,13 +18091,20 @@ __metadata: languageName: node linkType: hard -"esmock@npm:^2.7.3": +"esmock@npm:2.7.3": version: 2.7.3 resolution: "esmock@npm:2.7.3" checksum: 10c0/71aebd7b82ad11bab56b9ff3897e105c0fc51eef9e9268c9406c3ca14401eddc8a69f2f381ae82e24d039452de5fc7f32ec694fdf3b1c6d724af22cf69e5f9dd languageName: node linkType: hard +"esmock@patch:esmock@npm%3A2.7.3#~/.yarn/patches/esmock-npm-2.7.3-83624b28f6.patch": + version: 2.7.3 + resolution: "esmock@patch:esmock@npm%3A2.7.3#~/.yarn/patches/esmock-npm-2.7.3-83624b28f6.patch::version=2.7.3&hash=acc414" + checksum: 10c0/67532f6510599549060545aabd4b64e080a30d98f1ec91f697058e343a14bd1845a4cdf452a38335f44aad827a5dee0e86d6e0e16853aad0b65235dcd0c55e18 + languageName: node + linkType: hard + "esniff@npm:^2.0.1": version: 2.0.1 resolution: "esniff@npm:2.0.1" @@ -18749,6 +19093,15 @@ __metadata: languageName: node linkType: hard +"focus-trap@npm:^8.2.1": + version: 8.2.2 + resolution: "focus-trap@npm:8.2.2" + dependencies: + tabbable: "npm:^6.5.0" + checksum: 10c0/8f5e15aebbf447b394f4978f46339fd8f2f746d535ff957ab7045442bf6631d3d34be8b603d4402e57721fe2e74e3ea837f57f9c8553bb5e55b20e3f2609e191 + languageName: node + linkType: hard + "follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.16.0": version: 1.16.0 resolution: "follow-redirects@npm:1.16.0" @@ -18935,8 +19288,10 @@ __metadata: "@overleaf/fetch-utils": "workspace:*" "@overleaf/logger": "workspace:*" "@overleaf/metrics": "workspace:*" + "@types/node": "npm:^24.5.2" chai: "npm:^4.3.6" chai-as-promised: "npm:^7.1.1" + eslint: "npm:^10.4.0" express: "npm:4.22.1" is-valid-hostname: "npm:^1.0.2" mocha: "npm:^11.1.0" @@ -20798,6 +21153,13 @@ __metadata: languageName: node linkType: hard +"ipaddr.js@npm:^2.2.0": + version: 2.4.0 + resolution: "ipaddr.js@npm:2.4.0" + checksum: 10c0/47c2f17677b40054ca50a09e1228cf818c0d02d4474c2e0e29232c6668b3c4d51a3cfc19d1e17897d7baf4d933b3111d6bdf5cfbe55ab184165469a75f2bf177 + languageName: node + linkType: hard + "is-absolute-url@npm:^3.0.3": version: 3.0.3 resolution: "is-absolute-url@npm:3.0.3" @@ -21664,7 +22026,7 @@ __metadata: languageName: node linkType: hard -"jquery@npm:^3.7.1": +"jquery@npm:^3, jquery@npm:^3.7.1": version: 3.7.1 resolution: "jquery@npm:3.7.1" checksum: 10c0/808cfbfb758438560224bf26e17fcd5afc7419170230c810dd11f5c1792e2263e2970cca8d659eb84fcd9acc301edb6d310096e450277d54be4f57071b0c82d9 @@ -22112,6 +22474,13 @@ __metadata: languageName: node linkType: hard +"just-extend@npm:^6.2.0": + version: 6.2.0 + resolution: "just-extend@npm:6.2.0" + checksum: 10c0/d41cbdb6d85b986d4deaf2144d81d4f7266cd408fc95189d046d63f610c2dc486b141aeb6ef319c2d76fe904d45a6bb31f19b098ff0427c35688e0c383fc0511 + languageName: node + linkType: hard + "just-once@npm:1.1.0": version: 1.1.0 resolution: "just-once@npm:1.1.0" @@ -22298,7 +22667,9 @@ __metadata: "@overleaf/fetch-utils": "workspace:*" "@overleaf/o-error": "workspace:*" "@popperjs/core": "npm:^2.11.8" + "@testing-library/dom": "npm:^10.4.0" "@testing-library/react": "npm:^16.3.2" + "@types/react": "npm:^18.3.1" "@vitejs/plugin-react": "npm:^4.3.4" babel-loader: "npm:^10.1.1" babel-plugin-react-transform: "npm:^3.0.0" @@ -22350,6 +22721,7 @@ __metadata: style-loader: "npm:^4.0.0" throng: "npm:^4.0.0" url-loader: "npm:^4.1.1" + vite: "npm:^6.0.0" vitest: "npm:4.1.5" webpack: "npm:^5.106.2" webpack-cli: "npm:^7.0.2" @@ -24792,6 +25164,19 @@ __metadata: languageName: node linkType: hard +"nise@npm:^5.1.2": + version: 5.1.9 + resolution: "nise@npm:5.1.9" + dependencies: + "@sinonjs/commons": "npm:^3.0.0" + "@sinonjs/fake-timers": "npm:^11.2.2" + "@sinonjs/text-encoding": "npm:^0.7.2" + just-extend: "npm:^6.2.0" + path-to-regexp: "npm:^6.2.1" + checksum: 10c0/a44318e6de738b34a1f51b4b478f97f5b40a5a27175be4bf13f6e5b8e67aa70d0b3f51c77a966d6617fccdc3b436c675a89be57424833e6d8a290367faa66b28 + languageName: node + linkType: hard + "no-case@npm:^3.0.4": version: 3.0.4 resolution: "no-case@npm:3.0.4" @@ -25071,6 +25456,8 @@ __metadata: "npm-overrides-helper@workspace:tools/npm-overrides-helper": version: 0.0.0-use.local resolution: "npm-overrides-helper@workspace:tools/npm-overrides-helper" + dependencies: + eslint: "npm:^10.4.0" languageName: unknown linkType: soft @@ -25437,6 +25824,7 @@ __metadata: "@types/is-core-module": "npm:^2.2.2" "@types/minimist": "npm:^1.2.5" "@types/node": "npm:^24.5.2" + eslint: "npm:^10.4.0" is-core-module: "npm:^2.16.1" minimist: "npm:^1.2.8" npm-check-updates: "npm:^18.1.1" @@ -25458,9 +25846,13 @@ __metadata: "@overleaf/o-error": "workspace:*" "@overleaf/validation-tools": "workspace:*" "@types/check-types": "npm:^7.3.7" + "@types/lodash": "npm:^4.17.24" + "@types/mocha": "npm:^10.0.6" + "@types/node": "npm:^24.5.2" "@types/path-browserify": "npm:^1.0.3" chai: "npm:^3.3.0" check-types: "npm:^5.1.0" + eslint: "npm:^10.4.0" lodash: "npm:^4.18.1" mocha: "npm:^11.1.0" mocha-junit-reporter: "npm:^2.2.1" @@ -25476,7 +25868,9 @@ __metadata: version: 0.0.0-use.local resolution: "overleaf-editor@workspace:services/history-v1" dependencies: + "@aws-sdk/client-s3": "npm:^3.994.0" "@google-cloud/secret-manager": "npm:^5.6.0" + "@google-cloud/storage": "npm:^7.19.0" "@overleaf/fetch-utils": "workspace:*" "@overleaf/logger": "workspace:*" "@overleaf/metrics": "workspace:*" @@ -25489,6 +25883,9 @@ __metadata: "@overleaf/settings": "workspace:*" "@overleaf/stream-utils": "npm:^0.1.0" "@overleaf/validation-tools": "workspace:*" + "@types/chai-as-promised": "npm:^7.1.8" + "@types/mocha": "npm:^10.0.6" + "@types/node": "npm:^24.5.2" archiver: "npm:^5.3.0" basic-auth: "npm:^2.0.1" benny: "npm:^3.7.1" @@ -25501,6 +25898,7 @@ __metadata: check-types: "npm:^11.1.2" command-line-args: "npm:^3.0.3" config: "npm:^3.3.12" + eslint: "npm:^10.4.0" express: "npm:4.22.1" fs-extra: "npm:^9.0.1" generic-pool: "npm:^2.1.1" @@ -25556,9 +25954,129 @@ __metadata: eslint-plugin-promise: "npm:^7.2.1" eslint-plugin-unicorn: "npm:^56.0.0" globals: "npm:^17.6.0" + js-yaml: "npm:^4.1.1" prettier: "npm:3.7.4" prettier-plugin-groovy: "npm:0.2.1" typescript: "npm:^5.9.3" + dependenciesMeta: + "@babel/helper-string-parser@7.27.1": + unplugged: true + "@babel/helper-validator-identifier@7.28.5": + unplugged: true + "@babel/parser@7.29.2": + unplugged: true + "@babel/types@7.29.0": + unplugged: true + "@prettier/plugin-pug@3.4.2": + unplugged: true + acorn@7.4.1: + unplugged: true + asap@2.0.6: + unplugged: true + assert-never@1.4.0: + unplugged: true + async-function@1.0.0: + unplugged: true + async-generator-function@1.0.0: + unplugged: true + babel-walk@3.0.0-canary-5: + unplugged: true + call-bind-apply-helpers@1.0.2: + unplugged: true + call-bound@1.0.4: + unplugged: true + character-parser@2.2.0: + unplugged: true + constantinople@4.0.1: + unplugged: true + cypress-multi-reporters@2.0.5: + unplugged: true + doctypes@1.1.0: + unplugged: true + dunder-proto@1.0.1: + unplugged: true + es-define-property@1.0.1: + unplugged: true + es-errors@1.3.0: + unplugged: true + es-object-atoms@1.1.1: + unplugged: true + esmock@2.7.3: + unplugged: true + function-bind@1.1.2: + unplugged: true + generator-function@2.0.1: + unplugged: true + get-intrinsic@1.3.1: + unplugged: true + get-proto@1.0.1: + unplugged: true + gopd@1.2.0: + unplugged: true + has-symbols@1.1.0: + unplugged: true + has-tostringtag@1.0.2: + unplugged: true + hasown@2.0.2: + unplugged: true + is-core-module@2.16.1: + unplugged: true + is-expression@4.0.0: + unplugged: true + is-promise@2.2.2: + unplugged: true + is-regex@1.2.1: + unplugged: true + js-stringify@1.0.2: + unplugged: true + jstransformer@1.0.0: + unplugged: true + math-intrinsics@1.1.0: + unplugged: true + object-assign@4.1.1: + unplugged: true + path-parse@1.0.7: + unplugged: true + prettier-plugin-groovy@0.2.1: + unplugged: true + prettier@3.7.4: + unplugged: true + promise@7.3.1: + unplugged: true + pug-attrs@3.0.0: + unplugged: true + pug-code-gen@3.0.4: + unplugged: true + pug-error@2.1.0: + unplugged: true + pug-filters@4.0.0: + unplugged: true + pug-lexer@5.0.1: + unplugged: true + pug-linker@4.0.0: + unplugged: true + pug-load@3.0.0: + unplugged: true + pug-parser@6.0.0: + unplugged: true + pug-runtime@3.0.1: + unplugged: true + pug-strip-comments@2.0.0: + unplugged: true + pug-walk@2.0.0: + unplugged: true + pug@3.0.3: + unplugged: true + resolve@1.22.12: + unplugged: true + supports-preserve-symlinks-flag@1.0.0: + unplugged: true + token-stream@1.0.0: + unplugged: true + void-elements@3.1.0: + unplugged: true + with@7.0.2: + unplugged: true languageName: unknown linkType: soft @@ -26165,6 +26683,13 @@ __metadata: languageName: node linkType: hard +"path-to-regexp@npm:^6.2.1": + version: 6.3.0 + resolution: "path-to-regexp@npm:6.3.0" + checksum: 10c0/73b67f4638b41cde56254e6354e46ae3a2ebc08279583f6af3d96fe4664fc75788f74ed0d18ca44fa4a98491b69434f9eee73b97bb5314bd1b5adb700f5c18d6 + languageName: node + linkType: hard + "path-to-regexp@npm:~0.1.12": version: 0.1.13 resolution: "path-to-regexp@npm:0.1.13" @@ -27763,7 +28288,7 @@ __metadata: languageName: node linkType: hard -"pug-filters@npm:^4.0.0": +"pug-filters@npm:*, pug-filters@npm:^4.0.0": version: 4.0.0 resolution: "pug-filters@npm:4.0.0" dependencies: @@ -27787,7 +28312,7 @@ __metadata: languageName: node linkType: hard -"pug-linker@npm:^4.0.0": +"pug-linker@npm:*, pug-linker@npm:^4.0.0": version: 4.0.0 resolution: "pug-linker@npm:4.0.0" dependencies: @@ -27797,7 +28322,7 @@ __metadata: languageName: node linkType: hard -"pug-load@npm:^3.0.0": +"pug-load@npm:*, pug-load@npm:^3.0.0": version: 3.0.0 resolution: "pug-load@npm:3.0.0" dependencies: @@ -27807,7 +28332,7 @@ __metadata: languageName: node linkType: hard -"pug-parser@npm:^6.0.0": +"pug-parser@npm:*, pug-parser@npm:^6.0.0": version: 6.0.0 resolution: "pug-parser@npm:6.0.0" dependencies: @@ -27817,14 +28342,14 @@ __metadata: languageName: node linkType: hard -"pug-runtime@npm:^3.0.0, pug-runtime@npm:^3.0.1": +"pug-runtime@npm:*, pug-runtime@npm:^3.0.0, pug-runtime@npm:^3.0.1": version: 3.0.1 resolution: "pug-runtime@npm:3.0.1" checksum: 10c0/0db8166d2e17695a6941d1de81dcb21c8a52921299b1e03bf6a0a3d2b0036b51cf98101b3937b731c745e8d3e0268cb0b728c02f61a80a25fcfaa15c594fb1be languageName: node linkType: hard -"pug-strip-comments@npm:^2.0.0": +"pug-strip-comments@npm:*, pug-strip-comments@npm:^2.0.0": version: 2.0.0 resolution: "pug-strip-comments@npm:2.0.0" dependencies: @@ -27833,7 +28358,7 @@ __metadata: languageName: node linkType: hard -"pug-walk@npm:^2.0.0": +"pug-walk@npm:*, pug-walk@npm:^2.0.0": version: 2.0.0 resolution: "pug-walk@npm:2.0.0" checksum: 10c0/005d63177bcf057f5a618b182f6d4600afb039200b07a381a0d89288a2b3126e763a0a6c40b758eab0731c8e63cad1bbcb46d96803b9ae9cfc879f6ef5a0f8f4 @@ -28772,7 +29297,7 @@ __metadata: languageName: node linkType: hard -"reflect-metadata@npm:^0.2.2": +"reflect-metadata@npm:*, reflect-metadata@npm:^0.2.2": version: 0.2.2 resolution: "reflect-metadata@npm:0.2.2" checksum: 10c0/1cd93a15ea291e420204955544637c264c216e7aac527470e393d54b4bb075f10a17e60d8168ec96600c7e0b9fcc0cb0bb6e91c3fbf5b0d8c9056f04e6ac1ec2 @@ -30239,6 +30764,20 @@ __metadata: languageName: node linkType: hard +"sinon@npm:^14.0.0": + version: 14.0.2 + resolution: "sinon@npm:14.0.2" + dependencies: + "@sinonjs/commons": "npm:^2.0.0" + "@sinonjs/fake-timers": "npm:^9.1.2" + "@sinonjs/samsam": "npm:^7.0.1" + diff: "npm:^5.0.0" + nise: "npm:^5.1.2" + supports-color: "npm:^7.2.0" + checksum: 10c0/cef92d9a018e08c22812f04038eb33972e5386253f897c3efc4ff26d80e354d17a1d8123aed443c03ba94d85c4c3eb0660c6d3f6f8460d7d0af4d6bd3e058ae0 + languageName: node + linkType: hard + "sinon@npm:^21.1.0": version: 21.1.2 resolution: "sinon@npm:21.1.2" @@ -31309,7 +31848,7 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^7.0.0, supports-color@npm:^7.1.0": +"supports-color@npm:^7.0.0, supports-color@npm:^7.1.0, supports-color@npm:^7.2.0": version: 7.2.0 resolution: "supports-color@npm:7.2.0" dependencies: @@ -31404,6 +31943,13 @@ __metadata: languageName: node linkType: hard +"tabbable@npm:^6.5.0": + version: 6.5.0 + resolution: "tabbable@npm:6.5.0" + checksum: 10c0/7d778af05a3093800265831198cad9d0024f3d65cdd4405007490f7430b42ff4e80060b4679f45281fb96ddbddc5fb895e8ea36e3ebdc811051e14acc9c7c02c + languageName: node + linkType: hard + "table@npm:^6.9.0": version: 6.9.0 resolution: "table@npm:6.9.0" @@ -31528,15 +32074,15 @@ __metadata: linkType: hard "tar@npm:^7.5.4": - version: 7.5.16 - resolution: "tar@npm:7.5.16" + version: 7.5.19 + resolution: "tar@npm:7.5.19" dependencies: "@isaacs/fs-minipass": "npm:^4.0.0" chownr: "npm:^3.0.0" minipass: "npm:^7.1.2" minizlib: "npm:^3.1.0" yallist: "npm:^5.0.0" - checksum: 10c0/4f37f3c4bd2ca2755fd736a5df1d573c1a868ec1b1e893346aeafa95ac510f9e2fd1469420bd866cc7904799e5bd4ac62b5d4f03fe27747d6e1e373b44505c5c + checksum: 10c0/7022e8cb04a8ceccc0689f2c731743fa2aab2e3c3f559f7dbc37b65ef7d5913049b427284eded2ec0765c5db5ff72dd7939fe2ae15785ff422cef2116c95d798 languageName: node linkType: hard @@ -33893,8 +34439,10 @@ __metadata: dependencies: algoliasearch: "npm:4.19.1" chai-as-promised: "npm:^8.0.2" + eslint: "npm:^10.4.0" lodash: "npm:^4.18.1" sanitize-html: "npm:^2.17.4" + typescript: "npm:^5.0.4" vitest: "npm:^4.0.0" languageName: unknown linkType: soft @@ -34035,7 +34583,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.18.0, ws@npm:^8.18.3, ws@npm:^8.21.0, ws@npm:^8.5.0": +"ws@npm:*, ws@npm:^8.18.0, ws@npm:^8.18.3, ws@npm:^8.21.0, ws@npm:^8.5.0": version: 8.21.0 resolution: "ws@npm:8.21.0" peerDependencies: