From 2f73548701c3f0b0a602933cf2173aa4a2dcc0f3 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Tue, 29 Aug 2023 15:43:58 +0900 Subject: [PATCH 01/70] fix(tuna): handle `playPaused` (#1) --- plugins/tuna-obs/back.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plugins/tuna-obs/back.js b/plugins/tuna-obs/back.js index 5b3eec65..f38ab3a0 100644 --- a/plugins/tuna-obs/back.js +++ b/plugins/tuna-obs/back.js @@ -36,6 +36,12 @@ module.exports = async (win) => { data.progress = secToMilisec(t); post(data); }); + ipcMain.on('playPaused', (_, { isPaused, elapsedSeconds }) => { + if (!data.title) return; + data.status = isPaused ? 'stopped' : 'playing'; + data.progress = secToMilisec(elapsedSeconds); + post(data); + }); registerCallback((songInfo) => { if (!songInfo.title && !songInfo.artist) { From c837f104f75270ef29e01c68bed3f6ca8962f866 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Tue, 29 Aug 2023 16:53:39 +0900 Subject: [PATCH 02/70] bump deps version, remove yarn --- ...electron-is-dev-npm-2.0.0-9d41637d91.patch | 24 - .../plugins/@yarnpkg/plugin-after-install.cjs | 9 - .yarn/releases/yarn-3.4.1.cjs | 873 -- .yarnrc.yml | 9 - package-lock.json | 11232 ++++++++++++++++ package.json | 65 +- yarn.lock | 7389 ---------- 7 files changed, 11263 insertions(+), 8338 deletions(-) delete mode 100644 .yarn/patches/electron-is-dev-npm-2.0.0-9d41637d91.patch delete mode 100644 .yarn/plugins/@yarnpkg/plugin-after-install.cjs delete mode 100755 .yarn/releases/yarn-3.4.1.cjs delete mode 100644 .yarnrc.yml create mode 100644 package-lock.json delete mode 100644 yarn.lock diff --git a/.yarn/patches/electron-is-dev-npm-2.0.0-9d41637d91.patch b/.yarn/patches/electron-is-dev-npm-2.0.0-9d41637d91.patch deleted file mode 100644 index ae749982..00000000 --- a/.yarn/patches/electron-is-dev-npm-2.0.0-9d41637d91.patch +++ /dev/null @@ -1,24 +0,0 @@ -diff --git a/index.js b/index.js -index c8f2fd4467c11b484fe654f7f250e2ba37e8100d..c9ae1ed3d3c7683b14dfe0eee801f5a07585d2aa 100644 ---- a/index.js -+++ b/index.js -@@ -5,7 +5,16 @@ if (typeof electron === 'string') { - throw new TypeError('Not running in an Electron environment!'); - } - --const isEnvSet = 'ELECTRON_IS_DEV' in process.env; --const getFromEnv = Number.parseInt(process.env.ELECTRON_IS_DEV, 10) === 1; -+const isDev = () => { -+ if ('ELECTRON_IS_DEV' in process.env) { -+ return Number.parseInt(process.env.ELECTRON_IS_DEV, 10) === 1; -+ } - --module.exports = isEnvSet ? getFromEnv : !electron.app.isPackaged; -+ if (process.type === 'browser') { -+ return !electron.app.isPackaged; -+ } -+ -+ return 'npm_package_name' in process.env; -+}; -+ -+module.exports = isDev(); diff --git a/.yarn/plugins/@yarnpkg/plugin-after-install.cjs b/.yarn/plugins/@yarnpkg/plugin-after-install.cjs deleted file mode 100644 index 070ea99c..00000000 --- a/.yarn/plugins/@yarnpkg/plugin-after-install.cjs +++ /dev/null @@ -1,9 +0,0 @@ -/* eslint-disable */ -//prettier-ignore -module.exports = { -name: "@yarnpkg/plugin-after-install", -factory: function (require) { -var plugin=(()=>{var g=Object.create,r=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var k=Object.getPrototypeOf,y=Object.prototype.hasOwnProperty;var I=t=>r(t,"__esModule",{value:!0});var i=t=>{if(typeof require!="undefined")return require(t);throw new Error('Dynamic require of "'+t+'" is not supported')};var h=(t,o)=>{for(var e in o)r(t,e,{get:o[e],enumerable:!0})},w=(t,o,e)=>{if(o&&typeof o=="object"||typeof o=="function")for(let n of C(o))!y.call(t,n)&&n!=="default"&&r(t,n,{get:()=>o[n],enumerable:!(e=x(o,n))||e.enumerable});return t},a=t=>w(I(r(t!=null?g(k(t)):{},"default",t&&t.__esModule&&"default"in t?{get:()=>t.default,enumerable:!0}:{value:t,enumerable:!0})),t);var j={};h(j,{default:()=>b});var c=a(i("@yarnpkg/core")),m={afterInstall:{description:"Hook that will always run after install",type:c.SettingsType.STRING,default:""}};var u=a(i("clipanion")),d=a(i("@yarnpkg/core"));var p=a(i("@yarnpkg/shell")),l=async(t,o)=>{var f;let e=t.get("afterInstall"),n=!!((f=t.projectCwd)==null?void 0:f.endsWith(`dlx-${process.pid}`));return e&&!n?(o&&console.log("Running `afterInstall` hook..."),(0,p.execute)(e,[],{cwd:t.projectCwd||void 0})):0};var s=class extends u.Command{async execute(){let o=await d.Configuration.find(this.context.cwd,this.context.plugins);return l(o,!1)}};s.paths=[["after-install"]];var P={configuration:m,commands:[s],hooks:{afterAllInstalled:async t=>{if(await l(t.configuration,!0))throw new Error("The `afterInstall` hook failed, see output above.")}}},b=P;return j;})(); -return plugin; -} -}; diff --git a/.yarn/releases/yarn-3.4.1.cjs b/.yarn/releases/yarn-3.4.1.cjs deleted file mode 100755 index 2bdb752d..00000000 --- a/.yarn/releases/yarn-3.4.1.cjs +++ /dev/null @@ -1,873 +0,0 @@ -#!/usr/bin/env node -/* eslint-disable */ -//prettier-ignore -(()=>{var Mue=Object.create;var Wb=Object.defineProperty;var Kue=Object.getOwnPropertyDescriptor;var Uue=Object.getOwnPropertyNames;var Hue=Object.getPrototypeOf,Gue=Object.prototype.hasOwnProperty;var J=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw new Error('Dynamic require of "'+r+'" is not supported')});var Yue=(r,e)=>()=>(r&&(e=r(r=0)),e);var w=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),ut=(r,e)=>{for(var t in e)Wb(r,t,{get:e[t],enumerable:!0})},jue=(r,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Uue(e))!Gue.call(r,n)&&n!==t&&Wb(r,n,{get:()=>e[n],enumerable:!(i=Kue(e,n))||i.enumerable});return r};var Pe=(r,e,t)=>(t=r!=null?Mue(Hue(r)):{},jue(e||!r||!r.__esModule?Wb(t,"default",{value:r,enumerable:!0}):t,r));var _1=w((O7e,X1)=>{X1.exports=V1;V1.sync=uge;var W1=J("fs");function cge(r,e){var t=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT;if(!t||(t=t.split(";"),t.indexOf("")!==-1))return!0;for(var i=0;i{tK.exports=$1;$1.sync=gge;var Z1=J("fs");function $1(r,e,t){Z1.stat(r,function(i,n){t(i,i?!1:eK(n,e))})}function gge(r,e){return eK(Z1.statSync(r),e)}function eK(r,e){return r.isFile()&&fge(r,e)}function fge(r,e){var t=r.mode,i=r.uid,n=r.gid,s=e.uid!==void 0?e.uid:process.getuid&&process.getuid(),o=e.gid!==void 0?e.gid:process.getgid&&process.getgid(),a=parseInt("100",8),l=parseInt("010",8),c=parseInt("001",8),u=a|l,g=t&c||t&l&&n===o||t&a&&i===s||t&u&&s===0;return g}});var nK=w((U7e,iK)=>{var K7e=J("fs"),_E;process.platform==="win32"||global.TESTING_WINDOWS?_E=_1():_E=rK();iK.exports=uS;uS.sync=hge;function uS(r,e,t){if(typeof e=="function"&&(t=e,e={}),!t){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(i,n){uS(r,e||{},function(s,o){s?n(s):i(o)})})}_E(r,e||{},function(i,n){i&&(i.code==="EACCES"||e&&e.ignoreErrors)&&(i=null,n=!1),t(i,n)})}function hge(r,e){try{return _E.sync(r,e||{})}catch(t){if(e&&e.ignoreErrors||t.code==="EACCES")return!1;throw t}}});var uK=w((H7e,cK)=>{var Ig=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",sK=J("path"),pge=Ig?";":":",oK=nK(),aK=r=>Object.assign(new Error(`not found: ${r}`),{code:"ENOENT"}),AK=(r,e)=>{let t=e.colon||pge,i=r.match(/\//)||Ig&&r.match(/\\/)?[""]:[...Ig?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(t)],n=Ig?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",s=Ig?n.split(t):[""];return Ig&&r.indexOf(".")!==-1&&s[0]!==""&&s.unshift(""),{pathEnv:i,pathExt:s,pathExtExe:n}},lK=(r,e,t)=>{typeof e=="function"&&(t=e,e={}),e||(e={});let{pathEnv:i,pathExt:n,pathExtExe:s}=AK(r,e),o=[],a=c=>new Promise((u,g)=>{if(c===i.length)return e.all&&o.length?u(o):g(aK(r));let f=i[c],h=/^".*"$/.test(f)?f.slice(1,-1):f,p=sK.join(h,r),C=!h&&/^\.[\\\/]/.test(r)?r.slice(0,2)+p:p;u(l(C,c,0))}),l=(c,u,g)=>new Promise((f,h)=>{if(g===n.length)return f(a(u+1));let p=n[g];oK(c+p,{pathExt:s},(C,y)=>{if(!C&&y)if(e.all)o.push(c+p);else return f(c+p);return f(l(c,u,g+1))})});return t?a(0).then(c=>t(null,c),t):a(0)},dge=(r,e)=>{e=e||{};let{pathEnv:t,pathExt:i,pathExtExe:n}=AK(r,e),s=[];for(let o=0;o{"use strict";var gK=(r={})=>{let e=r.env||process.env;return(r.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(i=>i.toUpperCase()==="PATH")||"Path"};gS.exports=gK;gS.exports.default=gK});var CK=w((Y7e,dK)=>{"use strict";var hK=J("path"),Cge=uK(),mge=fK();function pK(r,e){let t=r.options.env||process.env,i=process.cwd(),n=r.options.cwd!=null,s=n&&process.chdir!==void 0&&!process.chdir.disabled;if(s)try{process.chdir(r.options.cwd)}catch{}let o;try{o=Cge.sync(r.command,{path:t[mge({env:t})],pathExt:e?hK.delimiter:void 0})}catch{}finally{s&&process.chdir(i)}return o&&(o=hK.resolve(n?r.options.cwd:"",o)),o}function Ege(r){return pK(r)||pK(r,!0)}dK.exports=Ege});var mK=w((j7e,hS)=>{"use strict";var fS=/([()\][%!^"`<>&|;, *?])/g;function Ige(r){return r=r.replace(fS,"^$1"),r}function yge(r,e){return r=`${r}`,r=r.replace(/(\\*)"/g,'$1$1\\"'),r=r.replace(/(\\*)$/,"$1$1"),r=`"${r}"`,r=r.replace(fS,"^$1"),e&&(r=r.replace(fS,"^$1")),r}hS.exports.command=Ige;hS.exports.argument=yge});var IK=w((q7e,EK)=>{"use strict";EK.exports=/^#!(.*)/});var wK=w((J7e,yK)=>{"use strict";var wge=IK();yK.exports=(r="")=>{let e=r.match(wge);if(!e)return null;let[t,i]=e[0].replace(/#! ?/,"").split(" "),n=t.split("/").pop();return n==="env"?i:i?`${n} ${i}`:n}});var QK=w((W7e,BK)=>{"use strict";var pS=J("fs"),Bge=wK();function Qge(r){let t=Buffer.alloc(150),i;try{i=pS.openSync(r,"r"),pS.readSync(i,t,0,150,0),pS.closeSync(i)}catch{}return Bge(t.toString())}BK.exports=Qge});var xK=w((z7e,vK)=>{"use strict";var bge=J("path"),bK=CK(),SK=mK(),Sge=QK(),vge=process.platform==="win32",xge=/\.(?:com|exe)$/i,Pge=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function Dge(r){r.file=bK(r);let e=r.file&&Sge(r.file);return e?(r.args.unshift(r.file),r.command=e,bK(r)):r.file}function kge(r){if(!vge)return r;let e=Dge(r),t=!xge.test(e);if(r.options.forceShell||t){let i=Pge.test(e);r.command=bge.normalize(r.command),r.command=SK.command(r.command),r.args=r.args.map(s=>SK.argument(s,i));let n=[r.command].concat(r.args).join(" ");r.args=["/d","/s","/c",`"${n}"`],r.command=process.env.comspec||"cmd.exe",r.options.windowsVerbatimArguments=!0}return r}function Rge(r,e,t){e&&!Array.isArray(e)&&(t=e,e=null),e=e?e.slice(0):[],t=Object.assign({},t);let i={command:r,args:e,options:t,file:void 0,original:{command:r,args:e}};return t.shell?i:kge(i)}vK.exports=Rge});var kK=w((V7e,DK)=>{"use strict";var dS=process.platform==="win32";function CS(r,e){return Object.assign(new Error(`${e} ${r.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${r.command}`,path:r.command,spawnargs:r.args})}function Fge(r,e){if(!dS)return;let t=r.emit;r.emit=function(i,n){if(i==="exit"){let s=PK(n,e,"spawn");if(s)return t.call(r,"error",s)}return t.apply(r,arguments)}}function PK(r,e){return dS&&r===1&&!e.file?CS(e.original,"spawn"):null}function Nge(r,e){return dS&&r===1&&!e.file?CS(e.original,"spawnSync"):null}DK.exports={hookChildProcess:Fge,verifyENOENT:PK,verifyENOENTSync:Nge,notFoundError:CS}});var IS=w((X7e,yg)=>{"use strict";var RK=J("child_process"),mS=xK(),ES=kK();function FK(r,e,t){let i=mS(r,e,t),n=RK.spawn(i.command,i.args,i.options);return ES.hookChildProcess(n,i),n}function Lge(r,e,t){let i=mS(r,e,t),n=RK.spawnSync(i.command,i.args,i.options);return n.error=n.error||ES.verifyENOENTSync(n.status,i),n}yg.exports=FK;yg.exports.spawn=FK;yg.exports.sync=Lge;yg.exports._parse=mS;yg.exports._enoent=ES});var LK=w((_7e,NK)=>{"use strict";function Tge(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function Ml(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,Ml)}Tge(Ml,Error);Ml.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;g>",ie=me(">>",!1),de=">&",tt=me(">&",!1),Pt=">",It=me(">",!1),Or="<<<",ii=me("<<<",!1),gi="<&",hr=me("<&",!1),fi="<",ni=me("<",!1),Ls=function(m){return{type:"argument",segments:[].concat(...m)}},pr=function(m){return m},Ei="$'",_n=me("$'",!1),oa="'",aA=me("'",!1),eg=function(m){return[{type:"text",text:m}]},Zn='""',AA=me('""',!1),aa=function(){return{type:"text",text:""}},up='"',lA=me('"',!1),cA=function(m){return m},wr=function(m){return{type:"arithmetic",arithmetic:m,quoted:!0}},wl=function(m){return{type:"shell",shell:m,quoted:!0}},tg=function(m){return{type:"variable",...m,quoted:!0}},po=function(m){return{type:"text",text:m}},rg=function(m){return{type:"arithmetic",arithmetic:m,quoted:!1}},gp=function(m){return{type:"shell",shell:m,quoted:!1}},fp=function(m){return{type:"variable",...m,quoted:!1}},vr=function(m){return{type:"glob",pattern:m}},se=/^[^']/,Co=Je(["'"],!0,!1),Dn=function(m){return m.join("")},ig=/^[^$"]/,Qt=Je(["$",'"'],!0,!1),Bl=`\\ -`,kn=me(`\\ -`,!1),$n=function(){return""},es="\\",gt=me("\\",!1),mo=/^[\\$"`]/,At=Je(["\\","$",'"',"`"],!1,!1),an=function(m){return m},S="\\a",Tt=me("\\a",!1),ng=function(){return"a"},Ql="\\b",hp=me("\\b",!1),pp=function(){return"\b"},dp=/^[Ee]/,Cp=Je(["E","e"],!1,!1),mp=function(){return"\x1B"},G="\\f",yt=me("\\f",!1),uA=function(){return"\f"},ji="\\n",bl=me("\\n",!1),Xe=function(){return` -`},Aa="\\r",sg=me("\\r",!1),bE=function(){return"\r"},Ep="\\t",SE=me("\\t",!1),ar=function(){return" "},Rn="\\v",Sl=me("\\v",!1),Ip=function(){return"\v"},Ts=/^[\\'"?]/,la=Je(["\\","'",'"',"?"],!1,!1),An=function(m){return String.fromCharCode(parseInt(m,16))},Te="\\x",og=me("\\x",!1),vl="\\u",Os=me("\\u",!1),xl="\\U",gA=me("\\U",!1),ag=function(m){return String.fromCodePoint(parseInt(m,16))},Ag=/^[0-7]/,ca=Je([["0","7"]],!1,!1),ua=/^[0-9a-fA-f]/,rt=Je([["0","9"],["a","f"],["A","f"]],!1,!1),Eo=nt(),fA="-",Pl=me("-",!1),Ms="+",Dl=me("+",!1),vE=".",yp=me(".",!1),lg=function(m,b,N){return{type:"number",value:(m==="-"?-1:1)*parseFloat(b.join("")+"."+N.join(""))}},wp=function(m,b){return{type:"number",value:(m==="-"?-1:1)*parseInt(b.join(""))}},xE=function(m){return{type:"variable",...m}},kl=function(m){return{type:"variable",name:m}},PE=function(m){return m},cg="*",hA=me("*",!1),Rr="/",DE=me("/",!1),Ks=function(m,b,N){return{type:b==="*"?"multiplication":"division",right:N}},Us=function(m,b){return b.reduce((N,U)=>({left:N,...U}),m)},ug=function(m,b,N){return{type:b==="+"?"addition":"subtraction",right:N}},pA="$((",R=me("$((",!1),q="))",Ce=me("))",!1),Ke=function(m){return m},Re="$(",ze=me("$(",!1),dt=function(m){return m},Ft="${",Fn=me("${",!1),Db=":-",$M=me(":-",!1),e1=function(m,b){return{name:m,defaultValue:b}},kb=":-}",t1=me(":-}",!1),r1=function(m){return{name:m,defaultValue:[]}},Rb=":+",i1=me(":+",!1),n1=function(m,b){return{name:m,alternativeValue:b}},Fb=":+}",s1=me(":+}",!1),o1=function(m){return{name:m,alternativeValue:[]}},Nb=function(m){return{name:m}},a1="$",A1=me("$",!1),l1=function(m){return e.isGlobPattern(m)},c1=function(m){return m},Lb=/^[a-zA-Z0-9_]/,Tb=Je([["a","z"],["A","Z"],["0","9"],"_"],!1,!1),Ob=function(){return T()},Mb=/^[$@*?#a-zA-Z0-9_\-]/,Kb=Je(["$","@","*","?","#",["a","z"],["A","Z"],["0","9"],"_","-"],!1,!1),u1=/^[(){}<>$|&; \t"']/,gg=Je(["(",")","{","}","<",">","$","|","&",";"," "," ",'"',"'"],!1,!1),Ub=/^[<>&; \t"']/,Hb=Je(["<",">","&",";"," "," ",'"',"'"],!1,!1),kE=/^[ \t]/,RE=Je([" "," "],!1,!1),Q=0,Me=0,dA=[{line:1,column:1}],d=0,E=[],I=0,k;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function T(){return r.substring(Me,Q)}function _(){return Et(Me,Q)}function te(m,b){throw b=b!==void 0?b:Et(Me,Q),ki([lt(m)],r.substring(Me,Q),b)}function Be(m,b){throw b=b!==void 0?b:Et(Me,Q),Nn(m,b)}function me(m,b){return{type:"literal",text:m,ignoreCase:b}}function Je(m,b,N){return{type:"class",parts:m,inverted:b,ignoreCase:N}}function nt(){return{type:"any"}}function wt(){return{type:"end"}}function lt(m){return{type:"other",description:m}}function it(m){var b=dA[m],N;if(b)return b;for(N=m-1;!dA[N];)N--;for(b=dA[N],b={line:b.line,column:b.column};Nd&&(d=Q,E=[]),E.push(m))}function Nn(m,b){return new Ml(m,null,null,b)}function ki(m,b,N){return new Ml(Ml.buildMessage(m,b),m,b,N)}function CA(){var m,b;return m=Q,b=Mr(),b===t&&(b=null),b!==t&&(Me=m,b=s(b)),m=b,m}function Mr(){var m,b,N,U,ce;if(m=Q,b=Kr(),b!==t){for(N=[],U=He();U!==t;)N.push(U),U=He();N!==t?(U=ga(),U!==t?(ce=ts(),ce===t&&(ce=null),ce!==t?(Me=m,b=o(b,U,ce),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)}else Q=m,m=t;if(m===t)if(m=Q,b=Kr(),b!==t){for(N=[],U=He();U!==t;)N.push(U),U=He();N!==t?(U=ga(),U===t&&(U=null),U!==t?(Me=m,b=a(b,U),m=b):(Q=m,m=t)):(Q=m,m=t)}else Q=m,m=t;return m}function ts(){var m,b,N,U,ce;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t)if(N=Mr(),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();U!==t?(Me=m,b=l(N),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t;return m}function ga(){var m;return r.charCodeAt(Q)===59?(m=c,Q++):(m=t,I===0&&Qe(u)),m===t&&(r.charCodeAt(Q)===38?(m=g,Q++):(m=t,I===0&&Qe(f))),m}function Kr(){var m,b,N;return m=Q,b=g1(),b!==t?(N=yue(),N===t&&(N=null),N!==t?(Me=m,b=h(b,N),m=b):(Q=m,m=t)):(Q=m,m=t),m}function yue(){var m,b,N,U,ce,Se,ht;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t)if(N=wue(),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();if(U!==t)if(ce=Kr(),ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();Se!==t?(Me=m,b=p(N,ce),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t;return m}function wue(){var m;return r.substr(Q,2)===C?(m=C,Q+=2):(m=t,I===0&&Qe(y)),m===t&&(r.substr(Q,2)===B?(m=B,Q+=2):(m=t,I===0&&Qe(v))),m}function g1(){var m,b,N;return m=Q,b=bue(),b!==t?(N=Bue(),N===t&&(N=null),N!==t?(Me=m,b=D(b,N),m=b):(Q=m,m=t)):(Q=m,m=t),m}function Bue(){var m,b,N,U,ce,Se,ht;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t)if(N=Que(),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();if(U!==t)if(ce=g1(),ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();Se!==t?(Me=m,b=L(N,ce),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t;return m}function Que(){var m;return r.substr(Q,2)===H?(m=H,Q+=2):(m=t,I===0&&Qe(j)),m===t&&(r.charCodeAt(Q)===124?(m=$,Q++):(m=t,I===0&&Qe(V))),m}function FE(){var m,b,N,U,ce,Se;if(m=Q,b=Q1(),b!==t)if(r.charCodeAt(Q)===61?(N=W,Q++):(N=t,I===0&&Qe(Z)),N!==t)if(U=p1(),U!==t){for(ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();ce!==t?(Me=m,b=A(b,U),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t;else Q=m,m=t;if(m===t)if(m=Q,b=Q1(),b!==t)if(r.charCodeAt(Q)===61?(N=W,Q++):(N=t,I===0&&Qe(Z)),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();U!==t?(Me=m,b=ae(b),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t;return m}function bue(){var m,b,N,U,ce,Se,ht,Bt,Jr,hi,rs;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t)if(r.charCodeAt(Q)===40?(N=ge,Q++):(N=t,I===0&&Qe(re)),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();if(U!==t)if(ce=Mr(),ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();if(Se!==t)if(r.charCodeAt(Q)===41?(ht=O,Q++):(ht=t,I===0&&Qe(F)),ht!==t){for(Bt=[],Jr=He();Jr!==t;)Bt.push(Jr),Jr=He();if(Bt!==t){for(Jr=[],hi=Bp();hi!==t;)Jr.push(hi),hi=Bp();if(Jr!==t){for(hi=[],rs=He();rs!==t;)hi.push(rs),rs=He();hi!==t?(Me=m,b=ue(ce,Jr),m=b):(Q=m,m=t)}else Q=m,m=t}else Q=m,m=t}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t;if(m===t){for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t)if(r.charCodeAt(Q)===123?(N=he,Q++):(N=t,I===0&&Qe(ke)),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();if(U!==t)if(ce=Mr(),ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();if(Se!==t)if(r.charCodeAt(Q)===125?(ht=Fe,Q++):(ht=t,I===0&&Qe(Ne)),ht!==t){for(Bt=[],Jr=He();Jr!==t;)Bt.push(Jr),Jr=He();if(Bt!==t){for(Jr=[],hi=Bp();hi!==t;)Jr.push(hi),hi=Bp();if(Jr!==t){for(hi=[],rs=He();rs!==t;)hi.push(rs),rs=He();hi!==t?(Me=m,b=oe(ce,Jr),m=b):(Q=m,m=t)}else Q=m,m=t}else Q=m,m=t}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t;if(m===t){for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t){for(N=[],U=FE();U!==t;)N.push(U),U=FE();if(N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();if(U!==t){if(ce=[],Se=h1(),Se!==t)for(;Se!==t;)ce.push(Se),Se=h1();else ce=t;if(ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();Se!==t?(Me=m,b=le(N,ce),m=b):(Q=m,m=t)}else Q=m,m=t}else Q=m,m=t}else Q=m,m=t}else Q=m,m=t;if(m===t){for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t){if(N=[],U=FE(),U!==t)for(;U!==t;)N.push(U),U=FE();else N=t;if(N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();U!==t?(Me=m,b=we(N),m=b):(Q=m,m=t)}else Q=m,m=t}else Q=m,m=t}}}return m}function f1(){var m,b,N,U,ce;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t){if(N=[],U=NE(),U!==t)for(;U!==t;)N.push(U),U=NE();else N=t;if(N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();U!==t?(Me=m,b=fe(N),m=b):(Q=m,m=t)}else Q=m,m=t}else Q=m,m=t;return m}function h1(){var m,b,N;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t?(N=Bp(),N!==t?(Me=m,b=Ae(N),m=b):(Q=m,m=t)):(Q=m,m=t),m===t){for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();b!==t?(N=NE(),N!==t?(Me=m,b=Ae(N),m=b):(Q=m,m=t)):(Q=m,m=t)}return m}function Bp(){var m,b,N,U,ce;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();return b!==t?(qe.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(ne)),N===t&&(N=null),N!==t?(U=Sue(),U!==t?(ce=NE(),ce!==t?(Me=m,b=Y(N,U,ce),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m}function Sue(){var m;return r.substr(Q,2)===pe?(m=pe,Q+=2):(m=t,I===0&&Qe(ie)),m===t&&(r.substr(Q,2)===de?(m=de,Q+=2):(m=t,I===0&&Qe(tt)),m===t&&(r.charCodeAt(Q)===62?(m=Pt,Q++):(m=t,I===0&&Qe(It)),m===t&&(r.substr(Q,3)===Or?(m=Or,Q+=3):(m=t,I===0&&Qe(ii)),m===t&&(r.substr(Q,2)===gi?(m=gi,Q+=2):(m=t,I===0&&Qe(hr)),m===t&&(r.charCodeAt(Q)===60?(m=fi,Q++):(m=t,I===0&&Qe(ni))))))),m}function NE(){var m,b,N;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();return b!==t?(N=p1(),N!==t?(Me=m,b=Ae(N),m=b):(Q=m,m=t)):(Q=m,m=t),m}function p1(){var m,b,N;if(m=Q,b=[],N=d1(),N!==t)for(;N!==t;)b.push(N),N=d1();else b=t;return b!==t&&(Me=m,b=Ls(b)),m=b,m}function d1(){var m,b;return m=Q,b=vue(),b!==t&&(Me=m,b=pr(b)),m=b,m===t&&(m=Q,b=xue(),b!==t&&(Me=m,b=pr(b)),m=b,m===t&&(m=Q,b=Pue(),b!==t&&(Me=m,b=pr(b)),m=b,m===t&&(m=Q,b=Due(),b!==t&&(Me=m,b=pr(b)),m=b))),m}function vue(){var m,b,N,U;return m=Q,r.substr(Q,2)===Ei?(b=Ei,Q+=2):(b=t,I===0&&Qe(_n)),b!==t?(N=Fue(),N!==t?(r.charCodeAt(Q)===39?(U=oa,Q++):(U=t,I===0&&Qe(aA)),U!==t?(Me=m,b=eg(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m}function xue(){var m,b,N,U;return m=Q,r.charCodeAt(Q)===39?(b=oa,Q++):(b=t,I===0&&Qe(aA)),b!==t?(N=kue(),N!==t?(r.charCodeAt(Q)===39?(U=oa,Q++):(U=t,I===0&&Qe(aA)),U!==t?(Me=m,b=eg(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m}function Pue(){var m,b,N,U;if(m=Q,r.substr(Q,2)===Zn?(b=Zn,Q+=2):(b=t,I===0&&Qe(AA)),b!==t&&(Me=m,b=aa()),m=b,m===t)if(m=Q,r.charCodeAt(Q)===34?(b=up,Q++):(b=t,I===0&&Qe(lA)),b!==t){for(N=[],U=C1();U!==t;)N.push(U),U=C1();N!==t?(r.charCodeAt(Q)===34?(U=up,Q++):(U=t,I===0&&Qe(lA)),U!==t?(Me=m,b=cA(N),m=b):(Q=m,m=t)):(Q=m,m=t)}else Q=m,m=t;return m}function Due(){var m,b,N;if(m=Q,b=[],N=m1(),N!==t)for(;N!==t;)b.push(N),N=m1();else b=t;return b!==t&&(Me=m,b=cA(b)),m=b,m}function C1(){var m,b;return m=Q,b=w1(),b!==t&&(Me=m,b=wr(b)),m=b,m===t&&(m=Q,b=B1(),b!==t&&(Me=m,b=wl(b)),m=b,m===t&&(m=Q,b=qb(),b!==t&&(Me=m,b=tg(b)),m=b,m===t&&(m=Q,b=Rue(),b!==t&&(Me=m,b=po(b)),m=b))),m}function m1(){var m,b;return m=Q,b=w1(),b!==t&&(Me=m,b=rg(b)),m=b,m===t&&(m=Q,b=B1(),b!==t&&(Me=m,b=gp(b)),m=b,m===t&&(m=Q,b=qb(),b!==t&&(Me=m,b=fp(b)),m=b,m===t&&(m=Q,b=Tue(),b!==t&&(Me=m,b=vr(b)),m=b,m===t&&(m=Q,b=Lue(),b!==t&&(Me=m,b=po(b)),m=b)))),m}function kue(){var m,b,N;for(m=Q,b=[],se.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Co));N!==t;)b.push(N),se.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Co));return b!==t&&(Me=m,b=Dn(b)),m=b,m}function Rue(){var m,b,N;if(m=Q,b=[],N=E1(),N===t&&(ig.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Qt))),N!==t)for(;N!==t;)b.push(N),N=E1(),N===t&&(ig.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Qt)));else b=t;return b!==t&&(Me=m,b=Dn(b)),m=b,m}function E1(){var m,b,N;return m=Q,r.substr(Q,2)===Bl?(b=Bl,Q+=2):(b=t,I===0&&Qe(kn)),b!==t&&(Me=m,b=$n()),m=b,m===t&&(m=Q,r.charCodeAt(Q)===92?(b=es,Q++):(b=t,I===0&&Qe(gt)),b!==t?(mo.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(At)),N!==t?(Me=m,b=an(N),m=b):(Q=m,m=t)):(Q=m,m=t)),m}function Fue(){var m,b,N;for(m=Q,b=[],N=I1(),N===t&&(se.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Co)));N!==t;)b.push(N),N=I1(),N===t&&(se.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Co)));return b!==t&&(Me=m,b=Dn(b)),m=b,m}function I1(){var m,b,N;return m=Q,r.substr(Q,2)===S?(b=S,Q+=2):(b=t,I===0&&Qe(Tt)),b!==t&&(Me=m,b=ng()),m=b,m===t&&(m=Q,r.substr(Q,2)===Ql?(b=Ql,Q+=2):(b=t,I===0&&Qe(hp)),b!==t&&(Me=m,b=pp()),m=b,m===t&&(m=Q,r.charCodeAt(Q)===92?(b=es,Q++):(b=t,I===0&&Qe(gt)),b!==t?(dp.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Cp)),N!==t?(Me=m,b=mp(),m=b):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===G?(b=G,Q+=2):(b=t,I===0&&Qe(yt)),b!==t&&(Me=m,b=uA()),m=b,m===t&&(m=Q,r.substr(Q,2)===ji?(b=ji,Q+=2):(b=t,I===0&&Qe(bl)),b!==t&&(Me=m,b=Xe()),m=b,m===t&&(m=Q,r.substr(Q,2)===Aa?(b=Aa,Q+=2):(b=t,I===0&&Qe(sg)),b!==t&&(Me=m,b=bE()),m=b,m===t&&(m=Q,r.substr(Q,2)===Ep?(b=Ep,Q+=2):(b=t,I===0&&Qe(SE)),b!==t&&(Me=m,b=ar()),m=b,m===t&&(m=Q,r.substr(Q,2)===Rn?(b=Rn,Q+=2):(b=t,I===0&&Qe(Sl)),b!==t&&(Me=m,b=Ip()),m=b,m===t&&(m=Q,r.charCodeAt(Q)===92?(b=es,Q++):(b=t,I===0&&Qe(gt)),b!==t?(Ts.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(la)),N!==t?(Me=m,b=an(N),m=b):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Nue()))))))))),m}function Nue(){var m,b,N,U,ce,Se,ht,Bt,Jr,hi,rs,Jb;return m=Q,r.charCodeAt(Q)===92?(b=es,Q++):(b=t,I===0&&Qe(gt)),b!==t?(N=Gb(),N!==t?(Me=m,b=An(N),m=b):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Te?(b=Te,Q+=2):(b=t,I===0&&Qe(og)),b!==t?(N=Q,U=Q,ce=Gb(),ce!==t?(Se=Ln(),Se!==t?(ce=[ce,Se],U=ce):(Q=U,U=t)):(Q=U,U=t),U===t&&(U=Gb()),U!==t?N=r.substring(N,Q):N=U,N!==t?(Me=m,b=An(N),m=b):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===vl?(b=vl,Q+=2):(b=t,I===0&&Qe(Os)),b!==t?(N=Q,U=Q,ce=Ln(),ce!==t?(Se=Ln(),Se!==t?(ht=Ln(),ht!==t?(Bt=Ln(),Bt!==t?(ce=[ce,Se,ht,Bt],U=ce):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t),U!==t?N=r.substring(N,Q):N=U,N!==t?(Me=m,b=An(N),m=b):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===xl?(b=xl,Q+=2):(b=t,I===0&&Qe(gA)),b!==t?(N=Q,U=Q,ce=Ln(),ce!==t?(Se=Ln(),Se!==t?(ht=Ln(),ht!==t?(Bt=Ln(),Bt!==t?(Jr=Ln(),Jr!==t?(hi=Ln(),hi!==t?(rs=Ln(),rs!==t?(Jb=Ln(),Jb!==t?(ce=[ce,Se,ht,Bt,Jr,hi,rs,Jb],U=ce):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t),U!==t?N=r.substring(N,Q):N=U,N!==t?(Me=m,b=ag(N),m=b):(Q=m,m=t)):(Q=m,m=t)))),m}function Gb(){var m;return Ag.test(r.charAt(Q))?(m=r.charAt(Q),Q++):(m=t,I===0&&Qe(ca)),m}function Ln(){var m;return ua.test(r.charAt(Q))?(m=r.charAt(Q),Q++):(m=t,I===0&&Qe(rt)),m}function Lue(){var m,b,N,U,ce;if(m=Q,b=[],N=Q,r.charCodeAt(Q)===92?(U=es,Q++):(U=t,I===0&&Qe(gt)),U!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Eo)),ce!==t?(Me=N,U=an(ce),N=U):(Q=N,N=t)):(Q=N,N=t),N===t&&(N=Q,U=Q,I++,ce=b1(),I--,ce===t?U=void 0:(Q=U,U=t),U!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Eo)),ce!==t?(Me=N,U=an(ce),N=U):(Q=N,N=t)):(Q=N,N=t)),N!==t)for(;N!==t;)b.push(N),N=Q,r.charCodeAt(Q)===92?(U=es,Q++):(U=t,I===0&&Qe(gt)),U!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Eo)),ce!==t?(Me=N,U=an(ce),N=U):(Q=N,N=t)):(Q=N,N=t),N===t&&(N=Q,U=Q,I++,ce=b1(),I--,ce===t?U=void 0:(Q=U,U=t),U!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Eo)),ce!==t?(Me=N,U=an(ce),N=U):(Q=N,N=t)):(Q=N,N=t));else b=t;return b!==t&&(Me=m,b=Dn(b)),m=b,m}function Yb(){var m,b,N,U,ce,Se;if(m=Q,r.charCodeAt(Q)===45?(b=fA,Q++):(b=t,I===0&&Qe(Pl)),b===t&&(r.charCodeAt(Q)===43?(b=Ms,Q++):(b=t,I===0&&Qe(Dl))),b===t&&(b=null),b!==t){if(N=[],qe.test(r.charAt(Q))?(U=r.charAt(Q),Q++):(U=t,I===0&&Qe(ne)),U!==t)for(;U!==t;)N.push(U),qe.test(r.charAt(Q))?(U=r.charAt(Q),Q++):(U=t,I===0&&Qe(ne));else N=t;if(N!==t)if(r.charCodeAt(Q)===46?(U=vE,Q++):(U=t,I===0&&Qe(yp)),U!==t){if(ce=[],qe.test(r.charAt(Q))?(Se=r.charAt(Q),Q++):(Se=t,I===0&&Qe(ne)),Se!==t)for(;Se!==t;)ce.push(Se),qe.test(r.charAt(Q))?(Se=r.charAt(Q),Q++):(Se=t,I===0&&Qe(ne));else ce=t;ce!==t?(Me=m,b=lg(b,N,ce),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;if(m===t){if(m=Q,r.charCodeAt(Q)===45?(b=fA,Q++):(b=t,I===0&&Qe(Pl)),b===t&&(r.charCodeAt(Q)===43?(b=Ms,Q++):(b=t,I===0&&Qe(Dl))),b===t&&(b=null),b!==t){if(N=[],qe.test(r.charAt(Q))?(U=r.charAt(Q),Q++):(U=t,I===0&&Qe(ne)),U!==t)for(;U!==t;)N.push(U),qe.test(r.charAt(Q))?(U=r.charAt(Q),Q++):(U=t,I===0&&Qe(ne));else N=t;N!==t?(Me=m,b=wp(b,N),m=b):(Q=m,m=t)}else Q=m,m=t;if(m===t&&(m=Q,b=qb(),b!==t&&(Me=m,b=xE(b)),m=b,m===t&&(m=Q,b=Rl(),b!==t&&(Me=m,b=kl(b)),m=b,m===t)))if(m=Q,r.charCodeAt(Q)===40?(b=ge,Q++):(b=t,I===0&&Qe(re)),b!==t){for(N=[],U=He();U!==t;)N.push(U),U=He();if(N!==t)if(U=y1(),U!==t){for(ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();ce!==t?(r.charCodeAt(Q)===41?(Se=O,Q++):(Se=t,I===0&&Qe(F)),Se!==t?(Me=m,b=PE(U),m=b):(Q=m,m=t)):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t}return m}function jb(){var m,b,N,U,ce,Se,ht,Bt;if(m=Q,b=Yb(),b!==t){for(N=[],U=Q,ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();if(ce!==t)if(r.charCodeAt(Q)===42?(Se=cg,Q++):(Se=t,I===0&&Qe(hA)),Se===t&&(r.charCodeAt(Q)===47?(Se=Rr,Q++):(Se=t,I===0&&Qe(DE))),Se!==t){for(ht=[],Bt=He();Bt!==t;)ht.push(Bt),Bt=He();ht!==t?(Bt=Yb(),Bt!==t?(Me=U,ce=Ks(b,Se,Bt),U=ce):(Q=U,U=t)):(Q=U,U=t)}else Q=U,U=t;else Q=U,U=t;for(;U!==t;){for(N.push(U),U=Q,ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();if(ce!==t)if(r.charCodeAt(Q)===42?(Se=cg,Q++):(Se=t,I===0&&Qe(hA)),Se===t&&(r.charCodeAt(Q)===47?(Se=Rr,Q++):(Se=t,I===0&&Qe(DE))),Se!==t){for(ht=[],Bt=He();Bt!==t;)ht.push(Bt),Bt=He();ht!==t?(Bt=Yb(),Bt!==t?(Me=U,ce=Ks(b,Se,Bt),U=ce):(Q=U,U=t)):(Q=U,U=t)}else Q=U,U=t;else Q=U,U=t}N!==t?(Me=m,b=Us(b,N),m=b):(Q=m,m=t)}else Q=m,m=t;return m}function y1(){var m,b,N,U,ce,Se,ht,Bt;if(m=Q,b=jb(),b!==t){for(N=[],U=Q,ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();if(ce!==t)if(r.charCodeAt(Q)===43?(Se=Ms,Q++):(Se=t,I===0&&Qe(Dl)),Se===t&&(r.charCodeAt(Q)===45?(Se=fA,Q++):(Se=t,I===0&&Qe(Pl))),Se!==t){for(ht=[],Bt=He();Bt!==t;)ht.push(Bt),Bt=He();ht!==t?(Bt=jb(),Bt!==t?(Me=U,ce=ug(b,Se,Bt),U=ce):(Q=U,U=t)):(Q=U,U=t)}else Q=U,U=t;else Q=U,U=t;for(;U!==t;){for(N.push(U),U=Q,ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();if(ce!==t)if(r.charCodeAt(Q)===43?(Se=Ms,Q++):(Se=t,I===0&&Qe(Dl)),Se===t&&(r.charCodeAt(Q)===45?(Se=fA,Q++):(Se=t,I===0&&Qe(Pl))),Se!==t){for(ht=[],Bt=He();Bt!==t;)ht.push(Bt),Bt=He();ht!==t?(Bt=jb(),Bt!==t?(Me=U,ce=ug(b,Se,Bt),U=ce):(Q=U,U=t)):(Q=U,U=t)}else Q=U,U=t;else Q=U,U=t}N!==t?(Me=m,b=Us(b,N),m=b):(Q=m,m=t)}else Q=m,m=t;return m}function w1(){var m,b,N,U,ce,Se;if(m=Q,r.substr(Q,3)===pA?(b=pA,Q+=3):(b=t,I===0&&Qe(R)),b!==t){for(N=[],U=He();U!==t;)N.push(U),U=He();if(N!==t)if(U=y1(),U!==t){for(ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();ce!==t?(r.substr(Q,2)===q?(Se=q,Q+=2):(Se=t,I===0&&Qe(Ce)),Se!==t?(Me=m,b=Ke(U),m=b):(Q=m,m=t)):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;return m}function B1(){var m,b,N,U;return m=Q,r.substr(Q,2)===Re?(b=Re,Q+=2):(b=t,I===0&&Qe(ze)),b!==t?(N=Mr(),N!==t?(r.charCodeAt(Q)===41?(U=O,Q++):(U=t,I===0&&Qe(F)),U!==t?(Me=m,b=dt(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m}function qb(){var m,b,N,U,ce,Se;return m=Q,r.substr(Q,2)===Ft?(b=Ft,Q+=2):(b=t,I===0&&Qe(Fn)),b!==t?(N=Rl(),N!==t?(r.substr(Q,2)===Db?(U=Db,Q+=2):(U=t,I===0&&Qe($M)),U!==t?(ce=f1(),ce!==t?(r.charCodeAt(Q)===125?(Se=Fe,Q++):(Se=t,I===0&&Qe(Ne)),Se!==t?(Me=m,b=e1(N,ce),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Ft?(b=Ft,Q+=2):(b=t,I===0&&Qe(Fn)),b!==t?(N=Rl(),N!==t?(r.substr(Q,3)===kb?(U=kb,Q+=3):(U=t,I===0&&Qe(t1)),U!==t?(Me=m,b=r1(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Ft?(b=Ft,Q+=2):(b=t,I===0&&Qe(Fn)),b!==t?(N=Rl(),N!==t?(r.substr(Q,2)===Rb?(U=Rb,Q+=2):(U=t,I===0&&Qe(i1)),U!==t?(ce=f1(),ce!==t?(r.charCodeAt(Q)===125?(Se=Fe,Q++):(Se=t,I===0&&Qe(Ne)),Se!==t?(Me=m,b=n1(N,ce),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Ft?(b=Ft,Q+=2):(b=t,I===0&&Qe(Fn)),b!==t?(N=Rl(),N!==t?(r.substr(Q,3)===Fb?(U=Fb,Q+=3):(U=t,I===0&&Qe(s1)),U!==t?(Me=m,b=o1(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Ft?(b=Ft,Q+=2):(b=t,I===0&&Qe(Fn)),b!==t?(N=Rl(),N!==t?(r.charCodeAt(Q)===125?(U=Fe,Q++):(U=t,I===0&&Qe(Ne)),U!==t?(Me=m,b=Nb(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.charCodeAt(Q)===36?(b=a1,Q++):(b=t,I===0&&Qe(A1)),b!==t?(N=Rl(),N!==t?(Me=m,b=Nb(N),m=b):(Q=m,m=t)):(Q=m,m=t)))))),m}function Tue(){var m,b,N;return m=Q,b=Oue(),b!==t?(Me=Q,N=l1(b),N?N=void 0:N=t,N!==t?(Me=m,b=c1(b),m=b):(Q=m,m=t)):(Q=m,m=t),m}function Oue(){var m,b,N,U,ce;if(m=Q,b=[],N=Q,U=Q,I++,ce=S1(),I--,ce===t?U=void 0:(Q=U,U=t),U!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Eo)),ce!==t?(Me=N,U=an(ce),N=U):(Q=N,N=t)):(Q=N,N=t),N!==t)for(;N!==t;)b.push(N),N=Q,U=Q,I++,ce=S1(),I--,ce===t?U=void 0:(Q=U,U=t),U!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Eo)),ce!==t?(Me=N,U=an(ce),N=U):(Q=N,N=t)):(Q=N,N=t);else b=t;return b!==t&&(Me=m,b=Dn(b)),m=b,m}function Q1(){var m,b,N;if(m=Q,b=[],Lb.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Tb)),N!==t)for(;N!==t;)b.push(N),Lb.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Tb));else b=t;return b!==t&&(Me=m,b=Ob()),m=b,m}function Rl(){var m,b,N;if(m=Q,b=[],Mb.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Kb)),N!==t)for(;N!==t;)b.push(N),Mb.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Kb));else b=t;return b!==t&&(Me=m,b=Ob()),m=b,m}function b1(){var m;return u1.test(r.charAt(Q))?(m=r.charAt(Q),Q++):(m=t,I===0&&Qe(gg)),m}function S1(){var m;return Ub.test(r.charAt(Q))?(m=r.charAt(Q),Q++):(m=t,I===0&&Qe(Hb)),m}function He(){var m,b;if(m=[],kE.test(r.charAt(Q))?(b=r.charAt(Q),Q++):(b=t,I===0&&Qe(RE)),b!==t)for(;b!==t;)m.push(b),kE.test(r.charAt(Q))?(b=r.charAt(Q),Q++):(b=t,I===0&&Qe(RE));else m=t;return m}if(k=n(),k!==t&&Q===r.length)return k;throw k!==t&&Q{"use strict";function Mge(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function Ul(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,Ul)}Mge(Ul,Error);Ul.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;gH&&(H=v,j=[]),j.push(ne))}function Ne(ne,Y){return new Ul(ne,null,null,Y)}function oe(ne,Y,pe){return new Ul(Ul.buildMessage(ne,Y),ne,Y,pe)}function le(){var ne,Y,pe,ie;return ne=v,Y=we(),Y!==t?(r.charCodeAt(v)===47?(pe=s,v++):(pe=t,$===0&&Fe(o)),pe!==t?(ie=we(),ie!==t?(D=ne,Y=a(Y,ie),ne=Y):(v=ne,ne=t)):(v=ne,ne=t)):(v=ne,ne=t),ne===t&&(ne=v,Y=we(),Y!==t&&(D=ne,Y=l(Y)),ne=Y),ne}function we(){var ne,Y,pe,ie;return ne=v,Y=fe(),Y!==t?(r.charCodeAt(v)===64?(pe=c,v++):(pe=t,$===0&&Fe(u)),pe!==t?(ie=qe(),ie!==t?(D=ne,Y=g(Y,ie),ne=Y):(v=ne,ne=t)):(v=ne,ne=t)):(v=ne,ne=t),ne===t&&(ne=v,Y=fe(),Y!==t&&(D=ne,Y=f(Y)),ne=Y),ne}function fe(){var ne,Y,pe,ie,de;return ne=v,r.charCodeAt(v)===64?(Y=c,v++):(Y=t,$===0&&Fe(u)),Y!==t?(pe=Ae(),pe!==t?(r.charCodeAt(v)===47?(ie=s,v++):(ie=t,$===0&&Fe(o)),ie!==t?(de=Ae(),de!==t?(D=ne,Y=h(),ne=Y):(v=ne,ne=t)):(v=ne,ne=t)):(v=ne,ne=t)):(v=ne,ne=t),ne===t&&(ne=v,Y=Ae(),Y!==t&&(D=ne,Y=h()),ne=Y),ne}function Ae(){var ne,Y,pe;if(ne=v,Y=[],p.test(r.charAt(v))?(pe=r.charAt(v),v++):(pe=t,$===0&&Fe(C)),pe!==t)for(;pe!==t;)Y.push(pe),p.test(r.charAt(v))?(pe=r.charAt(v),v++):(pe=t,$===0&&Fe(C));else Y=t;return Y!==t&&(D=ne,Y=h()),ne=Y,ne}function qe(){var ne,Y,pe;if(ne=v,Y=[],y.test(r.charAt(v))?(pe=r.charAt(v),v++):(pe=t,$===0&&Fe(B)),pe!==t)for(;pe!==t;)Y.push(pe),y.test(r.charAt(v))?(pe=r.charAt(v),v++):(pe=t,$===0&&Fe(B));else Y=t;return Y!==t&&(D=ne,Y=h()),ne=Y,ne}if(V=n(),V!==t&&v===r.length)return V;throw V!==t&&v{"use strict";function UK(r){return typeof r>"u"||r===null}function Uge(r){return typeof r=="object"&&r!==null}function Hge(r){return Array.isArray(r)?r:UK(r)?[]:[r]}function Gge(r,e){var t,i,n,s;if(e)for(s=Object.keys(e),t=0,i=s.length;t{"use strict";function Op(r,e){Error.call(this),this.name="YAMLException",this.reason=r,this.mark=e,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():""),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}Op.prototype=Object.create(Error.prototype);Op.prototype.constructor=Op;Op.prototype.toString=function(e){var t=this.name+": ";return t+=this.reason||"(unknown reason)",!e&&this.mark&&(t+=" "+this.mark.toString()),t};HK.exports=Op});var jK=w((pXe,YK)=>{"use strict";var GK=Gl();function SS(r,e,t,i,n){this.name=r,this.buffer=e,this.position=t,this.line=i,this.column=n}SS.prototype.getSnippet=function(e,t){var i,n,s,o,a;if(!this.buffer)return null;for(e=e||4,t=t||75,i="",n=this.position;n>0&&`\0\r -\x85\u2028\u2029`.indexOf(this.buffer.charAt(n-1))===-1;)if(n-=1,this.position-n>t/2-1){i=" ... ",n+=5;break}for(s="",o=this.position;ot/2-1){s=" ... ",o-=5;break}return a=this.buffer.slice(n,o),GK.repeat(" ",e)+i+a+s+` -`+GK.repeat(" ",e+this.position-n+i.length)+"^"};SS.prototype.toString=function(e){var t,i="";return this.name&&(i+='in "'+this.name+'" '),i+="at line "+(this.line+1)+", column "+(this.column+1),e||(t=this.getSnippet(),t&&(i+=`: -`+t)),i};YK.exports=SS});var si=w((dXe,JK)=>{"use strict";var qK=Qg(),qge=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],Jge=["scalar","sequence","mapping"];function Wge(r){var e={};return r!==null&&Object.keys(r).forEach(function(t){r[t].forEach(function(i){e[String(i)]=t})}),e}function zge(r,e){if(e=e||{},Object.keys(e).forEach(function(t){if(qge.indexOf(t)===-1)throw new qK('Unknown option "'+t+'" is met in definition of "'+r+'" YAML type.')}),this.tag=r,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(t){return t},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=Wge(e.styleAliases||null),Jge.indexOf(this.kind)===-1)throw new qK('Unknown kind "'+this.kind+'" is specified for "'+r+'" YAML type.')}JK.exports=zge});var Yl=w((CXe,zK)=>{"use strict";var WK=Gl(),nI=Qg(),Vge=si();function vS(r,e,t){var i=[];return r.include.forEach(function(n){t=vS(n,e,t)}),r[e].forEach(function(n){t.forEach(function(s,o){s.tag===n.tag&&s.kind===n.kind&&i.push(o)}),t.push(n)}),t.filter(function(n,s){return i.indexOf(s)===-1})}function Xge(){var r={scalar:{},sequence:{},mapping:{},fallback:{}},e,t;function i(n){r[n.kind][n.tag]=r.fallback[n.tag]=n}for(e=0,t=arguments.length;e{"use strict";var _ge=si();VK.exports=new _ge("tag:yaml.org,2002:str",{kind:"scalar",construct:function(r){return r!==null?r:""}})});var ZK=w((EXe,_K)=>{"use strict";var Zge=si();_K.exports=new Zge("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(r){return r!==null?r:[]}})});var eU=w((IXe,$K)=>{"use strict";var $ge=si();$K.exports=new $ge("tag:yaml.org,2002:map",{kind:"mapping",construct:function(r){return r!==null?r:{}}})});var sI=w((yXe,tU)=>{"use strict";var efe=Yl();tU.exports=new efe({explicit:[XK(),ZK(),eU()]})});var iU=w((wXe,rU)=>{"use strict";var tfe=si();function rfe(r){if(r===null)return!0;var e=r.length;return e===1&&r==="~"||e===4&&(r==="null"||r==="Null"||r==="NULL")}function ife(){return null}function nfe(r){return r===null}rU.exports=new tfe("tag:yaml.org,2002:null",{kind:"scalar",resolve:rfe,construct:ife,predicate:nfe,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})});var sU=w((BXe,nU)=>{"use strict";var sfe=si();function ofe(r){if(r===null)return!1;var e=r.length;return e===4&&(r==="true"||r==="True"||r==="TRUE")||e===5&&(r==="false"||r==="False"||r==="FALSE")}function afe(r){return r==="true"||r==="True"||r==="TRUE"}function Afe(r){return Object.prototype.toString.call(r)==="[object Boolean]"}nU.exports=new sfe("tag:yaml.org,2002:bool",{kind:"scalar",resolve:ofe,construct:afe,predicate:Afe,represent:{lowercase:function(r){return r?"true":"false"},uppercase:function(r){return r?"TRUE":"FALSE"},camelcase:function(r){return r?"True":"False"}},defaultStyle:"lowercase"})});var aU=w((QXe,oU)=>{"use strict";var lfe=Gl(),cfe=si();function ufe(r){return 48<=r&&r<=57||65<=r&&r<=70||97<=r&&r<=102}function gfe(r){return 48<=r&&r<=55}function ffe(r){return 48<=r&&r<=57}function hfe(r){if(r===null)return!1;var e=r.length,t=0,i=!1,n;if(!e)return!1;if(n=r[t],(n==="-"||n==="+")&&(n=r[++t]),n==="0"){if(t+1===e)return!0;if(n=r[++t],n==="b"){for(t++;t=0?"0b"+r.toString(2):"-0b"+r.toString(2).slice(1)},octal:function(r){return r>=0?"0"+r.toString(8):"-0"+r.toString(8).slice(1)},decimal:function(r){return r.toString(10)},hexadecimal:function(r){return r>=0?"0x"+r.toString(16).toUpperCase():"-0x"+r.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})});var cU=w((bXe,lU)=>{"use strict";var AU=Gl(),Cfe=si(),mfe=new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function Efe(r){return!(r===null||!mfe.test(r)||r[r.length-1]==="_")}function Ife(r){var e,t,i,n;return e=r.replace(/_/g,"").toLowerCase(),t=e[0]==="-"?-1:1,n=[],"+-".indexOf(e[0])>=0&&(e=e.slice(1)),e===".inf"?t===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:e.indexOf(":")>=0?(e.split(":").forEach(function(s){n.unshift(parseFloat(s,10))}),e=0,i=1,n.forEach(function(s){e+=s*i,i*=60}),t*e):t*parseFloat(e,10)}var yfe=/^[-+]?[0-9]+e/;function wfe(r,e){var t;if(isNaN(r))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===r)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===r)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(AU.isNegativeZero(r))return"-0.0";return t=r.toString(10),yfe.test(t)?t.replace("e",".e"):t}function Bfe(r){return Object.prototype.toString.call(r)==="[object Number]"&&(r%1!==0||AU.isNegativeZero(r))}lU.exports=new Cfe("tag:yaml.org,2002:float",{kind:"scalar",resolve:Efe,construct:Ife,predicate:Bfe,represent:wfe,defaultStyle:"lowercase"})});var xS=w((SXe,uU)=>{"use strict";var Qfe=Yl();uU.exports=new Qfe({include:[sI()],implicit:[iU(),sU(),aU(),cU()]})});var PS=w((vXe,gU)=>{"use strict";var bfe=Yl();gU.exports=new bfe({include:[xS()]})});var dU=w((xXe,pU)=>{"use strict";var Sfe=si(),fU=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),hU=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function vfe(r){return r===null?!1:fU.exec(r)!==null||hU.exec(r)!==null}function xfe(r){var e,t,i,n,s,o,a,l=0,c=null,u,g,f;if(e=fU.exec(r),e===null&&(e=hU.exec(r)),e===null)throw new Error("Date resolve error");if(t=+e[1],i=+e[2]-1,n=+e[3],!e[4])return new Date(Date.UTC(t,i,n));if(s=+e[4],o=+e[5],a=+e[6],e[7]){for(l=e[7].slice(0,3);l.length<3;)l+="0";l=+l}return e[9]&&(u=+e[10],g=+(e[11]||0),c=(u*60+g)*6e4,e[9]==="-"&&(c=-c)),f=new Date(Date.UTC(t,i,n,s,o,a,l)),c&&f.setTime(f.getTime()-c),f}function Pfe(r){return r.toISOString()}pU.exports=new Sfe("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:vfe,construct:xfe,instanceOf:Date,represent:Pfe})});var mU=w((PXe,CU)=>{"use strict";var Dfe=si();function kfe(r){return r==="<<"||r===null}CU.exports=new Dfe("tag:yaml.org,2002:merge",{kind:"scalar",resolve:kfe})});var yU=w((DXe,IU)=>{"use strict";var jl;try{EU=J,jl=EU("buffer").Buffer}catch{}var EU,Rfe=si(),DS=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= -\r`;function Ffe(r){if(r===null)return!1;var e,t,i=0,n=r.length,s=DS;for(t=0;t64)){if(e<0)return!1;i+=6}return i%8===0}function Nfe(r){var e,t,i=r.replace(/[\r\n=]/g,""),n=i.length,s=DS,o=0,a=[];for(e=0;e>16&255),a.push(o>>8&255),a.push(o&255)),o=o<<6|s.indexOf(i.charAt(e));return t=n%4*6,t===0?(a.push(o>>16&255),a.push(o>>8&255),a.push(o&255)):t===18?(a.push(o>>10&255),a.push(o>>2&255)):t===12&&a.push(o>>4&255),jl?jl.from?jl.from(a):new jl(a):a}function Lfe(r){var e="",t=0,i,n,s=r.length,o=DS;for(i=0;i>18&63],e+=o[t>>12&63],e+=o[t>>6&63],e+=o[t&63]),t=(t<<8)+r[i];return n=s%3,n===0?(e+=o[t>>18&63],e+=o[t>>12&63],e+=o[t>>6&63],e+=o[t&63]):n===2?(e+=o[t>>10&63],e+=o[t>>4&63],e+=o[t<<2&63],e+=o[64]):n===1&&(e+=o[t>>2&63],e+=o[t<<4&63],e+=o[64],e+=o[64]),e}function Tfe(r){return jl&&jl.isBuffer(r)}IU.exports=new Rfe("tag:yaml.org,2002:binary",{kind:"scalar",resolve:Ffe,construct:Nfe,predicate:Tfe,represent:Lfe})});var BU=w((kXe,wU)=>{"use strict";var Ofe=si(),Mfe=Object.prototype.hasOwnProperty,Kfe=Object.prototype.toString;function Ufe(r){if(r===null)return!0;var e=[],t,i,n,s,o,a=r;for(t=0,i=a.length;t{"use strict";var Gfe=si(),Yfe=Object.prototype.toString;function jfe(r){if(r===null)return!0;var e,t,i,n,s,o=r;for(s=new Array(o.length),e=0,t=o.length;e{"use strict";var Jfe=si(),Wfe=Object.prototype.hasOwnProperty;function zfe(r){if(r===null)return!0;var e,t=r;for(e in t)if(Wfe.call(t,e)&&t[e]!==null)return!1;return!0}function Vfe(r){return r!==null?r:{}}SU.exports=new Jfe("tag:yaml.org,2002:set",{kind:"mapping",resolve:zfe,construct:Vfe})});var Sg=w((NXe,xU)=>{"use strict";var Xfe=Yl();xU.exports=new Xfe({include:[PS()],implicit:[dU(),mU()],explicit:[yU(),BU(),bU(),vU()]})});var DU=w((LXe,PU)=>{"use strict";var _fe=si();function Zfe(){return!0}function $fe(){}function ehe(){return""}function the(r){return typeof r>"u"}PU.exports=new _fe("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:Zfe,construct:$fe,predicate:the,represent:ehe})});var RU=w((TXe,kU)=>{"use strict";var rhe=si();function ihe(r){if(r===null||r.length===0)return!1;var e=r,t=/\/([gim]*)$/.exec(r),i="";return!(e[0]==="/"&&(t&&(i=t[1]),i.length>3||e[e.length-i.length-1]!=="/"))}function nhe(r){var e=r,t=/\/([gim]*)$/.exec(r),i="";return e[0]==="/"&&(t&&(i=t[1]),e=e.slice(1,e.length-i.length-1)),new RegExp(e,i)}function she(r){var e="/"+r.source+"/";return r.global&&(e+="g"),r.multiline&&(e+="m"),r.ignoreCase&&(e+="i"),e}function ohe(r){return Object.prototype.toString.call(r)==="[object RegExp]"}kU.exports=new rhe("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:ihe,construct:nhe,predicate:ohe,represent:she})});var LU=w((OXe,NU)=>{"use strict";var oI;try{FU=J,oI=FU("esprima")}catch{typeof window<"u"&&(oI=window.esprima)}var FU,ahe=si();function Ahe(r){if(r===null)return!1;try{var e="("+r+")",t=oI.parse(e,{range:!0});return!(t.type!=="Program"||t.body.length!==1||t.body[0].type!=="ExpressionStatement"||t.body[0].expression.type!=="ArrowFunctionExpression"&&t.body[0].expression.type!=="FunctionExpression")}catch{return!1}}function lhe(r){var e="("+r+")",t=oI.parse(e,{range:!0}),i=[],n;if(t.type!=="Program"||t.body.length!==1||t.body[0].type!=="ExpressionStatement"||t.body[0].expression.type!=="ArrowFunctionExpression"&&t.body[0].expression.type!=="FunctionExpression")throw new Error("Failed to resolve function");return t.body[0].expression.params.forEach(function(s){i.push(s.name)}),n=t.body[0].expression.body.range,t.body[0].expression.body.type==="BlockStatement"?new Function(i,e.slice(n[0]+1,n[1]-1)):new Function(i,"return "+e.slice(n[0],n[1]))}function che(r){return r.toString()}function uhe(r){return Object.prototype.toString.call(r)==="[object Function]"}NU.exports=new ahe("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:Ahe,construct:lhe,predicate:uhe,represent:che})});var Mp=w((MXe,OU)=>{"use strict";var TU=Yl();OU.exports=TU.DEFAULT=new TU({include:[Sg()],explicit:[DU(),RU(),LU()]})});var r2=w((KXe,Kp)=>{"use strict";var da=Gl(),jU=Qg(),ghe=jK(),qU=Sg(),fhe=Mp(),wA=Object.prototype.hasOwnProperty,aI=1,JU=2,WU=3,AI=4,kS=1,hhe=2,MU=3,phe=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,dhe=/[\x85\u2028\u2029]/,Che=/[,\[\]\{\}]/,zU=/^(?:!|!!|![a-z\-]+!)$/i,VU=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function KU(r){return Object.prototype.toString.call(r)}function Bo(r){return r===10||r===13}function Jl(r){return r===9||r===32}function un(r){return r===9||r===32||r===10||r===13}function vg(r){return r===44||r===91||r===93||r===123||r===125}function mhe(r){var e;return 48<=r&&r<=57?r-48:(e=r|32,97<=e&&e<=102?e-97+10:-1)}function Ehe(r){return r===120?2:r===117?4:r===85?8:0}function Ihe(r){return 48<=r&&r<=57?r-48:-1}function UU(r){return r===48?"\0":r===97?"\x07":r===98?"\b":r===116||r===9?" ":r===110?` -`:r===118?"\v":r===102?"\f":r===114?"\r":r===101?"\x1B":r===32?" ":r===34?'"':r===47?"/":r===92?"\\":r===78?"\x85":r===95?"\xA0":r===76?"\u2028":r===80?"\u2029":""}function yhe(r){return r<=65535?String.fromCharCode(r):String.fromCharCode((r-65536>>10)+55296,(r-65536&1023)+56320)}var XU=new Array(256),_U=new Array(256);for(ql=0;ql<256;ql++)XU[ql]=UU(ql)?1:0,_U[ql]=UU(ql);var ql;function whe(r,e){this.input=r,this.filename=e.filename||null,this.schema=e.schema||fhe,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=r.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function ZU(r,e){return new jU(e,new ghe(r.filename,r.input,r.position,r.line,r.position-r.lineStart))}function ft(r,e){throw ZU(r,e)}function lI(r,e){r.onWarning&&r.onWarning.call(null,ZU(r,e))}var HU={YAML:function(e,t,i){var n,s,o;e.version!==null&&ft(e,"duplication of %YAML directive"),i.length!==1&&ft(e,"YAML directive accepts exactly one argument"),n=/^([0-9]+)\.([0-9]+)$/.exec(i[0]),n===null&&ft(e,"ill-formed argument of the YAML directive"),s=parseInt(n[1],10),o=parseInt(n[2],10),s!==1&&ft(e,"unacceptable YAML version of the document"),e.version=i[0],e.checkLineBreaks=o<2,o!==1&&o!==2&&lI(e,"unsupported YAML version of the document")},TAG:function(e,t,i){var n,s;i.length!==2&&ft(e,"TAG directive accepts exactly two arguments"),n=i[0],s=i[1],zU.test(n)||ft(e,"ill-formed tag handle (first argument) of the TAG directive"),wA.call(e.tagMap,n)&&ft(e,'there is a previously declared suffix for "'+n+'" tag handle'),VU.test(s)||ft(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[n]=s}};function yA(r,e,t,i){var n,s,o,a;if(e1&&(r.result+=da.repeat(` -`,e-1))}function Bhe(r,e,t){var i,n,s,o,a,l,c,u,g=r.kind,f=r.result,h;if(h=r.input.charCodeAt(r.position),un(h)||vg(h)||h===35||h===38||h===42||h===33||h===124||h===62||h===39||h===34||h===37||h===64||h===96||(h===63||h===45)&&(n=r.input.charCodeAt(r.position+1),un(n)||t&&vg(n)))return!1;for(r.kind="scalar",r.result="",s=o=r.position,a=!1;h!==0;){if(h===58){if(n=r.input.charCodeAt(r.position+1),un(n)||t&&vg(n))break}else if(h===35){if(i=r.input.charCodeAt(r.position-1),un(i))break}else{if(r.position===r.lineStart&&cI(r)||t&&vg(h))break;if(Bo(h))if(l=r.line,c=r.lineStart,u=r.lineIndent,zr(r,!1,-1),r.lineIndent>=e){a=!0,h=r.input.charCodeAt(r.position);continue}else{r.position=o,r.line=l,r.lineStart=c,r.lineIndent=u;break}}a&&(yA(r,s,o,!1),FS(r,r.line-l),s=o=r.position,a=!1),Jl(h)||(o=r.position+1),h=r.input.charCodeAt(++r.position)}return yA(r,s,o,!1),r.result?!0:(r.kind=g,r.result=f,!1)}function Qhe(r,e){var t,i,n;if(t=r.input.charCodeAt(r.position),t!==39)return!1;for(r.kind="scalar",r.result="",r.position++,i=n=r.position;(t=r.input.charCodeAt(r.position))!==0;)if(t===39)if(yA(r,i,r.position,!0),t=r.input.charCodeAt(++r.position),t===39)i=r.position,r.position++,n=r.position;else return!0;else Bo(t)?(yA(r,i,n,!0),FS(r,zr(r,!1,e)),i=n=r.position):r.position===r.lineStart&&cI(r)?ft(r,"unexpected end of the document within a single quoted scalar"):(r.position++,n=r.position);ft(r,"unexpected end of the stream within a single quoted scalar")}function bhe(r,e){var t,i,n,s,o,a;if(a=r.input.charCodeAt(r.position),a!==34)return!1;for(r.kind="scalar",r.result="",r.position++,t=i=r.position;(a=r.input.charCodeAt(r.position))!==0;){if(a===34)return yA(r,t,r.position,!0),r.position++,!0;if(a===92){if(yA(r,t,r.position,!0),a=r.input.charCodeAt(++r.position),Bo(a))zr(r,!1,e);else if(a<256&&XU[a])r.result+=_U[a],r.position++;else if((o=Ehe(a))>0){for(n=o,s=0;n>0;n--)a=r.input.charCodeAt(++r.position),(o=mhe(a))>=0?s=(s<<4)+o:ft(r,"expected hexadecimal character");r.result+=yhe(s),r.position++}else ft(r,"unknown escape sequence");t=i=r.position}else Bo(a)?(yA(r,t,i,!0),FS(r,zr(r,!1,e)),t=i=r.position):r.position===r.lineStart&&cI(r)?ft(r,"unexpected end of the document within a double quoted scalar"):(r.position++,i=r.position)}ft(r,"unexpected end of the stream within a double quoted scalar")}function She(r,e){var t=!0,i,n=r.tag,s,o=r.anchor,a,l,c,u,g,f={},h,p,C,y;if(y=r.input.charCodeAt(r.position),y===91)l=93,g=!1,s=[];else if(y===123)l=125,g=!0,s={};else return!1;for(r.anchor!==null&&(r.anchorMap[r.anchor]=s),y=r.input.charCodeAt(++r.position);y!==0;){if(zr(r,!0,e),y=r.input.charCodeAt(r.position),y===l)return r.position++,r.tag=n,r.anchor=o,r.kind=g?"mapping":"sequence",r.result=s,!0;t||ft(r,"missed comma between flow collection entries"),p=h=C=null,c=u=!1,y===63&&(a=r.input.charCodeAt(r.position+1),un(a)&&(c=u=!0,r.position++,zr(r,!0,e))),i=r.line,Pg(r,e,aI,!1,!0),p=r.tag,h=r.result,zr(r,!0,e),y=r.input.charCodeAt(r.position),(u||r.line===i)&&y===58&&(c=!0,y=r.input.charCodeAt(++r.position),zr(r,!0,e),Pg(r,e,aI,!1,!0),C=r.result),g?xg(r,s,f,p,h,C):c?s.push(xg(r,null,f,p,h,C)):s.push(h),zr(r,!0,e),y=r.input.charCodeAt(r.position),y===44?(t=!0,y=r.input.charCodeAt(++r.position)):t=!1}ft(r,"unexpected end of the stream within a flow collection")}function vhe(r,e){var t,i,n=kS,s=!1,o=!1,a=e,l=0,c=!1,u,g;if(g=r.input.charCodeAt(r.position),g===124)i=!1;else if(g===62)i=!0;else return!1;for(r.kind="scalar",r.result="";g!==0;)if(g=r.input.charCodeAt(++r.position),g===43||g===45)kS===n?n=g===43?MU:hhe:ft(r,"repeat of a chomping mode identifier");else if((u=Ihe(g))>=0)u===0?ft(r,"bad explicit indentation width of a block scalar; it cannot be less than one"):o?ft(r,"repeat of an indentation width identifier"):(a=e+u-1,o=!0);else break;if(Jl(g)){do g=r.input.charCodeAt(++r.position);while(Jl(g));if(g===35)do g=r.input.charCodeAt(++r.position);while(!Bo(g)&&g!==0)}for(;g!==0;){for(RS(r),r.lineIndent=0,g=r.input.charCodeAt(r.position);(!o||r.lineIndenta&&(a=r.lineIndent),Bo(g)){l++;continue}if(r.lineIndente)&&l!==0)ft(r,"bad indentation of a sequence entry");else if(r.lineIndente)&&(Pg(r,e,AI,!0,n)&&(p?f=r.result:h=r.result),p||(xg(r,c,u,g,f,h,s,o),g=f=h=null),zr(r,!0,-1),y=r.input.charCodeAt(r.position)),r.lineIndent>e&&y!==0)ft(r,"bad indentation of a mapping entry");else if(r.lineIndente?l=1:r.lineIndent===e?l=0:r.lineIndente?l=1:r.lineIndent===e?l=0:r.lineIndent tag; it should be "scalar", not "'+r.kind+'"'),g=0,f=r.implicitTypes.length;g tag; it should be "'+h.kind+'", not "'+r.kind+'"'),h.resolve(r.result)?(r.result=h.construct(r.result),r.anchor!==null&&(r.anchorMap[r.anchor]=r.result)):ft(r,"cannot resolve a node with !<"+r.tag+"> explicit tag")):ft(r,"unknown tag !<"+r.tag+">");return r.listener!==null&&r.listener("close",r),r.tag!==null||r.anchor!==null||u}function Rhe(r){var e=r.position,t,i,n,s=!1,o;for(r.version=null,r.checkLineBreaks=r.legacy,r.tagMap={},r.anchorMap={};(o=r.input.charCodeAt(r.position))!==0&&(zr(r,!0,-1),o=r.input.charCodeAt(r.position),!(r.lineIndent>0||o!==37));){for(s=!0,o=r.input.charCodeAt(++r.position),t=r.position;o!==0&&!un(o);)o=r.input.charCodeAt(++r.position);for(i=r.input.slice(t,r.position),n=[],i.length<1&&ft(r,"directive name must not be less than one character in length");o!==0;){for(;Jl(o);)o=r.input.charCodeAt(++r.position);if(o===35){do o=r.input.charCodeAt(++r.position);while(o!==0&&!Bo(o));break}if(Bo(o))break;for(t=r.position;o!==0&&!un(o);)o=r.input.charCodeAt(++r.position);n.push(r.input.slice(t,r.position))}o!==0&&RS(r),wA.call(HU,i)?HU[i](r,i,n):lI(r,'unknown document directive "'+i+'"')}if(zr(r,!0,-1),r.lineIndent===0&&r.input.charCodeAt(r.position)===45&&r.input.charCodeAt(r.position+1)===45&&r.input.charCodeAt(r.position+2)===45?(r.position+=3,zr(r,!0,-1)):s&&ft(r,"directives end mark is expected"),Pg(r,r.lineIndent-1,AI,!1,!0),zr(r,!0,-1),r.checkLineBreaks&&dhe.test(r.input.slice(e,r.position))&&lI(r,"non-ASCII line breaks are interpreted as content"),r.documents.push(r.result),r.position===r.lineStart&&cI(r)){r.input.charCodeAt(r.position)===46&&(r.position+=3,zr(r,!0,-1));return}if(r.position"u"&&(t=e,e=null);var i=$U(r,t);if(typeof e!="function")return i;for(var n=0,s=i.length;n"u"&&(t=e,e=null),e2(r,e,da.extend({schema:qU},t))}function Nhe(r,e){return t2(r,da.extend({schema:qU},e))}Kp.exports.loadAll=e2;Kp.exports.load=t2;Kp.exports.safeLoadAll=Fhe;Kp.exports.safeLoad=Nhe});var b2=w((UXe,OS)=>{"use strict";var Hp=Gl(),Gp=Qg(),Lhe=Mp(),The=Sg(),c2=Object.prototype.toString,u2=Object.prototype.hasOwnProperty,Ohe=9,Up=10,Mhe=13,Khe=32,Uhe=33,Hhe=34,g2=35,Ghe=37,Yhe=38,jhe=39,qhe=42,f2=44,Jhe=45,h2=58,Whe=61,zhe=62,Vhe=63,Xhe=64,p2=91,d2=93,_he=96,C2=123,Zhe=124,m2=125,Fi={};Fi[0]="\\0";Fi[7]="\\a";Fi[8]="\\b";Fi[9]="\\t";Fi[10]="\\n";Fi[11]="\\v";Fi[12]="\\f";Fi[13]="\\r";Fi[27]="\\e";Fi[34]='\\"';Fi[92]="\\\\";Fi[133]="\\N";Fi[160]="\\_";Fi[8232]="\\L";Fi[8233]="\\P";var $he=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];function epe(r,e){var t,i,n,s,o,a,l;if(e===null)return{};for(t={},i=Object.keys(e),n=0,s=i.length;n0?r.charCodeAt(s-1):null,f=f&&s2(o,a)}else{for(s=0;si&&r[g+1]!==" ",g=s);else if(!Dg(o))return uI;a=s>0?r.charCodeAt(s-1):null,f=f&&s2(o,a)}c=c||u&&s-g-1>i&&r[g+1]!==" "}return!l&&!c?f&&!n(r)?I2:y2:t>9&&E2(r)?uI:c?B2:w2}function ope(r,e,t,i){r.dump=function(){if(e.length===0)return"''";if(!r.noCompatMode&&$he.indexOf(e)!==-1)return"'"+e+"'";var n=r.indent*Math.max(1,t),s=r.lineWidth===-1?-1:Math.max(Math.min(r.lineWidth,40),r.lineWidth-n),o=i||r.flowLevel>-1&&t>=r.flowLevel;function a(l){return rpe(r,l)}switch(spe(e,o,r.indent,s,a)){case I2:return e;case y2:return"'"+e.replace(/'/g,"''")+"'";case w2:return"|"+o2(e,r.indent)+a2(n2(e,n));case B2:return">"+o2(e,r.indent)+a2(n2(ape(e,s),n));case uI:return'"'+Ape(e,s)+'"';default:throw new Gp("impossible error: invalid scalar style")}}()}function o2(r,e){var t=E2(r)?String(e):"",i=r[r.length-1]===` -`,n=i&&(r[r.length-2]===` -`||r===` -`),s=n?"+":i?"":"-";return t+s+` -`}function a2(r){return r[r.length-1]===` -`?r.slice(0,-1):r}function ape(r,e){for(var t=/(\n+)([^\n]*)/g,i=function(){var c=r.indexOf(` -`);return c=c!==-1?c:r.length,t.lastIndex=c,A2(r.slice(0,c),e)}(),n=r[0]===` -`||r[0]===" ",s,o;o=t.exec(r);){var a=o[1],l=o[2];s=l[0]===" ",i+=a+(!n&&!s&&l!==""?` -`:"")+A2(l,e),n=s}return i}function A2(r,e){if(r===""||r[0]===" ")return r;for(var t=/ [^ ]/g,i,n=0,s,o=0,a=0,l="";i=t.exec(r);)a=i.index,a-n>e&&(s=o>n?o:a,l+=` -`+r.slice(n,s),n=s+1),o=a;return l+=` -`,r.length-n>e&&o>n?l+=r.slice(n,o)+` -`+r.slice(o+1):l+=r.slice(n),l.slice(1)}function Ape(r){for(var e="",t,i,n,s=0;s=55296&&t<=56319&&(i=r.charCodeAt(s+1),i>=56320&&i<=57343)){e+=i2((t-55296)*1024+i-56320+65536),s++;continue}n=Fi[t],e+=!n&&Dg(t)?r[s]:n||i2(t)}return e}function lpe(r,e,t){var i="",n=r.tag,s,o;for(s=0,o=t.length;s1024&&(u+="? "),u+=r.dump+(r.condenseFlow?'"':"")+":"+(r.condenseFlow?"":" "),Wl(r,e,c,!1,!1)&&(u+=r.dump,i+=u));r.tag=n,r.dump="{"+i+"}"}function gpe(r,e,t,i){var n="",s=r.tag,o=Object.keys(t),a,l,c,u,g,f;if(r.sortKeys===!0)o.sort();else if(typeof r.sortKeys=="function")o.sort(r.sortKeys);else if(r.sortKeys)throw new Gp("sortKeys must be a boolean or a function");for(a=0,l=o.length;a1024,g&&(r.dump&&Up===r.dump.charCodeAt(0)?f+="?":f+="? "),f+=r.dump,g&&(f+=NS(r,e)),Wl(r,e+1,u,!0,g)&&(r.dump&&Up===r.dump.charCodeAt(0)?f+=":":f+=": ",f+=r.dump,n+=f));r.tag=s,r.dump=n||"{}"}function l2(r,e,t){var i,n,s,o,a,l;for(n=t?r.explicitTypes:r.implicitTypes,s=0,o=n.length;s tag resolver accepts not "'+l+'" style');r.dump=i}return!0}return!1}function Wl(r,e,t,i,n,s){r.tag=null,r.dump=t,l2(r,t,!1)||l2(r,t,!0);var o=c2.call(r.dump);i&&(i=r.flowLevel<0||r.flowLevel>e);var a=o==="[object Object]"||o==="[object Array]",l,c;if(a&&(l=r.duplicates.indexOf(t),c=l!==-1),(r.tag!==null&&r.tag!=="?"||c||r.indent!==2&&e>0)&&(n=!1),c&&r.usedDuplicates[l])r.dump="*ref_"+l;else{if(a&&c&&!r.usedDuplicates[l]&&(r.usedDuplicates[l]=!0),o==="[object Object]")i&&Object.keys(r.dump).length!==0?(gpe(r,e,r.dump,n),c&&(r.dump="&ref_"+l+r.dump)):(upe(r,e,r.dump),c&&(r.dump="&ref_"+l+" "+r.dump));else if(o==="[object Array]"){var u=r.noArrayIndent&&e>0?e-1:e;i&&r.dump.length!==0?(cpe(r,u,r.dump,n),c&&(r.dump="&ref_"+l+r.dump)):(lpe(r,u,r.dump),c&&(r.dump="&ref_"+l+" "+r.dump))}else if(o==="[object String]")r.tag!=="?"&&ope(r,r.dump,e,s);else{if(r.skipInvalid)return!1;throw new Gp("unacceptable kind of an object to dump "+o)}r.tag!==null&&r.tag!=="?"&&(r.dump="!<"+r.tag+"> "+r.dump)}return!0}function fpe(r,e){var t=[],i=[],n,s;for(LS(r,t,i),n=0,s=i.length;n{"use strict";var gI=r2(),S2=b2();function fI(r){return function(){throw new Error("Function "+r+" is deprecated and cannot be used.")}}Fr.exports.Type=si();Fr.exports.Schema=Yl();Fr.exports.FAILSAFE_SCHEMA=sI();Fr.exports.JSON_SCHEMA=xS();Fr.exports.CORE_SCHEMA=PS();Fr.exports.DEFAULT_SAFE_SCHEMA=Sg();Fr.exports.DEFAULT_FULL_SCHEMA=Mp();Fr.exports.load=gI.load;Fr.exports.loadAll=gI.loadAll;Fr.exports.safeLoad=gI.safeLoad;Fr.exports.safeLoadAll=gI.safeLoadAll;Fr.exports.dump=S2.dump;Fr.exports.safeDump=S2.safeDump;Fr.exports.YAMLException=Qg();Fr.exports.MINIMAL_SCHEMA=sI();Fr.exports.SAFE_SCHEMA=Sg();Fr.exports.DEFAULT_SCHEMA=Mp();Fr.exports.scan=fI("scan");Fr.exports.parse=fI("parse");Fr.exports.compose=fI("compose");Fr.exports.addConstructor=fI("addConstructor")});var P2=w((GXe,x2)=>{"use strict";var ppe=v2();x2.exports=ppe});var k2=w((YXe,D2)=>{"use strict";function dpe(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function zl(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,zl)}dpe(zl,Error);zl.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;g({[Ke]:Ce})))},H=function(R){return R},j=function(R){return R},$=Ts("correct indentation"),V=" ",W=ar(" ",!1),Z=function(R){return R.length===pA*ug},A=function(R){return R.length===(pA+1)*ug},ae=function(){return pA++,!0},ge=function(){return pA--,!0},re=function(){return sg()},O=Ts("pseudostring"),F=/^[^\r\n\t ?:,\][{}#&*!|>'"%@`\-]/,ue=Rn(["\r",` -`," "," ","?",":",",","]","[","{","}","#","&","*","!","|",">","'",'"',"%","@","`","-"],!0,!1),he=/^[^\r\n\t ,\][{}:#"']/,ke=Rn(["\r",` -`," "," ",",","]","[","{","}",":","#",'"',"'"],!0,!1),Fe=function(){return sg().replace(/^ *| *$/g,"")},Ne="--",oe=ar("--",!1),le=/^[a-zA-Z\/0-9]/,we=Rn([["a","z"],["A","Z"],"/",["0","9"]],!1,!1),fe=/^[^\r\n\t :,]/,Ae=Rn(["\r",` -`," "," ",":",","],!0,!1),qe="null",ne=ar("null",!1),Y=function(){return null},pe="true",ie=ar("true",!1),de=function(){return!0},tt="false",Pt=ar("false",!1),It=function(){return!1},Or=Ts("string"),ii='"',gi=ar('"',!1),hr=function(){return""},fi=function(R){return R},ni=function(R){return R.join("")},Ls=/^[^"\\\0-\x1F\x7F]/,pr=Rn(['"',"\\",["\0",""],"\x7F"],!0,!1),Ei='\\"',_n=ar('\\"',!1),oa=function(){return'"'},aA="\\\\",eg=ar("\\\\",!1),Zn=function(){return"\\"},AA="\\/",aa=ar("\\/",!1),up=function(){return"/"},lA="\\b",cA=ar("\\b",!1),wr=function(){return"\b"},wl="\\f",tg=ar("\\f",!1),po=function(){return"\f"},rg="\\n",gp=ar("\\n",!1),fp=function(){return` -`},vr="\\r",se=ar("\\r",!1),Co=function(){return"\r"},Dn="\\t",ig=ar("\\t",!1),Qt=function(){return" "},Bl="\\u",kn=ar("\\u",!1),$n=function(R,q,Ce,Ke){return String.fromCharCode(parseInt(`0x${R}${q}${Ce}${Ke}`))},es=/^[0-9a-fA-F]/,gt=Rn([["0","9"],["a","f"],["A","F"]],!1,!1),mo=Ts("blank space"),At=/^[ \t]/,an=Rn([" "," "],!1,!1),S=Ts("white space"),Tt=/^[ \t\n\r]/,ng=Rn([" "," ",` -`,"\r"],!1,!1),Ql=`\r -`,hp=ar(`\r -`,!1),pp=` -`,dp=ar(` -`,!1),Cp="\r",mp=ar("\r",!1),G=0,yt=0,uA=[{line:1,column:1}],ji=0,bl=[],Xe=0,Aa;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function sg(){return r.substring(yt,G)}function bE(){return An(yt,G)}function Ep(R,q){throw q=q!==void 0?q:An(yt,G),vl([Ts(R)],r.substring(yt,G),q)}function SE(R,q){throw q=q!==void 0?q:An(yt,G),og(R,q)}function ar(R,q){return{type:"literal",text:R,ignoreCase:q}}function Rn(R,q,Ce){return{type:"class",parts:R,inverted:q,ignoreCase:Ce}}function Sl(){return{type:"any"}}function Ip(){return{type:"end"}}function Ts(R){return{type:"other",description:R}}function la(R){var q=uA[R],Ce;if(q)return q;for(Ce=R-1;!uA[Ce];)Ce--;for(q=uA[Ce],q={line:q.line,column:q.column};Ceji&&(ji=G,bl=[]),bl.push(R))}function og(R,q){return new zl(R,null,null,q)}function vl(R,q,Ce){return new zl(zl.buildMessage(R,q),R,q,Ce)}function Os(){var R;return R=ag(),R}function xl(){var R,q,Ce;for(R=G,q=[],Ce=gA();Ce!==t;)q.push(Ce),Ce=gA();return q!==t&&(yt=R,q=s(q)),R=q,R}function gA(){var R,q,Ce,Ke,Re;return R=G,q=ua(),q!==t?(r.charCodeAt(G)===45?(Ce=o,G++):(Ce=t,Xe===0&&Te(a)),Ce!==t?(Ke=Rr(),Ke!==t?(Re=ca(),Re!==t?(yt=R,q=l(Re),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R}function ag(){var R,q,Ce;for(R=G,q=[],Ce=Ag();Ce!==t;)q.push(Ce),Ce=Ag();return q!==t&&(yt=R,q=c(q)),R=q,R}function Ag(){var R,q,Ce,Ke,Re,ze,dt,Ft,Fn;if(R=G,q=Rr(),q===t&&(q=null),q!==t){if(Ce=G,r.charCodeAt(G)===35?(Ke=u,G++):(Ke=t,Xe===0&&Te(g)),Ke!==t){if(Re=[],ze=G,dt=G,Xe++,Ft=Us(),Xe--,Ft===t?dt=void 0:(G=dt,dt=t),dt!==t?(r.length>G?(Ft=r.charAt(G),G++):(Ft=t,Xe===0&&Te(f)),Ft!==t?(dt=[dt,Ft],ze=dt):(G=ze,ze=t)):(G=ze,ze=t),ze!==t)for(;ze!==t;)Re.push(ze),ze=G,dt=G,Xe++,Ft=Us(),Xe--,Ft===t?dt=void 0:(G=dt,dt=t),dt!==t?(r.length>G?(Ft=r.charAt(G),G++):(Ft=t,Xe===0&&Te(f)),Ft!==t?(dt=[dt,Ft],ze=dt):(G=ze,ze=t)):(G=ze,ze=t);else Re=t;Re!==t?(Ke=[Ke,Re],Ce=Ke):(G=Ce,Ce=t)}else G=Ce,Ce=t;if(Ce===t&&(Ce=null),Ce!==t){if(Ke=[],Re=Ks(),Re!==t)for(;Re!==t;)Ke.push(Re),Re=Ks();else Ke=t;Ke!==t?(yt=R,q=h(),R=q):(G=R,R=t)}else G=R,R=t}else G=R,R=t;if(R===t&&(R=G,q=ua(),q!==t?(Ce=Pl(),Ce!==t?(Ke=Rr(),Ke===t&&(Ke=null),Ke!==t?(r.charCodeAt(G)===58?(Re=p,G++):(Re=t,Xe===0&&Te(C)),Re!==t?(ze=Rr(),ze===t&&(ze=null),ze!==t?(dt=ca(),dt!==t?(yt=R,q=y(Ce,dt),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t&&(R=G,q=ua(),q!==t?(Ce=Ms(),Ce!==t?(Ke=Rr(),Ke===t&&(Ke=null),Ke!==t?(r.charCodeAt(G)===58?(Re=p,G++):(Re=t,Xe===0&&Te(C)),Re!==t?(ze=Rr(),ze===t&&(ze=null),ze!==t?(dt=ca(),dt!==t?(yt=R,q=y(Ce,dt),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t))){if(R=G,q=ua(),q!==t)if(Ce=Ms(),Ce!==t)if(Ke=Rr(),Ke!==t)if(Re=vE(),Re!==t){if(ze=[],dt=Ks(),dt!==t)for(;dt!==t;)ze.push(dt),dt=Ks();else ze=t;ze!==t?(yt=R,q=y(Ce,Re),R=q):(G=R,R=t)}else G=R,R=t;else G=R,R=t;else G=R,R=t;else G=R,R=t;if(R===t)if(R=G,q=ua(),q!==t)if(Ce=Ms(),Ce!==t){if(Ke=[],Re=G,ze=Rr(),ze===t&&(ze=null),ze!==t?(r.charCodeAt(G)===44?(dt=B,G++):(dt=t,Xe===0&&Te(v)),dt!==t?(Ft=Rr(),Ft===t&&(Ft=null),Ft!==t?(Fn=Ms(),Fn!==t?(yt=Re,ze=D(Ce,Fn),Re=ze):(G=Re,Re=t)):(G=Re,Re=t)):(G=Re,Re=t)):(G=Re,Re=t),Re!==t)for(;Re!==t;)Ke.push(Re),Re=G,ze=Rr(),ze===t&&(ze=null),ze!==t?(r.charCodeAt(G)===44?(dt=B,G++):(dt=t,Xe===0&&Te(v)),dt!==t?(Ft=Rr(),Ft===t&&(Ft=null),Ft!==t?(Fn=Ms(),Fn!==t?(yt=Re,ze=D(Ce,Fn),Re=ze):(G=Re,Re=t)):(G=Re,Re=t)):(G=Re,Re=t)):(G=Re,Re=t);else Ke=t;Ke!==t?(Re=Rr(),Re===t&&(Re=null),Re!==t?(r.charCodeAt(G)===58?(ze=p,G++):(ze=t,Xe===0&&Te(C)),ze!==t?(dt=Rr(),dt===t&&(dt=null),dt!==t?(Ft=ca(),Ft!==t?(yt=R,q=L(Ce,Ke,Ft),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)}else G=R,R=t;else G=R,R=t}return R}function ca(){var R,q,Ce,Ke,Re,ze,dt;if(R=G,q=G,Xe++,Ce=G,Ke=Us(),Ke!==t?(Re=rt(),Re!==t?(r.charCodeAt(G)===45?(ze=o,G++):(ze=t,Xe===0&&Te(a)),ze!==t?(dt=Rr(),dt!==t?(Ke=[Ke,Re,ze,dt],Ce=Ke):(G=Ce,Ce=t)):(G=Ce,Ce=t)):(G=Ce,Ce=t)):(G=Ce,Ce=t),Xe--,Ce!==t?(G=q,q=void 0):q=t,q!==t?(Ce=Ks(),Ce!==t?(Ke=Eo(),Ke!==t?(Re=xl(),Re!==t?(ze=fA(),ze!==t?(yt=R,q=H(Re),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t&&(R=G,q=Us(),q!==t?(Ce=Eo(),Ce!==t?(Ke=ag(),Ke!==t?(Re=fA(),Re!==t?(yt=R,q=H(Ke),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t))if(R=G,q=Dl(),q!==t){if(Ce=[],Ke=Ks(),Ke!==t)for(;Ke!==t;)Ce.push(Ke),Ke=Ks();else Ce=t;Ce!==t?(yt=R,q=j(q),R=q):(G=R,R=t)}else G=R,R=t;return R}function ua(){var R,q,Ce;for(Xe++,R=G,q=[],r.charCodeAt(G)===32?(Ce=V,G++):(Ce=t,Xe===0&&Te(W));Ce!==t;)q.push(Ce),r.charCodeAt(G)===32?(Ce=V,G++):(Ce=t,Xe===0&&Te(W));return q!==t?(yt=G,Ce=Z(q),Ce?Ce=void 0:Ce=t,Ce!==t?(q=[q,Ce],R=q):(G=R,R=t)):(G=R,R=t),Xe--,R===t&&(q=t,Xe===0&&Te($)),R}function rt(){var R,q,Ce;for(R=G,q=[],r.charCodeAt(G)===32?(Ce=V,G++):(Ce=t,Xe===0&&Te(W));Ce!==t;)q.push(Ce),r.charCodeAt(G)===32?(Ce=V,G++):(Ce=t,Xe===0&&Te(W));return q!==t?(yt=G,Ce=A(q),Ce?Ce=void 0:Ce=t,Ce!==t?(q=[q,Ce],R=q):(G=R,R=t)):(G=R,R=t),R}function Eo(){var R;return yt=G,R=ae(),R?R=void 0:R=t,R}function fA(){var R;return yt=G,R=ge(),R?R=void 0:R=t,R}function Pl(){var R;return R=kl(),R===t&&(R=yp()),R}function Ms(){var R,q,Ce;if(R=kl(),R===t){if(R=G,q=[],Ce=lg(),Ce!==t)for(;Ce!==t;)q.push(Ce),Ce=lg();else q=t;q!==t&&(yt=R,q=re()),R=q}return R}function Dl(){var R;return R=wp(),R===t&&(R=xE(),R===t&&(R=kl(),R===t&&(R=yp()))),R}function vE(){var R;return R=wp(),R===t&&(R=kl(),R===t&&(R=lg())),R}function yp(){var R,q,Ce,Ke,Re,ze;if(Xe++,R=G,F.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Te(ue)),q!==t){for(Ce=[],Ke=G,Re=Rr(),Re===t&&(Re=null),Re!==t?(he.test(r.charAt(G))?(ze=r.charAt(G),G++):(ze=t,Xe===0&&Te(ke)),ze!==t?(Re=[Re,ze],Ke=Re):(G=Ke,Ke=t)):(G=Ke,Ke=t);Ke!==t;)Ce.push(Ke),Ke=G,Re=Rr(),Re===t&&(Re=null),Re!==t?(he.test(r.charAt(G))?(ze=r.charAt(G),G++):(ze=t,Xe===0&&Te(ke)),ze!==t?(Re=[Re,ze],Ke=Re):(G=Ke,Ke=t)):(G=Ke,Ke=t);Ce!==t?(yt=R,q=Fe(),R=q):(G=R,R=t)}else G=R,R=t;return Xe--,R===t&&(q=t,Xe===0&&Te(O)),R}function lg(){var R,q,Ce,Ke,Re;if(R=G,r.substr(G,2)===Ne?(q=Ne,G+=2):(q=t,Xe===0&&Te(oe)),q===t&&(q=null),q!==t)if(le.test(r.charAt(G))?(Ce=r.charAt(G),G++):(Ce=t,Xe===0&&Te(we)),Ce!==t){for(Ke=[],fe.test(r.charAt(G))?(Re=r.charAt(G),G++):(Re=t,Xe===0&&Te(Ae));Re!==t;)Ke.push(Re),fe.test(r.charAt(G))?(Re=r.charAt(G),G++):(Re=t,Xe===0&&Te(Ae));Ke!==t?(yt=R,q=Fe(),R=q):(G=R,R=t)}else G=R,R=t;else G=R,R=t;return R}function wp(){var R,q;return R=G,r.substr(G,4)===qe?(q=qe,G+=4):(q=t,Xe===0&&Te(ne)),q!==t&&(yt=R,q=Y()),R=q,R}function xE(){var R,q;return R=G,r.substr(G,4)===pe?(q=pe,G+=4):(q=t,Xe===0&&Te(ie)),q!==t&&(yt=R,q=de()),R=q,R===t&&(R=G,r.substr(G,5)===tt?(q=tt,G+=5):(q=t,Xe===0&&Te(Pt)),q!==t&&(yt=R,q=It()),R=q),R}function kl(){var R,q,Ce,Ke;return Xe++,R=G,r.charCodeAt(G)===34?(q=ii,G++):(q=t,Xe===0&&Te(gi)),q!==t?(r.charCodeAt(G)===34?(Ce=ii,G++):(Ce=t,Xe===0&&Te(gi)),Ce!==t?(yt=R,q=hr(),R=q):(G=R,R=t)):(G=R,R=t),R===t&&(R=G,r.charCodeAt(G)===34?(q=ii,G++):(q=t,Xe===0&&Te(gi)),q!==t?(Ce=PE(),Ce!==t?(r.charCodeAt(G)===34?(Ke=ii,G++):(Ke=t,Xe===0&&Te(gi)),Ke!==t?(yt=R,q=fi(Ce),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)),Xe--,R===t&&(q=t,Xe===0&&Te(Or)),R}function PE(){var R,q,Ce;if(R=G,q=[],Ce=cg(),Ce!==t)for(;Ce!==t;)q.push(Ce),Ce=cg();else q=t;return q!==t&&(yt=R,q=ni(q)),R=q,R}function cg(){var R,q,Ce,Ke,Re,ze;return Ls.test(r.charAt(G))?(R=r.charAt(G),G++):(R=t,Xe===0&&Te(pr)),R===t&&(R=G,r.substr(G,2)===Ei?(q=Ei,G+=2):(q=t,Xe===0&&Te(_n)),q!==t&&(yt=R,q=oa()),R=q,R===t&&(R=G,r.substr(G,2)===aA?(q=aA,G+=2):(q=t,Xe===0&&Te(eg)),q!==t&&(yt=R,q=Zn()),R=q,R===t&&(R=G,r.substr(G,2)===AA?(q=AA,G+=2):(q=t,Xe===0&&Te(aa)),q!==t&&(yt=R,q=up()),R=q,R===t&&(R=G,r.substr(G,2)===lA?(q=lA,G+=2):(q=t,Xe===0&&Te(cA)),q!==t&&(yt=R,q=wr()),R=q,R===t&&(R=G,r.substr(G,2)===wl?(q=wl,G+=2):(q=t,Xe===0&&Te(tg)),q!==t&&(yt=R,q=po()),R=q,R===t&&(R=G,r.substr(G,2)===rg?(q=rg,G+=2):(q=t,Xe===0&&Te(gp)),q!==t&&(yt=R,q=fp()),R=q,R===t&&(R=G,r.substr(G,2)===vr?(q=vr,G+=2):(q=t,Xe===0&&Te(se)),q!==t&&(yt=R,q=Co()),R=q,R===t&&(R=G,r.substr(G,2)===Dn?(q=Dn,G+=2):(q=t,Xe===0&&Te(ig)),q!==t&&(yt=R,q=Qt()),R=q,R===t&&(R=G,r.substr(G,2)===Bl?(q=Bl,G+=2):(q=t,Xe===0&&Te(kn)),q!==t?(Ce=hA(),Ce!==t?(Ke=hA(),Ke!==t?(Re=hA(),Re!==t?(ze=hA(),ze!==t?(yt=R,q=$n(Ce,Ke,Re,ze),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)))))))))),R}function hA(){var R;return es.test(r.charAt(G))?(R=r.charAt(G),G++):(R=t,Xe===0&&Te(gt)),R}function Rr(){var R,q;if(Xe++,R=[],At.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Te(an)),q!==t)for(;q!==t;)R.push(q),At.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Te(an));else R=t;return Xe--,R===t&&(q=t,Xe===0&&Te(mo)),R}function DE(){var R,q;if(Xe++,R=[],Tt.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Te(ng)),q!==t)for(;q!==t;)R.push(q),Tt.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Te(ng));else R=t;return Xe--,R===t&&(q=t,Xe===0&&Te(S)),R}function Ks(){var R,q,Ce,Ke,Re,ze;if(R=G,q=Us(),q!==t){for(Ce=[],Ke=G,Re=Rr(),Re===t&&(Re=null),Re!==t?(ze=Us(),ze!==t?(Re=[Re,ze],Ke=Re):(G=Ke,Ke=t)):(G=Ke,Ke=t);Ke!==t;)Ce.push(Ke),Ke=G,Re=Rr(),Re===t&&(Re=null),Re!==t?(ze=Us(),ze!==t?(Re=[Re,ze],Ke=Re):(G=Ke,Ke=t)):(G=Ke,Ke=t);Ce!==t?(q=[q,Ce],R=q):(G=R,R=t)}else G=R,R=t;return R}function Us(){var R;return r.substr(G,2)===Ql?(R=Ql,G+=2):(R=t,Xe===0&&Te(hp)),R===t&&(r.charCodeAt(G)===10?(R=pp,G++):(R=t,Xe===0&&Te(dp)),R===t&&(r.charCodeAt(G)===13?(R=Cp,G++):(R=t,Xe===0&&Te(mp)))),R}let ug=2,pA=0;if(Aa=n(),Aa!==t&&G===r.length)return Aa;throw Aa!==t&&G{"use strict";var wpe=r=>{let e=!1,t=!1,i=!1;for(let n=0;n{if(!(typeof r=="string"||Array.isArray(r)))throw new TypeError("Expected the input to be `string | string[]`");e=Object.assign({pascalCase:!1},e);let t=n=>e.pascalCase?n.charAt(0).toUpperCase()+n.slice(1):n;return Array.isArray(r)?r=r.map(n=>n.trim()).filter(n=>n.length).join("-"):r=r.trim(),r.length===0?"":r.length===1?e.pascalCase?r.toUpperCase():r.toLowerCase():(r!==r.toLowerCase()&&(r=wpe(r)),r=r.replace(/^[_.\- ]+/,"").toLowerCase().replace(/[_.\- ]+(\w|$)/g,(n,s)=>s.toUpperCase()).replace(/\d+(\w|$)/g,n=>n.toUpperCase()),t(r))};KS.exports=T2;KS.exports.default=T2});var M2=w((VXe,Bpe)=>{Bpe.exports=[{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI",pr:"SYSTEM_PULLREQUEST_PULLREQUESTID"},{name:"Appcircle",constant:"APPCIRCLE",env:"AC_APPCIRCLE"},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Codefresh",constant:"CODEFRESH",env:"CF_BUILD_ID",pr:{any:["CF_PULL_REQUEST_NUMBER","CF_PULL_REQUEST_ID"]}},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"GitHub Actions",constant:"GITHUB_ACTIONS",env:"GITHUB_ACTIONS",pr:{GITHUB_EVENT_NAME:"pull_request"}},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI",pr:"CI_MERGE_REQUEST_ID"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"LayerCI",constant:"LAYERCI",env:"LAYERCI",pr:"LAYERCI_PULL_REQUEST"},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Nevercode",constant:"NEVERCODE",env:"NEVERCODE",pr:{env:"NEVERCODE_PULL_REQUEST",ne:"false"}},{name:"Render",constant:"RENDER",env:"RENDER",pr:{IS_PULL_REQUEST:"true"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Screwdriver",constant:"SCREWDRIVER",env:"SCREWDRIVER",pr:{env:"SD_PULL_REQUEST",ne:"false"}},{name:"Shippable",constant:"SHIPPABLE",env:"SHIPPABLE",pr:{IS_PULL_REQUEST:"true"}},{name:"Solano CI",constant:"SOLANO",env:"TDDIUM",pr:"TDDIUM_PR_ID"},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}},{name:"Vercel",constant:"VERCEL",env:"NOW_BUILDER"},{name:"Visual Studio App Center",constant:"APPCENTER",env:"APPCENTER_BUILD_ID"}]});var Vl=w(On=>{"use strict";var U2=M2(),Qo=process.env;Object.defineProperty(On,"_vendors",{value:U2.map(function(r){return r.constant})});On.name=null;On.isPR=null;U2.forEach(function(r){let t=(Array.isArray(r.env)?r.env:[r.env]).every(function(i){return K2(i)});if(On[r.constant]=t,t)switch(On.name=r.name,typeof r.pr){case"string":On.isPR=!!Qo[r.pr];break;case"object":"env"in r.pr?On.isPR=r.pr.env in Qo&&Qo[r.pr.env]!==r.pr.ne:"any"in r.pr?On.isPR=r.pr.any.some(function(i){return!!Qo[i]}):On.isPR=K2(r.pr);break;default:On.isPR=null}});On.isCI=!!(Qo.CI||Qo.CONTINUOUS_INTEGRATION||Qo.BUILD_NUMBER||Qo.RUN_ID||On.name);function K2(r){return typeof r=="string"?!!Qo[r]:Object.keys(r).every(function(e){return Qo[e]===r[e]})}});var gn={};ut(gn,{KeyRelationship:()=>Xl,applyCascade:()=>zp,base64RegExp:()=>q2,colorStringAlphaRegExp:()=>j2,colorStringRegExp:()=>Y2,computeKey:()=>BA,getPrintable:()=>Vr,hasExactLength:()=>X2,hasForbiddenKeys:()=>tde,hasKeyRelationship:()=>JS,hasMaxLength:()=>Mpe,hasMinLength:()=>Ope,hasMutuallyExclusiveKeys:()=>rde,hasRequiredKeys:()=>ede,hasUniqueItems:()=>Kpe,isArray:()=>Ppe,isAtLeast:()=>Gpe,isAtMost:()=>Ype,isBase64:()=>Zpe,isBoolean:()=>Spe,isDate:()=>xpe,isDict:()=>kpe,isEnum:()=>Wi,isHexColor:()=>_pe,isISO8601:()=>Xpe,isInExclusiveRange:()=>qpe,isInInclusiveRange:()=>jpe,isInstanceOf:()=>Fpe,isInteger:()=>Jpe,isJSON:()=>$pe,isLiteral:()=>Qpe,isLowerCase:()=>Wpe,isNegative:()=>Upe,isNullable:()=>Tpe,isNumber:()=>vpe,isObject:()=>Rpe,isOneOf:()=>Npe,isOptional:()=>Lpe,isPositive:()=>Hpe,isString:()=>Wp,isTuple:()=>Dpe,isUUID4:()=>Vpe,isUnknown:()=>V2,isUpperCase:()=>zpe,iso8601RegExp:()=>qS,makeCoercionFn:()=>_l,makeSetter:()=>z2,makeTrait:()=>W2,makeValidator:()=>bt,matchesRegExp:()=>Vp,plural:()=>EI,pushError:()=>pt,simpleKeyRegExp:()=>G2,uuid4RegExp:()=>J2});function bt({test:r}){return W2(r)()}function Vr(r){return r===null?"null":r===void 0?"undefined":r===""?"an empty string":JSON.stringify(r)}function BA(r,e){var t,i,n;return typeof e=="number"?`${(t=r==null?void 0:r.p)!==null&&t!==void 0?t:"."}[${e}]`:G2.test(e)?`${(i=r==null?void 0:r.p)!==null&&i!==void 0?i:""}.${e}`:`${(n=r==null?void 0:r.p)!==null&&n!==void 0?n:"."}[${JSON.stringify(e)}]`}function _l(r,e){return t=>{let i=r[e];return r[e]=t,_l(r,e).bind(null,i)}}function z2(r,e){return t=>{r[e]=t}}function EI(r,e,t){return r===1?e:t}function pt({errors:r,p:e}={},t){return r==null||r.push(`${e!=null?e:"."}: ${t}`),!1}function Qpe(r){return bt({test:(e,t)=>e!==r?pt(t,`Expected a literal (got ${Vr(r)})`):!0})}function Wi(r){let e=Array.isArray(r)?r:Object.values(r),t=new Set(e);return bt({test:(i,n)=>t.has(i)?!0:pt(n,`Expected a valid enumeration value (got ${Vr(i)})`)})}var G2,Y2,j2,q2,J2,qS,W2,V2,Wp,bpe,Spe,vpe,xpe,Ppe,Dpe,kpe,Rpe,Fpe,Npe,zp,Lpe,Tpe,Ope,Mpe,X2,Kpe,Upe,Hpe,Gpe,Ype,jpe,qpe,Jpe,Vp,Wpe,zpe,Vpe,Xpe,_pe,Zpe,$pe,ede,tde,rde,Xl,ide,JS,ns=Yue(()=>{G2=/^[a-zA-Z_][a-zA-Z0-9_]*$/,Y2=/^#[0-9a-f]{6}$/i,j2=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,q2=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,J2=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$/i,qS=/^(?:[1-9]\d{3}(-?)(?:(?:0[1-9]|1[0-2])\1(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])\1(?:29|30)|(?:0[13578]|1[02])(?:\1)31|00[1-9]|0[1-9]\d|[12]\d{2}|3(?:[0-5]\d|6[0-5]))|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)(?:(-?)02(?:\2)29|-?366))T(?:[01]\d|2[0-3])(:?)[0-5]\d(?:\3[0-5]\d)?(?:Z|[+-][01]\d(?:\3[0-5]\d)?)$/,W2=r=>()=>r;V2=()=>bt({test:(r,e)=>!0});Wp=()=>bt({test:(r,e)=>typeof r!="string"?pt(e,`Expected a string (got ${Vr(r)})`):!0});bpe=new Map([["true",!0],["True",!0],["1",!0],[1,!0],["false",!1],["False",!1],["0",!1],[0,!1]]),Spe=()=>bt({test:(r,e)=>{var t;if(typeof r!="boolean"){if(typeof(e==null?void 0:e.coercions)<"u"){if(typeof(e==null?void 0:e.coercion)>"u")return pt(e,"Unbound coercion result");let i=bpe.get(r);if(typeof i<"u")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return pt(e,`Expected a boolean (got ${Vr(r)})`)}return!0}}),vpe=()=>bt({test:(r,e)=>{var t;if(typeof r!="number"){if(typeof(e==null?void 0:e.coercions)<"u"){if(typeof(e==null?void 0:e.coercion)>"u")return pt(e,"Unbound coercion result");let i;if(typeof r=="string"){let n;try{n=JSON.parse(r)}catch{}if(typeof n=="number")if(JSON.stringify(n)===r)i=n;else return pt(e,`Received a number that can't be safely represented by the runtime (${r})`)}if(typeof i<"u")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return pt(e,`Expected a number (got ${Vr(r)})`)}return!0}}),xpe=()=>bt({test:(r,e)=>{var t;if(!(r instanceof Date)){if(typeof(e==null?void 0:e.coercions)<"u"){if(typeof(e==null?void 0:e.coercion)>"u")return pt(e,"Unbound coercion result");let i;if(typeof r=="string"&&qS.test(r))i=new Date(r);else{let n;if(typeof r=="string"){let s;try{s=JSON.parse(r)}catch{}typeof s=="number"&&(n=s)}else typeof r=="number"&&(n=r);if(typeof n<"u")if(Number.isSafeInteger(n)||!Number.isSafeInteger(n*1e3))i=new Date(n*1e3);else return pt(e,`Received a timestamp that can't be safely represented by the runtime (${r})`)}if(typeof i<"u")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return pt(e,`Expected a date (got ${Vr(r)})`)}return!0}}),Ppe=(r,{delimiter:e}={})=>bt({test:(t,i)=>{var n;if(typeof t=="string"&&typeof e<"u"&&typeof(i==null?void 0:i.coercions)<"u"){if(typeof(i==null?void 0:i.coercion)>"u")return pt(i,"Unbound coercion result");t=t.split(e),i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,t)])}if(!Array.isArray(t))return pt(i,`Expected an array (got ${Vr(t)})`);let s=!0;for(let o=0,a=t.length;o{let t=X2(r.length);return bt({test:(i,n)=>{var s;if(typeof i=="string"&&typeof e<"u"&&typeof(n==null?void 0:n.coercions)<"u"){if(typeof(n==null?void 0:n.coercion)>"u")return pt(n,"Unbound coercion result");i=i.split(e),n.coercions.push([(s=n.p)!==null&&s!==void 0?s:".",n.coercion.bind(null,i)])}if(!Array.isArray(i))return pt(n,`Expected a tuple (got ${Vr(i)})`);let o=t(i,Object.assign({},n));for(let a=0,l=i.length;abt({test:(t,i)=>{if(typeof t!="object"||t===null)return pt(i,`Expected an object (got ${Vr(t)})`);let n=Object.keys(t),s=!0;for(let o=0,a=n.length;o{let t=Object.keys(r);return bt({test:(i,n)=>{if(typeof i!="object"||i===null)return pt(n,`Expected an object (got ${Vr(i)})`);let s=new Set([...t,...Object.keys(i)]),o={},a=!0;for(let l of s){if(l==="constructor"||l==="__proto__")a=pt(Object.assign(Object.assign({},n),{p:BA(n,l)}),"Unsafe property name");else{let c=Object.prototype.hasOwnProperty.call(r,l)?r[l]:void 0,u=Object.prototype.hasOwnProperty.call(i,l)?i[l]:void 0;typeof c<"u"?a=c(u,Object.assign(Object.assign({},n),{p:BA(n,l),coercion:_l(i,l)}))&&a:e===null?a=pt(Object.assign(Object.assign({},n),{p:BA(n,l)}),`Extraneous property (got ${Vr(u)})`):Object.defineProperty(o,l,{enumerable:!0,get:()=>u,set:z2(i,l)})}if(!a&&(n==null?void 0:n.errors)==null)break}return e!==null&&(a||(n==null?void 0:n.errors)!=null)&&(a=e(o,n)&&a),a}})},Fpe=r=>bt({test:(e,t)=>e instanceof r?!0:pt(t,`Expected an instance of ${r.name} (got ${Vr(e)})`)}),Npe=(r,{exclusive:e=!1}={})=>bt({test:(t,i)=>{var n,s,o;let a=[],l=typeof(i==null?void 0:i.errors)<"u"?[]:void 0;for(let c=0,u=r.length;c1?pt(i,`Expected to match exactly a single predicate (matched ${a.join(", ")})`):(o=i==null?void 0:i.errors)===null||o===void 0||o.push(...l),!1}}),zp=(r,e)=>bt({test:(t,i)=>{var n,s;let o={value:t},a=typeof(i==null?void 0:i.coercions)<"u"?_l(o,"value"):void 0,l=typeof(i==null?void 0:i.coercions)<"u"?[]:void 0;if(!r(t,Object.assign(Object.assign({},i),{coercion:a,coercions:l})))return!1;let c=[];if(typeof l<"u")for(let[,u]of l)c.push(u());try{if(typeof(i==null?void 0:i.coercions)<"u"){if(o.value!==t){if(typeof(i==null?void 0:i.coercion)>"u")return pt(i,"Unbound coercion result");i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,o.value)])}(s=i==null?void 0:i.coercions)===null||s===void 0||s.push(...l)}return e.every(u=>u(o.value,i))}finally{for(let u of c)u()}}}),Lpe=r=>bt({test:(e,t)=>typeof e>"u"?!0:r(e,t)}),Tpe=r=>bt({test:(e,t)=>e===null?!0:r(e,t)}),Ope=r=>bt({test:(e,t)=>e.length>=r?!0:pt(t,`Expected to have a length of at least ${r} elements (got ${e.length})`)}),Mpe=r=>bt({test:(e,t)=>e.length<=r?!0:pt(t,`Expected to have a length of at most ${r} elements (got ${e.length})`)}),X2=r=>bt({test:(e,t)=>e.length!==r?pt(t,`Expected to have a length of exactly ${r} elements (got ${e.length})`):!0}),Kpe=({map:r}={})=>bt({test:(e,t)=>{let i=new Set,n=new Set;for(let s=0,o=e.length;sbt({test:(r,e)=>r<=0?!0:pt(e,`Expected to be negative (got ${r})`)}),Hpe=()=>bt({test:(r,e)=>r>=0?!0:pt(e,`Expected to be positive (got ${r})`)}),Gpe=r=>bt({test:(e,t)=>e>=r?!0:pt(t,`Expected to be at least ${r} (got ${e})`)}),Ype=r=>bt({test:(e,t)=>e<=r?!0:pt(t,`Expected to be at most ${r} (got ${e})`)}),jpe=(r,e)=>bt({test:(t,i)=>t>=r&&t<=e?!0:pt(i,`Expected to be in the [${r}; ${e}] range (got ${t})`)}),qpe=(r,e)=>bt({test:(t,i)=>t>=r&&tbt({test:(e,t)=>e!==Math.round(e)?pt(t,`Expected to be an integer (got ${e})`):Number.isSafeInteger(e)?!0:pt(t,`Expected to be a safe integer (got ${e})`)}),Vp=r=>bt({test:(e,t)=>r.test(e)?!0:pt(t,`Expected to match the pattern ${r.toString()} (got ${Vr(e)})`)}),Wpe=()=>bt({test:(r,e)=>r!==r.toLowerCase()?pt(e,`Expected to be all-lowercase (got ${r})`):!0}),zpe=()=>bt({test:(r,e)=>r!==r.toUpperCase()?pt(e,`Expected to be all-uppercase (got ${r})`):!0}),Vpe=()=>bt({test:(r,e)=>J2.test(r)?!0:pt(e,`Expected to be a valid UUID v4 (got ${Vr(r)})`)}),Xpe=()=>bt({test:(r,e)=>qS.test(r)?!1:pt(e,`Expected to be a valid ISO 8601 date string (got ${Vr(r)})`)}),_pe=({alpha:r=!1})=>bt({test:(e,t)=>(r?Y2.test(e):j2.test(e))?!0:pt(t,`Expected to be a valid hexadecimal color string (got ${Vr(e)})`)}),Zpe=()=>bt({test:(r,e)=>q2.test(r)?!0:pt(e,`Expected to be a valid base 64 string (got ${Vr(r)})`)}),$pe=(r=V2())=>bt({test:(e,t)=>{let i;try{i=JSON.parse(e)}catch{return pt(t,`Expected to be a valid JSON string (got ${Vr(e)})`)}return r(i,t)}}),ede=r=>{let e=new Set(r);return bt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)||s.push(o);return s.length>0?pt(i,`Missing required ${EI(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},tde=r=>{let e=new Set(r);return bt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>0?pt(i,`Forbidden ${EI(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},rde=r=>{let e=new Set(r);return bt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>1?pt(i,`Mutually exclusive properties ${s.map(o=>`"${o}"`).join(", ")}`):!0}})};(function(r){r.Forbids="Forbids",r.Requires="Requires"})(Xl||(Xl={}));ide={[Xl.Forbids]:{expect:!1,message:"forbids using"},[Xl.Requires]:{expect:!0,message:"requires using"}},JS=(r,e,t,{ignore:i=[]}={})=>{let n=new Set(i),s=new Set(t),o=ide[e];return bt({test:(a,l)=>{let c=new Set(Object.keys(a));if(!c.has(r)||n.has(a[r]))return!0;let u=[];for(let g of s)(c.has(g)&&!n.has(a[g]))!==o.expect&&u.push(g);return u.length>=1?pt(l,`Property "${r}" ${o.message} ${EI(u.length,"property","properties")} ${u.map(g=>`"${g}"`).join(", ")}`):!0}})}});var fH=w((V_e,gH)=>{"use strict";gH.exports=(r,...e)=>new Promise(t=>{t(r(...e))})});var Tg=w((X_e,ev)=>{"use strict";var Ide=fH(),hH=r=>{if(r<1)throw new TypeError("Expected `concurrency` to be a number from 1 and up");let e=[],t=0,i=()=>{t--,e.length>0&&e.shift()()},n=(a,l,...c)=>{t++;let u=Ide(a,...c);l(u),u.then(i,i)},s=(a,l,...c)=>{tnew Promise(c=>s(a,c,...l));return Object.defineProperties(o,{activeCount:{get:()=>t},pendingCount:{get:()=>e.length}}),o};ev.exports=hH;ev.exports.default=hH});var ed=w((Z_e,pH)=>{var yde="2.0.0",wde=Number.MAX_SAFE_INTEGER||9007199254740991,Bde=16;pH.exports={SEMVER_SPEC_VERSION:yde,MAX_LENGTH:256,MAX_SAFE_INTEGER:wde,MAX_SAFE_COMPONENT_LENGTH:Bde}});var td=w(($_e,dH)=>{var Qde=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...r)=>console.error("SEMVER",...r):()=>{};dH.exports=Qde});var Zl=w((bA,CH)=>{var{MAX_SAFE_COMPONENT_LENGTH:tv}=ed(),bde=td();bA=CH.exports={};var Sde=bA.re=[],$e=bA.src=[],et=bA.t={},vde=0,St=(r,e,t)=>{let i=vde++;bde(i,e),et[r]=i,$e[i]=e,Sde[i]=new RegExp(e,t?"g":void 0)};St("NUMERICIDENTIFIER","0|[1-9]\\d*");St("NUMERICIDENTIFIERLOOSE","[0-9]+");St("NONNUMERICIDENTIFIER","\\d*[a-zA-Z-][a-zA-Z0-9-]*");St("MAINVERSION",`(${$e[et.NUMERICIDENTIFIER]})\\.(${$e[et.NUMERICIDENTIFIER]})\\.(${$e[et.NUMERICIDENTIFIER]})`);St("MAINVERSIONLOOSE",`(${$e[et.NUMERICIDENTIFIERLOOSE]})\\.(${$e[et.NUMERICIDENTIFIERLOOSE]})\\.(${$e[et.NUMERICIDENTIFIERLOOSE]})`);St("PRERELEASEIDENTIFIER",`(?:${$e[et.NUMERICIDENTIFIER]}|${$e[et.NONNUMERICIDENTIFIER]})`);St("PRERELEASEIDENTIFIERLOOSE",`(?:${$e[et.NUMERICIDENTIFIERLOOSE]}|${$e[et.NONNUMERICIDENTIFIER]})`);St("PRERELEASE",`(?:-(${$e[et.PRERELEASEIDENTIFIER]}(?:\\.${$e[et.PRERELEASEIDENTIFIER]})*))`);St("PRERELEASELOOSE",`(?:-?(${$e[et.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${$e[et.PRERELEASEIDENTIFIERLOOSE]})*))`);St("BUILDIDENTIFIER","[0-9A-Za-z-]+");St("BUILD",`(?:\\+(${$e[et.BUILDIDENTIFIER]}(?:\\.${$e[et.BUILDIDENTIFIER]})*))`);St("FULLPLAIN",`v?${$e[et.MAINVERSION]}${$e[et.PRERELEASE]}?${$e[et.BUILD]}?`);St("FULL",`^${$e[et.FULLPLAIN]}$`);St("LOOSEPLAIN",`[v=\\s]*${$e[et.MAINVERSIONLOOSE]}${$e[et.PRERELEASELOOSE]}?${$e[et.BUILD]}?`);St("LOOSE",`^${$e[et.LOOSEPLAIN]}$`);St("GTLT","((?:<|>)?=?)");St("XRANGEIDENTIFIERLOOSE",`${$e[et.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);St("XRANGEIDENTIFIER",`${$e[et.NUMERICIDENTIFIER]}|x|X|\\*`);St("XRANGEPLAIN",`[v=\\s]*(${$e[et.XRANGEIDENTIFIER]})(?:\\.(${$e[et.XRANGEIDENTIFIER]})(?:\\.(${$e[et.XRANGEIDENTIFIER]})(?:${$e[et.PRERELEASE]})?${$e[et.BUILD]}?)?)?`);St("XRANGEPLAINLOOSE",`[v=\\s]*(${$e[et.XRANGEIDENTIFIERLOOSE]})(?:\\.(${$e[et.XRANGEIDENTIFIERLOOSE]})(?:\\.(${$e[et.XRANGEIDENTIFIERLOOSE]})(?:${$e[et.PRERELEASELOOSE]})?${$e[et.BUILD]}?)?)?`);St("XRANGE",`^${$e[et.GTLT]}\\s*${$e[et.XRANGEPLAIN]}$`);St("XRANGELOOSE",`^${$e[et.GTLT]}\\s*${$e[et.XRANGEPLAINLOOSE]}$`);St("COERCE",`(^|[^\\d])(\\d{1,${tv}})(?:\\.(\\d{1,${tv}}))?(?:\\.(\\d{1,${tv}}))?(?:$|[^\\d])`);St("COERCERTL",$e[et.COERCE],!0);St("LONETILDE","(?:~>?)");St("TILDETRIM",`(\\s*)${$e[et.LONETILDE]}\\s+`,!0);bA.tildeTrimReplace="$1~";St("TILDE",`^${$e[et.LONETILDE]}${$e[et.XRANGEPLAIN]}$`);St("TILDELOOSE",`^${$e[et.LONETILDE]}${$e[et.XRANGEPLAINLOOSE]}$`);St("LONECARET","(?:\\^)");St("CARETTRIM",`(\\s*)${$e[et.LONECARET]}\\s+`,!0);bA.caretTrimReplace="$1^";St("CARET",`^${$e[et.LONECARET]}${$e[et.XRANGEPLAIN]}$`);St("CARETLOOSE",`^${$e[et.LONECARET]}${$e[et.XRANGEPLAINLOOSE]}$`);St("COMPARATORLOOSE",`^${$e[et.GTLT]}\\s*(${$e[et.LOOSEPLAIN]})$|^$`);St("COMPARATOR",`^${$e[et.GTLT]}\\s*(${$e[et.FULLPLAIN]})$|^$`);St("COMPARATORTRIM",`(\\s*)${$e[et.GTLT]}\\s*(${$e[et.LOOSEPLAIN]}|${$e[et.XRANGEPLAIN]})`,!0);bA.comparatorTrimReplace="$1$2$3";St("HYPHENRANGE",`^\\s*(${$e[et.XRANGEPLAIN]})\\s+-\\s+(${$e[et.XRANGEPLAIN]})\\s*$`);St("HYPHENRANGELOOSE",`^\\s*(${$e[et.XRANGEPLAINLOOSE]})\\s+-\\s+(${$e[et.XRANGEPLAINLOOSE]})\\s*$`);St("STAR","(<|>)?=?\\s*\\*");St("GTE0","^\\s*>=\\s*0.0.0\\s*$");St("GTE0PRE","^\\s*>=\\s*0.0.0-0\\s*$")});var rd=w((eZe,mH)=>{var xde=["includePrerelease","loose","rtl"],Pde=r=>r?typeof r!="object"?{loose:!0}:xde.filter(e=>r[e]).reduce((e,t)=>(e[t]=!0,e),{}):{};mH.exports=Pde});var bI=w((tZe,yH)=>{var EH=/^[0-9]+$/,IH=(r,e)=>{let t=EH.test(r),i=EH.test(e);return t&&i&&(r=+r,e=+e),r===e?0:t&&!i?-1:i&&!t?1:rIH(e,r);yH.exports={compareIdentifiers:IH,rcompareIdentifiers:Dde}});var Li=w((rZe,bH)=>{var SI=td(),{MAX_LENGTH:wH,MAX_SAFE_INTEGER:vI}=ed(),{re:BH,t:QH}=Zl(),kde=rd(),{compareIdentifiers:id}=bI(),Un=class{constructor(e,t){if(t=kde(t),e instanceof Un){if(e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease)return e;e=e.version}else if(typeof e!="string")throw new TypeError(`Invalid Version: ${e}`);if(e.length>wH)throw new TypeError(`version is longer than ${wH} characters`);SI("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let i=e.trim().match(t.loose?BH[QH.LOOSE]:BH[QH.FULL]);if(!i)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+i[1],this.minor=+i[2],this.patch=+i[3],this.major>vI||this.major<0)throw new TypeError("Invalid major version");if(this.minor>vI||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>vI||this.patch<0)throw new TypeError("Invalid patch version");i[4]?this.prerelease=i[4].split(".").map(n=>{if(/^[0-9]+$/.test(n)){let s=+n;if(s>=0&&s=0;)typeof this.prerelease[i]=="number"&&(this.prerelease[i]++,i=-2);i===-1&&this.prerelease.push(0)}t&&(this.prerelease[0]===t?isNaN(this.prerelease[1])&&(this.prerelease=[t,0]):this.prerelease=[t,0]);break;default:throw new Error(`invalid increment argument: ${e}`)}return this.format(),this.raw=this.version,this}};bH.exports=Un});var $l=w((iZe,PH)=>{var{MAX_LENGTH:Rde}=ed(),{re:SH,t:vH}=Zl(),xH=Li(),Fde=rd(),Nde=(r,e)=>{if(e=Fde(e),r instanceof xH)return r;if(typeof r!="string"||r.length>Rde||!(e.loose?SH[vH.LOOSE]:SH[vH.FULL]).test(r))return null;try{return new xH(r,e)}catch{return null}};PH.exports=Nde});var kH=w((nZe,DH)=>{var Lde=$l(),Tde=(r,e)=>{let t=Lde(r,e);return t?t.version:null};DH.exports=Tde});var FH=w((sZe,RH)=>{var Ode=$l(),Mde=(r,e)=>{let t=Ode(r.trim().replace(/^[=v]+/,""),e);return t?t.version:null};RH.exports=Mde});var LH=w((oZe,NH)=>{var Kde=Li(),Ude=(r,e,t,i)=>{typeof t=="string"&&(i=t,t=void 0);try{return new Kde(r,t).inc(e,i).version}catch{return null}};NH.exports=Ude});var ss=w((aZe,OH)=>{var TH=Li(),Hde=(r,e,t)=>new TH(r,t).compare(new TH(e,t));OH.exports=Hde});var xI=w((AZe,MH)=>{var Gde=ss(),Yde=(r,e,t)=>Gde(r,e,t)===0;MH.exports=Yde});var HH=w((lZe,UH)=>{var KH=$l(),jde=xI(),qde=(r,e)=>{if(jde(r,e))return null;{let t=KH(r),i=KH(e),n=t.prerelease.length||i.prerelease.length,s=n?"pre":"",o=n?"prerelease":"";for(let a in t)if((a==="major"||a==="minor"||a==="patch")&&t[a]!==i[a])return s+a;return o}};UH.exports=qde});var YH=w((cZe,GH)=>{var Jde=Li(),Wde=(r,e)=>new Jde(r,e).major;GH.exports=Wde});var qH=w((uZe,jH)=>{var zde=Li(),Vde=(r,e)=>new zde(r,e).minor;jH.exports=Vde});var WH=w((gZe,JH)=>{var Xde=Li(),_de=(r,e)=>new Xde(r,e).patch;JH.exports=_de});var VH=w((fZe,zH)=>{var Zde=$l(),$de=(r,e)=>{let t=Zde(r,e);return t&&t.prerelease.length?t.prerelease:null};zH.exports=$de});var _H=w((hZe,XH)=>{var eCe=ss(),tCe=(r,e,t)=>eCe(e,r,t);XH.exports=tCe});var $H=w((pZe,ZH)=>{var rCe=ss(),iCe=(r,e)=>rCe(r,e,!0);ZH.exports=iCe});var PI=w((dZe,tG)=>{var eG=Li(),nCe=(r,e,t)=>{let i=new eG(r,t),n=new eG(e,t);return i.compare(n)||i.compareBuild(n)};tG.exports=nCe});var iG=w((CZe,rG)=>{var sCe=PI(),oCe=(r,e)=>r.sort((t,i)=>sCe(t,i,e));rG.exports=oCe});var sG=w((mZe,nG)=>{var aCe=PI(),ACe=(r,e)=>r.sort((t,i)=>aCe(i,t,e));nG.exports=ACe});var nd=w((EZe,oG)=>{var lCe=ss(),cCe=(r,e,t)=>lCe(r,e,t)>0;oG.exports=cCe});var DI=w((IZe,aG)=>{var uCe=ss(),gCe=(r,e,t)=>uCe(r,e,t)<0;aG.exports=gCe});var rv=w((yZe,AG)=>{var fCe=ss(),hCe=(r,e,t)=>fCe(r,e,t)!==0;AG.exports=hCe});var kI=w((wZe,lG)=>{var pCe=ss(),dCe=(r,e,t)=>pCe(r,e,t)>=0;lG.exports=dCe});var RI=w((BZe,cG)=>{var CCe=ss(),mCe=(r,e,t)=>CCe(r,e,t)<=0;cG.exports=mCe});var iv=w((QZe,uG)=>{var ECe=xI(),ICe=rv(),yCe=nd(),wCe=kI(),BCe=DI(),QCe=RI(),bCe=(r,e,t,i)=>{switch(e){case"===":return typeof r=="object"&&(r=r.version),typeof t=="object"&&(t=t.version),r===t;case"!==":return typeof r=="object"&&(r=r.version),typeof t=="object"&&(t=t.version),r!==t;case"":case"=":case"==":return ECe(r,t,i);case"!=":return ICe(r,t,i);case">":return yCe(r,t,i);case">=":return wCe(r,t,i);case"<":return BCe(r,t,i);case"<=":return QCe(r,t,i);default:throw new TypeError(`Invalid operator: ${e}`)}};uG.exports=bCe});var fG=w((bZe,gG)=>{var SCe=Li(),vCe=$l(),{re:FI,t:NI}=Zl(),xCe=(r,e)=>{if(r instanceof SCe)return r;if(typeof r=="number"&&(r=String(r)),typeof r!="string")return null;e=e||{};let t=null;if(!e.rtl)t=r.match(FI[NI.COERCE]);else{let i;for(;(i=FI[NI.COERCERTL].exec(r))&&(!t||t.index+t[0].length!==r.length);)(!t||i.index+i[0].length!==t.index+t[0].length)&&(t=i),FI[NI.COERCERTL].lastIndex=i.index+i[1].length+i[2].length;FI[NI.COERCERTL].lastIndex=-1}return t===null?null:vCe(`${t[2]}.${t[3]||"0"}.${t[4]||"0"}`,e)};gG.exports=xCe});var pG=w((SZe,hG)=>{"use strict";hG.exports=function(r){r.prototype[Symbol.iterator]=function*(){for(let e=this.head;e;e=e.next)yield e.value}}});var sd=w((vZe,dG)=>{"use strict";dG.exports=Ht;Ht.Node=ec;Ht.create=Ht;function Ht(r){var e=this;if(e instanceof Ht||(e=new Ht),e.tail=null,e.head=null,e.length=0,r&&typeof r.forEach=="function")r.forEach(function(n){e.push(n)});else if(arguments.length>0)for(var t=0,i=arguments.length;t1)t=e;else if(this.head)i=this.head.next,t=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=0;i!==null;n++)t=r(t,i.value,n),i=i.next;return t};Ht.prototype.reduceReverse=function(r,e){var t,i=this.tail;if(arguments.length>1)t=e;else if(this.tail)i=this.tail.prev,t=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=this.length-1;i!==null;n--)t=r(t,i.value,n),i=i.prev;return t};Ht.prototype.toArray=function(){for(var r=new Array(this.length),e=0,t=this.head;t!==null;e++)r[e]=t.value,t=t.next;return r};Ht.prototype.toArrayReverse=function(){for(var r=new Array(this.length),e=0,t=this.tail;t!==null;e++)r[e]=t.value,t=t.prev;return r};Ht.prototype.slice=function(r,e){e=e||this.length,e<0&&(e+=this.length),r=r||0,r<0&&(r+=this.length);var t=new Ht;if(ethis.length&&(e=this.length);for(var i=0,n=this.head;n!==null&&ithis.length&&(e=this.length);for(var i=this.length,n=this.tail;n!==null&&i>e;i--)n=n.prev;for(;n!==null&&i>r;i--,n=n.prev)t.push(n.value);return t};Ht.prototype.splice=function(r,e,...t){r>this.length&&(r=this.length-1),r<0&&(r=this.length+r);for(var i=0,n=this.head;n!==null&&i{"use strict";var RCe=sd(),tc=Symbol("max"),Ia=Symbol("length"),Og=Symbol("lengthCalculator"),ad=Symbol("allowStale"),rc=Symbol("maxAge"),Ea=Symbol("dispose"),CG=Symbol("noDisposeOnSet"),di=Symbol("lruList"),Ws=Symbol("cache"),EG=Symbol("updateAgeOnGet"),nv=()=>1,ov=class{constructor(e){if(typeof e=="number"&&(e={max:e}),e||(e={}),e.max&&(typeof e.max!="number"||e.max<0))throw new TypeError("max must be a non-negative number");let t=this[tc]=e.max||1/0,i=e.length||nv;if(this[Og]=typeof i!="function"?nv:i,this[ad]=e.stale||!1,e.maxAge&&typeof e.maxAge!="number")throw new TypeError("maxAge must be a number");this[rc]=e.maxAge||0,this[Ea]=e.dispose,this[CG]=e.noDisposeOnSet||!1,this[EG]=e.updateAgeOnGet||!1,this.reset()}set max(e){if(typeof e!="number"||e<0)throw new TypeError("max must be a non-negative number");this[tc]=e||1/0,od(this)}get max(){return this[tc]}set allowStale(e){this[ad]=!!e}get allowStale(){return this[ad]}set maxAge(e){if(typeof e!="number")throw new TypeError("maxAge must be a non-negative number");this[rc]=e,od(this)}get maxAge(){return this[rc]}set lengthCalculator(e){typeof e!="function"&&(e=nv),e!==this[Og]&&(this[Og]=e,this[Ia]=0,this[di].forEach(t=>{t.length=this[Og](t.value,t.key),this[Ia]+=t.length})),od(this)}get lengthCalculator(){return this[Og]}get length(){return this[Ia]}get itemCount(){return this[di].length}rforEach(e,t){t=t||this;for(let i=this[di].tail;i!==null;){let n=i.prev;mG(this,e,i,t),i=n}}forEach(e,t){t=t||this;for(let i=this[di].head;i!==null;){let n=i.next;mG(this,e,i,t),i=n}}keys(){return this[di].toArray().map(e=>e.key)}values(){return this[di].toArray().map(e=>e.value)}reset(){this[Ea]&&this[di]&&this[di].length&&this[di].forEach(e=>this[Ea](e.key,e.value)),this[Ws]=new Map,this[di]=new RCe,this[Ia]=0}dump(){return this[di].map(e=>LI(this,e)?!1:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}).toArray().filter(e=>e)}dumpLru(){return this[di]}set(e,t,i){if(i=i||this[rc],i&&typeof i!="number")throw new TypeError("maxAge must be a number");let n=i?Date.now():0,s=this[Og](t,e);if(this[Ws].has(e)){if(s>this[tc])return Mg(this,this[Ws].get(e)),!1;let l=this[Ws].get(e).value;return this[Ea]&&(this[CG]||this[Ea](e,l.value)),l.now=n,l.maxAge=i,l.value=t,this[Ia]+=s-l.length,l.length=s,this.get(e),od(this),!0}let o=new av(e,t,s,n,i);return o.length>this[tc]?(this[Ea]&&this[Ea](e,t),!1):(this[Ia]+=o.length,this[di].unshift(o),this[Ws].set(e,this[di].head),od(this),!0)}has(e){if(!this[Ws].has(e))return!1;let t=this[Ws].get(e).value;return!LI(this,t)}get(e){return sv(this,e,!0)}peek(e){return sv(this,e,!1)}pop(){let e=this[di].tail;return e?(Mg(this,e),e.value):null}del(e){Mg(this,this[Ws].get(e))}load(e){this.reset();let t=Date.now();for(let i=e.length-1;i>=0;i--){let n=e[i],s=n.e||0;if(s===0)this.set(n.k,n.v);else{let o=s-t;o>0&&this.set(n.k,n.v,o)}}}prune(){this[Ws].forEach((e,t)=>sv(this,t,!1))}},sv=(r,e,t)=>{let i=r[Ws].get(e);if(i){let n=i.value;if(LI(r,n)){if(Mg(r,i),!r[ad])return}else t&&(r[EG]&&(i.value.now=Date.now()),r[di].unshiftNode(i));return n.value}},LI=(r,e)=>{if(!e||!e.maxAge&&!r[rc])return!1;let t=Date.now()-e.now;return e.maxAge?t>e.maxAge:r[rc]&&t>r[rc]},od=r=>{if(r[Ia]>r[tc])for(let e=r[di].tail;r[Ia]>r[tc]&&e!==null;){let t=e.prev;Mg(r,e),e=t}},Mg=(r,e)=>{if(e){let t=e.value;r[Ea]&&r[Ea](t.key,t.value),r[Ia]-=t.length,r[Ws].delete(t.key),r[di].removeNode(e)}},av=class{constructor(e,t,i,n,s){this.key=e,this.value=t,this.length=i,this.now=n,this.maxAge=s||0}},mG=(r,e,t,i)=>{let n=t.value;LI(r,n)&&(Mg(r,t),r[ad]||(n=void 0)),n&&e.call(i,n.value,n.key,r)};IG.exports=ov});var os=w((PZe,bG)=>{var ic=class{constructor(e,t){if(t=NCe(t),e instanceof ic)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new ic(e.raw,t);if(e instanceof Av)return this.raw=e.value,this.set=[[e]],this.format(),this;if(this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease,this.raw=e,this.set=e.split(/\s*\|\|\s*/).map(i=>this.parseRange(i.trim())).filter(i=>i.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${e}`);if(this.set.length>1){let i=this.set[0];if(this.set=this.set.filter(n=>!BG(n[0])),this.set.length===0)this.set=[i];else if(this.set.length>1){for(let n of this.set)if(n.length===1&&KCe(n[0])){this.set=[n];break}}}this.format()}format(){return this.range=this.set.map(e=>e.join(" ").trim()).join("||").trim(),this.range}toString(){return this.range}parseRange(e){e=e.trim();let i=`parseRange:${Object.keys(this.options).join(",")}:${e}`,n=wG.get(i);if(n)return n;let s=this.options.loose,o=s?Ti[Bi.HYPHENRANGELOOSE]:Ti[Bi.HYPHENRANGE];e=e.replace(o,VCe(this.options.includePrerelease)),Gr("hyphen replace",e),e=e.replace(Ti[Bi.COMPARATORTRIM],TCe),Gr("comparator trim",e,Ti[Bi.COMPARATORTRIM]),e=e.replace(Ti[Bi.TILDETRIM],OCe),e=e.replace(Ti[Bi.CARETTRIM],MCe),e=e.split(/\s+/).join(" ");let a=s?Ti[Bi.COMPARATORLOOSE]:Ti[Bi.COMPARATOR],l=e.split(" ").map(f=>UCe(f,this.options)).join(" ").split(/\s+/).map(f=>zCe(f,this.options)).filter(this.options.loose?f=>!!f.match(a):()=>!0).map(f=>new Av(f,this.options)),c=l.length,u=new Map;for(let f of l){if(BG(f))return[f];u.set(f.value,f)}u.size>1&&u.has("")&&u.delete("");let g=[...u.values()];return wG.set(i,g),g}intersects(e,t){if(!(e instanceof ic))throw new TypeError("a Range is required");return this.set.some(i=>QG(i,t)&&e.set.some(n=>QG(n,t)&&i.every(s=>n.every(o=>s.intersects(o,t)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new LCe(e,this.options)}catch{return!1}for(let t=0;tr.value==="<0.0.0-0",KCe=r=>r.value==="",QG=(r,e)=>{let t=!0,i=r.slice(),n=i.pop();for(;t&&i.length;)t=i.every(s=>n.intersects(s,e)),n=i.pop();return t},UCe=(r,e)=>(Gr("comp",r,e),r=YCe(r,e),Gr("caret",r),r=HCe(r,e),Gr("tildes",r),r=qCe(r,e),Gr("xrange",r),r=WCe(r,e),Gr("stars",r),r),Vi=r=>!r||r.toLowerCase()==="x"||r==="*",HCe=(r,e)=>r.trim().split(/\s+/).map(t=>GCe(t,e)).join(" "),GCe=(r,e)=>{let t=e.loose?Ti[Bi.TILDELOOSE]:Ti[Bi.TILDE];return r.replace(t,(i,n,s,o,a)=>{Gr("tilde",r,i,n,s,o,a);let l;return Vi(n)?l="":Vi(s)?l=`>=${n}.0.0 <${+n+1}.0.0-0`:Vi(o)?l=`>=${n}.${s}.0 <${n}.${+s+1}.0-0`:a?(Gr("replaceTilde pr",a),l=`>=${n}.${s}.${o}-${a} <${n}.${+s+1}.0-0`):l=`>=${n}.${s}.${o} <${n}.${+s+1}.0-0`,Gr("tilde return",l),l})},YCe=(r,e)=>r.trim().split(/\s+/).map(t=>jCe(t,e)).join(" "),jCe=(r,e)=>{Gr("caret",r,e);let t=e.loose?Ti[Bi.CARETLOOSE]:Ti[Bi.CARET],i=e.includePrerelease?"-0":"";return r.replace(t,(n,s,o,a,l)=>{Gr("caret",r,n,s,o,a,l);let c;return Vi(s)?c="":Vi(o)?c=`>=${s}.0.0${i} <${+s+1}.0.0-0`:Vi(a)?s==="0"?c=`>=${s}.${o}.0${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.0${i} <${+s+1}.0.0-0`:l?(Gr("replaceCaret pr",l),s==="0"?o==="0"?c=`>=${s}.${o}.${a}-${l} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}-${l} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a}-${l} <${+s+1}.0.0-0`):(Gr("no pr"),s==="0"?o==="0"?c=`>=${s}.${o}.${a}${i} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a} <${+s+1}.0.0-0`),Gr("caret return",c),c})},qCe=(r,e)=>(Gr("replaceXRanges",r,e),r.split(/\s+/).map(t=>JCe(t,e)).join(" ")),JCe=(r,e)=>{r=r.trim();let t=e.loose?Ti[Bi.XRANGELOOSE]:Ti[Bi.XRANGE];return r.replace(t,(i,n,s,o,a,l)=>{Gr("xRange",r,i,n,s,o,a,l);let c=Vi(s),u=c||Vi(o),g=u||Vi(a),f=g;return n==="="&&f&&(n=""),l=e.includePrerelease?"-0":"",c?n===">"||n==="<"?i="<0.0.0-0":i="*":n&&f?(u&&(o=0),a=0,n===">"?(n=">=",u?(s=+s+1,o=0,a=0):(o=+o+1,a=0)):n==="<="&&(n="<",u?s=+s+1:o=+o+1),n==="<"&&(l="-0"),i=`${n+s}.${o}.${a}${l}`):u?i=`>=${s}.0.0${l} <${+s+1}.0.0-0`:g&&(i=`>=${s}.${o}.0${l} <${s}.${+o+1}.0-0`),Gr("xRange return",i),i})},WCe=(r,e)=>(Gr("replaceStars",r,e),r.trim().replace(Ti[Bi.STAR],"")),zCe=(r,e)=>(Gr("replaceGTE0",r,e),r.trim().replace(Ti[e.includePrerelease?Bi.GTE0PRE:Bi.GTE0],"")),VCe=r=>(e,t,i,n,s,o,a,l,c,u,g,f,h)=>(Vi(i)?t="":Vi(n)?t=`>=${i}.0.0${r?"-0":""}`:Vi(s)?t=`>=${i}.${n}.0${r?"-0":""}`:o?t=`>=${t}`:t=`>=${t}${r?"-0":""}`,Vi(c)?l="":Vi(u)?l=`<${+c+1}.0.0-0`:Vi(g)?l=`<${c}.${+u+1}.0-0`:f?l=`<=${c}.${u}.${g}-${f}`:r?l=`<${c}.${u}.${+g+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),XCe=(r,e,t)=>{for(let i=0;i0){let n=r[i].semver;if(n.major===e.major&&n.minor===e.minor&&n.patch===e.patch)return!0}return!1}return!0}});var Ad=w((DZe,DG)=>{var ld=Symbol("SemVer ANY"),Kg=class{static get ANY(){return ld}constructor(e,t){if(t=_Ce(t),e instanceof Kg){if(e.loose===!!t.loose)return e;e=e.value}cv("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===ld?this.value="":this.value=this.operator+this.semver.version,cv("comp",this)}parse(e){let t=this.options.loose?SG[vG.COMPARATORLOOSE]:SG[vG.COMPARATOR],i=e.match(t);if(!i)throw new TypeError(`Invalid comparator: ${e}`);this.operator=i[1]!==void 0?i[1]:"",this.operator==="="&&(this.operator=""),i[2]?this.semver=new xG(i[2],this.options.loose):this.semver=ld}toString(){return this.value}test(e){if(cv("Comparator.test",e,this.options.loose),this.semver===ld||e===ld)return!0;if(typeof e=="string")try{e=new xG(e,this.options)}catch{return!1}return lv(e,this.operator,this.semver,this.options)}intersects(e,t){if(!(e instanceof Kg))throw new TypeError("a Comparator is required");if((!t||typeof t!="object")&&(t={loose:!!t,includePrerelease:!1}),this.operator==="")return this.value===""?!0:new PG(e.value,t).test(this.value);if(e.operator==="")return e.value===""?!0:new PG(this.value,t).test(e.semver);let i=(this.operator===">="||this.operator===">")&&(e.operator===">="||e.operator===">"),n=(this.operator==="<="||this.operator==="<")&&(e.operator==="<="||e.operator==="<"),s=this.semver.version===e.semver.version,o=(this.operator===">="||this.operator==="<=")&&(e.operator===">="||e.operator==="<="),a=lv(this.semver,"<",e.semver,t)&&(this.operator===">="||this.operator===">")&&(e.operator==="<="||e.operator==="<"),l=lv(this.semver,">",e.semver,t)&&(this.operator==="<="||this.operator==="<")&&(e.operator===">="||e.operator===">");return i||n||s&&o||a||l}};DG.exports=Kg;var _Ce=rd(),{re:SG,t:vG}=Zl(),lv=iv(),cv=td(),xG=Li(),PG=os()});var cd=w((kZe,kG)=>{var ZCe=os(),$Ce=(r,e,t)=>{try{e=new ZCe(e,t)}catch{return!1}return e.test(r)};kG.exports=$Ce});var FG=w((RZe,RG)=>{var eme=os(),tme=(r,e)=>new eme(r,e).set.map(t=>t.map(i=>i.value).join(" ").trim().split(" "));RG.exports=tme});var LG=w((FZe,NG)=>{var rme=Li(),ime=os(),nme=(r,e,t)=>{let i=null,n=null,s=null;try{s=new ime(e,t)}catch{return null}return r.forEach(o=>{s.test(o)&&(!i||n.compare(o)===-1)&&(i=o,n=new rme(i,t))}),i};NG.exports=nme});var OG=w((NZe,TG)=>{var sme=Li(),ome=os(),ame=(r,e,t)=>{let i=null,n=null,s=null;try{s=new ome(e,t)}catch{return null}return r.forEach(o=>{s.test(o)&&(!i||n.compare(o)===1)&&(i=o,n=new sme(i,t))}),i};TG.exports=ame});var UG=w((LZe,KG)=>{var uv=Li(),Ame=os(),MG=nd(),lme=(r,e)=>{r=new Ame(r,e);let t=new uv("0.0.0");if(r.test(t)||(t=new uv("0.0.0-0"),r.test(t)))return t;t=null;for(let i=0;i{let a=new uv(o.semver.version);switch(o.operator){case">":a.prerelease.length===0?a.patch++:a.prerelease.push(0),a.raw=a.format();case"":case">=":(!s||MG(a,s))&&(s=a);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${o.operator}`)}}),s&&(!t||MG(t,s))&&(t=s)}return t&&r.test(t)?t:null};KG.exports=lme});var GG=w((TZe,HG)=>{var cme=os(),ume=(r,e)=>{try{return new cme(r,e).range||"*"}catch{return null}};HG.exports=ume});var TI=w((OZe,JG)=>{var gme=Li(),qG=Ad(),{ANY:fme}=qG,hme=os(),pme=cd(),YG=nd(),jG=DI(),dme=RI(),Cme=kI(),mme=(r,e,t,i)=>{r=new gme(r,i),e=new hme(e,i);let n,s,o,a,l;switch(t){case">":n=YG,s=dme,o=jG,a=">",l=">=";break;case"<":n=jG,s=Cme,o=YG,a="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(pme(r,e,i))return!1;for(let c=0;c{h.semver===fme&&(h=new qG(">=0.0.0")),g=g||h,f=f||h,n(h.semver,g.semver,i)?g=h:o(h.semver,f.semver,i)&&(f=h)}),g.operator===a||g.operator===l||(!f.operator||f.operator===a)&&s(r,f.semver))return!1;if(f.operator===l&&o(r,f.semver))return!1}return!0};JG.exports=mme});var zG=w((MZe,WG)=>{var Eme=TI(),Ime=(r,e,t)=>Eme(r,e,">",t);WG.exports=Ime});var XG=w((KZe,VG)=>{var yme=TI(),wme=(r,e,t)=>yme(r,e,"<",t);VG.exports=wme});var $G=w((UZe,ZG)=>{var _G=os(),Bme=(r,e,t)=>(r=new _G(r,t),e=new _G(e,t),r.intersects(e));ZG.exports=Bme});var tY=w((HZe,eY)=>{var Qme=cd(),bme=ss();eY.exports=(r,e,t)=>{let i=[],n=null,s=null,o=r.sort((u,g)=>bme(u,g,t));for(let u of o)Qme(u,e,t)?(s=u,n||(n=u)):(s&&i.push([n,s]),s=null,n=null);n&&i.push([n,null]);let a=[];for(let[u,g]of i)u===g?a.push(u):!g&&u===o[0]?a.push("*"):g?u===o[0]?a.push(`<=${g}`):a.push(`${u} - ${g}`):a.push(`>=${u}`);let l=a.join(" || "),c=typeof e.raw=="string"?e.raw:String(e);return l.length{var rY=os(),OI=Ad(),{ANY:gv}=OI,ud=cd(),fv=ss(),Sme=(r,e,t={})=>{if(r===e)return!0;r=new rY(r,t),e=new rY(e,t);let i=!1;e:for(let n of r.set){for(let s of e.set){let o=vme(n,s,t);if(i=i||o!==null,o)continue e}if(i)return!1}return!0},vme=(r,e,t)=>{if(r===e)return!0;if(r.length===1&&r[0].semver===gv){if(e.length===1&&e[0].semver===gv)return!0;t.includePrerelease?r=[new OI(">=0.0.0-0")]:r=[new OI(">=0.0.0")]}if(e.length===1&&e[0].semver===gv){if(t.includePrerelease)return!0;e=[new OI(">=0.0.0")]}let i=new Set,n,s;for(let h of r)h.operator===">"||h.operator===">="?n=iY(n,h,t):h.operator==="<"||h.operator==="<="?s=nY(s,h,t):i.add(h.semver);if(i.size>1)return null;let o;if(n&&s){if(o=fv(n.semver,s.semver,t),o>0)return null;if(o===0&&(n.operator!==">="||s.operator!=="<="))return null}for(let h of i){if(n&&!ud(h,String(n),t)||s&&!ud(h,String(s),t))return null;for(let p of e)if(!ud(h,String(p),t))return!1;return!0}let a,l,c,u,g=s&&!t.includePrerelease&&s.semver.prerelease.length?s.semver:!1,f=n&&!t.includePrerelease&&n.semver.prerelease.length?n.semver:!1;g&&g.prerelease.length===1&&s.operator==="<"&&g.prerelease[0]===0&&(g=!1);for(let h of e){if(u=u||h.operator===">"||h.operator===">=",c=c||h.operator==="<"||h.operator==="<=",n){if(f&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===f.major&&h.semver.minor===f.minor&&h.semver.patch===f.patch&&(f=!1),h.operator===">"||h.operator===">="){if(a=iY(n,h,t),a===h&&a!==n)return!1}else if(n.operator===">="&&!ud(n.semver,String(h),t))return!1}if(s){if(g&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===g.major&&h.semver.minor===g.minor&&h.semver.patch===g.patch&&(g=!1),h.operator==="<"||h.operator==="<="){if(l=nY(s,h,t),l===h&&l!==s)return!1}else if(s.operator==="<="&&!ud(s.semver,String(h),t))return!1}if(!h.operator&&(s||n)&&o!==0)return!1}return!(n&&c&&!s&&o!==0||s&&u&&!n&&o!==0||f||g)},iY=(r,e,t)=>{if(!r)return e;let i=fv(r.semver,e.semver,t);return i>0?r:i<0||e.operator===">"&&r.operator===">="?e:r},nY=(r,e,t)=>{if(!r)return e;let i=fv(r.semver,e.semver,t);return i<0?r:i>0||e.operator==="<"&&r.operator==="<="?e:r};sY.exports=Sme});var Xr=w((YZe,aY)=>{var hv=Zl();aY.exports={re:hv.re,src:hv.src,tokens:hv.t,SEMVER_SPEC_VERSION:ed().SEMVER_SPEC_VERSION,SemVer:Li(),compareIdentifiers:bI().compareIdentifiers,rcompareIdentifiers:bI().rcompareIdentifiers,parse:$l(),valid:kH(),clean:FH(),inc:LH(),diff:HH(),major:YH(),minor:qH(),patch:WH(),prerelease:VH(),compare:ss(),rcompare:_H(),compareLoose:$H(),compareBuild:PI(),sort:iG(),rsort:sG(),gt:nd(),lt:DI(),eq:xI(),neq:rv(),gte:kI(),lte:RI(),cmp:iv(),coerce:fG(),Comparator:Ad(),Range:os(),satisfies:cd(),toComparators:FG(),maxSatisfying:LG(),minSatisfying:OG(),minVersion:UG(),validRange:GG(),outside:TI(),gtr:zG(),ltr:XG(),intersects:$G(),simplifyRange:tY(),subset:oY()}});var pv=w(MI=>{"use strict";Object.defineProperty(MI,"__esModule",{value:!0});MI.VERSION=void 0;MI.VERSION="9.1.0"});var Gt=w((exports,module)=>{"use strict";var __spreadArray=exports&&exports.__spreadArray||function(r,e,t){if(t||arguments.length===2)for(var i=0,n=e.length,s;i{(function(r,e){typeof define=="function"&&define.amd?define([],e):typeof KI=="object"&&KI.exports?KI.exports=e():r.regexpToAst=e()})(typeof self<"u"?self:AY,function(){function r(){}r.prototype.saveState=function(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}},r.prototype.restoreState=function(p){this.idx=p.idx,this.input=p.input,this.groupIdx=p.groupIdx},r.prototype.pattern=function(p){this.idx=0,this.input=p,this.groupIdx=0,this.consumeChar("/");var C=this.disjunction();this.consumeChar("/");for(var y={type:"Flags",loc:{begin:this.idx,end:p.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};this.isRegExpFlag();)switch(this.popChar()){case"g":o(y,"global");break;case"i":o(y,"ignoreCase");break;case"m":o(y,"multiLine");break;case"u":o(y,"unicode");break;case"y":o(y,"sticky");break}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:y,value:C,loc:this.loc(0)}},r.prototype.disjunction=function(){var p=[],C=this.idx;for(p.push(this.alternative());this.peekChar()==="|";)this.consumeChar("|"),p.push(this.alternative());return{type:"Disjunction",value:p,loc:this.loc(C)}},r.prototype.alternative=function(){for(var p=[],C=this.idx;this.isTerm();)p.push(this.term());return{type:"Alternative",value:p,loc:this.loc(C)}},r.prototype.term=function(){return this.isAssertion()?this.assertion():this.atom()},r.prototype.assertion=function(){var p=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(p)};case"$":return{type:"EndAnchor",loc:this.loc(p)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(p)};case"B":return{type:"NonWordBoundary",loc:this.loc(p)}}throw Error("Invalid Assertion Escape");case"(":this.consumeChar("?");var C;switch(this.popChar()){case"=":C="Lookahead";break;case"!":C="NegativeLookahead";break}a(C);var y=this.disjunction();return this.consumeChar(")"),{type:C,value:y,loc:this.loc(p)}}l()},r.prototype.quantifier=function(p){var C,y=this.idx;switch(this.popChar()){case"*":C={atLeast:0,atMost:1/0};break;case"+":C={atLeast:1,atMost:1/0};break;case"?":C={atLeast:0,atMost:1};break;case"{":var B=this.integerIncludingZero();switch(this.popChar()){case"}":C={atLeast:B,atMost:B};break;case",":var v;this.isDigit()?(v=this.integerIncludingZero(),C={atLeast:B,atMost:v}):C={atLeast:B,atMost:1/0},this.consumeChar("}");break}if(p===!0&&C===void 0)return;a(C);break}if(!(p===!0&&C===void 0))return a(C),this.peekChar(0)==="?"?(this.consumeChar("?"),C.greedy=!1):C.greedy=!0,C.type="Quantifier",C.loc=this.loc(y),C},r.prototype.atom=function(){var p,C=this.idx;switch(this.peekChar()){case".":p=this.dotAll();break;case"\\":p=this.atomEscape();break;case"[":p=this.characterClass();break;case"(":p=this.group();break}return p===void 0&&this.isPatternCharacter()&&(p=this.patternCharacter()),a(p),p.loc=this.loc(C),this.isQuantifier()&&(p.quantifier=this.quantifier()),p},r.prototype.dotAll=function(){return this.consumeChar("."),{type:"Set",complement:!0,value:[n(` -`),n("\r"),n("\u2028"),n("\u2029")]}},r.prototype.atomEscape=function(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}},r.prototype.decimalEscapeAtom=function(){var p=this.positiveInteger();return{type:"GroupBackReference",value:p}},r.prototype.characterClassEscape=function(){var p,C=!1;switch(this.popChar()){case"d":p=u;break;case"D":p=u,C=!0;break;case"s":p=f;break;case"S":p=f,C=!0;break;case"w":p=g;break;case"W":p=g,C=!0;break}return a(p),{type:"Set",value:p,complement:C}},r.prototype.controlEscapeAtom=function(){var p;switch(this.popChar()){case"f":p=n("\f");break;case"n":p=n(` -`);break;case"r":p=n("\r");break;case"t":p=n(" ");break;case"v":p=n("\v");break}return a(p),{type:"Character",value:p}},r.prototype.controlLetterEscapeAtom=function(){this.consumeChar("c");var p=this.popChar();if(/[a-zA-Z]/.test(p)===!1)throw Error("Invalid ");var C=p.toUpperCase().charCodeAt(0)-64;return{type:"Character",value:C}},r.prototype.nulCharacterAtom=function(){return this.consumeChar("0"),{type:"Character",value:n("\0")}},r.prototype.hexEscapeSequenceAtom=function(){return this.consumeChar("x"),this.parseHexDigits(2)},r.prototype.regExpUnicodeEscapeSequenceAtom=function(){return this.consumeChar("u"),this.parseHexDigits(4)},r.prototype.identityEscapeAtom=function(){var p=this.popChar();return{type:"Character",value:n(p)}},r.prototype.classPatternCharacterAtom=function(){switch(this.peekChar()){case` -`:case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:var p=this.popChar();return{type:"Character",value:n(p)}}},r.prototype.characterClass=function(){var p=[],C=!1;for(this.consumeChar("["),this.peekChar(0)==="^"&&(this.consumeChar("^"),C=!0);this.isClassAtom();){var y=this.classAtom(),B=y.type==="Character";if(B&&this.isRangeDash()){this.consumeChar("-");var v=this.classAtom(),D=v.type==="Character";if(D){if(v.value=this.input.length)throw Error("Unexpected end of input");this.idx++},r.prototype.loc=function(p){return{begin:p,end:this.idx}};var e=/[0-9a-fA-F]/,t=/[0-9]/,i=/[1-9]/;function n(p){return p.charCodeAt(0)}function s(p,C){p.length!==void 0?p.forEach(function(y){C.push(y)}):C.push(p)}function o(p,C){if(p[C]===!0)throw"duplicate flag "+C;p[C]=!0}function a(p){if(p===void 0)throw Error("Internal Error - Should never get here!")}function l(){throw Error("Internal Error - Should never get here!")}var c,u=[];for(c=n("0");c<=n("9");c++)u.push(c);var g=[n("_")].concat(u);for(c=n("a");c<=n("z");c++)g.push(c);for(c=n("A");c<=n("Z");c++)g.push(c);var f=[n(" "),n("\f"),n(` -`),n("\r"),n(" "),n("\v"),n(" "),n("\xA0"),n("\u1680"),n("\u2000"),n("\u2001"),n("\u2002"),n("\u2003"),n("\u2004"),n("\u2005"),n("\u2006"),n("\u2007"),n("\u2008"),n("\u2009"),n("\u200A"),n("\u2028"),n("\u2029"),n("\u202F"),n("\u205F"),n("\u3000"),n("\uFEFF")];function h(){}return h.prototype.visitChildren=function(p){for(var C in p){var y=p[C];p.hasOwnProperty(C)&&(y.type!==void 0?this.visit(y):Array.isArray(y)&&y.forEach(function(B){this.visit(B)},this))}},h.prototype.visit=function(p){switch(p.type){case"Pattern":this.visitPattern(p);break;case"Flags":this.visitFlags(p);break;case"Disjunction":this.visitDisjunction(p);break;case"Alternative":this.visitAlternative(p);break;case"StartAnchor":this.visitStartAnchor(p);break;case"EndAnchor":this.visitEndAnchor(p);break;case"WordBoundary":this.visitWordBoundary(p);break;case"NonWordBoundary":this.visitNonWordBoundary(p);break;case"Lookahead":this.visitLookahead(p);break;case"NegativeLookahead":this.visitNegativeLookahead(p);break;case"Character":this.visitCharacter(p);break;case"Set":this.visitSet(p);break;case"Group":this.visitGroup(p);break;case"GroupBackReference":this.visitGroupBackReference(p);break;case"Quantifier":this.visitQuantifier(p);break}this.visitChildren(p)},h.prototype.visitPattern=function(p){},h.prototype.visitFlags=function(p){},h.prototype.visitDisjunction=function(p){},h.prototype.visitAlternative=function(p){},h.prototype.visitStartAnchor=function(p){},h.prototype.visitEndAnchor=function(p){},h.prototype.visitWordBoundary=function(p){},h.prototype.visitNonWordBoundary=function(p){},h.prototype.visitLookahead=function(p){},h.prototype.visitNegativeLookahead=function(p){},h.prototype.visitCharacter=function(p){},h.prototype.visitSet=function(p){},h.prototype.visitGroup=function(p){},h.prototype.visitGroupBackReference=function(p){},h.prototype.visitQuantifier=function(p){},{RegExpParser:r,BaseRegExpVisitor:h,VERSION:"0.5.0"}})});var GI=w(Ug=>{"use strict";Object.defineProperty(Ug,"__esModule",{value:!0});Ug.clearRegExpParserCache=Ug.getRegExpAst=void 0;var xme=UI(),HI={},Pme=new xme.RegExpParser;function Dme(r){var e=r.toString();if(HI.hasOwnProperty(e))return HI[e];var t=Pme.pattern(e);return HI[e]=t,t}Ug.getRegExpAst=Dme;function kme(){HI={}}Ug.clearRegExpParserCache=kme});var fY=w(pn=>{"use strict";var Rme=pn&&pn.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(pn,"__esModule",{value:!0});pn.canMatchCharCode=pn.firstCharOptimizedIndices=pn.getOptimizedStartCodesIndices=pn.failedOptimizationPrefixMsg=void 0;var cY=UI(),as=Gt(),uY=GI(),ya=Cv(),gY="Complement Sets are not supported for first char optimization";pn.failedOptimizationPrefixMsg=`Unable to use "first char" lexer optimizations: -`;function Fme(r,e){e===void 0&&(e=!1);try{var t=(0,uY.getRegExpAst)(r),i=jI(t.value,{},t.flags.ignoreCase);return i}catch(s){if(s.message===gY)e&&(0,as.PRINT_WARNING)(""+pn.failedOptimizationPrefixMsg+(" Unable to optimize: < "+r.toString()+` > -`)+` Complement Sets cannot be automatically optimized. - This will disable the lexer's first char optimizations. - See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{var n="";e&&(n=` - This will disable the lexer's first char optimizations. - See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.`),(0,as.PRINT_ERROR)(pn.failedOptimizationPrefixMsg+` -`+(" Failed parsing: < "+r.toString()+` > -`)+(" Using the regexp-to-ast library version: "+cY.VERSION+` -`)+" Please open an issue at: https://github.com/bd82/regexp-to-ast/issues"+n)}}return[]}pn.getOptimizedStartCodesIndices=Fme;function jI(r,e,t){switch(r.type){case"Disjunction":for(var i=0;i=ya.minOptimizationVal)for(var f=u.from>=ya.minOptimizationVal?u.from:ya.minOptimizationVal,h=u.to,p=(0,ya.charCodeToOptimizedIndex)(f),C=(0,ya.charCodeToOptimizedIndex)(h),y=p;y<=C;y++)e[y]=y}}});break;case"Group":jI(o.value,e,t);break;default:throw Error("Non Exhaustive Match")}var a=o.quantifier!==void 0&&o.quantifier.atLeast===0;if(o.type==="Group"&&dv(o)===!1||o.type!=="Group"&&a===!1)break}break;default:throw Error("non exhaustive match!")}return(0,as.values)(e)}pn.firstCharOptimizedIndices=jI;function YI(r,e,t){var i=(0,ya.charCodeToOptimizedIndex)(r);e[i]=i,t===!0&&Nme(r,e)}function Nme(r,e){var t=String.fromCharCode(r),i=t.toUpperCase();if(i!==t){var n=(0,ya.charCodeToOptimizedIndex)(i.charCodeAt(0));e[n]=n}else{var s=t.toLowerCase();if(s!==t){var n=(0,ya.charCodeToOptimizedIndex)(s.charCodeAt(0));e[n]=n}}}function lY(r,e){return(0,as.find)(r.value,function(t){if(typeof t=="number")return(0,as.contains)(e,t);var i=t;return(0,as.find)(e,function(n){return i.from<=n&&n<=i.to})!==void 0})}function dv(r){return r.quantifier&&r.quantifier.atLeast===0?!0:r.value?(0,as.isArray)(r.value)?(0,as.every)(r.value,dv):dv(r.value):!1}var Lme=function(r){Rme(e,r);function e(t){var i=r.call(this)||this;return i.targetCharCodes=t,i.found=!1,i}return e.prototype.visitChildren=function(t){if(this.found!==!0){switch(t.type){case"Lookahead":this.visitLookahead(t);return;case"NegativeLookahead":this.visitNegativeLookahead(t);return}r.prototype.visitChildren.call(this,t)}},e.prototype.visitCharacter=function(t){(0,as.contains)(this.targetCharCodes,t.value)&&(this.found=!0)},e.prototype.visitSet=function(t){t.complement?lY(t,this.targetCharCodes)===void 0&&(this.found=!0):lY(t,this.targetCharCodes)!==void 0&&(this.found=!0)},e}(cY.BaseRegExpVisitor);function Tme(r,e){if(e instanceof RegExp){var t=(0,uY.getRegExpAst)(e),i=new Lme(r);return i.visit(t),i.found}else return(0,as.find)(e,function(n){return(0,as.contains)(r,n.charCodeAt(0))})!==void 0}pn.canMatchCharCode=Tme});var Cv=w(Ve=>{"use strict";var hY=Ve&&Ve.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Ve,"__esModule",{value:!0});Ve.charCodeToOptimizedIndex=Ve.minOptimizationVal=Ve.buildLineBreakIssueMessage=Ve.LineTerminatorOptimizedTester=Ve.isShortPattern=Ve.isCustomPattern=Ve.cloneEmptyGroups=Ve.performWarningRuntimeChecks=Ve.performRuntimeChecks=Ve.addStickyFlag=Ve.addStartOfInput=Ve.findUnreachablePatterns=Ve.findModesThatDoNotExist=Ve.findInvalidGroupType=Ve.findDuplicatePatterns=Ve.findUnsupportedFlags=Ve.findStartOfInputAnchor=Ve.findEmptyMatchRegExps=Ve.findEndOfInputAnchor=Ve.findInvalidPatterns=Ve.findMissingPatterns=Ve.validatePatterns=Ve.analyzeTokenTypes=Ve.enableSticky=Ve.disableSticky=Ve.SUPPORT_STICKY=Ve.MODES=Ve.DEFAULT_MODE=void 0;var pY=UI(),ir=gd(),xe=Gt(),Hg=fY(),dY=GI(),So="PATTERN";Ve.DEFAULT_MODE="defaultMode";Ve.MODES="modes";Ve.SUPPORT_STICKY=typeof new RegExp("(?:)").sticky=="boolean";function Ome(){Ve.SUPPORT_STICKY=!1}Ve.disableSticky=Ome;function Mme(){Ve.SUPPORT_STICKY=!0}Ve.enableSticky=Mme;function Kme(r,e){e=(0,xe.defaults)(e,{useSticky:Ve.SUPPORT_STICKY,debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r",` -`],tracer:function(v,D){return D()}});var t=e.tracer;t("initCharCodeToOptimizedIndexMap",function(){Vme()});var i;t("Reject Lexer.NA",function(){i=(0,xe.reject)(r,function(v){return v[So]===ir.Lexer.NA})});var n=!1,s;t("Transform Patterns",function(){n=!1,s=(0,xe.map)(i,function(v){var D=v[So];if((0,xe.isRegExp)(D)){var L=D.source;return L.length===1&&L!=="^"&&L!=="$"&&L!=="."&&!D.ignoreCase?L:L.length===2&&L[0]==="\\"&&!(0,xe.contains)(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],L[1])?L[1]:e.useSticky?Iv(D):Ev(D)}else{if((0,xe.isFunction)(D))return n=!0,{exec:D};if((0,xe.has)(D,"exec"))return n=!0,D;if(typeof D=="string"){if(D.length===1)return D;var H=D.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),j=new RegExp(H);return e.useSticky?Iv(j):Ev(j)}else throw Error("non exhaustive match")}})});var o,a,l,c,u;t("misc mapping",function(){o=(0,xe.map)(i,function(v){return v.tokenTypeIdx}),a=(0,xe.map)(i,function(v){var D=v.GROUP;if(D!==ir.Lexer.SKIPPED){if((0,xe.isString)(D))return D;if((0,xe.isUndefined)(D))return!1;throw Error("non exhaustive match")}}),l=(0,xe.map)(i,function(v){var D=v.LONGER_ALT;if(D){var L=(0,xe.isArray)(D)?(0,xe.map)(D,function(H){return(0,xe.indexOf)(i,H)}):[(0,xe.indexOf)(i,D)];return L}}),c=(0,xe.map)(i,function(v){return v.PUSH_MODE}),u=(0,xe.map)(i,function(v){return(0,xe.has)(v,"POP_MODE")})});var g;t("Line Terminator Handling",function(){var v=DY(e.lineTerminatorCharacters);g=(0,xe.map)(i,function(D){return!1}),e.positionTracking!=="onlyOffset"&&(g=(0,xe.map)(i,function(D){if((0,xe.has)(D,"LINE_BREAKS"))return D.LINE_BREAKS;if(xY(D,v)===!1)return(0,Hg.canMatchCharCode)(v,D.PATTERN)}))});var f,h,p,C;t("Misc Mapping #2",function(){f=(0,xe.map)(i,wv),h=(0,xe.map)(s,vY),p=(0,xe.reduce)(i,function(v,D){var L=D.GROUP;return(0,xe.isString)(L)&&L!==ir.Lexer.SKIPPED&&(v[L]=[]),v},{}),C=(0,xe.map)(s,function(v,D){return{pattern:s[D],longerAlt:l[D],canLineTerminator:g[D],isCustom:f[D],short:h[D],group:a[D],push:c[D],pop:u[D],tokenTypeIdx:o[D],tokenType:i[D]}})});var y=!0,B=[];return e.safeMode||t("First Char Optimization",function(){B=(0,xe.reduce)(i,function(v,D,L){if(typeof D.PATTERN=="string"){var H=D.PATTERN.charCodeAt(0),j=yv(H);mv(v,j,C[L])}else if((0,xe.isArray)(D.START_CHARS_HINT)){var $;(0,xe.forEach)(D.START_CHARS_HINT,function(W){var Z=typeof W=="string"?W.charCodeAt(0):W,A=yv(Z);$!==A&&($=A,mv(v,A,C[L]))})}else if((0,xe.isRegExp)(D.PATTERN))if(D.PATTERN.unicode)y=!1,e.ensureOptimizations&&(0,xe.PRINT_ERROR)(""+Hg.failedOptimizationPrefixMsg+(" Unable to analyze < "+D.PATTERN.toString()+` > pattern. -`)+` The regexp unicode flag is not currently supported by the regexp-to-ast library. - This will disable the lexer's first char optimizations. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{var V=(0,Hg.getOptimizedStartCodesIndices)(D.PATTERN,e.ensureOptimizations);(0,xe.isEmpty)(V)&&(y=!1),(0,xe.forEach)(V,function(W){mv(v,W,C[L])})}else e.ensureOptimizations&&(0,xe.PRINT_ERROR)(""+Hg.failedOptimizationPrefixMsg+(" TokenType: <"+D.name+`> is using a custom token pattern without providing parameter. -`)+` This will disable the lexer's first char optimizations. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),y=!1;return v},[])}),t("ArrayPacking",function(){B=(0,xe.packArray)(B)}),{emptyGroups:p,patternIdxToConfig:C,charCodeToPatternIdxToConfig:B,hasCustom:n,canBeOptimized:y}}Ve.analyzeTokenTypes=Kme;function Ume(r,e){var t=[],i=CY(r);t=t.concat(i.errors);var n=mY(i.valid),s=n.valid;return t=t.concat(n.errors),t=t.concat(Hme(s)),t=t.concat(QY(s)),t=t.concat(bY(s,e)),t=t.concat(SY(s)),t}Ve.validatePatterns=Ume;function Hme(r){var e=[],t=(0,xe.filter)(r,function(i){return(0,xe.isRegExp)(i[So])});return e=e.concat(EY(t)),e=e.concat(yY(t)),e=e.concat(wY(t)),e=e.concat(BY(t)),e=e.concat(IY(t)),e}function CY(r){var e=(0,xe.filter)(r,function(n){return!(0,xe.has)(n,So)}),t=(0,xe.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- missing static 'PATTERN' property",type:ir.LexerDefinitionErrorType.MISSING_PATTERN,tokenTypes:[n]}}),i=(0,xe.difference)(r,e);return{errors:t,valid:i}}Ve.findMissingPatterns=CY;function mY(r){var e=(0,xe.filter)(r,function(n){var s=n[So];return!(0,xe.isRegExp)(s)&&!(0,xe.isFunction)(s)&&!(0,xe.has)(s,"exec")&&!(0,xe.isString)(s)}),t=(0,xe.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:ir.LexerDefinitionErrorType.INVALID_PATTERN,tokenTypes:[n]}}),i=(0,xe.difference)(r,e);return{errors:t,valid:i}}Ve.findInvalidPatterns=mY;var Gme=/[^\\][\$]/;function EY(r){var e=function(n){hY(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitEndAnchor=function(o){this.found=!0},s}(pY.BaseRegExpVisitor),t=(0,xe.filter)(r,function(n){var s=n[So];try{var o=(0,dY.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch{return Gme.test(s.source)}}),i=(0,xe.map)(t,function(n){return{message:`Unexpected RegExp Anchor Error: - Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain end of input anchor '$' - See chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:ir.LexerDefinitionErrorType.EOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}Ve.findEndOfInputAnchor=EY;function IY(r){var e=(0,xe.filter)(r,function(i){var n=i[So];return n.test("")}),t=(0,xe.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' must not match an empty string",type:ir.LexerDefinitionErrorType.EMPTY_MATCH_PATTERN,tokenTypes:[i]}});return t}Ve.findEmptyMatchRegExps=IY;var Yme=/[^\\[][\^]|^\^/;function yY(r){var e=function(n){hY(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitStartAnchor=function(o){this.found=!0},s}(pY.BaseRegExpVisitor),t=(0,xe.filter)(r,function(n){var s=n[So];try{var o=(0,dY.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch{return Yme.test(s.source)}}),i=(0,xe.map)(t,function(n){return{message:`Unexpected RegExp Anchor Error: - Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain start of input anchor '^' - See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:ir.LexerDefinitionErrorType.SOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}Ve.findStartOfInputAnchor=yY;function wY(r){var e=(0,xe.filter)(r,function(i){var n=i[So];return n instanceof RegExp&&(n.multiline||n.global)}),t=(0,xe.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:ir.LexerDefinitionErrorType.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[i]}});return t}Ve.findUnsupportedFlags=wY;function BY(r){var e=[],t=(0,xe.map)(r,function(s){return(0,xe.reduce)(r,function(o,a){return s.PATTERN.source===a.PATTERN.source&&!(0,xe.contains)(e,a)&&a.PATTERN!==ir.Lexer.NA&&(e.push(a),o.push(a)),o},[])});t=(0,xe.compact)(t);var i=(0,xe.filter)(t,function(s){return s.length>1}),n=(0,xe.map)(i,function(s){var o=(0,xe.map)(s,function(l){return l.name}),a=(0,xe.first)(s).PATTERN;return{message:"The same RegExp pattern ->"+a+"<-"+("has been used in all of the following Token Types: "+o.join(", ")+" <-"),type:ir.LexerDefinitionErrorType.DUPLICATE_PATTERNS_FOUND,tokenTypes:s}});return n}Ve.findDuplicatePatterns=BY;function QY(r){var e=(0,xe.filter)(r,function(i){if(!(0,xe.has)(i,"GROUP"))return!1;var n=i.GROUP;return n!==ir.Lexer.SKIPPED&&n!==ir.Lexer.NA&&!(0,xe.isString)(n)}),t=(0,xe.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:ir.LexerDefinitionErrorType.INVALID_GROUP_TYPE_FOUND,tokenTypes:[i]}});return t}Ve.findInvalidGroupType=QY;function bY(r,e){var t=(0,xe.filter)(r,function(n){return n.PUSH_MODE!==void 0&&!(0,xe.contains)(e,n.PUSH_MODE)}),i=(0,xe.map)(t,function(n){var s="Token Type: ->"+n.name+"<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->"+n.PUSH_MODE+"<-which does not exist";return{message:s,type:ir.LexerDefinitionErrorType.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[n]}});return i}Ve.findModesThatDoNotExist=bY;function SY(r){var e=[],t=(0,xe.reduce)(r,function(i,n,s){var o=n.PATTERN;return o===ir.Lexer.NA||((0,xe.isString)(o)?i.push({str:o,idx:s,tokenType:n}):(0,xe.isRegExp)(o)&&qme(o)&&i.push({str:o.source,idx:s,tokenType:n})),i},[]);return(0,xe.forEach)(r,function(i,n){(0,xe.forEach)(t,function(s){var o=s.str,a=s.idx,l=s.tokenType;if(n"+i.name+"<-")+`in the lexer's definition. -See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;e.push({message:c,type:ir.LexerDefinitionErrorType.UNREACHABLE_PATTERN,tokenTypes:[i,l]})}})}),e}Ve.findUnreachablePatterns=SY;function jme(r,e){if((0,xe.isRegExp)(e)){var t=e.exec(r);return t!==null&&t.index===0}else{if((0,xe.isFunction)(e))return e(r,0,[],{});if((0,xe.has)(e,"exec"))return e.exec(r,0,[],{});if(typeof e=="string")return e===r;throw Error("non exhaustive match")}}function qme(r){var e=[".","\\","[","]","|","^","$","(",")","?","*","+","{"];return(0,xe.find)(e,function(t){return r.source.indexOf(t)!==-1})===void 0}function Ev(r){var e=r.ignoreCase?"i":"";return new RegExp("^(?:"+r.source+")",e)}Ve.addStartOfInput=Ev;function Iv(r){var e=r.ignoreCase?"iy":"y";return new RegExp(""+r.source,e)}Ve.addStickyFlag=Iv;function Jme(r,e,t){var i=[];return(0,xe.has)(r,Ve.DEFAULT_MODE)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+Ve.DEFAULT_MODE+`> property in its definition -`,type:ir.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),(0,xe.has)(r,Ve.MODES)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+Ve.MODES+`> property in its definition -`,type:ir.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),(0,xe.has)(r,Ve.MODES)&&(0,xe.has)(r,Ve.DEFAULT_MODE)&&!(0,xe.has)(r.modes,r.defaultMode)&&i.push({message:"A MultiMode Lexer cannot be initialized with a "+Ve.DEFAULT_MODE+": <"+r.defaultMode+`>which does not exist -`,type:ir.LexerDefinitionErrorType.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),(0,xe.has)(r,Ve.MODES)&&(0,xe.forEach)(r.modes,function(n,s){(0,xe.forEach)(n,function(o,a){(0,xe.isUndefined)(o)&&i.push({message:"A Lexer cannot be initialized using an undefined Token Type. Mode:"+("<"+s+"> at index: <"+a+`> -`),type:ir.LexerDefinitionErrorType.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED})})}),i}Ve.performRuntimeChecks=Jme;function Wme(r,e,t){var i=[],n=!1,s=(0,xe.compact)((0,xe.flatten)((0,xe.mapValues)(r.modes,function(l){return l}))),o=(0,xe.reject)(s,function(l){return l[So]===ir.Lexer.NA}),a=DY(t);return e&&(0,xe.forEach)(o,function(l){var c=xY(l,a);if(c!==!1){var u=PY(l,c),g={message:u,type:c.issue,tokenType:l};i.push(g)}else(0,xe.has)(l,"LINE_BREAKS")?l.LINE_BREAKS===!0&&(n=!0):(0,Hg.canMatchCharCode)(a,l.PATTERN)&&(n=!0)}),e&&!n&&i.push({message:`Warning: No LINE_BREAKS Found. - This Lexer has been defined to track line and column information, - But none of the Token Types can be identified as matching a line terminator. - See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS - for details.`,type:ir.LexerDefinitionErrorType.NO_LINE_BREAKS_FLAGS}),i}Ve.performWarningRuntimeChecks=Wme;function zme(r){var e={},t=(0,xe.keys)(r);return(0,xe.forEach)(t,function(i){var n=r[i];if((0,xe.isArray)(n))e[i]=[];else throw Error("non exhaustive match")}),e}Ve.cloneEmptyGroups=zme;function wv(r){var e=r.PATTERN;if((0,xe.isRegExp)(e))return!1;if((0,xe.isFunction)(e))return!0;if((0,xe.has)(e,"exec"))return!0;if((0,xe.isString)(e))return!1;throw Error("non exhaustive match")}Ve.isCustomPattern=wv;function vY(r){return(0,xe.isString)(r)&&r.length===1?r.charCodeAt(0):!1}Ve.isShortPattern=vY;Ve.LineTerminatorOptimizedTester={test:function(r){for(var e=r.length,t=this.lastIndex;t Token Type -`)+(" Root cause: "+e.errMsg+`. -`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR";if(e.issue===ir.LexerDefinitionErrorType.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the option. -`+(" The problem is in the <"+r.name+`> Token Type -`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK";throw Error("non exhaustive match")}Ve.buildLineBreakIssueMessage=PY;function DY(r){var e=(0,xe.map)(r,function(t){return(0,xe.isString)(t)&&t.length>0?t.charCodeAt(0):t});return e}function mv(r,e,t){r[e]===void 0?r[e]=[t]:r[e].push(t)}Ve.minOptimizationVal=256;var qI=[];function yv(r){return r255?255+~~(r/255):r}}});var Gg=w(Nt=>{"use strict";Object.defineProperty(Nt,"__esModule",{value:!0});Nt.isTokenType=Nt.hasExtendingTokensTypesMapProperty=Nt.hasExtendingTokensTypesProperty=Nt.hasCategoriesProperty=Nt.hasShortKeyProperty=Nt.singleAssignCategoriesToksMap=Nt.assignCategoriesMapProp=Nt.assignCategoriesTokensProp=Nt.assignTokenDefaultProps=Nt.expandCategories=Nt.augmentTokenTypes=Nt.tokenIdxToClass=Nt.tokenShortNameIdx=Nt.tokenStructuredMatcherNoCategories=Nt.tokenStructuredMatcher=void 0;var _r=Gt();function Xme(r,e){var t=r.tokenTypeIdx;return t===e.tokenTypeIdx?!0:e.isParent===!0&&e.categoryMatchesMap[t]===!0}Nt.tokenStructuredMatcher=Xme;function _me(r,e){return r.tokenTypeIdx===e.tokenTypeIdx}Nt.tokenStructuredMatcherNoCategories=_me;Nt.tokenShortNameIdx=1;Nt.tokenIdxToClass={};function Zme(r){var e=kY(r);RY(e),NY(e),FY(e),(0,_r.forEach)(e,function(t){t.isParent=t.categoryMatches.length>0})}Nt.augmentTokenTypes=Zme;function kY(r){for(var e=(0,_r.cloneArr)(r),t=r,i=!0;i;){t=(0,_r.compact)((0,_r.flatten)((0,_r.map)(t,function(s){return s.CATEGORIES})));var n=(0,_r.difference)(t,e);e=e.concat(n),(0,_r.isEmpty)(n)?i=!1:t=n}return e}Nt.expandCategories=kY;function RY(r){(0,_r.forEach)(r,function(e){LY(e)||(Nt.tokenIdxToClass[Nt.tokenShortNameIdx]=e,e.tokenTypeIdx=Nt.tokenShortNameIdx++),Bv(e)&&!(0,_r.isArray)(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),Bv(e)||(e.CATEGORIES=[]),TY(e)||(e.categoryMatches=[]),OY(e)||(e.categoryMatchesMap={})})}Nt.assignTokenDefaultProps=RY;function FY(r){(0,_r.forEach)(r,function(e){e.categoryMatches=[],(0,_r.forEach)(e.categoryMatchesMap,function(t,i){e.categoryMatches.push(Nt.tokenIdxToClass[i].tokenTypeIdx)})})}Nt.assignCategoriesTokensProp=FY;function NY(r){(0,_r.forEach)(r,function(e){Qv([],e)})}Nt.assignCategoriesMapProp=NY;function Qv(r,e){(0,_r.forEach)(r,function(t){e.categoryMatchesMap[t.tokenTypeIdx]=!0}),(0,_r.forEach)(e.CATEGORIES,function(t){var i=r.concat(e);(0,_r.contains)(i,t)||Qv(i,t)})}Nt.singleAssignCategoriesToksMap=Qv;function LY(r){return(0,_r.has)(r,"tokenTypeIdx")}Nt.hasShortKeyProperty=LY;function Bv(r){return(0,_r.has)(r,"CATEGORIES")}Nt.hasCategoriesProperty=Bv;function TY(r){return(0,_r.has)(r,"categoryMatches")}Nt.hasExtendingTokensTypesProperty=TY;function OY(r){return(0,_r.has)(r,"categoryMatchesMap")}Nt.hasExtendingTokensTypesMapProperty=OY;function $me(r){return(0,_r.has)(r,"tokenTypeIdx")}Nt.isTokenType=$me});var bv=w(JI=>{"use strict";Object.defineProperty(JI,"__esModule",{value:!0});JI.defaultLexerErrorProvider=void 0;JI.defaultLexerErrorProvider={buildUnableToPopLexerModeMessage:function(r){return"Unable to pop Lexer Mode after encountering Token ->"+r.image+"<- The Mode Stack is empty"},buildUnexpectedCharactersMessage:function(r,e,t,i,n){return"unexpected character: ->"+r.charAt(e)+"<- at offset: "+e+","+(" skipped "+t+" characters.")}}});var gd=w(nc=>{"use strict";Object.defineProperty(nc,"__esModule",{value:!0});nc.Lexer=nc.LexerDefinitionErrorType=void 0;var zs=Cv(),nr=Gt(),eEe=Gg(),tEe=bv(),rEe=GI(),iEe;(function(r){r[r.MISSING_PATTERN=0]="MISSING_PATTERN",r[r.INVALID_PATTERN=1]="INVALID_PATTERN",r[r.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",r[r.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",r[r.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",r[r.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",r[r.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",r[r.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",r[r.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",r[r.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",r[r.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",r[r.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",r[r.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",r[r.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",r[r.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",r[r.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",r[r.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK"})(iEe=nc.LexerDefinitionErrorType||(nc.LexerDefinitionErrorType={}));var fd={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:[` -`,"\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:tEe.defaultLexerErrorProvider,traceInitPerf:!1,skipValidations:!1};Object.freeze(fd);var nEe=function(){function r(e,t){var i=this;if(t===void 0&&(t=fd),this.lexerDefinition=e,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.config=void 0,this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},typeof t=="boolean")throw Error(`The second argument to the Lexer constructor is now an ILexerConfig Object. -a boolean 2nd argument is no longer supported`);this.config=(0,nr.merge)(fd,t);var n=this.config.traceInitPerf;n===!0?(this.traceInitMaxIdent=1/0,this.traceInitPerf=!0):typeof n=="number"&&(this.traceInitMaxIdent=n,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",function(){var s,o=!0;i.TRACE_INIT("Lexer Config handling",function(){if(i.config.lineTerminatorsPattern===fd.lineTerminatorsPattern)i.config.lineTerminatorsPattern=zs.LineTerminatorOptimizedTester;else if(i.config.lineTerminatorCharacters===fd.lineTerminatorCharacters)throw Error(`Error: Missing property on the Lexer config. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS`);if(t.safeMode&&t.ensureOptimizations)throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.');i.trackStartLines=/full|onlyStart/i.test(i.config.positionTracking),i.trackEndLines=/full/i.test(i.config.positionTracking),(0,nr.isArray)(e)?(s={modes:{}},s.modes[zs.DEFAULT_MODE]=(0,nr.cloneArr)(e),s[zs.DEFAULT_MODE]=zs.DEFAULT_MODE):(o=!1,s=(0,nr.cloneObj)(e))}),i.config.skipValidations===!1&&(i.TRACE_INIT("performRuntimeChecks",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,zs.performRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))}),i.TRACE_INIT("performWarningRuntimeChecks",function(){i.lexerDefinitionWarning=i.lexerDefinitionWarning.concat((0,zs.performWarningRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))})),s.modes=s.modes?s.modes:{},(0,nr.forEach)(s.modes,function(u,g){s.modes[g]=(0,nr.reject)(u,function(f){return(0,nr.isUndefined)(f)})});var a=(0,nr.keys)(s.modes);if((0,nr.forEach)(s.modes,function(u,g){i.TRACE_INIT("Mode: <"+g+"> processing",function(){if(i.modes.push(g),i.config.skipValidations===!1&&i.TRACE_INIT("validatePatterns",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,zs.validatePatterns)(u,a))}),(0,nr.isEmpty)(i.lexerDefinitionErrors)){(0,eEe.augmentTokenTypes)(u);var f;i.TRACE_INIT("analyzeTokenTypes",function(){f=(0,zs.analyzeTokenTypes)(u,{lineTerminatorCharacters:i.config.lineTerminatorCharacters,positionTracking:t.positionTracking,ensureOptimizations:t.ensureOptimizations,safeMode:t.safeMode,tracer:i.TRACE_INIT.bind(i)})}),i.patternIdxToConfig[g]=f.patternIdxToConfig,i.charCodeToPatternIdxToConfig[g]=f.charCodeToPatternIdxToConfig,i.emptyGroups=(0,nr.merge)(i.emptyGroups,f.emptyGroups),i.hasCustom=f.hasCustom||i.hasCustom,i.canModeBeOptimized[g]=f.canBeOptimized}})}),i.defaultMode=s.defaultMode,!(0,nr.isEmpty)(i.lexerDefinitionErrors)&&!i.config.deferDefinitionErrorsHandling){var l=(0,nr.map)(i.lexerDefinitionErrors,function(u){return u.message}),c=l.join(`----------------------- -`);throw new Error(`Errors detected in definition of Lexer: -`+c)}(0,nr.forEach)(i.lexerDefinitionWarning,function(u){(0,nr.PRINT_WARNING)(u.message)}),i.TRACE_INIT("Choosing sub-methods implementations",function(){if(zs.SUPPORT_STICKY?(i.chopInput=nr.IDENTITY,i.match=i.matchWithTest):(i.updateLastIndex=nr.NOOP,i.match=i.matchWithExec),o&&(i.handleModes=nr.NOOP),i.trackStartLines===!1&&(i.computeNewColumn=nr.IDENTITY),i.trackEndLines===!1&&(i.updateTokenEndLineColumnLocation=nr.NOOP),/full/i.test(i.config.positionTracking))i.createTokenInstance=i.createFullToken;else if(/onlyStart/i.test(i.config.positionTracking))i.createTokenInstance=i.createStartOnlyToken;else if(/onlyOffset/i.test(i.config.positionTracking))i.createTokenInstance=i.createOffsetOnlyToken;else throw Error('Invalid config option: "'+i.config.positionTracking+'"');i.hasCustom?(i.addToken=i.addTokenUsingPush,i.handlePayload=i.handlePayloadWithCustom):(i.addToken=i.addTokenUsingMemberAccess,i.handlePayload=i.handlePayloadNoCustom)}),i.TRACE_INIT("Failed Optimization Warnings",function(){var u=(0,nr.reduce)(i.canModeBeOptimized,function(g,f,h){return f===!1&&g.push(h),g},[]);if(t.ensureOptimizations&&!(0,nr.isEmpty)(u))throw Error("Lexer Modes: < "+u.join(", ")+` > cannot be optimized. - Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode. - Or inspect the console log for details on how to resolve these issues.`)}),i.TRACE_INIT("clearRegExpParserCache",function(){(0,rEe.clearRegExpParserCache)()}),i.TRACE_INIT("toFastProperties",function(){(0,nr.toFastProperties)(i)})})}return r.prototype.tokenize=function(e,t){if(t===void 0&&(t=this.defaultMode),!(0,nr.isEmpty)(this.lexerDefinitionErrors)){var i=(0,nr.map)(this.lexerDefinitionErrors,function(o){return o.message}),n=i.join(`----------------------- -`);throw new Error(`Unable to Tokenize because Errors detected in definition of Lexer: -`+n)}var s=this.tokenizeInternal(e,t);return s},r.prototype.tokenizeInternal=function(e,t){var i=this,n,s,o,a,l,c,u,g,f,h,p,C,y,B,v,D,L=e,H=L.length,j=0,$=0,V=this.hasCustom?0:Math.floor(e.length/10),W=new Array(V),Z=[],A=this.trackStartLines?1:void 0,ae=this.trackStartLines?1:void 0,ge=(0,zs.cloneEmptyGroups)(this.emptyGroups),re=this.trackStartLines,O=this.config.lineTerminatorsPattern,F=0,ue=[],he=[],ke=[],Fe=[];Object.freeze(Fe);var Ne=void 0;function oe(){return ue}function le(pr){var Ei=(0,zs.charCodeToOptimizedIndex)(pr),_n=he[Ei];return _n===void 0?Fe:_n}var we=function(pr){if(ke.length===1&&pr.tokenType.PUSH_MODE===void 0){var Ei=i.config.errorMessageProvider.buildUnableToPopLexerModeMessage(pr);Z.push({offset:pr.startOffset,line:pr.startLine!==void 0?pr.startLine:void 0,column:pr.startColumn!==void 0?pr.startColumn:void 0,length:pr.image.length,message:Ei})}else{ke.pop();var _n=(0,nr.last)(ke);ue=i.patternIdxToConfig[_n],he=i.charCodeToPatternIdxToConfig[_n],F=ue.length;var oa=i.canModeBeOptimized[_n]&&i.config.safeMode===!1;he&&oa?Ne=le:Ne=oe}};function fe(pr){ke.push(pr),he=this.charCodeToPatternIdxToConfig[pr],ue=this.patternIdxToConfig[pr],F=ue.length,F=ue.length;var Ei=this.canModeBeOptimized[pr]&&this.config.safeMode===!1;he&&Ei?Ne=le:Ne=oe}fe.call(this,t);for(var Ae;jc.length){c=a,u=g,Ae=tt;break}}}break}}if(c!==null){if(f=c.length,h=Ae.group,h!==void 0&&(p=Ae.tokenTypeIdx,C=this.createTokenInstance(c,j,p,Ae.tokenType,A,ae,f),this.handlePayload(C,u),h===!1?$=this.addToken(W,$,C):ge[h].push(C)),e=this.chopInput(e,f),j=j+f,ae=this.computeNewColumn(ae,f),re===!0&&Ae.canLineTerminator===!0){var It=0,Or=void 0,ii=void 0;O.lastIndex=0;do Or=O.test(c),Or===!0&&(ii=O.lastIndex-1,It++);while(Or===!0);It!==0&&(A=A+It,ae=f-ii,this.updateTokenEndLineColumnLocation(C,h,ii,It,A,ae,f))}this.handleModes(Ae,we,fe,C)}else{for(var gi=j,hr=A,fi=ae,ni=!1;!ni&&j <"+e+">");var n=(0,nr.timer)(t),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return t()},r.SKIPPED="This marks a skipped Token pattern, this means each token identified by it willbe consumed and then thrown into oblivion, this can be used to for example to completely ignore whitespace.",r.NA=/NOT_APPLICABLE/,r}();nc.Lexer=nEe});var SA=w(Qi=>{"use strict";Object.defineProperty(Qi,"__esModule",{value:!0});Qi.tokenMatcher=Qi.createTokenInstance=Qi.EOF=Qi.createToken=Qi.hasTokenLabel=Qi.tokenName=Qi.tokenLabel=void 0;var Vs=Gt(),sEe=gd(),Sv=Gg();function oEe(r){return JY(r)?r.LABEL:r.name}Qi.tokenLabel=oEe;function aEe(r){return r.name}Qi.tokenName=aEe;function JY(r){return(0,Vs.isString)(r.LABEL)&&r.LABEL!==""}Qi.hasTokenLabel=JY;var AEe="parent",MY="categories",KY="label",UY="group",HY="push_mode",GY="pop_mode",YY="longer_alt",jY="line_breaks",qY="start_chars_hint";function WY(r){return lEe(r)}Qi.createToken=WY;function lEe(r){var e=r.pattern,t={};if(t.name=r.name,(0,Vs.isUndefined)(e)||(t.PATTERN=e),(0,Vs.has)(r,AEe))throw`The parent property is no longer supported. -See: https://github.com/chevrotain/chevrotain/issues/564#issuecomment-349062346 for details.`;return(0,Vs.has)(r,MY)&&(t.CATEGORIES=r[MY]),(0,Sv.augmentTokenTypes)([t]),(0,Vs.has)(r,KY)&&(t.LABEL=r[KY]),(0,Vs.has)(r,UY)&&(t.GROUP=r[UY]),(0,Vs.has)(r,GY)&&(t.POP_MODE=r[GY]),(0,Vs.has)(r,HY)&&(t.PUSH_MODE=r[HY]),(0,Vs.has)(r,YY)&&(t.LONGER_ALT=r[YY]),(0,Vs.has)(r,jY)&&(t.LINE_BREAKS=r[jY]),(0,Vs.has)(r,qY)&&(t.START_CHARS_HINT=r[qY]),t}Qi.EOF=WY({name:"EOF",pattern:sEe.Lexer.NA});(0,Sv.augmentTokenTypes)([Qi.EOF]);function cEe(r,e,t,i,n,s,o,a){return{image:e,startOffset:t,endOffset:i,startLine:n,endLine:s,startColumn:o,endColumn:a,tokenTypeIdx:r.tokenTypeIdx,tokenType:r}}Qi.createTokenInstance=cEe;function uEe(r,e){return(0,Sv.tokenStructuredMatcher)(r,e)}Qi.tokenMatcher=uEe});var dn=w(Wt=>{"use strict";var wa=Wt&&Wt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Wt,"__esModule",{value:!0});Wt.serializeProduction=Wt.serializeGrammar=Wt.Terminal=Wt.Alternation=Wt.RepetitionWithSeparator=Wt.Repetition=Wt.RepetitionMandatoryWithSeparator=Wt.RepetitionMandatory=Wt.Option=Wt.Alternative=Wt.Rule=Wt.NonTerminal=Wt.AbstractProduction=void 0;var Ar=Gt(),gEe=SA(),vo=function(){function r(e){this._definition=e}return Object.defineProperty(r.prototype,"definition",{get:function(){return this._definition},set:function(e){this._definition=e},enumerable:!1,configurable:!0}),r.prototype.accept=function(e){e.visit(this),(0,Ar.forEach)(this.definition,function(t){t.accept(e)})},r}();Wt.AbstractProduction=vo;var zY=function(r){wa(e,r);function e(t){var i=r.call(this,[])||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this.referencedRule!==void 0?this.referencedRule.definition:[]},set:function(t){},enumerable:!1,configurable:!0}),e.prototype.accept=function(t){t.visit(this)},e}(vo);Wt.NonTerminal=zY;var VY=function(r){wa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.orgText="",(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(vo);Wt.Rule=VY;var XY=function(r){wa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.ignoreAmbiguities=!1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(vo);Wt.Alternative=XY;var _Y=function(r){wa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(vo);Wt.Option=_Y;var ZY=function(r){wa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(vo);Wt.RepetitionMandatory=ZY;var $Y=function(r){wa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(vo);Wt.RepetitionMandatoryWithSeparator=$Y;var ej=function(r){wa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(vo);Wt.Repetition=ej;var tj=function(r){wa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(vo);Wt.RepetitionWithSeparator=tj;var rj=function(r){wa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,i.ignoreAmbiguities=!1,i.hasPredicates=!1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this._definition},set:function(t){this._definition=t},enumerable:!1,configurable:!0}),e}(vo);Wt.Alternation=rj;var WI=function(){function r(e){this.idx=1,(0,Ar.assign)(this,(0,Ar.pick)(e,function(t){return t!==void 0}))}return r.prototype.accept=function(e){e.visit(this)},r}();Wt.Terminal=WI;function fEe(r){return(0,Ar.map)(r,hd)}Wt.serializeGrammar=fEe;function hd(r){function e(s){return(0,Ar.map)(s,hd)}if(r instanceof zY){var t={type:"NonTerminal",name:r.nonTerminalName,idx:r.idx};return(0,Ar.isString)(r.label)&&(t.label=r.label),t}else{if(r instanceof XY)return{type:"Alternative",definition:e(r.definition)};if(r instanceof _Y)return{type:"Option",idx:r.idx,definition:e(r.definition)};if(r instanceof ZY)return{type:"RepetitionMandatory",idx:r.idx,definition:e(r.definition)};if(r instanceof $Y)return{type:"RepetitionMandatoryWithSeparator",idx:r.idx,separator:hd(new WI({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof tj)return{type:"RepetitionWithSeparator",idx:r.idx,separator:hd(new WI({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof ej)return{type:"Repetition",idx:r.idx,definition:e(r.definition)};if(r instanceof rj)return{type:"Alternation",idx:r.idx,definition:e(r.definition)};if(r instanceof WI){var i={type:"Terminal",name:r.terminalType.name,label:(0,gEe.tokenLabel)(r.terminalType),idx:r.idx};(0,Ar.isString)(r.label)&&(i.terminalLabel=r.label);var n=r.terminalType.PATTERN;return r.terminalType.PATTERN&&(i.pattern=(0,Ar.isRegExp)(n)?n.source:n),i}else{if(r instanceof VY)return{type:"Rule",name:r.name,orgText:r.orgText,definition:e(r.definition)};throw Error("non exhaustive match")}}}Wt.serializeProduction=hd});var VI=w(zI=>{"use strict";Object.defineProperty(zI,"__esModule",{value:!0});zI.RestWalker=void 0;var vv=Gt(),Cn=dn(),hEe=function(){function r(){}return r.prototype.walk=function(e,t){var i=this;t===void 0&&(t=[]),(0,vv.forEach)(e.definition,function(n,s){var o=(0,vv.drop)(e.definition,s+1);if(n instanceof Cn.NonTerminal)i.walkProdRef(n,o,t);else if(n instanceof Cn.Terminal)i.walkTerminal(n,o,t);else if(n instanceof Cn.Alternative)i.walkFlat(n,o,t);else if(n instanceof Cn.Option)i.walkOption(n,o,t);else if(n instanceof Cn.RepetitionMandatory)i.walkAtLeastOne(n,o,t);else if(n instanceof Cn.RepetitionMandatoryWithSeparator)i.walkAtLeastOneSep(n,o,t);else if(n instanceof Cn.RepetitionWithSeparator)i.walkManySep(n,o,t);else if(n instanceof Cn.Repetition)i.walkMany(n,o,t);else if(n instanceof Cn.Alternation)i.walkOr(n,o,t);else throw Error("non exhaustive match")})},r.prototype.walkTerminal=function(e,t,i){},r.prototype.walkProdRef=function(e,t,i){},r.prototype.walkFlat=function(e,t,i){var n=t.concat(i);this.walk(e,n)},r.prototype.walkOption=function(e,t,i){var n=t.concat(i);this.walk(e,n)},r.prototype.walkAtLeastOne=function(e,t,i){var n=[new Cn.Option({definition:e.definition})].concat(t,i);this.walk(e,n)},r.prototype.walkAtLeastOneSep=function(e,t,i){var n=ij(e,t,i);this.walk(e,n)},r.prototype.walkMany=function(e,t,i){var n=[new Cn.Option({definition:e.definition})].concat(t,i);this.walk(e,n)},r.prototype.walkManySep=function(e,t,i){var n=ij(e,t,i);this.walk(e,n)},r.prototype.walkOr=function(e,t,i){var n=this,s=t.concat(i);(0,vv.forEach)(e.definition,function(o){var a=new Cn.Alternative({definition:[o]});n.walk(a,s)})},r}();zI.RestWalker=hEe;function ij(r,e,t){var i=[new Cn.Option({definition:[new Cn.Terminal({terminalType:r.separator})].concat(r.definition)})],n=i.concat(e,t);return n}});var Yg=w(XI=>{"use strict";Object.defineProperty(XI,"__esModule",{value:!0});XI.GAstVisitor=void 0;var xo=dn(),pEe=function(){function r(){}return r.prototype.visit=function(e){var t=e;switch(t.constructor){case xo.NonTerminal:return this.visitNonTerminal(t);case xo.Alternative:return this.visitAlternative(t);case xo.Option:return this.visitOption(t);case xo.RepetitionMandatory:return this.visitRepetitionMandatory(t);case xo.RepetitionMandatoryWithSeparator:return this.visitRepetitionMandatoryWithSeparator(t);case xo.RepetitionWithSeparator:return this.visitRepetitionWithSeparator(t);case xo.Repetition:return this.visitRepetition(t);case xo.Alternation:return this.visitAlternation(t);case xo.Terminal:return this.visitTerminal(t);case xo.Rule:return this.visitRule(t);default:throw Error("non exhaustive match")}},r.prototype.visitNonTerminal=function(e){},r.prototype.visitAlternative=function(e){},r.prototype.visitOption=function(e){},r.prototype.visitRepetition=function(e){},r.prototype.visitRepetitionMandatory=function(e){},r.prototype.visitRepetitionMandatoryWithSeparator=function(e){},r.prototype.visitRepetitionWithSeparator=function(e){},r.prototype.visitAlternation=function(e){},r.prototype.visitTerminal=function(e){},r.prototype.visitRule=function(e){},r}();XI.GAstVisitor=pEe});var dd=w(Oi=>{"use strict";var dEe=Oi&&Oi.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Oi,"__esModule",{value:!0});Oi.collectMethods=Oi.DslMethodsCollectorVisitor=Oi.getProductionDslName=Oi.isBranchingProd=Oi.isOptionalProd=Oi.isSequenceProd=void 0;var pd=Gt(),Qr=dn(),CEe=Yg();function mEe(r){return r instanceof Qr.Alternative||r instanceof Qr.Option||r instanceof Qr.Repetition||r instanceof Qr.RepetitionMandatory||r instanceof Qr.RepetitionMandatoryWithSeparator||r instanceof Qr.RepetitionWithSeparator||r instanceof Qr.Terminal||r instanceof Qr.Rule}Oi.isSequenceProd=mEe;function xv(r,e){e===void 0&&(e=[]);var t=r instanceof Qr.Option||r instanceof Qr.Repetition||r instanceof Qr.RepetitionWithSeparator;return t?!0:r instanceof Qr.Alternation?(0,pd.some)(r.definition,function(i){return xv(i,e)}):r instanceof Qr.NonTerminal&&(0,pd.contains)(e,r)?!1:r instanceof Qr.AbstractProduction?(r instanceof Qr.NonTerminal&&e.push(r),(0,pd.every)(r.definition,function(i){return xv(i,e)})):!1}Oi.isOptionalProd=xv;function EEe(r){return r instanceof Qr.Alternation}Oi.isBranchingProd=EEe;function IEe(r){if(r instanceof Qr.NonTerminal)return"SUBRULE";if(r instanceof Qr.Option)return"OPTION";if(r instanceof Qr.Alternation)return"OR";if(r instanceof Qr.RepetitionMandatory)return"AT_LEAST_ONE";if(r instanceof Qr.RepetitionMandatoryWithSeparator)return"AT_LEAST_ONE_SEP";if(r instanceof Qr.RepetitionWithSeparator)return"MANY_SEP";if(r instanceof Qr.Repetition)return"MANY";if(r instanceof Qr.Terminal)return"CONSUME";throw Error("non exhaustive match")}Oi.getProductionDslName=IEe;var nj=function(r){dEe(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.separator="-",t.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]},t}return e.prototype.reset=function(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}},e.prototype.visitTerminal=function(t){var i=t.terminalType.name+this.separator+"Terminal";(0,pd.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(t)},e.prototype.visitNonTerminal=function(t){var i=t.nonTerminalName+this.separator+"Terminal";(0,pd.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(t)},e.prototype.visitOption=function(t){this.dslMethods.option.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.dslMethods.repetitionWithSeparator.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.dslMethods.repetitionMandatory.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.dslMethods.repetitionMandatoryWithSeparator.push(t)},e.prototype.visitRepetition=function(t){this.dslMethods.repetition.push(t)},e.prototype.visitAlternation=function(t){this.dslMethods.alternation.push(t)},e}(CEe.GAstVisitor);Oi.DslMethodsCollectorVisitor=nj;var _I=new nj;function yEe(r){_I.reset(),r.accept(_I);var e=_I.dslMethods;return _I.reset(),e}Oi.collectMethods=yEe});var Dv=w(Po=>{"use strict";Object.defineProperty(Po,"__esModule",{value:!0});Po.firstForTerminal=Po.firstForBranching=Po.firstForSequence=Po.first=void 0;var ZI=Gt(),sj=dn(),Pv=dd();function $I(r){if(r instanceof sj.NonTerminal)return $I(r.referencedRule);if(r instanceof sj.Terminal)return Aj(r);if((0,Pv.isSequenceProd)(r))return oj(r);if((0,Pv.isBranchingProd)(r))return aj(r);throw Error("non exhaustive match")}Po.first=$I;function oj(r){for(var e=[],t=r.definition,i=0,n=t.length>i,s,o=!0;n&&o;)s=t[i],o=(0,Pv.isOptionalProd)(s),e=e.concat($I(s)),i=i+1,n=t.length>i;return(0,ZI.uniq)(e)}Po.firstForSequence=oj;function aj(r){var e=(0,ZI.map)(r.definition,function(t){return $I(t)});return(0,ZI.uniq)((0,ZI.flatten)(e))}Po.firstForBranching=aj;function Aj(r){return[r.terminalType]}Po.firstForTerminal=Aj});var kv=w(ey=>{"use strict";Object.defineProperty(ey,"__esModule",{value:!0});ey.IN=void 0;ey.IN="_~IN~_"});var fj=w(As=>{"use strict";var wEe=As&&As.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(As,"__esModule",{value:!0});As.buildInProdFollowPrefix=As.buildBetweenProdsFollowPrefix=As.computeAllProdsFollows=As.ResyncFollowsWalker=void 0;var BEe=VI(),QEe=Dv(),lj=Gt(),cj=kv(),bEe=dn(),uj=function(r){wEe(e,r);function e(t){var i=r.call(this)||this;return i.topProd=t,i.follows={},i}return e.prototype.startWalking=function(){return this.walk(this.topProd),this.follows},e.prototype.walkTerminal=function(t,i,n){},e.prototype.walkProdRef=function(t,i,n){var s=gj(t.referencedRule,t.idx)+this.topProd.name,o=i.concat(n),a=new bEe.Alternative({definition:o}),l=(0,QEe.first)(a);this.follows[s]=l},e}(BEe.RestWalker);As.ResyncFollowsWalker=uj;function SEe(r){var e={};return(0,lj.forEach)(r,function(t){var i=new uj(t).startWalking();(0,lj.assign)(e,i)}),e}As.computeAllProdsFollows=SEe;function gj(r,e){return r.name+e+cj.IN}As.buildBetweenProdsFollowPrefix=gj;function vEe(r){var e=r.terminalType.name;return e+r.idx+cj.IN}As.buildInProdFollowPrefix=vEe});var Cd=w(Ba=>{"use strict";Object.defineProperty(Ba,"__esModule",{value:!0});Ba.defaultGrammarValidatorErrorProvider=Ba.defaultGrammarResolverErrorProvider=Ba.defaultParserErrorProvider=void 0;var jg=SA(),xEe=Gt(),Xs=Gt(),Rv=dn(),hj=dd();Ba.defaultParserErrorProvider={buildMismatchTokenMessage:function(r){var e=r.expected,t=r.actual,i=r.previous,n=r.ruleName,s=(0,jg.hasTokenLabel)(e),o=s?"--> "+(0,jg.tokenLabel)(e)+" <--":"token of type --> "+e.name+" <--",a="Expecting "+o+" but found --> '"+t.image+"' <--";return a},buildNotAllInputParsedMessage:function(r){var e=r.firstRedundant,t=r.ruleName;return"Redundant input, expecting EOF but found: "+e.image},buildNoViableAltMessage:function(r){var e=r.expectedPathsPerAlt,t=r.actual,i=r.previous,n=r.customUserDescription,s=r.ruleName,o="Expecting: ",a=(0,Xs.first)(t).image,l=` -but found: '`+a+"'";if(n)return o+n+l;var c=(0,Xs.reduce)(e,function(h,p){return h.concat(p)},[]),u=(0,Xs.map)(c,function(h){return"["+(0,Xs.map)(h,function(p){return(0,jg.tokenLabel)(p)}).join(", ")+"]"}),g=(0,Xs.map)(u,function(h,p){return" "+(p+1)+". "+h}),f=`one of these possible Token sequences: -`+g.join(` -`);return o+f+l},buildEarlyExitMessage:function(r){var e=r.expectedIterationPaths,t=r.actual,i=r.customUserDescription,n=r.ruleName,s="Expecting: ",o=(0,Xs.first)(t).image,a=` -but found: '`+o+"'";if(i)return s+i+a;var l=(0,Xs.map)(e,function(u){return"["+(0,Xs.map)(u,function(g){return(0,jg.tokenLabel)(g)}).join(",")+"]"}),c=`expecting at least one iteration which starts with one of these possible Token sequences:: - `+("<"+l.join(" ,")+">");return s+c+a}};Object.freeze(Ba.defaultParserErrorProvider);Ba.defaultGrammarResolverErrorProvider={buildRuleNotFoundError:function(r,e){var t="Invalid grammar, reference to a rule which is not defined: ->"+e.nonTerminalName+`<- -inside top level rule: ->`+r.name+"<-";return t}};Ba.defaultGrammarValidatorErrorProvider={buildDuplicateFoundError:function(r,e){function t(u){return u instanceof Rv.Terminal?u.terminalType.name:u instanceof Rv.NonTerminal?u.nonTerminalName:""}var i=r.name,n=(0,Xs.first)(e),s=n.idx,o=(0,hj.getProductionDslName)(n),a=t(n),l=s>0,c="->"+o+(l?s:"")+"<- "+(a?"with argument: ->"+a+"<-":"")+` - appears more than once (`+e.length+" times) in the top level rule: ->"+i+`<-. - For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES - `;return c=c.replace(/[ \t]+/g," "),c=c.replace(/\s\s+/g,` -`),c},buildNamespaceConflictError:function(r){var e=`Namespace conflict found in grammar. -`+("The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <"+r.name+`>. -`)+`To resolve this make sure each Terminal and Non-Terminal names are unique -This is easy to accomplish by using the convention that Terminal names start with an uppercase letter -and Non-Terminal names start with a lower case letter.`;return e},buildAlternationPrefixAmbiguityError:function(r){var e=(0,Xs.map)(r.prefixPath,function(n){return(0,jg.tokenLabel)(n)}).join(", "),t=r.alternation.idx===0?"":r.alternation.idx,i="Ambiguous alternatives: <"+r.ambiguityIndices.join(" ,")+`> due to common lookahead prefix -`+("in inside <"+r.topLevelRule.name+`> Rule, -`)+("<"+e+`> may appears as a prefix path in all these alternatives. -`)+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX -For Further details.`;return i},buildAlternationAmbiguityError:function(r){var e=(0,Xs.map)(r.prefixPath,function(n){return(0,jg.tokenLabel)(n)}).join(", "),t=r.alternation.idx===0?"":r.alternation.idx,i="Ambiguous Alternatives Detected: <"+r.ambiguityIndices.join(" ,")+"> in "+(" inside <"+r.topLevelRule.name+`> Rule, -`)+("<"+e+`> may appears as a prefix path in all these alternatives. -`);return i=i+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES -For Further details.`,i},buildEmptyRepetitionError:function(r){var e=(0,hj.getProductionDslName)(r.repetition);r.repetition.idx!==0&&(e+=r.repetition.idx);var t="The repetition <"+e+"> within Rule <"+r.topLevelRule.name+`> can never consume any tokens. -This could lead to an infinite loop.`;return t},buildTokenNameError:function(r){return"deprecated"},buildEmptyAlternationError:function(r){var e="Ambiguous empty alternative: <"+(r.emptyChoiceIdx+1)+">"+(" in inside <"+r.topLevelRule.name+`> Rule. -`)+"Only the last alternative may be an empty alternative.";return e},buildTooManyAlternativesError:function(r){var e=`An Alternation cannot have more than 256 alternatives: -`+(" inside <"+r.topLevelRule.name+`> Rule. - has `+(r.alternation.definition.length+1)+" alternatives.");return e},buildLeftRecursionError:function(r){var e=r.topLevelRule.name,t=xEe.map(r.leftRecursionPath,function(s){return s.name}),i=e+" --> "+t.concat([e]).join(" --> "),n=`Left Recursion found in grammar. -`+("rule: <"+e+`> can be invoked from itself (directly or indirectly) -`)+(`without consuming any Tokens. The grammar path that causes this is: - `+i+` -`)+` To fix this refactor your grammar to remove the left recursion. -see: https://en.wikipedia.org/wiki/LL_parser#Left_Factoring.`;return n},buildInvalidRuleNameError:function(r){return"deprecated"},buildDuplicateRuleNameError:function(r){var e;r.topLevelRule instanceof Rv.Rule?e=r.topLevelRule.name:e=r.topLevelRule;var t="Duplicate definition, rule: ->"+e+"<- is already defined in the grammar: ->"+r.grammarName+"<-";return t}}});var Cj=w(vA=>{"use strict";var PEe=vA&&vA.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(vA,"__esModule",{value:!0});vA.GastRefResolverVisitor=vA.resolveGrammar=void 0;var DEe=Hn(),pj=Gt(),kEe=Yg();function REe(r,e){var t=new dj(r,e);return t.resolveRefs(),t.errors}vA.resolveGrammar=REe;var dj=function(r){PEe(e,r);function e(t,i){var n=r.call(this)||this;return n.nameToTopRule=t,n.errMsgProvider=i,n.errors=[],n}return e.prototype.resolveRefs=function(){var t=this;(0,pj.forEach)((0,pj.values)(this.nameToTopRule),function(i){t.currTopLevel=i,i.accept(t)})},e.prototype.visitNonTerminal=function(t){var i=this.nameToTopRule[t.nonTerminalName];if(i)t.referencedRule=i;else{var n=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,t);this.errors.push({message:n,type:DEe.ParserDefinitionErrorType.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:t.nonTerminalName})}},e}(kEe.GAstVisitor);vA.GastRefResolverVisitor=dj});var Ed=w(Nr=>{"use strict";var sc=Nr&&Nr.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Nr,"__esModule",{value:!0});Nr.nextPossibleTokensAfter=Nr.possiblePathsFrom=Nr.NextTerminalAfterAtLeastOneSepWalker=Nr.NextTerminalAfterAtLeastOneWalker=Nr.NextTerminalAfterManySepWalker=Nr.NextTerminalAfterManyWalker=Nr.AbstractNextTerminalAfterProductionWalker=Nr.NextAfterTokenWalker=Nr.AbstractNextPossibleTokensWalker=void 0;var mj=VI(),Kt=Gt(),FEe=Dv(),kt=dn(),Ej=function(r){sc(e,r);function e(t,i){var n=r.call(this)||this;return n.topProd=t,n.path=i,n.possibleTokTypes=[],n.nextProductionName="",n.nextProductionOccurrence=0,n.found=!1,n.isAtEndOfPath=!1,n}return e.prototype.startWalking=function(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=(0,Kt.cloneArr)(this.path.ruleStack).reverse(),this.occurrenceStack=(0,Kt.cloneArr)(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes},e.prototype.walk=function(t,i){i===void 0&&(i=[]),this.found||r.prototype.walk.call(this,t,i)},e.prototype.walkProdRef=function(t,i,n){if(t.referencedRule.name===this.nextProductionName&&t.idx===this.nextProductionOccurrence){var s=i.concat(n);this.updateExpectedNext(),this.walk(t.referencedRule,s)}},e.prototype.updateExpectedNext=function(){(0,Kt.isEmpty)(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())},e}(mj.RestWalker);Nr.AbstractNextPossibleTokensWalker=Ej;var NEe=function(r){sc(e,r);function e(t,i){var n=r.call(this,t,i)||this;return n.path=i,n.nextTerminalName="",n.nextTerminalOccurrence=0,n.nextTerminalName=n.path.lastTok.name,n.nextTerminalOccurrence=n.path.lastTokOccurrence,n}return e.prototype.walkTerminal=function(t,i,n){if(this.isAtEndOfPath&&t.terminalType.name===this.nextTerminalName&&t.idx===this.nextTerminalOccurrence&&!this.found){var s=i.concat(n),o=new kt.Alternative({definition:s});this.possibleTokTypes=(0,FEe.first)(o),this.found=!0}},e}(Ej);Nr.NextAfterTokenWalker=NEe;var md=function(r){sc(e,r);function e(t,i){var n=r.call(this)||this;return n.topRule=t,n.occurrence=i,n.result={token:void 0,occurrence:void 0,isEndOfRule:void 0},n}return e.prototype.startWalking=function(){return this.walk(this.topRule),this.result},e}(mj.RestWalker);Nr.AbstractNextTerminalAfterProductionWalker=md;var LEe=function(r){sc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkMany=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof kt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkMany.call(this,t,i,n)},e}(md);Nr.NextTerminalAfterManyWalker=LEe;var TEe=function(r){sc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkManySep=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof kt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkManySep.call(this,t,i,n)},e}(md);Nr.NextTerminalAfterManySepWalker=TEe;var OEe=function(r){sc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkAtLeastOne=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof kt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkAtLeastOne.call(this,t,i,n)},e}(md);Nr.NextTerminalAfterAtLeastOneWalker=OEe;var MEe=function(r){sc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkAtLeastOneSep=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof kt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkAtLeastOneSep.call(this,t,i,n)},e}(md);Nr.NextTerminalAfterAtLeastOneSepWalker=MEe;function Ij(r,e,t){t===void 0&&(t=[]),t=(0,Kt.cloneArr)(t);var i=[],n=0;function s(c){return c.concat((0,Kt.drop)(r,n+1))}function o(c){var u=Ij(s(c),e,t);return i.concat(u)}for(;t.length=0;ge--){var re=B.definition[ge],O={idx:p,def:re.definition.concat((0,Kt.drop)(h)),ruleStack:C,occurrenceStack:y};g.push(O),g.push(o)}else if(B instanceof kt.Alternative)g.push({idx:p,def:B.definition.concat((0,Kt.drop)(h)),ruleStack:C,occurrenceStack:y});else if(B instanceof kt.Rule)g.push(UEe(B,p,C,y));else throw Error("non exhaustive match")}}return u}Nr.nextPossibleTokensAfter=KEe;function UEe(r,e,t,i){var n=(0,Kt.cloneArr)(t);n.push(r.name);var s=(0,Kt.cloneArr)(i);return s.push(1),{idx:e,def:r.definition,ruleStack:n,occurrenceStack:s}}});var Id=w(_t=>{"use strict";var Bj=_t&&_t.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(_t,"__esModule",{value:!0});_t.areTokenCategoriesNotUsed=_t.isStrictPrefixOfPath=_t.containsPath=_t.getLookaheadPathsForOptionalProd=_t.getLookaheadPathsForOr=_t.lookAheadSequenceFromAlternatives=_t.buildSingleAlternativeLookaheadFunction=_t.buildAlternativesLookAheadFunc=_t.buildLookaheadFuncForOptionalProd=_t.buildLookaheadFuncForOr=_t.getProdType=_t.PROD_TYPE=void 0;var sr=Gt(),yj=Ed(),HEe=VI(),ty=Gg(),xA=dn(),GEe=Yg(),oi;(function(r){r[r.OPTION=0]="OPTION",r[r.REPETITION=1]="REPETITION",r[r.REPETITION_MANDATORY=2]="REPETITION_MANDATORY",r[r.REPETITION_MANDATORY_WITH_SEPARATOR=3]="REPETITION_MANDATORY_WITH_SEPARATOR",r[r.REPETITION_WITH_SEPARATOR=4]="REPETITION_WITH_SEPARATOR",r[r.ALTERNATION=5]="ALTERNATION"})(oi=_t.PROD_TYPE||(_t.PROD_TYPE={}));function YEe(r){if(r instanceof xA.Option)return oi.OPTION;if(r instanceof xA.Repetition)return oi.REPETITION;if(r instanceof xA.RepetitionMandatory)return oi.REPETITION_MANDATORY;if(r instanceof xA.RepetitionMandatoryWithSeparator)return oi.REPETITION_MANDATORY_WITH_SEPARATOR;if(r instanceof xA.RepetitionWithSeparator)return oi.REPETITION_WITH_SEPARATOR;if(r instanceof xA.Alternation)return oi.ALTERNATION;throw Error("non exhaustive match")}_t.getProdType=YEe;function jEe(r,e,t,i,n,s){var o=bj(r,e,t),a=Lv(o)?ty.tokenStructuredMatcherNoCategories:ty.tokenStructuredMatcher;return s(o,i,a,n)}_t.buildLookaheadFuncForOr=jEe;function qEe(r,e,t,i,n,s){var o=Sj(r,e,n,t),a=Lv(o)?ty.tokenStructuredMatcherNoCategories:ty.tokenStructuredMatcher;return s(o[0],a,i)}_t.buildLookaheadFuncForOptionalProd=qEe;function JEe(r,e,t,i){var n=r.length,s=(0,sr.every)(r,function(l){return(0,sr.every)(l,function(c){return c.length===1})});if(e)return function(l){for(var c=(0,sr.map)(l,function(D){return D.GATE}),u=0;u{"use strict";var Tv=zt&&zt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(zt,"__esModule",{value:!0});zt.checkPrefixAlternativesAmbiguities=zt.validateSomeNonEmptyLookaheadPath=zt.validateTooManyAlts=zt.RepetionCollector=zt.validateAmbiguousAlternationAlternatives=zt.validateEmptyOrAlternative=zt.getFirstNoneTerminal=zt.validateNoLeftRecursion=zt.validateRuleIsOverridden=zt.validateRuleDoesNotAlreadyExist=zt.OccurrenceValidationCollector=zt.identifyProductionForDuplicates=zt.validateGrammar=void 0;var er=Gt(),br=Gt(),Do=Hn(),Ov=dd(),qg=Id(),_Ee=Ed(),_s=dn(),Mv=Yg();function ZEe(r,e,t,i,n){var s=er.map(r,function(h){return $Ee(h,i)}),o=er.map(r,function(h){return Kv(h,h,i)}),a=[],l=[],c=[];(0,br.every)(o,br.isEmpty)&&(a=(0,br.map)(r,function(h){return Rj(h,i)}),l=(0,br.map)(r,function(h){return Fj(h,e,i)}),c=Tj(r,e,i));var u=rIe(r,t,i),g=(0,br.map)(r,function(h){return Lj(h,i)}),f=(0,br.map)(r,function(h){return kj(h,r,n,i)});return er.flatten(s.concat(c,o,a,l,u,g,f))}zt.validateGrammar=ZEe;function $Ee(r,e){var t=new Dj;r.accept(t);var i=t.allProductions,n=er.groupBy(i,xj),s=er.pick(n,function(a){return a.length>1}),o=er.map(er.values(s),function(a){var l=er.first(a),c=e.buildDuplicateFoundError(r,a),u=(0,Ov.getProductionDslName)(l),g={message:c,type:Do.ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS,ruleName:r.name,dslName:u,occurrence:l.idx},f=Pj(l);return f&&(g.parameter=f),g});return o}function xj(r){return(0,Ov.getProductionDslName)(r)+"_#_"+r.idx+"_#_"+Pj(r)}zt.identifyProductionForDuplicates=xj;function Pj(r){return r instanceof _s.Terminal?r.terminalType.name:r instanceof _s.NonTerminal?r.nonTerminalName:""}var Dj=function(r){Tv(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.allProductions=[],t}return e.prototype.visitNonTerminal=function(t){this.allProductions.push(t)},e.prototype.visitOption=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e.prototype.visitAlternation=function(t){this.allProductions.push(t)},e.prototype.visitTerminal=function(t){this.allProductions.push(t)},e}(Mv.GAstVisitor);zt.OccurrenceValidationCollector=Dj;function kj(r,e,t,i){var n=[],s=(0,br.reduce)(e,function(a,l){return l.name===r.name?a+1:a},0);if(s>1){var o=i.buildDuplicateRuleNameError({topLevelRule:r,grammarName:t});n.push({message:o,type:Do.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:r.name})}return n}zt.validateRuleDoesNotAlreadyExist=kj;function eIe(r,e,t){var i=[],n;return er.contains(e,r)||(n="Invalid rule override, rule: ->"+r+"<- cannot be overridden in the grammar: ->"+t+"<-as it is not defined in any of the super grammars ",i.push({message:n,type:Do.ParserDefinitionErrorType.INVALID_RULE_OVERRIDE,ruleName:r})),i}zt.validateRuleIsOverridden=eIe;function Kv(r,e,t,i){i===void 0&&(i=[]);var n=[],s=yd(e.definition);if(er.isEmpty(s))return[];var o=r.name,a=er.contains(s,r);a&&n.push({message:t.buildLeftRecursionError({topLevelRule:r,leftRecursionPath:i}),type:Do.ParserDefinitionErrorType.LEFT_RECURSION,ruleName:o});var l=er.difference(s,i.concat([r])),c=er.map(l,function(u){var g=er.cloneArr(i);return g.push(u),Kv(r,u,t,g)});return n.concat(er.flatten(c))}zt.validateNoLeftRecursion=Kv;function yd(r){var e=[];if(er.isEmpty(r))return e;var t=er.first(r);if(t instanceof _s.NonTerminal)e.push(t.referencedRule);else if(t instanceof _s.Alternative||t instanceof _s.Option||t instanceof _s.RepetitionMandatory||t instanceof _s.RepetitionMandatoryWithSeparator||t instanceof _s.RepetitionWithSeparator||t instanceof _s.Repetition)e=e.concat(yd(t.definition));else if(t instanceof _s.Alternation)e=er.flatten(er.map(t.definition,function(o){return yd(o.definition)}));else if(!(t instanceof _s.Terminal))throw Error("non exhaustive match");var i=(0,Ov.isOptionalProd)(t),n=r.length>1;if(i&&n){var s=er.drop(r);return e.concat(yd(s))}else return e}zt.getFirstNoneTerminal=yd;var Uv=function(r){Tv(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.alternations=[],t}return e.prototype.visitAlternation=function(t){this.alternations.push(t)},e}(Mv.GAstVisitor);function Rj(r,e){var t=new Uv;r.accept(t);var i=t.alternations,n=er.reduce(i,function(s,o){var a=er.dropRight(o.definition),l=er.map(a,function(c,u){var g=(0,_Ee.nextPossibleTokensAfter)([c],[],null,1);return er.isEmpty(g)?{message:e.buildEmptyAlternationError({topLevelRule:r,alternation:o,emptyChoiceIdx:u}),type:Do.ParserDefinitionErrorType.NONE_LAST_EMPTY_ALT,ruleName:r.name,occurrence:o.idx,alternative:u+1}:null});return s.concat(er.compact(l))},[]);return n}zt.validateEmptyOrAlternative=Rj;function Fj(r,e,t){var i=new Uv;r.accept(i);var n=i.alternations;n=(0,br.reject)(n,function(o){return o.ignoreAmbiguities===!0});var s=er.reduce(n,function(o,a){var l=a.idx,c=a.maxLookahead||e,u=(0,qg.getLookaheadPathsForOr)(l,r,c,a),g=tIe(u,a,r,t),f=Oj(u,a,r,t);return o.concat(g,f)},[]);return s}zt.validateAmbiguousAlternationAlternatives=Fj;var Nj=function(r){Tv(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.allProductions=[],t}return e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e}(Mv.GAstVisitor);zt.RepetionCollector=Nj;function Lj(r,e){var t=new Uv;r.accept(t);var i=t.alternations,n=er.reduce(i,function(s,o){return o.definition.length>255&&s.push({message:e.buildTooManyAlternativesError({topLevelRule:r,alternation:o}),type:Do.ParserDefinitionErrorType.TOO_MANY_ALTS,ruleName:r.name,occurrence:o.idx}),s},[]);return n}zt.validateTooManyAlts=Lj;function Tj(r,e,t){var i=[];return(0,br.forEach)(r,function(n){var s=new Nj;n.accept(s);var o=s.allProductions;(0,br.forEach)(o,function(a){var l=(0,qg.getProdType)(a),c=a.maxLookahead||e,u=a.idx,g=(0,qg.getLookaheadPathsForOptionalProd)(u,n,l,c),f=g[0];if((0,br.isEmpty)((0,br.flatten)(f))){var h=t.buildEmptyRepetitionError({topLevelRule:n,repetition:a});i.push({message:h,type:Do.ParserDefinitionErrorType.NO_NON_EMPTY_LOOKAHEAD,ruleName:n.name})}})}),i}zt.validateSomeNonEmptyLookaheadPath=Tj;function tIe(r,e,t,i){var n=[],s=(0,br.reduce)(r,function(a,l,c){return e.definition[c].ignoreAmbiguities===!0||(0,br.forEach)(l,function(u){var g=[c];(0,br.forEach)(r,function(f,h){c!==h&&(0,qg.containsPath)(f,u)&&e.definition[h].ignoreAmbiguities!==!0&&g.push(h)}),g.length>1&&!(0,qg.containsPath)(n,u)&&(n.push(u),a.push({alts:g,path:u}))}),a},[]),o=er.map(s,function(a){var l=(0,br.map)(a.alts,function(u){return u+1}),c=i.buildAlternationAmbiguityError({topLevelRule:t,alternation:e,ambiguityIndices:l,prefixPath:a.path});return{message:c,type:Do.ParserDefinitionErrorType.AMBIGUOUS_ALTS,ruleName:t.name,occurrence:e.idx,alternatives:[a.alts]}});return o}function Oj(r,e,t,i){var n=[],s=(0,br.reduce)(r,function(o,a,l){var c=(0,br.map)(a,function(u){return{idx:l,path:u}});return o.concat(c)},[]);return(0,br.forEach)(s,function(o){var a=e.definition[o.idx];if(a.ignoreAmbiguities!==!0){var l=o.idx,c=o.path,u=(0,br.findAll)(s,function(f){return e.definition[f.idx].ignoreAmbiguities!==!0&&f.idx{"use strict";Object.defineProperty(Jg,"__esModule",{value:!0});Jg.validateGrammar=Jg.resolveGrammar=void 0;var Gv=Gt(),iIe=Cj(),nIe=Hv(),Mj=Cd();function sIe(r){r=(0,Gv.defaults)(r,{errMsgProvider:Mj.defaultGrammarResolverErrorProvider});var e={};return(0,Gv.forEach)(r.rules,function(t){e[t.name]=t}),(0,iIe.resolveGrammar)(e,r.errMsgProvider)}Jg.resolveGrammar=sIe;function oIe(r){return r=(0,Gv.defaults)(r,{errMsgProvider:Mj.defaultGrammarValidatorErrorProvider}),(0,nIe.validateGrammar)(r.rules,r.maxLookahead,r.tokenTypes,r.errMsgProvider,r.grammarName)}Jg.validateGrammar=oIe});var Wg=w(mn=>{"use strict";var wd=mn&&mn.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(mn,"__esModule",{value:!0});mn.EarlyExitException=mn.NotAllInputParsedException=mn.NoViableAltException=mn.MismatchedTokenException=mn.isRecognitionException=void 0;var aIe=Gt(),Uj="MismatchedTokenException",Hj="NoViableAltException",Gj="EarlyExitException",Yj="NotAllInputParsedException",jj=[Uj,Hj,Gj,Yj];Object.freeze(jj);function AIe(r){return(0,aIe.contains)(jj,r.name)}mn.isRecognitionException=AIe;var ry=function(r){wd(e,r);function e(t,i){var n=this.constructor,s=r.call(this,t)||this;return s.token=i,s.resyncedTokens=[],Object.setPrototypeOf(s,n.prototype),Error.captureStackTrace&&Error.captureStackTrace(s,s.constructor),s}return e}(Error),lIe=function(r){wd(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=Uj,s}return e}(ry);mn.MismatchedTokenException=lIe;var cIe=function(r){wd(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=Hj,s}return e}(ry);mn.NoViableAltException=cIe;var uIe=function(r){wd(e,r);function e(t,i){var n=r.call(this,t,i)||this;return n.name=Yj,n}return e}(ry);mn.NotAllInputParsedException=uIe;var gIe=function(r){wd(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=Gj,s}return e}(ry);mn.EarlyExitException=gIe});var jv=w(Mi=>{"use strict";Object.defineProperty(Mi,"__esModule",{value:!0});Mi.attemptInRepetitionRecovery=Mi.Recoverable=Mi.InRuleRecoveryException=Mi.IN_RULE_RECOVERY_EXCEPTION=Mi.EOF_FOLLOW_KEY=void 0;var iy=SA(),ls=Gt(),fIe=Wg(),hIe=kv(),pIe=Hn();Mi.EOF_FOLLOW_KEY={};Mi.IN_RULE_RECOVERY_EXCEPTION="InRuleRecoveryException";function Yv(r){this.name=Mi.IN_RULE_RECOVERY_EXCEPTION,this.message=r}Mi.InRuleRecoveryException=Yv;Yv.prototype=Error.prototype;var dIe=function(){function r(){}return r.prototype.initRecoverable=function(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=(0,ls.has)(e,"recoveryEnabled")?e.recoveryEnabled:pIe.DEFAULT_PARSER_CONFIG.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=qj)},r.prototype.getTokenToInsert=function(e){var t=(0,iy.createTokenInstance)(e,"",NaN,NaN,NaN,NaN,NaN,NaN);return t.isInsertedInRecovery=!0,t},r.prototype.canTokenTypeBeInsertedInRecovery=function(e){return!0},r.prototype.tryInRepetitionRecovery=function(e,t,i,n){for(var s=this,o=this.findReSyncTokenType(),a=this.exportLexerState(),l=[],c=!1,u=this.LA(1),g=this.LA(1),f=function(){var h=s.LA(0),p=s.errorMessageProvider.buildMismatchTokenMessage({expected:n,actual:u,previous:h,ruleName:s.getCurrRuleFullName()}),C=new fIe.MismatchedTokenException(p,u,s.LA(0));C.resyncedTokens=(0,ls.dropRight)(l),s.SAVE_ERROR(C)};!c;)if(this.tokenMatcher(g,n)){f();return}else if(i.call(this)){f(),e.apply(this,t);return}else this.tokenMatcher(g,o)?c=!0:(g=this.SKIP_TOKEN(),this.addToResyncTokens(g,l));this.importLexerState(a)},r.prototype.shouldInRepetitionRecoveryBeTried=function(e,t,i){return!(i===!1||e===void 0||t===void 0||this.tokenMatcher(this.LA(1),e)||this.isBackTracking()||this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,t)))},r.prototype.getFollowsForInRuleRecovery=function(e,t){var i=this.getCurrentGrammarPath(e,t),n=this.getNextPossibleTokenTypes(i);return n},r.prototype.tryInRuleRecovery=function(e,t){if(this.canRecoverWithSingleTokenInsertion(e,t)){var i=this.getTokenToInsert(e);return i}if(this.canRecoverWithSingleTokenDeletion(e)){var n=this.SKIP_TOKEN();return this.consumeToken(),n}throw new Yv("sad sad panda")},r.prototype.canPerformInRuleRecovery=function(e,t){return this.canRecoverWithSingleTokenInsertion(e,t)||this.canRecoverWithSingleTokenDeletion(e)},r.prototype.canRecoverWithSingleTokenInsertion=function(e,t){var i=this;if(!this.canTokenTypeBeInsertedInRecovery(e)||(0,ls.isEmpty)(t))return!1;var n=this.LA(1),s=(0,ls.find)(t,function(o){return i.tokenMatcher(n,o)})!==void 0;return s},r.prototype.canRecoverWithSingleTokenDeletion=function(e){var t=this.tokenMatcher(this.LA(2),e);return t},r.prototype.isInCurrentRuleReSyncSet=function(e){var t=this.getCurrFollowKey(),i=this.getFollowSetFromFollowKey(t);return(0,ls.contains)(i,e)},r.prototype.findReSyncTokenType=function(){for(var e=this.flattenFollowSet(),t=this.LA(1),i=2;;){var n=t.tokenType;if((0,ls.contains)(e,n))return n;t=this.LA(i),i++}},r.prototype.getCurrFollowKey=function(){if(this.RULE_STACK.length===1)return Mi.EOF_FOLLOW_KEY;var e=this.getLastExplicitRuleShortName(),t=this.getLastExplicitRuleOccurrenceIndex(),i=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:t,inRule:this.shortRuleNameToFullName(i)}},r.prototype.buildFullFollowKeyStack=function(){var e=this,t=this.RULE_STACK,i=this.RULE_OCCURRENCE_STACK;return(0,ls.map)(t,function(n,s){return s===0?Mi.EOF_FOLLOW_KEY:{ruleName:e.shortRuleNameToFullName(n),idxInCallingRule:i[s],inRule:e.shortRuleNameToFullName(t[s-1])}})},r.prototype.flattenFollowSet=function(){var e=this,t=(0,ls.map)(this.buildFullFollowKeyStack(),function(i){return e.getFollowSetFromFollowKey(i)});return(0,ls.flatten)(t)},r.prototype.getFollowSetFromFollowKey=function(e){if(e===Mi.EOF_FOLLOW_KEY)return[iy.EOF];var t=e.ruleName+e.idxInCallingRule+hIe.IN+e.inRule;return this.resyncFollows[t]},r.prototype.addToResyncTokens=function(e,t){return this.tokenMatcher(e,iy.EOF)||t.push(e),t},r.prototype.reSyncTo=function(e){for(var t=[],i=this.LA(1);this.tokenMatcher(i,e)===!1;)i=this.SKIP_TOKEN(),this.addToResyncTokens(i,t);return(0,ls.dropRight)(t)},r.prototype.attemptInRepetitionRecovery=function(e,t,i,n,s,o,a){},r.prototype.getCurrentGrammarPath=function(e,t){var i=this.getHumanReadableRuleStack(),n=(0,ls.cloneArr)(this.RULE_OCCURRENCE_STACK),s={ruleStack:i,occurrenceStack:n,lastTok:e,lastTokOccurrence:t};return s},r.prototype.getHumanReadableRuleStack=function(){var e=this;return(0,ls.map)(this.RULE_STACK,function(t){return e.shortRuleNameToFullName(t)})},r}();Mi.Recoverable=dIe;function qj(r,e,t,i,n,s,o){var a=this.getKeyForAutomaticLookahead(i,n),l=this.firstAfterRepMap[a];if(l===void 0){var c=this.getCurrRuleFullName(),u=this.getGAstProductions()[c],g=new s(u,n);l=g.startWalking(),this.firstAfterRepMap[a]=l}var f=l.token,h=l.occurrence,p=l.isEndOfRule;this.RULE_STACK.length===1&&p&&f===void 0&&(f=iy.EOF,h=1),this.shouldInRepetitionRecoveryBeTried(f,h,o)&&this.tryInRepetitionRecovery(r,e,t,f)}Mi.attemptInRepetitionRecovery=qj});var ny=w(qt=>{"use strict";Object.defineProperty(qt,"__esModule",{value:!0});qt.getKeyForAutomaticLookahead=qt.AT_LEAST_ONE_SEP_IDX=qt.MANY_SEP_IDX=qt.AT_LEAST_ONE_IDX=qt.MANY_IDX=qt.OPTION_IDX=qt.OR_IDX=qt.BITS_FOR_ALT_IDX=qt.BITS_FOR_RULE_IDX=qt.BITS_FOR_OCCURRENCE_IDX=qt.BITS_FOR_METHOD_TYPE=void 0;qt.BITS_FOR_METHOD_TYPE=4;qt.BITS_FOR_OCCURRENCE_IDX=8;qt.BITS_FOR_RULE_IDX=12;qt.BITS_FOR_ALT_IDX=8;qt.OR_IDX=1<{"use strict";Object.defineProperty(sy,"__esModule",{value:!0});sy.LooksAhead=void 0;var Qa=Id(),Zs=Gt(),Jj=Hn(),ba=ny(),oc=dd(),mIe=function(){function r(){}return r.prototype.initLooksAhead=function(e){this.dynamicTokensEnabled=(0,Zs.has)(e,"dynamicTokensEnabled")?e.dynamicTokensEnabled:Jj.DEFAULT_PARSER_CONFIG.dynamicTokensEnabled,this.maxLookahead=(0,Zs.has)(e,"maxLookahead")?e.maxLookahead:Jj.DEFAULT_PARSER_CONFIG.maxLookahead,this.lookAheadFuncsCache=(0,Zs.isES2015MapSupported)()?new Map:[],(0,Zs.isES2015MapSupported)()?(this.getLaFuncFromCache=this.getLaFuncFromMap,this.setLaFuncCache=this.setLaFuncCacheUsingMap):(this.getLaFuncFromCache=this.getLaFuncFromObj,this.setLaFuncCache=this.setLaFuncUsingObj)},r.prototype.preComputeLookaheadFunctions=function(e){var t=this;(0,Zs.forEach)(e,function(i){t.TRACE_INIT(i.name+" Rule Lookahead",function(){var n=(0,oc.collectMethods)(i),s=n.alternation,o=n.repetition,a=n.option,l=n.repetitionMandatory,c=n.repetitionMandatoryWithSeparator,u=n.repetitionWithSeparator;(0,Zs.forEach)(s,function(g){var f=g.idx===0?"":g.idx;t.TRACE_INIT(""+(0,oc.getProductionDslName)(g)+f,function(){var h=(0,Qa.buildLookaheadFuncForOr)(g.idx,i,g.maxLookahead||t.maxLookahead,g.hasPredicates,t.dynamicTokensEnabled,t.lookAheadBuilderForAlternatives),p=(0,ba.getKeyForAutomaticLookahead)(t.fullRuleNameToShort[i.name],ba.OR_IDX,g.idx);t.setLaFuncCache(p,h)})}),(0,Zs.forEach)(o,function(g){t.computeLookaheadFunc(i,g.idx,ba.MANY_IDX,Qa.PROD_TYPE.REPETITION,g.maxLookahead,(0,oc.getProductionDslName)(g))}),(0,Zs.forEach)(a,function(g){t.computeLookaheadFunc(i,g.idx,ba.OPTION_IDX,Qa.PROD_TYPE.OPTION,g.maxLookahead,(0,oc.getProductionDslName)(g))}),(0,Zs.forEach)(l,function(g){t.computeLookaheadFunc(i,g.idx,ba.AT_LEAST_ONE_IDX,Qa.PROD_TYPE.REPETITION_MANDATORY,g.maxLookahead,(0,oc.getProductionDslName)(g))}),(0,Zs.forEach)(c,function(g){t.computeLookaheadFunc(i,g.idx,ba.AT_LEAST_ONE_SEP_IDX,Qa.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR,g.maxLookahead,(0,oc.getProductionDslName)(g))}),(0,Zs.forEach)(u,function(g){t.computeLookaheadFunc(i,g.idx,ba.MANY_SEP_IDX,Qa.PROD_TYPE.REPETITION_WITH_SEPARATOR,g.maxLookahead,(0,oc.getProductionDslName)(g))})})})},r.prototype.computeLookaheadFunc=function(e,t,i,n,s,o){var a=this;this.TRACE_INIT(""+o+(t===0?"":t),function(){var l=(0,Qa.buildLookaheadFuncForOptionalProd)(t,e,s||a.maxLookahead,a.dynamicTokensEnabled,n,a.lookAheadBuilderForOptional),c=(0,ba.getKeyForAutomaticLookahead)(a.fullRuleNameToShort[e.name],i,t);a.setLaFuncCache(c,l)})},r.prototype.lookAheadBuilderForOptional=function(e,t,i){return(0,Qa.buildSingleAlternativeLookaheadFunction)(e,t,i)},r.prototype.lookAheadBuilderForAlternatives=function(e,t,i,n){return(0,Qa.buildAlternativesLookAheadFunc)(e,t,i,n)},r.prototype.getKeyForAutomaticLookahead=function(e,t){var i=this.getLastExplicitRuleShortName();return(0,ba.getKeyForAutomaticLookahead)(i,e,t)},r.prototype.getLaFuncFromCache=function(e){},r.prototype.getLaFuncFromMap=function(e){return this.lookAheadFuncsCache.get(e)},r.prototype.getLaFuncFromObj=function(e){return this.lookAheadFuncsCache[e]},r.prototype.setLaFuncCache=function(e,t){},r.prototype.setLaFuncCacheUsingMap=function(e,t){this.lookAheadFuncsCache.set(e,t)},r.prototype.setLaFuncUsingObj=function(e,t){this.lookAheadFuncsCache[e]=t},r}();sy.LooksAhead=mIe});var zj=w(ko=>{"use strict";Object.defineProperty(ko,"__esModule",{value:!0});ko.addNoneTerminalToCst=ko.addTerminalToCst=ko.setNodeLocationFull=ko.setNodeLocationOnlyOffset=void 0;function EIe(r,e){isNaN(r.startOffset)===!0?(r.startOffset=e.startOffset,r.endOffset=e.endOffset):r.endOffset{"use strict";Object.defineProperty(PA,"__esModule",{value:!0});PA.defineNameProp=PA.functionName=PA.classNameFromInstance=void 0;var BIe=Gt();function QIe(r){return Xj(r.constructor)}PA.classNameFromInstance=QIe;var Vj="name";function Xj(r){var e=r.name;return e||"anonymous"}PA.functionName=Xj;function bIe(r,e){var t=Object.getOwnPropertyDescriptor(r,Vj);return(0,BIe.isUndefined)(t)||t.configurable?(Object.defineProperty(r,Vj,{enumerable:!1,configurable:!0,writable:!1,value:e}),!0):!1}PA.defineNameProp=bIe});var tq=w(bi=>{"use strict";Object.defineProperty(bi,"__esModule",{value:!0});bi.validateRedundantMethods=bi.validateMissingCstMethods=bi.validateVisitor=bi.CstVisitorDefinitionError=bi.createBaseVisitorConstructorWithDefaults=bi.createBaseSemanticVisitorConstructor=bi.defaultVisit=void 0;var cs=Gt(),Bd=qv();function _j(r,e){for(var t=(0,cs.keys)(r),i=t.length,n=0;n: - `+(""+s.join(` - -`).replace(/\n/g,` - `)))}}};return t.prototype=i,t.prototype.constructor=t,t._RULE_NAMES=e,t}bi.createBaseSemanticVisitorConstructor=SIe;function vIe(r,e,t){var i=function(){};(0,Bd.defineNameProp)(i,r+"BaseSemanticsWithDefaults");var n=Object.create(t.prototype);return(0,cs.forEach)(e,function(s){n[s]=_j}),i.prototype=n,i.prototype.constructor=i,i}bi.createBaseVisitorConstructorWithDefaults=vIe;var Jv;(function(r){r[r.REDUNDANT_METHOD=0]="REDUNDANT_METHOD",r[r.MISSING_METHOD=1]="MISSING_METHOD"})(Jv=bi.CstVisitorDefinitionError||(bi.CstVisitorDefinitionError={}));function Zj(r,e){var t=$j(r,e),i=eq(r,e);return t.concat(i)}bi.validateVisitor=Zj;function $j(r,e){var t=(0,cs.map)(e,function(i){if(!(0,cs.isFunction)(r[i]))return{msg:"Missing visitor method: <"+i+"> on "+(0,Bd.functionName)(r.constructor)+" CST Visitor.",type:Jv.MISSING_METHOD,methodName:i}});return(0,cs.compact)(t)}bi.validateMissingCstMethods=$j;var xIe=["constructor","visit","validateVisitor"];function eq(r,e){var t=[];for(var i in r)(0,cs.isFunction)(r[i])&&!(0,cs.contains)(xIe,i)&&!(0,cs.contains)(e,i)&&t.push({msg:"Redundant visitor method: <"+i+"> on "+(0,Bd.functionName)(r.constructor)+` CST Visitor -There is no Grammar Rule corresponding to this method's name. -`,type:Jv.REDUNDANT_METHOD,methodName:i});return t}bi.validateRedundantMethods=eq});var iq=w(oy=>{"use strict";Object.defineProperty(oy,"__esModule",{value:!0});oy.TreeBuilder=void 0;var zg=zj(),Zr=Gt(),rq=tq(),PIe=Hn(),DIe=function(){function r(){}return r.prototype.initTreeBuilder=function(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=(0,Zr.has)(e,"nodeLocationTracking")?e.nodeLocationTracking:PIe.DEFAULT_PARSER_CONFIG.nodeLocationTracking,!this.outputCst)this.cstInvocationStateUpdate=Zr.NOOP,this.cstFinallyStateUpdate=Zr.NOOP,this.cstPostTerminal=Zr.NOOP,this.cstPostNonTerminal=Zr.NOOP,this.cstPostRule=Zr.NOOP;else if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=zg.setNodeLocationFull,this.setNodeLocationFromNode=zg.setNodeLocationFull,this.cstPostRule=Zr.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=Zr.NOOP,this.setNodeLocationFromNode=Zr.NOOP,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=zg.setNodeLocationOnlyOffset,this.setNodeLocationFromNode=zg.setNodeLocationOnlyOffset,this.cstPostRule=Zr.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=Zr.NOOP,this.setNodeLocationFromNode=Zr.NOOP,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else if(/none/i.test(this.nodeLocationTracking))this.setNodeLocationFromToken=Zr.NOOP,this.setNodeLocationFromNode=Zr.NOOP,this.cstPostRule=Zr.NOOP,this.setInitialNodeLocation=Zr.NOOP;else throw Error('Invalid config option: "'+e.nodeLocationTracking+'"')},r.prototype.setInitialNodeLocationOnlyOffsetRecovery=function(e){e.location={startOffset:NaN,endOffset:NaN}},r.prototype.setInitialNodeLocationOnlyOffsetRegular=function(e){e.location={startOffset:this.LA(1).startOffset,endOffset:NaN}},r.prototype.setInitialNodeLocationFullRecovery=function(e){e.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}},r.prototype.setInitialNodeLocationFullRegular=function(e){var t=this.LA(1);e.location={startOffset:t.startOffset,startLine:t.startLine,startColumn:t.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}},r.prototype.cstInvocationStateUpdate=function(e,t){var i={name:e,children:{}};this.setInitialNodeLocation(i),this.CST_STACK.push(i)},r.prototype.cstFinallyStateUpdate=function(){this.CST_STACK.pop()},r.prototype.cstPostRuleFull=function(e){var t=this.LA(0),i=e.location;i.startOffset<=t.startOffset?(i.endOffset=t.endOffset,i.endLine=t.endLine,i.endColumn=t.endColumn):(i.startOffset=NaN,i.startLine=NaN,i.startColumn=NaN)},r.prototype.cstPostRuleOnlyOffset=function(e){var t=this.LA(0),i=e.location;i.startOffset<=t.startOffset?i.endOffset=t.endOffset:i.startOffset=NaN},r.prototype.cstPostTerminal=function(e,t){var i=this.CST_STACK[this.CST_STACK.length-1];(0,zg.addTerminalToCst)(i,t,e),this.setNodeLocationFromToken(i.location,t)},r.prototype.cstPostNonTerminal=function(e,t){var i=this.CST_STACK[this.CST_STACK.length-1];(0,zg.addNoneTerminalToCst)(i,t,e),this.setNodeLocationFromNode(i.location,e.location)},r.prototype.getBaseCstVisitorConstructor=function(){if((0,Zr.isUndefined)(this.baseCstVisitorConstructor)){var e=(0,rq.createBaseSemanticVisitorConstructor)(this.className,(0,Zr.keys)(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor},r.prototype.getBaseCstVisitorConstructorWithDefaults=function(){if((0,Zr.isUndefined)(this.baseCstVisitorWithDefaultsConstructor)){var e=(0,rq.createBaseVisitorConstructorWithDefaults)(this.className,(0,Zr.keys)(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor},r.prototype.getLastExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-1]},r.prototype.getPreviousExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-2]},r.prototype.getLastExplicitRuleOccurrenceIndex=function(){var e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]},r}();oy.TreeBuilder=DIe});var sq=w(ay=>{"use strict";Object.defineProperty(ay,"__esModule",{value:!0});ay.LexerAdapter=void 0;var nq=Hn(),kIe=function(){function r(){}return r.prototype.initLexerAdapter=function(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1},Object.defineProperty(r.prototype,"input",{get:function(){return this.tokVector},set:function(e){if(this.selfAnalysisDone!==!0)throw Error("Missing invocation at the end of the Parser's constructor.");this.reset(),this.tokVector=e,this.tokVectorLength=e.length},enumerable:!1,configurable:!0}),r.prototype.SKIP_TOKEN=function(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):nq.END_OF_FILE},r.prototype.LA=function(e){var t=this.currIdx+e;return t<0||this.tokVectorLength<=t?nq.END_OF_FILE:this.tokVector[t]},r.prototype.consumeToken=function(){this.currIdx++},r.prototype.exportLexerState=function(){return this.currIdx},r.prototype.importLexerState=function(e){this.currIdx=e},r.prototype.resetLexerState=function(){this.currIdx=-1},r.prototype.moveToTerminatedState=function(){this.currIdx=this.tokVector.length-1},r.prototype.getLexerPosition=function(){return this.exportLexerState()},r}();ay.LexerAdapter=kIe});var aq=w(Ay=>{"use strict";Object.defineProperty(Ay,"__esModule",{value:!0});Ay.RecognizerApi=void 0;var oq=Gt(),RIe=Wg(),Wv=Hn(),FIe=Cd(),NIe=Hv(),LIe=dn(),TIe=function(){function r(){}return r.prototype.ACTION=function(e){return e.call(this)},r.prototype.consume=function(e,t,i){return this.consumeInternal(t,e,i)},r.prototype.subrule=function(e,t,i){return this.subruleInternal(t,e,i)},r.prototype.option=function(e,t){return this.optionInternal(t,e)},r.prototype.or=function(e,t){return this.orInternal(t,e)},r.prototype.many=function(e,t){return this.manyInternal(e,t)},r.prototype.atLeastOne=function(e,t){return this.atLeastOneInternal(e,t)},r.prototype.CONSUME=function(e,t){return this.consumeInternal(e,0,t)},r.prototype.CONSUME1=function(e,t){return this.consumeInternal(e,1,t)},r.prototype.CONSUME2=function(e,t){return this.consumeInternal(e,2,t)},r.prototype.CONSUME3=function(e,t){return this.consumeInternal(e,3,t)},r.prototype.CONSUME4=function(e,t){return this.consumeInternal(e,4,t)},r.prototype.CONSUME5=function(e,t){return this.consumeInternal(e,5,t)},r.prototype.CONSUME6=function(e,t){return this.consumeInternal(e,6,t)},r.prototype.CONSUME7=function(e,t){return this.consumeInternal(e,7,t)},r.prototype.CONSUME8=function(e,t){return this.consumeInternal(e,8,t)},r.prototype.CONSUME9=function(e,t){return this.consumeInternal(e,9,t)},r.prototype.SUBRULE=function(e,t){return this.subruleInternal(e,0,t)},r.prototype.SUBRULE1=function(e,t){return this.subruleInternal(e,1,t)},r.prototype.SUBRULE2=function(e,t){return this.subruleInternal(e,2,t)},r.prototype.SUBRULE3=function(e,t){return this.subruleInternal(e,3,t)},r.prototype.SUBRULE4=function(e,t){return this.subruleInternal(e,4,t)},r.prototype.SUBRULE5=function(e,t){return this.subruleInternal(e,5,t)},r.prototype.SUBRULE6=function(e,t){return this.subruleInternal(e,6,t)},r.prototype.SUBRULE7=function(e,t){return this.subruleInternal(e,7,t)},r.prototype.SUBRULE8=function(e,t){return this.subruleInternal(e,8,t)},r.prototype.SUBRULE9=function(e,t){return this.subruleInternal(e,9,t)},r.prototype.OPTION=function(e){return this.optionInternal(e,0)},r.prototype.OPTION1=function(e){return this.optionInternal(e,1)},r.prototype.OPTION2=function(e){return this.optionInternal(e,2)},r.prototype.OPTION3=function(e){return this.optionInternal(e,3)},r.prototype.OPTION4=function(e){return this.optionInternal(e,4)},r.prototype.OPTION5=function(e){return this.optionInternal(e,5)},r.prototype.OPTION6=function(e){return this.optionInternal(e,6)},r.prototype.OPTION7=function(e){return this.optionInternal(e,7)},r.prototype.OPTION8=function(e){return this.optionInternal(e,8)},r.prototype.OPTION9=function(e){return this.optionInternal(e,9)},r.prototype.OR=function(e){return this.orInternal(e,0)},r.prototype.OR1=function(e){return this.orInternal(e,1)},r.prototype.OR2=function(e){return this.orInternal(e,2)},r.prototype.OR3=function(e){return this.orInternal(e,3)},r.prototype.OR4=function(e){return this.orInternal(e,4)},r.prototype.OR5=function(e){return this.orInternal(e,5)},r.prototype.OR6=function(e){return this.orInternal(e,6)},r.prototype.OR7=function(e){return this.orInternal(e,7)},r.prototype.OR8=function(e){return this.orInternal(e,8)},r.prototype.OR9=function(e){return this.orInternal(e,9)},r.prototype.MANY=function(e){this.manyInternal(0,e)},r.prototype.MANY1=function(e){this.manyInternal(1,e)},r.prototype.MANY2=function(e){this.manyInternal(2,e)},r.prototype.MANY3=function(e){this.manyInternal(3,e)},r.prototype.MANY4=function(e){this.manyInternal(4,e)},r.prototype.MANY5=function(e){this.manyInternal(5,e)},r.prototype.MANY6=function(e){this.manyInternal(6,e)},r.prototype.MANY7=function(e){this.manyInternal(7,e)},r.prototype.MANY8=function(e){this.manyInternal(8,e)},r.prototype.MANY9=function(e){this.manyInternal(9,e)},r.prototype.MANY_SEP=function(e){this.manySepFirstInternal(0,e)},r.prototype.MANY_SEP1=function(e){this.manySepFirstInternal(1,e)},r.prototype.MANY_SEP2=function(e){this.manySepFirstInternal(2,e)},r.prototype.MANY_SEP3=function(e){this.manySepFirstInternal(3,e)},r.prototype.MANY_SEP4=function(e){this.manySepFirstInternal(4,e)},r.prototype.MANY_SEP5=function(e){this.manySepFirstInternal(5,e)},r.prototype.MANY_SEP6=function(e){this.manySepFirstInternal(6,e)},r.prototype.MANY_SEP7=function(e){this.manySepFirstInternal(7,e)},r.prototype.MANY_SEP8=function(e){this.manySepFirstInternal(8,e)},r.prototype.MANY_SEP9=function(e){this.manySepFirstInternal(9,e)},r.prototype.AT_LEAST_ONE=function(e){this.atLeastOneInternal(0,e)},r.prototype.AT_LEAST_ONE1=function(e){return this.atLeastOneInternal(1,e)},r.prototype.AT_LEAST_ONE2=function(e){this.atLeastOneInternal(2,e)},r.prototype.AT_LEAST_ONE3=function(e){this.atLeastOneInternal(3,e)},r.prototype.AT_LEAST_ONE4=function(e){this.atLeastOneInternal(4,e)},r.prototype.AT_LEAST_ONE5=function(e){this.atLeastOneInternal(5,e)},r.prototype.AT_LEAST_ONE6=function(e){this.atLeastOneInternal(6,e)},r.prototype.AT_LEAST_ONE7=function(e){this.atLeastOneInternal(7,e)},r.prototype.AT_LEAST_ONE8=function(e){this.atLeastOneInternal(8,e)},r.prototype.AT_LEAST_ONE9=function(e){this.atLeastOneInternal(9,e)},r.prototype.AT_LEAST_ONE_SEP=function(e){this.atLeastOneSepFirstInternal(0,e)},r.prototype.AT_LEAST_ONE_SEP1=function(e){this.atLeastOneSepFirstInternal(1,e)},r.prototype.AT_LEAST_ONE_SEP2=function(e){this.atLeastOneSepFirstInternal(2,e)},r.prototype.AT_LEAST_ONE_SEP3=function(e){this.atLeastOneSepFirstInternal(3,e)},r.prototype.AT_LEAST_ONE_SEP4=function(e){this.atLeastOneSepFirstInternal(4,e)},r.prototype.AT_LEAST_ONE_SEP5=function(e){this.atLeastOneSepFirstInternal(5,e)},r.prototype.AT_LEAST_ONE_SEP6=function(e){this.atLeastOneSepFirstInternal(6,e)},r.prototype.AT_LEAST_ONE_SEP7=function(e){this.atLeastOneSepFirstInternal(7,e)},r.prototype.AT_LEAST_ONE_SEP8=function(e){this.atLeastOneSepFirstInternal(8,e)},r.prototype.AT_LEAST_ONE_SEP9=function(e){this.atLeastOneSepFirstInternal(9,e)},r.prototype.RULE=function(e,t,i){if(i===void 0&&(i=Wv.DEFAULT_RULE_CONFIG),(0,oq.contains)(this.definedRulesNames,e)){var n=FIe.defaultGrammarValidatorErrorProvider.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),s={message:n,type:Wv.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(s)}this.definedRulesNames.push(e);var o=this.defineRule(e,t,i);return this[e]=o,o},r.prototype.OVERRIDE_RULE=function(e,t,i){i===void 0&&(i=Wv.DEFAULT_RULE_CONFIG);var n=[];n=n.concat((0,NIe.validateRuleIsOverridden)(e,this.definedRulesNames,this.className)),this.definitionErrors=this.definitionErrors.concat(n);var s=this.defineRule(e,t,i);return this[e]=s,s},r.prototype.BACKTRACK=function(e,t){return function(){this.isBackTrackingStack.push(1);var i=this.saveRecogState();try{return e.apply(this,t),!0}catch(n){if((0,RIe.isRecognitionException)(n))return!1;throw n}finally{this.reloadRecogState(i),this.isBackTrackingStack.pop()}}},r.prototype.getGAstProductions=function(){return this.gastProductionsCache},r.prototype.getSerializedGastProductions=function(){return(0,LIe.serializeGrammar)((0,oq.values)(this.gastProductionsCache))},r}();Ay.RecognizerApi=TIe});var uq=w(cy=>{"use strict";Object.defineProperty(cy,"__esModule",{value:!0});cy.RecognizerEngine=void 0;var Pr=Gt(),Gn=ny(),ly=Wg(),Aq=Id(),Vg=Ed(),lq=Hn(),OIe=jv(),cq=SA(),Qd=Gg(),MIe=qv(),KIe=function(){function r(){}return r.prototype.initRecognizerEngine=function(e,t){if(this.className=(0,MIe.classNameFromInstance)(this),this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=Qd.tokenStructuredMatcherNoCategories,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},(0,Pr.has)(t,"serializedGrammar"))throw Error(`The Parser's configuration can no longer contain a property. - See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0 - For Further details.`);if((0,Pr.isArray)(e)){if((0,Pr.isEmpty)(e))throw Error(`A Token Vocabulary cannot be empty. - Note that the first argument for the parser constructor - is no longer a Token vector (since v4.0).`);if(typeof e[0].startOffset=="number")throw Error(`The Parser constructor no longer accepts a token vector as the first argument. - See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0 - For Further details.`)}if((0,Pr.isArray)(e))this.tokensMap=(0,Pr.reduce)(e,function(o,a){return o[a.name]=a,o},{});else if((0,Pr.has)(e,"modes")&&(0,Pr.every)((0,Pr.flatten)((0,Pr.values)(e.modes)),Qd.isTokenType)){var i=(0,Pr.flatten)((0,Pr.values)(e.modes)),n=(0,Pr.uniq)(i);this.tokensMap=(0,Pr.reduce)(n,function(o,a){return o[a.name]=a,o},{})}else if((0,Pr.isObject)(e))this.tokensMap=(0,Pr.cloneObj)(e);else throw new Error(" argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition");this.tokensMap.EOF=cq.EOF;var s=(0,Pr.every)((0,Pr.values)(e),function(o){return(0,Pr.isEmpty)(o.categoryMatches)});this.tokenMatcher=s?Qd.tokenStructuredMatcherNoCategories:Qd.tokenStructuredMatcher,(0,Qd.augmentTokenTypes)((0,Pr.values)(this.tokensMap))},r.prototype.defineRule=function(e,t,i){if(this.selfAnalysisDone)throw Error("Grammar rule <"+e+`> may not be defined after the 'performSelfAnalysis' method has been called' -Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);var n=(0,Pr.has)(i,"resyncEnabled")?i.resyncEnabled:lq.DEFAULT_RULE_CONFIG.resyncEnabled,s=(0,Pr.has)(i,"recoveryValueFunc")?i.recoveryValueFunc:lq.DEFAULT_RULE_CONFIG.recoveryValueFunc,o=this.ruleShortNameIdx<t},r.prototype.orInternal=function(e,t){var i=this.getKeyForAutomaticLookahead(Gn.OR_IDX,t),n=(0,Pr.isArray)(e)?e:e.DEF,s=this.getLaFuncFromCache(i),o=s.call(this,n);if(o!==void 0){var a=n[o];return a.ALT.call(this)}this.raiseNoAltException(t,e.ERR_MSG)},r.prototype.ruleFinallyStateUpdate=function(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),this.RULE_STACK.length===0&&this.isAtEndOfInput()===!1){var e=this.LA(1),t=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new ly.NotAllInputParsedException(t,e))}},r.prototype.subruleInternal=function(e,t,i){var n;try{var s=i!==void 0?i.ARGS:void 0;return n=e.call(this,t,s),this.cstPostNonTerminal(n,i!==void 0&&i.LABEL!==void 0?i.LABEL:e.ruleName),n}catch(o){this.subruleInternalError(o,i,e.ruleName)}},r.prototype.subruleInternalError=function(e,t,i){throw(0,ly.isRecognitionException)(e)&&e.partialCstResult!==void 0&&(this.cstPostNonTerminal(e.partialCstResult,t!==void 0&&t.LABEL!==void 0?t.LABEL:i),delete e.partialCstResult),e},r.prototype.consumeInternal=function(e,t,i){var n;try{var s=this.LA(1);this.tokenMatcher(s,e)===!0?(this.consumeToken(),n=s):this.consumeInternalError(e,s,i)}catch(o){n=this.consumeInternalRecovery(e,t,o)}return this.cstPostTerminal(i!==void 0&&i.LABEL!==void 0?i.LABEL:e.name,n),n},r.prototype.consumeInternalError=function(e,t,i){var n,s=this.LA(0);throw i!==void 0&&i.ERR_MSG?n=i.ERR_MSG:n=this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:t,previous:s,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new ly.MismatchedTokenException(n,t,s))},r.prototype.consumeInternalRecovery=function(e,t,i){if(this.recoveryEnabled&&i.name==="MismatchedTokenException"&&!this.isBackTracking()){var n=this.getFollowsForInRuleRecovery(e,t);try{return this.tryInRuleRecovery(e,n)}catch(s){throw s.name===OIe.IN_RULE_RECOVERY_EXCEPTION?i:s}}else throw i},r.prototype.saveRecogState=function(){var e=this.errors,t=(0,Pr.cloneArr)(this.RULE_STACK);return{errors:e,lexerState:this.exportLexerState(),RULE_STACK:t,CST_STACK:this.CST_STACK}},r.prototype.reloadRecogState=function(e){this.errors=e.errors,this.importLexerState(e.lexerState),this.RULE_STACK=e.RULE_STACK},r.prototype.ruleInvocationStateUpdate=function(e,t,i){this.RULE_OCCURRENCE_STACK.push(i),this.RULE_STACK.push(e),this.cstInvocationStateUpdate(t,e)},r.prototype.isBackTracking=function(){return this.isBackTrackingStack.length!==0},r.prototype.getCurrRuleFullName=function(){var e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]},r.prototype.shortRuleNameToFullName=function(e){return this.shortRuleNameToFull[e]},r.prototype.isAtEndOfInput=function(){return this.tokenMatcher(this.LA(1),cq.EOF)},r.prototype.reset=function(){this.resetLexerState(),this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]},r}();cy.RecognizerEngine=KIe});var fq=w(uy=>{"use strict";Object.defineProperty(uy,"__esModule",{value:!0});uy.ErrorHandler=void 0;var zv=Wg(),Vv=Gt(),gq=Id(),UIe=Hn(),HIe=function(){function r(){}return r.prototype.initErrorHandler=function(e){this._errors=[],this.errorMessageProvider=(0,Vv.has)(e,"errorMessageProvider")?e.errorMessageProvider:UIe.DEFAULT_PARSER_CONFIG.errorMessageProvider},r.prototype.SAVE_ERROR=function(e){if((0,zv.isRecognitionException)(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:(0,Vv.cloneArr)(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error("Trying to save an Error which is not a RecognitionException")},Object.defineProperty(r.prototype,"errors",{get:function(){return(0,Vv.cloneArr)(this._errors)},set:function(e){this._errors=e},enumerable:!1,configurable:!0}),r.prototype.raiseEarlyExitException=function(e,t,i){for(var n=this.getCurrRuleFullName(),s=this.getGAstProductions()[n],o=(0,gq.getLookaheadPathsForOptionalProd)(e,s,t,this.maxLookahead),a=o[0],l=[],c=1;c<=this.maxLookahead;c++)l.push(this.LA(c));var u=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:a,actual:l,previous:this.LA(0),customUserDescription:i,ruleName:n});throw this.SAVE_ERROR(new zv.EarlyExitException(u,this.LA(1),this.LA(0)))},r.prototype.raiseNoAltException=function(e,t){for(var i=this.getCurrRuleFullName(),n=this.getGAstProductions()[i],s=(0,gq.getLookaheadPathsForOr)(e,n,this.maxLookahead),o=[],a=1;a<=this.maxLookahead;a++)o.push(this.LA(a));var l=this.LA(0),c=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:s,actual:o,previous:l,customUserDescription:t,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new zv.NoViableAltException(c,this.LA(1),l))},r}();uy.ErrorHandler=HIe});var dq=w(gy=>{"use strict";Object.defineProperty(gy,"__esModule",{value:!0});gy.ContentAssist=void 0;var hq=Ed(),pq=Gt(),GIe=function(){function r(){}return r.prototype.initContentAssist=function(){},r.prototype.computeContentAssist=function(e,t){var i=this.gastProductionsCache[e];if((0,pq.isUndefined)(i))throw Error("Rule ->"+e+"<- does not exist in this grammar.");return(0,hq.nextPossibleTokensAfter)([i],t,this.tokenMatcher,this.maxLookahead)},r.prototype.getNextPossibleTokenTypes=function(e){var t=(0,pq.first)(e.ruleStack),i=this.getGAstProductions(),n=i[t],s=new hq.NextAfterTokenWalker(n,e).startWalking();return s},r}();gy.ContentAssist=GIe});var Qq=w(py=>{"use strict";Object.defineProperty(py,"__esModule",{value:!0});py.GastRecorder=void 0;var En=Gt(),Ro=dn(),YIe=gd(),Iq=Gg(),yq=SA(),jIe=Hn(),qIe=ny(),hy={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(hy);var Cq=!0,mq=Math.pow(2,qIe.BITS_FOR_OCCURRENCE_IDX)-1,wq=(0,yq.createToken)({name:"RECORDING_PHASE_TOKEN",pattern:YIe.Lexer.NA});(0,Iq.augmentTokenTypes)([wq]);var Bq=(0,yq.createTokenInstance)(wq,`This IToken indicates the Parser is in Recording Phase - See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,-1,-1,-1,-1,-1,-1);Object.freeze(Bq);var JIe={name:`This CSTNode indicates the Parser is in Recording Phase - See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,children:{}},WIe=function(){function r(){}return r.prototype.initGastRecorder=function(e){this.recordingProdStack=[],this.RECORDING_PHASE=!1},r.prototype.enableRecording=function(){var e=this;this.RECORDING_PHASE=!0,this.TRACE_INIT("Enable Recording",function(){for(var t=function(n){var s=n>0?n:"";e["CONSUME"+s]=function(o,a){return this.consumeInternalRecord(o,n,a)},e["SUBRULE"+s]=function(o,a){return this.subruleInternalRecord(o,n,a)},e["OPTION"+s]=function(o){return this.optionInternalRecord(o,n)},e["OR"+s]=function(o){return this.orInternalRecord(o,n)},e["MANY"+s]=function(o){this.manyInternalRecord(n,o)},e["MANY_SEP"+s]=function(o){this.manySepFirstInternalRecord(n,o)},e["AT_LEAST_ONE"+s]=function(o){this.atLeastOneInternalRecord(n,o)},e["AT_LEAST_ONE_SEP"+s]=function(o){this.atLeastOneSepFirstInternalRecord(n,o)}},i=0;i<10;i++)t(i);e.consume=function(n,s,o){return this.consumeInternalRecord(s,n,o)},e.subrule=function(n,s,o){return this.subruleInternalRecord(s,n,o)},e.option=function(n,s){return this.optionInternalRecord(s,n)},e.or=function(n,s){return this.orInternalRecord(s,n)},e.many=function(n,s){this.manyInternalRecord(n,s)},e.atLeastOne=function(n,s){this.atLeastOneInternalRecord(n,s)},e.ACTION=e.ACTION_RECORD,e.BACKTRACK=e.BACKTRACK_RECORD,e.LA=e.LA_RECORD})},r.prototype.disableRecording=function(){var e=this;this.RECORDING_PHASE=!1,this.TRACE_INIT("Deleting Recording methods",function(){for(var t=0;t<10;t++){var i=t>0?t:"";delete e["CONSUME"+i],delete e["SUBRULE"+i],delete e["OPTION"+i],delete e["OR"+i],delete e["MANY"+i],delete e["MANY_SEP"+i],delete e["AT_LEAST_ONE"+i],delete e["AT_LEAST_ONE_SEP"+i]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})},r.prototype.ACTION_RECORD=function(e){},r.prototype.BACKTRACK_RECORD=function(e,t){return function(){return!0}},r.prototype.LA_RECORD=function(e){return jIe.END_OF_FILE},r.prototype.topLevelRuleRecord=function(e,t){try{var i=new Ro.Rule({definition:[],name:e});return i.name=e,this.recordingProdStack.push(i),t.call(this),this.recordingProdStack.pop(),i}catch(n){if(n.KNOWN_RECORDER_ERROR!==!0)try{n.message=n.message+` - This error was thrown during the "grammar recording phase" For more info see: - https://chevrotain.io/docs/guide/internals.html#grammar-recording`}catch{throw n}throw n}},r.prototype.optionInternalRecord=function(e,t){return bd.call(this,Ro.Option,e,t)},r.prototype.atLeastOneInternalRecord=function(e,t){bd.call(this,Ro.RepetitionMandatory,t,e)},r.prototype.atLeastOneSepFirstInternalRecord=function(e,t){bd.call(this,Ro.RepetitionMandatoryWithSeparator,t,e,Cq)},r.prototype.manyInternalRecord=function(e,t){bd.call(this,Ro.Repetition,t,e)},r.prototype.manySepFirstInternalRecord=function(e,t){bd.call(this,Ro.RepetitionWithSeparator,t,e,Cq)},r.prototype.orInternalRecord=function(e,t){return zIe.call(this,e,t)},r.prototype.subruleInternalRecord=function(e,t,i){if(fy(t),!e||(0,En.has)(e,"ruleName")===!1){var n=new Error(" argument is invalid"+(" expecting a Parser method reference but got: <"+JSON.stringify(e)+">")+(` - inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,En.peek)(this.recordingProdStack),o=e.ruleName,a=new Ro.NonTerminal({idx:t,nonTerminalName:o,label:i==null?void 0:i.LABEL,referencedRule:void 0});return s.definition.push(a),this.outputCst?JIe:hy},r.prototype.consumeInternalRecord=function(e,t,i){if(fy(t),!(0,Iq.hasShortKeyProperty)(e)){var n=new Error(" argument is invalid"+(" expecting a TokenType reference but got: <"+JSON.stringify(e)+">")+(` - inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,En.peek)(this.recordingProdStack),o=new Ro.Terminal({idx:t,terminalType:e,label:i==null?void 0:i.LABEL});return s.definition.push(o),Bq},r}();py.GastRecorder=WIe;function bd(r,e,t,i){i===void 0&&(i=!1),fy(t);var n=(0,En.peek)(this.recordingProdStack),s=(0,En.isFunction)(e)?e:e.DEF,o=new r({definition:[],idx:t});return i&&(o.separator=e.SEP),(0,En.has)(e,"MAX_LOOKAHEAD")&&(o.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(o),s.call(this),n.definition.push(o),this.recordingProdStack.pop(),hy}function zIe(r,e){var t=this;fy(e);var i=(0,En.peek)(this.recordingProdStack),n=(0,En.isArray)(r)===!1,s=n===!1?r:r.DEF,o=new Ro.Alternation({definition:[],idx:e,ignoreAmbiguities:n&&r.IGNORE_AMBIGUITIES===!0});(0,En.has)(r,"MAX_LOOKAHEAD")&&(o.maxLookahead=r.MAX_LOOKAHEAD);var a=(0,En.some)(s,function(l){return(0,En.isFunction)(l.GATE)});return o.hasPredicates=a,i.definition.push(o),(0,En.forEach)(s,function(l){var c=new Ro.Alternative({definition:[]});o.definition.push(c),(0,En.has)(l,"IGNORE_AMBIGUITIES")?c.ignoreAmbiguities=l.IGNORE_AMBIGUITIES:(0,En.has)(l,"GATE")&&(c.ignoreAmbiguities=!0),t.recordingProdStack.push(c),l.ALT.call(t),t.recordingProdStack.pop()}),hy}function Eq(r){return r===0?"":""+r}function fy(r){if(r<0||r>mq){var e=new Error("Invalid DSL Method idx value: <"+r+`> - `+("Idx value must be a none negative value smaller than "+(mq+1)));throw e.KNOWN_RECORDER_ERROR=!0,e}}});var Sq=w(dy=>{"use strict";Object.defineProperty(dy,"__esModule",{value:!0});dy.PerformanceTracer=void 0;var bq=Gt(),VIe=Hn(),XIe=function(){function r(){}return r.prototype.initPerformanceTracer=function(e){if((0,bq.has)(e,"traceInitPerf")){var t=e.traceInitPerf,i=typeof t=="number";this.traceInitMaxIdent=i?t:1/0,this.traceInitPerf=i?t>0:t}else this.traceInitMaxIdent=0,this.traceInitPerf=VIe.DEFAULT_PARSER_CONFIG.traceInitPerf;this.traceInitIndent=-1},r.prototype.TRACE_INIT=function(e,t){if(this.traceInitPerf===!0){this.traceInitIndent++;var i=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <"+e+">");var n=(0,bq.timer)(t),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return t()},r}();dy.PerformanceTracer=XIe});var vq=w(Cy=>{"use strict";Object.defineProperty(Cy,"__esModule",{value:!0});Cy.applyMixins=void 0;function _Ie(r,e){e.forEach(function(t){var i=t.prototype;Object.getOwnPropertyNames(i).forEach(function(n){if(n!=="constructor"){var s=Object.getOwnPropertyDescriptor(i,n);s&&(s.get||s.set)?Object.defineProperty(r.prototype,n,s):r.prototype[n]=t.prototype[n]}})})}Cy.applyMixins=_Ie});var Hn=w(dr=>{"use strict";var Dq=dr&&dr.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(dr,"__esModule",{value:!0});dr.EmbeddedActionsParser=dr.CstParser=dr.Parser=dr.EMPTY_ALT=dr.ParserDefinitionErrorType=dr.DEFAULT_RULE_CONFIG=dr.DEFAULT_PARSER_CONFIG=dr.END_OF_FILE=void 0;var Xi=Gt(),ZIe=fj(),xq=SA(),kq=Cd(),Pq=Kj(),$Ie=jv(),eye=Wj(),tye=iq(),rye=sq(),iye=aq(),nye=uq(),sye=fq(),oye=dq(),aye=Qq(),Aye=Sq(),lye=vq();dr.END_OF_FILE=(0,xq.createTokenInstance)(xq.EOF,"",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(dr.END_OF_FILE);dr.DEFAULT_PARSER_CONFIG=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:kq.defaultParserErrorProvider,nodeLocationTracking:"none",traceInitPerf:!1,skipValidations:!1});dr.DEFAULT_RULE_CONFIG=Object.freeze({recoveryValueFunc:function(){},resyncEnabled:!0});var cye;(function(r){r[r.INVALID_RULE_NAME=0]="INVALID_RULE_NAME",r[r.DUPLICATE_RULE_NAME=1]="DUPLICATE_RULE_NAME",r[r.INVALID_RULE_OVERRIDE=2]="INVALID_RULE_OVERRIDE",r[r.DUPLICATE_PRODUCTIONS=3]="DUPLICATE_PRODUCTIONS",r[r.UNRESOLVED_SUBRULE_REF=4]="UNRESOLVED_SUBRULE_REF",r[r.LEFT_RECURSION=5]="LEFT_RECURSION",r[r.NONE_LAST_EMPTY_ALT=6]="NONE_LAST_EMPTY_ALT",r[r.AMBIGUOUS_ALTS=7]="AMBIGUOUS_ALTS",r[r.CONFLICT_TOKENS_RULES_NAMESPACE=8]="CONFLICT_TOKENS_RULES_NAMESPACE",r[r.INVALID_TOKEN_NAME=9]="INVALID_TOKEN_NAME",r[r.NO_NON_EMPTY_LOOKAHEAD=10]="NO_NON_EMPTY_LOOKAHEAD",r[r.AMBIGUOUS_PREFIX_ALTS=11]="AMBIGUOUS_PREFIX_ALTS",r[r.TOO_MANY_ALTS=12]="TOO_MANY_ALTS"})(cye=dr.ParserDefinitionErrorType||(dr.ParserDefinitionErrorType={}));function uye(r){return r===void 0&&(r=void 0),function(){return r}}dr.EMPTY_ALT=uye;var my=function(){function r(e,t){this.definitionErrors=[],this.selfAnalysisDone=!1;var i=this;if(i.initErrorHandler(t),i.initLexerAdapter(),i.initLooksAhead(t),i.initRecognizerEngine(e,t),i.initRecoverable(t),i.initTreeBuilder(t),i.initContentAssist(),i.initGastRecorder(t),i.initPerformanceTracer(t),(0,Xi.has)(t,"ignoredIssues"))throw new Error(`The IParserConfig property has been deprecated. - Please use the flag on the relevant DSL method instead. - See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES - For further details.`);this.skipValidations=(0,Xi.has)(t,"skipValidations")?t.skipValidations:dr.DEFAULT_PARSER_CONFIG.skipValidations}return r.performSelfAnalysis=function(e){throw Error("The **static** `performSelfAnalysis` method has been deprecated. \nUse the **instance** method with the same name instead.")},r.prototype.performSelfAnalysis=function(){var e=this;this.TRACE_INIT("performSelfAnalysis",function(){var t;e.selfAnalysisDone=!0;var i=e.className;e.TRACE_INIT("toFastProps",function(){(0,Xi.toFastProperties)(e)}),e.TRACE_INIT("Grammar Recording",function(){try{e.enableRecording(),(0,Xi.forEach)(e.definedRulesNames,function(s){var o=e[s],a=o.originalGrammarAction,l=void 0;e.TRACE_INIT(s+" Rule",function(){l=e.topLevelRuleRecord(s,a)}),e.gastProductionsCache[s]=l})}finally{e.disableRecording()}});var n=[];if(e.TRACE_INIT("Grammar Resolving",function(){n=(0,Pq.resolveGrammar)({rules:(0,Xi.values)(e.gastProductionsCache)}),e.definitionErrors=e.definitionErrors.concat(n)}),e.TRACE_INIT("Grammar Validations",function(){if((0,Xi.isEmpty)(n)&&e.skipValidations===!1){var s=(0,Pq.validateGrammar)({rules:(0,Xi.values)(e.gastProductionsCache),maxLookahead:e.maxLookahead,tokenTypes:(0,Xi.values)(e.tokensMap),errMsgProvider:kq.defaultGrammarValidatorErrorProvider,grammarName:i});e.definitionErrors=e.definitionErrors.concat(s)}}),(0,Xi.isEmpty)(e.definitionErrors)&&(e.recoveryEnabled&&e.TRACE_INIT("computeAllProdsFollows",function(){var s=(0,ZIe.computeAllProdsFollows)((0,Xi.values)(e.gastProductionsCache));e.resyncFollows=s}),e.TRACE_INIT("ComputeLookaheadFunctions",function(){e.preComputeLookaheadFunctions((0,Xi.values)(e.gastProductionsCache))})),!r.DEFER_DEFINITION_ERRORS_HANDLING&&!(0,Xi.isEmpty)(e.definitionErrors))throw t=(0,Xi.map)(e.definitionErrors,function(s){return s.message}),new Error(`Parser Definition Errors detected: - `+t.join(` -------------------------------- -`))})},r.DEFER_DEFINITION_ERRORS_HANDLING=!1,r}();dr.Parser=my;(0,lye.applyMixins)(my,[$Ie.Recoverable,eye.LooksAhead,tye.TreeBuilder,rye.LexerAdapter,nye.RecognizerEngine,iye.RecognizerApi,sye.ErrorHandler,oye.ContentAssist,aye.GastRecorder,Aye.PerformanceTracer]);var gye=function(r){Dq(e,r);function e(t,i){i===void 0&&(i=dr.DEFAULT_PARSER_CONFIG);var n=this,s=(0,Xi.cloneObj)(i);return s.outputCst=!0,n=r.call(this,t,s)||this,n}return e}(my);dr.CstParser=gye;var fye=function(r){Dq(e,r);function e(t,i){i===void 0&&(i=dr.DEFAULT_PARSER_CONFIG);var n=this,s=(0,Xi.cloneObj)(i);return s.outputCst=!1,n=r.call(this,t,s)||this,n}return e}(my);dr.EmbeddedActionsParser=fye});var Fq=w(Ey=>{"use strict";Object.defineProperty(Ey,"__esModule",{value:!0});Ey.createSyntaxDiagramsCode=void 0;var Rq=pv();function hye(r,e){var t=e===void 0?{}:e,i=t.resourceBase,n=i===void 0?"https://unpkg.com/chevrotain@"+Rq.VERSION+"/diagrams/":i,s=t.css,o=s===void 0?"https://unpkg.com/chevrotain@"+Rq.VERSION+"/diagrams/diagrams.css":s,a=` - - - - - -`,l=` - -`,c=` - - - -
- + + + + + +
+ -
-
-
-
- -
-
-
-
-

- Custom YouTube Music Desktop App -

-

- Open source, cross-platform, unofficial YouTube Music Desktop - App with built-in ad blocker and - downloader -

-
- Download -
-
-
-
- YouTube Music -
-
-
-
-
+
+
+
+
+ +
+
+
+
+

+ Custom YouTube Music Desktop App +

+

+ Open source, cross-platform, unofficial YouTube Music Desktop + App with built-in ad blocker and + downloader +

+
+ Download +
+
+
+
+ YouTube Music +
+
+
+
+
-
-
-
-
-
-
- Adblocker +
+
+
+
+
+ Adblocker -
-
+
+
-

Built-in adblocker

-

Block all ads and tracking out of the box

-
-
-
-
- DownloaderBuilt-in adblocker +

Block all ads and tracking out of the box

+
+
+
+
+ Downloader -
-
-

Built-in downloader

-

- Download (like youtube-dl) to custom formats (mp3, opus, - etc) directly from the interface -

-
-
-
-
- PluginsBuilt-in downloader +

+ Download (like youtube-dl) to custom formats (mp3, opus, + etc) directly from the interface +

+
+
+
+
+ Plugins -
-
-

Many other plugins in one click

-

- Enhance your user experience with media keys, integrations - (Discord), cosmetic filters, notifications, TouchBar, - auto-unpause and many more! Every plugin can be enabled or - disabled in one click. -

-
-
-
-
- CodeMany other plugins in one click +

+ Enhance your user experience with media keys, integrations + (Discord), cosmetic filters, notifications, TouchBar, + auto-unpause and many more! Every plugin can be enabled or + disabled in one click. +

+
+
+
+
+ Code -
-
-

Open source & Cross platform

-

- Available for Windows (installer and portable), Mac and - Linux (AppImage, deb, etc) -

-
-
-
-
-
-
- -
-
-
+ > +

Open source & Cross platform

+

+ Available for Windows (installer and portable), Mac and + Linux (AppImage, deb, etc) +

+
+
+ + + +
+ +
+ + - - + + - - + + diff --git a/docs/js/main.js b/docs/js/main.js index ed47bfc1..8ca35d2a 100644 --- a/docs/js/main.js +++ b/docs/js/main.js @@ -1,45 +1,45 @@ // Constants -const element = document.documentElement, - body = document.body, - revealOnScroll = (window.sr = ScrollReveal({ mobile: false })); +const element = document.documentElement; +const { body } = document; +const revealOnScroll = (window.sr = ScrollReveal({ mobile: false })); // Load animations -element.classList.remove("no-js"); -element.classList.add("js"); -window.addEventListener("load", function () { - body.classList.add("is-loaded"); +element.classList.remove('no-js'); +element.classList.add('js'); +window.addEventListener('load', () => { + body.classList.add('is-loaded'); }); -if (body.classList.contains("has-animations")) { - window.addEventListener("load", function () { - revealOnScroll.reveal(".feature-extended .device-mockup", { +if (body.classList.contains('has-animations')) { + window.addEventListener('load', () => { + revealOnScroll.reveal('.feature-extended .device-mockup', { duration: 600, - distance: "100px", - easing: "cubic-bezier(0.215, 0.61, 0.355, 1)", - origin: "bottom", + distance: '100px', + easing: 'cubic-bezier(0.215, 0.61, 0.355, 1)', + origin: 'bottom', viewFactor: 0.6, }); - revealOnScroll.reveal(".feature-extended .feature-extended-body", { + revealOnScroll.reveal('.feature-extended .feature-extended-body', { duration: 600, - distance: "40px", - easing: "cubic-bezier(0.215, 0.61, 0.355, 1)", - origin: "top", + distance: '40px', + easing: 'cubic-bezier(0.215, 0.61, 0.355, 1)', + origin: 'top', viewFactor: 0.6, }); }); } // Bubble canvas -let bubbleCanvas = function (t) { - let e = this; +const bubbleCanvas = function (t) { + const e = this; e.parentNode = t; e.setCanvasSize(); - window.addEventListener("resize", function () { + window.addEventListener('resize', () => { e.setCanvasSize(); }); e.mouseX = 0; e.mouseY = 0; - window.addEventListener("mousemove", function (t) { + window.addEventListener('mousemove', (t) => { (e.mouseX = t.clientX), (e.mouseY = t.clientY); }); e.randomise(); @@ -55,15 +55,15 @@ bubbleCanvas.prototype.generateDecimalBetween = function (start, end) { }; bubbleCanvas.prototype.update = function () { - let t = this; - t.translateX = t.translateX - t.movementX; - t.translateY = t.translateY - t.movementY; + const t = this; + t.translateX -= t.movementX; + t.translateY -= t.movementY; t.posX += (t.mouseX / (t.staticity / t.magnetism) - t.posX) / t.smoothFactor; t.posY += (t.mouseY / (t.staticity / t.magnetism) - t.posY) / t.smoothFactor; if ( - t.translateY + t.posY < 0 || - t.translateX + t.posX < 0 || - t.translateX + t.posX > t.canvasWidth + t.translateY + t.posY < 0 + || t.translateX + t.posX < 0 + || t.translateX + t.posX > t.canvasWidth ) { t.randomise(); t.translateY = t.canvasHeight; @@ -71,7 +71,7 @@ bubbleCanvas.prototype.update = function () { }; bubbleCanvas.prototype.randomise = function () { - this.colors = ["195,53,46", "172,54,46"]; + this.colors = ['195,53,46', '172,54,46']; this.velocity = 20; this.smoothFactor = 50; @@ -88,17 +88,17 @@ bubbleCanvas.prototype.randomise = function () { this.translateY = this.generateDecimalBetween(0, this.canvasHeight); }; -let drawBubbleCanvas = function (t) { +const drawBubbleCanvas = function (t) { this.canvas = document.getElementById(t); - this.ctx = this.canvas.getContext("2d"); + this.ctx = this.canvas.getContext('2d'); this.dpr = window.devicePixelRatio; }; drawBubbleCanvas.prototype.start = function (bubbleDensity) { - let t = this; + const t = this; t.bubbleDensity = bubbleDensity; t.setCanvasSize(); - window.addEventListener("resize", function () { + window.addEventListener('resize', () => { t.setCanvasSize(); }); t.bubblesList = []; @@ -114,23 +114,24 @@ drawBubbleCanvas.prototype.setCanvasSize = function () { this.hdpi = this.h * this.dpr; this.canvas.width = this.wdpi; this.canvas.height = this.hdpi; - this.canvas.style.width = this.w + "px"; - this.canvas.style.height = this.h + "px"; + this.canvas.style.width = this.w + 'px'; + this.canvas.style.height = this.h + 'px'; this.ctx.scale(this.dpr, this.dpr); }; drawBubbleCanvas.prototype.animate = function () { - let t = this; + const t = this; t.ctx.clearRect(0, 0, t.canvas.clientWidth, t.canvas.clientHeight); - t.bubblesList.forEach(function (e) { + for (const e of t.bubblesList) { e.update(); t.ctx.translate(e.translateX, e.translateY); t.ctx.beginPath(); t.ctx.arc(e.posX, e.posY, e.size, 0, 2 * Math.PI); - t.ctx.fillStyle = "rgba(" + e.color + "," + e.alpha + ")"; + t.ctx.fillStyle = 'rgba(' + e.color + ',' + e.alpha + ')'; t.ctx.fill(); t.ctx.setTransform(t.dpr, 0, 0, t.dpr, 0, 0); - }); + } + requestAnimationFrame(this.animate.bind(this)); }; @@ -139,15 +140,16 @@ drawBubbleCanvas.prototype.addBubble = function (t) { }; drawBubbleCanvas.prototype.generateBubbles = function () { - let t = this; - for (let e = 0; e < t.bubbleDensity; e++) + const t = this; + for (let e = 0; e < t.bubbleDensity; e++) { t.addBubble(new bubbleCanvas(t.canvas.parentNode)); + } }; // Night sky with stars canvas -let starCanvas = function (t) { +const starCanvas = function (t) { this.canvas = document.getElementById(t); - this.ctx = this.canvas.getContext("2d"); + this.ctx = this.canvas.getContext('2d'); this.dpr = window.devicePixelRatio; }; @@ -156,17 +158,17 @@ starCanvas.prototype.start = function () { let h; const setCanvasExtents = () => { - w = this.canvas.parentNode.clientWidth; - h = this.canvas.parentNode.clientHeight; + w = this.canvas.parentNode.clientWidth; + h = this.canvas.parentNode.clientHeight; this.canvas.width = w; this.canvas.height = h; }; setCanvasExtents(); - window.onresize = () => { + window.addEventListener('resize', () => { setCanvasExtents(); - }; + }); const makeStars = (count) => { const out = []; @@ -178,19 +180,20 @@ starCanvas.prototype.start = function () { }; out.push(s); } + return out; }; - let stars = makeStars(10000); + const stars = makeStars(10_000); const clear = () => { - this.ctx.fillStyle = "#212121"; + this.ctx.fillStyle = '#212121'; this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height); }; const putPixel = (x, y, brightness) => { const intensity = brightness * 255; - const rgb = "rgb(" + intensity + "," + intensity + "," + intensity + ")"; + const rgb = 'rgb(' + intensity + ',' + intensity + ',' + intensity + ')'; this.ctx.beginPath(); this.ctx.arc(x, y, 0.9, 0, 2 * Math.PI); this.ctx.fillStyle = rgb; @@ -199,7 +202,7 @@ starCanvas.prototype.start = function () { const moveStars = (distance) => { const count = stars.length; - for (var i = 0; i < count; i++) { + for (let i = 0; i < count; i++) { const s = stars[i]; s.z -= distance; while (s.z <= 1) { @@ -208,15 +211,15 @@ starCanvas.prototype.start = function () { } }; - let prevTime; + let previousTime; const init = (time) => { - prevTime = time; + previousTime = time; requestAnimationFrame(tick); }; const tick = (time) => { - let elapsed = time - prevTime; - prevTime = time; + const elapsed = time - previousTime; + previousTime = time; moveStars(elapsed * 0.1); @@ -226,7 +229,7 @@ starCanvas.prototype.start = function () { const cy = h / 2; const count = stars.length; - for (var i = 0; i < count; i++) { + for (let i = 0; i < count; i++) { const star = stars[i]; const x = cx + star.x / (star.z * 0.001); @@ -236,7 +239,7 @@ starCanvas.prototype.start = function () { continue; } - const d = star.z / 1000.0; + const d = star.z / 1000; const b = 1 - d * d; putPixel(x, y, b); @@ -249,12 +252,12 @@ starCanvas.prototype.start = function () { }; // Start canvas animations -window.addEventListener("load", function () { +window.addEventListener('load', () => { // Stars - const headCanvas = new starCanvas("hero-particles"); + const headCanvas = new starCanvas('hero-particles'); // Bubbles - const footerCanvas = new drawBubbleCanvas("footer-particles"); - const mainCanvas = new drawBubbleCanvas("main-particles"); + const footerCanvas = new drawBubbleCanvas('footer-particles'); + const mainCanvas = new drawBubbleCanvas('main-particles'); headCanvas.start(); footerCanvas.start(30); diff --git a/docs/style/fonts.css b/docs/style/fonts.css index 8183c438..fac73089 100644 --- a/docs/style/fonts.css +++ b/docs/style/fonts.css @@ -6,6 +6,7 @@ src: url(https://fonts.gstatic.com/s/heebo/v9/NGS6v5_NC0k9P9H0TbFhsqMA6aw.woff2) format('woff2'); unicode-range: U+0590-05FF, U+20AA, U+25CC, U+FB1D-FB4F; } + /* latin */ @font-face { font-family: 'Heebo'; @@ -14,6 +15,7 @@ src: url(https://fonts.gstatic.com/s/heebo/v9/NGS6v5_NC0k9P9H2TbFhsqMA.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } + /* hebrew */ @font-face { font-family: 'Heebo'; @@ -22,6 +24,7 @@ src: url(https://fonts.gstatic.com/s/heebo/v9/NGS6v5_NC0k9P9H0TbFhsqMA6aw.woff2) format('woff2'); unicode-range: U+0590-05FF, U+20AA, U+25CC, U+FB1D-FB4F; } + /* latin */ @font-face { font-family: 'Heebo'; @@ -30,6 +33,7 @@ src: url(https://fonts.gstatic.com/s/heebo/v9/NGS6v5_NC0k9P9H2TbFhsqMA.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } + /* latin-ext */ @font-face { font-family: 'Oxygen'; @@ -38,6 +42,7 @@ src: url(https://fonts.gstatic.com/s/oxygen/v10/2sDcZG1Wl4LcnbuCNWgzZmW5Kb8VZBHR.woff2) format('woff2'); unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; } + /* latin */ @font-face { font-family: 'Oxygen'; diff --git a/docs/style/style.css b/docs/style/style.css index dea047b9..1106ca62 100644 --- a/docs/style/style.css +++ b/docs/style/style.css @@ -3,9 +3,11 @@ html { -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; } + body { margin: 0; } + article, aside, footer, @@ -14,61 +16,75 @@ nav, section { display: block; } + h1 { font-size: 2em; margin: 0.67em 0; } + figcaption, figure, main { display: block; } + figure { margin: 1em 40px; } + hr { box-sizing: content-box; height: 0; overflow: visible; } + pre { font-family: monospace, monospace; font-size: 1em; } + a { background-color: transparent; -webkit-text-decoration-skip: objects; } + abbr[title] { border-bottom: none; text-decoration: underline; -webkit-text-decoration: underline dotted; text-decoration: underline dotted; } + b, strong { font-weight: inherit; } + b, strong { font-weight: bolder; } + code, kbd, samp { font-family: monospace, monospace; font-size: 1em; } + dfn { font-style: italic; } + mark { background-color: #ff0; color: #000; } + small { font-size: 80%; } + sub, sup { font-size: 75%; @@ -76,26 +92,33 @@ sup { position: relative; vertical-align: baseline; } + sub { bottom: -0.25em; } + sup { top: -0.5em; } + audio, video { display: inline-block; } + audio:not([controls]) { display: none; height: 0; } + img { border-style: none; } + svg:not(:root) { overflow: hidden; } + button, input, optgroup, @@ -106,20 +129,24 @@ textarea { line-height: 1.15; margin: 0; } + button, input { overflow: visible; } + button, select { text-transform: none; } + button, html [type="button"], [type="reset"], [type="submit"] { -webkit-appearance: button; } + button::-moz-focus-inner, [type="button"]::-moz-focus-inner, [type="reset"]::-moz-focus-inner, @@ -127,15 +154,18 @@ button::-moz-focus-inner, border-style: none; padding: 0; } + button:-moz-focusring, [type="button"]:-moz-focusring, [type="reset"]:-moz-focusring, [type="submit"]:-moz-focusring { outline: 1px dotted ButtonText; } + fieldset { padding: 0.35em 0.75em 0.625em; } + legend { box-sizing: border-box; color: inherit; @@ -144,63 +174,79 @@ legend { padding: 0; white-space: normal; } + progress { display: inline-block; vertical-align: baseline; } + textarea { overflow: auto; } + [type="checkbox"], [type="radio"] { box-sizing: border-box; padding: 0; } + [type="number"]::-webkit-inner-spin-button, [type="number"]::-webkit-outer-spin-button { height: auto; } + [type="search"] { -webkit-appearance: textfield; outline-offset: -2px; } + [type="search"]::-webkit-search-cancel-button, [type="search"]::-webkit-search-decoration { -webkit-appearance: none; } + ::-webkit-file-upload-button { -webkit-appearance: button; font: inherit; } + details, menu { display: block; } + summary { display: list-item; } + canvas { display: inline-block; } + template { display: none; } + [hidden] { display: none; } + html { box-sizing: border-box; } + *, *:before, *:after { box-sizing: inherit; } + body { background: #3f4042; -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; } + hr { border: 0; display: block; @@ -209,81 +255,101 @@ hr { margin-top: 24px; margin-bottom: 24px; } + ul, ol { margin-top: 0; margin-bottom: 24px; padding-left: 24px; } + ul { list-style: disc; } + ol { list-style: decimal; } + li > ul, li > ol { margin-bottom: 0; } + dl { margin-top: 0; margin-bottom: 24px; } + dt { font-weight: 600; } + dd { margin-left: 24px; margin-bottom: 24px; } + img { height: auto; max-width: 100%; vertical-align: middle; } + figure { margin: 24px 0; } + figcaption { font-size: 16px; line-height: 24px; padding: 8px 0; } + img, svg { display: block; } + table { border-collapse: collapse; margin-bottom: 24px; width: 100%; } + tr { border-bottom: 1px solid #e4e8ee; } + th { text-align: left; } + th, td { padding: 10px 16px; } + th:first-child, td:first-child { padding-left: 0; } + th:last-child, td:last-child { padding-right: 0; } + html { font-size: 20px; line-height: 30px; } + body { color: #b7bbc1; font-size: 1rem; } + body, button, input, @@ -291,15 +357,18 @@ select, textarea { font-family: "Heebo", sans-serif; } + a { color: #c3352e; text-decoration: none; } + a:hover, a:active { outline: 0; text-decoration: underline; } + h1, h2, h3, @@ -317,12 +386,14 @@ h6, font-family: "Oxygen", sans-serif; font-weight: 600; } + h1, .h1 { font-size: 38px; line-height: 48px; letter-spacing: 0px; } + @media (min-width: 641px) { h1, .h1 { @@ -331,12 +402,14 @@ h1, letter-spacing: 0px; } } + h2, .h2 { font-size: 32px; line-height: 42px; letter-spacing: 0px; } + @media (min-width: 641px) { h2, .h2 { @@ -345,6 +418,7 @@ h2, letter-spacing: 0px; } } + h3, .h3, blockquote { @@ -352,6 +426,7 @@ blockquote { line-height: 34px; letter-spacing: 0px; } + @media (min-width: 641px) { h3, .h3, @@ -361,12 +436,14 @@ blockquote { letter-spacing: 0px; } } + h4, .h4 { font-size: 28px; line-height: 34px; letter-spacing: 0px; } + h5, .h5, h6, @@ -375,27 +452,32 @@ h6, line-height: 30px; letter-spacing: -0.1px; } + @media (max-width: 640px) { .h1-mobile { font-size: 38px; line-height: 48px; letter-spacing: 0px; } + .h2-mobile { font-size: 32px; line-height: 42px; letter-spacing: 0px; } + .h3-mobile { font-size: 28px; line-height: 34px; letter-spacing: 0px; } + .h4-mobile { font-size: 28px; line-height: 34px; letter-spacing: 0px; } + .h5-mobile, .h6-mobile { font-size: 20px; @@ -403,12 +485,15 @@ h6, letter-spacing: -0.1px; } } + .text-light { color: #606483; } + .text-light a { color: #606483; } + .text-light h1, .text-light h2, .text-light h3, @@ -423,16 +508,19 @@ h6, .text-light .h6 { color: #fff !important; } + .text-sm { font-size: 18px; line-height: 27px; letter-spacing: -0.1px; } + .text-xs { font-size: 16px; line-height: 24px; letter-spacing: -0.1px; } + h1, h2, .h1, @@ -440,11 +528,13 @@ h2, margin-top: 48px; margin-bottom: 16px; } + h3, .h3 { margin-top: 36px; margin-bottom: 12px; } + h4, h5, h6, @@ -454,16 +544,19 @@ h6, margin-top: 24px; margin-bottom: 4px; } + p { margin-top: 0; margin-bottom: 24px; } + dfn, cite, em, i { font-style: italic; } + blockquote { color: #b7bbc1; font-style: italic; @@ -471,15 +564,19 @@ blockquote { margin-bottom: 24px; margin-left: 24px; } + blockquote::before { content: "\201C"; } + blockquote::after { content: "\201D"; } + blockquote p { display: inline; } + address { color: #b7bbc1; border-width: 1px 0; @@ -488,6 +585,7 @@ address { padding: 24px 0; margin: 0 0 24px; } + pre, pre h1, pre h2, @@ -503,6 +601,7 @@ pre .h5, pre .h6 { font-family: "Courier 10 Pitch", Courier, monospace; } + pre, code, kbd, @@ -510,6 +609,7 @@ tt, var { background: #f3f4ff; } + pre { font-size: 16px; line-height: 24px; @@ -520,6 +620,7 @@ pre { margin-top: 24px; margin-bottom: 24px; } + code, kbd, tt, @@ -528,23 +629,28 @@ var { font-size: 16px; padding: 2px 4px; } + abbr, acronym { cursor: help; } + mark, ins { text-decoration: none; } + small { font-size: 18px; line-height: 27px; letter-spacing: -0.1px; } + b, strong { font-weight: 600; } + button, input, select, @@ -553,6 +659,7 @@ label { font-size: 20px; line-height: 30px; } + .container, .container-sm { width: 100%; @@ -560,6 +667,7 @@ label { padding-left: 16px; padding-right: 16px; } + @media (min-width: 481px) { .container, .container-sm { @@ -567,17 +675,21 @@ label { padding-right: 24px; } } + .container { max-width: 1128px; } + .container-sm { max-width: 848px; } + .container .container-sm { max-width: 800px; padding-left: 0; padding-right: 0; } + .screen-reader-text { clip: rect(1px, 1px, 1px, 1px); position: absolute !important; @@ -586,6 +698,7 @@ label { overflow: hidden; word-wrap: normal !important; } + .screen-reader-text:focus { border-radius: 2px; box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); @@ -607,28 +720,36 @@ label { width: auto; z-index: 100000; } + .list-reset { list-style: none; padding: 0; } + .text-left { text-align: left; } + .text-center { text-align: center; } + .text-right { text-align: right; } + .text-primary { color: #c3352e; } + .text-secondary { color: #ff6c50; } + .has-top-divider { position: relative; } + .has-top-divider::before { content: ""; position: absolute; @@ -639,9 +760,11 @@ label { height: 1px; background: #e4e8ee; } + .has-bottom-divider { position: relative; } + .has-bottom-divider::after { content: ""; position: absolute; @@ -652,279 +775,371 @@ label { height: 1px; background: #e4e8ee; } + .m-0 { margin: 0; } + .mt-0 { margin-top: 0; } + .mr-0 { margin-right: 0; } + .mb-0 { margin-bottom: 0; } + .ml-0 { margin-left: 0; } + .m-8 { margin: 8px; } + .mt-8 { margin-top: 8px; } + .mr-8 { margin-right: 8px; } + .mb-8 { margin-bottom: 8px; } + .ml-8 { margin-left: 8px; } + .m-16 { margin: 16px; } + .mt-16 { margin-top: 16px; } + .mr-16 { margin-right: 16px; } + .mb-16 { margin-bottom: 16px; } + .ml-16 { margin-left: 16px; } + .m-24 { margin: 24px; } + .mt-24 { margin-top: 24px; } + .mr-24 { margin-right: 24px; } + .mb-24 { margin-bottom: 24px; } + .ml-24 { margin-left: 24px; } + .m-32 { margin: 32px; } + .mt-32 { margin-top: 32px; } + .mr-32 { margin-right: 32px; } + .mb-32 { margin-bottom: 32px; } + .ml-32 { margin-left: 32px; } + .m-40 { margin: 40px; } + .mt-40 { margin-top: 40px; } + .mr-40 { margin-right: 40px; } + .mb-40 { margin-bottom: 40px; } + .ml-40 { margin-left: 40px; } + .m-48 { margin: 48px; } + .mt-48 { margin-top: 48px; } + .mr-48 { margin-right: 48px; } + .mb-48 { margin-bottom: 48px; } + .ml-48 { margin-left: 48px; } + .m-56 { margin: 56px; } + .mt-56 { margin-top: 56px; } + .mr-56 { margin-right: 56px; } + .mb-56 { margin-bottom: 56px; } + .ml-56 { margin-left: 56px; } + .m-64 { margin: 64px; } + .mt-64 { margin-top: 64px; } + .mr-64 { margin-right: 64px; } + .mb-64 { margin-bottom: 64px; } + .ml-64 { margin-left: 64px; } + .p-0 { padding: 0; } + .pt-0 { padding-top: 0; } + .pr-0 { padding-right: 0; } + .pb-0 { padding-bottom: 0; } + .pl-0 { padding-left: 0; } + .p-8 { padding: 8px; } + .pt-8 { padding-top: 8px; } + .pr-8 { padding-right: 8px; } + .pb-8 { padding-bottom: 8px; } + .pl-8 { padding-left: 8px; } + .p-16 { padding: 16px; } + .pt-16 { padding-top: 16px; } + .pr-16 { padding-right: 16px; } + .pb-16 { padding-bottom: 16px; } + .pl-16 { padding-left: 16px; } + .p-24 { padding: 24px; } + .pt-24 { padding-top: 24px; } + .pr-24 { padding-right: 24px; } + .pb-24 { padding-bottom: 24px; } + .pl-24 { padding-left: 24px; } + .p-32 { padding: 32px; } + .pt-32 { padding-top: 32px; } + .pr-32 { padding-right: 32px; } + .pb-32 { padding-bottom: 32px; } + .pl-32 { padding-left: 32px; } + .p-40 { padding: 40px; } + .pt-40 { padding-top: 40px; } + .pr-40 { padding-right: 40px; } + .pb-40 { padding-bottom: 40px; } + .pl-40 { padding-left: 40px; } + .p-48 { padding: 48px; } + .pt-48 { padding-top: 48px; } + .pr-48 { padding-right: 48px; } + .pb-48 { padding-bottom: 48px; } + .pl-48 { padding-left: 48px; } + .p-56 { padding: 56px; } + .pt-56 { padding-top: 56px; } + .pr-56 { padding-right: 56px; } + .pb-56 { padding-bottom: 56px; } + .pl-56 { padding-left: 56px; } + .p-64 { padding: 64px; } + .pt-64 { padding-top: 64px; } + .pr-64 { padding-right: 64px; } + .pb-64 { padding-bottom: 64px; } + .pl-64 { padding-left: 64px; } + .sr .has-animations .is-revealing { visibility: hidden; } + .button { display: inline-flex; font-size: 14px; @@ -945,15 +1160,19 @@ label { text-align: center; white-space: nowrap; } + .button:active { outline: 0; } + .button::before { border-radius: 2px; } + .button-shadow { position: relative; } + .button-shadow::before { content: ""; position: absolute; @@ -965,70 +1184,90 @@ label { mix-blend-mode: multiply; transition: box-shadow 0.15s ease; } + .button-shadow:hover::before { box-shadow: 0 8px 16px rgba(22, 30, 42, 0.16); } + .button-sm { padding: 8px 24px; height: 32px; } + .button-sm.button-shadow::before { box-shadow: 0 4px 16px rgba(22, 30, 42, 0.12); } + .button-sm.button-shadow:hover::before { box-shadow: 0 4px 16px rgba(22, 30, 42, 0.16); } + .button-primary, .button-secondary { color: #fff !important; transition: background 0.15s ease; } + .button-primary { background: #c3352e; } + .button-primary:hover { background: #ac362e; } + .button-primary.button-shadow::before { box-shadow: 0 8px 16px rgba(66, 52, 248, 0.24); } + .button-primary.button-shadow:hover::before { box-shadow: 0 8px 16px rgba(66, 52, 248, 0.32); } + .button-primary .button-sm.button-shadow::before { box-shadow: 0 4px 16px rgba(66, 52, 248, 0.24); } + .button-primary .button-sm.button-shadow:hover::before { box-shadow: 0 4px 16px rgba(66, 52, 248, 0.32); } + .button-secondary { background: #ff6c50; } + .button-secondary:hover { background: #ac362e; } + .button-secondary.button-shadow::before { box-shadow: 0 8px 16px rgba(255, 108, 80, 0.24); } + .button-secondary.button-shadow:hover::before { box-shadow: 0 8px 16px rgba(255, 108, 80, 0.32); } + .button-secondary .button-sm.button-shadow::before { box-shadow: 0 4px 16px rgba(255, 108, 80, 0.24); } + .button-secondary .button-sm.button-shadow:hover::before { box-shadow: 0 4px 16px rgba(255, 108, 80, 0.32); } + .button-block { display: flex; width: 100%; } + @media (max-width: 640px) { .button-wide-mobile { width: 100%; max-width: 280px; } } + .site-header { padding: 24px 0; position: absolute; @@ -1037,18 +1276,22 @@ label { width: 100%; z-index: 1; } + .site-header-inner { position: relative; display: flex; justify-content: space-between; align-items: center; } + .header-links { display: inline-flex; } + .header-links li { display: inline-flex; } + .header-links a:not(.button) { font-size: 16px; line-height: 24px; @@ -1060,16 +1303,19 @@ label { line-height: 16px; padding: 8px 24px; } + .header-links a:not(.button):hover, .header-links a:not(.button):active { color: #fff; } + .hero { position: relative; padding-top: 128px; padding-bottom: 88px; z-index: 0; } + .hero .hero-bg { position: absolute; top: 0; @@ -1079,6 +1325,7 @@ label { background: #363636; z-index: -2; } + .hero .hero-particles-container { position: absolute; top: 0; @@ -1086,6 +1333,7 @@ label { left: 0; right: 0; } + .hero::before, .hero::after { content: ""; @@ -1094,52 +1342,63 @@ label { width: 720px; background-repeat: no-repeat; } + .hero::before { top: 0; height: 159px; background-image: url("../img/bg-top.svg"); background-size: 720px 159px; } + .hero::after { bottom: 42%; height: 173px; background-image: url("../img/bg-bottom.svg"); background-size: 720px 173px; } + .hero-inner { position: relative; z-index: 1; } + .hero-copy { position: relative; margin-bottom: 48px; } + @media (min-width: 641px) { .hero { padding-top: 160px; padding-bottom: 128px; } + .hero::before, .hero::after { left: calc(50% - 720px); width: 1440px; } + .hero::before { height: 318px; background-size: 1440px 318px; } + .hero::after { height: 347px; background-size: 1440px 347px; } + .hero-copy { margin-bottom: 88px; } + .hero-paragraph { padding-left: 72px; padding-right: 72px; } } + .has-animations .hero .hero-bg, .has-animations .hero::before, .has-animations .hero::after, @@ -1152,40 +1411,45 @@ label { .has-animations .hero .device-mockup { opacity: 0; } + .has-animations.is-loaded .hero .hero-bg { -webkit-animation: heroBg 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) forwards; animation: heroBg 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) forwards; } + .has-animations.is-loaded .hero::before, .has-animations.is-loaded .hero::after { -webkit-animation: heroFadeIn 0.6s ease forwards 0.45s; animation: heroFadeIn 0.6s ease forwards 0.45s; } + .has-animations.is-loaded .site-header, .has-animations.is-loaded .hero-particles-container, .has-animations.is-loaded .hero .mockup-bg { -webkit-animation: heroFadeIn 0.6s ease forwards 0.45s; animation: heroFadeIn 0.6s ease forwards 0.45s; } + .has-animations.is-loaded .hero-title { - -webkit-animation: heroContent 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) - forwards 0.15s; + -webkit-animation: heroContent 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) forwards 0.15s; animation: heroContent 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) forwards 0.15s; } + .has-animations.is-loaded .hero-paragraph { - -webkit-animation: heroContent 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) - forwards 0.3s; + -webkit-animation: heroContent 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) forwards 0.3s; animation: heroContent 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) forwards 0.3s; } + .has-animations.is-loaded .hero-cta { - -webkit-animation: heroContent 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) - forwards 0.45s; + -webkit-animation: heroContent 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) forwards 0.45s; animation: heroContent 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) forwards 0.45s; } + .has-animations.is-loaded .hero .device-mockup { -webkit-animation: heroMockup 0.6s ease forwards 0.6s; animation: heroMockup 0.6s ease forwards 0.6s; } + @-webkit-keyframes heroBg { from { -webkit-transform: scaleY(0) scaleX(1.2) skewY(30deg); @@ -1198,6 +1462,7 @@ label { opacity: 1; } } + @keyframes heroBg { from { -webkit-transform: scaleY(0) scaleX(1.2) skewY(30deg); @@ -1210,6 +1475,7 @@ label { opacity: 1; } } + @-webkit-keyframes heroContent { from { -webkit-transform: translateY(40px) skewY(2deg); @@ -1222,6 +1488,7 @@ label { opacity: 1; } } + @keyframes heroContent { from { -webkit-transform: translateY(40px) skewY(2deg); @@ -1234,6 +1501,7 @@ label { opacity: 1; } } + @-webkit-keyframes heroMockup { from { -webkit-transform: translateY(80px); @@ -1246,6 +1514,7 @@ label { opacity: 1; } } + @keyframes heroMockup { from { -webkit-transform: translateY(80px); @@ -1258,6 +1527,7 @@ label { opacity: 1; } } + @-webkit-keyframes heroFadeIn { from { opacity: 0; @@ -1266,6 +1536,7 @@ label { opacity: 1; } } + @keyframes heroFadeIn { from { opacity: 0; @@ -1274,9 +1545,11 @@ label { opacity: 1; } } + .mockup-container { position: relative; } + #mockup-header-img { position: relative; height: 100%; @@ -1287,9 +1560,11 @@ label { -moz-border-radius: 5px; -webkit-border-radius: 5px; } + .mockup-bg { pointer-events: none; } + .mockup-bg img, .mockup-bg svg { position: absolute; @@ -1301,6 +1576,7 @@ label { height: auto; max-width: 300% !important; } + .device-mockup { position: relative; width: 350px; @@ -1308,34 +1584,43 @@ label { margin: 0 auto; z-index: 1; } + .has-animations .features-extended { opacity: 0; } + .has-animations.is-loaded .features-extended { opacity: 1; position: relative; } + .features-extended-header { margin-bottom: 32px; } + .features-extended-wrap { display: flex; flex-wrap: wrap; margin-top: -24px; } + .features-extended-wrap:last-of-type { margin-bottom: -24px; } + .features-extended-wrap:not(:last-of-type) { margin-bottom: 24px; } + .feature-extended { padding: 24px 0; } + .feature-extended-image { position: relative; margin-bottom: 32px; } + .feature-extended-image img, .feature-extended-image svg { width: 100%; @@ -1345,33 +1630,42 @@ label { margin-right: auto; overflow: visible; } + .feature-extended-body { text-align: center; } + @media (min-width: 641px) { .features-extended .container { max-width: 912px; } + .features-extended .section-inner { padding-bottom: 128px; } + .features-extended .section-paragraph { padding-left: 72px; padding-right: 72px; margin-bottom: 0; } + .features-extended-header { margin-bottom: 80px; } + .features-extended-wrap { margin-top: -64px; } + .features-extended-wrap:last-of-type { margin-bottom: -64px; } + .features-extended-wrap:not(:last-of-type) { margin-bottom: 64px; } + .feature-extended { display: flex; flex-wrap: nowrap; @@ -1379,27 +1673,33 @@ label { justify-content: flex-end; padding: 64px 0; } + .feature-extended .feature-extended-image { width: 440px; margin-right: 96px; margin-bottom: 0; } + .feature-extended .feature-extended-image img, .feature-extended .feature-extended-image svg { width: auto; } + .feature-extended .feature-extended-image img.device-mockup, .feature-extended .feature-extended-image svg.device-mockup { max-width: 200px; } + .feature-extended:nth-child(even) { justify-content: flex-start; } + .feature-extended:nth-child(even) .feature-extended-image { order: 1; margin-left: 96px; margin-right: 0; } + .feature-extended-body { display: flex; flex-direction: column; @@ -1409,23 +1709,29 @@ label { text-align: left; } } + @media (min-width: 1025px) { .features-extended .container { max-width: 944px; } + .feature-extended .feature-extended-image { margin-right: 64px; } + .feature-extended:nth-child(even) .feature-extended-image { margin-left: 64px; } + .feature-extended-body { width: 392px; } } + .cta .section-paragraph { margin-bottom: 32px; } + @media (min-width: 641px) { .cta .section-paragraph { margin-bottom: 32px; @@ -1433,35 +1739,42 @@ label { padding-right: 72px; } } + .body-wrap { overflow: hidden; display: flex; flex-direction: column; min-height: 100vh; } + .boxed-container { max-width: 1440px; margin: 0 auto; box-shadow: 0 20px 48px rgba(22, 30, 42, 0.16); } + main { flex: 1 0 auto; } + .section-inner { position: relative; padding-top: 48px; padding-bottom: 48px; } + @media (min-width: 641px) { .section-inner { padding-top: 88px; padding-bottom: 88px; } } + .site-footer { position: relative; background: #212121; } + .site-footer::before { content: ""; position: absolute; @@ -1473,6 +1786,7 @@ main { background-size: 720px 291px; background-repeat: no-repeat; } + .site-footer .footer-particles-container, .main-particles-container { position: absolute; @@ -1481,20 +1795,24 @@ main { left: 0; right: 0; } + .site-footer-bottom { font-size: 14px; line-height: 22px; letter-spacing: 0px; z-index: 1; } + .site-footer-bottom a { color: #606483; text-decoration: none; } + .site-footer-bottom a:hover, .site-footer-bottom a:active { text-decoration: underline; } + .site-footer-inner { position: relative; display: flex; @@ -1503,6 +1821,7 @@ main { padding-bottom: 48px; position: relative; } + .footer-brand, .footer-links, .footer-social-links, @@ -1512,21 +1831,26 @@ main { display: inline-flex; justify-content: center; } + .footer-brand, .footer-links, .footer-social-links { margin-bottom: 24px; } + .footer-links li + li, .footer-social-links li + li { margin-left: 16px; } + .footer-social-links li { display: inline-flex; } + .footer-social-links li a { padding: 8px; } + @media (min-width: 641px) { .site-footer::before { top: -152px; @@ -1535,25 +1859,30 @@ main { height: 582px; background-size: 1440px 582px; } + .site-footer-inner { justify-content: space-between; padding-top: 64px; padding-bottom: 64px; } + .footer-brand, .footer-links, .footer-social-links, .footer-copyright { flex: 50%; } + .footer-brand, .footer-copyright { justify-content: flex-start; } + .footer-links, .footer-social-links { justify-content: flex-end; } + .footer-links { order: 1; margin-bottom: 0; diff --git a/error.html b/error.html index 1008bc87..5aa9d552 100644 --- a/error.html +++ b/error.html @@ -1,50 +1,50 @@ - - - Cannot load YouTube Music - - + .button { + background: #065fd4; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + color: white; + font: inherit; + text-transform: uppercase; + text-decoration: none; + border-radius: 2px; + font-size: 16px; + font-weight: normal; + text-align: center; + padding: 8px 22px; + display: inline-block; + } + + - -
-

Cannot load YouTube Music… Internet disconnected?

- Retry -
- + +
+

Cannot load YouTube Music… Internet disconnected?

+ Retry +
+ diff --git a/index.js b/index.js index 0d403e00..ef3090d1 100644 --- a/index.js +++ b/index.js @@ -1,516 +1,558 @@ -"use strict"; -const path = require("path"); +'use strict'; +const path = require('node:path'); -const electron = require("electron"); -const enhanceWebRequest = require("electron-better-web-request").default; -const is = require("electron-is"); -const unhandled = require("electron-unhandled"); -const { autoUpdater } = require("electron-updater"); +const electron = require('electron'); +const enhanceWebRequest = require('electron-better-web-request').default; +const is = require('electron-is'); +const unhandled = require('electron-unhandled'); +const { autoUpdater } = require('electron-updater'); -const config = require("./config"); -const { setApplicationMenu } = require("./menu"); -const { fileExists, injectCSS } = require("./plugins/utils"); -const { isTesting } = require("./utils/testing"); -const { setUpTray } = require("./tray"); -const { setupSongInfo } = require("./providers/song-info"); -const { setupAppControls, restart } = require("./providers/app-controls"); -const { APP_PROTOCOL, setupProtocolHandler, handleProtocol } = require("./providers/protocol-handler"); +const config = require('./config'); +const { setApplicationMenu } = require('./menu'); +const { fileExists, injectCSS } = require('./plugins/utils'); +const { isTesting } = require('./utils/testing'); +const { setUpTray } = require('./tray'); +const { setupSongInfo } = require('./providers/song-info'); +const { setupAppControls, restart } = require('./providers/app-controls'); +const { APP_PROTOCOL, setupProtocolHandler, handleProtocol } = require('./providers/protocol-handler'); // Catch errors and log them unhandled({ - logger: console.error, - showDialog: false, + logger: console.error, + showDialog: false, }); // Disable Node options if the env var is set -process.env.NODE_OPTIONS = ""; +process.env.NODE_OPTIONS = ''; -const app = electron.app; +const { app } = electron; // Prevent window being garbage collected let mainWindow; autoUpdater.autoDownload = false; - const gotTheLock = app.requestSingleInstanceLock(); -if (!gotTheLock) app.exit(); +if (!gotTheLock) { + app.exit(); +} -app.commandLine.appendSwitch("enable-features", "SharedArrayBuffer"); // Required for downloader +app.commandLine.appendSwitch('enable-features', 'SharedArrayBuffer'); // Required for downloader app.allowRendererProcessReuse = true; // https://github.com/electron/electron/issues/18397 -if (config.get("options.disableHardwareAcceleration")) { - if (is.dev()) { - console.log("Disabling hardware acceleration"); - } - app.disableHardwareAcceleration(); +if (config.get('options.disableHardwareAcceleration')) { + if (is.dev()) { + console.log('Disabling hardware acceleration'); + } + + app.disableHardwareAcceleration(); } -if (is.linux() && config.plugins.isEnabled("shortcuts")) { - //stops chromium from launching it's own mpris service - app.commandLine.appendSwitch('disable-features', 'MediaSessionService'); +if (is.linux() && config.plugins.isEnabled('shortcuts')) { + // Stops chromium from launching it's own mpris service + app.commandLine.appendSwitch('disable-features', 'MediaSessionService'); } -if (config.get("options.proxy")) { - app.commandLine.appendSwitch("proxy-server", config.get("options.proxy")); +if (config.get('options.proxy')) { + app.commandLine.appendSwitch('proxy-server', config.get('options.proxy')); } // Adds debug features like hotkeys for triggering dev tools and reload -require("electron-debug")({ - showDevTools: false //disable automatic devTools on new window +require('electron-debug')({ + showDevTools: false, // Disable automatic devTools on new window }); -let icon = "assets/youtube-music.png"; -if (process.platform == "win32") { - icon = "assets/generated/icon.ico"; -} else if (process.platform == "darwin") { - icon = "assets/generated/icon.icns"; +let icon = 'assets/youtube-music.png'; +if (process.platform == 'win32') { + icon = 'assets/generated/icon.ico'; +} else if (process.platform == 'darwin') { + icon = 'assets/generated/icon.icns'; } function onClosed() { - // Dereference the window - // For multiple windows store them in an array - mainWindow = null; + // Dereference the window + // For multiple windows store them in an array + mainWindow = null; } /** @param {Electron.BrowserWindow} win */ function loadPlugins(win) { - injectCSS(win.webContents, path.join(__dirname, "youtube-music.css")); - // Load user CSS - const themes = config.get("options.themes"); - if (Array.isArray(themes)) { - themes.forEach((cssFile) => { - fileExists( - cssFile, - () => { - injectCSS(win.webContents, cssFile); - }, - () => { - console.warn(`CSS file "${cssFile}" does not exist, ignoring`); - } - ); - }); - } + injectCSS(win.webContents, path.join(__dirname, 'youtube-music.css')); + // Load user CSS + const themes = config.get('options.themes'); + if (Array.isArray(themes)) { + for (const cssFile of themes) { + fileExists( + cssFile, + () => { + injectCSS(win.webContents, cssFile); + }, + () => { + console.warn(`CSS file "${cssFile}" does not exist, ignoring`); + }, + ); + } + } - win.webContents.once("did-finish-load", () => { - if (is.dev()) { - console.log("did finish load"); - win.webContents.openDevTools(); - } - }); + win.webContents.once('did-finish-load', () => { + if (is.dev()) { + console.log('did finish load'); + win.webContents.openDevTools(); + } + }); - config.plugins.getEnabled().forEach(([plugin, options]) => { - console.log("Loaded plugin - " + plugin); - const pluginPath = path.join(__dirname, "plugins", plugin, "back.js"); - fileExists(pluginPath, () => { - const handle = require(pluginPath); - handle(win, options); - }); - }); + for (const [plugin, options] of config.plugins.getEnabled()) { + console.log('Loaded plugin - ' + plugin); + const pluginPath = path.join(__dirname, 'plugins', plugin, 'back.js'); + fileExists(pluginPath, () => { + const handle = require(pluginPath); + handle(win, options); + }); + } } function createMainWindow() { - const windowSize = config.get("window-size"); - const windowMaximized = config.get("window-maximized"); - const windowPosition = config.get("window-position"); - const useInlineMenu = config.plugins.isEnabled("in-app-menu"); + const windowSize = config.get('window-size'); + const windowMaximized = config.get('window-maximized'); + const windowPosition = config.get('window-position'); + const useInlineMenu = config.plugins.isEnabled('in-app-menu'); - const win = new electron.BrowserWindow({ - icon: icon, - width: windowSize.width, - height: windowSize.height, - backgroundColor: "#000", - show: false, - webPreferences: { - // TODO: re-enable contextIsolation once it can work with ffmepg.wasm - // Possible bundling? https://github.com/ffmpegwasm/ffmpeg.wasm/issues/126 - contextIsolation: false, - preload: path.join(__dirname, "preload.js"), - nodeIntegrationInSubFrames: true, - affinity: "main-window", // main window, and addition windows should work in one process - ...(!isTesting() - ? { - // Sandbox is only enabled in tests for now - // See https://www.electronjs.org/docs/latest/tutorial/sandbox#preload-scripts - sandbox: false, - } - : undefined), - }, - frame: !is.macOS() && !useInlineMenu, - titleBarStyle: useInlineMenu - ? "hidden" - : is.macOS() - ? "hiddenInset" - : "default", - autoHideMenuBar: config.get("options.hideMenu"), - }); - loadPlugins(win); + const win = new electron.BrowserWindow({ + icon, + width: windowSize.width, + height: windowSize.height, + backgroundColor: '#000', + show: false, + webPreferences: { + // TODO: re-enable contextIsolation once it can work with ffmepg.wasm + // Possible bundling? https://github.com/ffmpegwasm/ffmpeg.wasm/issues/126 + contextIsolation: false, + preload: path.join(__dirname, 'preload.js'), + nodeIntegrationInSubFrames: true, + affinity: 'main-window', // Main window, and addition windows should work in one process + ...(isTesting() + ? undefined + : { + // Sandbox is only enabled in tests for now + // See https://www.electronjs.org/docs/latest/tutorial/sandbox#preload-scripts + sandbox: false, + }), + }, + frame: !is.macOS() && !useInlineMenu, + titleBarStyle: useInlineMenu + ? 'hidden' + : (is.macOS() + ? 'hiddenInset' + : 'default'), + autoHideMenuBar: config.get('options.hideMenu'), + }); + loadPlugins(win); - if (windowPosition) { - const { x, y } = windowPosition; - const winSize = win.getSize(); - const displaySize = - electron.screen.getDisplayNearestPoint(windowPosition).bounds; - if ( - x + winSize[0] < displaySize.x - 8 || - x - winSize[0] > displaySize.x + displaySize.width || - y < displaySize.y - 8 || - y > displaySize.y + displaySize.height - ) { - //Window is offscreen - if (is.dev()) { - console.log( - `Window tried to render offscreen, windowSize=${winSize}, displaySize=${displaySize}, position=${windowPosition}` - ); - } - } else { - win.setPosition(x, y); - } - } - if (windowMaximized) { - win.maximize(); - } + if (windowPosition) { + const { x, y } = windowPosition; + const winSize = win.getSize(); + const displaySize + = electron.screen.getDisplayNearestPoint(windowPosition).bounds; + if ( + x + winSize[0] < displaySize.x - 8 + || x - winSize[0] > displaySize.x + displaySize.width + || y < displaySize.y - 8 + || y > displaySize.y + displaySize.height + ) { + // Window is offscreen + if (is.dev()) { + console.log( + `Window tried to render offscreen, windowSize=${winSize}, displaySize=${displaySize}, position=${windowPosition}`, + ); + } + } else { + win.setPosition(x, y); + } + } - if(config.get("options.alwaysOnTop")){ - win.setAlwaysOnTop(true); - } + if (windowMaximized) { + win.maximize(); + } - const urlToLoad = config.get("options.resumeOnStart") - ? config.get("url") - : config.defaultConfig.url; - win.webContents.loadURL(urlToLoad); - win.on("closed", onClosed); + if (config.get('options.alwaysOnTop')) { + win.setAlwaysOnTop(true); + } - const setPiPOptions = config.plugins.isEnabled("picture-in-picture") - ? (key, value) => require("./plugins/picture-in-picture/back").setOptions({ [key]: value }) - : () => {}; + const urlToLoad = config.get('options.resumeOnStart') + ? config.get('url') + : config.defaultConfig.url; + win.webContents.loadURL(urlToLoad); + win.on('closed', onClosed); - win.on("move", () => { - if (win.isMaximized()) return; - let position = win.getPosition(); - const isPiPEnabled = - config.plugins.isEnabled("picture-in-picture") && - config.plugins.getOptions("picture-in-picture")["isInPiP"]; - if (!isPiPEnabled) { - lateSave("window-position", { x: position[0], y: position[1] }); - } else if(config.plugins.getOptions("picture-in-picture")["savePosition"]) { - lateSave("pip-position", position, setPiPOptions); - } - }); + const setPiPOptions = config.plugins.isEnabled('picture-in-picture') + ? (key, value) => require('./plugins/picture-in-picture/back').setOptions({ [key]: value }) + : () => { + }; - let winWasMaximized; + win.on('move', () => { + if (win.isMaximized()) { + return; + } - win.on("resize", () => { - const windowSize = win.getSize(); - const isMaximized = win.isMaximized(); + const position = win.getPosition(); + const isPiPEnabled + = config.plugins.isEnabled('picture-in-picture') + && config.plugins.getOptions('picture-in-picture').isInPiP; + if (!isPiPEnabled) { + lateSave('window-position', { x: position[0], y: position[1] }); + } else if (config.plugins.getOptions('picture-in-picture').savePosition) { + lateSave('pip-position', position, setPiPOptions); + } + }); - const isPiPEnabled = - config.plugins.isEnabled("picture-in-picture") && - config.plugins.getOptions("picture-in-picture")["isInPiP"]; + let winWasMaximized; - if (!isPiPEnabled && winWasMaximized !== isMaximized) { - winWasMaximized = isMaximized; - config.set("window-maximized", isMaximized); - } - if (isMaximized) return; + win.on('resize', () => { + const windowSize = win.getSize(); + const isMaximized = win.isMaximized(); - if (!isPiPEnabled) { - lateSave("window-size", { - width: windowSize[0], - height: windowSize[1], - }); - } else if(config.plugins.getOptions("picture-in-picture")["saveSize"]) { - lateSave("pip-size", windowSize, setPiPOptions); - } - }); + const isPiPEnabled + = config.plugins.isEnabled('picture-in-picture') + && config.plugins.getOptions('picture-in-picture').isInPiP; - let savedTimeouts = {}; - function lateSave(key, value, fn = config.set) { - if (savedTimeouts[key]) clearTimeout(savedTimeouts[key]); + if (!isPiPEnabled && winWasMaximized !== isMaximized) { + winWasMaximized = isMaximized; + config.set('window-maximized', isMaximized); + } - savedTimeouts[key] = setTimeout(() => { - fn(key, value); - savedTimeouts[key] = undefined; - }, 600); - } + if (isMaximized) { + return; + } - win.webContents.on("render-process-gone", (event, webContents, details) => { - showUnresponsiveDialog(win, details); - }); + if (!isPiPEnabled) { + lateSave('window-size', { + width: windowSize[0], + height: windowSize[1], + }); + } else if (config.plugins.getOptions('picture-in-picture').saveSize) { + lateSave('pip-size', windowSize, setPiPOptions); + } + }); - win.once("ready-to-show", () => { - if (config.get("options.appVisible")) { - win.show(); - } - }); + const savedTimeouts = {}; - removeContentSecurityPolicy(); + function lateSave(key, value, fn = config.set) { + if (savedTimeouts[key]) { + clearTimeout(savedTimeouts[key]); + } - return win; + savedTimeouts[key] = setTimeout(() => { + fn(key, value); + savedTimeouts[key] = undefined; + }, 600); + } + + win.webContents.on('render-process-gone', (event, webContents, details) => { + showUnresponsiveDialog(win, details); + }); + + win.once('ready-to-show', () => { + if (config.get('options.appVisible')) { + win.show(); + } + }); + + removeContentSecurityPolicy(); + + return win; } -app.once("browser-window-created", (event, win) => { - if (config.get("options.overrideUserAgent")) { - // User agents are from https://developers.whatismybrowser.com/useragents/explore/ - const originalUserAgent = win.webContents.userAgent; - const userAgents = { - mac: "Mozilla/5.0 (Macintosh; Intel Mac OS X 12.1; rv:95.0) Gecko/20100101 Firefox/95.0", - windows: "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0", - linux: "Mozilla/5.0 (Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0", - } +app.once('browser-window-created', (event, win) => { + if (config.get('options.overrideUserAgent')) { + // User agents are from https://developers.whatismybrowser.com/useragents/explore/ + const originalUserAgent = win.webContents.userAgent; + const userAgents = { + mac: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 12.1; rv:95.0) Gecko/20100101 Firefox/95.0', + windows: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0', + linux: 'Mozilla/5.0 (Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0', + }; - const updatedUserAgent = - is.macOS() ? userAgents.mac : - is.windows() ? userAgents.windows : - userAgents.linux; + const updatedUserAgent + = is.macOS() ? userAgents.mac + : (is.windows() ? userAgents.windows + : userAgents.linux); - win.webContents.userAgent = updatedUserAgent; - app.userAgentFallback = updatedUserAgent; + win.webContents.userAgent = updatedUserAgent; + app.userAgentFallback = updatedUserAgent; - win.webContents.session.webRequest.onBeforeSendHeaders((details, cb) => { - // this will only happen if login failed, and "retry" was pressed - if (win.webContents.getURL().startsWith("https://accounts.google.com") && details.url.startsWith("https://accounts.google.com")) { - details.requestHeaders["User-Agent"] = originalUserAgent; - } - cb({ requestHeaders: details.requestHeaders }); - }); - } + win.webContents.session.webRequest.onBeforeSendHeaders((details, cb) => { + // This will only happen if login failed, and "retry" was pressed + if (win.webContents.getURL().startsWith('https://accounts.google.com') && details.url.startsWith('https://accounts.google.com')) { + details.requestHeaders['User-Agent'] = originalUserAgent; + } - setupSongInfo(win); - setupAppControls(); + cb({ requestHeaders: details.requestHeaders }); + }); + } - win.webContents.on("did-fail-load", ( - _event, - errorCode, - errorDescription, - validatedURL, - isMainFrame, - frameProcessId, - frameRoutingId, - ) => { - const log = JSON.stringify({ - error: "did-fail-load", - errorCode, - errorDescription, - validatedURL, - isMainFrame, - frameProcessId, - frameRoutingId, - }, null, "\t"); - if (is.dev()) { - console.log(log); - } - if( !(config.plugins.isEnabled("in-app-menu") && errorCode === -3)) { // -3 is a false positive with in-app-menu - win.webContents.send("log", log); - win.webContents.loadFile(path.join(__dirname, "error.html")); - } - }); + setupSongInfo(win); + setupAppControls(); - win.webContents.on("will-prevent-unload", (event) => { - event.preventDefault(); - }); + win.webContents.on('did-fail-load', ( + _event, + errorCode, + errorDescription, + validatedURL, + isMainFrame, + frameProcessId, + frameRoutingId, + ) => { + const log = JSON.stringify({ + error: 'did-fail-load', + errorCode, + errorDescription, + validatedURL, + isMainFrame, + frameProcessId, + frameRoutingId, + }, null, '\t'); + if (is.dev()) { + console.log(log); + } + + if (!(config.plugins.isEnabled('in-app-menu') && errorCode === -3)) { // -3 is a false positive with in-app-menu + win.webContents.send('log', log); + win.webContents.loadFile(path.join(__dirname, 'error.html')); + } + }); + + win.webContents.on('will-prevent-unload', (event) => { + event.preventDefault(); + }); }); -app.on("window-all-closed", () => { - if (process.platform !== "darwin") { - app.quit(); - } +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') { + app.quit(); + } - // Unregister all shortcuts. - electron.globalShortcut.unregisterAll(); + // Unregister all shortcuts. + electron.globalShortcut.unregisterAll(); }); -app.on("activate", () => { - // On OS X it's common to re-create a window in the app when the - // dock icon is clicked and there are no other windows open. - if (mainWindow === null) { - mainWindow = createMainWindow(); - } else if (!mainWindow.isVisible()) { - mainWindow.show(); - } +app.on('activate', () => { + // On OS X it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (mainWindow === null) { + mainWindow = createMainWindow(); + } else if (!mainWindow.isVisible()) { + mainWindow.show(); + } }); -app.on("ready", () => { - if (config.get("options.autoResetAppCache")) { - // Clear cache after 20s - const clearCacheTimeout = setTimeout(() => { - if (is.dev()) { - console.log("Clearing app cache."); - } - electron.session.defaultSession.clearCache(); - clearTimeout(clearCacheTimeout); - }, 20000); - } +app.on('ready', () => { + if (config.get('options.autoResetAppCache')) { + // Clear cache after 20s + const clearCacheTimeout = setTimeout(() => { + if (is.dev()) { + console.log('Clearing app cache.'); + } - // Register appID on windows - if (is.windows()) { - const appID = "com.github.th-ch.youtube-music"; - app.setAppUserModelId(appID); - const appLocation = process.execPath; - const appData = app.getPath("appData"); - // check shortcut validity if not in dev mode / running portable app - if (!is.dev() && !appLocation.startsWith(path.join(appData, "..", "Local", "Temp"))) { - const shortcutPath = path.join(appData, "Microsoft", "Windows", "Start Menu", "Programs", "YouTube Music.lnk"); - try { // check if shortcut is registered and valid - const shortcutDetails = electron.shell.readShortcutLink(shortcutPath); // throw error if doesn't exist yet - if ( - shortcutDetails.target !== appLocation || - shortcutDetails.appUserModelId !== appID - ) { - throw "needUpdate"; - } - } catch (error) { // if not valid -> Register shortcut - electron.shell.writeShortcutLink( - shortcutPath, - error === "needUpdate" ? "update" : "create", - { - target: appLocation, - cwd: path.dirname(appLocation), - description: "YouTube Music Desktop App - including custom plugins", - appUserModelId: appID, - } - ); - } - } - } + electron.session.defaultSession.clearCache(); + clearTimeout(clearCacheTimeout); + }, 20_000); + } - mainWindow = createMainWindow(); - setApplicationMenu(mainWindow); - setUpTray(app, mainWindow); + // Register appID on windows + if (is.windows()) { + const appID = 'com.github.th-ch.youtube-music'; + app.setAppUserModelId(appID); + const appLocation = process.execPath; + const appData = app.getPath('appData'); + // Check shortcut validity if not in dev mode / running portable app + if (!is.dev() && !appLocation.startsWith(path.join(appData, '..', 'Local', 'Temp'))) { + const shortcutPath = path.join(appData, 'Microsoft', 'Windows', 'Start Menu', 'Programs', 'YouTube Music.lnk'); + try { // Check if shortcut is registered and valid + const shortcutDetails = electron.shell.readShortcutLink(shortcutPath); // Throw error if doesn't exist yet + if ( + shortcutDetails.target !== appLocation + || shortcutDetails.appUserModelId !== appID + ) { + throw 'needUpdate'; + } + } catch (error) { // If not valid -> Register shortcut + electron.shell.writeShortcutLink( + shortcutPath, + error === 'needUpdate' ? 'update' : 'create', + { + target: appLocation, + cwd: path.dirname(appLocation), + description: 'YouTube Music Desktop App - including custom plugins', + appUserModelId: appID, + }, + ); + } + } + } - setupProtocolHandler(mainWindow); + mainWindow = createMainWindow(); + setApplicationMenu(mainWindow); + setUpTray(app, mainWindow); - app.on('second-instance', (_event, commandLine, _workingDirectory) => { - const uri = `${APP_PROTOCOL}://`; - const protocolArgv = commandLine.find(arg => arg.startsWith(uri)); - if (protocolArgv) { - const lastIndex = protocolArgv.endsWith("/") ? -1 : undefined; - const command = protocolArgv.slice(uri.length, lastIndex); - if (is.dev()) console.debug(`Received command over protocol: "${command}"`); - handleProtocol(command); - return; - } - if (!mainWindow) return; - if (mainWindow.isMinimized()) mainWindow.restore(); - if (!mainWindow.isVisible()) mainWindow.show(); - mainWindow.focus(); - }); + setupProtocolHandler(mainWindow); - // Autostart at login - app.setLoginItemSettings({ - openAtLogin: config.get("options.startAtLogin"), - }); + app.on('second-instance', (_event, commandLine, _workingDirectory) => { + const uri = `${APP_PROTOCOL}://`; + const protocolArgv = commandLine.find((arg) => arg.startsWith(uri)); + if (protocolArgv) { + const lastIndex = protocolArgv.endsWith('/') ? -1 : undefined; + const command = protocolArgv.slice(uri.length, lastIndex); + if (is.dev()) { + console.debug(`Received command over protocol: "${command}"`); + } - if (!is.dev() && config.get("options.autoUpdates")) { - const updateTimeout = setTimeout(() => { - autoUpdater.checkForUpdatesAndNotify(); - clearTimeout(updateTimeout); - }, 2000); - autoUpdater.on("update-available", () => { - const downloadLink = - "https://github.com/th-ch/youtube-music/releases/latest"; - const dialogOpts = { - type: "info", - buttons: ["OK", "Download", "Disable updates"], - title: "Application Update", - message: "A new version is available", - detail: `A new version is available and can be downloaded at ${downloadLink}`, - }; - electron.dialog.showMessageBox(dialogOpts).then((dialogOutput) => { - switch (dialogOutput.response) { - // Download - case 1: - electron.shell.openExternal(downloadLink); - break; - // Disable updates - case 2: - config.set("options.autoUpdates", false); - break; - default: - break; - } - }); - }); - } + handleProtocol(command); + return; + } - if (config.get("options.hideMenu") && !config.get("options.hideMenuWarned")) { - electron.dialog.showMessageBox(mainWindow, { - type: 'info', title: 'Hide Menu Enabled', - message: "Menu is hidden, use 'Alt' to show it (or 'Escape' if using in-app-menu)" - }); - config.set("options.hideMenuWarned", true); - } + if (!mainWindow) { + return; + } - // Optimized for Mac OS X - if (is.macOS() && !config.get("options.appVisible")) { - app.dock.hide(); - } + if (mainWindow.isMinimized()) { + mainWindow.restore(); + } - let forceQuit = false; - app.on("before-quit", () => { - forceQuit = true; - }); + if (!mainWindow.isVisible()) { + mainWindow.show(); + } - if (is.macOS() || config.get("options.tray")) { - mainWindow.on("close", (event) => { - // Hide the window instead of quitting (quit is available in tray options) - if (!forceQuit) { - event.preventDefault(); - mainWindow.hide(); - } - }); - } + mainWindow.focus(); + }); + + // Autostart at login + app.setLoginItemSettings({ + openAtLogin: config.get('options.startAtLogin'), + }); + + if (!is.dev() && config.get('options.autoUpdates')) { + const updateTimeout = setTimeout(() => { + autoUpdater.checkForUpdatesAndNotify(); + clearTimeout(updateTimeout); + }, 2000); + autoUpdater.on('update-available', () => { + const downloadLink + = 'https://github.com/th-ch/youtube-music/releases/latest'; + const dialogOptions = { + type: 'info', + buttons: ['OK', 'Download', 'Disable updates'], + title: 'Application Update', + message: 'A new version is available', + detail: `A new version is available and can be downloaded at ${downloadLink}`, + }; + electron.dialog.showMessageBox(dialogOptions).then((dialogOutput) => { + switch (dialogOutput.response) { + // Download + case 1: { + electron.shell.openExternal(downloadLink); + break; + } + + // Disable updates + case 2: { + config.set('options.autoUpdates', false); + break; + } + + default: { + break; + } + } + }); + }); + } + + if (config.get('options.hideMenu') && !config.get('options.hideMenuWarned')) { + electron.dialog.showMessageBox(mainWindow, { + type: 'info', title: 'Hide Menu Enabled', + message: "Menu is hidden, use 'Alt' to show it (or 'Escape' if using in-app-menu)", + }); + config.set('options.hideMenuWarned', true); + } + + // Optimized for Mac OS X + if (is.macOS() && !config.get('options.appVisible')) { + app.dock.hide(); + } + + let forceQuit = false; + app.on('before-quit', () => { + forceQuit = true; + }); + + if (is.macOS() || config.get('options.tray')) { + mainWindow.on('close', (event) => { + // Hide the window instead of quitting (quit is available in tray options) + if (!forceQuit) { + event.preventDefault(); + mainWindow.hide(); + } + }); + } }); function showUnresponsiveDialog(win, details) { - if (!!details) { - console.log("Unresponsive Error!\n"+JSON.stringify(details, null, "\t")) - } - electron.dialog.showMessageBox(win, { - type: "error", - title: "Window Unresponsive", - message: "The Application is Unresponsive", - details: "We are sorry for the inconvenience! please choose what to do:", - buttons: ["Wait", "Relaunch", "Quit"], - cancelId: 0 - }).then( result => { - switch (result.response) { - case 1: restart(); break; - case 2: app.quit(); break; - } - }); + if (details) { + console.log('Unresponsive Error!\n' + JSON.stringify(details, null, '\t')); + } + + electron.dialog.showMessageBox(win, { + type: 'error', + title: 'Window Unresponsive', + message: 'The Application is Unresponsive', + details: 'We are sorry for the inconvenience! please choose what to do:', + buttons: ['Wait', 'Relaunch', 'Quit'], + cancelId: 0, + }).then((result) => { + switch (result.response) { + case 1: { + restart(); + break; + } + + case 2: { + app.quit(); + break; + } + } + }); } function removeContentSecurityPolicy( - session = electron.session.defaultSession + session = electron.session.defaultSession, ) { - // Allows defining multiple "onHeadersReceived" listeners - // by enhancing the session. - // Some plugins (e.g. adblocker) also define a "onHeadersReceived" listener - enhanceWebRequest(session); + // Allows defining multiple "onHeadersReceived" listeners + // by enhancing the session. + // Some plugins (e.g. adblocker) also define a "onHeadersReceived" listener + enhanceWebRequest(session); - // Custom listener to tweak the content security policy - session.webRequest.onHeadersReceived(function (details, callback) { - details.responseHeaders ??= {} + // Custom listener to tweak the content security policy + session.webRequest.onHeadersReceived((details, callback) => { + details.responseHeaders ??= {}; - // Remove the content security policy - delete details.responseHeaders["content-security-policy-report-only"]; - delete details.responseHeaders["content-security-policy"]; + // Remove the content security policy + delete details.responseHeaders['content-security-policy-report-only']; + delete details.responseHeaders['content-security-policy']; - callback({ cancel: false, responseHeaders: details.responseHeaders }); - }); + callback({ cancel: false, responseHeaders: details.responseHeaders }); + }); - // When multiple listeners are defined, apply them all - session.webRequest.setResolver("onHeadersReceived", (listeners) => { - const response = listeners.reduce( - async (accumulator, listener) => { - if (accumulator.cancel) { - return accumulator; - } + // When multiple listeners are defined, apply them all + session.webRequest.setResolver('onHeadersReceived', (listeners) => { + const response = listeners.reduce( + async (accumulator, listener) => { + if (accumulator.cancel) { + return accumulator; + } - const result = await listener.apply(); - return { ...accumulator, ...result }; - }, - { cancel: false } - ); + const result = await listener.apply(); + return { ...accumulator, ...result }; + }, + { cancel: false }, + ); - return response; - }); + return response; + }); } diff --git a/menu.js b/menu.js index 6aaad9f1..a67def73 100644 --- a/menu.js +++ b/menu.js @@ -1,437 +1,442 @@ -const { existsSync } = require("fs"); -const path = require("path"); +const { existsSync } = require('node:fs'); +const path = require('node:path'); -const { app, clipboard, Menu, dialog } = require("electron"); -const is = require("electron-is"); -const { restart } = require("./providers/app-controls"); +const { app, clipboard, Menu, dialog } = require('electron'); +const is = require('electron-is'); +const prompt = require('custom-electron-prompt'); -const { getAllPlugins } = require("./plugins/utils"); -const config = require("./config"); -const { startingPages } = require("./providers/extracted-data"); +const { restart } = require('./providers/app-controls'); +const { getAllPlugins } = require('./plugins/utils'); +const config = require('./config'); +const { startingPages } = require('./providers/extracted-data'); +const promptOptions = require('./providers/prompt-options'); -const prompt = require("custom-electron-prompt"); -const promptOptions = require("./providers/prompt-options"); +// True only if in-app-menu was loaded on launch +const inAppMenuActive = config.plugins.isEnabled('in-app-menu'); -// true only if in-app-menu was loaded on launch -const inAppMenuActive = config.plugins.isEnabled("in-app-menu"); +const pluginEnabledMenu = (plugin, label = '', hasSubmenu = false, refreshMenu = undefined) => ({ + label: label || plugin, + type: 'checkbox', + checked: config.plugins.isEnabled(plugin), + click(item) { + if (item.checked) { + config.plugins.enable(plugin); + } else { + config.plugins.disable(plugin); + } -const pluginEnabledMenu = (plugin, label = "", hasSubmenu = false, refreshMenu = undefined) => ({ - label: label || plugin, - type: "checkbox", - checked: config.plugins.isEnabled(plugin), - click: (item) => { - if (item.checked) { - config.plugins.enable(plugin); - } else { - config.plugins.disable(plugin); - } - if (hasSubmenu) { - refreshMenu(); - } - }, + if (hasSubmenu) { + refreshMenu(); + } + }, }); const mainMenuTemplate = (win) => { - const refreshMenu = () => { - this.setApplicationMenu(win); - if (inAppMenuActive) { - win.webContents.send("refreshMenu"); - } - } - return [ - { - label: "Plugins", - submenu: [ - ...getAllPlugins().map((plugin) => { - const pluginPath = path.join(__dirname, "plugins", plugin, "menu.js") - if (existsSync(pluginPath)) { - let pluginLabel = plugin; - if (pluginLabel === "crossfade") { - pluginLabel = "crossfade [beta]"; - } - if (!config.plugins.isEnabled(plugin)) { - return pluginEnabledMenu(plugin, pluginLabel, true, refreshMenu); - } - const getPluginMenu = require(pluginPath); - return { - label: pluginLabel, - submenu: [ - pluginEnabledMenu(plugin, "Enabled", true, refreshMenu), - { type: "separator" }, - ...getPluginMenu(win, config.plugins.getOptions(plugin), refreshMenu), - ], - }; - } - return pluginEnabledMenu(plugin); - }), - ], - }, - { - label: "Options", - submenu: [ - { - label: "Auto-update", - type: "checkbox", - checked: config.get("options.autoUpdates"), - click: (item) => { - config.setMenuOption("options.autoUpdates", item.checked); - }, - }, - { - label: "Resume last song when app starts", - type: "checkbox", - checked: config.get("options.resumeOnStart"), - click: (item) => { - config.setMenuOption("options.resumeOnStart", item.checked); - }, - }, - { - label: 'Starting page', - submenu: Object.keys(startingPages).map((name) => ({ - label: name, - type: 'radio', - checked: config.get('options.startingPage') === name, - click: () => { - config.set('options.startingPage', name); - }, - })) - }, - { - label: "Visual Tweaks", - submenu: [ - { - label: "Remove upgrade button", - type: "checkbox", - checked: config.get("options.removeUpgradeButton"), - click: (item) => { - config.setMenuOption("options.removeUpgradeButton", item.checked); - }, - }, - { - label: "Like buttons", - submenu: [ - { - label: "Default", - type: "radio", - checked: !config.get("options.likeButtons"), - click: () => { - config.set("options.likeButtons", ''); - }, - }, - { - label: "Force show", - type: "radio", - checked: config.get("options.likeButtons") === 'force', - click: () => { - config.set("options.likeButtons", 'force'); - } - }, - { - label: "Hide", - type: "radio", - checked: config.get("options.likeButtons") === 'hide', - click: () => { - config.set("options.likeButtons", 'hide'); - } - }, - ], - }, - { - label: "Theme", - submenu: [ - { - label: "No theme", - type: "radio", - checked: !config.get("options.themes"), // todo rename "themes" - click: () => { - config.set("options.themes", []); - }, - }, - { type: "separator" }, - { - label: "Import custom CSS file", - type: "radio", - checked: false, - click: async () => { - const { filePaths } = await dialog.showOpenDialog({ - filters: [{ name: "CSS Files", extensions: ["css"] }], - properties: ["openFile", "multiSelections"], - }); - if (filePaths) { - config.set("options.themes", filePaths); - } - }, - }, - ], - }, - ], - }, - { - label: "Single instance lock", - type: "checkbox", - checked: true, - click: (item) => { - if (!item.checked && app.hasSingleInstanceLock()) - app.releaseSingleInstanceLock(); - else if (item.checked && !app.hasSingleInstanceLock()) - app.requestSingleInstanceLock(); - }, - }, - { - label: "Always on top", - type: "checkbox", - checked: config.get("options.alwaysOnTop"), - click: (item) => { - config.setMenuOption("options.alwaysOnTop", item.checked); - win.setAlwaysOnTop(item.checked); - }, - }, - ...(is.windows() || is.linux() - ? [ - { - label: "Hide menu", - type: "checkbox", - checked: config.get("options.hideMenu"), - click: (item) => { - config.setMenuOption("options.hideMenu", item.checked); - if (item.checked && !config.get("options.hideMenuWarned")) { - dialog.showMessageBox(win, { - type: 'info', title: 'Hide Menu Enabled', - message: "Menu will be hidden on next launch, use [Alt] to show it (or backtick [`] if using in-app-menu)" - }); - } - }, - }, - ] - : []), - ...(is.windows() || is.macOS() - ? // Only works on Win/Mac - // https://www.electronjs.org/docs/api/app#appsetloginitemsettingssettings-macos-windows - [ - { - label: "Start at login", - type: "checkbox", - checked: config.get("options.startAtLogin"), - click: (item) => { - config.setMenuOption("options.startAtLogin", item.checked); - }, - }, - ] - : []), - { - label: "Tray", - submenu: [ - { - label: "Disabled", - type: "radio", - checked: !config.get("options.tray"), - click: () => { - config.setMenuOption("options.tray", false); - config.setMenuOption("options.appVisible", true); - }, - }, - { - label: "Enabled + app visible", - type: "radio", - checked: - config.get("options.tray") && config.get("options.appVisible"), - click: () => { - config.setMenuOption("options.tray", true); - config.setMenuOption("options.appVisible", true); - }, - }, - { - label: "Enabled + app hidden", - type: "radio", - checked: - config.get("options.tray") && !config.get("options.appVisible"), - click: () => { - config.setMenuOption("options.tray", true); - config.setMenuOption("options.appVisible", false); - }, - }, - { type: "separator" }, - { - label: "Play/Pause on click", - type: "checkbox", - checked: config.get("options.trayClickPlayPause"), - click: (item) => { - config.setMenuOption("options.trayClickPlayPause", item.checked); - }, - }, - ], - }, - { type: "separator" }, - { - label: "Advanced options", - submenu: [ - { - label: "Proxy", - type: "checkbox", - checked: !!config.get("options.proxy"), - click: (item) => { - setProxy(item, win); - }, - }, - { - label: "Override useragent", - type: "checkbox", - checked: config.get("options.overrideUserAgent"), - click: (item) => { - config.setMenuOption("options.overrideUserAgent", item.checked); - } - }, - { - label: "Disable hardware acceleration", - type: "checkbox", - checked: config.get("options.disableHardwareAcceleration"), - click: (item) => { - config.setMenuOption("options.disableHardwareAcceleration", item.checked); - }, - }, - { - label: "Restart on config changes", - type: "checkbox", - checked: config.get("options.restartOnConfigChanges"), - click: (item) => { - config.setMenuOption("options.restartOnConfigChanges", item.checked); - }, - }, - { - label: "Reset App cache when app starts", - type: "checkbox", - checked: config.get("options.autoResetAppCache"), - click: (item) => { - config.setMenuOption("options.autoResetAppCache", item.checked); - }, - }, - { type: "separator" }, - is.macOS() ? - { - label: "Toggle DevTools", - // Cannot use "toggleDevTools" role in MacOS - click: () => { - const { webContents } = win; - if (webContents.isDevToolsOpened()) { - webContents.closeDevTools(); - } else { - const devToolsOptions = {}; - webContents.openDevTools(devToolsOptions); - } - }, - } : - { role: "toggleDevTools" }, - { - label: "Edit config.json", - click: () => { - config.edit(); - }, - }, - ] - }, - ], - }, - { - label: "View", - submenu: [ - { role: "reload" }, - { role: "forceReload" }, - { type: "separator" }, - { role: "zoomIn" }, - { role: "zoomOut" }, - { role: "resetZoom" }, - { type: "separator" }, - { role: "togglefullscreen" }, - ], - }, - { - label: "Navigation", - submenu: [ - { - label: "Go back", - click: () => { - if (win.webContents.canGoBack()) { - win.webContents.goBack(); - } - }, - }, - { - label: "Go forward", - click: () => { - if (win.webContents.canGoForward()) { - win.webContents.goForward(); - } - }, - }, - { - label: "Copy current URL", - click: () => { - const currentURL = win.webContents.getURL(); - clipboard.writeText(currentURL); - }, - }, - { - label: "Restart App", - click: restart - }, - { role: "quit" }, - ], - }, - ]; -} + const refreshMenu = () => { + this.setApplicationMenu(win); + if (inAppMenuActive) { + win.webContents.send('refreshMenu'); + } + }; + + return [ + { + label: 'Plugins', + submenu: + getAllPlugins().map((plugin) => { + const pluginPath = path.join(__dirname, 'plugins', plugin, 'menu.js'); + if (existsSync(pluginPath)) { + let pluginLabel = plugin; + if (pluginLabel === 'crossfade') { + pluginLabel = 'crossfade [beta]'; + } + + if (!config.plugins.isEnabled(plugin)) { + return pluginEnabledMenu(plugin, pluginLabel, true, refreshMenu); + } + + const getPluginMenu = require(pluginPath); + return { + label: pluginLabel, + submenu: [ + pluginEnabledMenu(plugin, 'Enabled', true, refreshMenu), + { type: 'separator' }, + ...getPluginMenu(win, config.plugins.getOptions(plugin), refreshMenu), + ], + }; + } + + return pluginEnabledMenu(plugin); + }) + , + }, + { + label: 'Options', + submenu: [ + { + label: 'Auto-update', + type: 'checkbox', + checked: config.get('options.autoUpdates'), + click(item) { + config.setMenuOption('options.autoUpdates', item.checked); + }, + }, + { + label: 'Resume last song when app starts', + type: 'checkbox', + checked: config.get('options.resumeOnStart'), + click(item) { + config.setMenuOption('options.resumeOnStart', item.checked); + }, + }, + { + label: 'Starting page', + submenu: Object.keys(startingPages).map((name) => ({ + label: name, + type: 'radio', + checked: config.get('options.startingPage') === name, + click() { + config.set('options.startingPage', name); + }, + })), + }, + { + label: 'Visual Tweaks', + submenu: [ + { + label: 'Remove upgrade button', + type: 'checkbox', + checked: config.get('options.removeUpgradeButton'), + click(item) { + config.setMenuOption('options.removeUpgradeButton', item.checked); + }, + }, + { + label: 'Like buttons', + submenu: [ + { + label: 'Default', + type: 'radio', + checked: !config.get('options.likeButtons'), + click() { + config.set('options.likeButtons', ''); + }, + }, + { + label: 'Force show', + type: 'radio', + checked: config.get('options.likeButtons') === 'force', + click() { + config.set('options.likeButtons', 'force'); + }, + }, + { + label: 'Hide', + type: 'radio', + checked: config.get('options.likeButtons') === 'hide', + click() { + config.set('options.likeButtons', 'hide'); + }, + }, + ], + }, + { + label: 'Theme', + submenu: [ + { + label: 'No theme', + type: 'radio', + checked: !config.get('options.themes'), // Todo rename "themes" + click() { + config.set('options.themes', []); + }, + }, + { type: 'separator' }, + { + label: 'Import custom CSS file', + type: 'radio', + checked: false, + async click() { + const { filePaths } = await dialog.showOpenDialog({ + filters: [{ name: 'CSS Files', extensions: ['css'] }], + properties: ['openFile', 'multiSelections'], + }); + if (filePaths) { + config.set('options.themes', filePaths); + } + }, + }, + ], + }, + ], + }, + { + label: 'Single instance lock', + type: 'checkbox', + checked: true, + click(item) { + if (!item.checked && app.hasSingleInstanceLock()) { + app.releaseSingleInstanceLock(); + } else if (item.checked && !app.hasSingleInstanceLock()) { + app.requestSingleInstanceLock(); + } + }, + }, + { + label: 'Always on top', + type: 'checkbox', + checked: config.get('options.alwaysOnTop'), + click(item) { + config.setMenuOption('options.alwaysOnTop', item.checked); + win.setAlwaysOnTop(item.checked); + }, + }, + ...(is.windows() || is.linux() + ? [ + { + label: 'Hide menu', + type: 'checkbox', + checked: config.get('options.hideMenu'), + click(item) { + config.setMenuOption('options.hideMenu', item.checked); + if (item.checked && !config.get('options.hideMenuWarned')) { + dialog.showMessageBox(win, { + type: 'info', title: 'Hide Menu Enabled', + message: 'Menu will be hidden on next launch, use [Alt] to show it (or backtick [`] if using in-app-menu)', + }); + } + }, + }, + ] + : []), + ...(is.windows() || is.macOS() + ? // Only works on Win/Mac + // https://www.electronjs.org/docs/api/app#appsetloginitemsettingssettings-macos-windows + [ + { + label: 'Start at login', + type: 'checkbox', + checked: config.get('options.startAtLogin'), + click(item) { + config.setMenuOption('options.startAtLogin', item.checked); + }, + }, + ] + : []), + { + label: 'Tray', + submenu: [ + { + label: 'Disabled', + type: 'radio', + checked: !config.get('options.tray'), + click() { + config.setMenuOption('options.tray', false); + config.setMenuOption('options.appVisible', true); + }, + }, + { + label: 'Enabled + app visible', + type: 'radio', + checked: + config.get('options.tray') && config.get('options.appVisible'), + click() { + config.setMenuOption('options.tray', true); + config.setMenuOption('options.appVisible', true); + }, + }, + { + label: 'Enabled + app hidden', + type: 'radio', + checked: + config.get('options.tray') && !config.get('options.appVisible'), + click() { + config.setMenuOption('options.tray', true); + config.setMenuOption('options.appVisible', false); + }, + }, + { type: 'separator' }, + { + label: 'Play/Pause on click', + type: 'checkbox', + checked: config.get('options.trayClickPlayPause'), + click(item) { + config.setMenuOption('options.trayClickPlayPause', item.checked); + }, + }, + ], + }, + { type: 'separator' }, + { + label: 'Advanced options', + submenu: [ + { + label: 'Proxy', + type: 'checkbox', + checked: Boolean(config.get('options.proxy')), + click(item) { + setProxy(item, win); + }, + }, + { + label: 'Override useragent', + type: 'checkbox', + checked: config.get('options.overrideUserAgent'), + click(item) { + config.setMenuOption('options.overrideUserAgent', item.checked); + }, + }, + { + label: 'Disable hardware acceleration', + type: 'checkbox', + checked: config.get('options.disableHardwareAcceleration'), + click(item) { + config.setMenuOption('options.disableHardwareAcceleration', item.checked); + }, + }, + { + label: 'Restart on config changes', + type: 'checkbox', + checked: config.get('options.restartOnConfigChanges'), + click(item) { + config.setMenuOption('options.restartOnConfigChanges', item.checked); + }, + }, + { + label: 'Reset App cache when app starts', + type: 'checkbox', + checked: config.get('options.autoResetAppCache'), + click(item) { + config.setMenuOption('options.autoResetAppCache', item.checked); + }, + }, + { type: 'separator' }, + is.macOS() + ? { + label: 'Toggle DevTools', + // Cannot use "toggleDevTools" role in MacOS + click() { + const { webContents } = win; + if (webContents.isDevToolsOpened()) { + webContents.closeDevTools(); + } else { + const devToolsOptions = {}; + webContents.openDevTools(devToolsOptions); + } + }, + } + : { role: 'toggleDevTools' }, + { + label: 'Edit config.json', + click() { + config.edit(); + }, + }, + ], + }, + ], + }, + { + label: 'View', + submenu: [ + { role: 'reload' }, + { role: 'forceReload' }, + { type: 'separator' }, + { role: 'zoomIn' }, + { role: 'zoomOut' }, + { role: 'resetZoom' }, + { type: 'separator' }, + { role: 'togglefullscreen' }, + ], + }, + { + label: 'Navigation', + submenu: [ + { + label: 'Go back', + click() { + if (win.webContents.canGoBack()) { + win.webContents.goBack(); + } + }, + }, + { + label: 'Go forward', + click() { + if (win.webContents.canGoForward()) { + win.webContents.goForward(); + } + }, + }, + { + label: 'Copy current URL', + click() { + const currentURL = win.webContents.getURL(); + clipboard.writeText(currentURL); + }, + }, + { + label: 'Restart App', + click: restart, + }, + { role: 'quit' }, + ], + }, + ]; +}; module.exports.mainMenuTemplate = mainMenuTemplate; module.exports.setApplicationMenu = (win) => { - const menuTemplate = [...mainMenuTemplate(win)]; - if (process.platform === "darwin") { - const name = app.name; - menuTemplate.unshift({ - label: name, - submenu: [ - { role: "about" }, - { type: "separator" }, - { role: "hide" }, - { role: "hideothers" }, - { role: "unhide" }, - { type: "separator" }, - { - label: "Select All", - accelerator: "CmdOrCtrl+A", - selector: "selectAll:", - }, - { label: "Cut", accelerator: "CmdOrCtrl+X", selector: "cut:" }, - { label: "Copy", accelerator: "CmdOrCtrl+C", selector: "copy:" }, - { label: "Paste", accelerator: "CmdOrCtrl+V", selector: "paste:" }, - { type: "separator" }, - { role: "minimize" }, - { role: "close" }, - { role: "quit" }, - ], - }); - } + const menuTemplate = [...mainMenuTemplate(win)]; + if (process.platform === 'darwin') { + const { name } = app; + menuTemplate.unshift({ + label: name, + submenu: [ + { role: 'about' }, + { type: 'separator' }, + { role: 'hide' }, + { role: 'hideothers' }, + { role: 'unhide' }, + { type: 'separator' }, + { + label: 'Select All', + accelerator: 'CmdOrCtrl+A', + selector: 'selectAll:', + }, + { label: 'Cut', accelerator: 'CmdOrCtrl+X', selector: 'cut:' }, + { label: 'Copy', accelerator: 'CmdOrCtrl+C', selector: 'copy:' }, + { label: 'Paste', accelerator: 'CmdOrCtrl+V', selector: 'paste:' }, + { type: 'separator' }, + { role: 'minimize' }, + { role: 'close' }, + { role: 'quit' }, + ], + }); + } - const menu = Menu.buildFromTemplate(menuTemplate); - Menu.setApplicationMenu(menu); + const menu = Menu.buildFromTemplate(menuTemplate); + Menu.setApplicationMenu(menu); }; async function setProxy(item, win) { - const output = await prompt({ - title: 'Set Proxy', - label: 'Enter Proxy Address: (leave empty to disable)', - value: config.get("options.proxy"), - type: 'input', - inputAttrs: { - type: 'url', - placeholder: "Example: 'socks5://127.0.0.1:9999" - }, - width: 450, - ...promptOptions() - }, win); + const output = await prompt({ + title: 'Set Proxy', + label: 'Enter Proxy Address: (leave empty to disable)', + value: config.get('options.proxy'), + type: 'input', + inputAttrs: { + type: 'url', + placeholder: "Example: 'socks5://127.0.0.1:9999", + }, + width: 450, + ...promptOptions(), + }, win); - if (typeof output === "string") { - config.setMenuOption("options.proxy", output); - item.checked = output !== ""; - } else { //user pressed cancel - item.checked = !item.checked; //reset checkbox - } + if (typeof output === 'string') { + config.setMenuOption('options.proxy', output); + item.checked = output !== ''; + } else { // User pressed cancel + item.checked = !item.checked; // Reset checkbox + } } diff --git a/package-lock.json b/package-lock.json index adcbef65..a905e620 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11239 +1,8843 @@ { - "name": "youtube-music", - "version": "1.20.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "youtube-music", - "version": "1.20.0", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@cliqz/adblocker-electron": "1.26.6", - "@ffmpeg/core": "0.12.2", - "@ffmpeg/ffmpeg": "0.12.5", - "@foobar404/wave": "2.0.4", - "@xhayper/discord-rpc": "1.0.22", - "async-mutex": "0.4.0", - "browser-id3-writer": "5.0.0", - "butterchurn": "2.6.7", - "butterchurn-presets": "2.4.7", - "custom-electron-prompt": "1.5.7", - "custom-electron-titlebar": "4.2.7", - "electron": "26.1.0", - "electron-better-web-request": "1.0.1", - "electron-debug": "3.2.0", - "electron-is": "3.0.0", - "electron-localshortcut": "3.2.1", - "electron-store": "8.1.0", - "electron-unhandled": "4.0.1", - "electron-updater": "6.1.1", - "filenamify": "4.3.0", - "howler": "2.2.3", - "html-to-text": "9.0.5", - "keyboardevent-from-electron-accelerator": "2.0.0", - "keyboardevents-areequal": "0.2.2", - "md5": "2.3.0", - "mpris-service": "2.1.2", - "node-fetch": "2.7.0", - "simple-youtube-age-restriction-bypass": "git+https://github.com/zerodytrash/Simple-YouTube-Age-Restriction-Bypass.git#v2.5.9", - "vudio": "2.1.1", - "youtubei.js": "4.3.0", - "ytpl": "2.3.0" - }, - "devDependencies": { - "@playwright/test": "1.37.1", - "auto-changelog": "2.4.0", - "del-cli": "5.0.1", - "electron-builder": "24.6.3", - "electron-devtools-installer": "3.2.0", - "node-gyp": "9.4.0", - "playwright": "1.37.1", - "xo": "0.56.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/runtime": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.11.tgz", - "integrity": "sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@cliqz/adblocker": { - "version": "1.26.6", - "resolved": "https://registry.npmjs.org/@cliqz/adblocker/-/adblocker-1.26.6.tgz", - "integrity": "sha512-fSNCvyl0FRgKcc2NmHEhaQqeTT0QCLBT3eVZ15ah6baPdCaQm7N5IN/annv9bRalS8Lwbxymb3TBLzXpFTghrw==", - "dependencies": { - "@cliqz/adblocker-content": "^1.26.6", - "@cliqz/adblocker-extended-selectors": "^1.26.6", - "@remusao/guess-url-type": "^1.1.2", - "@remusao/small": "^1.1.2", - "@remusao/smaz": "^1.7.1", - "@types/chrome": "^0.0.228", - "@types/firefox-webext-browser": "^111.0.0", - "tldts-experimental": "^6.0.1" - } - }, - "node_modules/@cliqz/adblocker-content": { - "version": "1.26.6", - "resolved": "https://registry.npmjs.org/@cliqz/adblocker-content/-/adblocker-content-1.26.6.tgz", - "integrity": "sha512-cebc5AjL/quVVdcClJ7dqqvW5SrqATfUhwqn5MzWtponZ3t3fRpgpFgkt2fNa5rd3iz1UfTcAtWrgpshHYurTA==", - "dependencies": { - "@cliqz/adblocker-extended-selectors": "^1.26.6" - } - }, - "node_modules/@cliqz/adblocker-electron": { - "version": "1.26.6", - "resolved": "https://registry.npmjs.org/@cliqz/adblocker-electron/-/adblocker-electron-1.26.6.tgz", - "integrity": "sha512-OE0Qh2+OGrx53DkV9gj1JzYdUV1IM7JigpU++5sA6yhsdbZBFijto0SK3iDsMsHeEUVq8DV1oLYspe0UpIU4SA==", - "dependencies": { - "@cliqz/adblocker": "^1.26.6", - "@cliqz/adblocker-electron-preload": "^1.26.6", - "tldts-experimental": "^6.0.1" - }, - "peerDependencies": { - "electron": ">11" - } - }, - "node_modules/@cliqz/adblocker-electron-preload": { - "version": "1.26.6", - "resolved": "https://registry.npmjs.org/@cliqz/adblocker-electron-preload/-/adblocker-electron-preload-1.26.6.tgz", - "integrity": "sha512-G564oo1YANQR7mAzuQi7aYsgKwmRurYo0d9E8YaZr6ZD/kDHKxgHLfGPflKuOsYz2gf9zWQT89RsyQxDrjI49g==", - "dependencies": { - "@cliqz/adblocker-content": "^1.26.6" - }, - "peerDependencies": { - "electron": ">11" - } - }, - "node_modules/@cliqz/adblocker-extended-selectors": { - "version": "1.26.6", - "resolved": "https://registry.npmjs.org/@cliqz/adblocker-extended-selectors/-/adblocker-extended-selectors-1.26.6.tgz", - "integrity": "sha512-Gpvg6eLO2aHiY7r2y0jueve6YbGkYvWaZ4MiwhQ1wPTwj/MxFqAh9cVHnz3EzoJUtsqoy9bvkhmfkRUatpvvzw==" - }, - "node_modules/@develar/schema-utils": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", - "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", - "dev": true, - "dependencies": { - "ajv": "^6.12.0", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/@electron/asar": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.4.tgz", - "integrity": "sha512-lykfY3TJRRWFeTxccEKdf1I6BLl2Plw81H0bbp4Fc5iEc67foDCa5pjJQULVgo0wF+Dli75f3xVcdb/67FFZ/g==", - "dev": true, - "dependencies": { - "chromium-pickle-js": "^0.2.0", - "commander": "^5.0.0", - "glob": "^7.1.6", - "minimatch": "^3.0.4" - }, - "bin": { - "asar": "bin/asar.js" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/@electron/asar/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@electron/asar/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@electron/asar/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@electron/get": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.2.tgz", - "integrity": "sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g==", - "dependencies": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "got": "^11.8.5", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "global-agent": "^3.0.0" - } - }, - "node_modules/@electron/get/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@electron/notarize": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-1.2.4.tgz", - "integrity": "sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^9.0.1" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/notarize/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/notarize/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/notarize/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/osx-sign": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz", - "integrity": "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==", - "dev": true, - "dependencies": { - "compare-version": "^0.1.2", - "debug": "^4.3.4", - "fs-extra": "^10.0.0", - "isbinaryfile": "^4.0.8", - "minimist": "^1.2.6", - "plist": "^3.0.5" - }, - "bin": { - "electron-osx-flat": "bin/electron-osx-flat.js", - "electron-osx-sign": "bin/electron-osx-sign.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@electron/osx-sign/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true, - "engines": { - "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/@electron/osx-sign/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/osx-sign/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/universal": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.4.1.tgz", - "integrity": "sha512-lE/U3UNw1YHuowNbTmKNs9UlS3En3cPgwM5MI+agIgr/B1hSze9NdOP0qn7boZaI9Lph8IDv3/24g9IxnJP7aQ==", - "dev": true, - "dependencies": { - "@electron/asar": "^3.2.1", - "@malept/cross-spawn-promise": "^1.1.0", - "debug": "^4.3.1", - "dir-compare": "^3.0.0", - "fs-extra": "^9.0.1", - "minimatch": "^3.0.4", - "plist": "^3.0.4" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/@electron/universal/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@electron/universal/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/universal/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/universal/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@electron/universal/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/js": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", - "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@ffmpeg/core": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@ffmpeg/core/-/core-0.12.2.tgz", - "integrity": "sha512-UnzHvuNFbzmVZERSDtWGQvna01eKMfOWGG6SUn+s8mnKm5aH2zcrEIMgOMYpc6yJqrdRt0LBtT3ijF65rWlxIA==", - "engines": { - "node": ">=16.6.0" - } - }, - "node_modules/@ffmpeg/ffmpeg": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@ffmpeg/ffmpeg/-/ffmpeg-0.12.5.tgz", - "integrity": "sha512-grDWTaYSm0g/LEtpwkJtw0Kp1Iix/WF3KmtUo0Fm0V5GqKMUVzj1yzyaILg83o96wHSc8Y2d9Q3C37pYAF2wxQ==", - "dependencies": { - "@ffmpeg/types": "^0.12.0" - }, - "engines": { - "node": ">=18.17.0" - } - }, - "node_modules/@ffmpeg/types": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@ffmpeg/types/-/types-0.12.0.tgz", - "integrity": "sha512-AuR4K+L6v1/9hVOsikU4rGGT5nKulQa8HrtYhpgBEq0HojoWB1c9bq3TTkNBpEvS/gC17WDMVJrqIGgXOj1DXA==", - "engines": { - "node": ">=16.6.0" - } - }, - "node_modules/@foobar404/wave": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@foobar404/wave/-/wave-2.0.4.tgz", - "integrity": "sha512-FEyg37hDvQtrQVlFxbit7ov5e487BjsR32bZfJ4oAb5i+NnlbGaNyy6iYBZ8ocVHo8fgug+SL+mFdDTzqjvPww==" - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true, - "peer": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@malept/cross-spawn-promise": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", - "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@malept/flatpak-bundler": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", - "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^9.0.0", - "lodash": "^4.17.15", - "tmp-promise": "^3.0.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@malept/flatpak-bundler/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nornagon/put": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@nornagon/put/-/put-0.0.8.tgz", - "integrity": "sha512-ugvXJjwF5ldtUpa7D95kruNJ41yFQDEKyF5CW4TgKJnh+W/zmlBzXXeKTyqIgwMFrkePN2JqOBqcF0M0oOunow==", - "engines": { - "node": ">=0.3.0" - } - }, - "node_modules/@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pkgr/utils": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", - "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "fast-glob": "^3.3.0", - "is-glob": "^4.0.3", - "open": "^9.1.0", - "picocolors": "^1.0.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/@pkgr/utils/node_modules/open": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", - "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", - "dev": true, - "dependencies": { - "default-browser": "^4.0.0", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@playwright/test": { - "version": "1.37.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.37.1.tgz", - "integrity": "sha512-bq9zTli3vWJo8S3LwB91U0qDNQDpEXnw7knhxLM0nwDvexQAwx9tO8iKDZSqqneVq+URd/WIoz+BALMqUTgdSg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "playwright-core": "1.37.1" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=16" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/@remusao/guess-url-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@remusao/guess-url-type/-/guess-url-type-1.2.1.tgz", - "integrity": "sha512-rbOqre2jW8STjheOsOaQHLgYBaBZ9Owbdt8NO7WvNZftJlaG3y/K9oOkl8ZUpuFBisIhmBuMEW6c+YrQl5inRA==" - }, - "node_modules/@remusao/small": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@remusao/small/-/small-1.2.1.tgz", - "integrity": "sha512-7MjoGt0TJMVw1GPKgWq6SJPws1SLsUXQRa43Umht+nkyw2jnpy3WpiLNqGdwo5rHr5Wp9B2W/Pm5RQp656UJdw==" - }, - "node_modules/@remusao/smaz": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@remusao/smaz/-/smaz-1.9.1.tgz", - "integrity": "sha512-e6BLuP8oaXCZ9+v46Is4ilAZ/Vq6YLgmBP204Ixgk1qTjXmqvFYG7+AS7v9nsZdGOy96r9DWGFbbDVgMxwu1rA==", - "dependencies": { - "@remusao/smaz-compress": "^1.9.1", - "@remusao/smaz-decompress": "^1.9.1" - } - }, - "node_modules/@remusao/smaz-compress": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@remusao/smaz-compress/-/smaz-compress-1.9.1.tgz", - "integrity": "sha512-E2f48TwloQu3r6BdLOGF2aczeH7bJ/32oJGqvzT9SKur0cuUnLcZ7ZXP874E2fwmdE+cXzfC7bKzp79cDnmeyw==", - "dependencies": { - "@remusao/trie": "^1.4.1" - } - }, - "node_modules/@remusao/smaz-decompress": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@remusao/smaz-decompress/-/smaz-decompress-1.9.1.tgz", - "integrity": "sha512-TfjKKprYe3n47od8auhvJ/Ikj9kQTbDTe71ynKlxslrvvUhlIV3VQSuwYuMWMbdz1fIs0H/fxCN1Z8/H3km6/A==" - }, - "node_modules/@remusao/trie": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@remusao/trie/-/trie-1.4.1.tgz", - "integrity": "sha512-yvwa+aCyYI/UjeD39BnpMypG8N06l86wIDW1/PAc6ihBRnodIfZDwccxQN3n1t74wduzaz74m4ZMHZnB06567Q==" - }, - "node_modules/@selderee/plugin-htmlparser2": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz", - "integrity": "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==", - "dependencies": { - "domhandler": "^5.0.3", - "selderee": "^0.11.0" - }, - "funding": { - "url": "https://ko-fi.com/killymxi" - } - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "node_modules/@types/chrome": { - "version": "0.0.228", - "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.228.tgz", - "integrity": "sha512-rDmyVEF+l9H+6FQYqsEGqQOjBw/uaSx6KJ6o47FwbQmPPcskmt8XlPbKjy5KeQXU3ZLiV2x45Fk4kdtRMSghfQ==", - "dependencies": { - "@types/filesystem": "*", - "@types/har-format": "*" - } - }, - "node_modules/@types/debug": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", - "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", - "dev": true, - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.44.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", - "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "peer": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", - "dev": true - }, - "node_modules/@types/filesystem": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.32.tgz", - "integrity": "sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ==", - "dependencies": { - "@types/filewriter": "*" - } - }, - "node_modules/@types/filewriter": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.29.tgz", - "integrity": "sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ==" - }, - "node_modules/@types/firefox-webext-browser": { - "version": "111.0.1", - "resolved": "https://registry.npmjs.org/@types/firefox-webext-browser/-/firefox-webext-browser-111.0.1.tgz", - "integrity": "sha512-mmHWdQTCT68X0hh0URrsIyWhJeFzZHaiprj6nni/CmsAmqYq27T0eZyu1ePeKJ/zuDD3wqtTzm5TwRFAso+oPw==" - }, - "node_modules/@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/har-format": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.12.tgz", - "integrity": "sha512-P20p/YBrqUBmzD6KhIQ8EiY4/RRzlekL4eCvfQnulFPfjmiGxKIoyCeI7qam5I7oKH3P8EU4ptEi0EfyGoLysw==" - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" - }, - "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "node_modules/@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.5.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", - "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==" - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "node_modules/@types/plist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.2.tgz", - "integrity": "sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*", - "xmlbuilder": ">=11.0.1" - } - }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==", - "dev": true - }, - "node_modules/@types/verror": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.6.tgz", - "integrity": "sha512-NNm+gdePAX1VGvPcGZCDKQZKYSiAWigKhKaz5KF94hG6f2s8de9Ow5+7AbXoeKxL8gavZfk4UquSAygOF2duEQ==", - "dev": true, - "optional": true - }, - "node_modules/@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.5.0.tgz", - "integrity": "sha512-2pktILyjvMaScU6iK3925uvGU87E+N9rh372uGZgiMYwafaw9SXq86U04XPq3UH6tzRvNgBsub6x2DacHc33lw==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.5.0", - "@typescript-eslint/type-utils": "6.5.0", - "@typescript-eslint/utils": "6.5.0", - "@typescript-eslint/visitor-keys": "6.5.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.5.0.tgz", - "integrity": "sha512-LMAVtR5GN8nY0G0BadkG0XIe4AcNMeyEy3DyhKGAh9k4pLSMBO7rF29JvDBpZGCmp5Pgz5RLHP6eCpSYZJQDuQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "6.5.0", - "@typescript-eslint/types": "6.5.0", - "@typescript-eslint/typescript-estree": "6.5.0", - "@typescript-eslint/visitor-keys": "6.5.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.5.0.tgz", - "integrity": "sha512-A8hZ7OlxURricpycp5kdPTH3XnjG85UpJS6Fn4VzeoH4T388gQJ/PGP4ole5NfKt4WDVhmLaQ/dBLNDC4Xl/Kw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.5.0", - "@typescript-eslint/visitor-keys": "6.5.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.5.0.tgz", - "integrity": "sha512-f7OcZOkRivtujIBQ4yrJNIuwyCQO1OjocVqntl9dgSIZAdKqicj3xFDqDOzHDlGCZX990LqhLQXWRnQvsapq8A==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "6.5.0", - "@typescript-eslint/utils": "6.5.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.5.0.tgz", - "integrity": "sha512-eqLLOEF5/lU8jW3Bw+8auf4lZSbbljHR2saKnYqON12G/WsJrGeeDHWuQePoEf9ro22+JkbPfWQwKEC5WwLQ3w==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.5.0.tgz", - "integrity": "sha512-q0rGwSe9e5Kk/XzliB9h2LBc9tmXX25G0833r7kffbl5437FPWb2tbpIV9wAATebC/018pGa9fwPDuvGN+LxWQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.5.0", - "@typescript-eslint/visitor-keys": "6.5.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.5.0.tgz", - "integrity": "sha512-9nqtjkNykFzeVtt9Pj6lyR9WEdd8npPhhIPM992FWVkZuS6tmxHfGVnlUcjpUP2hv8r4w35nT33mlxd+Be1ACQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.5.0", - "@typescript-eslint/types": "6.5.0", - "@typescript-eslint/typescript-estree": "6.5.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.5.0.tgz", - "integrity": "sha512-yCB/2wkbv3hPsh02ZS8dFQnij9VVQXJMN/gbQsaaY+zxALkZnxa/wagvLEFsAWMPv7d7lxQmNsIzGU1w/T/WyA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.5.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dev": true, - "peer": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, - "peer": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xhayper/discord-rpc": { - "version": "1.0.22", - "resolved": "https://registry.npmjs.org/@xhayper/discord-rpc/-/discord-rpc-1.0.22.tgz", - "integrity": "sha512-9NUse3AwmmLUgdY9PnI8tcm9ECRuuRRbdJwy7Osa3CPYF12EreTbIY/glEh5VHr66fcZy/IswGVnB477XOsTYA==", - "dependencies": { - "axios": "^1.4.0", - "discord-api-types": "^0.37.52", - "ws": "^8.13.0" - }, - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "peer": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "peer": true - }, - "node_modules/7zip-bin": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.1.1.tgz", - "integrity": "sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==", - "dev": true - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/abstract-socket": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/abstract-socket/-/abstract-socket-2.1.1.tgz", - "integrity": "sha512-YZJizsvS1aBua5Gd01woe4zuyYBGgSMeqDOB6/ChwdTI904KP6QGtJswXl4hcqWxbz86hQBe++HWV0hF1aGUtA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "linux" - ], - "dependencies": { - "bindings": "^1.2.1", - "nan": "^2.12.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "peer": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "dev": true, - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", - "dev": true, - "dependencies": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/aggregate-error/node_modules/clean-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/aggregate-error/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/app-builder-bin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-4.0.0.tgz", - "integrity": "sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==", - "dev": true - }, - "node_modules/app-builder-lib": { - "version": "24.6.3", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.6.3.tgz", - "integrity": "sha512-++0Zp7vcCHfXMBGVj7luFxpqvMPk5mcWeTuw7OK0xNAaNtYQTTN0d9YfWRsb1MvviTOOhyHeULWz1CaixrdrDg==", - "dev": true, - "dependencies": { - "@develar/schema-utils": "~2.6.5", - "@electron/notarize": "^1.2.3", - "@electron/osx-sign": "^1.0.4", - "@electron/universal": "1.3.4", - "@malept/flatpak-bundler": "^0.4.0", - "@types/fs-extra": "9.0.13", - "7zip-bin": "~5.1.1", - "async-exit-hook": "^2.0.1", - "bluebird-lst": "^1.0.9", - "builder-util": "24.5.0", - "builder-util-runtime": "9.2.1", - "chromium-pickle-js": "^0.2.0", - "debug": "^4.3.4", - "ejs": "^3.1.8", - "electron-publish": "24.5.0", - "form-data": "^4.0.0", - "fs-extra": "^10.1.0", - "hosted-git-info": "^4.1.0", - "is-ci": "^3.0.0", - "isbinaryfile": "^5.0.0", - "js-yaml": "^4.1.0", - "lazy-val": "^1.0.5", - "minimatch": "^5.1.1", - "read-config-file": "6.3.2", - "sanitize-filename": "^1.6.3", - "semver": "^7.3.8", - "tar": "^6.1.12", - "temp-file": "^3.4.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/app-builder-lib/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/app-builder-lib/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/app-builder-lib/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.find": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.2.2.tgz", - "integrity": "sha512-DRumkfW97iZGOfn+lIXbkVrXL04sfYKX+EfOodo8XboR5sxPDVvOjZTF/rysusa9lmhmSOeD6Vp6RKQP+eP4Tg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", - "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true - }, - "node_modules/async-exit-hook": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", - "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/async-mutex": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.4.0.tgz", - "integrity": "sha512-eJFZ1YhRR8UN8eBLoNzcDPcy/jqjsg6I1AP+KvWQX80BqOSW1oJPJXDylPUEeMr2ZQvHgnQ//Lp6f3RQ1zI7HA==", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/atomically": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", - "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/auto-changelog": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/auto-changelog/-/auto-changelog-2.4.0.tgz", - "integrity": "sha512-vh17hko1c0ItsEcw6m7qPRf3m45u+XK5QyCrrBFViElZ8jnKrPC1roSznrd1fIB/0vR/zawdECCRJtTuqIXaJw==", - "dev": true, - "dependencies": { - "commander": "^7.2.0", - "handlebars": "^4.7.7", - "node-fetch": "^2.6.1", - "parse-github-url": "^1.0.2", - "semver": "^7.3.5" - }, - "bin": { - "auto-changelog": "src/index.js" - }, - "engines": { - "node": ">=8.3" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axios": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", - "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", - "dependencies": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "node_modules/babel-runtime/node_modules/regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "optional": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "node_modules/bluebird-lst": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", - "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", - "dev": true, - "dependencies": { - "bluebird": "^3.5.5" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - }, - "node_modules/boolean": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", - "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", - "optional": true - }, - "node_modules/bplist-parser": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", - "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", - "dev": true, - "dependencies": { - "big-integer": "^1.6.44" - }, - "engines": { - "node": ">= 5.10.0" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-id3-writer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/browser-id3-writer/-/browser-id3-writer-5.0.0.tgz", - "integrity": "sha512-klFXmPe8kQN1y0ZrW411qmrUjJsb1gqPZ+Gb9ZcPKOmFF/8mA9dOZHXP9rGYsNCM8NAodZUFIzoKdl3tMvWsAA==" - }, - "node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "peer": true, - "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz", - "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==", - "dev": true, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/builder-util": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.5.0.tgz", - "integrity": "sha512-STnBmZN/M5vGcv01u/K8l+H+kplTaq4PAIn3yeuufUKSpcdro0DhJWxPI81k5XcNfC//bjM3+n9nr8F9uV4uAQ==", - "dev": true, - "dependencies": { - "@types/debug": "^4.1.6", - "7zip-bin": "~5.1.1", - "app-builder-bin": "4.0.0", - "bluebird-lst": "^1.0.9", - "builder-util-runtime": "9.2.1", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "debug": "^4.3.4", - "fs-extra": "^10.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-ci": "^3.0.0", - "js-yaml": "^4.1.0", - "source-map-support": "^0.5.19", - "stat-mode": "^1.0.0", - "temp-file": "^3.4.0" - } - }, - "node_modules/builder-util-runtime": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.1.tgz", - "integrity": "sha512-2rLv/uQD2x+dJ0J3xtsmI12AlRyk7p45TEbE/6o/fbb633e/S3pPgm+ct+JHsoY7r39dKHnGEFk/AASRFdnXmA==", - "dependencies": { - "debug": "^4.3.4", - "sax": "^1.2.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/builder-util/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/builder-util/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/builder-util/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/bundle-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", - "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", - "dev": true, - "dependencies": { - "run-applescript": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/butterchurn": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/butterchurn/-/butterchurn-2.6.7.tgz", - "integrity": "sha512-BJiRA8L0L2+84uoG2SSfkp0kclBuN+vQKf217pK7pMlwEO2ZEg3MtO2/o+l8Qpr8Nbejg8tmL1ZHD1jmhiaaqg==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "ecma-proposal-math-extensions": "0.0.2" - } - }, - "node_modules/butterchurn-presets": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/butterchurn-presets/-/butterchurn-presets-2.4.7.tgz", - "integrity": "sha512-4MdM8ripz/VfH1BCldrIKdAc/1ryJFBDvqlyow6Ivo1frwj0H3duzvSMFC7/wIjAjxb1QpwVHVqGqS9uAFKhpg==", - "dependencies": { - "babel-runtime": "^6.26.0", - "ecma-proposal-math-extensions": "0.0.2", - "lodash": "^4.17.4" - } - }, - "node_modules/cacache": { - "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^7.7.1", - "minipass": "^7.0.3", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/cacache/node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", - "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/cacache/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/cacache/node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-keys": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", - "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", - "dev": true, - "dependencies": { - "camelcase": "^6.3.0", - "map-obj": "^4.1.0", - "quick-lru": "^5.1.1", - "type-fest": "^1.2.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-keys/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001524", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001524.tgz", - "integrity": "sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "peer": true - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", - "engines": { - "node": "*" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/chromium-pickle-js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", - "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", - "dev": true - }, - "node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/clean-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", - "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/clean-regexp/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "optional": true, - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true - }, - "node_modules/compare-version": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", - "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/conf": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/conf/-/conf-10.2.0.tgz", - "integrity": "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==", - "dependencies": { - "ajv": "^8.6.3", - "ajv-formats": "^2.1.1", - "atomically": "^1.7.0", - "debounce-fn": "^4.0.0", - "dot-prop": "^6.0.1", - "env-paths": "^2.2.1", - "json-schema-typed": "^7.0.3", - "onetime": "^5.1.2", - "pkg-up": "^3.1.0", - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/conf/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/conf/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/config-file-ts": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.4.tgz", - "integrity": "sha512-cKSW0BfrSaAUnxpgvpXPLaaW/umg4bqg4k3GO1JqlRfpx+d5W0GDXznCMkWotJQek5Mmz1MJVChQnz3IVaeMZQ==", - "dev": true, - "dependencies": { - "glob": "^7.1.6", - "typescript": "^4.0.2" - } - }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, - "node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", - "hasInstallScript": true - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true - }, - "node_modules/cosmiconfig": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", - "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", - "dev": true, - "dependencies": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - } - }, - "node_modules/crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "dev": true, - "optional": true, - "dependencies": { - "buffer": "^5.1.0" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", - "engines": { - "node": "*" - } - }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" - }, - "node_modules/custom-electron-prompt": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/custom-electron-prompt/-/custom-electron-prompt-1.5.7.tgz", - "integrity": "sha512-ptRPJr6CpT06GWLMtg3GD2Lr7gWfXdWI+hR1S39eq+m/mUa2E118YmX6mPCbHdg5QB/W9UVhSpRqBM8FUh1G8w==", - "peerDependencies": { - "electron": ">=10.0.0" - } - }, - "node_modules/custom-electron-titlebar": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/custom-electron-titlebar/-/custom-electron-titlebar-4.2.7.tgz", - "integrity": "sha512-5sROnS5jH8jaFsjMwID7aPwnohBJ4HU0dSx81qSGAaznnblc3067D8pyl/zOwj/WosoOPHV2837jbT3j4whvHw==", - "peerDependencies": { - "electron": ">20.0.0" - } - }, - "node_modules/dbus-next": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/dbus-next/-/dbus-next-0.9.2.tgz", - "integrity": "sha512-tzQq/+wrTZ2yU+U5PoeXc97KABhX2v55C/T0finH3tSKYuI8H/SqppIFymBBrUHcK13LvEGY3vdj3ikPPenL5g==", - "dependencies": { - "@nornagon/put": "0.0.8", - "event-stream": "3.3.4", - "hexy": "^0.2.10", - "jsbi": "^2.0.5", - "long": "^4.0.0", - "safe-buffer": "^5.1.1", - "xml2js": "^0.4.17" - }, - "optionalDependencies": { - "abstract-socket": "^2.0.0" - } - }, - "node_modules/debounce-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", - "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", - "dependencies": { - "mimic-fn": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", - "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decamelize-keys/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dependencies": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", - "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", - "dev": true, - "dependencies": { - "bundle-name": "^3.0.0", - "default-browser-id": "^3.0.0", - "execa": "^7.1.1", - "titleize": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", - "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", - "dev": true, - "dependencies": { - "bplist-parser": "^0.2.0", - "untildify": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/default-browser/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true, - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/default-browser/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "engines": { - "node": ">=10" - } - }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/del": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-7.0.0.tgz", - "integrity": "sha512-tQbV/4u5WVB8HMJr08pgw0b6nG4RGt/tj+7Numvq+zqcvUFeMaIWWOUFltiU+6go8BSO2/ogsB4EasDaj0y68Q==", - "dev": true, - "dependencies": { - "globby": "^13.1.2", - "graceful-fs": "^4.2.10", - "is-glob": "^4.0.3", - "is-path-cwd": "^3.0.0", - "is-path-inside": "^4.0.0", - "p-map": "^5.5.0", - "rimraf": "^3.0.2", - "slash": "^4.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/del-cli": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/del-cli/-/del-cli-5.0.1.tgz", - "integrity": "sha512-hCDHJd0u0jKFqizgInYXZaILsqOIA7Zl6e7M3hJwP+SlwUAgtV/EB22EPF4e2+9VAVnBDQQBE6tDRe+/UuoFhg==", - "dev": true, - "dependencies": { - "del": "^7.0.0", - "meow": "^10.1.3" - }, - "bin": { - "del": "cli.js", - "del-cli": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "optional": true - }, - "node_modules/dir-compare": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", - "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==", - "dev": true, - "dependencies": { - "buffer-equal": "^1.0.0", - "minimatch": "^3.0.4" - } - }, - "node_modules/dir-compare/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/dir-compare/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/discord-api-types": { - "version": "0.37.55", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.55.tgz", - "integrity": "sha512-XIf8AELxg76AH1WzrgB5ziFyIxSs4tLK1XGjFs4oE6t7M7r1B0Chdylaz76ALhvRXAUBGHGFXu/pKAa5Q+LbQg==" - }, - "node_modules/dmg-builder": { - "version": "24.6.3", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.6.3.tgz", - "integrity": "sha512-O7KNT7OKqtV54fMYUpdlyTOCP5DoPuRMLqMTgxxV2PO8Hj/so6zOl5o8GTs8pdDkeAhJzCFOUNB3BDhgXbUbJg==", - "dev": true, - "dependencies": { - "app-builder-lib": "24.6.3", - "builder-util": "24.5.0", - "builder-util-runtime": "9.2.1", - "fs-extra": "^10.1.0", - "iconv-lite": "^0.6.2", - "js-yaml": "^4.1.0" - }, - "optionalDependencies": { - "dmg-license": "^1.0.11" - } - }, - "node_modules/dmg-builder/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dmg-builder/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/dmg-builder/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/dmg-license": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", - "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "@types/plist": "^3.0.1", - "@types/verror": "^1.10.3", - "ajv": "^6.10.0", - "crc": "^3.8.0", - "iconv-corefoundation": "^1.1.7", - "plist": "^3.0.4", - "smart-buffer": "^4.0.2", - "verror": "^1.10.0" - }, - "bin": { - "dmg-license": "bin/dmg-license.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dotenv": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", - "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/ecma-proposal-math-extensions": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/ecma-proposal-math-extensions/-/ecma-proposal-math-extensions-0.0.2.tgz", - "integrity": "sha512-80BnDp2Fn7RxXlEr5HHZblniY4aQ97MOAicdWWpSo0vkQiISSE9wLR4SqxKsu4gCtXFBIPPzy8JMhay4NWRg/Q==" - }, - "node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", - "dev": true, - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/electron/-/electron-26.1.0.tgz", - "integrity": "sha512-qEh19H09Pysn3ibms5nZ0haIh5pFoOd7/5Ww7gzmAwDQOulRi8Sa2naeueOyIb1GKpf+6L4ix3iceYRAuA5r5Q==", - "hasInstallScript": true, - "dependencies": { - "@electron/get": "^2.0.0", - "@types/node": "^18.11.18", - "extract-zip": "^2.0.1" - }, - "bin": { - "electron": "cli.js" - }, - "engines": { - "node": ">= 12.20.55" - } - }, - "node_modules/electron-better-web-request": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/electron-better-web-request/-/electron-better-web-request-1.0.1.tgz", - "integrity": "sha512-euwLeL82k6fbVODfH5Uz9c4BN047/XyYKfsZcaFhdWfqx05JPu2J0xE7nciJ/1Bb0sTClU1FDLW5H2zQWBB5Gw==", - "dependencies": { - "url-match-patterns": "^0.2.0", - "uuid": "^3.3.2" - } - }, - "node_modules/electron-builder": { - "version": "24.6.3", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.6.3.tgz", - "integrity": "sha512-O6PqhRXwfxCNTXI4BlhELSeYYO6/tqlxRuy+4+xKBokQvwDDjDgZMMoSgAmanVSCuzjE7MZldI9XYrKFk+EQDw==", - "dev": true, - "dependencies": { - "app-builder-lib": "24.6.3", - "builder-util": "24.5.0", - "builder-util-runtime": "9.2.1", - "chalk": "^4.1.2", - "dmg-builder": "24.6.3", - "fs-extra": "^10.1.0", - "is-ci": "^3.0.0", - "lazy-val": "^1.0.5", - "read-config-file": "6.3.2", - "simple-update-notifier": "2.0.0", - "yargs": "^17.6.2" - }, - "bin": { - "electron-builder": "cli.js", - "install-app-deps": "install-app-deps.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/electron-builder/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-builder/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-builder/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/electron-debug": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/electron-debug/-/electron-debug-3.2.0.tgz", - "integrity": "sha512-7xZh+LfUvJ52M9rn6N+tPuDw6oRAjxUj9SoxAZfJ0hVCXhZCsdkrSt7TgXOiWiEOBgEV8qwUIO/ScxllsPS7ow==", - "dependencies": { - "electron-is-dev": "^1.1.0", - "electron-localshortcut": "^3.1.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/electron-devtools-installer": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/electron-devtools-installer/-/electron-devtools-installer-3.2.0.tgz", - "integrity": "sha512-t3UczsYugm4OAbqvdImMCImIMVdFzJAHgbwHpkl5jmfu1izVgUcP/mnrPqJIpEeCK1uZGpt+yHgWEN+9EwoYhQ==", - "dev": true, - "dependencies": { - "rimraf": "^3.0.2", - "semver": "^7.2.1", - "tslib": "^2.1.0", - "unzip-crx-3": "^0.2.0" - } - }, - "node_modules/electron-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/electron-is/-/electron-is-3.0.0.tgz", - "integrity": "sha512-aQv1y3WrDZ+mtO8acbhiiip/8fa0Et7cvZyvlqJm2H7fih4hiJWEFRyYxzLgDG2kmiLdF8l3y5tbek5JFOPQkQ==", - "dependencies": { - "electron-is-dev": "^0.3.0", - "semver": "^5.5.0" - } - }, - "node_modules/electron-is-accelerator": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/electron-is-accelerator/-/electron-is-accelerator-0.1.2.tgz", - "integrity": "sha512-fLGSAjXZtdn1sbtZxx52+krefmtNuVwnJCV2gNiVt735/ARUboMl8jnNC9fZEqQdlAv2ZrETfmBUsoQci5evJA==" - }, - "node_modules/electron-is-dev": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-1.2.0.tgz", - "integrity": "sha512-R1oD5gMBPS7PVU8gJwH6CtT0e6VSoD0+SzSnYpNm+dBkcijgA+K7VAMHDfnRq/lkKPZArpzplTW6jfiMYosdzw==" - }, - "node_modules/electron-is/node_modules/electron-is-dev": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-0.3.0.tgz", - "integrity": "sha512-jLttuuq8QK67n3mXmIe9pkrO7IH3LGIk12xJkhTmc852U2sCJaRAOpRGPSh+1Xnzck5v9escd9YXzuze9nGejg==" - }, - "node_modules/electron-is/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/electron-localshortcut": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/electron-localshortcut/-/electron-localshortcut-3.2.1.tgz", - "integrity": "sha512-DWvhKv36GsdXKnaFFhEiK8kZZA+24/yFLgtTwJJHc7AFgDjNRIBJZ/jq62Y/dWv9E4ypYwrVWN2bVrCYw1uv7Q==", - "dependencies": { - "debug": "^4.0.1", - "electron-is-accelerator": "^0.1.0", - "keyboardevent-from-electron-accelerator": "^2.0.0", - "keyboardevents-areequal": "^0.2.1" - } - }, - "node_modules/electron-publish": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.5.0.tgz", - "integrity": "sha512-zwo70suH15L15B4ZWNDoEg27HIYoPsGJUF7xevLJLSI7JUPC8l2yLBdLGwqueJ5XkDL7ucYyRZzxJVR8ElV9BA==", - "dev": true, - "dependencies": { - "@types/fs-extra": "^9.0.11", - "builder-util": "24.5.0", - "builder-util-runtime": "9.2.1", - "chalk": "^4.1.2", - "fs-extra": "^10.1.0", - "lazy-val": "^1.0.5", - "mime": "^2.5.2" - } - }, - "node_modules/electron-publish/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-publish/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-publish/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/electron-store": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/electron-store/-/electron-store-8.1.0.tgz", - "integrity": "sha512-2clHg/juMjOH0GT9cQ6qtmIvK183B39ZXR0bUoPwKwYHJsEF3quqyDzMFUAu+0OP8ijmN2CbPRAelhNbWUbzwA==", - "dependencies": { - "conf": "^10.2.0", - "type-fest": "^2.17.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.504", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.504.tgz", - "integrity": "sha512-cSMwIAd8yUh54VwitVRVvHK66QqHWE39C3DRj8SWiXitEpVSY3wNPD9y1pxQtLIi4w3UdzF9klLsmuPshz09DQ==", - "dev": true, - "peer": true - }, - "node_modules/electron-unhandled": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/electron-unhandled/-/electron-unhandled-4.0.1.tgz", - "integrity": "sha512-6BsLnBg+i96eUnbaIFZyYdyfNX3f80/Nlfqy34YEMxXT9JP3ddNsNnUeiOF8ezN4+et4t4D37gjghKTP0V3jyw==", - "dependencies": { - "clean-stack": "^2.1.0", - "electron-is-dev": "^2.0.0", - "ensure-error": "^2.0.0", - "lodash.debounce": "^4.0.8", - "serialize-error": "^8.1.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/electron-unhandled/node_modules/electron-is-dev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-2.0.0.tgz", - "integrity": "sha512-3X99K852Yoqu9AcW50qz3ibYBWY79/pBhlMCab8ToEWS48R0T9tyxRiQhwylE7zQdXrMnx2JKqUJyMPmt5FBqA==", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/electron-updater": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-6.1.1.tgz", - "integrity": "sha512-IBT3zJ4yO5UZMF2gOTC9HrlmG4OYSRtOiHKzNAShJvfuicdx6UaXoa6AvhcTxdx6zf/rJyFMRBISS9jhVwTfow==", - "dependencies": { - "builder-util-runtime": "9.2.1", - "fs-extra": "^10.1.0", - "js-yaml": "^4.1.0", - "lazy-val": "^1.0.5", - "lodash.escaperegexp": "^4.1.2", - "lodash.isequal": "^4.5.0", - "semver": "^7.3.8", - "typed-emitter": "^2.1.0" - } - }, - "node_modules/electron-updater/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-updater/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-updater/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/electron/node_modules/@types/node": { - "version": "18.17.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.12.tgz", - "integrity": "sha512-d6xjC9fJ/nSnfDeU0AMDsaJyb1iHsqCSOdi84w4u+SlN/UgQdY5tRhpMzaFYsI4mnpvgTivEaQd0yOUhAtOnEQ==" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhance-visitors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/enhance-visitors/-/enhance-visitors-1.0.0.tgz", - "integrity": "sha512-+29eJLiUixTEDRaZ35Vu8jP3gPLNcQQkQkOQjLp2X+6cZGGPDD/uasbFzvLsJKnGZnvmyZ0srxudwOtskHeIDA==", - "dev": true, - "dependencies": { - "lodash": "^4.13.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", - "integrity": "sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.2.0", - "tapable": "^0.1.8" - }, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/ensure-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ensure-error/-/ensure-error-2.1.0.tgz", - "integrity": "sha512-+BMSJHw9gxiJAAp2ZR1E0TNcL09dD3lOvkl7WVm4+Y6xnes/pMetP/TzCHiDduh8ihNDjbGfuYxl7l4PA1xZ8A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-editor": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-1.1.0.tgz", - "integrity": "sha512-7AXskzN6T7Q9TFcKAGJprUbpQa4i1VsAetO9rdBqbGMGlragTziBgWt4pVYJMBWHQlLoX0buy6WFikzPH4Qjpw==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", - "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.1", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.1", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "safe-array-concat": "^1.0.0", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-module-lexer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", - "dev": true, - "peer": true - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "optional": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "devOptional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", - "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.48.0", - "@humanwhocodes/config-array": "^0.11.10", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", - "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-config-xo": { - "version": "0.43.1", - "resolved": "https://registry.npmjs.org/eslint-config-xo/-/eslint-config-xo-0.43.1.tgz", - "integrity": "sha512-azv1L2PysRA0NkZOgbndUpN+581L7wPqkgJOgxxw3hxwXAbJgD6Hqb/SjHRiACifXt/AvxCzE/jIKFAlI7XjvQ==", - "dev": true, - "dependencies": { - "confusing-browser-globals": "1.0.11" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - }, - "peerDependencies": { - "eslint": ">=8.27.0" - } - }, - "node_modules/eslint-config-xo-typescript": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-xo-typescript/-/eslint-config-xo-typescript-1.0.1.tgz", - "integrity": "sha512-vPQssnRSUgBFOEfB/KY12CXwltwFSn4RSCfa+w7gjBC2PFQ7Yfgmyei+1XUZ3K+8LRGef2NMJUcxts7PldhDjg==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": ">=6.0.0", - "@typescript-eslint/parser": ">=6.0.0", - "eslint": ">=8.0.0", - "typescript": ">=4.7" - } - }, - "node_modules/eslint-formatter-pretty": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-5.0.0.tgz", - "integrity": "sha512-Uick451FoL22/wXqyScX3inW8ZlD/GQO7eFXj3bqb6N/ZtuuF00/CwSNIKLbFCJPrX5V4EdQBSgJ/UVnmLRnug==", - "dev": true, - "dependencies": { - "@types/eslint": "^8.0.0", - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "eslint-rule-docs": "^1.1.235", - "log-symbols": "^4.0.0", - "plur": "^4.0.0", - "string-width": "^4.2.0", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-import-resolver-webpack": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.13.7.tgz", - "integrity": "sha512-2a+meyMeABBRO4K53Oj1ygkmt5lhQS79Lmx2f684Qnv6gjvD4RLOM5jfPGTXwQ0A2K03WSoKt3HRQu/uBgxF7w==", - "dev": true, - "dependencies": { - "array.prototype.find": "^2.2.1", - "debug": "^3.2.7", - "enhanced-resolve": "^0.9.1", - "find-root": "^1.1.0", - "has": "^1.0.3", - "interpret": "^1.4.0", - "is-core-module": "^2.13.0", - "is-regex": "^1.1.4", - "lodash": "^4.17.21", - "resolve": "^2.0.0-next.4", - "semver": "^5.7.2" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "eslint-plugin-import": ">=1.4.0", - "webpack": ">=1.11.0" - } - }, - "node_modules/eslint-import-resolver-webpack/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-webpack/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-ava": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-ava/-/eslint-plugin-ava-14.0.0.tgz", - "integrity": "sha512-XmKT6hppaipwwnLVwwvQliSU6AF1QMHiNoLD5JQfzhUhf0jY7CO0O624fQrE+Y/fTb9vbW8r77nKf7M/oHulxw==", - "dev": true, - "dependencies": { - "enhance-visitors": "^1.0.0", - "eslint-utils": "^3.0.0", - "espree": "^9.0.0", - "espurify": "^2.1.1", - "import-modules": "^2.1.0", - "micro-spelling-correcter": "^1.1.1", - "pkg-dir": "^5.0.0", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=14.17 <15 || >=16.4" - }, - "peerDependencies": { - "eslint": ">=8.26.0" - } - }, - "node_modules/eslint-plugin-es-x": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.2.0.tgz", - "integrity": "sha512-9dvv5CcvNjSJPqnS5uZkqb3xmbeqRLnvXKK7iI5+oK/yTusyc46zbBZKENGsOfojm/mKfszyZb+wNqNPAPeGXA==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.1.2", - "@eslint-community/regexpp": "^4.6.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - }, - "peerDependencies": { - "eslint": ">=8" - } - }, - "node_modules/eslint-plugin-eslint-comments": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", - "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5", - "ignore": "^5.0.5" - }, - "engines": { - "node": ">=6.5.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" - } - }, - "node_modules/eslint-plugin-eslint-comments/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint-plugin-import/node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-n": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.2.tgz", - "integrity": "sha512-Y66uDfUNbBzypsr0kELWrIz+5skicECrLUqlWuXawNSLUq3ltGlCwu6phboYYOTSnoTdHgTLrc+5Ydo6KjzZog==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "builtins": "^5.0.1", - "eslint-plugin-es-x": "^7.1.0", - "ignore": "^5.2.4", - "is-core-module": "^2.12.1", - "minimatch": "^3.1.2", - "resolve": "^1.22.2", - "semver": "^7.5.3" - }, - "engines": { - "node": ">=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-n/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint-plugin-n/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint-plugin-n/node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-no-use-extend-native": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-use-extend-native/-/eslint-plugin-no-use-extend-native-0.5.0.tgz", - "integrity": "sha512-dBNjs8hor8rJgeXLH4HTut5eD3RGWf9JUsadIfuL7UosVQ/dnvOKwxEcRrXrFxrMZ8llUVWT+hOimxJABsAUzQ==", - "dev": true, - "dependencies": { - "is-get-set-prop": "^1.0.0", - "is-js-type": "^2.0.0", - "is-obj-prop": "^1.0.0", - "is-proto-prop": "^2.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", - "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.5" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-unicorn": { - "version": "48.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-48.0.1.tgz", - "integrity": "sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "@eslint-community/eslint-utils": "^4.4.0", - "ci-info": "^3.8.0", - "clean-regexp": "^1.0.0", - "esquery": "^1.5.0", - "indent-string": "^4.0.0", - "is-builtin-module": "^3.2.1", - "jsesc": "^3.0.2", - "lodash": "^4.17.21", - "pluralize": "^8.0.0", - "read-pkg-up": "^7.0.1", - "regexp-tree": "^0.1.27", - "regjsparser": "^0.10.0", - "semver": "^7.5.4", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" - }, - "peerDependencies": { - "eslint": ">=8.44.0" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/eslint-plugin-unicorn/node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint-rule-docs": { - "version": "1.1.235", - "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.235.tgz", - "integrity": "sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A==", - "dev": true - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/eslint/node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/esm-utils": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/esm-utils/-/esm-utils-4.1.2.tgz", - "integrity": "sha512-hYKPzOCkAU11rMIiH6gvvReARaSLiRhJkGWPcwJB/S4zg7em//YKAcRxwZYw4sW5mRmI6lhV59wWWTdWKwOXvQ==", - "dev": true, - "dependencies": { - "import-meta-resolve": "2.2.2", - "url-or-path": "2.1.0" - }, - "funding": { - "url": "https://github.com/fisker/esm-utils?sponsor=1" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espurify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/espurify/-/espurify-2.1.1.tgz", - "integrity": "sha512-zttWvnkhcDyGOhSH4vO2qCBILpdCMv/MX8lp4cqgRkQoDRGK2oZxi2GfWhlP2dIXmk7BaKeOTuzbHhyC68o8XQ==", - "dev": true - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", - "dependencies": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "dev": true - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extsprintf": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", - "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "optional": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "optional": true - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filename-reserved-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/filenamify": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", - "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", - "dependencies": { - "filename-reserved-regex": "^2.0.0", - "strip-outer": "^1.0.1", - "trim-repeated": "^1.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "dev": true, - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/find-cache-dir/node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "dev": true, - "dependencies": { - "find-up": "^6.3.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "dev": true - }, - "node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/flat-cache": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", - "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", - "dev": true, - "dependencies": { - "flatted": "^3.2.7", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==" - }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "dev": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-set-props": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-set-props/-/get-set-props-0.1.0.tgz", - "integrity": "sha512-7oKuKzAGKj0ag+eWZwcGw2fjiZ78tXnXQoBgY0aU7ZOxTu4bB7hSuQSDgtKy978EDH062P5FmD2EWiDpQS9K9Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/get-stdin": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", - "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.0.tgz", - "integrity": "sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "peer": true - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/global-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", - "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - }, - "engines": { - "node": ">=10.0" - } - }, - "node_modules/global-agent/node_modules/serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "optional": true, - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-agent/node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globals/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "devOptional": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "dev": true, - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "node_modules/hexy": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/hexy/-/hexy-0.2.11.tgz", - "integrity": "sha512-ciq6hFsSG/Bpt2DmrZJtv+56zpPdnq+NQ4ijEFrveKN0ZG1mhl/LdT1NQZ9se6ty1fACcI4d4vYqC9v8EYpH2A==", - "bin": { - "hexy": "bin/hexy_cmd.js" - } - }, - "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/howler": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/howler/-/howler-2.2.3.tgz", - "integrity": "sha512-QM0FFkw0LRX1PR8pNzJVAY25JhIWvbKMBFM4gqk+QdV+kPXOhleWGCB6AiAF/goGjIHK2e/nIElplvjQwhr0jg==" - }, - "node_modules/html-escaper": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", - "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==" - }, - "node_modules/html-to-text": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz", - "integrity": "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==", - "dependencies": { - "@selderee/plugin-htmlparser2": "^0.11.0", - "deepmerge": "^4.3.1", - "dom-serializer": "^2.0.0", - "htmlparser2": "^8.0.2", - "selderee": "^0.11.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/iconv-corefoundation": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", - "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "cli-truncate": "^2.1.0", - "node-addon-api": "^1.6.3" - }, - "engines": { - "node": "^8.11.2 || >=10" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "devOptional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dev": true - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-meta-resolve": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-2.2.2.tgz", - "integrity": "sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/import-modules": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-modules/-/import-modules-2.1.0.tgz", - "integrity": "sha512-8HEWcnkbGpovH9yInoisxaSoIg9Brbul+Ju3Kqe2UsYDUBJD/iQjSgEj0zPcTDPKfPp2fs5xlv1i+JSye/m1/A==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, - "node_modules/irregular-plurals": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz", - "integrity": "sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "dependencies": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", - "dev": true, - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-get-set-prop": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-get-set-prop/-/is-get-set-prop-1.0.0.tgz", - "integrity": "sha512-DvAYZ1ZgGUz4lzxKMPYlt08qAUqyG9ckSg2pIjfvcQ7+pkVNUHk8yVLXOnCLe5WKXhLop8oorWFBJHpwWQpszQ==", - "dev": true, - "dependencies": { - "get-set-props": "^0.1.0", - "lowercase-keys": "^1.0.0" - } - }, - "node_modules/is-get-set-prop/node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dev": true, - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-inside-container/node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-js-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-js-type/-/is-js-type-2.0.0.tgz", - "integrity": "sha512-Aj13l47+uyTjlQNHtXBV8Cji3jb037vxwMWCgopRR8h6xocgBGW3qG8qGlIOEmbXQtkKShKuBM9e8AA1OeQ+xw==", - "dev": true, - "dependencies": { - "js-types": "^1.0.0" - } - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "node_modules/is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-obj-prop": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-obj-prop/-/is-obj-prop-1.0.0.tgz", - "integrity": "sha512-5Idb61slRlJlsAzi0Wsfwbp+zZY+9LXKUAZpvT/1ySw+NxKLRWfa0Bzj+wXI3fX5O9hiddm5c3DAaRSNP/yl2w==", - "dev": true, - "dependencies": { - "lowercase-keys": "^1.0.0", - "obj-props": "^1.0.0" - } - }, - "node_modules/is-obj-prop/node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-3.0.0.tgz", - "integrity": "sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-path-inside": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", - "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-proto-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-proto-prop/-/is-proto-prop-2.0.0.tgz", - "integrity": "sha512-jl3NbQ/fGLv5Jhan4uX+Ge9ohnemqyblWVVCpAvtTQzNFvV2xhJq+esnkIbYQ9F1nITXoLfDDQLp7LBw/zzncg==", - "dev": true, - "dependencies": { - "lowercase-keys": "^1.0.0", - "proto-props": "^2.0.0" - } - }, - "node_modules/is-proto-prop/node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "dependencies": { - "is-unc-path": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.11" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "dependencies": { - "unc-path-regex": "^0.1.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isbinaryfile": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.0.tgz", - "integrity": "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==", - "dev": true, - "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/jackspeak": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.0.tgz", - "integrity": "sha512-uKmsITSsF4rUWQHzqaRUuyAir3fZfW3f202Ee34lz/gZCi970CPZwyQXLGNgWJvvZbvFyzeyGq0+4fcG/mBKZg==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", - "dev": true, - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jake/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/jake/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jintr": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jintr/-/jintr-1.1.0.tgz", - "integrity": "sha512-Tu9wk3BpN2v+kb8yT6YBtue+/nbjeLFv4vvVC4PJ7oCidHKbifWhvORrAbQfxVIQZG+67am/mDagpiGSVtvrZg==", - "funding": [ - "https://github.com/sponsors/LuanRT" - ], - "dependencies": { - "acorn": "^8.8.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-types": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/js-types/-/js-types-1.0.0.tgz", - "integrity": "sha512-bfwqBW9cC/Lp7xcRpug7YrXm0IVw+T9e3g4mCYnv0Pjr3zIzU9PCQElYU9oSGAWzXlbdl9X5SAMPejO9sxkeUw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbi": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-2.0.5.tgz", - "integrity": "sha512-TzO/62Hxeb26QMb4IGlI/5X+QLr9Uqp1FPkwp2+KOICW+Q+vSuFj61c8pkT6wAns4WcK56X7CmSHhJeDGWOqxQ==" - }, - "node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-schema-typed": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", - "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "optional": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jszip": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", - "dev": true, - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "node_modules/jszip/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/jszip/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/jszip/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/jszip/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/keyboardevent-from-electron-accelerator": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/keyboardevent-from-electron-accelerator/-/keyboardevent-from-electron-accelerator-2.0.0.tgz", - "integrity": "sha512-iQcmNA0M4ETMNi0kG/q0h/43wZk7rMeKYrXP7sqKIJbHkTU8Koowgzv+ieR/vWJbOwxx5nDC3UnudZ0aLSu4VA==" - }, - "node_modules/keyboardevents-areequal": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/keyboardevents-areequal/-/keyboardevents-areequal-0.2.2.tgz", - "integrity": "sha512-Nv+Kr33T0mEjxR500q+I6IWisOQ0lK1GGOncV0kWE6n4KFmpcu7RUX5/2B0EUtX51Cb0HjZ9VJsSY3u4cBa0kw==" - }, - "node_modules/keyv": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lazy-val": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", - "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==" - }, - "node_modules/leac": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz", - "integrity": "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==", - "funding": { - "url": "https://ko-fi.com/killymxi" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dev": true, - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/line-column-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/line-column-path/-/line-column-path-3.0.0.tgz", - "integrity": "sha512-Atocnm7Wr9nuvAn97yEPQa3pcQI5eLQGBz+m6iTb+CVw+IOzYB9MrYK7jI7BfC9ISnT4Fu0eiwhAScV//rp4Hw==", - "dev": true, - "dependencies": { - "type-fest": "^2.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/linkedom": { - "version": "0.14.26", - "resolved": "https://registry.npmjs.org/linkedom/-/linkedom-0.14.26.tgz", - "integrity": "sha512-mK6TrydfFA7phrnp+1j57ycBwFI5bGSW6YXlw9acHoqF+mP/y+FooEYYyniOt5Ot57FSKB3iwmnuQ1UUyNLm5A==", - "dependencies": { - "css-select": "^5.1.0", - "cssom": "^0.5.0", - "html-escaper": "^3.0.3", - "htmlparser2": "^8.0.1", - "uhyphen": "^0.2.0" - } - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==" - }, - "node_modules/matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "optional": true, - "dependencies": { - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "dependencies": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } - }, - "node_modules/memory-fs": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", - "integrity": "sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng==", - "dev": true - }, - "node_modules/meow": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", - "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.2", - "camelcase-keys": "^7.0.0", - "decamelize": "^5.0.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.2", - "read-pkg-up": "^8.0.0", - "redent": "^4.0.0", - "trim-newlines": "^4.0.2", - "type-fest": "^1.2.2", - "yargs-parser": "^20.2.9" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micro-spelling-correcter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/micro-spelling-correcter/-/micro-spelling-correcter-1.1.1.tgz", - "integrity": "sha512-lkJ3Rj/mtjlRcHk6YyCbvZhyWTOzdBvTHsxMmZSk5jxN1YyVSQ+JETAom55mdzfcyDrY/49Z7UCW760BK30crg==", - "dev": true - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/miniget": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/miniget/-/miniget-4.2.3.tgz", - "integrity": "sha512-SjbDPDICJ1zT+ZvQwK0hUcRY4wxlhhNpHL9nJOB2MEAXRGagTljsO8MEDzQMTFf0Q8g4QNi8P9lEm/g7e+qgzA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mpris-service": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/mpris-service/-/mpris-service-2.1.2.tgz", - "integrity": "sha512-AC6WepCnFWwOME9OWplHZ8ps/BB+g9QrEpUKCv7wX82fDPzR3nPrypOFmL/Fm0JloEAu6QTWSfDLLc6mM/jinw==", - "dependencies": { - "dbus-next": "^0.9.2", - "deep-equal": "^1.0.1", - "source-map-support": "^0.5.11" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", - "optional": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/node-addon-api": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", - "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", - "dev": true, - "optional": true - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-gyp": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", - "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^11.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" - } - }, - "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true, - "peer": true - }, - "node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "dev": true, - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "dev": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/obj-props": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/obj-props/-/obj-props-1.4.0.tgz", - "integrity": "sha512-p7p/7ltzPDiBs6DqxOrIbtRdwxxVRBj5ROukeNb9RgA+fawhrz5n2hpNz8DDmYR//tviJSj7nUnlppGmONkjiQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/onetime/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open-editor": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/open-editor/-/open-editor-4.1.1.tgz", - "integrity": "sha512-SYtGeZ9Zkzj/naoZaEF9LzwDYEGwuqQ4Fx5E3xdVRN98LFJjvMhG/ElByFEOVOiXepGra/Wi1fA4i/E1fXSBsw==", - "dev": true, - "dependencies": { - "env-editor": "^1.1.0", - "execa": "^5.1.1", - "line-column-path": "^3.0.0", - "open": "^8.4.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open/node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-map": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", - "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", - "dev": true, - "dependencies": { - "aggregate-error": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-github-url": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", - "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", - "dev": true, - "bin": { - "parse-github-url": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parseley": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.12.1.tgz", - "integrity": "sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==", - "dependencies": { - "leac": "^0.6.0", - "peberminta": "^0.9.0" - }, - "funding": { - "url": "https://ko-fi.com/killymxi" - } - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", - "dev": true, - "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", - "dependencies": { - "through": "~2.3" - } - }, - "node_modules/peberminta": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.9.0.tgz", - "integrity": "sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==", - "funding": { - "url": "https://ko-fi.com/killymxi" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", - "dev": true, - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/playwright": { - "version": "1.37.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.37.1.tgz", - "integrity": "sha512-bgUXRrQKhT48zHdxDYQTpf//0xDfDd5hLeEhjuSw8rXEGoT9YeElpfvs/izonTNY21IQZ7d3s22jLxYaAnubbQ==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "playwright-core": "1.37.1" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/playwright-core": { - "version": "1.37.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.37.1.tgz", - "integrity": "sha512-17EuQxlSIYCmEMwzMqusJ2ztDgJePjrbttaefgdsiqeLWidjYz9BxXaTaZWxH1J95SHGk6tjE+dwgWILJoUZfA==", - "dev": true, - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/plist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", - "dev": true, - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=10.4.0" - } - }, - "node_modules/plur": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", - "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", - "dev": true, - "dependencies": { - "irregular-plurals": "^3.2.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz", - "integrity": "sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/proto-props": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/proto-props/-/proto-props-2.0.0.tgz", - "integrity": "sha512-2yma2tog9VaRZY2mn3Wq51uiSW4NcPYT1cQdBagwyrznrilKSZwIZ0UG3ZPL/mx+axEns0hE35T5ufOYZXEnBQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "peer": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/read-config-file": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.3.2.tgz", - "integrity": "sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==", - "dev": true, - "dependencies": { - "config-file-ts": "^0.2.4", - "dotenv": "^9.0.2", - "dotenv-expand": "^5.1.0", - "js-yaml": "^4.1.0", - "json5": "^2.2.0", - "lazy-val": "^1.0.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/read-pkg": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", - "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", - "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", - "dev": true, - "dependencies": { - "find-up": "^5.0.0", - "read-pkg": "^6.0.0", - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/redent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", - "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", - "dev": true, - "dependencies": { - "indent-string": "^5.0.0", - "strip-indent": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" - }, - "node_modules/regexp-tree": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", - "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", - "dev": true, - "bin": { - "regexp-tree": "bin/regexp-tree" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regjsparser": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz", - "integrity": "sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/run-applescript": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", - "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", - "dev": true, - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "optional": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-array-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", - "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "devOptional": true - }, - "node_modules/sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "dev": true, - "dependencies": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/selderee": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.11.0.tgz", - "integrity": "sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==", - "dependencies": { - "parseley": "^0.12.0" - }, - "funding": { - "url": "https://ko-fi.com/killymxi" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "optional": true - }, - "node_modules/serialize-error": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", - "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serialize-error/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dev": true, - "peer": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/simple-youtube-age-restriction-bypass": { - "version": "2.5.9", - "resolved": "git+ssh://git@github.com/zerodytrash/Simple-YouTube-Age-Restriction-Bypass.git#4c5c61ac73811217a6402e3860591d28d9968d1e", - "license": "MIT", - "workspaces": [ - "account-proxy" - ], - "engines": { - "node": ">=18.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "optional": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dev": true, - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "dev": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", - "dev": true - }, - "node_modules/split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "optional": true - }, - "node_modules/ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ssri/node_modules/minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/stat-mode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", - "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", - "dependencies": { - "duplexer": "~0.1.1" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-outer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-outer/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/sumchecker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", - "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", - "dependencies": { - "debug": "^4.1.0" - }, - "engines": { - "node": ">= 8.0" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/synckit": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", - "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", - "dev": true, - "dependencies": { - "@pkgr/utils": "^2.3.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/tapable": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", - "integrity": "sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/temp-file": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", - "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", - "dev": true, - "dependencies": { - "async-exit-hook": "^2.0.1", - "fs-extra": "^10.0.0" - } - }, - "node_modules/temp-file/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/temp-file/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/temp-file/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/terser": { - "version": "5.19.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", - "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "peer": true - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" - }, - "node_modules/titleize": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", - "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tldts-core": { - "version": "6.0.14", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.0.14.tgz", - "integrity": "sha512-ESYhU/bgs6jiHlnl5h029f+0dB7EKRiTaxM/jHLZ6powScbmsgsrFcFjmyrjDgCvI/BRY79TEBBClmqLNEPyjQ==" - }, - "node_modules/tldts-experimental": { - "version": "6.0.14", - "resolved": "https://registry.npmjs.org/tldts-experimental/-/tldts-experimental-6.0.14.tgz", - "integrity": "sha512-q9tVxHEotaG1buC8E4k+1iGecpM9iLD9FqWzWUKMilUoCpK8uJcO20iDA9ORCojqZdsMXgPgBlSetwiw5ML0tg==", - "dependencies": { - "tldts-core": "^6.0.14" - } - }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/tmp-promise": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", - "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", - "dev": true, - "dependencies": { - "tmp": "^0.2.0" - } - }, - "node_modules/to-absolute-glob": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-3.0.0.tgz", - "integrity": "sha512-loO/XEWTRqpfcpI7+Jr2RR2Umaaozx1t6OSVWtMi0oy5F/Fxg3IC+D/TToDnxyAGs7uZBGT/6XmyDUxgsObJXA==", - "dev": true, - "dependencies": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/trim-newlines": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", - "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/trim-repeated": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/trim-repeated/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", - "dev": true, - "dependencies": { - "utf8-byte-length": "^1.0.1" - } - }, - "node_modules/ts-api-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.2.tgz", - "integrity": "sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==", - "dev": true, - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/typed-emitter/-/typed-emitter-2.1.0.tgz", - "integrity": "sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==", - "optionalDependencies": { - "rxjs": "*" - } - }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/uhyphen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/uhyphen/-/uhyphen-0.2.0.tgz", - "integrity": "sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==" - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/undici": { - "version": "5.23.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.23.0.tgz", - "integrity": "sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==", - "dependencies": { - "busboy": "^1.6.0" - }, - "engines": { - "node": ">=14.0" - } - }, - "node_modules/unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", - "dev": true, - "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/unzip-crx-3": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/unzip-crx-3/-/unzip-crx-3-0.2.0.tgz", - "integrity": "sha512-0+JiUq/z7faJ6oifVB5nSwt589v1KCduqIJupNVDoWSXZtWDmjDGO3RAEOvwJ07w90aoXoP4enKsR7ecMrJtWQ==", - "dev": true, - "dependencies": { - "jszip": "^3.1.0", - "mkdirp": "^0.5.1", - "yaku": "^0.16.6" - } - }, - "node_modules/unzip-crx-3/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "peer": true, - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-match-patterns": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/url-match-patterns/-/url-match-patterns-0.2.0.tgz", - "integrity": "sha512-vtaWyxq+CyrQP4/dapGddkSGwGypQOD2qjHcsqp9ahsjRWzGtjqm+ANxApH46OfWQfpkL6cuyPwsm80386jdjQ==", - "dependencies": { - "lodash": "^4.3.0" - } - }, - "node_modules/url-or-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/url-or-path/-/url-or-path-2.1.0.tgz", - "integrity": "sha512-dsBD6GbytSMj9YDb3jVzSRENwFh50oUORnWBeSHfo0Lnwv2KMm/J4npyGy1P9rivUPsUGLjTA53XqAFqpe0nww==", - "dev": true, - "funding": { - "url": "https://github.com/fisker/url-or-path?sponsor=1" - } - }, - "node_modules/utf8-byte-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", - "dev": true - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/verror": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", - "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", - "dev": true, - "optional": true, - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/vudio": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/vudio/-/vudio-2.1.1.tgz", - "integrity": "sha512-VkFQcFt/b/kpF5Eg5Sq+oXUo1Zp5aRFF4BSmIrOzau5o+5WMWwX9ae/EGJZstCyZFiCTU5iw1Y+u2BCGW6Y6Jw==" - }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "peer": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/webpack": { - "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", - "dev": true, - "peer": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", - "dev": true, - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/webpack/node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", - "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml2js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", - "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xml2js/node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/xo": { - "version": "0.56.0", - "resolved": "https://registry.npmjs.org/xo/-/xo-0.56.0.tgz", - "integrity": "sha512-ohzSqgQ8POgZ3KNaEK/gxDovb6h3cglxv8+xi9Dn7gmRe8g4qotpOZpMs5ACJhvkJDmJOhiKbk6Uq6Mx1Di9DA==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^2.1.0", - "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", - "arrify": "^3.0.0", - "cosmiconfig": "^8.2.0", - "define-lazy-prop": "^3.0.0", - "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", - "eslint-config-xo": "^0.43.1", - "eslint-config-xo-typescript": "^1.0.0", - "eslint-formatter-pretty": "^5.0.0", - "eslint-import-resolver-webpack": "^0.13.2", - "eslint-plugin-ava": "^14.0.0", - "eslint-plugin-eslint-comments": "^3.2.0", - "eslint-plugin-import": "~2.27.5", - "eslint-plugin-n": "^16.0.1", - "eslint-plugin-no-use-extend-native": "^0.5.0", - "eslint-plugin-prettier": "^5.0.0", - "eslint-plugin-unicorn": "^48.0.0", - "esm-utils": "^4.1.2", - "find-cache-dir": "^4.0.0", - "find-up": "^6.3.0", - "get-stdin": "^9.0.0", - "get-tsconfig": "^4.6.2", - "globby": "^13.2.2", - "imurmurhash": "^0.1.4", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash-es": "^4.17.21", - "meow": "^12.0.1", - "micromatch": "^4.0.5", - "open-editor": "^4.0.0", - "prettier": "^3.0.0", - "semver": "^7.5.4", - "slash": "^5.1.0", - "to-absolute-glob": "^3.0.0", - "typescript": "^5.1.6" - }, - "bin": { - "xo": "cli.js" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/xo/node_modules/arrify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz", - "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/xo/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/xo/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/xo/node_modules/meow": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", - "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", - "dev": true, - "engines": { - "node": ">=16.10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/xo/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/xo/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/xo/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/xo/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/xo/node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/xo/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yaku": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/yaku/-/yaku-0.16.7.tgz", - "integrity": "sha512-Syu3IB3rZvKvYk7yTiyl1bo/jiEFaaStrgv1V2TIJTqYPStSMQVO8EQjg/z+DRzLq/4LIIharNT3iH1hylEIRw==", - "dev": true - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/youtubei.js": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/youtubei.js/-/youtubei.js-4.3.0.tgz", - "integrity": "sha512-HdU6Awdr1nUWy0Ph7WdmoYPWL0ovx+S4w40eeTzAENr5xiUENsLuXcvULRc2fRCIxi+n7Q6142VVhmM4yK/g5g==", - "funding": [ - "https://github.com/sponsors/LuanRT" - ], - "dependencies": { - "jintr": "^1.0.0", - "linkedom": "^0.14.12", - "tslib": "^2.5.0", - "undici": "^5.19.1" - } - }, - "node_modules/ytpl": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ytpl/-/ytpl-2.3.0.tgz", - "integrity": "sha512-Cfw2rxq3PFK6qgWr2Z8gsRefVahEzbn9XEuiJldqdXHE6GhO7kTfEvbZKdfXing1SmgW635uJ/UL2g8r0fvu2Q==", - "dependencies": { - "miniget": "^4.2.2" - }, - "engines": { - "node": ">=8" - } - } - } + "name": "youtube-music", + "version": "1.20.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "youtube-music", + "version": "1.20.0", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@cliqz/adblocker-electron": "1.26.6", + "@ffmpeg/core": "0.12.2", + "@ffmpeg/ffmpeg": "0.12.5", + "@foobar404/wave": "2.0.4", + "@xhayper/discord-rpc": "1.0.22", + "async-mutex": "0.4.0", + "browser-id3-writer": "5.0.0", + "butterchurn": "2.6.7", + "butterchurn-presets": "2.4.7", + "custom-electron-prompt": "1.5.7", + "custom-electron-titlebar": "4.2.7", + "electron": "26.1.0", + "electron-better-web-request": "1.0.1", + "electron-debug": "3.2.0", + "electron-is": "3.0.0", + "electron-localshortcut": "3.2.1", + "electron-store": "8.1.0", + "electron-unhandled": "4.0.1", + "electron-updater": "6.1.1", + "filenamify": "4.3.0", + "howler": "2.2.3", + "html-to-text": "9.0.5", + "keyboardevent-from-electron-accelerator": "2.0.0", + "keyboardevents-areequal": "0.2.2", + "md5": "2.3.0", + "mpris-service": "2.1.2", + "node-fetch": "2.7.0", + "simple-youtube-age-restriction-bypass": "git+https://github.com/zerodytrash/Simple-YouTube-Age-Restriction-Bypass.git#v2.5.9", + "vudio": "2.1.1", + "youtubei.js": "4.3.0", + "ytpl": "2.3.0" + }, + "devDependencies": { + "@playwright/test": "1.37.1", + "auto-changelog": "2.4.0", + "del-cli": "5.0.1", + "electron-builder": "24.6.3", + "electron-devtools-installer": "3.2.0", + "eslint": "8.48.0", + "eslint-plugin-import": "2.28.1", + "eslint-plugin-prettier": "5.0.0", + "node-gyp": "9.4.0", + "playwright": "1.37.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", + "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/runtime": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.11.tgz", + "integrity": "sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cliqz/adblocker": { + "version": "1.26.6", + "resolved": "https://registry.npmjs.org/@cliqz/adblocker/-/adblocker-1.26.6.tgz", + "integrity": "sha512-fSNCvyl0FRgKcc2NmHEhaQqeTT0QCLBT3eVZ15ah6baPdCaQm7N5IN/annv9bRalS8Lwbxymb3TBLzXpFTghrw==", + "dependencies": { + "@cliqz/adblocker-content": "^1.26.6", + "@cliqz/adblocker-extended-selectors": "^1.26.6", + "@remusao/guess-url-type": "^1.1.2", + "@remusao/small": "^1.1.2", + "@remusao/smaz": "^1.7.1", + "@types/chrome": "^0.0.228", + "@types/firefox-webext-browser": "^111.0.0", + "tldts-experimental": "^6.0.1" + } + }, + "node_modules/@cliqz/adblocker-content": { + "version": "1.26.6", + "resolved": "https://registry.npmjs.org/@cliqz/adblocker-content/-/adblocker-content-1.26.6.tgz", + "integrity": "sha512-cebc5AjL/quVVdcClJ7dqqvW5SrqATfUhwqn5MzWtponZ3t3fRpgpFgkt2fNa5rd3iz1UfTcAtWrgpshHYurTA==", + "dependencies": { + "@cliqz/adblocker-extended-selectors": "^1.26.6" + } + }, + "node_modules/@cliqz/adblocker-electron": { + "version": "1.26.6", + "resolved": "https://registry.npmjs.org/@cliqz/adblocker-electron/-/adblocker-electron-1.26.6.tgz", + "integrity": "sha512-OE0Qh2+OGrx53DkV9gj1JzYdUV1IM7JigpU++5sA6yhsdbZBFijto0SK3iDsMsHeEUVq8DV1oLYspe0UpIU4SA==", + "dependencies": { + "@cliqz/adblocker": "^1.26.6", + "@cliqz/adblocker-electron-preload": "^1.26.6", + "tldts-experimental": "^6.0.1" + }, + "peerDependencies": { + "electron": ">11" + } + }, + "node_modules/@cliqz/adblocker-electron-preload": { + "version": "1.26.6", + "resolved": "https://registry.npmjs.org/@cliqz/adblocker-electron-preload/-/adblocker-electron-preload-1.26.6.tgz", + "integrity": "sha512-G564oo1YANQR7mAzuQi7aYsgKwmRurYo0d9E8YaZr6ZD/kDHKxgHLfGPflKuOsYz2gf9zWQT89RsyQxDrjI49g==", + "dependencies": { + "@cliqz/adblocker-content": "^1.26.6" + }, + "peerDependencies": { + "electron": ">11" + } + }, + "node_modules/@cliqz/adblocker-extended-selectors": { + "version": "1.26.6", + "resolved": "https://registry.npmjs.org/@cliqz/adblocker-extended-selectors/-/adblocker-extended-selectors-1.26.6.tgz", + "integrity": "sha512-Gpvg6eLO2aHiY7r2y0jueve6YbGkYvWaZ4MiwhQ1wPTwj/MxFqAh9cVHnz3EzoJUtsqoy9bvkhmfkRUatpvvzw==" + }, + "node_modules/@develar/schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", + "dev": true, + "dependencies": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@electron/asar": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.4.tgz", + "integrity": "sha512-lykfY3TJRRWFeTxccEKdf1I6BLl2Plw81H0bbp4Fc5iEc67foDCa5pjJQULVgo0wF+Dli75f3xVcdb/67FFZ/g==", + "dev": true, + "dependencies": { + "chromium-pickle-js": "^0.2.0", + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@electron/asar/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@electron/asar/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@electron/asar/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@electron/get": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.2.tgz", + "integrity": "sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g==", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/@electron/get/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@electron/notarize": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-1.2.4.tgz", + "integrity": "sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/notarize/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/notarize/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/osx-sign": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz", + "integrity": "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==", + "dev": true, + "dependencies": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@electron/osx-sign/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/@electron/osx-sign/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/osx-sign/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/universal": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.4.1.tgz", + "integrity": "sha512-lE/U3UNw1YHuowNbTmKNs9UlS3En3cPgwM5MI+agIgr/B1hSze9NdOP0qn7boZaI9Lph8IDv3/24g9IxnJP7aQ==", + "dev": true, + "dependencies": { + "@electron/asar": "^3.2.1", + "@malept/cross-spawn-promise": "^1.1.0", + "debug": "^4.3.1", + "dir-compare": "^3.0.0", + "fs-extra": "^9.0.1", + "minimatch": "^3.0.4", + "plist": "^3.0.4" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/@electron/universal/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@electron/universal/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/universal/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/universal/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@electron/universal/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", + "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", + "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@ffmpeg/core": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@ffmpeg/core/-/core-0.12.2.tgz", + "integrity": "sha512-UnzHvuNFbzmVZERSDtWGQvna01eKMfOWGG6SUn+s8mnKm5aH2zcrEIMgOMYpc6yJqrdRt0LBtT3ijF65rWlxIA==", + "engines": { + "node": ">=16.6.0" + } + }, + "node_modules/@ffmpeg/ffmpeg": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@ffmpeg/ffmpeg/-/ffmpeg-0.12.5.tgz", + "integrity": "sha512-grDWTaYSm0g/LEtpwkJtw0Kp1Iix/WF3KmtUo0Fm0V5GqKMUVzj1yzyaILg83o96wHSc8Y2d9Q3C37pYAF2wxQ==", + "dependencies": { + "@ffmpeg/types": "^0.12.0" + }, + "engines": { + "node": ">=18.17.0" + } + }, + "node_modules/@ffmpeg/types": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@ffmpeg/types/-/types-0.12.0.tgz", + "integrity": "sha512-AuR4K+L6v1/9hVOsikU4rGGT5nKulQa8HrtYhpgBEq0HojoWB1c9bq3TTkNBpEvS/gC17WDMVJrqIGgXOj1DXA==", + "engines": { + "node": ">=16.6.0" + } + }, + "node_modules/@foobar404/wave": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@foobar404/wave/-/wave-2.0.4.tgz", + "integrity": "sha512-FEyg37hDvQtrQVlFxbit7ov5e487BjsR32bZfJ4oAb5i+NnlbGaNyy6iYBZ8ocVHo8fgug+SL+mFdDTzqjvPww==" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@malept/cross-spawn-promise": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", + "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@malept/flatpak-bundler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", + "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "tmp-promise": "^3.0.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nornagon/put": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@nornagon/put/-/put-0.0.8.tgz", + "integrity": "sha512-ugvXJjwF5ldtUpa7D95kruNJ41yFQDEKyF5CW4TgKJnh+W/zmlBzXXeKTyqIgwMFrkePN2JqOBqcF0M0oOunow==", + "engines": { + "node": ">=0.3.0" + } + }, + "node_modules/@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@pkgr/utils/node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dev": true, + "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@playwright/test": { + "version": "1.37.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.37.1.tgz", + "integrity": "sha512-bq9zTli3vWJo8S3LwB91U0qDNQDpEXnw7knhxLM0nwDvexQAwx9tO8iKDZSqqneVq+URd/WIoz+BALMqUTgdSg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "playwright-core": "1.37.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/@remusao/guess-url-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@remusao/guess-url-type/-/guess-url-type-1.2.1.tgz", + "integrity": "sha512-rbOqre2jW8STjheOsOaQHLgYBaBZ9Owbdt8NO7WvNZftJlaG3y/K9oOkl8ZUpuFBisIhmBuMEW6c+YrQl5inRA==" + }, + "node_modules/@remusao/small": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@remusao/small/-/small-1.2.1.tgz", + "integrity": "sha512-7MjoGt0TJMVw1GPKgWq6SJPws1SLsUXQRa43Umht+nkyw2jnpy3WpiLNqGdwo5rHr5Wp9B2W/Pm5RQp656UJdw==" + }, + "node_modules/@remusao/smaz": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@remusao/smaz/-/smaz-1.9.1.tgz", + "integrity": "sha512-e6BLuP8oaXCZ9+v46Is4ilAZ/Vq6YLgmBP204Ixgk1qTjXmqvFYG7+AS7v9nsZdGOy96r9DWGFbbDVgMxwu1rA==", + "dependencies": { + "@remusao/smaz-compress": "^1.9.1", + "@remusao/smaz-decompress": "^1.9.1" + } + }, + "node_modules/@remusao/smaz-compress": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@remusao/smaz-compress/-/smaz-compress-1.9.1.tgz", + "integrity": "sha512-E2f48TwloQu3r6BdLOGF2aczeH7bJ/32oJGqvzT9SKur0cuUnLcZ7ZXP874E2fwmdE+cXzfC7bKzp79cDnmeyw==", + "dependencies": { + "@remusao/trie": "^1.4.1" + } + }, + "node_modules/@remusao/smaz-decompress": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@remusao/smaz-decompress/-/smaz-decompress-1.9.1.tgz", + "integrity": "sha512-TfjKKprYe3n47od8auhvJ/Ikj9kQTbDTe71ynKlxslrvvUhlIV3VQSuwYuMWMbdz1fIs0H/fxCN1Z8/H3km6/A==" + }, + "node_modules/@remusao/trie": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@remusao/trie/-/trie-1.4.1.tgz", + "integrity": "sha512-yvwa+aCyYI/UjeD39BnpMypG8N06l86wIDW1/PAc6ihBRnodIfZDwccxQN3n1t74wduzaz74m4ZMHZnB06567Q==" + }, + "node_modules/@selderee/plugin-htmlparser2": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz", + "integrity": "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==", + "dependencies": { + "domhandler": "^5.0.3", + "selderee": "^0.11.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/chrome": { + "version": "0.0.228", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.228.tgz", + "integrity": "sha512-rDmyVEF+l9H+6FQYqsEGqQOjBw/uaSx6KJ6o47FwbQmPPcskmt8XlPbKjy5KeQXU3ZLiV2x45Fk4kdtRMSghfQ==", + "dependencies": { + "@types/filesystem": "*", + "@types/har-format": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", + "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", + "dev": true, + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.44.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", + "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@types/filesystem": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.32.tgz", + "integrity": "sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ==", + "dependencies": { + "@types/filewriter": "*" + } + }, + "node_modules/@types/filewriter": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.29.tgz", + "integrity": "sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ==" + }, + "node_modules/@types/firefox-webext-browser": { + "version": "111.0.1", + "resolved": "https://registry.npmjs.org/@types/firefox-webext-browser/-/firefox-webext-browser-111.0.1.tgz", + "integrity": "sha512-mmHWdQTCT68X0hh0URrsIyWhJeFzZHaiprj6nni/CmsAmqYq27T0eZyu1ePeKJ/zuDD3wqtTzm5TwRFAso+oPw==" + }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/har-format": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.12.tgz", + "integrity": "sha512-P20p/YBrqUBmzD6KhIQ8EiY4/RRzlekL4eCvfQnulFPfjmiGxKIoyCeI7qam5I7oKH3P8EU4ptEi0EfyGoLysw==" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "node_modules/@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.5.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", + "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==" + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "node_modules/@types/plist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.2.tgz", + "integrity": "sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*", + "xmlbuilder": ">=11.0.1" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/verror": { + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.6.tgz", + "integrity": "sha512-NNm+gdePAX1VGvPcGZCDKQZKYSiAWigKhKaz5KF94hG6f2s8de9Ow5+7AbXoeKxL8gavZfk4UquSAygOF2duEQ==", + "dev": true, + "optional": true + }, + "node_modules/@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@xhayper/discord-rpc": { + "version": "1.0.22", + "resolved": "https://registry.npmjs.org/@xhayper/discord-rpc/-/discord-rpc-1.0.22.tgz", + "integrity": "sha512-9NUse3AwmmLUgdY9PnI8tcm9ECRuuRRbdJwy7Osa3CPYF12EreTbIY/glEh5VHr66fcZy/IswGVnB477XOsTYA==", + "dependencies": { + "axios": "^1.4.0", + "discord-api-types": "^0.37.52", + "ws": "^8.13.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/7zip-bin": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.1.1.tgz", + "integrity": "sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/abstract-socket": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/abstract-socket/-/abstract-socket-2.1.1.tgz", + "integrity": "sha512-YZJizsvS1aBua5Gd01woe4zuyYBGgSMeqDOB6/ChwdTI904KP6QGtJswXl4hcqWxbz86hQBe++HWV0hF1aGUtA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "linux" + ], + "dependencies": { + "bindings": "^1.2.1", + "nan": "^2.12.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dev": true, + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", + "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", + "dev": true, + "dependencies": { + "clean-stack": "^4.0.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/aggregate-error/node_modules/clean-stack": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", + "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/aggregate-error/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/app-builder-bin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-4.0.0.tgz", + "integrity": "sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==", + "dev": true + }, + "node_modules/app-builder-lib": { + "version": "24.6.3", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.6.3.tgz", + "integrity": "sha512-++0Zp7vcCHfXMBGVj7luFxpqvMPk5mcWeTuw7OK0xNAaNtYQTTN0d9YfWRsb1MvviTOOhyHeULWz1CaixrdrDg==", + "dev": true, + "dependencies": { + "@develar/schema-utils": "~2.6.5", + "@electron/notarize": "^1.2.3", + "@electron/osx-sign": "^1.0.4", + "@electron/universal": "1.3.4", + "@malept/flatpak-bundler": "^0.4.0", + "@types/fs-extra": "9.0.13", + "7zip-bin": "~5.1.1", + "async-exit-hook": "^2.0.1", + "bluebird-lst": "^1.0.9", + "builder-util": "24.5.0", + "builder-util-runtime": "9.2.1", + "chromium-pickle-js": "^0.2.0", + "debug": "^4.3.4", + "ejs": "^3.1.8", + "electron-publish": "24.5.0", + "form-data": "^4.0.0", + "fs-extra": "^10.1.0", + "hosted-git-info": "^4.1.0", + "is-ci": "^3.0.0", + "isbinaryfile": "^5.0.0", + "js-yaml": "^4.1.0", + "lazy-val": "^1.0.5", + "minimatch": "^5.1.1", + "read-config-file": "6.3.2", + "sanitize-filename": "^1.6.3", + "semver": "^7.3.8", + "tar": "^6.1.12", + "temp-file": "^3.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/app-builder-lib/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/app-builder-lib/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/app-builder-lib/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz", + "integrity": "sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "node_modules/async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/async-mutex": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.4.0.tgz", + "integrity": "sha512-eJFZ1YhRR8UN8eBLoNzcDPcy/jqjsg6I1AP+KvWQX80BqOSW1oJPJXDylPUEeMr2ZQvHgnQ//Lp6f3RQ1zI7HA==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/atomically": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", + "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/auto-changelog": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/auto-changelog/-/auto-changelog-2.4.0.tgz", + "integrity": "sha512-vh17hko1c0ItsEcw6m7qPRf3m45u+XK5QyCrrBFViElZ8jnKrPC1roSznrd1fIB/0vR/zawdECCRJtTuqIXaJw==", + "dev": true, + "dependencies": { + "commander": "^7.2.0", + "handlebars": "^4.7.7", + "node-fetch": "^2.6.1", + "parse-github-url": "^1.0.2", + "semver": "^7.3.5" + }, + "bin": { + "auto-changelog": "src/index.js" + }, + "engines": { + "node": ">=8.3" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", + "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-runtime/node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/bluebird-lst": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", + "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "optional": true + }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-id3-writer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/browser-id3-writer/-/browser-id3-writer-5.0.0.tgz", + "integrity": "sha512-klFXmPe8kQN1y0ZrW411qmrUjJsb1gqPZ+Gb9ZcPKOmFF/8mA9dOZHXP9rGYsNCM8NAodZUFIzoKdl3tMvWsAA==" + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz", + "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==", + "dev": true, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/builder-util": { + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.5.0.tgz", + "integrity": "sha512-STnBmZN/M5vGcv01u/K8l+H+kplTaq4PAIn3yeuufUKSpcdro0DhJWxPI81k5XcNfC//bjM3+n9nr8F9uV4uAQ==", + "dev": true, + "dependencies": { + "@types/debug": "^4.1.6", + "7zip-bin": "~5.1.1", + "app-builder-bin": "4.0.0", + "bluebird-lst": "^1.0.9", + "builder-util-runtime": "9.2.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "debug": "^4.3.4", + "fs-extra": "^10.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-ci": "^3.0.0", + "js-yaml": "^4.1.0", + "source-map-support": "^0.5.19", + "stat-mode": "^1.0.0", + "temp-file": "^3.4.0" + } + }, + "node_modules/builder-util-runtime": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.1.tgz", + "integrity": "sha512-2rLv/uQD2x+dJ0J3xtsmI12AlRyk7p45TEbE/6o/fbb633e/S3pPgm+ct+JHsoY7r39dKHnGEFk/AASRFdnXmA==", + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/builder-util/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/builder-util/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/builder-util/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, + "dependencies": { + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/butterchurn": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/butterchurn/-/butterchurn-2.6.7.tgz", + "integrity": "sha512-BJiRA8L0L2+84uoG2SSfkp0kclBuN+vQKf217pK7pMlwEO2ZEg3MtO2/o+l8Qpr8Nbejg8tmL1ZHD1jmhiaaqg==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "ecma-proposal-math-extensions": "0.0.2" + } + }, + "node_modules/butterchurn-presets": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/butterchurn-presets/-/butterchurn-presets-2.4.7.tgz", + "integrity": "sha512-4MdM8ripz/VfH1BCldrIKdAc/1ryJFBDvqlyow6Ivo1frwj0H3duzvSMFC7/wIjAjxb1QpwVHVqGqS9uAFKhpg==", + "dependencies": { + "babel-runtime": "^6.26.0", + "ecma-proposal-math-extensions": "0.0.2", + "lodash": "^4.17.4" + } + }, + "node_modules/cacache": { + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^7.7.1", + "minipass": "^7.0.3", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/cacache/node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/minipass": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", + "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/cacache/node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", + "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", + "dev": true, + "dependencies": { + "camelcase": "^6.3.0", + "map-obj": "^4.1.0", + "quick-lru": "^5.1.1", + "type-fest": "^1.2.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "engines": { + "node": "*" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", + "dev": true + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "optional": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/conf": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/conf/-/conf-10.2.0.tgz", + "integrity": "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==", + "dependencies": { + "ajv": "^8.6.3", + "ajv-formats": "^2.1.1", + "atomically": "^1.7.0", + "debounce-fn": "^4.0.0", + "dot-prop": "^6.0.1", + "env-paths": "^2.2.1", + "json-schema-typed": "^7.0.3", + "onetime": "^5.1.2", + "pkg-up": "^3.1.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conf/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/conf/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/config-file-ts": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.4.tgz", + "integrity": "sha512-cKSW0BfrSaAUnxpgvpXPLaaW/umg4bqg4k3GO1JqlRfpx+d5W0GDXznCMkWotJQek5Mmz1MJVChQnz3IVaeMZQ==", + "dev": true, + "dependencies": { + "glob": "^7.1.6", + "typescript": "^4.0.2" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": true + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "node_modules/crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "dev": true, + "optional": true, + "dependencies": { + "buffer": "^5.1.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "engines": { + "node": "*" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" + }, + "node_modules/custom-electron-prompt": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/custom-electron-prompt/-/custom-electron-prompt-1.5.7.tgz", + "integrity": "sha512-ptRPJr6CpT06GWLMtg3GD2Lr7gWfXdWI+hR1S39eq+m/mUa2E118YmX6mPCbHdg5QB/W9UVhSpRqBM8FUh1G8w==", + "peerDependencies": { + "electron": ">=10.0.0" + } + }, + "node_modules/custom-electron-titlebar": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/custom-electron-titlebar/-/custom-electron-titlebar-4.2.7.tgz", + "integrity": "sha512-5sROnS5jH8jaFsjMwID7aPwnohBJ4HU0dSx81qSGAaznnblc3067D8pyl/zOwj/WosoOPHV2837jbT3j4whvHw==", + "peerDependencies": { + "electron": ">20.0.0" + } + }, + "node_modules/dbus-next": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/dbus-next/-/dbus-next-0.9.2.tgz", + "integrity": "sha512-tzQq/+wrTZ2yU+U5PoeXc97KABhX2v55C/T0finH3tSKYuI8H/SqppIFymBBrUHcK13LvEGY3vdj3ikPPenL5g==", + "dependencies": { + "@nornagon/put": "0.0.8", + "event-stream": "3.3.4", + "hexy": "^0.2.10", + "jsbi": "^2.0.5", + "long": "^4.0.0", + "safe-buffer": "^5.1.1", + "xml2js": "^0.4.17" + }, + "optionalDependencies": { + "abstract-socket": "^2.0.0" + } + }, + "node_modules/debounce-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", + "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", + "dependencies": { + "mimic-fn": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", + "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "dependencies": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/default-browser/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/default-browser/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/del": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-7.0.0.tgz", + "integrity": "sha512-tQbV/4u5WVB8HMJr08pgw0b6nG4RGt/tj+7Numvq+zqcvUFeMaIWWOUFltiU+6go8BSO2/ogsB4EasDaj0y68Q==", + "dev": true, + "dependencies": { + "globby": "^13.1.2", + "graceful-fs": "^4.2.10", + "is-glob": "^4.0.3", + "is-path-cwd": "^3.0.0", + "is-path-inside": "^4.0.0", + "p-map": "^5.5.0", + "rimraf": "^3.0.2", + "slash": "^4.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/del-cli/-/del-cli-5.0.1.tgz", + "integrity": "sha512-hCDHJd0u0jKFqizgInYXZaILsqOIA7Zl6e7M3hJwP+SlwUAgtV/EB22EPF4e2+9VAVnBDQQBE6tDRe+/UuoFhg==", + "dev": true, + "dependencies": { + "del": "^7.0.0", + "meow": "^10.1.3" + }, + "bin": { + "del": "cli.js", + "del-cli": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "optional": true + }, + "node_modules/dir-compare": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", + "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==", + "dev": true, + "dependencies": { + "buffer-equal": "^1.0.0", + "minimatch": "^3.0.4" + } + }, + "node_modules/dir-compare/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/dir-compare/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/discord-api-types": { + "version": "0.37.55", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.55.tgz", + "integrity": "sha512-XIf8AELxg76AH1WzrgB5ziFyIxSs4tLK1XGjFs4oE6t7M7r1B0Chdylaz76ALhvRXAUBGHGFXu/pKAa5Q+LbQg==" + }, + "node_modules/dmg-builder": { + "version": "24.6.3", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.6.3.tgz", + "integrity": "sha512-O7KNT7OKqtV54fMYUpdlyTOCP5DoPuRMLqMTgxxV2PO8Hj/so6zOl5o8GTs8pdDkeAhJzCFOUNB3BDhgXbUbJg==", + "dev": true, + "dependencies": { + "app-builder-lib": "24.6.3", + "builder-util": "24.5.0", + "builder-util-runtime": "9.2.1", + "fs-extra": "^10.1.0", + "iconv-lite": "^0.6.2", + "js-yaml": "^4.1.0" + }, + "optionalDependencies": { + "dmg-license": "^1.0.11" + } + }, + "node_modules/dmg-builder/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dmg-builder/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/dmg-builder/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/dmg-license": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", + "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "@types/plist": "^3.0.1", + "@types/verror": "^1.10.3", + "ajv": "^6.10.0", + "crc": "^3.8.0", + "iconv-corefoundation": "^1.1.7", + "plist": "^3.0.4", + "smart-buffer": "^4.0.2", + "verror": "^1.10.0" + }, + "bin": { + "dmg-license": "bin/dmg-license.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dotenv": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", + "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/ecma-proposal-math-extensions": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/ecma-proposal-math-extensions/-/ecma-proposal-math-extensions-0.0.2.tgz", + "integrity": "sha512-80BnDp2Fn7RxXlEr5HHZblniY4aQ97MOAicdWWpSo0vkQiISSE9wLR4SqxKsu4gCtXFBIPPzy8JMhay4NWRg/Q==" + }, + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-26.1.0.tgz", + "integrity": "sha512-qEh19H09Pysn3ibms5nZ0haIh5pFoOd7/5Ww7gzmAwDQOulRi8Sa2naeueOyIb1GKpf+6L4ix3iceYRAuA5r5Q==", + "hasInstallScript": true, + "dependencies": { + "@electron/get": "^2.0.0", + "@types/node": "^18.11.18", + "extract-zip": "^2.0.1" + }, + "bin": { + "electron": "cli.js" + }, + "engines": { + "node": ">= 12.20.55" + } + }, + "node_modules/electron-better-web-request": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/electron-better-web-request/-/electron-better-web-request-1.0.1.tgz", + "integrity": "sha512-euwLeL82k6fbVODfH5Uz9c4BN047/XyYKfsZcaFhdWfqx05JPu2J0xE7nciJ/1Bb0sTClU1FDLW5H2zQWBB5Gw==", + "dependencies": { + "url-match-patterns": "^0.2.0", + "uuid": "^3.3.2" + } + }, + "node_modules/electron-builder": { + "version": "24.6.3", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.6.3.tgz", + "integrity": "sha512-O6PqhRXwfxCNTXI4BlhELSeYYO6/tqlxRuy+4+xKBokQvwDDjDgZMMoSgAmanVSCuzjE7MZldI9XYrKFk+EQDw==", + "dev": true, + "dependencies": { + "app-builder-lib": "24.6.3", + "builder-util": "24.5.0", + "builder-util-runtime": "9.2.1", + "chalk": "^4.1.2", + "dmg-builder": "24.6.3", + "fs-extra": "^10.1.0", + "is-ci": "^3.0.0", + "lazy-val": "^1.0.5", + "read-config-file": "6.3.2", + "simple-update-notifier": "2.0.0", + "yargs": "^17.6.2" + }, + "bin": { + "electron-builder": "cli.js", + "install-app-deps": "install-app-deps.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/electron-builder/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-builder/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-builder/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-debug": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/electron-debug/-/electron-debug-3.2.0.tgz", + "integrity": "sha512-7xZh+LfUvJ52M9rn6N+tPuDw6oRAjxUj9SoxAZfJ0hVCXhZCsdkrSt7TgXOiWiEOBgEV8qwUIO/ScxllsPS7ow==", + "dependencies": { + "electron-is-dev": "^1.1.0", + "electron-localshortcut": "^3.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/electron-devtools-installer": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/electron-devtools-installer/-/electron-devtools-installer-3.2.0.tgz", + "integrity": "sha512-t3UczsYugm4OAbqvdImMCImIMVdFzJAHgbwHpkl5jmfu1izVgUcP/mnrPqJIpEeCK1uZGpt+yHgWEN+9EwoYhQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.2", + "semver": "^7.2.1", + "tslib": "^2.1.0", + "unzip-crx-3": "^0.2.0" + } + }, + "node_modules/electron-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/electron-is/-/electron-is-3.0.0.tgz", + "integrity": "sha512-aQv1y3WrDZ+mtO8acbhiiip/8fa0Et7cvZyvlqJm2H7fih4hiJWEFRyYxzLgDG2kmiLdF8l3y5tbek5JFOPQkQ==", + "dependencies": { + "electron-is-dev": "^0.3.0", + "semver": "^5.5.0" + } + }, + "node_modules/electron-is-accelerator": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/electron-is-accelerator/-/electron-is-accelerator-0.1.2.tgz", + "integrity": "sha512-fLGSAjXZtdn1sbtZxx52+krefmtNuVwnJCV2gNiVt735/ARUboMl8jnNC9fZEqQdlAv2ZrETfmBUsoQci5evJA==" + }, + "node_modules/electron-is-dev": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-1.2.0.tgz", + "integrity": "sha512-R1oD5gMBPS7PVU8gJwH6CtT0e6VSoD0+SzSnYpNm+dBkcijgA+K7VAMHDfnRq/lkKPZArpzplTW6jfiMYosdzw==" + }, + "node_modules/electron-is/node_modules/electron-is-dev": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-0.3.0.tgz", + "integrity": "sha512-jLttuuq8QK67n3mXmIe9pkrO7IH3LGIk12xJkhTmc852U2sCJaRAOpRGPSh+1Xnzck5v9escd9YXzuze9nGejg==" + }, + "node_modules/electron-is/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/electron-localshortcut": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/electron-localshortcut/-/electron-localshortcut-3.2.1.tgz", + "integrity": "sha512-DWvhKv36GsdXKnaFFhEiK8kZZA+24/yFLgtTwJJHc7AFgDjNRIBJZ/jq62Y/dWv9E4ypYwrVWN2bVrCYw1uv7Q==", + "dependencies": { + "debug": "^4.0.1", + "electron-is-accelerator": "^0.1.0", + "keyboardevent-from-electron-accelerator": "^2.0.0", + "keyboardevents-areequal": "^0.2.1" + } + }, + "node_modules/electron-publish": { + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.5.0.tgz", + "integrity": "sha512-zwo70suH15L15B4ZWNDoEg27HIYoPsGJUF7xevLJLSI7JUPC8l2yLBdLGwqueJ5XkDL7ucYyRZzxJVR8ElV9BA==", + "dev": true, + "dependencies": { + "@types/fs-extra": "^9.0.11", + "builder-util": "24.5.0", + "builder-util-runtime": "9.2.1", + "chalk": "^4.1.2", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "mime": "^2.5.2" + } + }, + "node_modules/electron-publish/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-publish/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-publish/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-store": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/electron-store/-/electron-store-8.1.0.tgz", + "integrity": "sha512-2clHg/juMjOH0GT9cQ6qtmIvK183B39ZXR0bUoPwKwYHJsEF3quqyDzMFUAu+0OP8ijmN2CbPRAelhNbWUbzwA==", + "dependencies": { + "conf": "^10.2.0", + "type-fest": "^2.17.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/electron-unhandled": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/electron-unhandled/-/electron-unhandled-4.0.1.tgz", + "integrity": "sha512-6BsLnBg+i96eUnbaIFZyYdyfNX3f80/Nlfqy34YEMxXT9JP3ddNsNnUeiOF8ezN4+et4t4D37gjghKTP0V3jyw==", + "dependencies": { + "clean-stack": "^2.1.0", + "electron-is-dev": "^2.0.0", + "ensure-error": "^2.0.0", + "lodash.debounce": "^4.0.8", + "serialize-error": "^8.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/electron-unhandled/node_modules/electron-is-dev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-2.0.0.tgz", + "integrity": "sha512-3X99K852Yoqu9AcW50qz3ibYBWY79/pBhlMCab8ToEWS48R0T9tyxRiQhwylE7zQdXrMnx2JKqUJyMPmt5FBqA==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/electron-updater": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-6.1.1.tgz", + "integrity": "sha512-IBT3zJ4yO5UZMF2gOTC9HrlmG4OYSRtOiHKzNAShJvfuicdx6UaXoa6AvhcTxdx6zf/rJyFMRBISS9jhVwTfow==", + "dependencies": { + "builder-util-runtime": "9.2.1", + "fs-extra": "^10.1.0", + "js-yaml": "^4.1.0", + "lazy-val": "^1.0.5", + "lodash.escaperegexp": "^4.1.2", + "lodash.isequal": "^4.5.0", + "semver": "^7.3.8", + "typed-emitter": "^2.1.0" + } + }, + "node_modules/electron-updater/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-updater/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-updater/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron/node_modules/@types/node": { + "version": "18.17.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.12.tgz", + "integrity": "sha512-d6xjC9fJ/nSnfDeU0AMDsaJyb1iHsqCSOdi84w4u+SlN/UgQdY5tRhpMzaFYsI4mnpvgTivEaQd0yOUhAtOnEQ==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/ensure-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ensure-error/-/ensure-error-2.1.0.tgz", + "integrity": "sha512-+BMSJHw9gxiJAAp2ZR1E0TNcL09dD3lOvkl7WVm4+Y6xnes/pMetP/TzCHiDduh8ihNDjbGfuYxl7l4PA1xZ8A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "optional": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "devOptional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", + "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.48.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.28.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", + "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.findlastindex": "^1.2.2", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.8.0", + "has": "^1.0.3", + "is-core-module": "^2.13.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.6", + "object.groupby": "^1.0.0", + "object.values": "^1.1.6", + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", + "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", + "dependencies": { + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", + "pause-stream": "0.0.11", + "split": "0.3", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extsprintf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "optional": true + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/filenamify": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", + "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/flat-cache": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "dev": true, + "dependencies": { + "flatted": "^3.2.7", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==" + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", + "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/global-agent/node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-agent/node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals": { + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "devOptional": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "node_modules/hexy": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/hexy/-/hexy-0.2.11.tgz", + "integrity": "sha512-ciq6hFsSG/Bpt2DmrZJtv+56zpPdnq+NQ4ijEFrveKN0ZG1mhl/LdT1NQZ9se6ty1fACcI4d4vYqC9v8EYpH2A==", + "bin": { + "hexy": "bin/hexy_cmd.js" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/howler": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/howler/-/howler-2.2.3.tgz", + "integrity": "sha512-QM0FFkw0LRX1PR8pNzJVAY25JhIWvbKMBFM4gqk+QdV+kPXOhleWGCB6AiAF/goGjIHK2e/nIElplvjQwhr0jg==" + }, + "node_modules/html-escaper": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==" + }, + "node_modules/html-to-text": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz", + "integrity": "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==", + "dependencies": { + "@selderee/plugin-htmlparser2": "^0.11.0", + "deepmerge": "^4.3.1", + "dom-serializer": "^2.0.0", + "htmlparser2": "^8.0.2", + "selderee": "^0.11.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-corefoundation": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", + "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "cli-truncate": "^2.1.0", + "node-addon-api": "^1.6.3" + }, + "engines": { + "node": "^8.11.2 || >=10" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "devOptional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-3.0.0.tgz", + "integrity": "sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isbinaryfile": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.0.tgz", + "integrity": "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==", + "dev": true, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.0.tgz", + "integrity": "sha512-uKmsITSsF4rUWQHzqaRUuyAir3fZfW3f202Ee34lz/gZCi970CPZwyQXLGNgWJvvZbvFyzeyGq0+4fcG/mBKZg==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jake/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jintr": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jintr/-/jintr-1.1.0.tgz", + "integrity": "sha512-Tu9wk3BpN2v+kb8yT6YBtue+/nbjeLFv4vvVC4PJ7oCidHKbifWhvORrAbQfxVIQZG+67am/mDagpiGSVtvrZg==", + "funding": [ + "https://github.com/sponsors/LuanRT" + ], + "dependencies": { + "acorn": "^8.8.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbi": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-2.0.5.tgz", + "integrity": "sha512-TzO/62Hxeb26QMb4IGlI/5X+QLr9Uqp1FPkwp2+KOICW+Q+vSuFj61c8pkT6wAns4WcK56X7CmSHhJeDGWOqxQ==" + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-schema-typed": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", + "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "optional": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/keyboardevent-from-electron-accelerator": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/keyboardevent-from-electron-accelerator/-/keyboardevent-from-electron-accelerator-2.0.0.tgz", + "integrity": "sha512-iQcmNA0M4ETMNi0kG/q0h/43wZk7rMeKYrXP7sqKIJbHkTU8Koowgzv+ieR/vWJbOwxx5nDC3UnudZ0aLSu4VA==" + }, + "node_modules/keyboardevents-areequal": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/keyboardevents-areequal/-/keyboardevents-areequal-0.2.2.tgz", + "integrity": "sha512-Nv+Kr33T0mEjxR500q+I6IWisOQ0lK1GGOncV0kWE6n4KFmpcu7RUX5/2B0EUtX51Cb0HjZ9VJsSY3u4cBa0kw==" + }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lazy-val": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", + "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==" + }, + "node_modules/leac": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz", + "integrity": "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==", + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/linkedom": { + "version": "0.14.26", + "resolved": "https://registry.npmjs.org/linkedom/-/linkedom-0.14.26.tgz", + "integrity": "sha512-mK6TrydfFA7phrnp+1j57ycBwFI5bGSW6YXlw9acHoqF+mP/y+FooEYYyniOt5Ot57FSKB3iwmnuQ1UUyNLm5A==", + "dependencies": { + "css-select": "^5.1.0", + "cssom": "^0.5.0", + "html-escaper": "^3.0.3", + "htmlparser2": "^8.0.1", + "uhyphen": "^0.2.0" + } + }, + "node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==" + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "node_modules/meow": { + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", + "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.2", + "camelcase-keys": "^7.0.0", + "decamelize": "^5.0.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.2", + "read-pkg-up": "^8.0.0", + "redent": "^4.0.0", + "trim-newlines": "^4.0.2", + "type-fest": "^1.2.2", + "yargs-parser": "^20.2.9" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/miniget": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/miniget/-/miniget-4.2.3.tgz", + "integrity": "sha512-SjbDPDICJ1zT+ZvQwK0hUcRY4wxlhhNpHL9nJOB2MEAXRGagTljsO8MEDzQMTFf0Q8g4QNi8P9lEm/g7e+qgzA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-fetch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", + "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mpris-service": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mpris-service/-/mpris-service-2.1.2.tgz", + "integrity": "sha512-AC6WepCnFWwOME9OWplHZ8ps/BB+g9QrEpUKCv7wX82fDPzR3nPrypOFmL/Fm0JloEAu6QTWSfDLLc6mM/jinw==", + "dependencies": { + "dbus-next": "^0.9.2", + "deep-equal": "^1.0.1", + "source-map-support": "^0.5.11" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "optional": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/node-addon-api": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", + "dev": true, + "optional": true + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", + "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^11.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dev": true, + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/onetime/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-map": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", + "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", + "dev": true, + "dependencies": { + "aggregate-error": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-github-url": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", + "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", + "dev": true, + "bin": { + "parse-github-url": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseley": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.12.1.tgz", + "integrity": "sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==", + "dependencies": { + "leac": "^0.6.0", + "peberminta": "^0.9.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "dependencies": { + "through": "~2.3" + } + }, + "node_modules/peberminta": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.9.0.tgz", + "integrity": "sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==", + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/playwright": { + "version": "1.37.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.37.1.tgz", + "integrity": "sha512-bgUXRrQKhT48zHdxDYQTpf//0xDfDd5hLeEhjuSw8rXEGoT9YeElpfvs/izonTNY21IQZ7d3s22jLxYaAnubbQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "playwright-core": "1.37.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/playwright-core": { + "version": "1.37.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.37.1.tgz", + "integrity": "sha512-17EuQxlSIYCmEMwzMqusJ2ztDgJePjrbttaefgdsiqeLWidjYz9BxXaTaZWxH1J95SHGk6tjE+dwgWILJoUZfA==", + "dev": true, + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz", + "integrity": "sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==", + "dev": true, + "peer": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-config-file": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.3.2.tgz", + "integrity": "sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==", + "dev": true, + "dependencies": { + "config-file-ts": "^0.2.4", + "dotenv": "^9.0.2", + "dotenv-expand": "^5.1.0", + "js-yaml": "^4.1.0", + "json5": "^2.2.0", + "lazy-val": "^1.0.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/read-pkg": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", + "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", + "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0", + "read-pkg": "^6.0.0", + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/redent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", + "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", + "dev": true, + "dependencies": { + "indent-string": "^5.0.0", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "optional": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "devOptional": true + }, + "node_modules/sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dev": true, + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/selderee": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.11.0.tgz", + "integrity": "sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==", + "dependencies": { + "parseley": "^0.12.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "optional": true + }, + "node_modules/serialize-error": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", + "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-error/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-youtube-age-restriction-bypass": { + "version": "2.5.9", + "resolved": "git+ssh://git@github.com/zerodytrash/Simple-YouTube-Age-Restriction-Bypass.git#4c5c61ac73811217a6402e3860591d28d9968d1e", + "license": "MIT", + "workspaces": [ + "account-proxy" + ], + "engines": { + "node": ">=18.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "optional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dev": true, + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, + "node_modules/split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "optional": true + }, + "node_modules/ssri": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ssri/node_modules/minipass": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", + "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/stat-mode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", + "dependencies": { + "duplexer": "~0.1.1" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-outer/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/temp-file": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", + "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", + "dev": true, + "dependencies": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^10.0.0" + } + }, + "node_modules/temp-file/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/temp-file/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/temp-file/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tldts-core": { + "version": "6.0.14", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.0.14.tgz", + "integrity": "sha512-ESYhU/bgs6jiHlnl5h029f+0dB7EKRiTaxM/jHLZ6powScbmsgsrFcFjmyrjDgCvI/BRY79TEBBClmqLNEPyjQ==" + }, + "node_modules/tldts-experimental": { + "version": "6.0.14", + "resolved": "https://registry.npmjs.org/tldts-experimental/-/tldts-experimental-6.0.14.tgz", + "integrity": "sha512-q9tVxHEotaG1buC8E4k+1iGecpM9iLD9FqWzWUKMilUoCpK8uJcO20iDA9ORCojqZdsMXgPgBlSetwiw5ML0tg==", + "dependencies": { + "tldts-core": "^6.0.14" + } + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/trim-newlines": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", + "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trim-repeated/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dev": true, + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/typed-emitter/-/typed-emitter-2.1.0.tgz", + "integrity": "sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==", + "optionalDependencies": { + "rxjs": "*" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uhyphen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/uhyphen/-/uhyphen-0.2.0.tgz", + "integrity": "sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==" + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici": { + "version": "5.23.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.23.0.tgz", + "integrity": "sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==", + "dependencies": { + "busboy": "^1.6.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/unzip-crx-3": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/unzip-crx-3/-/unzip-crx-3-0.2.0.tgz", + "integrity": "sha512-0+JiUq/z7faJ6oifVB5nSwt589v1KCduqIJupNVDoWSXZtWDmjDGO3RAEOvwJ07w90aoXoP4enKsR7ecMrJtWQ==", + "dev": true, + "dependencies": { + "jszip": "^3.1.0", + "mkdirp": "^0.5.1", + "yaku": "^0.16.6" + } + }, + "node_modules/unzip-crx-3/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-match-patterns": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/url-match-patterns/-/url-match-patterns-0.2.0.tgz", + "integrity": "sha512-vtaWyxq+CyrQP4/dapGddkSGwGypQOD2qjHcsqp9ahsjRWzGtjqm+ANxApH46OfWQfpkL6cuyPwsm80386jdjQ==", + "dependencies": { + "lodash": "^4.3.0" + } + }, + "node_modules/utf8-byte-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", + "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", + "dev": true + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/verror": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", + "dev": true, + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/vudio": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/vudio/-/vudio-2.1.1.tgz", + "integrity": "sha512-VkFQcFt/b/kpF5Eg5Sq+oXUo1Zp5aRFF4BSmIrOzau5o+5WMWwX9ae/EGJZstCyZFiCTU5iw1Y+u2BCGW6Y6Jw==" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yaku": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/yaku/-/yaku-0.16.7.tgz", + "integrity": "sha512-Syu3IB3rZvKvYk7yTiyl1bo/jiEFaaStrgv1V2TIJTqYPStSMQVO8EQjg/z+DRzLq/4LIIharNT3iH1hylEIRw==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/youtubei.js": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/youtubei.js/-/youtubei.js-4.3.0.tgz", + "integrity": "sha512-HdU6Awdr1nUWy0Ph7WdmoYPWL0ovx+S4w40eeTzAENr5xiUENsLuXcvULRc2fRCIxi+n7Q6142VVhmM4yK/g5g==", + "funding": [ + "https://github.com/sponsors/LuanRT" + ], + "dependencies": { + "jintr": "^1.0.0", + "linkedom": "^0.14.12", + "tslib": "^2.5.0", + "undici": "^5.19.1" + } + }, + "node_modules/ytpl": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ytpl/-/ytpl-2.3.0.tgz", + "integrity": "sha512-Cfw2rxq3PFK6qgWr2Z8gsRefVahEzbn9XEuiJldqdXHE6GhO7kTfEvbZKdfXing1SmgW635uJ/UL2g8r0fvu2Q==", + "dependencies": { + "miniget": "^4.2.2" + }, + "engines": { + "node": ">=8" + } + } + } } diff --git a/package.json b/package.json index 00c80abd..73f063e4 100644 --- a/package.json +++ b/package.json @@ -1,175 +1,161 @@ { - "name": "youtube-music", - "productName": "YouTube Music", - "version": "1.20.0", - "description": "YouTube Music Desktop App - including custom plugins", - "license": "MIT", - "repository": "th-ch/youtube-music", - "author": { - "name": "th-ch", - "email": "th-ch@users.noreply.github.com", - "url": "https://github.com/th-ch/youtube-music" - }, - "build": { - "appId": "com.github.th-ch.youtube-music", - "productName": "YouTube Music", - "mac": { - "identity": null, - "files": [ - "!plugins/taskbar-mediacontrol${/*}" - ], - "target": [ - { - "target": "dmg", - "arch": [ - "x64", - "arm64" - ] - } - ], - "icon": "assets/generated/icons/mac/icon.icns" - }, - "win": { - "icon": "assets/generated/icons/win/icon.ico", - "files": [ - "!plugins/touchbar${/*}" - ], - "target": [ - { - "target": "nsis", - "arch": [ - "x64", - "arm64" - ] - }, - { - "target": "portable", - "arch": [ - "x64", - "arm64" - ] - } - ] - }, - "nsis": { - "runAfterFinish": false - }, - "linux": { - "icon": "assets/generated/icons/png", - "files": [ - "!plugins/{touchbar,taskbar-mediacontrol}${/*}" - ], - "category": "AudioVideo", - "target": [ - "AppImage", - "snap", - "freebsd", - "deb", - "rpm" - ] - }, - "snap": { - "slots": [ - { - "mpris": { - "interface": "mpris" - } - } - ] - } - }, - "scripts": { - "test": "playwright test", - "test:debug": "DEBUG=pw:browser* playwright test", - "start": "electron .", - "start:debug": "ELECTRON_ENABLE_LOGGING=1 electron .", - "generate:package": "node utils/generate-package-json.js", - "postinstall": "npm run plugins", - "clean": "del-cli dist", - "build": "npm run clean && electron-builder --win --mac --linux -p never", - "build:linux": "npm run clean && electron-builder --linux -p never", - "build:mac": "npm run clean && electron-builder --mac dmg:x64 -p never", - "build:mac:arm64": "npm run clean && electron-builder --mac dmg:arm64 -p never", - "build:win": "npm run clean && electron-builder --win -p never", - "lint": "xo", - "changelog": "auto-changelog", - "plugins": "npm run plugin:adblocker && npm run plugin:bypass-age-restrictions", - "plugin:adblocker": "del-cli plugins/adblocker/ad-blocker-engine.bin && node plugins/adblocker/blocker.js", - "plugin:bypass-age-restrictions": "del-cli node_modules/simple-youtube-age-restriction-bypass/package.json && npm run generate:package simple-youtube-age-restriction-bypass", - "release:linux": "npm run clean && electron-builder --linux -p always -c.snap.publish=github", - "release:mac": "npm run clean && electron-builder --mac -p always", - "release:win": "npm run clean && electron-builder --win -p always" - }, - "engines": { - "node": ">=16.0.0" - }, - "dependencies": { - "@cliqz/adblocker-electron": "1.26.6", - "@ffmpeg/core": "0.12.2", - "@ffmpeg/ffmpeg": "0.12.5", - "@foobar404/wave": "2.0.4", - "@xhayper/discord-rpc": "1.0.22", - "async-mutex": "0.4.0", - "browser-id3-writer": "5.0.0", - "butterchurn": "2.6.7", - "butterchurn-presets": "2.4.7", - "custom-electron-prompt": "1.5.7", - "custom-electron-titlebar": "4.2.7", - "electron": "26.1.0", - "electron-better-web-request": "1.0.1", - "electron-debug": "3.2.0", - "electron-is": "3.0.0", - "electron-localshortcut": "3.2.1", - "electron-store": "8.1.0", - "electron-unhandled": "4.0.1", - "electron-updater": "6.1.1", - "filenamify": "4.3.0", - "howler": "2.2.3", - "html-to-text": "9.0.5", - "keyboardevent-from-electron-accelerator": "2.0.0", - "keyboardevents-areequal": "0.2.2", - "md5": "2.3.0", - "mpris-service": "2.1.2", - "node-fetch": "2.7.0", - "simple-youtube-age-restriction-bypass": "git+https://github.com/zerodytrash/Simple-YouTube-Age-Restriction-Bypass.git#v2.5.9", - "vudio": "2.1.1", - "youtubei.js": "4.3.0", - "ytpl": "2.3.0" - }, - "overrides": { - "xml2js": "0.6.2", - "@electron/universal": "1.4.1" - }, - "devDependencies": { - "@playwright/test": "1.37.1", - "auto-changelog": "2.4.0", - "del-cli": "5.0.1", - "electron-builder": "24.6.3", - "electron-devtools-installer": "3.2.0", - "node-gyp": "9.4.0", - "playwright": "1.37.1", - "xo": "0.56.0" - }, - "auto-changelog": { - "hideCredit": true, - "package": true, - "unreleased": true, - "output": "changelog.md" - }, - "xo": { - "envs": [ - "node", - "browser" - ], - "rules": { - "quotes": [ - "error", - "double", - { - "avoidEscape": true, - "allowTemplateLiterals": true - } - ] - } - } + "name": "youtube-music", + "productName": "YouTube Music", + "version": "1.20.0", + "description": "YouTube Music Desktop App - including custom plugins", + "license": "MIT", + "repository": "th-ch/youtube-music", + "author": { + "name": "th-ch", + "email": "th-ch@users.noreply.github.com", + "url": "https://github.com/th-ch/youtube-music" + }, + "build": { + "appId": "com.github.th-ch.youtube-music", + "productName": "YouTube Music", + "mac": { + "identity": null, + "files": [ + "!plugins/taskbar-mediacontrol${/*}" + ], + "target": [ + { + "target": "dmg", + "arch": [ + "x64", + "arm64" + ] + } + ], + "icon": "assets/generated/icons/mac/icon.icns" + }, + "win": { + "icon": "assets/generated/icons/win/icon.ico", + "files": [ + "!plugins/touchbar${/*}" + ], + "target": [ + { + "target": "nsis", + "arch": [ + "x64", + "arm64" + ] + }, + { + "target": "portable", + "arch": [ + "x64", + "arm64" + ] + } + ] + }, + "nsis": { + "runAfterFinish": false + }, + "linux": { + "icon": "assets/generated/icons/png", + "files": [ + "!plugins/{touchbar,taskbar-mediacontrol}${/*}" + ], + "category": "AudioVideo", + "target": [ + "AppImage", + "snap", + "freebsd", + "deb", + "rpm" + ] + }, + "snap": { + "slots": [ + { + "mpris": { + "interface": "mpris" + } + } + ] + } + }, + "scripts": { + "test": "playwright test", + "test:debug": "DEBUG=pw:browser* playwright test", + "start": "electron .", + "start:debug": "ELECTRON_ENABLE_LOGGING=1 electron .", + "generate:package": "node utils/generate-package-json.js", + "postinstall": "npm run plugins", + "clean": "del-cli dist", + "build": "npm run clean && electron-builder --win --mac --linux -p never", + "build:linux": "npm run clean && electron-builder --linux -p never", + "build:mac": "npm run clean && electron-builder --mac dmg:x64 -p never", + "build:mac:arm64": "npm run clean && electron-builder --mac dmg:arm64 -p never", + "build:win": "npm run clean && electron-builder --win -p never", + "lint": "xo", + "changelog": "auto-changelog", + "plugins": "npm run plugin:adblocker && npm run plugin:bypass-age-restrictions", + "plugin:adblocker": "del-cli plugins/adblocker/ad-blocker-engine.bin && node plugins/adblocker/blocker.js", + "plugin:bypass-age-restrictions": "del-cli node_modules/simple-youtube-age-restriction-bypass/package.json && npm run generate:package simple-youtube-age-restriction-bypass", + "release:linux": "npm run clean && electron-builder --linux -p always -c.snap.publish=github", + "release:mac": "npm run clean && electron-builder --mac -p always", + "release:win": "npm run clean && electron-builder --win -p always" + }, + "engines": { + "node": ">=16.0.0" + }, + "dependencies": { + "@cliqz/adblocker-electron": "1.26.6", + "@ffmpeg/core": "0.12.2", + "@ffmpeg/ffmpeg": "0.12.5", + "@foobar404/wave": "2.0.4", + "@xhayper/discord-rpc": "1.0.22", + "async-mutex": "0.4.0", + "browser-id3-writer": "5.0.0", + "butterchurn": "2.6.7", + "butterchurn-presets": "2.4.7", + "custom-electron-prompt": "1.5.7", + "custom-electron-titlebar": "4.2.7", + "electron": "26.1.0", + "electron-better-web-request": "1.0.1", + "electron-debug": "3.2.0", + "electron-is": "3.0.0", + "electron-localshortcut": "3.2.1", + "electron-store": "8.1.0", + "electron-unhandled": "4.0.1", + "electron-updater": "6.1.1", + "filenamify": "4.3.0", + "howler": "2.2.3", + "html-to-text": "9.0.5", + "keyboardevent-from-electron-accelerator": "2.0.0", + "keyboardevents-areequal": "0.2.2", + "md5": "2.3.0", + "mpris-service": "2.1.2", + "node-fetch": "2.7.0", + "simple-youtube-age-restriction-bypass": "git+https://github.com/zerodytrash/Simple-YouTube-Age-Restriction-Bypass.git#v2.5.9", + "vudio": "2.1.1", + "youtubei.js": "4.3.0", + "ytpl": "2.3.0" + }, + "overrides": { + "xml2js": "0.6.2", + "@electron/universal": "1.4.1" + }, + "devDependencies": { + "@playwright/test": "1.37.1", + "auto-changelog": "2.4.0", + "del-cli": "5.0.1", + "electron-builder": "24.6.3", + "electron-devtools-installer": "3.2.0", + "eslint": "8.48.0", + "eslint-plugin-import": "2.28.1", + "eslint-plugin-prettier": "5.0.0", + "node-gyp": "9.4.0", + "playwright": "1.37.1" + }, + "auto-changelog": { + "hideCredit": true, + "package": true, + "unreleased": true, + "output": "changelog.md" + } } diff --git a/plugins/adblocker/back.js b/plugins/adblocker/back.js index d15aa695..3255f161 100644 --- a/plugins/adblocker/back.js +++ b/plugins/adblocker/back.js @@ -1,13 +1,13 @@ -const { loadAdBlockerEngine } = require("./blocker"); -const config = require("./config"); +const { loadAdBlockerEngine } = require('./blocker'); +const config = require('./config'); module.exports = async (win, options) => { - if (await config.shouldUseBlocklists()) { - loadAdBlockerEngine( - win.webContents.session, - options.cache, - options.additionalBlockLists, - options.disableDefaultLists, - ); - } + if (await config.shouldUseBlocklists()) { + loadAdBlockerEngine( + win.webContents.session, + options.cache, + options.additionalBlockLists, + options.disableDefaultLists, + ); + } }; diff --git a/plugins/adblocker/blocker.js b/plugins/adblocker/blocker.js index a0c88410..c5d0b73d 100644 --- a/plugins/adblocker/blocker.js +++ b/plugins/adblocker/blocker.js @@ -1,63 +1,63 @@ -const { promises } = require("fs"); // used for caching -const path = require("path"); +const { promises } = require('node:fs'); // Used for caching +const path = require('node:path'); -const { ElectronBlocker } = require("@cliqz/adblocker-electron"); -const fetch = require("node-fetch"); +const { ElectronBlocker } = require('@cliqz/adblocker-electron'); +const fetch = require('node-fetch'); const SOURCES = [ - "https://raw.githubusercontent.com/kbinani/adblock-youtube-ads/master/signed.txt", - // uBlock Origin - "https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters.txt", - "https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters-2020.txt", - "https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters-2021.txt", - "https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters-2022.txt", - "https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters-2023.txt", - // Fanboy Annoyances - "https://secure.fanboy.co.nz/fanboy-annoyance_ubo.txt", + 'https://raw.githubusercontent.com/kbinani/adblock-youtube-ads/master/signed.txt', + // UBlock Origin + 'https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters.txt', + 'https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters-2020.txt', + 'https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters-2021.txt', + 'https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters-2022.txt', + 'https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters-2023.txt', + // Fanboy Annoyances + 'https://secure.fanboy.co.nz/fanboy-annoyance_ubo.txt', ]; const loadAdBlockerEngine = ( - session = undefined, - cache = true, - additionalBlockLists = [], - disableDefaultLists = false + session = undefined, + cache = true, + additionalBlockLists = [], + disableDefaultLists = false, ) => { - // Only use cache if no additional blocklists are passed - const cachingOptions = - cache && additionalBlockLists.length === 0 - ? { - path: path.resolve(__dirname, "ad-blocker-engine.bin"), - read: promises.readFile, - write: promises.writeFile, - } - : undefined; - const lists = [ - ...(disableDefaultLists ? [] : SOURCES), - ...additionalBlockLists, - ]; + // Only use cache if no additional blocklists are passed + const cachingOptions + = cache && additionalBlockLists.length === 0 + ? { + path: path.resolve(__dirname, 'ad-blocker-engine.bin'), + read: promises.readFile, + write: promises.writeFile, + } + : undefined; + const lists = [ + ...(disableDefaultLists ? [] : SOURCES), + ...additionalBlockLists, + ]; - ElectronBlocker.fromLists( - fetch, - lists, - { - // when generating the engine for caching, do not load network filters - // So that enhancing the session works as expected - // Allowing to define multiple webRequest listeners - loadNetworkFilters: session !== undefined, - }, - cachingOptions - ) - .then((blocker) => { - if (session) { - blocker.enableBlockingInSession(session); - } else { - console.log("Successfully generated adBlocker engine."); - } - }) - .catch((err) => console.log("Error loading adBlocker engine", err)); + ElectronBlocker.fromLists( + fetch, + lists, + { + // When generating the engine for caching, do not load network filters + // So that enhancing the session works as expected + // Allowing to define multiple webRequest listeners + loadNetworkFilters: session !== undefined, + }, + cachingOptions, + ) + .then((blocker) => { + if (session) { + blocker.enableBlockingInSession(session); + } else { + console.log('Successfully generated adBlocker engine.'); + } + }) + .catch((error) => console.log('Error loading adBlocker engine', error)); }; module.exports = { loadAdBlockerEngine }; if (require.main === module) { - loadAdBlockerEngine(); // Generate the engine without enabling it + loadAdBlockerEngine(); // Generate the engine without enabling it } diff --git a/plugins/adblocker/config.js b/plugins/adblocker/config.js index 5c17a03a..ed0ad43f 100644 --- a/plugins/adblocker/config.js +++ b/plugins/adblocker/config.js @@ -1,13 +1,13 @@ -const { PluginConfig } = require("../../config/dynamic"); +const { PluginConfig } = require('../../config/dynamic'); -const config = new PluginConfig("adblocker", { enableFront: true }); +const config = new PluginConfig('adblocker', { enableFront: true }); const blockers = { - WithBlocklists: "With blocklists", - InPlayer: "In player", + WithBlocklists: 'With blocklists', + InPlayer: 'In player', }; const shouldUseBlocklists = async () => - (await config.get("blocker")) !== blockers.InPlayer; + (await config.get('blocker')) !== blockers.InPlayer; module.exports = { shouldUseBlocklists, blockers, ...config }; diff --git a/plugins/adblocker/inject.js b/plugins/adblocker/inject.js index e296236f..be3eb165 100644 --- a/plugins/adblocker/inject.js +++ b/plugins/adblocker/inject.js @@ -7,283 +7,426 @@ */ { - let pruner = function (o) { - delete o.playerAds; - delete o.adPlacements; - // - if (o.playerResponse) { - delete o.playerResponse.playerAds; - delete o.playerResponse.adPlacements; - } - // - return o; - }; + const pruner = function (o) { + delete o.playerAds; + delete o.adPlacements; + // + if (o.playerResponse) { + delete o.playerResponse.playerAds; + delete o.playerResponse.adPlacements; + } - JSON.parse = new Proxy(JSON.parse, { - apply: function () { - return pruner(Reflect.apply(...arguments)); - }, - }); + // + return o; + }; - Response.prototype.json = new Proxy(Response.prototype.json, { - apply: function () { - return Reflect.apply(...arguments).then((o) => pruner(o)); - }, - }); + JSON.parse = new Proxy(JSON.parse, { + apply() { + return pruner(Reflect.apply(...arguments)); + }, + }); + + Response.prototype.json = new Proxy(Response.prototype.json, { + apply() { + return Reflect.apply(...arguments).then((o) => pruner(o)); + }, + }); } (function () { - let cValue = "undefined"; - const chain = "playerResponse.adPlacements"; - const thisScript = document.currentScript; - // - if (cValue === "null") cValue = null; - else if (cValue === "''") cValue = ""; - else if (cValue === "true") cValue = true; - else if (cValue === "false") cValue = false; - else if (cValue === "undefined") cValue = undefined; - else if (cValue === "noopFunc") cValue = function () {}; - else if (cValue === "trueFunc") - cValue = function () { - return true; - }; - else if (cValue === "falseFunc") - cValue = function () { - return false; - }; - else if (/^\d+$/.test(cValue)) { - cValue = parseFloat(cValue); - // - if (isNaN(cValue)) return; - if (Math.abs(cValue) > 0x7fff) return; - } else { - return; - } - // - let aborted = false; - const mustAbort = function (v) { - if (aborted) return true; - aborted = - v !== undefined && - v !== null && - cValue !== undefined && - cValue !== null && - typeof v !== typeof cValue; - return aborted; - }; + let cValue = 'undefined'; + const chain = 'playerResponse.adPlacements'; + const thisScript = document.currentScript; + // + switch (cValue) { + case 'null': { + cValue = null; + break; + } - /* - Support multiple trappers for the same property: - https://github.com/uBlockOrigin/uBlock-issues/issues/156 + case "''": { + cValue = ''; + break; + } + + case 'true': { + cValue = true; + break; + } + + case 'false': { + cValue = false; + break; + } + + case 'undefined': { + cValue = undefined; + break; + } + + case 'noopFunc': { + cValue = function () { + }; + + break; + } + + case 'trueFunc': { + cValue = function () { + return true; + }; + + break; + } + + case 'falseFunc': { + cValue = function () { + return false; + }; + + break; + } + + default: { + if (/^\d+$/.test(cValue)) { + cValue = Number.parseFloat(cValue); + // + if (isNaN(cValue)) { + return; + } + + if (Math.abs(cValue) > 0x7F_FF) { + return; + } + } else { + return; + } + } + } + + // + let aborted = false; + const mustAbort = function (v) { + if (aborted) { + return true; + } + + aborted + = v !== undefined + && v !== null + && cValue !== undefined + && cValue !== null + && typeof v !== typeof cValue; + return aborted; + }; + + /* + Support multiple trappers for the same property: + https://github.com/uBlockOrigin/uBlock-issues/issues/156 */ - const trapProp = function (owner, prop, configurable, handler) { - if (handler.init(owner[prop]) === false) { - return; - } - // - const odesc = Object.getOwnPropertyDescriptor(owner, prop); - let prevGetter, prevSetter; - if (odesc instanceof Object) { - if (odesc.configurable === false) return; - if (odesc.get instanceof Function) prevGetter = odesc.get; - if (odesc.set instanceof Function) prevSetter = odesc.set; - } - // - Object.defineProperty(owner, prop, { - configurable, - get() { - if (prevGetter !== undefined) { - prevGetter(); - } - // - return handler.getter(); - }, - set(a) { - if (prevSetter !== undefined) { - prevSetter(a); - } - // - handler.setter(a); - }, - }); - }; + const trapProp = function (owner, prop, configurable, handler) { + if (handler.init(owner[prop]) === false) { + return; + } - const trapChain = function (owner, chain) { - const pos = chain.indexOf("."); - if (pos === -1) { - trapProp(owner, chain, false, { - v: undefined, - getter: function () { - return document.currentScript === thisScript ? this.v : cValue; - }, - setter: function (a) { - if (mustAbort(a) === false) return; - cValue = a; - }, - init: function (v) { - if (mustAbort(v)) return false; - // - this.v = v; - return true; - }, - }); - // - return; - } - // - const prop = chain.slice(0, pos); - const v = owner[prop]; - // - chain = chain.slice(pos + 1); - if (v instanceof Object || (typeof v === "object" && v !== null)) { - trapChain(v, chain); - return; - } - // - trapProp(owner, prop, true, { - v: undefined, - getter: function () { - return this.v; - }, - setter: function (a) { - this.v = a; - if (a instanceof Object) trapChain(a, chain); - }, - init: function (v) { - this.v = v; - return true; - }, - }); - }; - // - trapChain(window, chain); + // + const odesc = Object.getOwnPropertyDescriptor(owner, prop); + let previousGetter; + let previousSetter; + if (odesc instanceof Object) { + if (odesc.configurable === false) { + return; + } + + if (odesc.get instanceof Function) { + previousGetter = odesc.get; + } + + if (odesc.set instanceof Function) { + previousSetter = odesc.set; + } + } + + // + Object.defineProperty(owner, prop, { + configurable, + get() { + if (previousGetter !== undefined) { + previousGetter(); + } + + // + return handler.getter(); + }, + set(a) { + if (previousSetter !== undefined) { + previousSetter(a); + } + + // + handler.setter(a); + }, + }); + }; + + const trapChain = function (owner, chain) { + const pos = chain.indexOf('.'); + if (pos === -1) { + trapProp(owner, chain, false, { + v: undefined, + getter() { + return document.currentScript === thisScript ? this.v : cValue; + }, + setter(a) { + if (mustAbort(a) === false) { + return; + } + + cValue = a; + }, + init(v) { + if (mustAbort(v)) { + return false; + } + + // + this.v = v; + return true; + }, + }); + // + return; + } + + // + const prop = chain.slice(0, pos); + const v = owner[prop]; + // + chain = chain.slice(pos + 1); + if (v instanceof Object || (typeof v === 'object' && v !== null)) { + trapChain(v, chain); + return; + } + + // + trapProp(owner, prop, true, { + v: undefined, + getter() { + return this.v; + }, + setter(a) { + this.v = a; + if (a instanceof Object) { + trapChain(a, chain); + } + }, + init(v) { + this.v = v; + return true; + }, + }); + }; + + // + trapChain(window, chain); })(); (function () { - let cValue = "undefined"; - const thisScript = document.currentScript; - const chain = "ytInitialPlayerResponse.adPlacements"; - // - if (cValue === "null") cValue = null; - else if (cValue === "''") cValue = ""; - else if (cValue === "true") cValue = true; - else if (cValue === "false") cValue = false; - else if (cValue === "undefined") cValue = undefined; - else if (cValue === "noopFunc") cValue = function () {}; - else if (cValue === "trueFunc") - cValue = function () { - return true; - }; - else if (cValue === "falseFunc") - cValue = function () { - return false; - }; - else if (/^\d+$/.test(cValue)) { - cValue = parseFloat(cValue); - // - if (isNaN(cValue)) return; - if (Math.abs(cValue) > 0x7fff) return; - } else { - return; - } - // - let aborted = false; - const mustAbort = function (v) { - if (aborted) return true; - aborted = - v !== undefined && - v !== null && - cValue !== undefined && - cValue !== null && - typeof v !== typeof cValue; - return aborted; - }; + let cValue = 'undefined'; + const thisScript = document.currentScript; + const chain = 'ytInitialPlayerResponse.adPlacements'; + // + switch (cValue) { + case 'null': { + cValue = null; + break; + } - /* - Support multiple trappers for the same property: - https://github.com/uBlockOrigin/uBlock-issues/issues/156 + case "''": { + cValue = ''; + break; + } + + case 'true': { + cValue = true; + break; + } + + case 'false': { + cValue = false; + break; + } + + case 'undefined': { + cValue = undefined; + break; + } + + case 'noopFunc': { + cValue = function () { + }; + + break; + } + + case 'trueFunc': { + cValue = function () { + return true; + }; + + break; + } + + case 'falseFunc': { + cValue = function () { + return false; + }; + + break; + } + + default: { + if (/^\d+$/.test(cValue)) { + cValue = Number.parseFloat(cValue); + // + if (isNaN(cValue)) { + return; + } + + if (Math.abs(cValue) > 0x7F_FF) { + return; + } + } else { + return; + } + } + } + + // + let aborted = false; + const mustAbort = function (v) { + if (aborted) { + return true; + } + + aborted + = v !== undefined + && v !== null + && cValue !== undefined + && cValue !== null + && typeof v !== typeof cValue; + return aborted; + }; + + /* + Support multiple trappers for the same property: + https://github.com/uBlockOrigin/uBlock-issues/issues/156 */ - const trapProp = function (owner, prop, configurable, handler) { - if (handler.init(owner[prop]) === false) { - return; - } - // - const odesc = Object.getOwnPropertyDescriptor(owner, prop); - let prevGetter, prevSetter; - if (odesc instanceof Object) { - if (odesc.configurable === false) return; - if (odesc.get instanceof Function) prevGetter = odesc.get; - if (odesc.set instanceof Function) prevSetter = odesc.set; - } - // - Object.defineProperty(owner, prop, { - configurable, - get() { - if (prevGetter !== undefined) { - prevGetter(); - } - // - return handler.getter(); - }, - set(a) { - if (prevSetter !== undefined) { - prevSetter(a); - } - // - handler.setter(a); - }, - }); - }; + const trapProp = function (owner, prop, configurable, handler) { + if (handler.init(owner[prop]) === false) { + return; + } - const trapChain = function (owner, chain) { - const pos = chain.indexOf("."); - if (pos === -1) { - trapProp(owner, chain, false, { - v: undefined, - getter: function () { - return document.currentScript === thisScript ? this.v : cValue; - }, - setter: function (a) { - if (mustAbort(a) === false) return; - cValue = a; - }, - init: function (v) { - if (mustAbort(v)) return false; - // - this.v = v; - return true; - }, - }); - // - return; - } - // - const prop = chain.slice(0, pos); - const v = owner[prop]; - // - chain = chain.slice(pos + 1); - if (v instanceof Object || (typeof v === "object" && v !== null)) { - trapChain(v, chain); - return; - } - // - trapProp(owner, prop, true, { - v: undefined, - getter: function () { - return this.v; - }, - setter: function (a) { - this.v = a; - if (a instanceof Object) trapChain(a, chain); - }, - init: function (v) { - this.v = v; - return true; - }, - }); - }; - // - trapChain(window, chain); + // + const odesc = Object.getOwnPropertyDescriptor(owner, prop); + let previousGetter; + let previousSetter; + if (odesc instanceof Object) { + if (odesc.configurable === false) { + return; + } + + if (odesc.get instanceof Function) { + previousGetter = odesc.get; + } + + if (odesc.set instanceof Function) { + previousSetter = odesc.set; + } + } + + // + Object.defineProperty(owner, prop, { + configurable, + get() { + if (previousGetter !== undefined) { + previousGetter(); + } + + // + return handler.getter(); + }, + set(a) { + if (previousSetter !== undefined) { + previousSetter(a); + } + + // + handler.setter(a); + }, + }); + }; + + const trapChain = function (owner, chain) { + const pos = chain.indexOf('.'); + if (pos === -1) { + trapProp(owner, chain, false, { + v: undefined, + getter() { + return document.currentScript === thisScript ? this.v : cValue; + }, + setter(a) { + if (mustAbort(a) === false) { + return; + } + + cValue = a; + }, + init(v) { + if (mustAbort(v)) { + return false; + } + + // + this.v = v; + return true; + }, + }); + // + return; + } + + // + const prop = chain.slice(0, pos); + const v = owner[prop]; + // + chain = chain.slice(pos + 1); + if (v instanceof Object || (typeof v === 'object' && v !== null)) { + trapChain(v, chain); + return; + } + + // + trapProp(owner, prop, true, { + v: undefined, + getter() { + return this.v; + }, + setter(a) { + this.v = a; + if (a instanceof Object) { + trapChain(a, chain); + } + }, + init(v) { + this.v = v; + return true; + }, + }); + }; + + // + trapChain(window, chain); })(); diff --git a/plugins/adblocker/menu.js b/plugins/adblocker/menu.js index 1622df9a..889cbebb 100644 --- a/plugins/adblocker/menu.js +++ b/plugins/adblocker/menu.js @@ -1,15 +1,15 @@ -const config = require("./config"); +const config = require('./config'); module.exports = () => [ - { - label: "Blocker", - submenu: Object.values(config.blockers).map((blocker) => ({ - label: blocker, - type: "radio", - checked: (config.get("blocker") || config.blockers.WithBlocklists) === blocker, - click: () => { - config.set("blocker", blocker); - }, - })), - }, + { + label: 'Blocker', + submenu: Object.values(config.blockers).map((blocker) => ({ + label: blocker, + type: 'radio', + checked: (config.get('blocker') || config.blockers.WithBlocklists) === blocker, + click() { + config.set('blocker', blocker); + }, + })), + }, ]; diff --git a/plugins/adblocker/preload.js b/plugins/adblocker/preload.js index e7650d05..4aeef0c6 100644 --- a/plugins/adblocker/preload.js +++ b/plugins/adblocker/preload.js @@ -1,10 +1,10 @@ -const config = require("./config"); +const config = require('./config'); module.exports = async () => { - if (await config.shouldUseBlocklists()) { - // Preload adblocker to inject scripts/styles - require("@cliqz/adblocker-electron-preload"); - } else if ((await config.get("blocker")) === config.blockers.InPlayer) { - require("./inject"); - } + if (await config.shouldUseBlocklists()) { + // Preload adblocker to inject scripts/styles + require('@cliqz/adblocker-electron-preload'); + } else if ((await config.get('blocker')) === config.blockers.InPlayer) { + require('./inject'); + } }; diff --git a/plugins/audio-compressor/front.js b/plugins/audio-compressor/front.js index 9c3c4ab6..faeb7742 100644 --- a/plugins/audio-compressor/front.js +++ b/plugins/audio-compressor/front.js @@ -1,19 +1,19 @@ const applyCompressor = (e) => { - const audioContext = e.detail.audioContext; + const { audioContext } = e.detail; - const compressor = audioContext.createDynamicsCompressor(); - compressor.threshold.value = -50; - compressor.ratio.value = 12; - compressor.knee.value = 40; - compressor.attack.value = 0; - compressor.release.value = 0.25; + const compressor = audioContext.createDynamicsCompressor(); + compressor.threshold.value = -50; + compressor.ratio.value = 12; + compressor.knee.value = 40; + compressor.attack.value = 0; + compressor.release.value = 0.25; - e.detail.audioSource.connect(compressor); - compressor.connect(audioContext.destination); + e.detail.audioSource.connect(compressor); + compressor.connect(audioContext.destination); }; module.exports = () => - document.addEventListener("audioCanPlay", applyCompressor, { - once: true, // Only create the audio compressor once, not on each video - passive: true, - }); + document.addEventListener('audioCanPlay', applyCompressor, { + once: true, // Only create the audio compressor once, not on each video + passive: true, + }); diff --git a/plugins/blur-nav-bar/back.js b/plugins/blur-nav-bar/back.js index 1c95289f..897e8bc3 100644 --- a/plugins/blur-nav-bar/back.js +++ b/plugins/blur-nav-bar/back.js @@ -1,6 +1,7 @@ -const path = require("path"); -const { injectCSS } = require("../utils"); +const path = require('node:path'); -module.exports = win => { - injectCSS(win.webContents, path.join(__dirname, "style.css")); +const { injectCSS } = require('../utils'); + +module.exports = (win) => { + injectCSS(win.webContents, path.join(__dirname, 'style.css')); }; diff --git a/plugins/blur-nav-bar/style.css b/plugins/blur-nav-bar/style.css index 26ad4182..22f32a13 100644 --- a/plugins/blur-nav-bar/style.css +++ b/plugins/blur-nav-bar/style.css @@ -1,10 +1,10 @@ #nav-bar-background, #header.ytmusic-item-section-renderer, ytmusic-tabs { - background: rgba(0, 0, 0, 0.3) !important; - backdrop-filter: blur(8px) !important; + background: rgba(0, 0, 0, 0.3) !important; + backdrop-filter: blur(8px) !important; } #nav-bar-divider { - display: none !important; + display: none !important; } diff --git a/plugins/bypass-age-restrictions/front.js b/plugins/bypass-age-restrictions/front.js index 1ec536f6..3c7d9242 100644 --- a/plugins/bypass-age-restrictions/front.js +++ b/plugins/bypass-age-restrictions/front.js @@ -1,4 +1,4 @@ module.exports = () => { - // See https://github.com/zerodytrash/Simple-YouTube-Age-Restriction-Bypass#userscript - require("simple-youtube-age-restriction-bypass/dist/Simple-YouTube-Age-Restriction-Bypass.user.js"); + // See https://github.com/zerodytrash/Simple-YouTube-Age-Restriction-Bypass#userscript + require('simple-youtube-age-restriction-bypass/dist/Simple-YouTube-Age-Restriction-Bypass.user.js'); }; diff --git a/plugins/captions-selector/back.js b/plugins/captions-selector/back.js index 59bb3802..2f204fce 100644 --- a/plugins/captions-selector/back.js +++ b/plugins/captions-selector/back.js @@ -1,21 +1,19 @@ -const { ipcMain } = require("electron"); +const { ipcMain } = require('electron'); +const prompt = require('custom-electron-prompt'); -const prompt = require("custom-electron-prompt"); -const promptOptions = require("../../providers/prompt-options"); +const promptOptions = require('../../providers/prompt-options'); module.exports = (win) => { - ipcMain.handle("captionsSelector", async (_, captionLabels, currentIndex) => { - return await prompt( - { - title: "Choose Caption", - label: `Current Caption: ${captionLabels[currentIndex] || "None"}`, - type: "select", - value: currentIndex, - selectOptions: captionLabels, - resizable: true, - ...promptOptions(), - }, - win - ); - }); + ipcMain.handle('captionsSelector', async (_, captionLabels, currentIndex) => await prompt( + { + title: 'Choose Caption', + label: `Current Caption: ${captionLabels[currentIndex] || 'None'}`, + type: 'select', + value: currentIndex, + selectOptions: captionLabels, + resizable: true, + ...promptOptions(), + }, + win, + )); }; diff --git a/plugins/captions-selector/config.js b/plugins/captions-selector/config.js index 2dcd4add..46789327 100644 --- a/plugins/captions-selector/config.js +++ b/plugins/captions-selector/config.js @@ -1,3 +1,4 @@ -const { PluginConfig } = require("../../config/dynamic"); -const config = new PluginConfig("captions-selector", { enableFront: true }); +const { PluginConfig } = require('../../config/dynamic'); + +const config = new PluginConfig('captions-selector', { enableFront: true }); module.exports = { ...config }; diff --git a/plugins/captions-selector/front.js b/plugins/captions-selector/front.js index 99cd52f0..2eff05ba 100644 --- a/plugins/captions-selector/front.js +++ b/plugins/captions-selector/front.js @@ -1,77 +1,83 @@ -const { ElementFromFile, templatePath } = require("../utils"); -const { ipcRenderer } = require("electron"); +const { ipcRenderer } = require('electron'); + +const configProvider = require('./config'); + +const { ElementFromFile, templatePath } = require('../utils'); -const configProvider = require("./config"); let config; -function $(selector) { return document.querySelector(selector); } +function $(selector) { + return document.querySelector(selector); +} const captionsSettingsButton = ElementFromFile( - templatePath(__dirname, "captions-settings-template.html") + templatePath(__dirname, 'captions-settings-template.html'), ); module.exports = async () => { - config = await configProvider.getAll(); + config = await configProvider.getAll(); - configProvider.subscribeAll((newConfig) => { - config = newConfig; - }); - document.addEventListener('apiLoaded', (event) => setup(event.detail), { once: true, passive: true }); -} + configProvider.subscribeAll((newConfig) => { + config = newConfig; + }); + document.addEventListener('apiLoaded', (event) => setup(event.detail), { once: true, passive: true }); +}; function setup(api) { - $(".right-controls-buttons").append(captionsSettingsButton); + $('.right-controls-buttons').append(captionsSettingsButton); - let captionTrackList = api.getOption("captions", "tracklist"); + let captionTrackList = api.getOption('captions', 'tracklist'); - $("video").addEventListener("srcChanged", async () => { - if (config.disableCaptions) { - setTimeout(() => api.unloadModule("captions"), 100); - captionsSettingsButton.style.display = "none"; - return; - } - - api.loadModule("captions"); - - setTimeout(async () => { - captionTrackList = api.getOption("captions", "tracklist"); - - if (config.autoload && config.lastCaptionsCode) { - api.setOption("captions", "track", { - languageCode: config.lastCaptionsCode, - }); - } - - captionsSettingsButton.style.display = captionTrackList?.length - ? "inline-block" - : "none"; - }, 250); - }); - - captionsSettingsButton.onclick = async () => { - if (captionTrackList?.length) { - const currentCaptionTrack = api.getOption("captions", "track"); - let currentIndex = !currentCaptionTrack ? - null : - captionTrackList.indexOf(captionTrackList.find(track => track.languageCode === currentCaptionTrack.languageCode)); - - const captionLabels = [ - ...captionTrackList.map(track => track.displayName), - 'None' - ]; - - currentIndex = await ipcRenderer.invoke('captionsSelector', captionLabels, currentIndex) - if (currentIndex === null) return; - - const newCaptions = captionTrackList[currentIndex]; - configProvider.set('lastCaptionsCode', newCaptions?.languageCode); - if (newCaptions) { - api.setOption("captions", "track", { languageCode: newCaptions.languageCode }); - } else { - api.setOption("captions", "track", {}); - } - - setTimeout(() => api.playVideo()); - } + $('video').addEventListener('srcChanged', async () => { + if (config.disableCaptions) { + setTimeout(() => api.unloadModule('captions'), 100); + captionsSettingsButton.style.display = 'none'; + return; } + + api.loadModule('captions'); + + setTimeout(async () => { + captionTrackList = api.getOption('captions', 'tracklist'); + + if (config.autoload && config.lastCaptionsCode) { + api.setOption('captions', 'track', { + languageCode: config.lastCaptionsCode, + }); + } + + captionsSettingsButton.style.display = captionTrackList?.length + ? 'inline-block' + : 'none'; + }, 250); + }); + + captionsSettingsButton.addEventListener('click', async () => { + if (captionTrackList?.length) { + const currentCaptionTrack = api.getOption('captions', 'track'); + let currentIndex = currentCaptionTrack + ? captionTrackList.indexOf(captionTrackList.find((track) => track.languageCode === currentCaptionTrack.languageCode)) + : null; + + const captionLabels = [ + ...captionTrackList.map((track) => track.displayName), + 'None', + ]; + + currentIndex = await ipcRenderer.invoke('captionsSelector', captionLabels, currentIndex); + if (currentIndex === null) { + return; + } + + const newCaptions = captionTrackList[currentIndex]; + configProvider.set('lastCaptionsCode', newCaptions?.languageCode); + if (newCaptions) { + api.setOption('captions', 'track', { languageCode: newCaptions.languageCode }); + } else { + api.setOption('captions', 'track', {}); + } + + setTimeout(() => api.playVideo()); + } + }); } diff --git a/plugins/captions-selector/menu.js b/plugins/captions-selector/menu.js index 4b9e205f..42dc202c 100644 --- a/plugins/captions-selector/menu.js +++ b/plugins/captions-selector/menu.js @@ -1,20 +1,20 @@ -const config = require("./config"); +const config = require('./config'); module.exports = () => [ - { - label: "Automatically select last used caption", - type: "checkbox", - checked: config.get("autoload"), - click: (item) => { - config.set('autoload', item.checked); - } + { + label: 'Automatically select last used caption', + type: 'checkbox', + checked: config.get('autoload'), + click(item) { + config.set('autoload', item.checked); }, - { - label: "No captions by default", - type: "checkbox", - checked: config.get("disabledCaptions"), - click: (item) => { - config.set('disableCaptions', item.checked); - }, - } + }, + { + label: 'No captions by default', + type: 'checkbox', + checked: config.get('disabledCaptions'), + click(item) { + config.set('disableCaptions', item.checked); + }, + }, ]; diff --git a/plugins/captions-selector/templates/captions-settings-template.html b/plugins/captions-selector/templates/captions-settings-template.html index 16c1b2b6..682a6cbb 100644 --- a/plugins/captions-selector/templates/captions-settings-template.html +++ b/plugins/captions-selector/templates/captions-settings-template.html @@ -1,13 +1,17 @@ - - - - - - - + + + + + + + + diff --git a/plugins/compact-sidebar/front.js b/plugins/compact-sidebar/front.js index a45e5f72..6b2e2b94 100644 --- a/plugins/compact-sidebar/front.js +++ b/plugins/compact-sidebar/front.js @@ -1,10 +1,10 @@ module.exports = () => { - const compactSidebar = document.querySelector("#mini-guide"); - const isCompactSidebarDisabled = - compactSidebar === null || - window.getComputedStyle(compactSidebar).display === "none"; + const compactSidebar = document.querySelector('#mini-guide'); + const isCompactSidebarDisabled + = compactSidebar === null + || window.getComputedStyle(compactSidebar).display === 'none'; - if (isCompactSidebarDisabled) { - document.querySelector("#button").click(); - } + if (isCompactSidebarDisabled) { + document.querySelector('#button').click(); + } }; diff --git a/plugins/crossfade/back.js b/plugins/crossfade/back.js index 0443c95a..18d10f86 100644 --- a/plugins/crossfade/back.js +++ b/plugins/crossfade/back.js @@ -1,15 +1,15 @@ -const { ipcMain } = require("electron"); -const { Innertube } = require("youtubei.js"); +const { ipcMain } = require('electron'); +const { Innertube } = require('youtubei.js'); -require("./config"); +require('./config'); module.exports = async () => { - const yt = await Innertube.create(); + const yt = await Innertube.create(); - ipcMain.handle("audio-url", async (_, videoID) => { - const info = await yt.getBasicInfo(videoID); - const url = info.streaming_data?.formats[0].decipher(yt.session.player); + ipcMain.handle('audio-url', async (_, videoID) => { + const info = await yt.getBasicInfo(videoID); + const url = info.streaming_data?.formats[0].decipher(yt.session.player); - return url; - }); + return url; + }); }; diff --git a/plugins/crossfade/config.js b/plugins/crossfade/config.js index 6db3c562..bfd742d7 100644 --- a/plugins/crossfade/config.js +++ b/plugins/crossfade/config.js @@ -1,3 +1,4 @@ -const { PluginConfig } = require("../../config/dynamic"); -const config = new PluginConfig("crossfade", { enableFront: true }); +const { PluginConfig } = require('../../config/dynamic'); + +const config = new PluginConfig('crossfade', { enableFront: true }); module.exports = { ...config }; diff --git a/plugins/crossfade/fader.js b/plugins/crossfade/fader.js index 410bf7ad..c7d15810 100644 --- a/plugins/crossfade/fader.js +++ b/plugins/crossfade/fader.js @@ -16,345 +16,346 @@ */ (function (root) { - "use strict"; + 'use strict'; - // internal utility: check if value is a valid volume level and throw if not - let validateVolumeLevel = (value) => { - // number between 0 and 1? - if (!Number.isNaN(value) && value >= 0 && value <= 1) { - // yup, that's fine - return; - } else { - // abort and throw an exception - throw new TypeError("Number between 0 and 1 expected as volume!"); - } - }; + // Internal utility: check if value is a valid volume level and throw if not + const validateVolumeLevel = (value) => { + // Number between 0 and 1? + if (!Number.isNaN(value) && value >= 0 && value <= 1) { + // Yup, that's fine - // main class - class VolumeFader { - /** - * VolumeFader Constructor - * - * @param media {HTMLMediaElement} - audio or video element to be controlled - * @param options {Object} - an object with optional settings - * @throws {TypeError} if options.initialVolume or options.fadeDuration are invalid - * - * options: - * .logger: {Function} logging `function(stuff, …)` for execution information (default: no logging) - * .fadeScaling: {Mixed} either 'linear', 'logarithmic' or a positive number in dB (default: logarithmic) - * .initialVolume: {Number} media volume 0…1 to apply during setup (volume not touched by default) - * .fadeDuration: {Number} time in milliseconds to complete a fade (default: 1000 ms) - */ - constructor(media, options) { - // passed media element of correct type? - if (media instanceof HTMLMediaElement) { - // save reference to media element - this.media = media; - } else { - // abort and throw an exception - throw new TypeError("Media element expected!"); - } + } else { + // Abort and throw an exception + throw new TypeError('Number between 0 and 1 expected as volume!'); + } + }; - // make sure options is an object - options = options || {}; + // Main class + class VolumeFader { + /** + * VolumeFader Constructor + * + * @param media {HTMLMediaElement} - audio or video element to be controlled + * @param options {Object} - an object with optional settings + * @throws {TypeError} if options.initialVolume or options.fadeDuration are invalid + * + * options: + * .logger: {Function} logging `function(stuff, …)` for execution information (default: no logging) + * .fadeScaling: {Mixed} either 'linear', 'logarithmic' or a positive number in dB (default: logarithmic) + * .initialVolume: {Number} media volume 0…1 to apply during setup (volume not touched by default) + * .fadeDuration: {Number} time in milliseconds to complete a fade (default: 1000 ms) + */ + constructor(media, options) { + // Passed media element of correct type? + if (media instanceof HTMLMediaElement) { + // Save reference to media element + this.media = media; + } else { + // Abort and throw an exception + throw new TypeError('Media element expected!'); + } - // log function passed? - if (typeof options.logger == "function") { - // set log function to the one specified - this.logger = options.logger; - } else { - // set log function explicitly to false - this.logger = false; - } + // Make sure options is an object + options = options || {}; - // linear volume fading? - if (options.fadeScaling == "linear") { - // pass levels unchanged - this.scale = { - internalToVolume: (level) => level, - volumeToInternal: (level) => level, - }; + // Log function passed? + if (typeof options.logger === 'function') { + // Set log function to the one specified + this.logger = options.logger; + } else { + // Set log function explicitly to false + this.logger = false; + } - // log setting - this.logger && this.logger("Using linear fading."); - } - // no linear, but logarithmic fading… - else { - let dynamicRange; + // Linear volume fading? + if (options.fadeScaling == 'linear') { + // Pass levels unchanged + this.scale = { + internalToVolume: (level) => level, + volumeToInternal: (level) => level, + }; - // default dynamic range? - if ( - options.fadeScaling === undefined || - options.fadeScaling == "logarithmic" - ) { - // set default of 60 dB - dynamicRange = 3; - } - // custom dynamic range? - else if ( - !Number.isNaN(options.fadeScaling) && - options.fadeScaling > 0 - ) { - // turn amplitude dB into a multiple of 10 power dB - dynamicRange = options.fadeScaling / 2 / 10; - } - // unsupported value - else { - // abort and throw exception - throw new TypeError( - "Expected 'linear', 'logarithmic' or a positive number as fade scaling preference!" - ); - } + // Log setting + this.logger && this.logger('Using linear fading.'); + } + // No linear, but logarithmic fading… + else { + let dynamicRange; - // use exponential/logarithmic scaler for expansion/compression - this.scale = { - internalToVolume: (level) => - this.exponentialScaler(level, dynamicRange), - volumeToInternal: (level) => - this.logarithmicScaler(level, dynamicRange), - }; + // Default dynamic range? + if ( + options.fadeScaling === undefined + || options.fadeScaling == 'logarithmic' + ) { + // Set default of 60 dB + dynamicRange = 3; + } + // Custom dynamic range? + else if ( + !Number.isNaN(options.fadeScaling) + && options.fadeScaling > 0 + ) { + // Turn amplitude dB into a multiple of 10 power dB + dynamicRange = options.fadeScaling / 2 / 10; + } + // Unsupported value + else { + // Abort and throw exception + throw new TypeError( + "Expected 'linear', 'logarithmic' or a positive number as fade scaling preference!", + ); + } - // log setting if not default - options.fadeScaling && - this.logger && - this.logger( - "Using logarithmic fading with " + - String(10 * dynamicRange) + - " dB dynamic range." - ); - } + // Use exponential/logarithmic scaler for expansion/compression + this.scale = { + internalToVolume: (level) => + this.exponentialScaler(level, dynamicRange), + volumeToInternal: (level) => + this.logarithmicScaler(level, dynamicRange), + }; - // set initial volume? - if (options.initialVolume !== undefined) { - // validate volume level and throw if invalid - validateVolumeLevel(options.initialVolume); + // Log setting if not default + options.fadeScaling + && this.logger + && this.logger( + 'Using logarithmic fading with ' + + String(10 * dynamicRange) + + ' dB dynamic range.', + ); + } - // set initial volume - this.media.volume = options.initialVolume; + // Set initial volume? + if (options.initialVolume !== undefined) { + // Validate volume level and throw if invalid + validateVolumeLevel(options.initialVolume); - // log setting - this.logger && - this.logger( - "Set initial volume to " + String(this.media.volume) + "." - ); - } + // Set initial volume + this.media.volume = options.initialVolume; - // fade duration given? - if (options.fadeDuration !== undefined) { - // try to set given fade duration (will log if successful and throw if not) - this.setFadeDuration(options.fadeDuration); - } else { - // set default fade duration (1000 ms) - this.fadeDuration = 1000; - } + // Log setting + this.logger + && this.logger( + 'Set initial volume to ' + String(this.media.volume) + '.', + ); + } - // indicate that fader is not active yet - this.active = false; + // Fade duration given? + if (options.fadeDuration === undefined) { + // Set default fade duration (1000 ms) + this.fadeDuration = 1000; + } else { + // Try to set given fade duration (will log if successful and throw if not) + this.setFadeDuration(options.fadeDuration); + } - // initialization done - this.logger && this.logger("Initialized for", this.media); - } + // Indicate that fader is not active yet + this.active = false; - /** - * Re(start) the update cycle. - * (this.active must be truthy for volume updates to take effect) - * - * @return {Object} VolumeFader instance for chaining - */ - start() { - // set fader to be active - this.active = true; + // Initialization done + this.logger && this.logger('Initialized for', this.media); + } - // start by running the update method - this.updateVolume(); + /** + * Re(start) the update cycle. + * (this.active must be truthy for volume updates to take effect) + * + * @return {Object} VolumeFader instance for chaining + */ + start() { + // Set fader to be active + this.active = true; - // return instance for chaining - return this; - } + // Start by running the update method + this.updateVolume(); - /** - * Stop the update cycle. - * (interrupting any fade) - * - * @return {Object} VolumeFader instance for chaining - */ - stop() { - // set fader to be inactive - this.active = false; + // Return instance for chaining + return this; + } - // return instance for chaining - return this; - } + /** + * Stop the update cycle. + * (interrupting any fade) + * + * @return {Object} VolumeFader instance for chaining + */ + stop() { + // Set fader to be inactive + this.active = false; - /** - * Set fade duration. - * (used for future calls to fadeTo) - * - * @param {Number} fadeDuration - fading length in milliseconds - * @throws {TypeError} if fadeDuration is not a number greater than zero - * @return {Object} VolumeFader instance for chaining - */ - setFadeDuration(fadeDuration) { - // if duration is a valid number > 0… - if (!Number.isNaN(fadeDuration) && fadeDuration > 0) { - // set fade duration - this.fadeDuration = fadeDuration; + // Return instance for chaining + return this; + } - // log setting - this.logger && - this.logger("Set fade duration to " + String(fadeDuration) + " ms."); - } else { - // abort and throw an exception - throw new TypeError("Positive number expected as fade duration!"); - } + /** + * Set fade duration. + * (used for future calls to fadeTo) + * + * @param {Number} fadeDuration - fading length in milliseconds + * @throws {TypeError} if fadeDuration is not a number greater than zero + * @return {Object} VolumeFader instance for chaining + */ + setFadeDuration(fadeDuration) { + // If duration is a valid number > 0… + if (!Number.isNaN(fadeDuration) && fadeDuration > 0) { + // Set fade duration + this.fadeDuration = fadeDuration; - // return instance for chaining - return this; - } + // Log setting + this.logger + && this.logger('Set fade duration to ' + String(fadeDuration) + ' ms.'); + } else { + // Abort and throw an exception + throw new TypeError('Positive number expected as fade duration!'); + } - /** - * Define a new fade and start fading. - * - * @param {Number} targetVolume - level to fade to in the range 0…1 - * @param {Function} callback - (optional) function to be called when fade is complete - * @throws {TypeError} if targetVolume is not in the range 0…1 - * @return {Object} VolumeFader instance for chaining - */ - fadeTo(targetVolume, callback) { - // validate volume and throw if invalid - validateVolumeLevel(targetVolume); + // Return instance for chaining + return this; + } - // define new fade - this.fade = { - // volume start and end point on internal fading scale - volume: { - start: this.scale.volumeToInternal(this.media.volume), - end: this.scale.volumeToInternal(targetVolume), - }, - // time start and end point - time: { - start: Date.now(), - end: Date.now() + this.fadeDuration, - }, - // optional callback function - callback: callback, - }; + /** + * Define a new fade and start fading. + * + * @param {Number} targetVolume - level to fade to in the range 0…1 + * @param {Function} callback - (optional) function to be called when fade is complete + * @throws {TypeError} if targetVolume is not in the range 0…1 + * @return {Object} VolumeFader instance for chaining + */ + fadeTo(targetVolume, callback) { + // Validate volume and throw if invalid + validateVolumeLevel(targetVolume); - // start fading - this.start(); + // Define new fade + this.fade = { + // Volume start and end point on internal fading scale + volume: { + start: this.scale.volumeToInternal(this.media.volume), + end: this.scale.volumeToInternal(targetVolume), + }, + // Time start and end point + time: { + start: Date.now(), + end: Date.now() + this.fadeDuration, + }, + // Optional callback function + callback, + }; - // log new fade - this.logger && this.logger("New fade started:", this.fade); + // Start fading + this.start(); - // return instance for chaining - return this; - } + // Log new fade + this.logger && this.logger('New fade started:', this.fade); - // convenience shorthand methods for common fades - fadeIn(callback) { - this.fadeTo(1, callback); - } - fadeOut(callback) { - this.fadeTo(0, callback); - } + // Return instance for chaining + return this; + } - /** - * Internal: Update media volume. - * (calls itself through requestAnimationFrame) - * - * @param {Number} targetVolume - linear level to fade to (0…1) - * @param {Function} callback - (optional) function to be called when fade is complete - */ - updateVolume() { - // fader active and fade available to process? - if (this.active && this.fade) { - // get current time - let now = Date.now(); + // Convenience shorthand methods for common fades + fadeIn(callback) { + this.fadeTo(1, callback); + } - // time left for fading? - if (now < this.fade.time.end) { - // compute current fade progress - let progress = - (now - this.fade.time.start) / - (this.fade.time.end - this.fade.time.start); + fadeOut(callback) { + this.fadeTo(0, callback); + } - // compute current level on internal scale - let level = - progress * (this.fade.volume.end - this.fade.volume.start) + - this.fade.volume.start; + /** + * Internal: Update media volume. + * (calls itself through requestAnimationFrame) + * + * @param {Number} targetVolume - linear level to fade to (0…1) + * @param {Function} callback - (optional) function to be called when fade is complete + */ + updateVolume() { + // Fader active and fade available to process? + if (this.active && this.fade) { + // Get current time + const now = Date.now(); - // map fade level to volume level and apply it to media element - this.media.volume = this.scale.internalToVolume(level); + // Time left for fading? + if (now < this.fade.time.end) { + // Compute current fade progress + const progress + = (now - this.fade.time.start) + / (this.fade.time.end - this.fade.time.start); - // schedule next update - root.requestAnimationFrame(this.updateVolume.bind(this)); - } else { - // log end of fade - this.logger && - this.logger( - "Fade to " + String(this.fade.volume.end) + " complete." - ); + // Compute current level on internal scale + const level + = progress * (this.fade.volume.end - this.fade.volume.start) + + this.fade.volume.start; - // time is up, jump to target volume - this.media.volume = this.scale.internalToVolume(this.fade.volume.end); + // Map fade level to volume level and apply it to media element + this.media.volume = this.scale.internalToVolume(level); - // set fader to be inactive - this.active = false; + // Schedule next update + root.requestAnimationFrame(this.updateVolume.bind(this)); + } else { + // Log end of fade + this.logger + && this.logger( + 'Fade to ' + String(this.fade.volume.end) + ' complete.', + ); - // done, call back (if callable) - typeof this.fade.callback == "function" && this.fade.callback(); + // Time is up, jump to target volume + this.media.volume = this.scale.internalToVolume(this.fade.volume.end); - // clear fade - this.fade = undefined; - } - } - } + // Set fader to be inactive + this.active = false; - /** - * Internal: Exponential scaler with dynamic range limit. - * - * @param {Number} input - logarithmic input level to be expanded (float, 0…1) - * @param {Number} dynamicRange - expanded output range, in multiples of 10 dB (float, 0…∞) - * @return {Number} - expanded level (float, 0…1) - */ - exponentialScaler(input, dynamicRange) { - // special case: make zero (or any falsy input) return zero - if (input == 0) { - // since the dynamic range is limited, - // allow a zero to produce a plain zero instead of a small faction - // (audio would not be recognized as silent otherwise) - return 0; - } else { - // scale 0…1 to minus something × 10 dB - input = (input - 1) * dynamicRange; + // Done, call back (if callable) + typeof this.fade.callback === 'function' && this.fade.callback(); - // compute power of 10 - return Math.pow(10, input); - } - } + // Clear fade + this.fade = undefined; + } + } + } - /** - * Internal: Logarithmic scaler with dynamic range limit. - * - * @param {Number} input - exponential input level to be compressed (float, 0…1) - * @param {Number} dynamicRange - coerced input range, in multiples of 10 dB (float, 0…∞) - * @return {Number} - compressed level (float, 0…1) - */ - logarithmicScaler(input, dynamicRange) { - // special case: make zero (or any falsy input) return zero - if (input == 0) { - // logarithm of zero would be -∞, which would map to zero anyway - return 0; - } else { - // compute base-10 logarithm - input = Math.log10(input); + /** + * Internal: Exponential scaler with dynamic range limit. + * + * @param {Number} input - logarithmic input level to be expanded (float, 0…1) + * @param {Number} dynamicRange - expanded output range, in multiples of 10 dB (float, 0…∞) + * @return {Number} - expanded level (float, 0…1) + */ + exponentialScaler(input, dynamicRange) { + // Special case: make zero (or any falsy input) return zero + if (input == 0) { + // Since the dynamic range is limited, + // allow a zero to produce a plain zero instead of a small faction + // (audio would not be recognized as silent otherwise) + return 0; + } - // scale minus something × 10 dB to 0…1 (clipping at 0) - return Math.max(1 + input / dynamicRange, 0); - } - } - } + // Scale 0…1 to minus something × 10 dB + input = (input - 1) * dynamicRange; - // export class to root scope - root.VolumeFader = VolumeFader; + // Compute power of 10 + return 10 ** input; + } + + /** + * Internal: Logarithmic scaler with dynamic range limit. + * + * @param {Number} input - exponential input level to be compressed (float, 0…1) + * @param {Number} dynamicRange - coerced input range, in multiples of 10 dB (float, 0…∞) + * @return {Number} - compressed level (float, 0…1) + */ + logarithmicScaler(input, dynamicRange) { + // Special case: make zero (or any falsy input) return zero + if (input == 0) { + // Logarithm of zero would be -∞, which would map to zero anyway + return 0; + } + + // Compute base-10 logarithm + input = Math.log10(input); + + // Scale minus something × 10 dB to 0…1 (clipping at 0) + return Math.max(1 + input / dynamicRange, 0); + } + } + + // Export class to root scope + root.VolumeFader = VolumeFader; })(window); diff --git a/plugins/crossfade/front.js b/plugins/crossfade/front.js index 4107619f..11517e0a 100644 --- a/plugins/crossfade/front.js +++ b/plugins/crossfade/front.js @@ -1,158 +1,160 @@ -const { ipcRenderer } = require("electron"); -const { Howl } = require("howler"); +const { ipcRenderer } = require('electron'); +const { Howl } = require('howler'); // Extracted from https://github.com/bitfasching/VolumeFader -require("./fader"); +require('./fader'); let transitionAudio; // Howler audio used to fade out the current music let firstVideo = true; let waitForTransition; -const defaultConfig = require("../../config/defaults").plugins.crossfade; +const defaultConfig = require('../../config/defaults').plugins.crossfade; + +const configProvider = require('./config'); -const configProvider = require("./config"); let config; -const configGetNum = (key) => Number(config[key]) || defaultConfig[key]; +const configGetNumber = (key) => Number(config[key]) || defaultConfig[key]; const getStreamURL = async (videoID) => { - const url = await ipcRenderer.invoke("audio-url", videoID); - return url; + const url = await ipcRenderer.invoke('audio-url', videoID); + return url; }; -const getVideoIDFromURL = (url) => { - return new URLSearchParams(url.split("?")?.at(-1)).get("v"); -}; +const getVideoIDFromURL = (url) => new URLSearchParams(url.split('?')?.at(-1)).get('v'); -const isReadyToCrossfade = () => { - return transitionAudio && transitionAudio.state() === "loaded"; -}; +const isReadyToCrossfade = () => transitionAudio && transitionAudio.state() === 'loaded'; const watchVideoIDChanges = (cb) => { - navigation.addEventListener("navigate", (event) => { - const currentVideoID = getVideoIDFromURL( - event.currentTarget.currentEntry.url, - ); - const nextVideoID = getVideoIDFromURL(event.destination.url); + navigation.addEventListener('navigate', (event) => { + const currentVideoID = getVideoIDFromURL( + event.currentTarget.currentEntry.url, + ); + const nextVideoID = getVideoIDFromURL(event.destination.url); - if ( - nextVideoID && - currentVideoID && - (firstVideo || nextVideoID !== currentVideoID) - ) { - if (isReadyToCrossfade()) { - crossfade(() => { - cb(nextVideoID); - }); - } else { - cb(nextVideoID); - firstVideo = false; - } - } - }); + if ( + nextVideoID + && currentVideoID + && (firstVideo || nextVideoID !== currentVideoID) + ) { + if (isReadyToCrossfade()) { + crossfade(() => { + cb(nextVideoID); + }); + } else { + cb(nextVideoID); + firstVideo = false; + } + } + }); }; const createAudioForCrossfade = async (url) => { - if (transitionAudio) { - transitionAudio.unload(); - } - transitionAudio = new Howl({ - src: url, - html5: true, - volume: 0, - }); - await syncVideoWithTransitionAudio(); + if (transitionAudio) { + transitionAudio.unload(); + } + + transitionAudio = new Howl({ + src: url, + html5: true, + volume: 0, + }); + await syncVideoWithTransitionAudio(); }; const syncVideoWithTransitionAudio = async () => { - const video = document.querySelector("video"); + const video = document.querySelector('video'); - const videoFader = new VolumeFader(video, { - fadeScaling: configGetNum("fadeScaling"), - fadeDuration: configGetNum("fadeInDuration"), - }); + const videoFader = new VolumeFader(video, { + fadeScaling: configGetNumber('fadeScaling'), + fadeDuration: configGetNumber('fadeInDuration'), + }); - await transitionAudio.play(); - await transitionAudio.seek(video.currentTime); + await transitionAudio.play(); + await transitionAudio.seek(video.currentTime); - video.onseeking = () => { - transitionAudio.seek(video.currentTime); - }; - video.onpause = () => { - transitionAudio.pause(); - }; - video.onplay = async () => { - await transitionAudio.play(); - await transitionAudio.seek(video.currentTime); + video.addEventListener('seeking', () => { + transitionAudio.seek(video.currentTime); + }); - // Fade in - const videoVolume = video.volume; - video.volume = 0; - videoFader.fadeTo(videoVolume); - }; + video.addEventListener('pause', () => { + transitionAudio.pause(); + }); - // Exit just before the end for the transition - const transitionBeforeEnd = () => { - if ( - video.currentTime >= video.duration - configGetNum("secondsBeforeEnd") && - isReadyToCrossfade() - ) { - video.removeEventListener("timeupdate", transitionBeforeEnd); + video.addEventListener('play', async () => { + await transitionAudio.play(); + await transitionAudio.seek(video.currentTime); - // Go to next video - XXX: does not support "repeat 1" mode - document.querySelector(".next-button").click(); - } - }; - video.ontimeupdate = transitionBeforeEnd; + // Fade in + const videoVolume = video.volume; + video.volume = 0; + videoFader.fadeTo(videoVolume); + }); + + // Exit just before the end for the transition + const transitionBeforeEnd = () => { + if ( + video.currentTime >= video.duration - configGetNumber('secondsBeforeEnd') + && isReadyToCrossfade() + ) { + video.removeEventListener('timeupdate', transitionBeforeEnd); + + // Go to next video - XXX: does not support "repeat 1" mode + document.querySelector('.next-button').click(); + } + }; + + video.addEventListener('timeupdate', transitionBeforeEnd); }; const onApiLoaded = () => { - watchVideoIDChanges(async (videoID) => { - await waitForTransition; - const url = await getStreamURL(videoID); - if (!url) { - return; - } - await createAudioForCrossfade(url); - }); + watchVideoIDChanges(async (videoID) => { + await waitForTransition; + const url = await getStreamURL(videoID); + if (!url) { + return; + } + + await createAudioForCrossfade(url); + }); }; const crossfade = async (cb) => { - if (!isReadyToCrossfade()) { - cb(); - return; - } + if (!isReadyToCrossfade()) { + cb(); + return; + } - let resolveTransition; - waitForTransition = new Promise(function (resolve, reject) { - resolveTransition = resolve; - }); + let resolveTransition; + waitForTransition = new Promise((resolve, reject) => { + resolveTransition = resolve; + }); - const video = document.querySelector("video"); + const video = document.querySelector('video'); - const fader = new VolumeFader(transitionAudio._sounds[0]._node, { - initialVolume: video.volume, - fadeScaling: configGetNum("fadeScaling"), - fadeDuration: configGetNum("fadeOutDuration"), - }); + const fader = new VolumeFader(transitionAudio._sounds[0]._node, { + initialVolume: video.volume, + fadeScaling: configGetNumber('fadeScaling'), + fadeDuration: configGetNumber('fadeOutDuration'), + }); - // Fade out the music - video.volume = 0; - fader.fadeOut(() => { - resolveTransition(); - cb(); - }); + // Fade out the music + video.volume = 0; + fader.fadeOut(() => { + resolveTransition(); + cb(); + }); }; module.exports = async () => { - config = await configProvider.getAll(); + config = await configProvider.getAll(); - configProvider.subscribeAll((newConfig) => { - config = newConfig; - }); + configProvider.subscribeAll((newConfig) => { + config = newConfig; + }); - document.addEventListener("apiLoaded", onApiLoaded, { - once: true, - passive: true, - }); + document.addEventListener('apiLoaded', onApiLoaded, { + once: true, + passive: true, + }); }; diff --git a/plugins/crossfade/menu.js b/plugins/crossfade/menu.js index 5ee728c7..8f94135e 100644 --- a/plugins/crossfade/menu.js +++ b/plugins/crossfade/menu.js @@ -1,72 +1,79 @@ -const config = require("./config"); -const defaultOptions = require("../../config/defaults").plugins.crossfade; +const config = require('./config'); -const prompt = require("custom-electron-prompt"); -const promptOptions = require("../../providers/prompt-options"); +const defaultOptions = require('../../config/defaults').plugins.crossfade; + +const prompt = require('custom-electron-prompt'); + +const promptOptions = require('../../providers/prompt-options'); module.exports = (win) => [ - { - label: "Advanced", - click: async () => { - const newOptions = await promptCrossfadeValues(win, config.getAll()); - if (newOptions) config.setAll(newOptions); - }, - }, + { + label: 'Advanced', + async click() { + const newOptions = await promptCrossfadeValues(win, config.getAll()); + if (newOptions) { + config.setAll(newOptions); + } + }, + }, ]; async function promptCrossfadeValues(win, options) { - const res = await prompt( - { - title: "Crossfade Options", - type: "multiInput", - multiInputOptions: [ - { - label: "Fade in duration (ms)", - value: options.fadeInDuration || defaultOptions.fadeInDuration, - inputAttrs: { - type: "number", - required: true, - min: 0, - step: 100, - }, - }, - { - label: "Fade out duration (ms)", - value: options.fadeOutDuration || defaultOptions.fadeOutDuration, - inputAttrs: { - type: "number", - required: true, - min: 0, - step: 100, - }, - }, - { - label: "Crossfade x seconds before end", - value: - options.secondsBeforeEnd || defaultOptions.secondsBeforeEnd, - inputAttrs: { - type: "number", - required: true, - min: 0, - }, - }, - { - label: "Fade scaling", - selectOptions: { linear: "Linear", logarithmic: "Logarithmic" }, - value: options.fadeScaling || defaultOptions.fadeScaling, - }, - ], - resizable: true, - height: 360, - ...promptOptions(), - }, - win, - ).catch(console.error); - if (!res) return undefined; - return { - fadeInDuration: Number(res[0]), - fadeOutDuration: Number(res[1]), - secondsBeforeEnd: Number(res[2]), - fadeScaling: res[3], - }; + const res = await prompt( + { + title: 'Crossfade Options', + type: 'multiInput', + multiInputOptions: [ + { + label: 'Fade in duration (ms)', + value: options.fadeInDuration || defaultOptions.fadeInDuration, + inputAttrs: { + type: 'number', + required: true, + min: 0, + step: 100, + }, + }, + { + label: 'Fade out duration (ms)', + value: options.fadeOutDuration || defaultOptions.fadeOutDuration, + inputAttrs: { + type: 'number', + required: true, + min: 0, + step: 100, + }, + }, + { + label: 'Crossfade x seconds before end', + value: + options.secondsBeforeEnd || defaultOptions.secondsBeforeEnd, + inputAttrs: { + type: 'number', + required: true, + min: 0, + }, + }, + { + label: 'Fade scaling', + selectOptions: { linear: 'Linear', logarithmic: 'Logarithmic' }, + value: options.fadeScaling || defaultOptions.fadeScaling, + }, + ], + resizable: true, + height: 360, + ...promptOptions(), + }, + win, + ).catch(console.error); + if (!res) { + return undefined; + } + + return { + fadeInDuration: Number(res[0]), + fadeOutDuration: Number(res[1]), + secondsBeforeEnd: Number(res[2]), + fadeScaling: res[3], + }; } diff --git a/plugins/disable-autoplay/front.js b/plugins/disable-autoplay/front.js index c34a453a..c9cca0d6 100644 --- a/plugins/disable-autoplay/front.js +++ b/plugins/disable-autoplay/front.js @@ -1,14 +1,14 @@ module.exports = () => { - document.addEventListener('apiLoaded', apiEvent => { - apiEvent.detail.addEventListener('videodatachange', name => { - if (name === 'dataloaded') { - apiEvent.detail.pauseVideo(); - document.querySelector('video').ontimeupdate = e => { - e.target.pause(); - } - } else { - document.querySelector('video').ontimeupdate = null; - } - }) - }, { once: true, passive: true }) + document.addEventListener('apiLoaded', (apiEvent) => { + apiEvent.detail.addEventListener('videodatachange', (name) => { + if (name === 'dataloaded') { + apiEvent.detail.pauseVideo(); + document.querySelector('video').addEventListener('timeupdate', (e) => { + e.target.pause(); + }); + } else { + document.querySelector('video').ontimeupdate = null; + } + }); + }, { once: true, passive: true }); }; diff --git a/plugins/discord/back.js b/plugins/discord/back.js index a8a75986..c4eb4bcf 100644 --- a/plugins/discord/back.js +++ b/plugins/discord/back.js @@ -1,12 +1,12 @@ -"use strict"; -const Discord = require("@xhayper/discord-rpc"); -const { dev } = require("electron-is"); -const { dialog, app } = require("electron"); +'use strict'; +const { dialog, app } = require('electron'); +const Discord = require('@xhayper/discord-rpc'); +const { dev } = require('electron-is'); -const registerCallback = require("../../providers/song-info"); +const registerCallback = require('../../providers/song-info'); // Application ID registered by @Zo-Bro-23 -const clientId = "1043858434585526382"; +const clientId = '1043858434585526382'; /** * @typedef {Object} Info @@ -19,12 +19,12 @@ const clientId = "1043858434585526382"; * @type {Info} */ const info = { - rpc: new Discord.Client({ - clientId - }), - ready: false, - autoReconnect: true, - lastSongInfo: null, + rpc: new Discord.Client({ + clientId, + }), + ready: false, + autoReconnect: true, + lastSongInfo: null, }; /** @@ -33,59 +33,87 @@ const info = { const refreshCallbacks = []; const resetInfo = () => { - info.ready = false; - clearTimeout(clearActivity); - if (dev()) console.log("discord disconnected"); - refreshCallbacks.forEach(cb => cb()); + info.ready = false; + clearTimeout(clearActivity); + if (dev()) { + console.log('discord disconnected'); + } + + for (const cb of refreshCallbacks) { + cb(); + } }; -info.rpc.on("connected", () => { - if (dev()) console.log("discord connected"); - refreshCallbacks.forEach(cb => cb()); +info.rpc.on('connected', () => { + if (dev()) { + console.log('discord connected'); + } + + for (const cb of refreshCallbacks) { + cb(); + } }); -info.rpc.on("ready", () => { - info.ready = true; - if (info.lastSongInfo) updateActivity(info.lastSongInfo) +info.rpc.on('ready', () => { + info.ready = true; + if (info.lastSongInfo) { + updateActivity(info.lastSongInfo); + } }); -info.rpc.on("disconnected", () => { - resetInfo(); +info.rpc.on('disconnected', () => { + resetInfo(); - if (info.autoReconnect) { - connectTimeout(); - } + if (info.autoReconnect) { + connectTimeout(); + } }); const connectTimeout = () => new Promise((resolve, reject) => setTimeout(() => { - if (!info.autoReconnect || info.rpc.isConnected) return; - info.rpc.login().then(resolve).catch(reject); + if (!info.autoReconnect || info.rpc.isConnected) { + return; + } + + info.rpc.login().then(resolve).catch(reject); }, 5000)); const connectRecursive = () => { - if (!info.autoReconnect || info.rpc.isConnected) return; - connectTimeout().catch(connectRecursive); -} + if (!info.autoReconnect || info.rpc.isConnected) { + return; + } + + connectTimeout().catch(connectRecursive); +}; let window; -const connect = (showErr = false) => { - if (info.rpc.isConnected) { - if (dev()) - console.log('Attempted to connect with active connection'); - return; - } +const connect = (showError = false) => { + if (info.rpc.isConnected) { + if (dev()) { + console.log('Attempted to connect with active connection'); + } - info.ready = false; + return; + } - // Startup the rpc client - info.rpc.login({ clientId }).catch(err => { - resetInfo(); - if (dev()) console.error(err); - if (info.autoReconnect) { - connectRecursive(); - } - else if (showErr) dialog.showMessageBox(window, { title: 'Connection failed', message: err.message || String(err), type: 'error' }); - }); + info.ready = false; + + // Startup the rpc client + info.rpc.login({ clientId }).catch((error) => { + resetInfo(); + if (dev()) { + console.error(error); + } + + if (info.autoReconnect) { + connectRecursive(); + } else if (showError) { + dialog.showMessageBox(window, { + title: 'Connection failed', + message: error.message || String(error), + type: 'error', + }); + } + }); }; let clearActivity; @@ -95,75 +123,80 @@ let clearActivity; let updateActivity; module.exports = (win, { autoReconnect, activityTimoutEnabled, activityTimoutTime, listenAlong, hideDurationLeft }) => { - info.autoReconnect = autoReconnect; + info.autoReconnect = autoReconnect; - window = win; - // We get multiple events - // Next song: PAUSE(n), PAUSE(n+1), PLAY(n+1) - // Skip time: PAUSE(N), PLAY(N) - updateActivity = songInfo => { - if (songInfo.title.length === 0 && songInfo.artist.length === 0) { - return; - } - info.lastSongInfo = songInfo; + window = win; + // We get multiple events + // Next song: PAUSE(n), PAUSE(n+1), PLAY(n+1) + // Skip time: PAUSE(N), PLAY(N) + updateActivity = (songInfo) => { + if (songInfo.title.length === 0 && songInfo.artist.length === 0) { + return; + } - // stop the clear activity timout - clearTimeout(clearActivity); + info.lastSongInfo = songInfo; - // stop early if discord connection is not ready - // do this after clearTimeout to avoid unexpected clears - if (!info.rpc || !info.ready) { - return; - } + // Stop the clear activity timout + clearTimeout(clearActivity); - // clear directly if timeout is 0 - if (songInfo.isPaused && activityTimoutEnabled && activityTimoutTime === 0) { - info.rpc.user?.clearActivity().catch(console.error); - return; - } + // Stop early if discord connection is not ready + // do this after clearTimeout to avoid unexpected clears + if (!info.rpc || !info.ready) { + return; + } - // Song information changed, so lets update the rich presence - // @see https://discord.com/developers/docs/topics/gateway#activity-object - // not all options are transfered through https://github.com/discordjs/RPC/blob/6f83d8d812c87cb7ae22064acd132600407d7d05/src/client.js#L518-530 - const activityInfo = { - details: songInfo.title, - state: songInfo.artist, - largeImageKey: songInfo.imageSrc, - largeImageText: songInfo.album, - buttons: listenAlong ? [ - { label: "Listen Along", url: songInfo.url }, - ] : undefined, - }; + // Clear directly if timeout is 0 + if (songInfo.isPaused && activityTimoutEnabled && activityTimoutTime === 0) { + info.rpc.user?.clearActivity().catch(console.error); + return; + } - if (songInfo.isPaused) { - // Add a paused icon to show that the song is paused - activityInfo.smallImageKey = "paused"; - activityInfo.smallImageText = "Paused"; - // Set start the timer so the activity gets cleared after a while if enabled - if (activityTimoutEnabled) - clearActivity = setTimeout(() => info.rpc.user?.clearActivity().catch(console.error), activityTimoutTime ?? 10000); - } else if (!hideDurationLeft) { - // Add the start and end time of the song - const songStartTime = Date.now() - songInfo.elapsedSeconds * 1000; - activityInfo.startTimestamp = songStartTime; - activityInfo.endTimestamp = - songStartTime + songInfo.songDuration * 1000; - } + // Song information changed, so lets update the rich presence + // @see https://discord.com/developers/docs/topics/gateway#activity-object + // not all options are transfered through https://github.com/discordjs/RPC/blob/6f83d8d812c87cb7ae22064acd132600407d7d05/src/client.js#L518-530 + const activityInfo = { + details: songInfo.title, + state: songInfo.artist, + largeImageKey: songInfo.imageSrc, + largeImageText: songInfo.album, + buttons: listenAlong ? [ + { label: 'Listen Along', url: songInfo.url }, + ] : undefined, + }; - info.rpc.user?.setActivity(activityInfo).catch(console.error); - }; + if (songInfo.isPaused) { + // Add a paused icon to show that the song is paused + activityInfo.smallImageKey = 'paused'; + activityInfo.smallImageText = 'Paused'; + // Set start the timer so the activity gets cleared after a while if enabled + if (activityTimoutEnabled) { + clearActivity = setTimeout(() => info.rpc.user?.clearActivity().catch(console.error), activityTimoutTime ?? 10_000); + } + } else if (!hideDurationLeft) { + // Add the start and end time of the song + const songStartTime = Date.now() - songInfo.elapsedSeconds * 1000; + activityInfo.startTimestamp = songStartTime; + activityInfo.endTimestamp + = songStartTime + songInfo.songDuration * 1000; + } - // If the page is ready, register the callback - win.once("ready-to-show", () => { - registerCallback(updateActivity); - connect(); - }); - app.on('window-all-closed', module.exports.clear) + info.rpc.user?.setActivity(activityInfo).catch(console.error); + }; + + // If the page is ready, register the callback + win.once('ready-to-show', () => { + registerCallback(updateActivity); + connect(); + }); + app.on('window-all-closed', module.exports.clear); }; module.exports.clear = () => { - if (info.rpc) info.rpc.user?.clearActivity(); - clearTimeout(clearActivity); + if (info.rpc) { + info.rpc.user?.clearActivity(); + } + + clearTimeout(clearActivity); }; module.exports.connect = connect; diff --git a/plugins/discord/menu.js b/plugins/discord/menu.js index 78d45e0e..c2086586 100644 --- a/plugins/discord/menu.js +++ b/plugins/discord/menu.js @@ -1,84 +1,84 @@ -const prompt = require("custom-electron-prompt"); +const prompt = require('custom-electron-prompt'); -const { setMenuOptions } = require("../../config/plugins"); -const promptOptions = require("../../providers/prompt-options"); -const { clear, connect, registerRefresh, isConnected } = require("./back"); +const { clear, connect, registerRefresh, isConnected } = require('./back'); -const { singleton } = require("../../providers/decorators") +const { setMenuOptions } = require('../../config/plugins'); +const promptOptions = require('../../providers/prompt-options'); +const { singleton } = require('../../providers/decorators'); const registerRefreshOnce = singleton((refreshMenu) => { - registerRefresh(refreshMenu); + registerRefresh(refreshMenu); }); module.exports = (win, options, refreshMenu) => { - registerRefreshOnce(refreshMenu); + registerRefreshOnce(refreshMenu); - return [ - { - label: isConnected() ? "Connected" : "Reconnect", - enabled: !isConnected(), - click: connect, - }, - { - label: "Auto reconnect", - type: "checkbox", - checked: options.autoReconnect, - click: (item) => { - options.autoReconnect = item.checked; - setMenuOptions('discord', options); - }, - }, - { - label: "Clear activity", - click: clear, - }, - { - label: "Clear activity after timeout", - type: "checkbox", - checked: options.activityTimoutEnabled, - click: (item) => { - options.activityTimoutEnabled = item.checked; - setMenuOptions('discord', options); - }, - }, - { - label: "Listen Along", - type: "checkbox", - checked: options.listenAlong, - click: (item) => { - options.listenAlong = item.checked; - setMenuOptions('discord', options); - }, - }, - { - label: "Hide duration left", - type: "checkbox", - checked: options.hideDurationLeft, - click: (item) => { - options.hideDurationLeft = item.checked; - setMenuOptions('discord', options); - } - }, - { - label: "Set inactivity timeout", - click: () => setInactivityTimeout(win, options), - }, - ]; + return [ + { + label: isConnected() ? 'Connected' : 'Reconnect', + enabled: !isConnected(), + click: connect, + }, + { + label: 'Auto reconnect', + type: 'checkbox', + checked: options.autoReconnect, + click(item) { + options.autoReconnect = item.checked; + setMenuOptions('discord', options); + }, + }, + { + label: 'Clear activity', + click: clear, + }, + { + label: 'Clear activity after timeout', + type: 'checkbox', + checked: options.activityTimoutEnabled, + click(item) { + options.activityTimoutEnabled = item.checked; + setMenuOptions('discord', options); + }, + }, + { + label: 'Listen Along', + type: 'checkbox', + checked: options.listenAlong, + click(item) { + options.listenAlong = item.checked; + setMenuOptions('discord', options); + }, + }, + { + label: 'Hide duration left', + type: 'checkbox', + checked: options.hideDurationLeft, + click(item) { + options.hideDurationLeft = item.checked; + setMenuOptions('discord', options); + }, + }, + { + label: 'Set inactivity timeout', + click: () => setInactivityTimeout(win, options), + }, + ]; }; async function setInactivityTimeout(win, options) { - let output = await prompt({ - title: 'Set Inactivity Timeout', - label: 'Enter inactivity timeout in seconds:', - value: Math.round((options.activityTimoutTime ?? 0) / 1e3), - type: "counter", - counterOptions: { minimum: 0, multiFire: true }, - width: 450, - ...promptOptions() - }, win) + const output = await prompt({ + title: 'Set Inactivity Timeout', + label: 'Enter inactivity timeout in seconds:', + value: Math.round((options.activityTimoutTime ?? 0) / 1e3), + type: 'counter', + counterOptions: { minimum: 0, multiFire: true }, + width: 450, + ...promptOptions(), + }, win); - if (output) { - options.activityTimoutTime = Math.round(output * 1e3); - setMenuOptions("discord", options); - } + if (output) { + options.activityTimoutTime = Math.round(output * 1e3); + setMenuOptions('discord', options); + } } diff --git a/plugins/downloader/back.js b/plugins/downloader/back.js index 8a9ae116..09bfd650 100644 --- a/plugins/downloader/back.js +++ b/plugins/downloader/back.js @@ -3,14 +3,26 @@ const { mkdirSync, createWriteStream, writeFileSync, -} = require('fs'); -const { join } = require('path'); +} = require('node:fs'); +const { join } = require('node:path'); + +const { randomBytes } = require('node:crypto'); + +const { ipcMain, app, dialog } = require('electron'); +const is = require('electron-is'); +const { Innertube, UniversalCache, Utils, ClientType } = require('youtubei.js'); +const ytpl = require('ytpl'); // REPLACE with youtubei getplaylist https://github.com/LuanRT/YouTube.js#getplaylistid +const filenamify = require('filenamify'); +const ID3Writer = require('browser-id3-writer'); +const { Mutex } = require('async-mutex'); +const ffmpeg = require('@ffmpeg/ffmpeg').createFFmpeg({ + log: false, + logger() { + }, // Console.log, + progress() { + }, // Console.log, +}); -const { fetchFromGenius } = require('../lyrics-genius/back'); -const { isEnabled } = require('../../config/plugins'); -const { getImage, cleanupName } = require('../../providers/song-info'); -const { injectCSS } = require('../utils'); -const { cache } = require("../../providers/decorators") const { presets, cropMaxWidth, @@ -19,20 +31,12 @@ const { sendFeedback: sendFeedback_, } = require('./utils'); -const { ipcMain, app, dialog } = require('electron'); -const is = require('electron-is'); -const { Innertube, UniversalCache, Utils, ClientType } = require('youtubei.js'); -const ytpl = require('ytpl'); // REPLACE with youtubei getplaylist https://github.com/LuanRT/YouTube.js#getplaylistid +const { fetchFromGenius } = require('../lyrics-genius/back'); +const { isEnabled } = require('../../config/plugins'); +const { getImage, cleanupName } = require('../../providers/song-info'); +const { injectCSS } = require('../utils'); +const { cache } = require('../../providers/decorators'); -const filenamify = require('filenamify'); -const ID3Writer = require('browser-id3-writer'); -const { randomBytes } = require('crypto'); -const Mutex = require('async-mutex').Mutex; -const ffmpeg = require('@ffmpeg/ffmpeg').createFFmpeg({ - log: false, - logger: () => {}, // console.log, - progress: () => {}, // console.log, -}); const ffmpegMutex = new Mutex(); const config = require('./config'); @@ -40,12 +44,12 @@ const config = require('./config'); /** @type {Innertube} */ let yt; let win; -let playingUrl = undefined; +let playingUrl; const sendError = (error, source) => { - win.setProgressBar(-1); // close progress bar - setBadge(0); // close badge - sendFeedback_(win); // reset feedback + win.setProgressBar(-1); // Close progress bar + setBadge(0); // Close badge + sendFeedback_(win); // Reset feedback const songNameMessage = source ? `\nin ${source}` : ''; const cause = error.cause ? `\n\n${error.cause.toString()}` : ''; @@ -71,8 +75,8 @@ module.exports = async (win_) => { }); ipcMain.on('download-song', (_, url) => downloadSong(url)); ipcMain.on('video-src-changed', async (_, data) => { - playingUrl = - JSON.parse(data)?.microformat?.microformatDataRenderer?.urlCanonical; + playingUrl + = JSON.parse(data)?.microformat?.microformatDataRenderer?.urlCanonical; }); ipcMain.on('download-playlist-request', async (_event, url) => downloadPlaylist(url), @@ -86,13 +90,14 @@ async function downloadSong( url, playlistFolder = undefined, trackId = undefined, - increasePlaylistProgress = () => {}, + increasePlaylistProgress = () => { + }, ) { - let resolvedName = undefined; + let resolvedName; try { await downloadSongUnsafe( url, - name=>resolvedName=name, + (name) => resolvedName = name, playlistFolder, trackId, increasePlaylistProgress, @@ -107,7 +112,8 @@ async function downloadSongUnsafe( setName, playlistFolder = undefined, trackId = undefined, - increasePlaylistProgress = () => {}, + increasePlaylistProgress = () => { + }, ) { const sendFeedback = (message, progress) => { if (!playlistFolder) { @@ -128,42 +134,45 @@ async function downloadSongUnsafe( } const metadata = getMetadata(info); - if (metadata.album === 'N/A') metadata.album = ''; + if (metadata.album === 'N/A') { + metadata.album = ''; + } + metadata.trackId = trackId; - const dir = - playlistFolder || config.get('downloadFolder') || app.getPath('downloads'); + const dir + = playlistFolder || config.get('downloadFolder') || app.getPath('downloads'); const name = `${metadata.artist ? `${metadata.artist} - ` : ''}${ metadata.title }`; setName(name); - let playabilityStatus = info.playability_status; - let bypassedResult = null; - if (playabilityStatus.status === "LOGIN_REQUIRED") { - // try to bypass the age restriction - bypassedResult = await getAndroidTvInfo(id); - playabilityStatus = bypassedResult.playability_status; + let playabilityStatus = info.playability_status; + let bypassedResult = null; + if (playabilityStatus.status === 'LOGIN_REQUIRED') { + // Try to bypass the age restriction + bypassedResult = await getAndroidTvInfo(id); + playabilityStatus = bypassedResult.playability_status; - if (playabilityStatus.status === "LOGIN_REQUIRED") { - throw new Error( - `[${playabilityStatus.status}] ${playabilityStatus.reason}`, - ); - } + if (playabilityStatus.status === 'LOGIN_REQUIRED') { + throw new Error( + `[${playabilityStatus.status}] ${playabilityStatus.reason}`, + ); + } - info = bypassedResult; - } + info = bypassedResult; + } - if (playabilityStatus.status === "UNPLAYABLE") { - /** - * @typedef {import('youtubei.js/dist/src/parser/classes/PlayerErrorMessage').default} PlayerErrorMessage - * @type {PlayerErrorMessage} - */ - const errorScreen = playabilityStatus.error_screen; - throw new Error( - `[${playabilityStatus.status}] ${errorScreen.reason.text}: ${errorScreen.subreason.text}`, - ); - } + if (playabilityStatus.status === 'UNPLAYABLE') { + /** + * @typedef {import('youtubei.js/dist/src/parser/classes/PlayerErrorMessage').default} PlayerErrorMessage + * @type {PlayerErrorMessage} + */ + const errorScreen = playabilityStatus.error_screen; + throw new Error( + `[${playabilityStatus.status}] ${errorScreen.reason.text}: ${errorScreen.subreason.text}`, + ); + } const extension = presets[config.get('preset')]?.extension || 'mp3'; @@ -179,9 +188,9 @@ async function downloadSongUnsafe( } const download_options = { - type: 'audio', // audio, video or video+audio - quality: 'best', // best, bestefficiency, 144p, 240p, 480p, 720p and so on. - format: 'any', // media container format + type: 'audio', // Audio, video or video+audio + quality: 'best', // Best, bestefficiency, 144p, 240p, 480p, 720p and so on. + format: 'any', // Media container format }; const format = info.chooseFormat(download_options); @@ -197,16 +206,7 @@ async function downloadSongUnsafe( mkdirSync(dir); } - if (!presets[config.get('preset')]) { - const fileBuffer = await iterableStreamToMP3( - iterableStream, - metadata, - format.content_length, - sendFeedback, - increasePlaylistProgress, - ); - writeFileSync(filePath, await writeID3(fileBuffer, metadata, sendFeedback)); - } else { + if (presets[config.get('preset')]) { const file = createWriteStream(filePath); let downloaded = 0; const total = format.content_length; @@ -219,12 +219,22 @@ async function downloadSongUnsafe( increasePlaylistProgress(ratio); file.write(chunk); } + await ffmpegWriteTags( filePath, metadata, presets[config.get('preset')]?.ffmpegArgs, ); sendFeedback(null, -1); + } else { + const fileBuffer = await iterableStreamToMP3( + iterableStream, + metadata, + format.content_length, + sendFeedback, + increasePlaylistProgress, + ); + writeFileSync(filePath, await writeID3(fileBuffer, metadata, sendFeedback)); } sendFeedback(null, -1); @@ -236,7 +246,8 @@ async function iterableStreamToMP3( metadata, content_length, sendFeedback, - increasePlaylistProgress = () => {}, + increasePlaylistProgress = () => { + }, ) { const chunks = []; let downloaded = 0; @@ -251,7 +262,8 @@ async function iterableStreamToMP3( // This is a very rough estimate, trying to make the progress bar look nice increasePlaylistProgress(ratio * 0.15); } - sendFeedback('Loading…', 2); // indefinite progress bar after download + + sendFeedback('Loading…', 2); // Indefinite progress bar after download const buffer = Buffer.concat(chunks); const safeVideoName = randomBytes(32).toString('hex'); @@ -282,8 +294,8 @@ async function iterableStreamToMP3( sendFeedback('Saving…'); return ffmpeg.FS('readFile', `${safeVideoName}.mp3`); - } catch (e) { - sendError(e, safeVideoName); + } catch (error) { + sendError(error, safeVideoName); } finally { releaseFFmpegMutex(); } @@ -307,6 +319,7 @@ async function writeID3(buffer, metadata, sendFeedback) { if (metadata.album) { writer.setFrame('TALB', metadata.album); } + if (coverBuffer) { writer.setFrame('APIC', { type: 3, @@ -314,22 +327,25 @@ async function writeID3(buffer, metadata, sendFeedback) { description: '', }); } + if (isEnabled('lyrics-genius')) { const lyrics = await fetchFromGenius(metadata); if (lyrics) { writer.setFrame('USLT', { description: '', - lyrics: lyrics, + lyrics, }); } } + if (metadata.trackId) { writer.setFrame('TRCK', metadata.trackId); } + writer.addTag(); return Buffer.from(writer.arrayBuffer); - } catch (e) { - sendError(e, `${metadata.artist} - ${metadata.title}`); + } catch (error) { + sendError(error, `${metadata.artist} - ${metadata.title}`); } } @@ -339,10 +355,11 @@ async function downloadPlaylist(givenUrl) { } catch { givenUrl = undefined; } - const playlistId = - getPlaylistID(givenUrl) || - getPlaylistID(new URL(win.webContents.getURL())) || - getPlaylistID(new URL(playingUrl)); + + const playlistId + = getPlaylistID(givenUrl) + || getPlaylistID(new URL(win.webContents.getURL())) + || getPlaylistID(new URL(playingUrl)); if (!playlistId) { sendError(new Error('No playlist ID found')); @@ -356,24 +373,30 @@ async function downloadPlaylist(givenUrl) { let playlist; try { playlist = await ytpl(playlistId, { - limit: config.get('playlistMaxItems') || Infinity, + limit: config.get('playlistMaxItems') || Number.POSITIVE_INFINITY, }); - } catch (e) { + } catch (error) { sendError( - `Error getting playlist info: make sure it isn\'t a private or "Mixed for you" playlist\n\n${e}`, + `Error getting playlist info: make sure it isn\'t a private or "Mixed for you" playlist\n\n${error}`, ); return; } - if (playlist.items.length === 0) sendError(new Error('Playlist is empty')); + + if (playlist.items.length === 0) { + sendError(new Error('Playlist is empty')); + } + if (playlist.items.length === 1) { sendFeedback('Playlist has only one item, downloading it directly'); await downloadSong(playlist.items[0].url); return; } + const isAlbum = playlist.title.startsWith('Album - '); if (isAlbum) { playlist.title = playlist.title.slice(8); } + const safePlaylistTitle = filenamify(playlist.title, { replacement: ' ' }); const folder = getFolder(config.get('downloadFolder')); @@ -401,7 +424,7 @@ async function downloadPlaylist(givenUrl) { ); } - win.setProgressBar(2); // starts with indefinite bar + win.setProgressBar(2); // Starts with indefinite bar setBadge(playlist.items.length); @@ -424,9 +447,9 @@ async function downloadPlaylist(givenUrl) { playlistFolder, trackId, increaseProgress, - ).catch((e) => + ).catch((error) => sendError( - `Error downloading "${song.author.name} - ${song.title}":\n ${e}`, + `Error downloading "${song.author.name} - ${song.title}":\n ${error}`, ), ); @@ -434,12 +457,12 @@ async function downloadPlaylist(givenUrl) { setBadge(playlist.items.length - counter); counter++; } - } catch (e) { - sendError(e); + } catch (error) { + sendError(error); } finally { - win.setProgressBar(-1); // close progress bar - setBadge(0); // close badge counter - sendFeedback(); // clear feedback + win.setProgressBar(-1); // Close progress bar + setBadge(0); // Close badge counter + sendFeedback(); // Clear feedback } } @@ -458,8 +481,8 @@ async function ffmpegWriteTags(filePath, metadata, ffmpegArgs = []) { ...ffmpegArgs, filePath, ); - } catch (e) { - sendError(e); + } catch (error) { + sendError(error); } finally { releaseFFmpegMutex(); } @@ -482,11 +505,12 @@ function getFFmpegMetadataArgs(metadata) { const INVALID_PLAYLIST_MODIFIER = 'RDAMPL'; const getPlaylistID = (aURL) => { - const result = - aURL?.searchParams.get('list') || aURL?.searchParams.get('playlist'); + const result + = aURL?.searchParams.get('list') || aURL?.searchParams.get('playlist'); if (result?.startsWith(INVALID_PLAYLIST_MODIFIER)) { return result.slice(INVALID_PLAYLIST_MODIFIER.length); } + return result; }; @@ -494,6 +518,7 @@ const getVideoId = (url) => { if (typeof url === 'string') { url = new URL(url); } + return url.searchParams.get('v'); }; @@ -513,7 +538,7 @@ const getAndroidTvInfo = async (id) => { retrieve_player: true, }); const info = await innertube.getBasicInfo(id, 'TV_EMBEDDED'); - // getInfo 404s with the bypass, so we use getBasicInfo instead + // GetInfo 404s with the bypass, so we use getBasicInfo instead // that's fine as we only need the streaming data return info; -} +}; diff --git a/plugins/downloader/config.js b/plugins/downloader/config.js index 12c0384e..8ea738d8 100644 --- a/plugins/downloader/config.js +++ b/plugins/downloader/config.js @@ -1,3 +1,4 @@ const { PluginConfig } = require('../../config/dynamic'); + const config = new PluginConfig('downloader'); module.exports = { ...config }; diff --git a/plugins/downloader/front.js b/plugins/downloader/front.js index e0ab119f..f04e55f5 100644 --- a/plugins/downloader/front.js +++ b/plugins/downloader/front.js @@ -1,69 +1,81 @@ -const { ipcRenderer } = require("electron"); +const { ipcRenderer } = require('electron'); -const { defaultConfig } = require("../../config"); -const { getSongMenu } = require("../../providers/dom-elements"); -const { ElementFromFile, templatePath } = require("../utils"); +const { defaultConfig } = require('../../config'); +const { getSongMenu } = require('../../providers/dom-elements'); +const { ElementFromFile, templatePath } = require('../utils'); let menu = null; let progress = null; const downloadButton = ElementFromFile( - templatePath(__dirname, "download.html") + templatePath(__dirname, 'download.html'), ); let doneFirstLoad = false; const menuObserver = new MutationObserver(() => { - if (!menu) { - menu = getSongMenu(); - if (!menu) return; - } - if (menu.contains(downloadButton)) return; - const menuUrl = document.querySelector('tp-yt-paper-listbox [tabindex="0"] #navigation-endpoint')?.href; - if (!menuUrl?.includes('watch?') && doneFirstLoad) return; + if (!menu) { + menu = getSongMenu(); + if (!menu) { + return; + } + } - menu.prepend(downloadButton); - progress = document.querySelector("#ytmcustom-download"); + if (menu.contains(downloadButton)) { + return; + } - if (doneFirstLoad) return; - setTimeout(() => doneFirstLoad ||= true, 500); + const menuUrl = document.querySelector('tp-yt-paper-listbox [tabindex="0"] #navigation-endpoint')?.href; + if (!menuUrl?.includes('watch?') && doneFirstLoad) { + return; + } + + menu.prepend(downloadButton); + progress = document.querySelector('#ytmcustom-download'); + + if (doneFirstLoad) { + return; + } + + setTimeout(() => doneFirstLoad ||= true, 500); }); // TODO: re-enable once contextIsolation is set to true // contextBridge.exposeInMainWorld("downloader", { // download: () => { global.download = () => { - let videoUrl = getSongMenu() - // selector of first button which is always "Start Radio" - ?.querySelector('ytmusic-menu-navigation-item-renderer[tabindex="0"] #navigation-endpoint') - ?.getAttribute("href"); - if (videoUrl) { - if (videoUrl.startsWith('watch?')) { - videoUrl = defaultConfig.url + "/" + videoUrl; - } - if (videoUrl.includes('?playlist=')) { - ipcRenderer.send('download-playlist-request', videoUrl); - return; - } - } else { - videoUrl = global.songInfo.url || window.location.href; - } + let videoUrl = getSongMenu() + // Selector of first button which is always "Start Radio" + ?.querySelector('ytmusic-menu-navigation-item-renderer[tabindex="0"] #navigation-endpoint') + ?.getAttribute('href'); + if (videoUrl) { + if (videoUrl.startsWith('watch?')) { + videoUrl = defaultConfig.url + '/' + videoUrl; + } - ipcRenderer.send('download-song', videoUrl); + if (videoUrl.includes('?playlist=')) { + ipcRenderer.send('download-playlist-request', videoUrl); + return; + } + } else { + videoUrl = global.songInfo.url || window.location.href; + } + + ipcRenderer.send('download-song', videoUrl); }; module.exports = () => { - document.addEventListener('apiLoaded', () => { - menuObserver.observe(document.querySelector('ytmusic-popup-container'), { - childList: true, - subtree: true, - }); - }, { once: true, passive: true }) + document.addEventListener('apiLoaded', () => { + menuObserver.observe(document.querySelector('ytmusic-popup-container'), { + childList: true, + subtree: true, + }); + }, { once: true, passive: true }); - ipcRenderer.on('downloader-feedback', (_, feedback) => { - if (!progress) { - console.warn("Cannot update progress"); - } else { - progress.innerHTML = feedback || "Download"; - } - }); + ipcRenderer.on('downloader-feedback', (_, feedback) => { + if (progress) { + progress.innerHTML = feedback || 'Download'; + } else { + console.warn('Cannot update progress'); + } + }); }; diff --git a/plugins/downloader/menu.js b/plugins/downloader/menu.js index 6d58bbf2..57953fe9 100644 --- a/plugins/downloader/menu.js +++ b/plugins/downloader/menu.js @@ -1,45 +1,43 @@ -const { dialog } = require("electron"); +const { dialog } = require('electron'); -const { downloadPlaylist } = require("./back"); -const { defaultMenuDownloadLabel, getFolder, presets } = require("./utils"); -const config = require("./config"); +const { downloadPlaylist } = require('./back'); +const { defaultMenuDownloadLabel, getFolder, presets } = require('./utils'); +const config = require('./config'); -module.exports = () => { - return [ - { - label: defaultMenuDownloadLabel, - click: () => downloadPlaylist(), - }, - { - label: "Choose download folder", - click: () => { - const result = dialog.showOpenDialogSync({ - properties: ["openDirectory", "createDirectory"], - defaultPath: getFolder(config.get("downloadFolder")), - }); - if (result) { - config.set("downloadFolder", result[0]); - } // else = user pressed cancel - }, - }, - { - label: "Presets", - submenu: Object.keys(presets).map((preset) => ({ - label: preset, - type: "radio", - checked: config.get("preset") === preset, - click: () => { - config.set("preset", preset); - }, - })), - }, - { - label: "Skip existing files", - type: "checkbox", - checked: config.get("skipExisting"), - click: (item) => { - config.set("skipExisting", item.checked); - }, - }, - ]; -}; +module.exports = () => [ + { + label: defaultMenuDownloadLabel, + click: () => downloadPlaylist(), + }, + { + label: 'Choose download folder', + click() { + const result = dialog.showOpenDialogSync({ + properties: ['openDirectory', 'createDirectory'], + defaultPath: getFolder(config.get('downloadFolder')), + }); + if (result) { + config.set('downloadFolder', result[0]); + } // Else = user pressed cancel + }, + }, + { + label: 'Presets', + submenu: Object.keys(presets).map((preset) => ({ + label: preset, + type: 'radio', + checked: config.get('preset') === preset, + click() { + config.set('preset', preset); + }, + })), + }, + { + label: 'Skip existing files', + type: 'checkbox', + checked: config.get('skipExisting'), + click(item) { + config.set('skipExisting', item.checked); + }, + }, +]; diff --git a/plugins/downloader/style.css b/plugins/downloader/style.css index 6f29fc6b..ea721f30 100644 --- a/plugins/downloader/style.css +++ b/plugins/downloader/style.css @@ -1,21 +1,21 @@ .menu-item { - display: var(--ytmusic-menu-item_-_display); - height: var(--ytmusic-menu-item_-_height); - align-items: var(--ytmusic-menu-item_-_align-items); - padding: var(--ytmusic-menu-item_-_padding); - cursor: pointer; + display: var(--ytmusic-menu-item_-_display); + height: var(--ytmusic-menu-item_-_height); + align-items: var(--ytmusic-menu-item_-_align-items); + padding: var(--ytmusic-menu-item_-_padding); + cursor: pointer; } .menu-item > .yt-simple-endpoint:hover { - background-color: var(--ytmusic-menu-item-hover-background-color); + background-color: var(--ytmusic-menu-item-hover-background-color); } .menu-icon { - flex: var(--ytmusic-menu-item-icon_-_flex); - margin: var(--ytmusic-menu-item-icon_-_margin); - fill: var(--ytmusic-menu-item-icon_-_fill); - stroke: var(--iron-icon-stroke-color, none); - width: var(--iron-icon-width, 24px); - height: var(--iron-icon-height, 24px); - animation: var(--iron-icon_-_animation); + flex: var(--ytmusic-menu-item-icon_-_flex); + margin: var(--ytmusic-menu-item-icon_-_margin); + fill: var(--ytmusic-menu-item-icon_-_fill); + stroke: var(--iron-icon-stroke-color, none); + width: var(--iron-icon-width, 24px); + height: var(--iron-icon-height, 24px); + animation: var(--iron-icon_-_animation); } diff --git a/plugins/downloader/templates/download.html b/plugins/downloader/templates/download.html index ede5ec02..4079a4f5 100644 --- a/plugins/downloader/templates/download.html +++ b/plugins/downloader/templates/download.html @@ -1,45 +1,45 @@ diff --git a/plugins/downloader/utils.js b/plugins/downloader/utils.js index 6b9c449b..2b311d60 100644 --- a/plugins/downloader/utils.js +++ b/plugins/downloader/utils.js @@ -1,38 +1,39 @@ -const { app } = require("electron"); +const { app } = require('electron'); const is = require('electron-is'); -module.exports.getFolder = customFolder => customFolder || app.getPath("downloads"); -module.exports.defaultMenuDownloadLabel = "Download playlist"; +module.exports.getFolder = (customFolder) => customFolder || app.getPath('downloads'); +module.exports.defaultMenuDownloadLabel = 'Download playlist'; module.exports.sendFeedback = (win, message) => { - win.webContents.send("downloader-feedback", message); + win.webContents.send('downloader-feedback', message); }; module.exports.cropMaxWidth = (image) => { - const imageSize = image.getSize(); - // standart youtube artwork width with margins from both sides is 280 + 720 + 280 - if (imageSize.width === 1280 && imageSize.height === 720) { - return image.crop({ - x: 280, - y: 0, - width: 720, - height: 720 - }); - } - return image; -} + const imageSize = image.getSize(); + // Standart youtube artwork width with margins from both sides is 280 + 720 + 280 + if (imageSize.width === 1280 && imageSize.height === 720) { + return image.crop({ + x: 280, + y: 0, + width: 720, + height: 720, + }); + } + + return image; +}; // Presets for FFmpeg module.exports.presets = { - "None (defaults to mp3)": undefined, - opus: { - extension: "opus", - ffmpegArgs: ["-acodec", "libopus"], - }, + 'None (defaults to mp3)': undefined, + 'opus': { + extension: 'opus', + ffmpegArgs: ['-acodec', 'libopus'], + }, }; -module.exports.setBadge = n => { - if (is.linux() || is.macOS()) { - app.setBadgeCount(n); - } -} +module.exports.setBadge = (n) => { + if (is.linux() || is.macOS()) { + app.setBadgeCount(n); + } +}; diff --git a/plugins/exponential-volume/front.js b/plugins/exponential-volume/front.js index ad50d237..9a442251 100644 --- a/plugins/exponential-volume/front.js +++ b/plugins/exponential-volume/front.js @@ -2,46 +2,46 @@ // https://greasyfork.org/en/scripts/397686-youtube-music-fix-volume-ratio/ const exponentialVolume = () => { - // manipulation exponent, higher value = lower volume - // 3 is the value used by pulseaudio, which Barteks2x figured out this gist here: https://gist.github.com/Barteks2x/a4e189a36a10c159bb1644ffca21c02a - // 0.05 (or 5%) is the lowest you can select in the UI which with an exponent of 3 becomes 0.000125 or 0.0125% - const EXPONENT = 3; + // Manipulation exponent, higher value = lower volume + // 3 is the value used by pulseaudio, which Barteks2x figured out this gist here: https://gist.github.com/Barteks2x/a4e189a36a10c159bb1644ffca21c02a + // 0.05 (or 5%) is the lowest you can select in the UI which with an exponent of 3 becomes 0.000125 or 0.0125% + const EXPONENT = 3; - const storedOriginalVolumes = new WeakMap(); - const { get, set } = Object.getOwnPropertyDescriptor( - HTMLMediaElement.prototype, - "volume" - ); - Object.defineProperty(HTMLMediaElement.prototype, "volume", { - get() { - const lowVolume = get.call(this); - const calculatedOriginalVolume = lowVolume ** (1 / EXPONENT); + const storedOriginalVolumes = new WeakMap(); + const { get, set } = Object.getOwnPropertyDescriptor( + HTMLMediaElement.prototype, + 'volume', + ); + Object.defineProperty(HTMLMediaElement.prototype, 'volume', { + get() { + const lowVolume = get.call(this); + const calculatedOriginalVolume = lowVolume ** (1 / EXPONENT); - // The calculated value has some accuracy issues which can lead to problems for implementations that expect exact values. - // To avoid this, I'll store the unmodified volume to return it when read here. - // This mostly solves the issue, but the initial read has no stored value and the volume can also change though external influences. - // To avoid ill effects, I check if the stored volume is somewhere in the same range as the calculated volume. - const storedOriginalVolume = storedOriginalVolumes.get(this); - const storedDeviation = Math.abs( - storedOriginalVolume - calculatedOriginalVolume - ); + // The calculated value has some accuracy issues which can lead to problems for implementations that expect exact values. + // To avoid this, I'll store the unmodified volume to return it when read here. + // This mostly solves the issue, but the initial read has no stored value and the volume can also change though external influences. + // To avoid ill effects, I check if the stored volume is somewhere in the same range as the calculated volume. + const storedOriginalVolume = storedOriginalVolumes.get(this); + const storedDeviation = Math.abs( + storedOriginalVolume - calculatedOriginalVolume, + ); - const originalVolume = - storedDeviation < 0.01 - ? storedOriginalVolume - : calculatedOriginalVolume; - return originalVolume; - }, - set(originalVolume) { - const lowVolume = originalVolume ** EXPONENT; - storedOriginalVolumes.set(this, originalVolume); - set.call(this, lowVolume); - }, - }); + const originalVolume + = storedDeviation < 0.01 + ? storedOriginalVolume + : calculatedOriginalVolume; + return originalVolume; + }, + set(originalVolume) { + const lowVolume = originalVolume ** EXPONENT; + storedOriginalVolumes.set(this, originalVolume); + set.call(this, lowVolume); + }, + }); }; module.exports = () => - document.addEventListener("apiLoaded", exponentialVolume, { - once: true, - passive: true, - }); + document.addEventListener('apiLoaded', exponentialVolume, { + once: true, + passive: true, + }); diff --git a/plugins/in-app-menu/back.js b/plugins/in-app-menu/back.js index d0a54605..9b5e4577 100644 --- a/plugins/in-app-menu/back.js +++ b/plugins/in-app-menu/back.js @@ -1,23 +1,23 @@ -const path = require("path"); - -const electronLocalshortcut = require("electron-localshortcut"); - -const { injectCSS } = require("../utils"); +const path = require('node:path'); +const electronLocalshortcut = require('electron-localshortcut'); const { setupTitlebar, attachTitlebarToWindow } = require('custom-electron-titlebar/main'); + +const { injectCSS } = require('../utils'); + setupTitlebar(); -//tracks menu visibility +// Tracks menu visibility module.exports = (win) => { - // css for custom scrollbar + disable drag area(was causing bugs) - injectCSS(win.webContents, path.join(__dirname, "style.css")); + // Css for custom scrollbar + disable drag area(was causing bugs) + injectCSS(win.webContents, path.join(__dirname, 'style.css')); - win.once("ready-to-show", () => { - attachTitlebarToWindow(win); + win.once('ready-to-show', () => { + attachTitlebarToWindow(win); - electronLocalshortcut.register(win, "`", () => { - win.webContents.send("toggleMenu"); - }); - }); + electronLocalshortcut.register(win, '`', () => { + win.webContents.send('toggleMenu'); + }); + }); }; diff --git a/plugins/in-app-menu/front.js b/plugins/in-app-menu/front.js index e0fcfded..6533dd84 100644 --- a/plugins/in-app-menu/front.js +++ b/plugins/in-app-menu/front.js @@ -1,74 +1,78 @@ -const { ipcRenderer } = require("electron"); -const config = require("../../config"); -const { Titlebar, Color } = require("custom-electron-titlebar"); -const { isEnabled } = require("../../config/plugins"); -function $(selector) { return document.querySelector(selector); } +const { ipcRenderer } = require('electron'); +const { Titlebar, Color } = require('custom-electron-titlebar'); + +const config = require('../../config'); +const { isEnabled } = require('../../config/plugins'); + +function $(selector) { + return document.querySelector(selector); +} module.exports = (options) => { - let visible = () => !!$('.cet-menubar').firstChild; - const bar = new Titlebar({ - icon: "https://cdn-icons-png.flaticon.com/512/5358/5358672.png", - backgroundColor: Color.fromHex("#050505"), - itemBackgroundColor: Color.fromHex("#1d1d1d"), - svgColor: Color.WHITE, - menu: config.get("options.hideMenu") ? null : undefined - }); - bar.updateTitle(" "); - document.title = "Youtube Music"; + const visible = () => Boolean($('.cet-menubar').firstChild); + const bar = new Titlebar({ + icon: 'https://cdn-icons-png.flaticon.com/512/5358/5358672.png', + backgroundColor: Color.fromHex('#050505'), + itemBackgroundColor: Color.fromHex('#1d1d1d'), + svgColor: Color.WHITE, + menu: config.get('options.hideMenu') ? null : undefined, + }); + bar.updateTitle(' '); + document.title = 'Youtube Music'; - const toggleMenu = () => { - if (visible()) { - bar.updateMenu(null); - } else { - bar.refreshMenu(); - } - }; + const toggleMenu = () => { + if (visible()) { + bar.updateMenu(null); + } else { + bar.refreshMenu(); + } + }; - $('.cet-window-icon').addEventListener('click', toggleMenu); - ipcRenderer.on("toggleMenu", toggleMenu); + $('.cet-window-icon').addEventListener('click', toggleMenu); + ipcRenderer.on('toggleMenu', toggleMenu); - ipcRenderer.on("refreshMenu", () => { - if (visible()) { - bar.refreshMenu(); - } - }); + ipcRenderer.on('refreshMenu', () => { + if (visible()) { + bar.refreshMenu(); + } + }); - if (isEnabled("picture-in-picture")) { - ipcRenderer.on("pip-toggle", (_, pipEnabled) => { - bar.refreshMenu(); - }); - } + if (isEnabled('picture-in-picture')) { + ipcRenderer.on('pip-toggle', (_, pipEnabled) => { + bar.refreshMenu(); + }); + } - // Increases the right margin of Navbar background when the scrollbar is visible to avoid blocking it (z-index doesn't affect it) - document.addEventListener('apiLoaded', () => { - setNavbarMargin(); - const playPageObserver = new MutationObserver(setNavbarMargin); - playPageObserver.observe($('ytmusic-app-layout'), { attributeFilter: ['player-page-open_', 'playerPageOpen_'] }) - setupSearchOpenObserver(); - setupMenuOpenObserver(); - }, { once: true, passive: true }) + // Increases the right margin of Navbar background when the scrollbar is visible to avoid blocking it (z-index doesn't affect it) + document.addEventListener('apiLoaded', () => { + setNavbarMargin(); + const playPageObserver = new MutationObserver(setNavbarMargin); + playPageObserver.observe($('ytmusic-app-layout'), { attributeFilter: ['player-page-open_', 'playerPageOpen_'] }); + setupSearchOpenObserver(); + setupMenuOpenObserver(); + }, { once: true, passive: true }); }; function setupSearchOpenObserver() { - const searchOpenObserver = new MutationObserver(mutations => { - $('#nav-bar-background').style.webkitAppRegion = - mutations[0].target.opened ? 'no-drag' : 'drag'; - }); - searchOpenObserver.observe($('ytmusic-search-box'), { attributeFilter: ["opened"] }) + const searchOpenObserver = new MutationObserver((mutations) => { + $('#nav-bar-background').style.webkitAppRegion + = mutations[0].target.opened ? 'no-drag' : 'drag'; + }); + searchOpenObserver.observe($('ytmusic-search-box'), { attributeFilter: ['opened'] }); } function setupMenuOpenObserver() { - const menuOpenObserver = new MutationObserver(mutations => { - $('#nav-bar-background').style.webkitAppRegion = - Array.from($('.cet-menubar').childNodes).some(c => c.classList.contains('open')) ? - 'no-drag' : 'drag'; - }); - menuOpenObserver.observe($('.cet-menubar'), { subtree: true, attributeFilter: ["class"] }) + const menuOpenObserver = new MutationObserver((mutations) => { + $('#nav-bar-background').style.webkitAppRegion + = [...$('.cet-menubar').childNodes].some((c) => c.classList.contains('open')) + ? 'no-drag' : 'drag'; + }); + menuOpenObserver.observe($('.cet-menubar'), { subtree: true, attributeFilter: ['class'] }); } function setNavbarMargin() { - $('#nav-bar-background').style.right = - $('ytmusic-app-layout').playerPageOpen_ ? - '0px' : - '12px'; + $('#nav-bar-background').style.right + = $('ytmusic-app-layout').playerPageOpen_ + ? '0px' + : '12px'; } diff --git a/plugins/in-app-menu/style.css b/plugins/in-app-menu/style.css index f0f31ed8..7cfa4486 100644 --- a/plugins/in-app-menu/style.css +++ b/plugins/in-app-menu/style.css @@ -1,105 +1,107 @@ /* increase font size for menu and menuItems */ .titlebar, .menubar-menu-container .action-label { - font-size: 14px !important; + font-size: 14px !important; } /* fixes nav-bar-background opacity bug, reposition it, and allows clicking scrollbar through it */ #nav-bar-background { - opacity: 1 !important; - pointer-events: none !important; - top: 30px !important; - height: 75px !important; + opacity: 1 !important; + pointer-events: none !important; + top: 30px !important; + height: 75px !important; } /* fix top gap between nav-bar and browse-page */ #browse-page { - padding-top: 0 !important; + padding-top: 0 !important; } /* fix navbar hiding library items */ ytmusic-section-list-renderer[page-type="MUSIC_PAGE_TYPE_LIBRARY_CONTENT_LANDING_PAGE"], ytmusic-section-list-renderer[page-type="MUSIC_PAGE_TYPE_PRIVATELY_OWNED_CONTENT_LANDING_PAGE"] { - top: 50px; - position: relative; + top: 50px; + position: relative; } /* remove window dragging for nav bar (conflict with titlebar drag) */ ytmusic-nav-bar, .tab-titleiron-icon, ytmusic-pivot-bar-item-renderer { - -webkit-app-region: unset !important; + -webkit-app-region: unset !important; } /* move up item selection renderers */ ytmusic-item-section-renderer.stuck #header.ytmusic-item-section-renderer, ytmusic-tabs.stuck { - top: calc(var(--ytmusic-nav-bar-height) - 15px) !important; + top: calc(var(--ytmusic-nav-bar-height) - 15px) !important; } /* fix weird positioning in search screen*/ ytmusic-header-renderer.ytmusic-search-page { - position: unset !important; + position: unset !important; } /* Move navBar downwards */ ytmusic-nav-bar[slot="nav-bar"] { - top: 17px !important; + top: 17px !important; } /* fix page progress bar position*/ yt-page-navigation-progress, #progress.yt-page-navigation-progress { - top: 30px !important; + top: 30px !important; } /* custom scrollbar */ ::-webkit-scrollbar { - width: 12px; - background-color: #030303; - border-radius: 100px; - -moz-border-radius: 100px; - -webkit-border-radius: 100px; + width: 12px; + background-color: #030303; + border-radius: 100px; + -moz-border-radius: 100px; + -webkit-border-radius: 100px; } + /* hover effect for both scrollbar area, and scrollbar 'thumb' */ ::-webkit-scrollbar:hover { - background-color: rgba(15, 15, 15, 0.699); + background-color: rgba(15, 15, 15, 0.699); } /* the scrollbar 'thumb' ...that marque oval shape in a scrollbar */ ::-webkit-scrollbar-thumb:vertical { - border: 2px solid rgba(0, 0, 0, 0); + border: 2px solid rgba(0, 0, 0, 0); - background: #3a3a3a; - background-clip: padding-box; - border-radius: 100px; - -moz-border-radius: 100px; - -webkit-border-radius: 100px; + background: #3a3a3a; + background-clip: padding-box; + border-radius: 100px; + -moz-border-radius: 100px; + -webkit-border-radius: 100px; } + ::-webkit-scrollbar-thumb:vertical:active { - background: #4d4c4c; /* some darker color when you click it */ - border-radius: 100px; - -moz-border-radius: 100px; - -webkit-border-radius: 100px; + background: #4d4c4c; /* some darker color when you click it */ + border-radius: 100px; + -moz-border-radius: 100px; + -webkit-border-radius: 100px; } .cet-menubar-menu-container .cet-action-item { - background-color: inherit + background-color: inherit } /** hideMenu toggler **/ .cet-window-icon { - -webkit-app-region: no-drag; + -webkit-app-region: no-drag; } .cet-window-icon img { - -webkit-user-drag: none; - filter: invert(50%); + -webkit-user-drag: none; + filter: invert(50%); } /** make navbar draggable **/ #nav-bar-background { - -webkit-app-region: drag; + -webkit-app-region: drag; } ytmusic-nav-bar input, @@ -107,5 +109,5 @@ ytmusic-nav-bar span, ytmusic-nav-bar [role="button"], ytmusic-nav-bar yt-icon, tp-yt-iron-dropdown { - -webkit-app-region: no-drag; + -webkit-app-region: no-drag; } diff --git a/plugins/last-fm/back.js b/plugins/last-fm/back.js index a0533d17..8153de81 100644 --- a/plugins/last-fm/back.js +++ b/plugins/last-fm/back.js @@ -1,161 +1,171 @@ +const { shell } = require('electron'); const fetch = require('node-fetch'); const md5 = require('md5'); -const { shell } = require('electron'); + const { setOptions } = require('../../config/plugins'); const registerCallback = require('../../providers/song-info'); const defaultConfig = require('../../config/defaults'); -const createFormData = params => { - // creates the body for in the post request - const formData = new URLSearchParams(); - for (const key in params) { - formData.append(key, params[key]); - } - return formData; -} -const createQueryString = (params, api_sig) => { - // creates a querystring - const queryData = []; - params.api_sig = api_sig; - for (const key in params) { - queryData.push(`${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`); - } - return '?'+queryData.join('&'); -} +const createFormData = (parameters) => { + // Creates the body for in the post request + const formData = new URLSearchParams(); + for (const key in parameters) { + formData.append(key, parameters[key]); + } -const createApiSig = (params, secret) => { - // this function creates the api signature, see: https://www.last.fm/api/authspec - const keys = []; - for (const key in params) { - keys.push(key); - } - keys.sort(); - let sig = ''; - for (const key of keys) { - if (String(key) === 'format') - continue - sig += `${key}${params[key]}`; - } - sig += secret; - sig = md5(sig); - return sig; -} + return formData; +}; + +const createQueryString = (parameters, api_sig) => { + // Creates a querystring + const queryData = []; + parameters.api_sig = api_sig; + for (const key in parameters) { + queryData.push(`${encodeURIComponent(key)}=${encodeURIComponent(parameters[key])}`); + } + + return '?' + queryData.join('&'); +}; + +const createApiSig = (parameters, secret) => { + // This function creates the api signature, see: https://www.last.fm/api/authspec + const keys = []; + for (const key in parameters) { + keys.push(key); + } + + keys.sort(); + let sig = ''; + for (const key of keys) { + if (String(key) === 'format') { + continue; + } + + sig += `${key}${parameters[key]}`; + } + + sig += secret; + sig = md5(sig); + return sig; +}; const createToken = async ({ api_key, api_root, secret }) => { - // creates and stores the auth token - const data = { - method: 'auth.gettoken', - api_key: api_key, - format: 'json' - }; - const api_sig = createApiSig(data, secret); - let response = await fetch(`${api_root}${createQueryString(data, api_sig)}`); - response = await response.json(); - return response?.token; -} + // Creates and stores the auth token + const data = { + method: 'auth.gettoken', + api_key, + format: 'json', + }; + const api_sig = createApiSig(data, secret); + let response = await fetch(`${api_root}${createQueryString(data, api_sig)}`); + response = await response.json(); + return response?.token; +}; -const authenticate = async config => { - // asks the user for authentication - config.token = await createToken(config); - setOptions('last-fm', config); - shell.openExternal(`https://www.last.fm/api/auth/?api_key=${config.api_key}&token=${config.token}`); - return config; -} +const authenticate = async (config) => { + // Asks the user for authentication + config.token = await createToken(config); + setOptions('last-fm', config); + shell.openExternal(`https://www.last.fm/api/auth/?api_key=${config.api_key}&token=${config.token}`); + return config; +}; -const getAndSetSessionKey = async config => { - // get and store the session key - const data = { - api_key: config.api_key, - format: 'json', - method: 'auth.getsession', - token: config.token, - }; - const api_sig = createApiSig(data, config.secret); - let res = await fetch(`${config.api_root}${createQueryString(data, api_sig)}`); - res = await res.json(); - if (res.error) - await authenticate(config); - config.session_key = res?.session?.key; - setOptions('last-fm', config); - return config; -} +const getAndSetSessionKey = async (config) => { + // Get and store the session key + const data = { + api_key: config.api_key, + format: 'json', + method: 'auth.getsession', + token: config.token, + }; + const api_sig = createApiSig(data, config.secret); + let res = await fetch(`${config.api_root}${createQueryString(data, api_sig)}`); + res = await res.json(); + if (res.error) { + await authenticate(config); + } + + config.session_key = res?.session?.key; + setOptions('last-fm', config); + return config; +}; const postSongDataToAPI = async (songInfo, config, data) => { - // this sends a post request to the api, and adds the common data - if (!config.session_key) - await getAndSetSessionKey(config); + // This sends a post request to the api, and adds the common data + if (!config.session_key) { + await getAndSetSessionKey(config); + } - const postData = { - track: songInfo.title, - duration: songInfo.songDuration, - artist: songInfo.artist, - ...(songInfo.album ? { album: songInfo.album } : undefined), // will be undefined if current song is a video - api_key: config.api_key, - sk: config.session_key, - format: 'json', - ...data, - }; + const postData = { + track: songInfo.title, + duration: songInfo.songDuration, + artist: songInfo.artist, + ...(songInfo.album ? { album: songInfo.album } : undefined), // Will be undefined if current song is a video + api_key: config.api_key, + sk: config.session_key, + format: 'json', + ...data, + }; - postData.api_sig = createApiSig(postData, config.secret); - fetch('https://ws.audioscrobbler.com/2.0/', {method: 'POST', body: createFormData(postData)}) - .catch(res => { - if (res.response.data.error == 9) { - // session key is invalid, so remove it from the config and reauthenticate - config.session_key = undefined; - setOptions('last-fm', config); - authenticate(config); - } - }); -} + postData.api_sig = createApiSig(postData, config.secret); + fetch('https://ws.audioscrobbler.com/2.0/', { method: 'POST', body: createFormData(postData) }) + .catch((error) => { + if (error.response.data.error == 9) { + // Session key is invalid, so remove it from the config and reauthenticate + config.session_key = undefined; + setOptions('last-fm', config); + authenticate(config); + } + }); +}; const addScrobble = (songInfo, config) => { - // this adds one scrobbled song to last.fm - const data = { - method: 'track.scrobble', - timestamp: ~~((Date.now() - songInfo.elapsedSeconds) / 1000), - }; - postSongDataToAPI(songInfo, config, data); -} + // This adds one scrobbled song to last.fm + const data = { + method: 'track.scrobble', + timestamp: Math.trunc((Date.now() - songInfo.elapsedSeconds) / 1000), + }; + postSongDataToAPI(songInfo, config, data); +}; const setNowPlaying = (songInfo, config) => { - // this sets the now playing status in last.fm - const data = { - method: 'track.updateNowPlaying', - }; - postSongDataToAPI(songInfo, config, data); -} + // This sets the now playing status in last.fm + const data = { + method: 'track.updateNowPlaying', + }; + postSongDataToAPI(songInfo, config, data); +}; - -// this will store the timeout that will trigger addScrobble -let scrobbleTimer = undefined; +// This will store the timeout that will trigger addScrobble +let scrobbleTimer; const lastfm = async (_win, config) => { - if (!config.api_root) { - // settings are not present, creating them with the default values - config = defaultConfig.plugins['last-fm']; - config.enabled = true; - setOptions('last-fm', config); - } + if (!config.api_root) { + // Settings are not present, creating them with the default values + config = defaultConfig.plugins['last-fm']; + config.enabled = true; + setOptions('last-fm', config); + } - if (!config.session_key) { - // not authenticated - config = await getAndSetSessionKey(config); - } + if (!config.session_key) { + // Not authenticated + config = await getAndSetSessionKey(config); + } - registerCallback( songInfo => { - // set remove the old scrobble timer - clearTimeout(scrobbleTimer); - if (!songInfo.isPaused) { - setNowPlaying(songInfo, config); - // scrobble when the song is half way through, or has passed the 4 minute mark - const scrobbleTime = Math.min(Math.ceil(songInfo.songDuration / 2), 4 * 60); - if (scrobbleTime > songInfo.elapsedSeconds) { - // scrobble still needs to happen - const timeToWait = (scrobbleTime - songInfo.elapsedSeconds) * 1000; - scrobbleTimer = setTimeout(addScrobble, timeToWait, songInfo, config); - } - } - }); -} + registerCallback((songInfo) => { + // Set remove the old scrobble timer + clearTimeout(scrobbleTimer); + if (!songInfo.isPaused) { + setNowPlaying(songInfo, config); + // Scrobble when the song is half way through, or has passed the 4 minute mark + const scrobbleTime = Math.min(Math.ceil(songInfo.songDuration / 2), 4 * 60); + if (scrobbleTime > songInfo.elapsedSeconds) { + // Scrobble still needs to happen + const timeToWait = (scrobbleTime - songInfo.elapsedSeconds) * 1000; + scrobbleTimer = setTimeout(addScrobble, timeToWait, songInfo, config); + } + } + }); +}; module.exports = lastfm; diff --git a/plugins/lyrics-genius/back.js b/plugins/lyrics-genius/back.js index cb781ca8..347470f1 100644 --- a/plugins/lyrics-genius/back.js +++ b/plugins/lyrics-genius/back.js @@ -1,117 +1,123 @@ -const { join } = require("path"); +const { join } = require('node:path'); -const { ipcMain } = require("electron"); -const is = require("electron-is"); -const { convert } = require("html-to-text"); -const fetch = require("node-fetch"); +const { ipcMain } = require('electron'); +const is = require('electron-is'); +const { convert } = require('html-to-text'); +const fetch = require('node-fetch'); -const { cleanupName } = require("../../providers/song-info"); -const { injectCSS } = require("../utils"); -let eastAsianChars = /\p{Script=Han}|\p{Script=Katakana}|\p{Script=Hiragana}|\p{Script=Hangul}|\p{Script=Han}/u; -let revRomanized = false; +const { cleanupName } = require('../../providers/song-info'); +const { injectCSS } = require('../utils'); + +const eastAsianChars = /\p{Script=Han}|\p{Script=Katakana}|\p{Script=Hiragana}|\p{Script=Hangul}|\p{Script=Han}/u; +let revRomanized = false; module.exports = async (win, options) => { - if(options.romanizedLyrics) { - revRomanized = true; - } - injectCSS(win.webContents, join(__dirname, "style.css")); + if (options.romanizedLyrics) { + revRomanized = true; + } - ipcMain.on("search-genius-lyrics", async (event, extractedSongInfo) => { - const metadata = JSON.parse(extractedSongInfo); - event.returnValue = await fetchFromGenius(metadata); - }); + injectCSS(win.webContents, join(__dirname, 'style.css')); + + ipcMain.on('search-genius-lyrics', async (event, extractedSongInfo) => { + const metadata = JSON.parse(extractedSongInfo); + event.returnValue = await fetchFromGenius(metadata); + }); }; const toggleRomanized = () => { - revRomanized = !revRomanized; + revRomanized = !revRomanized; }; const fetchFromGenius = async (metadata) => { - const songTitle = `${cleanupName(metadata.title)}`; - const songArtist = `${cleanupName(metadata.artist)}`; - let lyrics; + const songTitle = `${cleanupName(metadata.title)}`; + const songArtist = `${cleanupName(metadata.artist)}`; + let lyrics; - /* Uses Regex to test the title and artist first for said characters if romanization is enabled. Otherwise normal - Genius Lyrics behavior is observed. - */ - let hasAsianChars = false; - if (revRomanized && (eastAsianChars.test(songTitle) || eastAsianChars.test(songArtist))) { - lyrics = await getLyricsList(`${songArtist} ${songTitle} Romanized`); - hasAsianChars = true; - } else { - lyrics = await getLyricsList(`${songArtist} ${songTitle}`); - } + /* Uses Regex to test the title and artist first for said characters if romanization is enabled. Otherwise normal + Genius Lyrics behavior is observed. + */ + let hasAsianChars = false; + if (revRomanized && (eastAsianChars.test(songTitle) || eastAsianChars.test(songArtist))) { + lyrics = await getLyricsList(`${songArtist} ${songTitle} Romanized`); + hasAsianChars = true; + } else { + lyrics = await getLyricsList(`${songArtist} ${songTitle}`); + } - /* If the romanization toggle is on, and we did not detect any characters in the title or artist, we do a check - for characters in the lyrics themselves. If this check proves true, we search for Romanized lyrics. - */ - if(revRomanized && !hasAsianChars && eastAsianChars.test(lyrics)) { - lyrics = await getLyricsList(`${songArtist} ${songTitle} Romanized`); - } - return lyrics; + /* If the romanization toggle is on, and we did not detect any characters in the title or artist, we do a check + for characters in the lyrics themselves. If this check proves true, we search for Romanized lyrics. + */ + if (revRomanized && !hasAsianChars && eastAsianChars.test(lyrics)) { + lyrics = await getLyricsList(`${songArtist} ${songTitle} Romanized`); + } + + return lyrics; }; /** - * Fetches a JSON of songs which is then parsed and passed into getLyrics to get the lyrical content of the first song - * @param {*} queryString + * Fetches a JSON of songs which is then parsed and passed into getLyrics to get the lyrical content of the first song + * @param {*} queryString * @returns The lyrics of the first song found using the Genius-Lyrics API */ const getLyricsList = async (queryString) => { - let response = await fetch( - `https://genius.com/api/search/multi?per_page=5&q=${encodeURIComponent(queryString)}` - ); - if (!response.ok) { - return null; - } + const response = await fetch( + `https://genius.com/api/search/multi?per_page=5&q=${encodeURIComponent(queryString)}`, + ); + if (!response.ok) { + return null; + } - /* Fetch the first URL with the api, giving a collection of song results. - Pick the first song, parsing the json given by the API. - */ - const info = await response.json(); - let url = ""; - try { - url = info.response.sections.filter((section) => section.type === "song")[0] - .hits[0].result.url; - } catch { - return null; - } - let lyrics = await getLyrics(url); - return lyrics; -} + /* Fetch the first URL with the api, giving a collection of song results. + Pick the first song, parsing the json given by the API. + */ + const info = await response.json(); + let url = ''; + try { + url = info.response.sections.find((section) => section.type === 'song') + .hits[0].result.url; + } catch { + return null; + } + + const lyrics = await getLyrics(url); + return lyrics; +}; /** - * - * @param {*} url + * + * @param {*} url * @returns The lyrics of the song URL provided, null if none */ const getLyrics = async (url) => { - response = await fetch(url); - if (!response.ok) { - return null; - } - if (is.dev()) { - console.log("Fetching lyrics from Genius:", url); - } - const html = await response.text(); - const lyrics = convert(html, { - baseElements: { - selectors: ['[class^="Lyrics__Container"]', ".lyrics"], - }, - selectors: [ - { - selector: "a", - format: "linkFormatter", - }, - ], - formatters: { - // Remove links by keeping only the content - linkFormatter: (elem, walk, builder) => { - walk(elem.children, builder); - }, - }, - }); - return lyrics; + response = await fetch(url); + if (!response.ok) { + return null; + } + + if (is.dev()) { + console.log('Fetching lyrics from Genius:', url); + } + + const html = await response.text(); + const lyrics = convert(html, { + baseElements: { + selectors: ['[class^="Lyrics__Container"]', '.lyrics'], + }, + selectors: [ + { + selector: 'a', + format: 'linkFormatter', + }, + ], + formatters: { + // Remove links by keeping only the content + linkFormatter(element, walk, builder) { + walk(element.children, builder); + }, + }, + }); + return lyrics; }; module.exports.toggleRomanized = toggleRomanized; -module.exports.fetchFromGenius = fetchFromGenius; \ No newline at end of file +module.exports.fetchFromGenius = fetchFromGenius; diff --git a/plugins/lyrics-genius/front.js b/plugins/lyrics-genius/front.js index 5725d1e1..4139b4b1 100644 --- a/plugins/lyrics-genius/front.js +++ b/plugins/lyrics-genius/front.js @@ -1,94 +1,95 @@ -const { ipcRenderer } = require("electron"); -const is = require("electron-is"); +const { ipcRenderer } = require('electron'); +const is = require('electron-is'); module.exports = () => { - ipcRenderer.on("update-song-info", (_, extractedSongInfo) => setTimeout(() => { - const tabList = document.querySelectorAll("tp-yt-paper-tab"); - const tabs = { - upNext: tabList[0], - lyrics: tabList[1], - discover: tabList[2], - } + ipcRenderer.on('update-song-info', (_, extractedSongInfo) => setTimeout(() => { + const tabList = document.querySelectorAll('tp-yt-paper-tab'); + const tabs = { + upNext: tabList[0], + lyrics: tabList[1], + discover: tabList[2], + }; - // Check if disabled - if (!tabs.lyrics?.hasAttribute("disabled")) { - return; - } + // Check if disabled + if (!tabs.lyrics?.hasAttribute('disabled')) { + return; + } - let hasLyrics = true; + let hasLyrics = true; - const lyrics = ipcRenderer.sendSync( - "search-genius-lyrics", - extractedSongInfo - ); - if (!lyrics) { - // Delete previous lyrics if tab is open and couldn't get new lyrics - checkLyricsContainer(() => { - hasLyrics = false; - setTabsOnclick(undefined); - }); - return; - } + const lyrics = ipcRenderer.sendSync( + 'search-genius-lyrics', + extractedSongInfo, + ); + if (!lyrics) { + // Delete previous lyrics if tab is open and couldn't get new lyrics + checkLyricsContainer(() => { + hasLyrics = false; + setTabsOnclick(undefined); + }); + return; + } - if (is.dev()) { - console.log("Fetched lyrics from Genius"); - } + if (is.dev()) { + console.log('Fetched lyrics from Genius'); + } - enableLyricsTab(); + enableLyricsTab(); - setTabsOnclick(enableLyricsTab); + setTabsOnclick(enableLyricsTab); - checkLyricsContainer(); + checkLyricsContainer(); - tabs.lyrics.onclick = () => { - const tabContainer = document.querySelector("ytmusic-tab-renderer"); - const observer = new MutationObserver((_, observer) => { - checkLyricsContainer(() => observer.disconnect()); - }); - observer.observe(tabContainer, { - attributes: true, - childList: true, - subtree: true, - }); - }; + tabs.lyrics.addEventListener('click', () => { + const tabContainer = document.querySelector('ytmusic-tab-renderer'); + const observer = new MutationObserver((_, observer) => { + checkLyricsContainer(() => observer.disconnect()); + }); + observer.observe(tabContainer, { + attributes: true, + childList: true, + subtree: true, + }); + }); - function checkLyricsContainer(callback = () => {}) { - const lyricsContainer = document.querySelector( - '[page-type="MUSIC_PAGE_TYPE_TRACK_LYRICS"] > ytmusic-message-renderer' - ); - if (lyricsContainer) { - callback(); - setLyrics(lyricsContainer) - } - } + function checkLyricsContainer(callback = () => { + }) { + const lyricsContainer = document.querySelector( + '[page-type="MUSIC_PAGE_TYPE_TRACK_LYRICS"] > ytmusic-message-renderer', + ); + if (lyricsContainer) { + callback(); + setLyrics(lyricsContainer); + } + } - function setLyrics(lyricsContainer) { - lyricsContainer.innerHTML = `
+ function setLyrics(lyricsContainer) { + lyricsContainer.innerHTML = `
${ - hasLyrics - ? lyrics.replace(/(?:\r\n|\r|\n)/g, "
") - : "Could not retrieve lyrics from genius" - } + hasLyrics + ? lyrics.replaceAll(/\r\n|\r|\n/g, '
') + : 'Could not retrieve lyrics from genius' + }
`; - if (hasLyrics) { - lyricsContainer.querySelector('.footer').textContent = 'Source: Genius'; - enableLyricsTab(); - } - } + if (hasLyrics) { + lyricsContainer.querySelector('.footer').textContent = 'Source: Genius'; + enableLyricsTab(); + } + } - function setTabsOnclick(callback) { - for (const tab of [tabs.upNext, tabs.discover]) { - if (tab) { - tab.onclick = callback; - } - } - } + function setTabsOnclick(callback) { + for (const tab of [tabs.upNext, tabs.discover]) { + if (tab) { + tab.addEventListener('click', callback); + } + } + } - function enableLyricsTab() { - tabs.lyrics.removeAttribute("disabled"); - tabs.lyrics.removeAttribute("aria-disabled"); - } - }, 500)); + function enableLyricsTab() { + tabs.lyrics.removeAttribute('disabled'); + tabs.lyrics.removeAttribute('aria-disabled'); + } + }, 500)); }; diff --git a/plugins/lyrics-genius/menu.js b/plugins/lyrics-genius/menu.js index 5d8c390e..e2af715b 100644 --- a/plugins/lyrics-genius/menu.js +++ b/plugins/lyrics-genius/menu.js @@ -1,17 +1,16 @@ -const { setOptions } = require("../../config/plugins"); -const { toggleRomanized } = require("./back"); +const { toggleRomanized } = require('./back'); -module.exports = (win, options, refreshMenu) => { - return [ - { - label: "Romanized Lyrics", - type: "checkbox", - checked: options.romanizedLyrics, - click: (item) => { - options.romanizedLyrics = item.checked; - setOptions('lyrics-genius', options); - toggleRomanized(); - }, - }, - ]; -}; \ No newline at end of file +const { setOptions } = require('../../config/plugins'); + +module.exports = (win, options, refreshMenu) => [ + { + label: 'Romanized Lyrics', + type: 'checkbox', + checked: options.romanizedLyrics, + click(item) { + options.romanizedLyrics = item.checked; + setOptions('lyrics-genius', options); + toggleRomanized(); + }, + }, +]; diff --git a/plugins/lyrics-genius/style.css b/plugins/lyrics-genius/style.css index d2d6c79f..65412b96 100644 --- a/plugins/lyrics-genius/style.css +++ b/plugins/lyrics-genius/style.css @@ -1,12 +1,12 @@ /* Disable links in Genius lyrics */ .genius-lyrics a { - color: var(--ytmusic-text-primary); - display: inline-block; - pointer-events: none; - text-decoration: none; + color: var(--ytmusic-text-primary); + display: inline-block; + pointer-events: none; + text-decoration: none; } .description { - font-size: clamp(1.4rem, 1.1vmax, 3rem) !important; - text-align: center !important; + font-size: clamp(1.4rem, 1.1vmax, 3rem) !important; + text-align: center !important; } diff --git a/plugins/navigation/actions.js b/plugins/navigation/actions.js index 69c8536b..4a845d2f 100644 --- a/plugins/navigation/actions.js +++ b/plugins/navigation/actions.js @@ -1,24 +1,24 @@ -const { triggerAction } = require("../utils"); +const { triggerAction } = require('../utils'); -const CHANNEL = "navigation"; +const CHANNEL = 'navigation'; const ACTIONS = { - NEXT: "next", - BACK: "back", + NEXT: 'next', + BACK: 'back', }; function goToNextPage() { - triggerAction(CHANNEL, ACTIONS.NEXT); + triggerAction(CHANNEL, ACTIONS.NEXT); } function goToPreviousPage() { - triggerAction(CHANNEL, ACTIONS.BACK); + triggerAction(CHANNEL, ACTIONS.BACK); } module.exports = { - CHANNEL: CHANNEL, - ACTIONS: ACTIONS, - actions: { - goToNextPage: goToNextPage, - goToPreviousPage: goToPreviousPage, - }, + CHANNEL, + ACTIONS, + actions: { + goToNextPage, + goToPreviousPage, + }, }; diff --git a/plugins/navigation/back.js b/plugins/navigation/back.js index 4c3e00dc..b1661b36 100644 --- a/plugins/navigation/back.js +++ b/plugins/navigation/back.js @@ -1,29 +1,37 @@ -const path = require("path"); +const path = require('node:path'); -const { injectCSS, listenAction } = require("../utils"); -const { ACTIONS, CHANNEL } = require("./actions.js"); +const { ACTIONS, CHANNEL } = require('./actions.js'); + +const { injectCSS, listenAction } = require('../utils'); function handle(win) { - injectCSS(win.webContents, path.join(__dirname, "style.css"), () => { - win.webContents.send("navigation-css-ready"); - }); + injectCSS(win.webContents, path.join(__dirname, 'style.css'), () => { + win.webContents.send('navigation-css-ready'); + }); - listenAction(CHANNEL, (event, action) => { - switch (action) { - case ACTIONS.NEXT: - if (win.webContents.canGoForward()) { - win.webContents.goForward(); - } - break; - case ACTIONS.BACK: - if (win.webContents.canGoBack()) { - win.webContents.goBack(); - } - break; - default: - console.log("Unknown action: " + action); - } - }); + listenAction(CHANNEL, (event, action) => { + switch (action) { + case ACTIONS.NEXT: { + if (win.webContents.canGoForward()) { + win.webContents.goForward(); + } + + break; + } + + case ACTIONS.BACK: { + if (win.webContents.canGoBack()) { + win.webContents.goBack(); + } + + break; + } + + default: { + console.log('Unknown action: ' + action); + } + } + }); } module.exports = handle; diff --git a/plugins/navigation/front.js b/plugins/navigation/front.js index 4874c3d5..30135e05 100644 --- a/plugins/navigation/front.js +++ b/plugins/navigation/front.js @@ -1,19 +1,19 @@ -const { ipcRenderer } = require("electron"); +const { ipcRenderer } = require('electron'); -const { ElementFromFile, templatePath } = require("../utils"); +const { ElementFromFile, templatePath } = require('../utils'); function run() { - ipcRenderer.on("navigation-css-ready", () => { - const forwardButton = ElementFromFile( - templatePath(__dirname, "forward.html") - ); - const backButton = ElementFromFile(templatePath(__dirname, "back.html")); - const menu = document.querySelector("#right-content"); + ipcRenderer.on('navigation-css-ready', () => { + const forwardButton = ElementFromFile( + templatePath(__dirname, 'forward.html'), + ); + const backButton = ElementFromFile(templatePath(__dirname, 'back.html')); + const menu = document.querySelector('#right-content'); - if (menu) { - menu.prepend(backButton, forwardButton); - } - }); + if (menu) { + menu.prepend(backButton, forwardButton); + } + }); } module.exports = run; diff --git a/plugins/navigation/style.css b/plugins/navigation/style.css index 520befea..5b3988b9 100644 --- a/plugins/navigation/style.css +++ b/plugins/navigation/style.css @@ -1,35 +1,35 @@ .navigation-item { - font-family: Roboto, Noto Naskh Arabic UI, Arial, sans-serif; - font-size: 20px; - line-height: var(--ytmusic-title-1_-_line-height); - font-weight: 500; - --yt-endpoint-color: #fff; - --yt-endpoint-hover-color: #fff; - --yt-endpoint-visited-color: #fff; - display: inline-flex; - align-items: center; - color: rgba(255, 255, 255, 0.5); - cursor: pointer; - margin: 0 var(--ytd-rich-grid-item-margin); + font-family: Roboto, Noto Naskh Arabic UI, Arial, sans-serif; + font-size: 20px; + line-height: var(--ytmusic-title-1_-_line-height); + font-weight: 500; + --yt-endpoint-color: #fff; + --yt-endpoint-hover-color: #fff; + --yt-endpoint-visited-color: #fff; + display: inline-flex; + align-items: center; + color: rgba(255, 255, 255, 0.5); + cursor: pointer; + margin: 0 var(--ytd-rich-grid-item-margin); } .navigation-item:hover { - color: #fff; + color: #fff; } .navigation-icon { - display: inline-flex; - -ms-flex-align: center; - -webkit-align-items: center; - align-items: center; - -ms-flex-pack: center; - -webkit-justify-content: center; - justify-content: center; - position: relative; - vertical-align: middle; - fill: var(--iron-icon-fill-color, currentcolor); - stroke: none; - width: var(--iron-icon-width, 24px); - height: var(--iron-icon-height, 24px); - animation: var(--iron-icon_-_animation); + display: inline-flex; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + -ms-flex-pack: center; + -webkit-justify-content: center; + justify-content: center; + position: relative; + vertical-align: middle; + fill: var(--iron-icon-fill-color, currentcolor); + stroke: none; + width: var(--iron-icon-width, 24px); + height: var(--iron-icon-height, 24px); + animation: var(--iron-icon_-_animation); } diff --git a/plugins/navigation/templates/back.html b/plugins/navigation/templates/back.html index b872ada5..083cf380 100644 --- a/plugins/navigation/templates/back.html +++ b/plugins/navigation/templates/back.html @@ -1,33 +1,33 @@ diff --git a/plugins/navigation/templates/forward.html b/plugins/navigation/templates/forward.html index b3837b36..84c717be 100644 --- a/plugins/navigation/templates/forward.html +++ b/plugins/navigation/templates/forward.html @@ -1,35 +1,35 @@
diff --git a/plugins/no-google-login/back.js b/plugins/no-google-login/back.js index fa96b863..897e8bc3 100644 --- a/plugins/no-google-login/back.js +++ b/plugins/no-google-login/back.js @@ -1,6 +1,7 @@ -const { injectCSS } = require("../utils"); -const path = require("path"); +const path = require('node:path'); -module.exports = win => { - injectCSS(win.webContents, path.join(__dirname, "style.css")); +const { injectCSS } = require('../utils'); + +module.exports = (win) => { + injectCSS(win.webContents, path.join(__dirname, 'style.css')); }; diff --git a/plugins/no-google-login/front.js b/plugins/no-google-login/front.js index bd364ae5..c51a3255 100644 --- a/plugins/no-google-login/front.js +++ b/plugins/no-google-login/front.js @@ -1,37 +1,37 @@ function removeLoginElements() { - const elementsToRemove = [ - ".sign-in-link.ytmusic-nav-bar", - '.ytmusic-pivot-bar-renderer[tab-id="FEmusic_liked"]', - ]; + const elementsToRemove = [ + '.sign-in-link.ytmusic-nav-bar', + '.ytmusic-pivot-bar-renderer[tab-id="FEmusic_liked"]', + ]; - elementsToRemove.forEach((selector) => { - const node = document.querySelector(selector); - if (node) { - node.remove(); - } - }); + for (const selector of elementsToRemove) { + const node = document.querySelector(selector); + if (node) { + node.remove(); + } + } - // Remove the library button - const libraryIconPath = - "M16,6v2h-2v5c0,1.1-0.9,2-2,2s-2-0.9-2-2s0.9-2,2-2c0.37,0,0.7,0.11,1,0.28V6H16z M18,20H4V6H3v15h15V20z M21,3H6v15h15V3z M7,4h13v13H7V4z"; - const observer = new MutationObserver(() => { - menuEntries = document.querySelectorAll( - "#items ytmusic-guide-entry-renderer" - ); - menuEntries.forEach((item) => { - const icon = item.querySelector("path"); - if (icon) { - observer.disconnect(); - if (icon.getAttribute("d") === libraryIconPath) { - item.remove(); - } - } - }); - }); - observer.observe(document.documentElement, { - childList: true, - subtree: true, - }); + // Remove the library button + const libraryIconPath + = 'M16,6v2h-2v5c0,1.1-0.9,2-2,2s-2-0.9-2-2s0.9-2,2-2c0.37,0,0.7,0.11,1,0.28V6H16z M18,20H4V6H3v15h15V20z M21,3H6v15h15V3z M7,4h13v13H7V4z'; + const observer = new MutationObserver(() => { + menuEntries = document.querySelectorAll( + '#items ytmusic-guide-entry-renderer', + ); + for (const item of menuEntries) { + const icon = item.querySelector('path'); + if (icon) { + observer.disconnect(); + if (icon.getAttribute('d') === libraryIconPath) { + item.remove(); + } + } + } + }); + observer.observe(document.documentElement, { + childList: true, + subtree: true, + }); } module.exports = removeLoginElements; diff --git a/plugins/no-google-login/style.css b/plugins/no-google-login/style.css index 09f09013..e9c80f14 100644 --- a/plugins/no-google-login/style.css +++ b/plugins/no-google-login/style.css @@ -2,5 +2,5 @@ ytmusic-guide-signin-promo-renderer, a[href="/music_premium"], .sign-in-link { - display: none !important; + display: none !important; } diff --git a/plugins/notifications/back.js b/plugins/notifications/back.js index 385ecca7..867f65e6 100644 --- a/plugins/notifications/back.js +++ b/plugins/notifications/back.js @@ -1,46 +1,49 @@ -const { Notification } = require("electron"); -const is = require("electron-is"); -const registerCallback = require("../../providers/song-info"); -const { notificationImage } = require("./utils"); -const config = require("./config"); +const { Notification } = require('electron'); +const is = require('electron-is'); + +const { notificationImage } = require('./utils'); +const config = require('./config'); + +const registerCallback = require('../../providers/song-info'); const notify = (info) => { + // Fill the notification with content + const notification = { + title: info.title || 'Playing', + body: info.artist, + icon: notificationImage(info), + silent: true, + urgency: config.get('urgency'), + }; - // Fill the notification with content - const notification = { - title: info.title || "Playing", - body: info.artist, - icon: notificationImage(info), - silent: true, - urgency: config.get('urgency'), - }; + // Send the notification + const currentNotification = new Notification(notification); + currentNotification.show(); - // Send the notification - const currentNotification = new Notification(notification); - currentNotification.show() - - return currentNotification; + return currentNotification; }; const setup = () => { - let oldNotification; - let currentUrl; + let oldNotification; + let currentUrl; - registerCallback(songInfo => { - if (!songInfo.isPaused && (songInfo.url !== currentUrl || config.get('unpauseNotification'))) { - // Close the old notification - oldNotification?.close(); - currentUrl = songInfo.url; - // This fixes a weird bug that would cause the notification to be updated instead of showing - setTimeout(() => { oldNotification = notify(songInfo) }, 10); - } - }); -} + registerCallback((songInfo) => { + if (!songInfo.isPaused && (songInfo.url !== currentUrl || config.get('unpauseNotification'))) { + // Close the old notification + oldNotification?.close(); + currentUrl = songInfo.url; + // This fixes a weird bug that would cause the notification to be updated instead of showing + setTimeout(() => { + oldNotification = notify(songInfo); + }, 10); + } + }); +}; /** @param {Electron.BrowserWindow} win */ module.exports = (win, options) => { - // Register the callback for new song information - is.windows() && options.interactive ? - require("./interactive")(win) : - setup(); + // Register the callback for new song information + is.windows() && options.interactive + ? require('./interactive')(win) + : setup(); }; diff --git a/plugins/notifications/config.js b/plugins/notifications/config.js index d0898dc3..2bd87052 100644 --- a/plugins/notifications/config.js +++ b/plugins/notifications/config.js @@ -1,5 +1,5 @@ -const { PluginConfig } = require("../../config/dynamic"); +const { PluginConfig } = require('../../config/dynamic'); -const config = new PluginConfig("notifications"); +const config = new PluginConfig('notifications'); module.exports = { ...config }; diff --git a/plugins/notifications/interactive.js b/plugins/notifications/interactive.js index 7bda6944..d41b289d 100644 --- a/plugins/notifications/interactive.js +++ b/plugins/notifications/interactive.js @@ -1,151 +1,170 @@ -const { notificationImage, icons, save_temp_icons, secondsToMinutes, ToastStyles } = require("./utils"); +const path = require('node:path'); + +const { Notification, app, ipcMain } = require('electron'); + +const { notificationImage, icons, save_temp_icons, secondsToMinutes, ToastStyles } = require('./utils'); + +const config = require('./config'); + const getSongControls = require('../../providers/song-controls'); -const registerCallback = require("../../providers/song-info"); -const { changeProtocolHandler } = require("../../providers/protocol-handler"); -const { setTrayOnClick, setTrayOnDoubleClick } = require("../../tray"); +const registerCallback = require('../../providers/song-info'); +const { changeProtocolHandler } = require('../../providers/protocol-handler'); +const { setTrayOnClick, setTrayOnDoubleClick } = require('../../tray'); -const { Notification, app, ipcMain } = require("electron"); -const path = require('path'); - -const config = require("./config"); let songControls; let savedNotification; /** @param {Electron.BrowserWindow} win */ module.exports = (win) => { - songControls = getSongControls(win); + songControls = getSongControls(win); - let currentSeconds = 0; - ipcMain.on('apiLoaded', () => win.webContents.send('setupTimeChangedListener')); + let currentSeconds = 0; + ipcMain.on('apiLoaded', () => win.webContents.send('setupTimeChangedListener')); - ipcMain.on('timeChanged', (_, t) => currentSeconds = t); + ipcMain.on('timeChanged', (_, t) => currentSeconds = t); - if (app.isPackaged) save_temp_icons(); + if (app.isPackaged) { + save_temp_icons(); + } - let savedSongInfo; - let lastUrl; + let savedSongInfo; + let lastUrl; - // Register songInfoCallback - registerCallback(songInfo => { - if (!songInfo.artist && !songInfo.title) return; - savedSongInfo = { ...songInfo }; - if (!songInfo.isPaused && - (songInfo.url !== lastUrl || config.get("unpauseNotification")) - ) { - lastUrl = songInfo.url - sendNotification(songInfo); - } - }); - - if (config.get("trayControls")) { - setTrayOnClick(() => { - if (savedNotification) { - savedNotification.close(); - savedNotification = undefined; - } else if (savedSongInfo) { - sendNotification({ - ...savedSongInfo, - elapsedSeconds: currentSeconds - }) - } - }); - - setTrayOnDoubleClick(() => { - if (win.isVisible()) { - win.hide(); - } else win.show(); - }) + // Register songInfoCallback + registerCallback((songInfo) => { + if (!songInfo.artist && !songInfo.title) { + return; } + savedSongInfo = { ...songInfo }; + if (!songInfo.isPaused + && (songInfo.url !== lastUrl || config.get('unpauseNotification')) + ) { + lastUrl = songInfo.url; + sendNotification(songInfo); + } + }); - app.once("before-quit", () => { - savedNotification?.close(); + if (config.get('trayControls')) { + setTrayOnClick(() => { + if (savedNotification) { + savedNotification.close(); + savedNotification = undefined; + } else if (savedSongInfo) { + sendNotification({ + ...savedSongInfo, + elapsedSeconds: currentSeconds, + }); + } }); + setTrayOnDoubleClick(() => { + if (win.isVisible()) { + win.hide(); + } else { + win.show(); + } + }); + } - changeProtocolHandler( - (cmd) => { - if (Object.keys(songControls).includes(cmd)) { - songControls[cmd](); - if (config.get("refreshOnPlayPause") && ( - cmd === 'pause' || - (cmd === 'play' && !config.get("unpauseNotification")) - ) - ) { - setImmediate(() => - sendNotification({ - ...savedSongInfo, - isPaused: cmd === 'pause', - elapsedSeconds: currentSeconds - }) - ); - } - } + app.once('before-quit', () => { + savedNotification?.close(); + }); + + changeProtocolHandler( + (cmd) => { + if (Object.keys(songControls).includes(cmd)) { + songControls[cmd](); + if (config.get('refreshOnPlayPause') && ( + cmd === 'pause' + || (cmd === 'play' && !config.get('unpauseNotification')) + ) + ) { + setImmediate(() => + sendNotification({ + ...savedSongInfo, + isPaused: cmd === 'pause', + elapsedSeconds: currentSeconds, + }), + ); } - ) -} + } + }, + ); +}; function sendNotification(songInfo) { - const iconSrc = notificationImage(songInfo); + const iconSrc = notificationImage(songInfo); - savedNotification?.close(); + savedNotification?.close(); - savedNotification = new Notification({ - title: songInfo.title || "Playing", - body: songInfo.artist, - icon: iconSrc, - silent: true, - // https://learn.microsoft.com/en-us/uwp/schemas/tiles/toastschema/schema-root - // https://learn.microsoft.com/en-us/windows/apps/design/shell/tiles-and-notifications/toast-schema - // https://learn.microsoft.com/en-us/windows/apps/design/shell/tiles-and-notifications/adaptive-interactive-toasts?tabs=xml - // https://learn.microsoft.com/en-us/uwp/api/windows.ui.notifications.toasttemplatetype - toastXml: get_xml(songInfo, iconSrc), - }); + savedNotification = new Notification({ + title: songInfo.title || 'Playing', + body: songInfo.artist, + icon: iconSrc, + silent: true, + // https://learn.microsoft.com/en-us/uwp/schemas/tiles/toastschema/schema-root + // https://learn.microsoft.com/en-us/windows/apps/design/shell/tiles-and-notifications/toast-schema + // https://learn.microsoft.com/en-us/windows/apps/design/shell/tiles-and-notifications/adaptive-interactive-toasts?tabs=xml + // https://learn.microsoft.com/en-us/uwp/api/windows.ui.notifications.toasttemplatetype + toastXml: get_xml(songInfo, iconSrc), + }); - savedNotification.on("close", (_) => { - savedNotification = undefined; - }); + savedNotification.on('close', (_) => { + savedNotification = undefined; + }); - savedNotification.show(); + savedNotification.show(); } const get_xml = (songInfo, iconSrc) => { - switch (config.get("toastStyle")) { - default: - case ToastStyles.logo: - case ToastStyles.legacy: - return xml_logo(songInfo, iconSrc); - case ToastStyles.banner_top_custom: - return xml_banner_top_custom(songInfo, iconSrc); - case ToastStyles.hero: - return xml_hero(songInfo, iconSrc); - case ToastStyles.banner_bottom: - return xml_banner_bottom(songInfo, iconSrc); - case ToastStyles.banner_centered_bottom: - return xml_banner_centered_bottom(songInfo, iconSrc); - case ToastStyles.banner_centered_top: - return xml_banner_centered_top(songInfo, iconSrc); - }; -} + switch (config.get('toastStyle')) { + default: + case ToastStyles.logo: + case ToastStyles.legacy: { + return xml_logo(songInfo, iconSrc); + } -const iconLocation = app.isPackaged ? - path.resolve(app.getPath("userData"), 'icons') : - path.resolve(__dirname, '..', '..', 'assets/media-icons-black'); + case ToastStyles.banner_top_custom: { + return xml_banner_top_custom(songInfo, iconSrc); + } + + case ToastStyles.hero: { + return xml_hero(songInfo, iconSrc); + } + + case ToastStyles.banner_bottom: { + return xml_banner_bottom(songInfo, iconSrc); + } + + case ToastStyles.banner_centered_bottom: { + return xml_banner_centered_bottom(songInfo, iconSrc); + } + + case ToastStyles.banner_centered_top: { + return xml_banner_centered_top(songInfo, iconSrc); + } + } +}; + +const iconLocation = app.isPackaged + ? path.resolve(app.getPath('userData'), 'icons') + : path.resolve(__dirname, '..', '..', 'assets/media-icons-black'); const display = (kind) => { - if (config.get("toastStyle") === ToastStyles.legacy) { - return `content="${icons[kind]}"`; - } else { - return `\ - content="${config.get("hideButtonText") ? "" : kind.charAt(0).toUpperCase() + kind.slice(1)}"\ + if (config.get('toastStyle') === ToastStyles.legacy) { + return `content="${icons[kind]}"`; + } + + return `\ + content="${config.get('hideButtonText') ? '' : kind.charAt(0).toUpperCase() + kind.slice(1)}"\ imageUri="file:///${path.resolve(__dirname, iconLocation, `${kind}.png`)}" `; - } -} +}; const getButton = (kind) => - ``; + ``; const getButtons = (isPaused) => `\ @@ -173,7 +192,6 @@ const xml_image = ({ title, artist, isPaused }, imgSrc, placement) => toast(`\ ${artist}\ `, isPaused); - const xml_logo = (songInfo, imgSrc) => xml_image(songInfo, imgSrc, 'placement="appLogoOverride"'); const xml_hero = (songInfo, imgSrc) => xml_image(songInfo, imgSrc, 'placement="hero"'); @@ -194,8 +212,8 @@ const xml_banner_top_custom = (songInfo, imgSrc) => toast(`\ const xml_more_data = ({ album, elapsedSeconds, songDuration }) => `\ - ${album ? - `${album}` : ''} + ${album + ? `${album}` : ''} ${secondsToMinutes(elapsedSeconds)} / ${secondsToMinutes(songDuration)} \ `; @@ -223,13 +241,17 @@ const xml_banner_centered_top = ({ title, artist, isPaused }, imgSrc) => toast(` `, isPaused); const titleFontPicker = (title) => { - if (title.length <= 13) { - return 'Header'; - } else if (title.length <= 22) { - return 'Subheader'; - } else if (title.length <= 26) { - return 'Title'; - } else { - return 'Subtitle'; - } -} + if (title.length <= 13) { + return 'Header'; + } + + if (title.length <= 22) { + return 'Subheader'; + } + + if (title.length <= 26) { + return 'Title'; + } + + return 'Subtitle'; +}; diff --git a/plugins/notifications/menu.js b/plugins/notifications/menu.js index 014be184..8886f3c3 100644 --- a/plugins/notifications/menu.js +++ b/plugins/notifications/menu.js @@ -1,80 +1,81 @@ -const { urgencyLevels, ToastStyles, snakeToCamel } = require("./utils"); -const is = require("electron-is"); -const config = require("./config"); +const is = require('electron-is'); + +const { urgencyLevels, ToastStyles, snakeToCamel } = require('./utils'); +const config = require('./config'); module.exports = (_win, options) => [ - ...(is.linux() - ? [ - { - label: "Notification Priority", - submenu: urgencyLevels.map((level) => ({ - label: level.name, - type: "radio", - checked: options.urgency === level.value, - click: () => config.set("urgency", level.value), - })), - }, - ] - : []), - ...(is.windows() - ? [ - { - label: "Interactive Notifications", - type: "checkbox", - checked: options.interactive, - // doesn't update until restart - click: (item) => config.setAndMaybeRestart("interactive", item.checked), - }, - { - // submenu with settings for interactive notifications (name shouldn't be too long) - label: "Interactive Settings", - submenu: [ - { - label: "Open/Close on tray click", - type: "checkbox", - checked: options.trayControls, - click: (item) => config.set("trayControls", item.checked), - }, - { - label: "Hide Button Text", - type: "checkbox", - checked: options.hideButtonText, - click: (item) => config.set("hideButtonText", item.checked), - }, - { - label: "Refresh on Play/Pause", - type: "checkbox", - checked: options.refreshOnPlayPause, - click: (item) => config.set("refreshOnPlayPause", item.checked), - } - ] - }, - { - label: "Style", - submenu: getToastStyleMenuItems(options) - }, - ] - : []), - { - label: "Show notification on unpause", - type: "checkbox", - checked: options.unpauseNotification, - click: (item) => config.set("unpauseNotification", item.checked), - }, + ...(is.linux() + ? [ + { + label: 'Notification Priority', + submenu: urgencyLevels.map((level) => ({ + label: level.name, + type: 'radio', + checked: options.urgency === level.value, + click: () => config.set('urgency', level.value), + })), + }, + ] + : []), + ...(is.windows() + ? [ + { + label: 'Interactive Notifications', + type: 'checkbox', + checked: options.interactive, + // Doesn't update until restart + click: (item) => config.setAndMaybeRestart('interactive', item.checked), + }, + { + // Submenu with settings for interactive notifications (name shouldn't be too long) + label: 'Interactive Settings', + submenu: [ + { + label: 'Open/Close on tray click', + type: 'checkbox', + checked: options.trayControls, + click: (item) => config.set('trayControls', item.checked), + }, + { + label: 'Hide Button Text', + type: 'checkbox', + checked: options.hideButtonText, + click: (item) => config.set('hideButtonText', item.checked), + }, + { + label: 'Refresh on Play/Pause', + type: 'checkbox', + checked: options.refreshOnPlayPause, + click: (item) => config.set('refreshOnPlayPause', item.checked), + }, + ], + }, + { + label: 'Style', + submenu: getToastStyleMenuItems(options), + }, + ] + : []), + { + label: 'Show notification on unpause', + type: 'checkbox', + checked: options.unpauseNotification, + click: (item) => config.set('unpauseNotification', item.checked), + }, ]; function getToastStyleMenuItems(options) { - const arr = new Array(Object.keys(ToastStyles).length); + const array = Array.from({ length: Object.keys(ToastStyles).length }); - // ToastStyles index starts from 1 - for (const [name, index] of Object.entries(ToastStyles)) { - arr[index - 1] = { - label: snakeToCamel(name), - type: "radio", - checked: options.toastStyle === index, - click: () => config.set("toastStyle", index), - }; - } + // ToastStyles index starts from 1 + for (const [name, index] of Object.entries(ToastStyles)) { + array[index - 1] = { + label: snakeToCamel(name), + type: 'radio', + checked: options.toastStyle === index, + click: () => config.set('toastStyle', index), + }; + } - return arr; + return array; } diff --git a/plugins/notifications/utils.js b/plugins/notifications/utils.js index cb472969..4f992f41 100644 --- a/plugins/notifications/utils.js +++ b/plugins/notifications/utils.js @@ -1,93 +1,107 @@ -const path = require("path"); -const { app } = require("electron"); -const fs = require("fs"); -const config = require("./config"); +const path = require('node:path'); -const icon = "assets/youtube-music.png"; -const userData = app.getPath("userData"); -const tempIcon = path.join(userData, "tempIcon.png"); -const tempBanner = path.join(userData, "tempBanner.png"); +const fs = require('node:fs'); -const { cache } = require("../../providers/decorators") +const { app } = require('electron'); + +const config = require('./config'); + +const icon = 'assets/youtube-music.png'; +const userData = app.getPath('userData'); +const temporaryIcon = path.join(userData, 'tempIcon.png'); +const temporaryBanner = path.join(userData, 'tempBanner.png'); + +const { cache } = require('../../providers/decorators'); module.exports.ToastStyles = { - logo: 1, - banner_centered_top: 2, - hero: 3, - banner_top_custom: 4, - banner_centered_bottom: 5, - banner_bottom: 6, - legacy: 7 -} + logo: 1, + banner_centered_top: 2, + hero: 3, + banner_top_custom: 4, + banner_centered_bottom: 5, + banner_bottom: 6, + legacy: 7, +}; module.exports.icons = { - play: "\u{1405}", // ᐅ - pause: "\u{2016}", // ‖ - next: "\u{1433}", // ᐳ - previous: "\u{1438}" // ᐸ -} + play: '\u{1405}', // ᐅ + pause: '\u{2016}', // ‖ + next: '\u{1433}', // ᐳ + previous: '\u{1438}', // ᐸ +}; module.exports.urgencyLevels = [ - { name: "Low", value: "low" }, - { name: "Normal", value: "normal" }, - { name: "High", value: "critical" }, + { name: 'Low', value: 'low' }, + { name: 'Normal', value: 'normal' }, + { name: 'High', value: 'critical' }, ]; const nativeImageToLogo = cache((nativeImage) => { - const tempImage = nativeImage.resize({ height: 256 }); - const margin = Math.max(tempImage.getSize().width - 256, 0); + const temporaryImage = nativeImage.resize({ height: 256 }); + const margin = Math.max(temporaryImage.getSize().width - 256, 0); - return tempImage.crop({ - x: Math.round(margin / 2), - y: 0, - width: 256, - height: 256, - }); + return temporaryImage.crop({ + x: Math.round(margin / 2), + y: 0, + width: 256, + height: 256, + }); }); module.exports.notificationImage = (songInfo) => { - if (!songInfo.image) return icon; - if (!config.get("interactive")) return nativeImageToLogo(songInfo.image); + if (!songInfo.image) { + return icon; + } - switch (config.get("toastStyle")) { - case module.exports.ToastStyles.logo: - case module.exports.ToastStyles.legacy: - return this.saveImage(nativeImageToLogo(songInfo.image), tempIcon); - default: - return this.saveImage(songInfo.image, tempBanner); - }; + if (!config.get('interactive')) { + return nativeImageToLogo(songInfo.image); + } + + switch (config.get('toastStyle')) { + case module.exports.ToastStyles.logo: + case module.exports.ToastStyles.legacy: { + return this.saveImage(nativeImageToLogo(songInfo.image), temporaryIcon); + } + + default: { + return this.saveImage(songInfo.image, temporaryBanner); + } + } }; module.exports.saveImage = cache((img, save_path) => { - try { - fs.writeFileSync(save_path, img.toPNG()); - } catch (err) { - console.log(`Error writing song icon to disk:\n${err.toString()}`) - return icon; - } - return save_path; + try { + fs.writeFileSync(save_path, img.toPNG()); + } catch (error) { + console.log(`Error writing song icon to disk:\n${error.toString()}`); + return icon; + } + + return save_path; }); module.exports.save_temp_icons = () => { - for (const kind of Object.keys(module.exports.icons)) { - const destinationPath = path.join(userData, 'icons', `${kind}.png`); - if (fs.existsSync(destinationPath)) continue; - const iconPath = path.resolve(__dirname, "../../assets/media-icons-black", `${kind}.png`); - fs.mkdirSync(path.dirname(destinationPath), { recursive: true }); - fs.copyFile(iconPath, destinationPath, () => { }); - } + for (const kind of Object.keys(module.exports.icons)) { + const destinationPath = path.join(userData, 'icons', `${kind}.png`); + if (fs.existsSync(destinationPath)) { + continue; + } + + const iconPath = path.resolve(__dirname, '../../assets/media-icons-black', `${kind}.png`); + fs.mkdirSync(path.dirname(destinationPath), { recursive: true }); + fs.copyFile(iconPath, destinationPath, () => { + }); + } }; -module.exports.snakeToCamel = (str) => { - return str.replace(/([-_][a-z]|^[a-z])/g, (group) => - group.toUpperCase() - .replace('-', ' ') - .replace('_', ' ') - ); -} +module.exports.snakeToCamel = (string_) => string_.replaceAll(/([-_][a-z]|^[a-z])/g, (group) => + group.toUpperCase() + .replace('-', ' ') + .replace('_', ' '), +); module.exports.secondsToMinutes = (seconds) => { - const minutes = Math.floor(seconds / 60); - const secondsLeft = seconds % 60; - return `${minutes}:${secondsLeft < 10 ? '0' : ''}${secondsLeft}`; -} + const minutes = Math.floor(seconds / 60); + const secondsLeft = seconds % 60; + return `${minutes}:${secondsLeft < 10 ? '0' : ''}${secondsLeft}`; +}; diff --git a/plugins/picture-in-picture/back.js b/plugins/picture-in-picture/back.js index 0bfdfa36..040c3fe9 100644 --- a/plugins/picture-in-picture/back.js +++ b/plugins/picture-in-picture/back.js @@ -1,10 +1,10 @@ -const path = require("path"); +const path = require('node:path'); -const { app, ipcMain } = require("electron"); -const electronLocalshortcut = require("electron-localshortcut"); +const { app, ipcMain } = require('electron'); +const electronLocalshortcut = require('electron-localshortcut'); -const { setOptions } = require("../../config/plugins"); -const { injectCSS } = require("../utils"); +const { setOptions } = require('../../config/plugins'); +const { injectCSS } = require('../utils'); let isInPiP = false; let originalPosition; @@ -15,83 +15,93 @@ let originalMaximized; let win; let options; -const pipPosition = () => (options.savePosition && options["pip-position"]) || [10, 10]; -const pipSize = () => (options.saveSize && options["pip-size"]) || [450, 275]; +const pipPosition = () => (options.savePosition && options['pip-position']) || [10, 10]; +const pipSize = () => (options.saveSize && options['pip-size']) || [450, 275]; const setLocalOptions = (_options) => { - options = { ...options, ..._options }; - setOptions("picture-in-picture", _options); -} + options = { ...options, ..._options }; + setOptions('picture-in-picture', _options); +}; const togglePiP = async () => { - isInPiP = !isInPiP; - setLocalOptions({ isInPiP }); + isInPiP = !isInPiP; + setLocalOptions({ isInPiP }); - if (isInPiP) { - originalFullScreen = win.isFullScreen(); - if (originalFullScreen) win.setFullScreen(false); - originalMaximized = win.isMaximized(); - if (originalMaximized) win.unmaximize(); - - originalPosition = win.getPosition(); - originalSize = win.getSize(); + if (isInPiP) { + originalFullScreen = win.isFullScreen(); + if (originalFullScreen) { + win.setFullScreen(false); + } - win.webContents.on("before-input-event", blockShortcutsInPiP); + originalMaximized = win.isMaximized(); + if (originalMaximized) { + win.unmaximize(); + } - win.setMaximizable(false); - win.setFullScreenable(false); + originalPosition = win.getPosition(); + originalSize = win.getSize(); - win.webContents.send("pip-toggle", true); + win.webContents.on('before-input-event', blockShortcutsInPiP); - app.dock?.hide(); - win.setVisibleOnAllWorkspaces(true, { - visibleOnFullScreen: true, - }); - app.dock?.show(); - if (options.alwaysOnTop) { - win.setAlwaysOnTop(true, "screen-saver", 1); - } - } else { - win.webContents.removeListener("before-input-event", blockShortcutsInPiP); - win.setMaximizable(true); - win.setFullScreenable(true); + win.setMaximizable(false); + win.setFullScreenable(false); - win.webContents.send("pip-toggle", false); + win.webContents.send('pip-toggle', true); - win.setVisibleOnAllWorkspaces(false); - win.setAlwaysOnTop(false); + app.dock?.hide(); + win.setVisibleOnAllWorkspaces(true, { + visibleOnFullScreen: true, + }); + app.dock?.show(); + if (options.alwaysOnTop) { + win.setAlwaysOnTop(true, 'screen-saver', 1); + } + } else { + win.webContents.removeListener('before-input-event', blockShortcutsInPiP); + win.setMaximizable(true); + win.setFullScreenable(true); - if (originalFullScreen) win.setFullScreen(true); - if (originalMaximized) win.maximize(); - } + win.webContents.send('pip-toggle', false); - const [x, y] = isInPiP ? pipPosition() : originalPosition; - const [w, h] = isInPiP ? pipSize() : originalSize; - win.setPosition(x, y); - win.setSize(w, h); + win.setVisibleOnAllWorkspaces(false); + win.setAlwaysOnTop(false); - win.setWindowButtonVisibility?.(!isInPiP); + if (originalFullScreen) { + win.setFullScreen(true); + } + + if (originalMaximized) { + win.maximize(); + } + } + + const [x, y] = isInPiP ? pipPosition() : originalPosition; + const [w, h] = isInPiP ? pipSize() : originalSize; + win.setPosition(x, y); + win.setSize(w, h); + + win.setWindowButtonVisibility?.(!isInPiP); }; const blockShortcutsInPiP = (event, input) => { - const key = input.key.toLowerCase(); + const key = input.key.toLowerCase(); - if (key === "f") { - event.preventDefault(); - } else if (key === 'escape') { - togglePiP(); - event.preventDefault(); - }; + if (key === 'f') { + event.preventDefault(); + } else if (key === 'escape') { + togglePiP(); + event.preventDefault(); + } }; module.exports = (_win, _options) => { - options ??= _options; - win ??= _win; - setLocalOptions({ isInPiP }); - injectCSS(win.webContents, path.join(__dirname, "style.css")); - ipcMain.on("picture-in-picture", async () => { - await togglePiP(); - }); + options ??= _options; + win ??= _win; + setLocalOptions({ isInPiP }); + injectCSS(win.webContents, path.join(__dirname, 'style.css')); + ipcMain.on('picture-in-picture', async () => { + await togglePiP(); + }); }; module.exports.setOptions = setLocalOptions; diff --git a/plugins/picture-in-picture/front.js b/plugins/picture-in-picture/front.js index 27600641..0033d6cb 100644 --- a/plugins/picture-in-picture/front.js +++ b/plugins/picture-in-picture/front.js @@ -1,140 +1,156 @@ -const { ipcRenderer } = require("electron"); +const { ipcRenderer } = require('electron'); +const { toKeyEvent } = require('keyboardevent-from-electron-accelerator'); +const keyEventAreEqual = require('keyboardevents-areequal'); -const { toKeyEvent } = require("keyboardevent-from-electron-accelerator"); -const keyEventAreEqual = require("keyboardevents-areequal"); +const { getSongMenu } = require('../../providers/dom-elements'); +const { ElementFromFile, templatePath } = require('../utils'); -const { getSongMenu } = require("../../providers/dom-elements"); -const { ElementFromFile, templatePath } = require("../utils"); - -function $(selector) { return document.querySelector(selector); } +function $(selector) { + return document.querySelector(selector); +} let useNativePiP = false; let menu = null; const pipButton = ElementFromFile( - templatePath(__dirname, "picture-in-picture.html") + templatePath(__dirname, 'picture-in-picture.html'), ); -// will also clone +// Will also clone function replaceButton(query, button) { - const svg = button.querySelector("#icon svg").cloneNode(true); - button.replaceWith(button.cloneNode(true)); - button.remove(); - const newButton = $(query); - newButton.querySelector("#icon").appendChild(svg); - return newButton; + const svg = button.querySelector('#icon svg').cloneNode(true); + button.replaceWith(button.cloneNode(true)); + button.remove(); + const newButton = $(query); + newButton.querySelector('#icon').append(svg); + return newButton; } function cloneButton(query) { - replaceButton(query, $(query)); - return $(query); + replaceButton(query, $(query)); + return $(query); } const observer = new MutationObserver(() => { - if (!menu) { - menu = getSongMenu(); - if (!menu) return; - } - if (menu.contains(pipButton) || !menu.parentElement.eventSink_?.matches('ytmusic-menu-renderer.ytmusic-player-bar')) return; - const menuUrl = $( - 'tp-yt-paper-listbox [tabindex="0"] #navigation-endpoint' - )?.href; - if (menuUrl && !menuUrl.includes("watch?")) return; + if (!menu) { + menu = getSongMenu(); + if (!menu) { + return; + } + } - menu.prepend(pipButton); + if (menu.contains(pipButton) || !menu.parentElement.eventSink_?.matches('ytmusic-menu-renderer.ytmusic-player-bar')) { + return; + } + + const menuUrl = $( + 'tp-yt-paper-listbox [tabindex="0"] #navigation-endpoint', + )?.href; + if (menuUrl && !menuUrl.includes('watch?')) { + return; + } + + menu.prepend(pipButton); }); global.togglePictureInPicture = async () => { - if (useNativePiP) { - const isInPiP = document.pictureInPictureElement !== null; - const video = $("video"); - const togglePiP = () => - isInPiP - ? document.exitPictureInPicture.call(document) - : video.requestPictureInPicture.call(video); + if (useNativePiP) { + const isInPiP = document.pictureInPictureElement !== null; + const video = $('video'); + const togglePiP = () => + isInPiP + ? document.exitPictureInPicture.call(document) + : video.requestPictureInPicture.call(video); - try { - await togglePiP(); - $("#icon").click(); // Close the menu - return true; - } catch {} - } + try { + await togglePiP(); + $('#icon').click(); // Close the menu + return true; + } catch { + } + } - ipcRenderer.send("picture-in-picture"); - return false; + ipcRenderer.send('picture-in-picture'); + return false; }; const listenForToggle = () => { - const originalExitButton = $(".exit-fullscreen-button"); - const appLayout = $("ytmusic-app-layout"); - const expandMenu = $('#expanding-menu'); - const middleControls = $('.middle-controls'); - const playerPage = $("ytmusic-player-page"); - const togglePlayerPageButton = $(".toggle-player-page-button"); - const fullScreenButton = $(".fullscreen-button"); - const player = $('#player'); - const onPlayerDblClick = player.onDoubleClick_; + const originalExitButton = $('.exit-fullscreen-button'); + const appLayout = $('ytmusic-app-layout'); + const expandMenu = $('#expanding-menu'); + const middleControls = $('.middle-controls'); + const playerPage = $('ytmusic-player-page'); + const togglePlayerPageButton = $('.toggle-player-page-button'); + const fullScreenButton = $('.fullscreen-button'); + const player = $('#player'); + const onPlayerDblClick = player.onDoubleClick_; - const titlebar = $(".cet-titlebar"); + const titlebar = $('.cet-titlebar'); - ipcRenderer.on("pip-toggle", (_, isPip) => { - if (isPip) { - replaceButton(".exit-fullscreen-button", originalExitButton).onclick = - () => togglePictureInPicture(); - player.onDoubleClick_ = () => {}; - expandMenu.onmouseleave = () => middleControls.click(); - if (!playerPage.playerPageOpen_) { - togglePlayerPageButton.click(); - } - fullScreenButton.click(); - appLayout.classList.add("pip"); - if (titlebar) titlebar.style.display = "none"; - } else { - $(".exit-fullscreen-button").replaceWith(originalExitButton); - player.onDoubleClick_ = onPlayerDblClick; - expandMenu.onmouseleave = undefined; - originalExitButton.click(); - appLayout.classList.remove("pip"); - if (titlebar) titlebar.style.display = "flex"; - } - }); -} + ipcRenderer.on('pip-toggle', (_, isPip) => { + if (isPip) { + replaceButton('.exit-fullscreen-button', originalExitButton).addEventListener('click', () => togglePictureInPicture()); + player.onDoubleClick_ = () => { + }; + + expandMenu.addEventListener('mouseleave', () => middleControls.click()); + if (!playerPage.playerPageOpen_) { + togglePlayerPageButton.click(); + } + + fullScreenButton.click(); + appLayout.classList.add('pip'); + if (titlebar) { + titlebar.style.display = 'none'; + } + } else { + $('.exit-fullscreen-button').replaceWith(originalExitButton); + player.onDoubleClick_ = onPlayerDblClick; + expandMenu.onmouseleave = undefined; + originalExitButton.click(); + appLayout.classList.remove('pip'); + if (titlebar) { + titlebar.style.display = 'flex'; + } + } + }); +}; function observeMenu(options) { - useNativePiP = options.useNativePiP; - document.addEventListener( - "apiLoaded", - () => { - listenForToggle(); + useNativePiP = options.useNativePiP; + document.addEventListener( + 'apiLoaded', + () => { + listenForToggle(); - cloneButton(".player-minimize-button").onclick = async () => { - await global.togglePictureInPicture(); - setTimeout(() => $("#player").click()); - }; + cloneButton('.player-minimize-button').addEventListener('click', async () => { + await global.togglePictureInPicture(); + setTimeout(() => $('#player').click()); + }); - // allows easily closing the menu by programmatically clicking outside of it - $("#expanding-menu").removeAttribute("no-cancel-on-outside-click"); - // TODO: think about wether an additional button in songMenu is needed - observer.observe($("ytmusic-popup-container"), { - childList: true, - subtree: true, - }); - }, - { once: true, passive: true } - ); + // Allows easily closing the menu by programmatically clicking outside of it + $('#expanding-menu').removeAttribute('no-cancel-on-outside-click'); + // TODO: think about wether an additional button in songMenu is needed + observer.observe($('ytmusic-popup-container'), { + childList: true, + subtree: true, + }); + }, + { once: true, passive: true }, + ); } module.exports = (options) => { - observeMenu(options); + observeMenu(options); - if (options.hotkey) { - const hotkeyEvent = toKeyEvent(options.hotkey); - window.addEventListener("keydown", (event) => { - if ( - keyEventAreEqual(event, hotkeyEvent) && - !$("ytmusic-search-box").opened - ) { - togglePictureInPicture(); - } - }); - } + if (options.hotkey) { + const hotkeyEvent = toKeyEvent(options.hotkey); + window.addEventListener('keydown', (event) => { + if ( + keyEventAreEqual(event, hotkeyEvent) + && !$('ytmusic-search-box').opened + ) { + togglePictureInPicture(); + } + }); + } }; diff --git a/plugins/picture-in-picture/menu.js b/plugins/picture-in-picture/menu.js index 61014c22..8c8e7a63 100644 --- a/plugins/picture-in-picture/menu.js +++ b/plugins/picture-in-picture/menu.js @@ -1,68 +1,69 @@ -const prompt = require("custom-electron-prompt"); +const prompt = require('custom-electron-prompt'); -const promptOptions = require("../../providers/prompt-options"); -const { setOptions } = require("./back.js"); +const { setOptions } = require('./back.js'); + +const promptOptions = require('../../providers/prompt-options'); module.exports = (win, options) => [ - { - label: "Always on top", - type: "checkbox", - checked: options.alwaysOnTop, - click: (item) => { - setOptions({ alwaysOnTop: item.checked }); - win.setAlwaysOnTop(item.checked); - }, + { + label: 'Always on top', + type: 'checkbox', + checked: options.alwaysOnTop, + click(item) { + setOptions({ alwaysOnTop: item.checked }); + win.setAlwaysOnTop(item.checked); }, - { - label: "Save window position", - type: "checkbox", - checked: options.savePosition, - click: (item) => { - setOptions({ savePosition: item.checked }); - }, + }, + { + label: 'Save window position', + type: 'checkbox', + checked: options.savePosition, + click(item) { + setOptions({ savePosition: item.checked }); }, - { - label: "Save window size", - type: "checkbox", - checked: options.saveSize, - click: (item) => { - setOptions({ saveSize: item.checked }); - }, + }, + { + label: 'Save window size', + type: 'checkbox', + checked: options.saveSize, + click(item) { + setOptions({ saveSize: item.checked }); }, - { - label: "Hotkey", - type: "checkbox", - checked: options.hotkey, - click: async (item) => { - const output = await prompt({ - title: "Picture in Picture Hotkey", - label: "Choose a hotkey for toggling Picture in Picture", - type: "keybind", - keybindOptions: [{ - value: "hotkey", - label: "Hotkey", - default: options.hotkey - }], - ...promptOptions() - }, win) + }, + { + label: 'Hotkey', + type: 'checkbox', + checked: options.hotkey, + async click(item) { + const output = await prompt({ + title: 'Picture in Picture Hotkey', + label: 'Choose a hotkey for toggling Picture in Picture', + type: 'keybind', + keybindOptions: [{ + value: 'hotkey', + label: 'Hotkey', + default: options.hotkey, + }], + ...promptOptions(), + }, win); - if (output) { - const { value, accelerator } = output[0]; - setOptions({ [value]: accelerator }); + if (output) { + const { value, accelerator } = output[0]; + setOptions({ [value]: accelerator }); - item.checked = !!accelerator; - } else { - // Reset checkbox if prompt was canceled - item.checked = !item.checked; - } - }, + item.checked = Boolean(accelerator); + } else { + // Reset checkbox if prompt was canceled + item.checked = !item.checked; + } }, - { - label: "Use native PiP", - type: "checkbox", - checked: options.useNativePiP, - click: (item) => { - setOptions({ useNativePiP: item.checked }); - }, - } + }, + { + label: 'Use native PiP', + type: 'checkbox', + checked: options.useNativePiP, + click(item) { + setOptions({ useNativePiP: item.checked }); + }, + }, ]; diff --git a/plugins/picture-in-picture/style.css b/plugins/picture-in-picture/style.css index a7430739..ab79307f 100644 --- a/plugins/picture-in-picture/style.css +++ b/plugins/picture-in-picture/style.css @@ -3,41 +3,41 @@ ytmusic-app-layout.pip ytmusic-player-bar svg, ytmusic-app-layout.pip ytmusic-player-bar .time-info, ytmusic-app-layout.pip ytmusic-player-bar yt-formatted-string, ytmusic-app-layout.pip ytmusic-player-bar .yt-formatted-string { - filter: drop-shadow(2px 4px 6px black); - color: white !important; - fill: white !important; + filter: drop-shadow(2px 4px 6px black); + color: white !important; + fill: white !important; } /* improve the style of the player bar expanding menu */ ytmusic-app-layout.pip ytmusic-player-expanding-menu { - border-radius: 30px; - background-color: rgba(0, 0, 0, 0.3); - backdrop-filter: blur(5px) brightness(20%); + border-radius: 30px; + background-color: rgba(0, 0, 0, 0.3); + backdrop-filter: blur(5px) brightness(20%); } /* fix volumeHud position when both in-app-menu and PiP are active */ .cet-container ytmusic-app-layout.pip #volumeHud { - top: 22px !important; + top: 22px !important; } /* make player-bar not draggable if in-app-menu is enabled */ .cet-container ytmusic-app-layout.pip ytmusic-player-bar { - -webkit-app-region: no-drag !important; + -webkit-app-region: no-drag !important; } /* make player draggable if in-app-menu is enabled */ .cet-container ytmusic-app-layout.pip #player { - -webkit-app-region: drag !important; + -webkit-app-region: drag !important; } /* remove info, thumbnail and menu from player-bar */ ytmusic-app-layout.pip ytmusic-player-bar .content-info-wrapper, ytmusic-app-layout.pip ytmusic-player-bar .thumbnail-image-wrapper, ytmusic-app-layout.pip ytmusic-player-bar ytmusic-menu-renderer { - display: none !important; + display: none !important; } /* disable the video-toggle button when in PiP mode */ ytmusic-app-layout.pip .video-switch-button { - display: none !important; + display: none !important; } diff --git a/plugins/picture-in-picture/templates/picture-in-picture.html b/plugins/picture-in-picture/templates/picture-in-picture.html index 6dd0440c..733a29bb 100644 --- a/plugins/picture-in-picture/templates/picture-in-picture.html +++ b/plugins/picture-in-picture/templates/picture-in-picture.html @@ -1,51 +1,50 @@ diff --git a/plugins/playback-speed/front.js b/plugins/playback-speed/front.js index e776923c..1f0aaa43 100644 --- a/plugins/playback-speed/front.js +++ b/plugins/playback-speed/front.js @@ -1,12 +1,14 @@ -const { getSongMenu } = require("../../providers/dom-elements"); -const { ElementFromFile, templatePath } = require("../utils"); -const { singleton } = require("../../providers/decorators") +const { getSongMenu } = require('../../providers/dom-elements'); +const { ElementFromFile, templatePath } = require('../utils'); +const { singleton } = require('../../providers/decorators'); -function $(selector) { return document.querySelector(selector); } +function $(selector) { + return document.querySelector(selector); +} -const slider = ElementFromFile(templatePath(__dirname, "slider.html")); +const slider = ElementFromFile(templatePath(__dirname, 'slider.html')); -const roundToTwo = n => Math.round(n * 1e2) / 1e2; +const roundToTwo = (n) => Math.round(n * 1e2) / 1e2; const MIN_PLAYBACK_SPEED = 0.07; const MAX_PLAYBACK_SPEED = 16; @@ -14,77 +16,79 @@ const MAX_PLAYBACK_SPEED = 16; let playbackSpeed = 1; const updatePlayBackSpeed = () => { - $('video').playbackRate = playbackSpeed; + $('video').playbackRate = playbackSpeed; - const playbackSpeedElement = $("#playback-speed-value"); - if (playbackSpeedElement) { - playbackSpeedElement.innerHTML = playbackSpeed; - } + const playbackSpeedElement = $('#playback-speed-value'); + if (playbackSpeedElement) { + playbackSpeedElement.innerHTML = playbackSpeed; + } }; let menu; const setupSliderListener = singleton(() => { - $('#playback-speed-slider').addEventListener('immediate-value-changed', e => { - playbackSpeed = e.detail.value || MIN_PLAYBACK_SPEED; - if (isNaN(playbackSpeed)) { - playbackSpeed = 1; - } - updatePlayBackSpeed(); - }) + $('#playback-speed-slider').addEventListener('immediate-value-changed', (e) => { + playbackSpeed = e.detail.value || MIN_PLAYBACK_SPEED; + if (isNaN(playbackSpeed)) { + playbackSpeed = 1; + } + + updatePlayBackSpeed(); + }); }); const observePopupContainer = () => { - const observer = new MutationObserver(() => { - if (!menu) { - menu = getSongMenu(); - } + const observer = new MutationObserver(() => { + if (!menu) { + menu = getSongMenu(); + } - if (menu && menu.parentElement.eventSink_?.matches('ytmusic-menu-renderer.ytmusic-player-bar') && !menu.contains(slider)) { - menu.prepend(slider); - setupSliderListener(); - } - }); + if (menu && menu.parentElement.eventSink_?.matches('ytmusic-menu-renderer.ytmusic-player-bar') && !menu.contains(slider)) { + menu.prepend(slider); + setupSliderListener(); + } + }); - observer.observe($('ytmusic-popup-container'), { - childList: true, - subtree: true, - }); + observer.observe($('ytmusic-popup-container'), { + childList: true, + subtree: true, + }); }; const observeVideo = () => { - $('video').addEventListener('ratechange', forcePlaybackRate) - $('video').addEventListener('srcChanged', forcePlaybackRate) -} + $('video').addEventListener('ratechange', forcePlaybackRate); + $('video').addEventListener('srcChanged', forcePlaybackRate); +}; const setupWheelListener = () => { - slider.addEventListener('wheel', e => { - e.preventDefault(); - if (isNaN(playbackSpeed)) { - playbackSpeed = 1; - } - // e.deltaY < 0 means wheel-up - playbackSpeed = roundToTwo(e.deltaY < 0 ? - Math.min(playbackSpeed + 0.01, MAX_PLAYBACK_SPEED) : - Math.max(playbackSpeed - 0.01, MIN_PLAYBACK_SPEED) - ); + slider.addEventListener('wheel', (e) => { + e.preventDefault(); + if (isNaN(playbackSpeed)) { + playbackSpeed = 1; + } - updatePlayBackSpeed(); - // update slider position - $('#playback-speed-slider').value = playbackSpeed; - }) -} + // E.deltaY < 0 means wheel-up + playbackSpeed = roundToTwo(e.deltaY < 0 + ? Math.min(playbackSpeed + 0.01, MAX_PLAYBACK_SPEED) + : Math.max(playbackSpeed - 0.01, MIN_PLAYBACK_SPEED), + ); + + updatePlayBackSpeed(); + // Update slider position + $('#playback-speed-slider').value = playbackSpeed; + }); +}; function forcePlaybackRate(e) { - if (e.target.playbackRate !== playbackSpeed) { - e.target.playbackRate = playbackSpeed - } + if (e.target.playbackRate !== playbackSpeed) { + e.target.playbackRate = playbackSpeed; + } } module.exports = () => { - document.addEventListener('apiLoaded', () => { - observePopupContainer(); - observeVideo(); - setupWheelListener(); - }, { once: true, passive: true }) + document.addEventListener('apiLoaded', () => { + observePopupContainer(); + observeVideo(); + setupWheelListener(); + }, { once: true, passive: true }); }; diff --git a/plugins/playback-speed/templates/slider.html b/plugins/playback-speed/templates/slider.html index ebd98537..38526289 100644 --- a/plugins/playback-speed/templates/slider.html +++ b/plugins/playback-speed/templates/slider.html @@ -1,88 +1,93 @@ diff --git a/plugins/precise-volume/back.js b/plugins/precise-volume/back.js index c33f23bb..4eab7ca3 100644 --- a/plugins/precise-volume/back.js +++ b/plugins/precise-volume/back.js @@ -1,5 +1,6 @@ -const { injectCSS } = require("../utils"); -const path = require("path"); +const { injectCSS } = require('../utils'); + +const path = require('node:path'); /* This is used to determine if plugin is actually active @@ -10,15 +11,16 @@ let enabled = false; const { globalShortcut } = require('electron'); module.exports = (win, options) => { - enabled = true; - injectCSS(win.webContents, path.join(__dirname, "volume-hud.css")); + enabled = true; + injectCSS(win.webContents, path.join(__dirname, 'volume-hud.css')); - if (options.globalShortcuts?.volumeUp) { - globalShortcut.register((options.globalShortcuts.volumeUp), () => win.webContents.send('changeVolume', true)); - } - if (options.globalShortcuts?.volumeDown) { - globalShortcut.register((options.globalShortcuts.volumeDown), () => win.webContents.send('changeVolume', false)); - } -} + if (options.globalShortcuts?.volumeUp) { + globalShortcut.register((options.globalShortcuts.volumeUp), () => win.webContents.send('changeVolume', true)); + } + + if (options.globalShortcuts?.volumeDown) { + globalShortcut.register((options.globalShortcuts.volumeDown), () => win.webContents.send('changeVolume', false)); + } +}; module.exports.enabled = () => enabled; diff --git a/plugins/precise-volume/front.js b/plugins/precise-volume/front.js index 13bc4746..4c89f326 100644 --- a/plugins/precise-volume/front.js +++ b/plugins/precise-volume/front.js @@ -1,232 +1,245 @@ -const { ipcRenderer } = require("electron"); +const { ipcRenderer } = require('electron'); -const { setOptions, setMenuOptions, isEnabled } = require("../../config/plugins"); +const { setOptions, setMenuOptions, isEnabled } = require('../../config/plugins'); -function $(selector) { return document.querySelector(selector); } +function $(selector) { + return document.querySelector(selector); +} -const { debounce } = require("../../providers/decorators"); +const { debounce } = require('../../providers/decorators'); -let api, options; +let api; +let options; module.exports = (_options) => { - options = _options; - document.addEventListener('apiLoaded', e => { - api = e.detail; - ipcRenderer.on('changeVolume', (_, toIncrease) => changeVolume(toIncrease)); - ipcRenderer.on('setVolume', (_, value) => setVolume(value)); - firstRun(); - }, { once: true, passive: true }) + options = _options; + document.addEventListener('apiLoaded', (e) => { + api = e.detail; + ipcRenderer.on('changeVolume', (_, toIncrease) => changeVolume(toIncrease)); + ipcRenderer.on('setVolume', (_, value) => setVolume(value)); + firstRun(); + }, { once: true, passive: true }); }; -//without this function it would rewrite config 20 time when volume change by 20 +// Without this function it would rewrite config 20 time when volume change by 20 const writeOptions = debounce(() => { - setOptions("precise-volume", options); + setOptions('precise-volume', options); }, 1000); module.exports.moveVolumeHud = debounce((showVideo) => { - const volumeHud = $("#volumeHud"); - if (!volumeHud) return; - volumeHud.style.top = showVideo - ? `${($("ytmusic-player").clientHeight - $("video").clientHeight) / 2}px` - : 0; + const volumeHud = $('#volumeHud'); + if (!volumeHud) { + return; + } + + volumeHud.style.top = showVideo + ? `${($('ytmusic-player').clientHeight - $('video').clientHeight) / 2}px` + : 0; }, 250); const hideVolumeHud = debounce((volumeHud) => { - volumeHud.style.opacity = 0; + volumeHud.style.opacity = 0; }, 2000); const hideVolumeSlider = debounce((slider) => { - slider.classList.remove("on-hover"); + slider.classList.remove('on-hover'); }, 2500); - /** Restore saved volume and setup tooltip */ function firstRun() { - if (typeof options.savedVolume === "number") { - // Set saved volume as tooltip - setTooltip(options.savedVolume); + if (typeof options.savedVolume === 'number') { + // Set saved volume as tooltip + setTooltip(options.savedVolume); - if (api.getVolume() !== options.savedVolume) { - api.setVolume(options.savedVolume); - } - } + if (api.getVolume() !== options.savedVolume) { + api.setVolume(options.savedVolume); + } + } - setupPlaybar(); + setupPlaybar(); - setupLocalArrowShortcuts(); + setupLocalArrowShortcuts(); - const noVid = $("#main-panel")?.computedStyleMap().get("display").value === "none"; - injectVolumeHud(noVid); - if (!noVid) { - setupVideoPlayerOnwheel(); - if (!isEnabled('video-toggle')) { - //video-toggle handles hud positioning on its own - const videoMode = () => api.getPlayerResponse().videoDetails?.musicVideoType !== 'MUSIC_VIDEO_TYPE_ATV'; - $("video").addEventListener("srcChanged", () => moveVolumeHud(videoMode())); - } - } + const noVid = $('#main-panel')?.computedStyleMap().get('display').value === 'none'; + injectVolumeHud(noVid); + if (!noVid) { + setupVideoPlayerOnwheel(); + if (!isEnabled('video-toggle')) { + // Video-toggle handles hud positioning on its own + const videoMode = () => api.getPlayerResponse().videoDetails?.musicVideoType !== 'MUSIC_VIDEO_TYPE_ATV'; + $('video').addEventListener('srcChanged', () => moveVolumeHud(videoMode())); + } + } - // Change options from renderer to keep sync - ipcRenderer.on("setOptions", (_event, newOptions = {}) => { - Object.assign(options, newOptions) - setMenuOptions("precise-volume", options); - }); + // Change options from renderer to keep sync + ipcRenderer.on('setOptions', (_event, newOptions = {}) => { + Object.assign(options, newOptions); + setMenuOptions('precise-volume', options); + }); } function injectVolumeHud(noVid) { - if (noVid) { - const position = "top: 18px; right: 60px;"; - const mainStyle = "font-size: xx-large;"; + if (noVid) { + const position = 'top: 18px; right: 60px;'; + const mainStyle = 'font-size: xx-large;'; - $(".center-content.ytmusic-nav-bar").insertAdjacentHTML("beforeend", - ``) - } else { - const position = `top: 10px; left: 10px;`; - const mainStyle = "font-size: xxx-large; webkit-text-stroke: 1px black; font-weight: 600;"; + $('.center-content.ytmusic-nav-bar').insertAdjacentHTML('beforeend', + ``); + } else { + const position = 'top: 10px; left: 10px;'; + const mainStyle = 'font-size: xxx-large; webkit-text-stroke: 1px black; font-weight: 600;'; - $("#song-video").insertAdjacentHTML('afterend', - ``) - } + $('#song-video').insertAdjacentHTML('afterend', + ``); + } } function showVolumeHud(volume) { - const volumeHud = $("#volumeHud"); - if (!volumeHud) return; + const volumeHud = $('#volumeHud'); + if (!volumeHud) { + return; + } - volumeHud.textContent = `${volume}%`; - volumeHud.style.opacity = 1; + volumeHud.textContent = `${volume}%`; + volumeHud.style.opacity = 1; - hideVolumeHud(volumeHud); + hideVolumeHud(volumeHud); } /** Add onwheel event to video player */ function setupVideoPlayerOnwheel() { - $("#main-panel").addEventListener("wheel", event => { - event.preventDefault(); - // Event.deltaY < 0 means wheel-up - changeVolume(event.deltaY < 0); - }); + $('#main-panel').addEventListener('wheel', (event) => { + event.preventDefault(); + // Event.deltaY < 0 means wheel-up + changeVolume(event.deltaY < 0); + }); } function saveVolume(volume) { - options.savedVolume = volume; - writeOptions(); + options.savedVolume = volume; + writeOptions(); } -/** Add onwheel event to play bar and also track if play bar is hovered*/ +/** Add onwheel event to play bar and also track if play bar is hovered */ function setupPlaybar() { - const playerbar = $("ytmusic-player-bar"); + const playerbar = $('ytmusic-player-bar'); - playerbar.addEventListener("wheel", event => { - event.preventDefault(); - // Event.deltaY < 0 means wheel-up - changeVolume(event.deltaY < 0); - }); + playerbar.addEventListener('wheel', (event) => { + event.preventDefault(); + // Event.deltaY < 0 means wheel-up + changeVolume(event.deltaY < 0); + }); - // Keep track of mouse position for showVolumeSlider() - playerbar.addEventListener("mouseenter", () => { - playerbar.classList.add("on-hover"); - }); + // Keep track of mouse position for showVolumeSlider() + playerbar.addEventListener('mouseenter', () => { + playerbar.classList.add('on-hover'); + }); - playerbar.addEventListener("mouseleave", () => { - playerbar.classList.remove("on-hover"); - }); + playerbar.addEventListener('mouseleave', () => { + playerbar.classList.remove('on-hover'); + }); - setupSliderObserver(); + setupSliderObserver(); } /** Save volume + Update the volume tooltip when volume-slider is manually changed */ function setupSliderObserver() { - const sliderObserver = new MutationObserver(mutations => { - for (const mutation of mutations) { - // This checks that volume-slider was manually set - if (mutation.oldValue !== mutation.target.value && - (typeof options.savedVolume !== "number" || Math.abs(options.savedVolume - mutation.target.value) > 4)) { - // Diff>4 means it was manually set - setTooltip(mutation.target.value); - saveVolume(mutation.target.value); - } - } - }); + const sliderObserver = new MutationObserver((mutations) => { + for (const mutation of mutations) { + // This checks that volume-slider was manually set + if (mutation.oldValue !== mutation.target.value + && (typeof options.savedVolume !== 'number' || Math.abs(options.savedVolume - mutation.target.value) > 4)) { + // Diff>4 means it was manually set + setTooltip(mutation.target.value); + saveVolume(mutation.target.value); + } + } + }); - // Observing only changes in 'value' of volume-slider - sliderObserver.observe($("#volume-slider"), { - attributeFilter: ["value"], - attributeOldValue: true - }); + // Observing only changes in 'value' of volume-slider + sliderObserver.observe($('#volume-slider'), { + attributeFilter: ['value'], + attributeOldValue: true, + }); } function setVolume(value) { - api.setVolume(value); - // Save the new volume - saveVolume(value); + api.setVolume(value); + // Save the new volume + saveVolume(value); - // change slider position (important) - updateVolumeSlider(); + // Change slider position (important) + updateVolumeSlider(); - // Change tooltips to new value - setTooltip(value); - // Show volume slider - showVolumeSlider(); - // Show volume HUD - showVolumeHud(value); + // Change tooltips to new value + setTooltip(value); + // Show volume slider + showVolumeSlider(); + // Show volume HUD + showVolumeHud(value); } -/** if (toIncrease = false) then volume decrease */ +/** If (toIncrease = false) then volume decrease */ function changeVolume(toIncrease) { - // Apply volume change if valid - const steps = Number(options.steps || 1); - setVolume(toIncrease ? - Math.min(api.getVolume() + steps, 100) : - Math.max(api.getVolume() - steps, 0)); + // Apply volume change if valid + const steps = Number(options.steps || 1); + setVolume(toIncrease + ? Math.min(api.getVolume() + steps, 100) + : Math.max(api.getVolume() - steps, 0)); } function updateVolumeSlider() { - // Slider value automatically rounds to multiples of 5 - for (const slider of ["#volume-slider", "#expand-volume-slider"]) { - $(slider).value = - options.savedVolume > 0 && options.savedVolume < 5 - ? 5 - : options.savedVolume; - } + // Slider value automatically rounds to multiples of 5 + for (const slider of ['#volume-slider', '#expand-volume-slider']) { + $(slider).value + = options.savedVolume > 0 && options.savedVolume < 5 + ? 5 + : options.savedVolume; + } } function showVolumeSlider() { - const slider = $("#volume-slider"); - // This class display the volume slider if not in minimized mode - slider.classList.add("on-hover"); - - hideVolumeSlider(slider); + const slider = $('#volume-slider'); + // This class display the volume slider if not in minimized mode + slider.classList.add('on-hover'); + + hideVolumeSlider(slider); } // Set new volume as tooltip for volume slider and icon + expanding slider (appears when window size is small) const tooltipTargets = [ - "#volume-slider", - "tp-yt-paper-icon-button.volume", - "#expand-volume-slider", - "#expand-volume" + '#volume-slider', + 'tp-yt-paper-icon-button.volume', + '#expand-volume-slider', + '#expand-volume', ]; function setTooltip(volume) { - for (target of tooltipTargets) { - $(target).title = `${volume}%`; - } + for (target of tooltipTargets) { + $(target).title = `${volume}%`; + } } function setupLocalArrowShortcuts() { - if (options.arrowsShortcut) { - window.addEventListener('keydown', (event) => { - if ($('ytmusic-search-box').opened) return; - switch (event.code) { - case "ArrowUp": - event.preventDefault(); - changeVolume(true); - break; - case "ArrowDown": - event.preventDefault(); - changeVolume(false); - break; - } - }); - } + if (options.arrowsShortcut) { + window.addEventListener('keydown', (event) => { + if ($('ytmusic-search-box').opened) { + return; + } + + switch (event.code) { + case 'ArrowUp': { + event.preventDefault(); + changeVolume(true); + break; + } + + case 'ArrowDown': { + event.preventDefault(); + changeVolume(false); + break; + } + } + }); + } } diff --git a/plugins/precise-volume/menu.js b/plugins/precise-volume/menu.js index 74f7b14a..8f4316b0 100644 --- a/plugins/precise-volume/menu.js +++ b/plugins/precise-volume/menu.js @@ -1,82 +1,86 @@ -const { enabled } = require("./back"); -const { setMenuOptions } = require("../../config/plugins"); -const prompt = require("custom-electron-prompt"); -const promptOptions = require("../../providers/prompt-options"); +const prompt = require('custom-electron-prompt'); + +const { enabled } = require('./back'); + +const { setMenuOptions } = require('../../config/plugins'); +const promptOptions = require('../../providers/prompt-options'); function changeOptions(changedOptions, options, win) { - for (option in changedOptions) { - options[option] = changedOptions[option]; - } - // Dynamically change setting if plugin is enabled - if (enabled()) { - win.webContents.send("setOptions", changedOptions); - } else { // Fallback to usual method if disabled - setMenuOptions("precise-volume", options); - } + for (option in changedOptions) { + options[option] = changedOptions[option]; + } + + // Dynamically change setting if plugin is enabled + if (enabled()) { + win.webContents.send('setOptions', changedOptions); + } else { // Fallback to usual method if disabled + setMenuOptions('precise-volume', options); + } } module.exports = (win, options) => [ - { - label: "Local Arrowkeys Controls", - type: "checkbox", - checked: !!options.arrowsShortcut, - click: item => { - changeOptions({ arrowsShortcut: item.checked }, options, win); - } - }, - { - label: "Global Hotkeys", - type: "checkbox", - checked: !!options.globalShortcuts.volumeUp || !!options.globalShortcuts.volumeDown, - click: item => promptGlobalShortcuts(win, options, item) - }, - { - label: "Set Custom Volume Steps", - click: () => promptVolumeSteps(win, options) - } + { + label: 'Local Arrowkeys Controls', + type: 'checkbox', + checked: Boolean(options.arrowsShortcut), + click(item) { + changeOptions({ arrowsShortcut: item.checked }, options, win); + }, + }, + { + label: 'Global Hotkeys', + type: 'checkbox', + checked: Boolean(options.globalShortcuts.volumeUp) || Boolean(options.globalShortcuts.volumeDown), + click: (item) => promptGlobalShortcuts(win, options, item), + }, + { + label: 'Set Custom Volume Steps', + click: () => promptVolumeSteps(win, options), + }, ]; // Helper function for globalShortcuts prompt -const kb = (label_, value_, default_) => { return { value: value_, label: label_, default: default_ || undefined }; }; +const kb = (label_, value_, default_) => ({ value: value_, label: label_, default: default_ || undefined }); async function promptVolumeSteps(win, options) { - const output = await prompt({ - title: "Volume Steps", - label: "Choose Volume Increase/Decrease Steps", - value: options.steps || 1, - type: "counter", - counterOptions: { minimum: 0, maximum: 100, multiFire: true }, - width: 380, - ...promptOptions() - }, win) + const output = await prompt({ + title: 'Volume Steps', + label: 'Choose Volume Increase/Decrease Steps', + value: options.steps || 1, + type: 'counter', + counterOptions: { minimum: 0, maximum: 100, multiFire: true }, + width: 380, + ...promptOptions(), + }, win); - if (output || output === 0) { // 0 is somewhat valid - changeOptions({ steps: output}, options, win); - } + if (output || output === 0) { // 0 is somewhat valid + changeOptions({ steps: output }, options, win); + } } async function promptGlobalShortcuts(win, options, item) { - const output = await prompt({ - title: "Global Volume Keybinds", - label: "Choose Global Volume Keybinds:", - type: "keybind", - keybindOptions: [ - kb("Increase Volume", "volumeUp", options.globalShortcuts?.volumeUp), - kb("Decrease Volume", "volumeDown", options.globalShortcuts?.volumeDown) - ], - ...promptOptions() - }, win) + const output = await prompt({ + title: 'Global Volume Keybinds', + label: 'Choose Global Volume Keybinds:', + type: 'keybind', + keybindOptions: [ + kb('Increase Volume', 'volumeUp', options.globalShortcuts?.volumeUp), + kb('Decrease Volume', 'volumeDown', options.globalShortcuts?.volumeDown), + ], + ...promptOptions(), + }, win); - if (output) { - let newGlobalShortcuts = {}; - for (const { value, accelerator } of output) { - newGlobalShortcuts[value] = accelerator; - } - changeOptions({ globalShortcuts: newGlobalShortcuts }, options, win); + if (output) { + const newGlobalShortcuts = {}; + for (const { value, accelerator } of output) { + newGlobalShortcuts[value] = accelerator; + } - item.checked = !!options.globalShortcuts.volumeUp || !!options.globalShortcuts.volumeDown; - } else { - // Reset checkbox if prompt was canceled - item.checked = !item.checked; - } + changeOptions({ globalShortcuts: newGlobalShortcuts }, options, win); + + item.checked = Boolean(options.globalShortcuts.volumeUp) || Boolean(options.globalShortcuts.volumeDown); + } else { + // Reset checkbox if prompt was canceled + item.checked = !item.checked; + } } diff --git a/plugins/precise-volume/preload.js b/plugins/precise-volume/preload.js index 31ae2f84..ab16e6c1 100644 --- a/plugins/precise-volume/preload.js +++ b/plugins/precise-volume/preload.js @@ -1,32 +1,32 @@ -const is = require("electron-is"); +const is = require('electron-is'); let ignored = { - id: ["volume-slider", "expand-volume-slider"], - types: ["mousewheel", "keydown", "keyup"] + id: ['volume-slider', 'expand-volume-slider'], + types: ['mousewheel', 'keydown', 'keyup'], }; function overrideAddEventListener() { - // Save native addEventListener - Element.prototype._addEventListener = Element.prototype.addEventListener; - // Override addEventListener to Ignore specific events in volume-slider - Element.prototype.addEventListener = function (type, listener, useCapture = false) { - if (!( - ignored.id.includes(this.id) && - ignored.types.includes(type) - )) { - this._addEventListener(type, listener, useCapture); - } else if (is.dev()) { - console.log(`Ignoring event: "${this.id}.${type}()"`); - } - }; + // Save native addEventListener + Element.prototype._addEventListener = Element.prototype.addEventListener; + // Override addEventListener to Ignore specific events in volume-slider + Element.prototype.addEventListener = function (type, listener, useCapture = false) { + if (!( + ignored.id.includes(this.id) + && ignored.types.includes(type) + )) { + this._addEventListener(type, listener, useCapture); + } else if (is.dev()) { + console.log(`Ignoring event: "${this.id}.${type}()"`); + } + }; } module.exports = () => { - overrideAddEventListener(); - // Restore original function after finished loading to avoid keeping Element.prototype altered - window.addEventListener('load', () => { - Element.prototype.addEventListener = Element.prototype._addEventListener; - Element.prototype._addEventListener = undefined; - ignored = undefined; - }, { once: true }); + overrideAddEventListener(); + // Restore original function after finished loading to avoid keeping Element.prototype altered + window.addEventListener('load', () => { + Element.prototype.addEventListener = Element.prototype._addEventListener; + Element.prototype._addEventListener = undefined; + ignored = undefined; + }, { once: true }); }; diff --git a/plugins/precise-volume/volume-hud.css b/plugins/precise-volume/volume-hud.css index 618b94fc..71cc2c4e 100644 --- a/plugins/precise-volume/volume-hud.css +++ b/plugins/precise-volume/volume-hud.css @@ -1,11 +1,11 @@ #volumeHud { - z-index: 999; - position: absolute; - transition: opacity 0.6s; - pointer-events: none; - padding: 10px; + z-index: 999; + position: absolute; + transition: opacity 0.6s; + pointer-events: none; + padding: 10px; } ytmusic-player[player-ui-state_="MINIPLAYER"] #volumeHud { - top: 0 !important; + top: 0 !important; } diff --git a/plugins/quality-changer/back.js b/plugins/quality-changer/back.js index d46b8675..eafce7a2 100644 --- a/plugins/quality-changer/back.js +++ b/plugins/quality-changer/back.js @@ -1,15 +1,13 @@ -const { ipcMain, dialog } = require("electron"); +const { ipcMain, dialog } = require('electron'); module.exports = () => { - ipcMain.handle('qualityChanger', async (_, qualityLabels, currentIndex) => { - return await dialog.showMessageBox({ - type: "question", - buttons: qualityLabels, - defaultId: currentIndex, - title: "Choose Video Quality", - message: "Choose Video Quality:", - detail: `Current Quality: ${qualityLabels[currentIndex]}`, - cancelId: -1 - }) - }) + ipcMain.handle('qualityChanger', async (_, qualityLabels, currentIndex) => await dialog.showMessageBox({ + type: 'question', + buttons: qualityLabels, + defaultId: currentIndex, + title: 'Choose Video Quality', + message: 'Choose Video Quality:', + detail: `Current Quality: ${qualityLabels[currentIndex]}`, + cancelId: -1, + })); }; diff --git a/plugins/quality-changer/front.js b/plugins/quality-changer/front.js index 2b746d15..e5f2885f 100644 --- a/plugins/quality-changer/front.js +++ b/plugins/quality-changer/front.js @@ -1,34 +1,39 @@ -const { ElementFromFile, templatePath } = require("../utils"); -const { ipcRenderer } = require("electron"); +const { ipcRenderer } = require('electron'); -function $(selector) { return document.querySelector(selector); } +const { ElementFromFile, templatePath } = require('../utils'); + +function $(selector) { + return document.querySelector(selector); +} const qualitySettingsButton = ElementFromFile( - templatePath(__dirname, "qualitySettingsTemplate.html") + templatePath(__dirname, 'qualitySettingsTemplate.html'), ); - module.exports = () => { - document.addEventListener('apiLoaded', setup, { once: true, passive: true }); -} + document.addEventListener('apiLoaded', setup, { once: true, passive: true }); +}; function setup(event) { - const api = event.detail; + const api = event.detail; - $('.top-row-buttons.ytmusic-player').prepend(qualitySettingsButton); + $('.top-row-buttons.ytmusic-player').prepend(qualitySettingsButton); - qualitySettingsButton.onclick = function chooseQuality() { - setTimeout(() => $('#player').click()); + qualitySettingsButton.addEventListener('click', function chooseQuality() { + setTimeout(() => $('#player').click()); - const qualityLevels = api.getAvailableQualityLevels(); + const qualityLevels = api.getAvailableQualityLevels(); - const currentIndex = qualityLevels.indexOf(api.getPlaybackQuality()); + const currentIndex = qualityLevels.indexOf(api.getPlaybackQuality()); - ipcRenderer.invoke('qualityChanger', api.getAvailableQualityLabels(), currentIndex).then(promise => { - if (promise.response === -1) return; - const newQuality = qualityLevels[promise.response]; - api.setPlaybackQualityRange(newQuality); - api.setPlaybackQuality(newQuality) - }); - } + ipcRenderer.invoke('qualityChanger', api.getAvailableQualityLabels(), currentIndex).then((promise) => { + if (promise.response === -1) { + return; + } + + const newQuality = qualityLevels[promise.response]; + api.setPlaybackQualityRange(newQuality); + api.setPlaybackQuality(newQuality); + }); + }); } diff --git a/plugins/quality-changer/templates/qualitySettingsTemplate.html b/plugins/quality-changer/templates/qualitySettingsTemplate.html index 64c012fe..1b7d5b1f 100644 --- a/plugins/quality-changer/templates/qualitySettingsTemplate.html +++ b/plugins/quality-changer/templates/qualitySettingsTemplate.html @@ -1,13 +1,16 @@ - - - - - - - - \ No newline at end of file + + + + + + + + + diff --git a/plugins/shortcuts/back.js b/plugins/shortcuts/back.js index 06d899d7..ca4500a4 100644 --- a/plugins/shortcuts/back.js +++ b/plugins/shortcuts/back.js @@ -1,62 +1,66 @@ -const { globalShortcut } = require("electron"); -const is = require("electron-is"); -const electronLocalshortcut = require("electron-localshortcut"); -const getSongControls = require("../../providers/song-controls"); -const registerMPRIS = require("./mpris"); +const { globalShortcut } = require('electron'); +const is = require('electron-is'); +const electronLocalshortcut = require('electron-localshortcut'); + +const registerMPRIS = require('./mpris'); + +const getSongControls = require('../../providers/song-controls'); function _registerGlobalShortcut(webContents, shortcut, action) { - globalShortcut.register(shortcut, () => { - action(webContents); - }); + globalShortcut.register(shortcut, () => { + action(webContents); + }); } function _registerLocalShortcut(win, shortcut, action) { - electronLocalshortcut.register(win, shortcut, () => { - action(win.webContents); - }); + electronLocalshortcut.register(win, shortcut, () => { + action(win.webContents); + }); } function registerShortcuts(win, options) { - const songControls = getSongControls(win); - const { playPause, next, previous, search } = songControls; + const songControls = getSongControls(win); + const { playPause, next, previous, search } = songControls; - if (options.overrideMediaKeys) { - _registerGlobalShortcut(win.webContents, "MediaPlayPause", playPause); - _registerGlobalShortcut(win.webContents, "MediaNextTrack", next); - _registerGlobalShortcut(win.webContents, "MediaPreviousTrack", previous); - } + if (options.overrideMediaKeys) { + _registerGlobalShortcut(win.webContents, 'MediaPlayPause', playPause); + _registerGlobalShortcut(win.webContents, 'MediaNextTrack', next); + _registerGlobalShortcut(win.webContents, 'MediaPreviousTrack', previous); + } - _registerLocalShortcut(win, "CommandOrControl+F", search); - _registerLocalShortcut(win, "CommandOrControl+L", search); + _registerLocalShortcut(win, 'CommandOrControl+F', search); + _registerLocalShortcut(win, 'CommandOrControl+L', search); - if (is.linux()) registerMPRIS(win); + if (is.linux()) { + registerMPRIS(win); + } - const { global, local } = options; - const shortcutOptions = { global, local }; + const { global, local } = options; + const shortcutOptions = { global, local }; - for (const optionType in shortcutOptions) { - registerAllShortcuts(shortcutOptions[optionType], optionType); - } + for (const optionType in shortcutOptions) { + registerAllShortcuts(shortcutOptions[optionType], optionType); + } - function registerAllShortcuts(container, type) { - for (const action in container) { - if (!container[action]) { - continue; // Action accelerator is empty - } + function registerAllShortcuts(container, type) { + for (const action in container) { + if (!container[action]) { + continue; // Action accelerator is empty + } - console.debug(`Registering ${type} shortcut`, container[action], ":", action); - if (!songControls[action]) { - console.warn("Invalid action", action); - continue; - } + console.debug(`Registering ${type} shortcut`, container[action], ':', action); + if (!songControls[action]) { + console.warn('Invalid action', action); + continue; + } - if (type === "global") { - _registerGlobalShortcut(win.webContents, container[action], songControls[action]); - } else { // type === "local" - _registerLocalShortcut(win, local[action], songControls[action]); - } - } - } + if (type === 'global') { + _registerGlobalShortcut(win.webContents, container[action], songControls[action]); + } else { // Type === "local" + _registerLocalShortcut(win, local[action], songControls[action]); + } + } + } } module.exports = registerShortcuts; diff --git a/plugins/shortcuts/menu.js b/plugins/shortcuts/menu.js index df9db161..66f6a566 100644 --- a/plugins/shortcuts/menu.js +++ b/plugins/shortcuts/menu.js @@ -1,53 +1,56 @@ -const { setMenuOptions } = require("../../config/plugins"); -const prompt = require("custom-electron-prompt"); -const promptOptions = require("../../providers/prompt-options"); +const prompt = require('custom-electron-prompt'); + +const { setMenuOptions } = require('../../config/plugins'); +const promptOptions = require('../../providers/prompt-options'); module.exports = (win, options) => [ - { - label: "Set Global Song Controls", - click: () => promptKeybind(options, win) - }, - { - label: "Override MediaKeys", - type: "checkbox", - checked: options.overrideMediaKeys, - click: item => setOption(options, "overrideMediaKeys", item.checked) - } + { + label: 'Set Global Song Controls', + click: () => promptKeybind(options, win), + }, + { + label: 'Override MediaKeys', + type: 'checkbox', + checked: options.overrideMediaKeys, + click: (item) => setOption(options, 'overrideMediaKeys', item.checked), + }, ]; function setOption(options, key = null, newValue = null) { - if (key && newValue !== null) { - options[key] = newValue; - } + if (key && newValue !== null) { + options[key] = newValue; + } - setMenuOptions("shortcuts", options); + setMenuOptions('shortcuts', options); } // Helper function for keybind prompt -const kb = (label_, value_, default_) => { return { value: value_, label: label_, default: default_ }; }; +const kb = (label_, value_, default_) => ({ value: value_, label: label_, default: default_ }); async function promptKeybind(options, win) { - const output = await prompt({ - title: "Global Keybinds", - label: "Choose Global Keybinds for Songs Control:", - type: "keybind", - keybindOptions: [ // If default=undefined then no default is used - kb("Previous", "previous", options.global?.previous), - kb("Play / Pause", "playPause", options.global?.playPause), - kb("Next", "next", options.global?.next) - ], - height: 270, - ...promptOptions() - }, win); + const output = await prompt({ + title: 'Global Keybinds', + label: 'Choose Global Keybinds for Songs Control:', + type: 'keybind', + keybindOptions: [ // If default=undefined then no default is used + kb('Previous', 'previous', options.global?.previous), + kb('Play / Pause', 'playPause', options.global?.playPause), + kb('Next', 'next', options.global?.next), + ], + height: 270, + ...promptOptions(), + }, win); - if (output) { - if (!options.global) { - options.global = {}; - } - for (const { value, accelerator } of output) { - options.global[value] = accelerator; - } - setOption(options); - } - // else -> pressed cancel + if (output) { + if (!options.global) { + options.global = {}; + } + + for (const { value, accelerator } of output) { + options.global[value] = accelerator; + } + + setOption(options); + } + // Else -> pressed cancel } diff --git a/plugins/shortcuts/mpris.js b/plugins/shortcuts/mpris.js index 8b8aeb9f..f9546b1b 100644 --- a/plugins/shortcuts/mpris.js +++ b/plugins/shortcuts/mpris.js @@ -1,164 +1,180 @@ -const mpris = require("mpris-service"); -const { ipcMain } = require("electron"); -const registerCallback = require("../../providers/song-info"); -const getSongControls = require("../../providers/song-controls"); -const config = require("../../config"); +const { ipcMain } = require('electron'); +const mpris = require('mpris-service'); + +const registerCallback = require('../../providers/song-info'); +const getSongControls = require('../../providers/song-controls'); +const config = require('../../config'); function setupMPRIS() { - const player = mpris({ - name: "youtube-music", - identity: "YouTube Music", - canRaise: true, - supportedUriSchemes: ["https"], - supportedMimeTypes: ["audio/mpeg"], - supportedInterfaces: ["player"], - desktopEntry: "youtube-music", - }); + const player = mpris({ + name: 'youtube-music', + identity: 'YouTube Music', + canRaise: true, + supportedUriSchemes: ['https'], + supportedMimeTypes: ['audio/mpeg'], + supportedInterfaces: ['player'], + desktopEntry: 'youtube-music', + }); - return player; + return player; } /** @param {Electron.BrowserWindow} win */ function registerMPRIS(win) { - const songControls = getSongControls(win); - const { playPause, next, previous, volumeMinus10, volumePlus10, shuffle } = songControls; - try { - const secToMicro = n => Math.round(Number(n) * 1e6); - const microToSec = n => Math.round(Number(n) / 1e6); + const songControls = getSongControls(win); + const { playPause, next, previous, volumeMinus10, volumePlus10, shuffle } = songControls; + try { + const secToMicro = (n) => Math.round(Number(n) * 1e6); + const microToSec = (n) => Math.round(Number(n) / 1e6); - const seekTo = e => win.webContents.send("seekTo", microToSec(e.position)); - const seekBy = o => win.webContents.send("seekBy", microToSec(o)); + const seekTo = (e) => win.webContents.send('seekTo', microToSec(e.position)); + const seekBy = (o) => win.webContents.send('seekBy', microToSec(o)); - const player = setupMPRIS(); + const player = setupMPRIS(); - ipcMain.on("apiLoaded", () => { - win.webContents.send("setupSeekedListener", "mpris"); - win.webContents.send("setupTimeChangedListener", "mpris"); - win.webContents.send("setupRepeatChangedListener", "mpris"); - win.webContents.send("setupVolumeChangedListener", "mpris"); - }); + ipcMain.on('apiLoaded', () => { + win.webContents.send('setupSeekedListener', 'mpris'); + win.webContents.send('setupTimeChangedListener', 'mpris'); + win.webContents.send('setupRepeatChangedListener', 'mpris'); + win.webContents.send('setupVolumeChangedListener', 'mpris'); + }); - ipcMain.on('seeked', (_, t) => player.seeked(secToMicro(t))); + ipcMain.on('seeked', (_, t) => player.seeked(secToMicro(t))); - let currentSeconds = 0; - ipcMain.on('timeChanged', (_, t) => currentSeconds = t); + let currentSeconds = 0; + ipcMain.on('timeChanged', (_, t) => currentSeconds = t); - ipcMain.on("repeatChanged", (_, mode) => { - if (mode === "NONE") - player.loopStatus = mpris.LOOP_STATUS_NONE; - else if (mode === "ONE") //MPRIS Playlist and Track Codes are switched to look the same as yt-music icons - player.loopStatus = mpris.LOOP_STATUS_PLAYLIST; - else if (mode === "ALL") - player.loopStatus = mpris.LOOP_STATUS_TRACK; - }); - player.on("loopStatus", (status) => { - // switchRepeat cycles between states in that order - const switches = [mpris.LOOP_STATUS_NONE, mpris.LOOP_STATUS_PLAYLIST, mpris.LOOP_STATUS_TRACK]; - const currentIndex = switches.indexOf(player.loopStatus); - const targetIndex = switches.indexOf(status); + ipcMain.on('repeatChanged', (_, mode) => { + switch (mode) { + case 'NONE': { + player.loopStatus = mpris.LOOP_STATUS_NONE; + break; + } - // Get a delta in the range [0,2] - const delta = (targetIndex - currentIndex + 3) % 3; - songControls.switchRepeat(delta); - }) + case 'ONE': { + player.loopStatus = mpris.LOOP_STATUS_PLAYLIST; + break; + } - player.getPosition = () => secToMicro(currentSeconds) + case 'ALL': { + { + player.loopStatus = mpris.LOOP_STATUS_TRACK; + // No default + } - player.on("raise", () => { - win.setSkipTaskbar(false); - win.show(); - }); + break; + } + } + }); + player.on('loopStatus', (status) => { + // SwitchRepeat cycles between states in that order + const switches = [mpris.LOOP_STATUS_NONE, mpris.LOOP_STATUS_PLAYLIST, mpris.LOOP_STATUS_TRACK]; + const currentIndex = switches.indexOf(player.loopStatus); + const targetIndex = switches.indexOf(status); - player.on("play", () => { - if (player.playbackStatus !== mpris.PLAYBACK_STATUS_PLAYING) { - player.playbackStatus = mpris.PLAYBACK_STATUS_PLAYING; - playPause() - } - }); - player.on("pause", () => { - if (player.playbackStatus !== mpris.PLAYBACK_STATUS_PAUSED) { - player.playbackStatus = mpris.PLAYBACK_STATUS_PAUSED; - playPause() - } - }); - player.on("playpause", () => { - player.playbackStatus = player.playbackStatus === mpris.PLAYBACK_STATUS_PLAYING ? mpris.PLAYBACK_STATUS_PAUSED : mpris.PLAYBACK_STATUS_PLAYING; - playPause(); - }); + // Get a delta in the range [0,2] + const delta = (targetIndex - currentIndex + 3) % 3; + songControls.switchRepeat(delta); + }); - player.on("next", next); - player.on("previous", previous); + player.getPosition = () => secToMicro(currentSeconds); - player.on('seek', seekBy); - player.on('position', seekTo); + player.on('raise', () => { + win.setSkipTaskbar(false); + win.show(); + }); - player.on('shuffle', (enableShuffle) => { - shuffle(); - }); + player.on('play', () => { + if (player.playbackStatus !== mpris.PLAYBACK_STATUS_PLAYING) { + player.playbackStatus = mpris.PLAYBACK_STATUS_PLAYING; + playPause(); + } + }); + player.on('pause', () => { + if (player.playbackStatus !== mpris.PLAYBACK_STATUS_PAUSED) { + player.playbackStatus = mpris.PLAYBACK_STATUS_PAUSED; + playPause(); + } + }); + player.on('playpause', () => { + player.playbackStatus = player.playbackStatus === mpris.PLAYBACK_STATUS_PLAYING ? mpris.PLAYBACK_STATUS_PAUSED : mpris.PLAYBACK_STATUS_PLAYING; + playPause(); + }); - let mprisVolNewer = false; - let autoUpdate = false; - ipcMain.on('volumeChanged', (_, newVol) => { - if (parseInt(player.volume * 100) !== newVol) { - if (mprisVolNewer) { - mprisVolNewer = false; - autoUpdate = false; - } else { - autoUpdate = true; - player.volume = parseFloat((newVol / 100).toFixed(2)); - mprisVolNewer = false; - autoUpdate = false; - } - } - }); + player.on('next', next); + player.on('previous', previous); - player.on('volume', (newVolume) => { - if (config.plugins.isEnabled('precise-volume')) { - // With precise volume we can set the volume to the exact value. - let newVol = parseInt(newVolume * 100); - if (parseInt(player.volume * 100) !== newVol) { - if (!autoUpdate) { - mprisVolNewer = true; - autoUpdate = false; - win.webContents.send('setVolume', newVol); - } - } - } else { - // With keyboard shortcuts we can only change the volume in increments of 10, so round it. - let deltaVolume = Math.round((newVolume - player.volume) * 10); - while (deltaVolume !== 0 && deltaVolume > 0) { - volumePlus10(); - player.volume = player.volume + 0.1; - deltaVolume--; - } - while (deltaVolume !== 0 && deltaVolume < 0) { - volumeMinus10(); - player.volume = player.volume - 0.1; - deltaVolume++; - } - } - }); + player.on('seek', seekBy); + player.on('position', seekTo); - registerCallback(songInfo => { - if (player) { - const data = { - 'mpris:length': secToMicro(songInfo.songDuration), - 'mpris:artUrl': songInfo.imageSrc, - 'xesam:title': songInfo.title, - 'xesam:url': songInfo.url, - 'xesam:artist': [songInfo.artist], - 'mpris:trackid': '/' - }; - if (songInfo.album) data['xesam:album'] = songInfo.album; - player.metadata = data; - player.seeked(secToMicro(songInfo.elapsedSeconds)); - player.playbackStatus = songInfo.isPaused ? mpris.PLAYBACK_STATUS_PAUSED : mpris.PLAYBACK_STATUS_PLAYING; - } - }) + player.on('shuffle', (enableShuffle) => { + shuffle(); + }); - } catch (e) { - console.warn("Error in MPRIS", e); - } + let mprisVolNewer = false; + let autoUpdate = false; + ipcMain.on('volumeChanged', (_, newVol) => { + if (Number.parseInt(player.volume * 100) !== newVol) { + if (mprisVolNewer) { + mprisVolNewer = false; + autoUpdate = false; + } else { + autoUpdate = true; + player.volume = Number.parseFloat((newVol / 100).toFixed(2)); + mprisVolNewer = false; + autoUpdate = false; + } + } + }); + + player.on('volume', (newVolume) => { + if (config.plugins.isEnabled('precise-volume')) { + // With precise volume we can set the volume to the exact value. + const newVol = Number.parseInt(newVolume * 100); + if (Number.parseInt(player.volume * 100) !== newVol && !autoUpdate) { + mprisVolNewer = true; + autoUpdate = false; + win.webContents.send('setVolume', newVol); + } + } else { + // With keyboard shortcuts we can only change the volume in increments of 10, so round it. + let deltaVolume = Math.round((newVolume - player.volume) * 10); + while (deltaVolume !== 0 && deltaVolume > 0) { + volumePlus10(); + player.volume += 0.1; + deltaVolume--; + } + + while (deltaVolume !== 0 && deltaVolume < 0) { + volumeMinus10(); + player.volume -= 0.1; + deltaVolume++; + } + } + }); + + registerCallback((songInfo) => { + if (player) { + const data = { + 'mpris:length': secToMicro(songInfo.songDuration), + 'mpris:artUrl': songInfo.imageSrc, + 'xesam:title': songInfo.title, + 'xesam:url': songInfo.url, + 'xesam:artist': [songInfo.artist], + 'mpris:trackid': '/', + }; + if (songInfo.album) { + data['xesam:album'] = songInfo.album; + } + + player.metadata = data; + player.seeked(secToMicro(songInfo.elapsedSeconds)); + player.playbackStatus = songInfo.isPaused ? mpris.PLAYBACK_STATUS_PAUSED : mpris.PLAYBACK_STATUS_PLAYING; + } + }); + } catch (error) { + console.warn('Error in MPRIS', error); + } } module.exports = registerMPRIS; diff --git a/plugins/skip-silences/front.js b/plugins/skip-silences/front.js index 69a6e919..bf2508fb 100644 --- a/plugins/skip-silences/front.js +++ b/plugins/skip-silences/front.js @@ -1,112 +1,114 @@ module.exports = (options) => { - let isSilent = false; - let hasAudioStarted = false; + let isSilent = false; + let hasAudioStarted = false; - const smoothing = 0.1; - const threshold = -100; // dB (-100 = absolute silence, 0 = loudest) - const interval = 2; // ms - const history = 10; - const speakingHistory = Array(history).fill(0); + const smoothing = 0.1; + const threshold = -100; // DB (-100 = absolute silence, 0 = loudest) + const interval = 2; // Ms + const history = 10; + const speakingHistory = Array.from({ length: history }).fill(0); - document.addEventListener( - "audioCanPlay", - (e) => { - const video = document.querySelector("video"); - const audioContext = e.detail.audioContext; - const sourceNode = e.detail.audioSource; + document.addEventListener( + 'audioCanPlay', + (e) => { + const video = document.querySelector('video'); + const { audioContext } = e.detail; + const sourceNode = e.detail.audioSource; - // Use an audio analyser similar to Hark - // https://github.com/otalk/hark/blob/master/hark.bundle.js - const analyser = audioContext.createAnalyser(); - analyser.fftSize = 512; - analyser.smoothingTimeConstant = smoothing; - const fftBins = new Float32Array(analyser.frequencyBinCount); + // Use an audio analyser similar to Hark + // https://github.com/otalk/hark/blob/master/hark.bundle.js + const analyser = audioContext.createAnalyser(); + analyser.fftSize = 512; + analyser.smoothingTimeConstant = smoothing; + const fftBins = new Float32Array(analyser.frequencyBinCount); - sourceNode.connect(analyser); - analyser.connect(audioContext.destination); + sourceNode.connect(analyser); + analyser.connect(audioContext.destination); - const looper = () => { - setTimeout(() => { - const currentVolume = getMaxVolume(analyser, fftBins); + const looper = () => { + setTimeout(() => { + const currentVolume = getMaxVolume(analyser, fftBins); - let history = 0; - if (currentVolume > threshold && isSilent) { - // trigger quickly, short history - for ( - let i = speakingHistory.length - 3; - i < speakingHistory.length; - i++ - ) { - history += speakingHistory[i]; - } - if (history >= 2) { - // Not silent - isSilent = false; - hasAudioStarted = true; - } - } else if (currentVolume < threshold && !isSilent) { - for (let i = 0; i < speakingHistory.length; i++) { - history += speakingHistory[i]; - } - if (history == 0) { - // Silent - if ( - !( - video.paused || - video.seeking || - video.ended || - video.muted || - video.volume === 0 - ) - ) { - isSilent = true; - skipSilence(); - } - } - } - speakingHistory.shift(); - speakingHistory.push(0 + (currentVolume > threshold)); + let history = 0; + if (currentVolume > threshold && isSilent) { + // Trigger quickly, short history + for ( + let i = speakingHistory.length - 3; + i < speakingHistory.length; + i++ + ) { + history += speakingHistory[i]; + } - looper(); - }, interval); - }; - looper(); + if (history >= 2) { + // Not silent + isSilent = false; + hasAudioStarted = true; + } + } else if (currentVolume < threshold && !isSilent) { + for (const element of speakingHistory) { + history += element; + } - const skipSilence = () => { - if (options.onlySkipBeginning && hasAudioStarted) { - return; - } + if (history == 0 // Silent - if (isSilent && !video.paused) { - video.currentTime += 0.2; // in s - } - }; + && !( + video.paused + || video.seeking + || video.ended + || video.muted + || video.volume === 0 + ) + ) { + isSilent = true; + skipSilence(); + } + } - video.addEventListener("play", function () { - hasAudioStarted = false; - skipSilence(); - }); + speakingHistory.shift(); + speakingHistory.push(0 + (currentVolume > threshold)); - video.addEventListener("seeked", function () { - hasAudioStarted = false; - skipSilence(); - }); - }, - { - passive: true, - } - ); + looper(); + }, interval); + }; + + looper(); + + const skipSilence = () => { + if (options.onlySkipBeginning && hasAudioStarted) { + return; + } + + if (isSilent && !video.paused) { + video.currentTime += 0.2; // In s + } + }; + + video.addEventListener('play', () => { + hasAudioStarted = false; + skipSilence(); + }); + + video.addEventListener('seeked', () => { + hasAudioStarted = false; + skipSilence(); + }); + }, + { + passive: true, + }, + ); }; function getMaxVolume(analyser, fftBins) { - var maxVolume = -Infinity; - analyser.getFloatFrequencyData(fftBins); + let maxVolume = Number.NEGATIVE_INFINITY; + analyser.getFloatFrequencyData(fftBins); - for (var i = 4, ii = fftBins.length; i < ii; i++) { - if (fftBins[i] > maxVolume && fftBins[i] < 0) { - maxVolume = fftBins[i]; - } - } + for (let i = 4, ii = fftBins.length; i < ii; i++) { + if (fftBins[i] > maxVolume && fftBins[i] < 0) { + maxVolume = fftBins[i]; + } + } - return maxVolume; + return maxVolume; } diff --git a/plugins/sponsorblock/back.js b/plugins/sponsorblock/back.js index 04667b85..82d5a314 100644 --- a/plugins/sponsorblock/back.js +++ b/plugins/sponsorblock/back.js @@ -1,51 +1,53 @@ -const fetch = require("node-fetch"); -const is = require("electron-is"); -const { ipcMain } = require("electron"); +const { ipcMain } = require('electron'); +const fetch = require('node-fetch'); +const is = require('electron-is'); -const defaultConfig = require("../../config/defaults"); -const { sortSegments } = require("./segments"); +const { sortSegments } = require('./segments'); + +const defaultConfig = require('../../config/defaults'); let videoID; module.exports = (win, options) => { - const { apiURL, categories } = { - ...defaultConfig.plugins.sponsorblock, - ...options, - }; + const { apiURL, categories } = { + ...defaultConfig.plugins.sponsorblock, + ...options, + }; - ipcMain.on("video-src-changed", async (_, data) => { - videoID = JSON.parse(data)?.videoDetails?.videoId; - const segments = await fetchSegments(apiURL, categories); - win.webContents.send("sponsorblock-skip", segments); - }); + ipcMain.on('video-src-changed', async (_, data) => { + videoID = JSON.parse(data)?.videoDetails?.videoId; + const segments = await fetchSegments(apiURL, categories); + win.webContents.send('sponsorblock-skip', segments); + }); }; - const fetchSegments = async (apiURL, categories) => { - const sponsorBlockURL = `${apiURL}/api/skipSegments?videoID=${videoID}&categories=${JSON.stringify( - categories - )}`; - try { - const resp = await fetch(sponsorBlockURL, { - method: "GET", - headers: { - "Content-Type": "application/json", - }, - redirect: "follow", - }); - if (resp.status !== 200) { - return []; - } - const segments = await resp.json(); - const sortedSegments = sortSegments( - segments.map((submission) => submission.segment) - ); + const sponsorBlockURL = `${apiURL}/api/skipSegments?videoID=${videoID}&categories=${JSON.stringify( + categories, + )}`; + try { + const resp = await fetch(sponsorBlockURL, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + redirect: 'follow', + }); + if (resp.status !== 200) { + return []; + } - return sortedSegments; - } catch (e) { - if (is.dev()) { - console.log('error on sponsorblock request:', e); - } - return []; - } + const segments = await resp.json(); + const sortedSegments = sortSegments( + segments.map((submission) => submission.segment), + ); + + return sortedSegments; + } catch (error) { + if (is.dev()) { + console.log('error on sponsorblock request:', error); + } + + return []; + } }; diff --git a/plugins/sponsorblock/front.js b/plugins/sponsorblock/front.js index c4b32869..d045f36b 100644 --- a/plugins/sponsorblock/front.js +++ b/plugins/sponsorblock/front.js @@ -1,31 +1,30 @@ -const { ipcRenderer } = require("electron"); - -const is = require("electron-is"); +const { ipcRenderer } = require('electron'); +const is = require('electron-is'); let currentSegments = []; module.exports = () => { - ipcRenderer.on("sponsorblock-skip", (_, segments) => { - currentSegments = segments; - }); + ipcRenderer.on('sponsorblock-skip', (_, segments) => { + currentSegments = segments; + }); - document.addEventListener('apiLoaded', () => { - const video = document.querySelector('video'); + document.addEventListener('apiLoaded', () => { + const video = document.querySelector('video'); - video.addEventListener('timeupdate', e => { - currentSegments.forEach((segment) => { - if ( - e.target.currentTime >= segment[0] && - e.target.currentTime < segment[1] - ) { - e.target.currentTime = segment[1]; - if (is.dev()) { - console.log("SponsorBlock: skipping segment", segment); - } - } - }); - }) - // Reset segments on song end - video.addEventListener('emptied', () => currentSegments = []); - }, { once: true, passive: true }) + video.addEventListener('timeupdate', (e) => { + for (const segment of currentSegments) { + if ( + e.target.currentTime >= segment[0] + && e.target.currentTime < segment[1] + ) { + e.target.currentTime = segment[1]; + if (is.dev()) { + console.log('SponsorBlock: skipping segment', segment); + } + } + } + }); + // Reset segments on song end + video.addEventListener('emptied', () => currentSegments = []); + }, { once: true, passive: true }); }; diff --git a/plugins/sponsorblock/segments.js b/plugins/sponsorblock/segments.js index c12a9e88..bc034878 100644 --- a/plugins/sponsorblock/segments.js +++ b/plugins/sponsorblock/segments.js @@ -1,29 +1,30 @@ // Segments are an array [ [start, end], … ] module.exports.sortSegments = (segments) => { - segments.sort((segment1, segment2) => - segment1[0] === segment2[0] - ? segment1[1] - segment2[1] - : segment1[0] - segment2[0] - ); + segments.sort((segment1, segment2) => + segment1[0] === segment2[0] + ? segment1[1] - segment2[1] + : segment1[0] - segment2[0], + ); - const compiledSegments = []; - let currentSegment; + const compiledSegments = []; + let currentSegment; - segments.forEach((segment) => { - if (!currentSegment) { - currentSegment = segment; - return; - } + for (const segment of segments) { + if (!currentSegment) { + currentSegment = segment; + continue; + } - if (currentSegment[1] < segment[0]) { - compiledSegments.push(currentSegment); - currentSegment = segment; - return; - } + if (currentSegment[1] < segment[0]) { + compiledSegments.push(currentSegment); + currentSegment = segment; + continue; + } - currentSegment[1] = Math.max(currentSegment[1], segment[1]); - }); - compiledSegments.push(currentSegment); + currentSegment[1] = Math.max(currentSegment[1], segment[1]); + } - return compiledSegments; + compiledSegments.push(currentSegment); + + return compiledSegments; }; diff --git a/plugins/sponsorblock/tests/segments.test.js b/plugins/sponsorblock/tests/segments.test.js index 39859608..002bff8f 100644 --- a/plugins/sponsorblock/tests/segments.test.js +++ b/plugins/sponsorblock/tests/segments.test.js @@ -1,36 +1,36 @@ -const { test, expect } = require("@playwright/test"); +const { test, expect } = require('@playwright/test'); -const { sortSegments } = require("../segments"); +const { sortSegments } = require('../segments'); -test("Segment sorting", () => { - expect( - sortSegments([ - [0, 3], - [7, 8], - [5, 6], - ]) - ).toEqual([ - [0, 3], - [5, 6], - [7, 8], - ]); +test('Segment sorting', () => { + expect( + sortSegments([ + [0, 3], + [7, 8], + [5, 6], + ]), + ).toEqual([ + [0, 3], + [5, 6], + [7, 8], + ]); - expect( - sortSegments([ - [0, 5], - [6, 8], - [4, 6], - ]) - ).toEqual([[0, 8]]); + expect( + sortSegments([ + [0, 5], + [6, 8], + [4, 6], + ]), + ).toEqual([[0, 8]]); - expect( - sortSegments([ - [0, 6], - [7, 8], - [4, 6], - ]) - ).toEqual([ - [0, 6], - [7, 8], - ]); + expect( + sortSegments([ + [0, 6], + [7, 8], + [4, 6], + ]), + ).toEqual([ + [0, 6], + [7, 8], + ]); }); diff --git a/plugins/taskbar-mediacontrol/back.js b/plugins/taskbar-mediacontrol/back.js index dce9a6b3..92d11fa5 100644 --- a/plugins/taskbar-mediacontrol/back.js +++ b/plugins/taskbar-mediacontrol/back.js @@ -1,53 +1,60 @@ +const path = require('node:path'); + const getSongControls = require('../../providers/song-controls'); const registerCallback = require('../../providers/song-info'); -const path = require('path'); let controls; let currentSongInfo; -module.exports = win => { - const { playPause, next, previous } = getSongControls(win); - controls = { playPause, next, previous }; +module.exports = (win) => { + const { playPause, next, previous } = getSongControls(win); + controls = { playPause, next, previous }; - registerCallback(songInfo => { - //update currentsonginfo for win.on('show') - currentSongInfo = songInfo; - // update thumbar - setThumbar(win, songInfo); - }); + registerCallback((songInfo) => { + // Update currentsonginfo for win.on('show') + currentSongInfo = songInfo; + // Update thumbar + setThumbar(win, songInfo); + }); - // need to set thumbar again after win.show - win.on("show", () => { - setThumbar(win, currentSongInfo) - }) + // Need to set thumbar again after win.show + win.on('show', () => { + setThumbar(win, currentSongInfo); + }); }; function setThumbar(win, songInfo) { - // Wait for song to start before setting thumbar - if (!songInfo?.title) { - return; - } + // Wait for song to start before setting thumbar + if (!songInfo?.title) { + return; + } - // Win32 require full rewrite of components - win.setThumbarButtons([ - { - tooltip: 'Previous', - icon: get('previous'), - click() { controls.previous(win.webContents); } - }, { - tooltip: 'Play/Pause', - // Update icon based on play state - icon: songInfo.isPaused ? get('play') : get('pause'), - click() { controls.playPause(win.webContents); } - }, { - tooltip: 'Next', - icon: get('next'), - click() { controls.next(win.webContents); } - } - ]); + // Win32 require full rewrite of components + win.setThumbarButtons([ + { + tooltip: 'Previous', + icon: get('previous'), + click() { + controls.previous(win.webContents); + }, + }, { + tooltip: 'Play/Pause', + // Update icon based on play state + icon: songInfo.isPaused ? get('play') : get('pause'), + click() { + controls.playPause(win.webContents); + }, + }, { + tooltip: 'Next', + icon: get('next'), + click() { + controls.next(win.webContents); + }, + }, + ]); } // Util function get(kind) { - return path.join(__dirname, "../../assets/media-icons-black", `${kind}.png`); + return path.join(__dirname, '../../assets/media-icons-black', `${kind}.png`); } diff --git a/plugins/touchbar/back.js b/plugins/touchbar/back.js index 02b28cc1..8696a6b9 100644 --- a/plugins/touchbar/back.js +++ b/plugins/touchbar/back.js @@ -1,18 +1,19 @@ -const { TouchBar } = require("electron"); +const { TouchBar } = require('electron'); + const { - TouchBarButton, - TouchBarLabel, - TouchBarSpacer, - TouchBarSegmentedControl, - TouchBarScrubber, + TouchBarButton, + TouchBarLabel, + TouchBarSpacer, + TouchBarSegmentedControl, + TouchBarScrubber, } = TouchBar; -const registerCallback = require("../../providers/song-info"); -const getSongControls = require("../../providers/song-controls"); +const registerCallback = require('../../providers/song-info'); +const getSongControls = require('../../providers/song-controls'); // Songtitle label const songTitle = new TouchBarLabel({ - label: "", + label: '', }); // This will store the song controls once available let controls = []; @@ -25,62 +26,62 @@ const pausePlayButton = new TouchBarButton(); // The song control buttons (control functions are in the same order) const buttons = new TouchBarSegmentedControl({ - mode: "buttons", - segments: [ - new TouchBarButton({ - label: "⏮", - }), - pausePlayButton, - new TouchBarButton({ - label: "⏭", - }), - new TouchBarButton({ - label: "👎", - }), - new TouchBarButton({ - label: "👍", - }), - ], - change: (i) => controls[i](), + mode: 'buttons', + segments: [ + new TouchBarButton({ + label: '⏮', + }), + pausePlayButton, + new TouchBarButton({ + label: '⏭', + }), + new TouchBarButton({ + label: '👎', + }), + new TouchBarButton({ + label: '👍', + }), + ], + change: (i) => controls[i](), }); // This is the touchbar object, this combines everything with proper layout const touchBar = new TouchBar({ - items: [ - new TouchBarScrubber({ - items: [songImage, songTitle], - continuous: false, - }), - new TouchBarSpacer({ - size: "flexible", - }), - buttons, - ], + items: [ + new TouchBarScrubber({ + items: [songImage, songTitle], + continuous: false, + }), + new TouchBarSpacer({ + size: 'flexible', + }), + buttons, + ], }); module.exports = (win) => { - const { playPause, next, previous, dislike, like } = getSongControls(win); + const { playPause, next, previous, dislike, like } = getSongControls(win); - // If the page is ready, register the callback - win.once("ready-to-show", () => { - controls = [previous, playPause, next, dislike, like]; + // If the page is ready, register the callback + win.once('ready-to-show', () => { + controls = [previous, playPause, next, dislike, like]; - // Register the callback - registerCallback((songInfo) => { - // Song information changed, so lets update the touchBar + // Register the callback + registerCallback((songInfo) => { + // Song information changed, so lets update the touchBar - // Set the song title - songTitle.label = songInfo.title; + // Set the song title + songTitle.label = songInfo.title; - // Changes the pause button if paused - pausePlayButton.label = songInfo.isPaused ? "▶️" : "⏸"; + // Changes the pause button if paused + pausePlayButton.label = songInfo.isPaused ? '▶️' : '⏸'; - // Get image source - songImage.icon = songInfo.image - ? songInfo.image.resize({ height: 23 }) - : null; + // Get image source + songImage.icon = songInfo.image + ? songInfo.image.resize({ height: 23 }) + : null; - win.setTouchBar(touchBar); - }); - }); + win.setTouchBar(touchBar); + }); + }); }; diff --git a/plugins/tuna-obs/back.js b/plugins/tuna-obs/back.js index f38ab3a0..53ab429e 100644 --- a/plugins/tuna-obs/back.js +++ b/plugins/tuna-obs/back.js @@ -1,62 +1,72 @@ -const { ipcMain } = require("electron"); +const { ipcMain } = require('electron'); const fetch = require('node-fetch'); -const registerCallback = require("../../providers/song-info"); +const registerCallback = require('../../providers/song-info'); -const secToMilisec = t => Math.round(Number(t) * 1e3); +const secToMilisec = (t) => Math.round(Number(t) * 1e3); const data = { - cover: '', - cover_url: '', - title: '', - artists: [], - status: '', - progress: 0, - duration: 0, - album_url: '', - album: undefined + cover: '', + cover_url: '', + title: '', + artists: [], + status: '', + progress: 0, + duration: 0, + album_url: '', + album: undefined, }; const post = async (data) => { - const port = 1608; - headers = { - 'Content-Type': 'application/json', - 'Accept': 'application/json', - 'Access-Control-Allow-Headers': '*', - 'Access-Control-Allow-Origin': '*' - } - const url = `http://localhost:${port}/`; - fetch(url, { method: 'POST', headers, body: JSON.stringify({ data }) }).catch(e => console.log(`Error: '${e.code || e.errno}' - when trying to access obs-tuna webserver at port ${port}`)); -} + const port = 1608; + headers = { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + 'Access-Control-Allow-Headers': '*', + 'Access-Control-Allow-Origin': '*', + }; + const url = `http://localhost:${port}/`; + fetch(url, { + method: 'POST', + headers, + body: JSON.stringify({ data }), + }).catch((error) => console.log(`Error: '${error.code || error.errno}' - when trying to access obs-tuna webserver at port ${port}`)); +}; /** @param {Electron.BrowserWindow} win */ module.exports = async (win) => { - ipcMain.on('apiLoaded', () => win.webContents.send('setupTimeChangedListener')); - ipcMain.on('timeChanged', async (_, t) => { - if (!data.title) return; - data.progress = secToMilisec(t); - post(data); - }); - ipcMain.on('playPaused', (_, { isPaused, elapsedSeconds }) => { - if (!data.title) return; - data.status = isPaused ? 'stopped' : 'playing'; - data.progress = secToMilisec(elapsedSeconds); - post(data); - }); + ipcMain.on('apiLoaded', () => win.webContents.send('setupTimeChangedListener')); + ipcMain.on('timeChanged', async (_, t) => { + if (!data.title) { + return; + } - registerCallback((songInfo) => { - if (!songInfo.title && !songInfo.artist) { - return; - } + data.progress = secToMilisec(t); + post(data); + }); + ipcMain.on('playPaused', (_, { isPaused, elapsedSeconds }) => { + if (!data.title) { + return; + } - data.duration = secToMilisec(songInfo.songDuration) - data.progress = secToMilisec(songInfo.elapsedSeconds) - data.cover = songInfo.imageSrc; - data.cover_url = songInfo.imageSrc; - data.album_url = songInfo.imageSrc; - data.title = songInfo.title; - data.artists = [songInfo.artist]; - data.status = songInfo.isPaused ? 'stopped' : 'playing'; - data.album = songInfo.album; - post(data); - }) -} + data.status = isPaused ? 'stopped' : 'playing'; + data.progress = secToMilisec(elapsedSeconds); + post(data); + }); + + registerCallback((songInfo) => { + if (!songInfo.title && !songInfo.artist) { + return; + } + + data.duration = secToMilisec(songInfo.songDuration); + data.progress = secToMilisec(songInfo.elapsedSeconds); + data.cover = songInfo.imageSrc; + data.cover_url = songInfo.imageSrc; + data.album_url = songInfo.imageSrc; + data.title = songInfo.title; + data.artists = [songInfo.artist]; + data.status = songInfo.isPaused ? 'stopped' : 'playing'; + data.album = songInfo.album; + post(data); + }); +}; diff --git a/plugins/utils.js b/plugins/utils.js index 5ccf1839..51c117a3 100644 --- a/plugins/utils.js +++ b/plugins/utils.js @@ -1,75 +1,68 @@ -const fs = require("fs"); -const path = require("path"); +const fs = require('node:fs'); +const path = require('node:path'); -const { ipcMain, ipcRenderer } = require("electron"); +const { ipcMain, ipcRenderer } = require('electron'); // Creates a DOM element from a HTML string module.exports.ElementFromHtml = (html) => { - var template = document.createElement("template"); - html = html.trim(); // Never return a text node of whitespace as the result - template.innerHTML = html; - return template.content.firstChild; + const template = document.createElement('template'); + html = html.trim(); // Never return a text node of whitespace as the result + template.innerHTML = html; + return template.content.firstChild; }; // Creates a DOM element from a HTML file -module.exports.ElementFromFile = (filepath) => { - return module.exports.ElementFromHtml(fs.readFileSync(filepath, "utf8")); -}; +module.exports.ElementFromFile = (filepath) => module.exports.ElementFromHtml(fs.readFileSync(filepath, 'utf8')); -module.exports.templatePath = (pluginPath, name) => { - return path.join(pluginPath, "templates", name); -}; +module.exports.templatePath = (pluginPath, name) => path.join(pluginPath, 'templates', name); -module.exports.triggerAction = (channel, action, ...args) => { - return ipcRenderer.send(channel, action, ...args); -}; +module.exports.triggerAction = (channel, action, ...args) => ipcRenderer.send(channel, action, ...args); -module.exports.triggerActionSync = (channel, action, ...args) => { - return ipcRenderer.sendSync(channel, action, ...args); -}; +module.exports.triggerActionSync = (channel, action, ...args) => ipcRenderer.sendSync(channel, action, ...args); -module.exports.listenAction = (channel, callback) => { - return ipcMain.on(channel, callback); -}; +module.exports.listenAction = (channel, callback) => ipcMain.on(channel, callback); module.exports.fileExists = ( - path, - callbackIfExists, - callbackIfError = undefined + path, + callbackIfExists, + callbackIfError = undefined, ) => { - fs.access(path, fs.F_OK, (err) => { - if (err) { - if (callbackIfError) { - callbackIfError(); - } - return; - } + fs.access(path, fs.F_OK, (error) => { + if (error) { + if (callbackIfError) { + callbackIfError(); + } - callbackIfExists(); - }); + return; + } + + callbackIfExists(); + }); }; const cssToInject = new Map(); module.exports.injectCSS = (webContents, filepath, cb = undefined) => { - if (!cssToInject.size) setupCssInjection(webContents); + if (cssToInject.size === 0) { + setupCssInjection(webContents); + } - cssToInject.set(filepath, cb); + cssToInject.set(filepath, cb); }; const setupCssInjection = (webContents) => { - webContents.on("did-finish-load", () => { - cssToInject.forEach(async (cb, filepath) => { - await webContents.insertCSS(fs.readFileSync(filepath, "utf8")); - cb?.(); - }) - }); -} + webContents.on('did-finish-load', () => { + cssToInject.forEach(async (cb, filepath) => { + await webContents.insertCSS(fs.readFileSync(filepath, 'utf8')); + cb?.(); + }); + }); +}; module.exports.getAllPlugins = () => { - const isDirectory = (source) => fs.lstatSync(source).isDirectory(); - return fs - .readdirSync(__dirname) - .map((name) => path.join(__dirname, name)) - .filter(isDirectory) - .map((name) => path.basename(name)); + const isDirectory = (source) => fs.lstatSync(source).isDirectory(); + return fs + .readdirSync(__dirname) + .map((name) => path.join(__dirname, name)) + .filter(isDirectory) + .map((name) => path.basename(name)); }; diff --git a/plugins/video-toggle/back.js b/plugins/video-toggle/back.js index b57f0722..d6d0968f 100644 --- a/plugins/video-toggle/back.js +++ b/plugins/video-toggle/back.js @@ -1,10 +1,11 @@ -const { injectCSS } = require("../utils"); -const path = require("path"); +const path = require('node:path'); + +const { injectCSS } = require('../utils'); module.exports = (win, options) => { - if (options.forceHide) { - injectCSS(win.webContents, path.join(__dirname, "force-hide.css")); - } else if (!options.mode || options.mode === "custom") { - injectCSS(win.webContents, path.join(__dirname, "button-switcher.css")); - } + if (options.forceHide) { + injectCSS(win.webContents, path.join(__dirname, 'force-hide.css')); + } else if (!options.mode || options.mode === 'custom') { + injectCSS(win.webContents, path.join(__dirname, 'button-switcher.css')); + } }; diff --git a/plugins/video-toggle/button-switcher.css b/plugins/video-toggle/button-switcher.css index 3bae2fc6..92c052e2 100644 --- a/plugins/video-toggle/button-switcher.css +++ b/plugins/video-toggle/button-switcher.css @@ -1,86 +1,86 @@ #main-panel.ytmusic-player-page { - align-items: unset !important; + align-items: unset !important; } #main-panel { - position: relative; + position: relative; } .video-switch-button { - z-index: 999; - box-sizing: border-box; - padding: 0; - margin-top: 20px; - margin-left: 10px; - background: rgba(33, 33, 33, 0.4); - border-radius: 30px; - overflow: hidden; - width: 240px; - text-align: center; - font-size: 18px; - letter-spacing: 1px; - color: #fff; - padding-right: 120px; - position: absolute; + z-index: 999; + box-sizing: border-box; + padding: 0; + margin-top: 20px; + margin-left: 10px; + background: rgba(33, 33, 33, 0.4); + border-radius: 30px; + overflow: hidden; + width: 240px; + text-align: center; + font-size: 18px; + letter-spacing: 1px; + color: #fff; + padding-right: 120px; + position: absolute; } .video-switch-button:before { - content: "Video"; - position: absolute; - top: 0; - bottom: 0; - right: 0; - width: 120px; - display: flex; - align-items: center; - justify-content: center; - z-index: 3; - pointer-events: none; + content: "Video"; + position: absolute; + top: 0; + bottom: 0; + right: 0; + width: 120px; + display: flex; + align-items: center; + justify-content: center; + z-index: 3; + pointer-events: none; } .video-switch-button-checkbox { - cursor: pointer; - position: absolute; - top: 0; - left: 0; - bottom: 0; - width: 100%; - height: 100%; - opacity: 0; - z-index: 2; + cursor: pointer; + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 100%; + height: 100%; + opacity: 0; + z-index: 2; } .video-switch-button-label-span { - position: relative; + position: relative; } -.video-switch-button-checkbox:checked+.video-switch-button-label:before { - transform: translateX(120px); - transition: transform 300ms linear; +.video-switch-button-checkbox:checked + .video-switch-button-label:before { + transform: translateX(120px); + transition: transform 300ms linear; } -.video-switch-button-checkbox+.video-switch-button-label { - position: relative; - padding: 15px 0; - display: block; - user-select: none; - pointer-events: none; +.video-switch-button-checkbox + .video-switch-button-label { + position: relative; + padding: 15px 0; + display: block; + user-select: none; + pointer-events: none; } -.video-switch-button-checkbox+.video-switch-button-label:before { - content: ""; - background: rgba(60, 60, 60, 0.4); - height: 100%; - width: 100%; - position: absolute; - left: 0; - top: 0; - border-radius: 30px; - transform: translateX(0); - transition: transform 300ms; +.video-switch-button-checkbox + .video-switch-button-label:before { + content: ""; + background: rgba(60, 60, 60, 0.4); + height: 100%; + width: 100%; + position: absolute; + left: 0; + top: 0; + border-radius: 30px; + transform: translateX(0); + transition: transform 300ms; } /* disable the native toggler */ #av-id { - display: none; + display: none; } diff --git a/plugins/video-toggle/force-hide.css b/plugins/video-toggle/force-hide.css index b65f0c69..36f47f08 100644 --- a/plugins/video-toggle/force-hide.css +++ b/plugins/video-toggle/force-hide.css @@ -1,11 +1,11 @@ /* Hide the video player */ #main-panel { - display: none !important; + display: none !important; } /* Make the side-panel full width */ .side-panel.ytmusic-player-page { - max-width: 100% !important; - width: 100% !important; - margin: 0 !important; + max-width: 100% !important; + width: 100% !important; + margin: 0 !important; } diff --git a/plugins/video-toggle/front.js b/plugins/video-toggle/front.js index 31c1b8f3..c36d0015 100644 --- a/plugins/video-toggle/front.js +++ b/plugins/video-toggle/front.js @@ -1,142 +1,160 @@ -const { ElementFromFile, templatePath } = require("../utils"); +const { ElementFromFile, templatePath } = require('../utils'); +const { setOptions, isEnabled } = require('../../config/plugins'); -const { setOptions, isEnabled } = require("../../config/plugins"); +const moveVolumeHud = isEnabled('precise-volume') ? require('../precise-volume/front').moveVolumeHud : () => { +}; -const moveVolumeHud = isEnabled("precise-volume") ? require("../precise-volume/front").moveVolumeHud : ()=>{}; +function $(selector) { + return document.querySelector(selector); +} -function $(selector) { return document.querySelector(selector); } - -let options, player, video, api; +let options; +let player; +let video; +let api; const switchButtonDiv = ElementFromFile( - templatePath(__dirname, "button_template.html") + templatePath(__dirname, 'button_template.html'), ); module.exports = (_options) => { - if (_options.forceHide) return; - switch (_options.mode) { - case "native": { - $("ytmusic-player-page").setAttribute("has-av-switcher"); - $("ytmusic-player").setAttribute("has-av-switcher"); - return; - } - case "disabled": { - $("ytmusic-player-page").removeAttribute("has-av-switcher"); - $("ytmusic-player").removeAttribute("has-av-switcher"); - return; - } - default: - case "custom": { - options = _options; - document.addEventListener("apiLoaded", setup, { once: true, passive: true }); - } + if (_options.forceHide) { + return; + } + + switch (_options.mode) { + case 'native': { + $('ytmusic-player-page').setAttribute('has-av-switcher'); + $('ytmusic-player').setAttribute('has-av-switcher'); + return; } + + case 'disabled': { + $('ytmusic-player-page').removeAttribute('has-av-switcher'); + $('ytmusic-player').removeAttribute('has-av-switcher'); + return; + } + + default: + case 'custom': { + options = _options; + document.addEventListener('apiLoaded', setup, { once: true, passive: true }); + } + } }; function setup(e) { - api = e.detail; - player = $('ytmusic-player'); - video = $('video'); + api = e.detail; + player = $('ytmusic-player'); + video = $('video'); - $('#main-panel').append(switchButtonDiv); + $('#main-panel').append(switchButtonDiv); - if (options.hideVideo) { - $('.video-switch-button-checkbox').checked = false; - changeDisplay(false); - forcePlaybackMode(); - // fix black video - video.style.height = "auto"; + if (options.hideVideo) { + $('.video-switch-button-checkbox').checked = false; + changeDisplay(false); + forcePlaybackMode(); + // Fix black video + video.style.height = 'auto'; + } + + // Button checked = show video + switchButtonDiv.addEventListener('change', (e) => { + options.hideVideo = !e.target.checked; + changeDisplay(e.target.checked); + setOptions('video-toggle', options); + }); + + video.addEventListener('srcChanged', videoStarted); + + observeThumbnail(); + + switch (options.align) { + case 'right': { + switchButtonDiv.style.left = 'calc(100% - 240px)'; + return; } - // button checked = show video - switchButtonDiv.addEventListener('change', (e) => { - options.hideVideo = !e.target.checked; - changeDisplay(e.target.checked); - setOptions("video-toggle", options); - }) - - video.addEventListener('srcChanged', videoStarted); - - observeThumbnail(); - - switch (options.align) { - case "right": { - switchButtonDiv.style.left = "calc(100% - 240px)"; - return; - } - case "middle": { - switchButtonDiv.style.left = "calc(50% - 120px)"; - return; - } - default: - case "left": { - switchButtonDiv.style.left = "0px"; - } + case 'middle': { + switchButtonDiv.style.left = 'calc(50% - 120px)'; + return; } + + default: + case 'left': { + switchButtonDiv.style.left = '0px'; + } + } } function changeDisplay(showVideo) { - player.style.margin = showVideo ? '' : 'auto 0px'; - player.setAttribute('playback-mode', showVideo ? 'OMV_PREFERRED' : 'ATV_PREFERRED'); + player.style.margin = showVideo ? '' : 'auto 0px'; + player.setAttribute('playback-mode', showVideo ? 'OMV_PREFERRED' : 'ATV_PREFERRED'); - $('#song-video.ytmusic-player').style.display = showVideo ? 'block' : 'none'; - $('#song-image').style.display = showVideo ? 'none' : 'block'; + $('#song-video.ytmusic-player').style.display = showVideo ? 'block' : 'none'; + $('#song-image').style.display = showVideo ? 'none' : 'block'; - if (showVideo && !video.style.top) { - video.style.top = `${(player.clientHeight - video.clientHeight) / 2}px`; - } - moveVolumeHud(showVideo); + if (showVideo && !video.style.top) { + video.style.top = `${(player.clientHeight - video.clientHeight) / 2}px`; + } + + moveVolumeHud(showVideo); } function videoStarted() { - if (api.getPlayerResponse().videoDetails.musicVideoType !== 'MUSIC_VIDEO_TYPE_ATV') { - // switch to high res thumbnail - forceThumbnail($('#song-image img')); - // show toggle button - switchButtonDiv.style.display = "initial"; - // change display to video mode if video exist & video is hidden & option.hideVideo = false - if (!options.hideVideo && $('#song-video.ytmusic-player').style.display === "none") { - changeDisplay(true); - } else { - moveVolumeHud(!options.hideVideo); - } + if (api.getPlayerResponse().videoDetails.musicVideoType === 'MUSIC_VIDEO_TYPE_ATV') { + // Video doesn't exist -> switch to song mode + changeDisplay(false); + // Hide toggle button + switchButtonDiv.style.display = 'none'; + } else { + // Switch to high res thumbnail + forceThumbnail($('#song-image img')); + // Show toggle button + switchButtonDiv.style.display = 'initial'; + // Change display to video mode if video exist & video is hidden & option.hideVideo = false + if (!options.hideVideo && $('#song-video.ytmusic-player').style.display === 'none') { + changeDisplay(true); } else { - // video doesn't exist -> switch to song mode - changeDisplay(false); - // hide toggle button - switchButtonDiv.style.display = "none"; + moveVolumeHud(!options.hideVideo); } + } } -// on load, after a delay, the page overrides the playback-mode to 'OMV_PREFERRED' which causes weird aspect ratio in the image container +// On load, after a delay, the page overrides the playback-mode to 'OMV_PREFERRED' which causes weird aspect ratio in the image container // this function fix the problem by overriding that override :) function forcePlaybackMode() { - const playbackModeObserver = new MutationObserver(mutations => { - mutations.forEach(mutation => { - if (mutation.target.getAttribute('playback-mode') !== "ATV_PREFERRED") { - playbackModeObserver.disconnect(); - mutation.target.setAttribute('playback-mode', "ATV_PREFERRED"); - } - }); - }); - playbackModeObserver.observe(player, { attributeFilter: ["playback-mode"] }); + const playbackModeObserver = new MutationObserver((mutations) => { + for (const mutation of mutations) { + if (mutation.target.getAttribute('playback-mode') !== 'ATV_PREFERRED') { + playbackModeObserver.disconnect(); + mutation.target.setAttribute('playback-mode', 'ATV_PREFERRED'); + } + } + }); + playbackModeObserver.observe(player, { attributeFilter: ['playback-mode'] }); } function observeThumbnail() { - const playbackModeObserver = new MutationObserver(mutations => { - if (!player.videoMode_) return; + const playbackModeObserver = new MutationObserver((mutations) => { + if (!player.videoMode_) { + return; + } - mutations.forEach(mutation => { - if (!mutation.target.src.startsWith('data:')) return; - forceThumbnail(mutation.target) - }); - }); - playbackModeObserver.observe($('#song-image img'), { attributeFilter: ["src"] }) + for (const mutation of mutations) { + if (!mutation.target.src.startsWith('data:')) { + continue; + } + + forceThumbnail(mutation.target); + } + }); + playbackModeObserver.observe($('#song-image img'), { attributeFilter: ['src'] }); } function forceThumbnail(img) { - const thumbnails = $('#movie_player').getPlayerResponse()?.videoDetails?.thumbnail?.thumbnails; - if (thumbnails && thumbnails.length > 0) { - img.src = thumbnails[thumbnails.length - 1].url.split("?")[0]; - } + const thumbnails = $('#movie_player').getPlayerResponse()?.videoDetails?.thumbnail?.thumbnails; + if (thumbnails && thumbnails.length > 0) { + img.src = thumbnails.at(-1).url.split('?')[0]; + } } diff --git a/plugins/video-toggle/menu.js b/plugins/video-toggle/menu.js index 059aa963..76703796 100644 --- a/plugins/video-toggle/menu.js +++ b/plugins/video-toggle/menu.js @@ -1,77 +1,77 @@ -const { setMenuOptions } = require("../../config/plugins"); +const { setMenuOptions } = require('../../config/plugins'); module.exports = (win, options) => [ - { - label: "Mode", - submenu: [ - { - label: "Custom toggle", - type: "radio", - checked: options.mode === 'custom', - click: () => { - options.mode = 'custom'; - setMenuOptions("video-toggle", options); - } - }, - { - label: "Native toggle", - type: "radio", - checked: options.mode === 'native', - click: () => { - options.mode = 'native'; - setMenuOptions("video-toggle", options); - } - }, - { - label: "Disabled", - type: "radio", - checked: options.mode === 'disabled', - click: () => { - options.mode = 'disabled'; - setMenuOptions("video-toggle", options); - } - }, - ] + { + label: 'Mode', + submenu: [ + { + label: 'Custom toggle', + type: 'radio', + checked: options.mode === 'custom', + click() { + options.mode = 'custom'; + setMenuOptions('video-toggle', options); + }, + }, + { + label: 'Native toggle', + type: 'radio', + checked: options.mode === 'native', + click() { + options.mode = 'native'; + setMenuOptions('video-toggle', options); + }, + }, + { + label: 'Disabled', + type: 'radio', + checked: options.mode === 'disabled', + click() { + options.mode = 'disabled'; + setMenuOptions('video-toggle', options); + }, + }, + ], + }, + { + label: 'Alignment', + submenu: [ + { + label: 'Left', + type: 'radio', + checked: options.align === 'left', + click() { + options.align = 'left'; + setMenuOptions('video-toggle', options); + }, + }, + { + label: 'Middle', + type: 'radio', + checked: options.align === 'middle', + click() { + options.align = 'middle'; + setMenuOptions('video-toggle', options); + }, + }, + { + label: 'Right', + type: 'radio', + checked: options.align === 'right', + click() { + options.align = 'right'; + setMenuOptions('video-toggle', options); + }, + }, + ], + }, + { + label: 'Force Remove Video Tab', + type: 'checkbox', + checked: options.forceHide, + click(item) { + options.forceHide = item.checked; + setMenuOptions('video-toggle', options); }, - { - label: "Alignment", - submenu: [ - { - label: "Left", - type: "radio", - checked: options.align === 'left', - click: () => { - options.align = 'left'; - setMenuOptions("video-toggle", options); - } - }, - { - label: "Middle", - type: "radio", - checked: options.align === 'middle', - click: () => { - options.align = 'middle'; - setMenuOptions("video-toggle", options); - } - }, - { - label: "Right", - type: "radio", - checked: options.align === 'right', - click: () => { - options.align = 'right'; - setMenuOptions("video-toggle", options); - } - }, - ] - }, - { - label: "Force Remove Video Tab", - type: "checkbox", - checked: options.forceHide, - click: item => { - options.forceHide = item.checked; - setMenuOptions("video-toggle", options); - } - } + }, ]; diff --git a/plugins/video-toggle/templates/button_template.html b/plugins/video-toggle/templates/button_template.html index 9f22bbf5..5b86cd75 100644 --- a/plugins/video-toggle/templates/button_template.html +++ b/plugins/video-toggle/templates/button_template.html @@ -1,4 +1,4 @@
- - + +
diff --git a/plugins/visualizer/back.js b/plugins/visualizer/back.js index b0f8c42b..3ec1a80e 100644 --- a/plugins/visualizer/back.js +++ b/plugins/visualizer/back.js @@ -1,6 +1,7 @@ -const { injectCSS } = require("../utils"); -const path = require("path"); +const path = require('node:path'); + +const { injectCSS } = require('../utils'); module.exports = (win, options) => { - injectCSS(win.webContents, path.join(__dirname, "empty-player.css")); + injectCSS(win.webContents, path.join(__dirname, 'empty-player.css')); }; diff --git a/plugins/visualizer/empty-player.css b/plugins/visualizer/empty-player.css index dc94788a..15b4043b 100644 --- a/plugins/visualizer/empty-player.css +++ b/plugins/visualizer/empty-player.css @@ -1,9 +1,9 @@ #player { - margin: 0 !important; - background: black; + margin: 0 !important; + background: black; } #song-image, #song-video { - display: none !important; + display: none !important; } diff --git a/plugins/visualizer/front.js b/plugins/visualizer/front.js index 47522422..67194dea 100644 --- a/plugins/visualizer/front.js +++ b/plugins/visualizer/front.js @@ -1,61 +1,63 @@ -const defaultConfig = require("../../config/defaults"); +const defaultConfig = require('../../config/defaults'); module.exports = (options) => { - const optionsWithDefaults = { - ...defaultConfig.plugins.visualizer, - ...options, - }; - const VisualizerType = require(`./visualizers/${optionsWithDefaults.type}`); + const optionsWithDefaults = { + ...defaultConfig.plugins.visualizer, + ...options, + }; + const VisualizerType = require(`./visualizers/${optionsWithDefaults.type}`); - document.addEventListener( - "audioCanPlay", - (e) => { - const video = document.querySelector("video"); - const visualizerContainer = document.querySelector("#player"); + document.addEventListener( + 'audioCanPlay', + (e) => { + const video = document.querySelector('video'); + const visualizerContainer = document.querySelector('#player'); - let canvas = document.getElementById("visualizer"); - if (!canvas) { - canvas = document.createElement("canvas"); - canvas.id = "visualizer"; - canvas.style.position = "absolute"; - canvas.style.background = "black"; - visualizerContainer.append(canvas); - } + let canvas = document.querySelector('#visualizer'); + if (!canvas) { + canvas = document.createElement('canvas'); + canvas.id = 'visualizer'; + canvas.style.position = 'absolute'; + canvas.style.background = 'black'; + visualizerContainer.append(canvas); + } - const resizeCanvas = () => { - canvas.width = visualizerContainer.clientWidth; - canvas.height = visualizerContainer.clientHeight; - }; - resizeCanvas(); + const resizeCanvas = () => { + canvas.width = visualizerContainer.clientWidth; + canvas.height = visualizerContainer.clientHeight; + }; - const gainNode = e.detail.audioContext.createGain(); - gainNode.gain.value = 1.25; - e.detail.audioSource.connect(gainNode); + resizeCanvas(); - const visualizer = new VisualizerType( - e.detail.audioContext, - e.detail.audioSource, - visualizerContainer, - canvas, - gainNode, - video.captureStream(), - optionsWithDefaults[optionsWithDefaults.type] - ); + const gainNode = e.detail.audioContext.createGain(); + gainNode.gain.value = 1.25; + e.detail.audioSource.connect(gainNode); - const resizeVisualizer = (width, height) => { - resizeCanvas(); - visualizer.resize(width, height); - }; - resizeVisualizer(canvas.width, canvas.height); - const visualizerContainerObserver = new ResizeObserver((entries) => { - entries.forEach((entry) => { - resizeVisualizer(entry.contentRect.width, entry.contentRect.height); - }); - }); - visualizerContainerObserver.observe(visualizerContainer); + const visualizer = new VisualizerType( + e.detail.audioContext, + e.detail.audioSource, + visualizerContainer, + canvas, + gainNode, + video.captureStream(), + optionsWithDefaults[optionsWithDefaults.type], + ); - visualizer.render(); - }, - { passive: true } - ); + const resizeVisualizer = (width, height) => { + resizeCanvas(); + visualizer.resize(width, height); + }; + + resizeVisualizer(canvas.width, canvas.height); + const visualizerContainerObserver = new ResizeObserver((entries) => { + for (const entry of entries) { + resizeVisualizer(entry.contentRect.width, entry.contentRect.height); + } + }); + visualizerContainerObserver.observe(visualizerContainer); + + visualizer.render(); + }, + { passive: true }, + ); }; diff --git a/plugins/visualizer/menu.js b/plugins/visualizer/menu.js index 181a71e7..310332f3 100644 --- a/plugins/visualizer/menu.js +++ b/plugins/visualizer/menu.js @@ -1,23 +1,23 @@ -const { readdirSync } = require("fs"); -const path = require("path"); +const { readdirSync } = require('node:fs'); +const path = require('node:path'); -const { setMenuOptions } = require("../../config/plugins"); +const { setMenuOptions } = require('../../config/plugins'); -const visualizerTypes = readdirSync(path.join(__dirname, "visualizers")).map( - (filename) => path.parse(filename).name +const visualizerTypes = readdirSync(path.join(__dirname, 'visualizers')).map( + (filename) => path.parse(filename).name, ); module.exports = (win, options) => [ - { - label: "Type", - submenu: visualizerTypes.map((visualizerType) => ({ - label: visualizerType, - type: "radio", - checked: options.type === visualizerType, - click: () => { - options.type = visualizerType; - setMenuOptions("visualizer", options); - }, - })), - }, + { + label: 'Type', + submenu: visualizerTypes.map((visualizerType) => ({ + label: visualizerType, + type: 'radio', + checked: options.type === visualizerType, + click() { + options.type = visualizerType; + setMenuOptions('visualizer', options); + }, + })), + }, ]; diff --git a/plugins/visualizer/visualizers/butterchurn.js b/plugins/visualizer/visualizers/butterchurn.js index 1c30355d..2c8b5a1f 100644 --- a/plugins/visualizer/visualizers/butterchurn.js +++ b/plugins/visualizer/visualizers/butterchurn.js @@ -1,46 +1,47 @@ -const butterchurn = require("butterchurn"); -const butterchurnPresets = require("butterchurn-presets"); +const butterchurn = require('butterchurn'); +const butterchurnPresets = require('butterchurn-presets'); const presets = butterchurnPresets.getPresets(); class ButterchurnVisualizer { - constructor( - audioContext, - audioSource, - visualizerContainer, - canvas, - audioNode, - stream, - options - ) { - this.visualizer = butterchurn.default.createVisualizer( - audioContext, - canvas, - { - width: canvas.width, - height: canvas.height, - } - ); + constructor( + audioContext, + audioSource, + visualizerContainer, + canvas, + audioNode, + stream, + options, + ) { + this.visualizer = butterchurn.default.createVisualizer( + audioContext, + canvas, + { + width: canvas.width, + height: canvas.height, + }, + ); - const preset = presets[options.preset]; - this.visualizer.loadPreset(preset, options.blendTimeInSeconds); + const preset = presets[options.preset]; + this.visualizer.loadPreset(preset, options.blendTimeInSeconds); - this.visualizer.connectAudio(audioNode); + this.visualizer.connectAudio(audioNode); - this.renderingFrequencyInMs = options.renderingFrequencyInMs; - } + this.renderingFrequencyInMs = options.renderingFrequencyInMs; + } - resize(width, height) { - this.visualizer.setRendererSize(width, height); - } + resize(width, height) { + this.visualizer.setRendererSize(width, height); + } - render() { - const renderVisualizer = () => { - requestAnimationFrame(() => renderVisualizer()); - this.visualizer.render(); - }; - setTimeout(renderVisualizer(), this.renderingFrequencyInMs); - } + render() { + const renderVisualizer = () => { + requestAnimationFrame(() => renderVisualizer()); + this.visualizer.render(); + }; + + setTimeout(renderVisualizer(), this.renderingFrequencyInMs); + } } module.exports = ButterchurnVisualizer; diff --git a/plugins/visualizer/visualizers/vudio.js b/plugins/visualizer/visualizers/vudio.js index 36cdf2a2..c2a04aca 100644 --- a/plugins/visualizer/visualizers/vudio.js +++ b/plugins/visualizer/visualizers/vudio.js @@ -1,33 +1,33 @@ -const Vudio = require("vudio/umd/vudio"); +const Vudio = require('vudio/umd/vudio'); class VudioVisualizer { - constructor( - audioContext, - audioSource, - visualizerContainer, - canvas, - audioNode, - stream, - options - ) { - this.visualizer = new Vudio(stream, canvas, { - width: canvas.width, - height: canvas.height, - // Visualizer config - ...options, - }); - } + constructor( + audioContext, + audioSource, + visualizerContainer, + canvas, + audioNode, + stream, + options, + ) { + this.visualizer = new Vudio(stream, canvas, { + width: canvas.width, + height: canvas.height, + // Visualizer config + ...options, + }); + } - resize(width, height) { - this.visualizer.setOption({ - width: width, - height: height, - }); - } + resize(width, height) { + this.visualizer.setOption({ + width, + height, + }); + } - render() { - this.visualizer.dance(); - } + render() { + this.visualizer.dance(); + } } module.exports = VudioVisualizer; diff --git a/plugins/visualizer/visualizers/wave.js b/plugins/visualizer/visualizers/wave.js index 70db7f2a..9088f7dd 100644 --- a/plugins/visualizer/visualizers/wave.js +++ b/plugins/visualizer/visualizers/wave.js @@ -1,31 +1,33 @@ -const { Wave } = require("@foobar404/wave"); +const { Wave } = require('@foobar404/wave'); class WaveVisualizer { - constructor( - audioContext, - audioSource, - visualizerContainer, - canvas, - audioNode, - stream, - options - ) { - this.visualizer = new Wave( - { context: audioContext, source: audioSource }, - canvas - ); - options.animations.forEach((animation) => { - this.visualizer.addAnimation( - eval(`new this.visualizer.animations.${animation.type}( + constructor( + audioContext, + audioSource, + visualizerContainer, + canvas, + audioNode, + stream, + options, + ) { + this.visualizer = new Wave( + { context: audioContext, source: audioSource }, + canvas, + ); + for (const animation of options.animations) { + this.visualizer.addAnimation( + eval(`new this.visualizer.animations.${animation.type}( ${JSON.stringify(animation.config)} - )`) - ); - }); - } + )`), + ); + } + } - resize(width, height) {} + resize(width, height) { + } - render() {} + render() { + } } module.exports = WaveVisualizer; diff --git a/preload.js b/preload.js index c91b0722..1c0100c3 100644 --- a/preload.js +++ b/preload.js @@ -1,11 +1,11 @@ -const config = require("./config"); -const { fileExists } = require("./plugins/utils"); -const setupSongInfo = require("./providers/song-info-front"); -const { setupSongControls } = require("./providers/song-controls-front"); -const { ipcRenderer } = require("electron"); -const is = require("electron-is"); +const { ipcRenderer } = require('electron'); +const is = require('electron-is'); -const { startingPages } = require("./providers/extracted-data"); +const config = require('./config'); +const { fileExists } = require('./plugins/utils'); +const setupSongInfo = require('./providers/song-info-front'); +const { setupSongControls } = require('./providers/song-controls-front'); +const { startingPages } = require('./providers/extracted-data'); const plugins = config.plugins.getEnabled(); @@ -14,148 +14,147 @@ const $ = document.querySelector.bind(document); let api; plugins.forEach(async ([plugin, options]) => { - const preloadPath = await ipcRenderer.invoke( - "getPath", - __dirname, - "plugins", - plugin, - "preload.js" - ); - fileExists(preloadPath, () => { - const run = require(preloadPath); - run(options); - }); + const preloadPath = await ipcRenderer.invoke( + 'getPath', + __dirname, + 'plugins', + plugin, + 'preload.js', + ); + fileExists(preloadPath, () => { + const run = require(preloadPath); + run(options); + }); - const actionPath = await ipcRenderer.invoke( - "getPath", - __dirname, - "plugins", - plugin, - "actions.js" - ); - fileExists(actionPath, () => { - const actions = require(actionPath).actions || {}; + const actionPath = await ipcRenderer.invoke( + 'getPath', + __dirname, + 'plugins', + plugin, + 'actions.js', + ); + fileExists(actionPath, () => { + const actions = require(actionPath).actions || {}; - // TODO: re-enable once contextIsolation is set to true - // contextBridge.exposeInMainWorld(plugin + "Actions", actions); - Object.keys(actions).forEach((actionName) => { - global[actionName] = actions[actionName]; - }); - }); + // TODO: re-enable once contextIsolation is set to true + // contextBridge.exposeInMainWorld(plugin + "Actions", actions); + for (const actionName of Object.keys(actions)) { + global[actionName] = actions[actionName]; + } + }); }); -document.addEventListener("DOMContentLoaded", () => { - plugins.forEach(async ([plugin, options]) => { - const pluginPath = await ipcRenderer.invoke( - "getPath", - __dirname, - "plugins", - plugin, - "front.js" - ); - fileExists(pluginPath, () => { - const run = require(pluginPath); - run(options); - }); - }); +document.addEventListener('DOMContentLoaded', () => { + plugins.forEach(async ([plugin, options]) => { + const pluginPath = await ipcRenderer.invoke( + 'getPath', + __dirname, + 'plugins', + plugin, + 'front.js', + ); + fileExists(pluginPath, () => { + const run = require(pluginPath); + run(options); + }); + }); - // wait for complete load of youtube api - listenForApiLoad(); + // Wait for complete load of youtube api + listenForApiLoad(); - // inject song-info provider - setupSongInfo(); + // Inject song-info provider + setupSongInfo(); - // inject song-controls - setupSongControls(); + // Inject song-controls + setupSongControls(); - // Add action for reloading - global.reload = () => ipcRenderer.send('reload'); + // Add action for reloading + global.reload = () => ipcRenderer.send('reload'); - // Blocks the "Are You Still There?" popup by setting the last active time to Date.now every 15min - setInterval(() => window._lact = Date.now(), 900000); + // Blocks the "Are You Still There?" popup by setting the last active time to Date.now every 15min + setInterval(() => window._lact = Date.now(), 900_000); - // setup back to front logger - if (is.dev()) { - ipcRenderer.on("log", (_event, log) => { - console.log(JSON.parse(log)); - }); - } + // Setup back to front logger + if (is.dev()) { + ipcRenderer.on('log', (_event, log) => { + console.log(JSON.parse(log)); + }); + } }); function listenForApiLoad() { - api = $('#movie_player'); - if (api) { - onApiLoaded(); - return; - } + api = $('#movie_player'); + if (api) { + onApiLoaded(); + return; + } - const observer = new MutationObserver(() => { - api = $('#movie_player'); - if (api) { - observer.disconnect(); - onApiLoaded(); - } - }) + const observer = new MutationObserver(() => { + api = $('#movie_player'); + if (api) { + observer.disconnect(); + onApiLoaded(); + } + }); - observer.observe(document.documentElement, { childList: true, subtree: true }); + observer.observe(document.documentElement, { childList: true, subtree: true }); } function onApiLoaded() { - const video = $("video"); - const audioContext = new AudioContext(); - const audioSource = audioContext.createMediaElementSource(video); - audioSource.connect(audioContext.destination); + const video = $('video'); + const audioContext = new AudioContext(); + const audioSource = audioContext.createMediaElementSource(video); + audioSource.connect(audioContext.destination); - video.addEventListener( - "loadstart", - () => { - // Emit "audioCanPlay" for each video - video.addEventListener( - "canplaythrough", - () => { - document.dispatchEvent( - new CustomEvent("audioCanPlay", { - detail: { - audioContext: audioContext, - audioSource: audioSource, - }, - }) - ); - }, - { once: true } - ); - }, - { passive: true } - ); + video.addEventListener( + 'loadstart', + () => { + // Emit "audioCanPlay" for each video + video.addEventListener( + 'canplaythrough', + () => { + document.dispatchEvent( + new CustomEvent('audioCanPlay', { + detail: { + audioContext, + audioSource, + }, + }), + ); + }, + { once: true }, + ); + }, + { passive: true }, + ); - document.dispatchEvent(new CustomEvent('apiLoaded', { detail: api })); - ipcRenderer.send('apiLoaded'); + document.dispatchEvent(new CustomEvent('apiLoaded', { detail: api })); + ipcRenderer.send('apiLoaded'); - // Navigate to "Starting page" - const startingPage = config.get("options.startingPage"); - if (startingPage && startingPages[startingPage]) { - $('ytmusic-app')?.navigate_(startingPages[startingPage]); - } + // Navigate to "Starting page" + const startingPage = config.get('options.startingPage'); + if (startingPage && startingPages[startingPage]) { + $('ytmusic-app')?.navigate_(startingPages[startingPage]); + } - // Remove upgrade button - if (config.get("options.removeUpgradeButton")) { - const upgradeButton = $('ytmusic-pivot-bar-item-renderer[tab-id="SPunlimited"]') - if (upgradeButton) { - upgradeButton.style.display = "none"; - } - } + // Remove upgrade button + if (config.get('options.removeUpgradeButton')) { + const upgradeButton = $('ytmusic-pivot-bar-item-renderer[tab-id="SPunlimited"]'); + if (upgradeButton) { + upgradeButton.style.display = 'none'; + } + } - - // Hide / Force show like buttons - const likeButtonsOptions = config.get("options.likeButtons"); - if (likeButtonsOptions) { - const likeButtons = $("ytmusic-like-button-renderer"); - if (likeButtons) { - likeButtons.style.display = - { - hide: "none", - force: "inherit", - }[likeButtonsOptions] || ""; - } - } + // Hide / Force show like buttons + const likeButtonsOptions = config.get('options.likeButtons'); + if (likeButtonsOptions) { + const likeButtons = $('ytmusic-like-button-renderer'); + if (likeButtons) { + likeButtons.style.display + = { + hide: 'none', + force: 'inherit', + }[likeButtonsOptions] || ''; + } + } } diff --git a/providers/app-controls.js b/providers/app-controls.js index bed99157..2726ef47 100644 --- a/providers/app-controls.js +++ b/providers/app-controls.js @@ -1,34 +1,35 @@ -const path = require("path"); +const path = require('node:path'); -const { app, BrowserWindow, ipcMain, ipcRenderer } = require("electron"); -const config = require("../config"); +const { app, BrowserWindow, ipcMain, ipcRenderer } = require('electron'); + +const config = require('../config'); module.exports.restart = () => { process.type === 'browser' ? restart() : ipcRenderer.send('restart'); }; module.exports.setupAppControls = () => { - ipcMain.on('restart', restart); - ipcMain.handle('getDownloadsFolder', () => app.getPath("downloads")); - ipcMain.on('reload', () => BrowserWindow.getFocusedWindow().webContents.loadURL(config.get("url"))); - ipcMain.handle('getPath', (_, ...args) => path.join(...args)); -} + ipcMain.on('restart', restart); + ipcMain.handle('getDownloadsFolder', () => app.getPath('downloads')); + ipcMain.on('reload', () => BrowserWindow.getFocusedWindow().webContents.loadURL(config.get('url'))); + ipcMain.handle('getPath', (_, ...args) => path.join(...args)); +}; function restart() { - app.relaunch({ execPath: process.env.PORTABLE_EXECUTABLE_FILE }); - // execPath will be undefined if not running portable app, resulting in default behavior - app.quit(); + app.relaunch({ execPath: process.env.PORTABLE_EXECUTABLE_FILE }); + // ExecPath will be undefined if not running portable app, resulting in default behavior + app.quit(); } function sendToFront(channel, ...args) { - BrowserWindow.getAllWindows().forEach(win => { - win.webContents.send(channel, ...args); - }); + for (const win of BrowserWindow.getAllWindows()) { + win.webContents.send(channel, ...args); + } } -module.exports.sendToFront = - process.type === 'browser' - ? sendToFront - : () => { - console.error('sendToFront called from renderer'); - }; +module.exports.sendToFront + = process.type === 'browser' + ? sendToFront + : () => { + console.error('sendToFront called from renderer'); + }; diff --git a/providers/decorators.js b/providers/decorators.js index 63ba22cb..8ed24c0f 100644 --- a/providers/decorators.js +++ b/providers/decorators.js @@ -1,10 +1,10 @@ module.exports = { - singleton, - debounce, - cache, - throttle, - memoize, - retry, + singleton, + debounce, + cache, + throttle, + memoize, + retry, }; /** @@ -13,12 +13,15 @@ module.exports = { * @returns {T} */ function singleton(fn) { - let called = false; - return (...args) => { - if (called) return; - called = true; - return fn(...args); - }; + let called = false; + return (...args) => { + if (called) { + return; + } + + called = true; + return fn(...args); + }; } /** @@ -28,11 +31,11 @@ function singleton(fn) { * @returns {T} */ function debounce(fn, delay) { - let timeout; - return (...args) => { - clearTimeout(timeout); - timeout = setTimeout(() => fn(...args), delay); - }; + let timeout; + return (...args) => { + clearTimeout(timeout); + timeout = setTimeout(() => fn(...args), delay); + }; } /** @@ -41,22 +44,23 @@ function debounce(fn, delay) { * @returns {T} */ function cache(fn) { - let lastArgs; - let lastResult; - return (...args) => { - if ( - args.length !== lastArgs?.length || - args.some((arg, i) => arg !== lastArgs[i]) - ) { - lastArgs = args; - lastResult = fn(...args); - } - return lastResult; - }; + let lastArgs; + let lastResult; + return (...args) => { + if ( + args.length !== lastArgs?.length + || args.some((arg, i) => arg !== lastArgs[i]) + ) { + lastArgs = args; + lastResult = fn(...args); + } + + return lastResult; + }; } /* - the following are currently unused, but potentially useful in the future + The following are currently unused, but potentially useful in the future */ /** @@ -66,14 +70,17 @@ function cache(fn) { * @returns {T} */ function throttle(fn, delay) { - let timeout; - return (...args) => { - if (timeout) return; - timeout = setTimeout(() => { - timeout = undefined; - fn(...args); - }, delay); - }; + let timeout; + return (...args) => { + if (timeout) { + return; + } + + timeout = setTimeout(() => { + timeout = undefined; + fn(...args); + }, delay); + }; } /** @@ -82,14 +89,15 @@ function throttle(fn, delay) { * @returns {T} */ function memoize(fn) { - const cache = new Map(); - return (...args) => { - const key = JSON.stringify(args); - if (!cache.has(key)) { - cache.set(key, fn(...args)); - } - return cache.get(key); - }; + const cache = new Map(); + return (...args) => { + const key = JSON.stringify(args); + if (!cache.has(key)) { + cache.set(key, fn(...args)); + } + + return cache.get(key); + }; } /** @@ -98,16 +106,16 @@ function memoize(fn) { * @returns {T} */ function retry(fn, { retries = 3, delay = 1000 } = {}) { - return (...args) => { - try { - return fn(...args); - } catch (e) { - if (retries > 0) { - retries--; - setTimeout(() => retry(fn, { retries, delay })(...args), delay); - } else { - throw e; - } - } - }; + return (...args) => { + try { + return fn(...args); + } catch (error) { + if (retries > 0) { + retries--; + setTimeout(() => retry(fn, { retries, delay })(...args), delay); + } else { + throw error; + } + } + }; } diff --git a/providers/dom-elements.js b/providers/dom-elements.js index 1750d4d7..b3b4bed4 100644 --- a/providers/dom-elements.js +++ b/providers/dom-elements.js @@ -1,4 +1,4 @@ const getSongMenu = () => - document.querySelector("ytmusic-menu-popup-renderer tp-yt-paper-listbox"); + document.querySelector('ytmusic-menu-popup-renderer tp-yt-paper-listbox'); module.exports = { getSongMenu }; diff --git a/providers/extracted-data.js b/providers/extracted-data.js index a7020a0d..d852a8cb 100644 --- a/providers/extracted-data.js +++ b/providers/extracted-data.js @@ -1,23 +1,23 @@ const startingPages = { - Default: '', - Home: 'FEmusic_home', - Explore: 'FEmusic_explore', - 'New Releases': 'FEmusic_new_releases', - Charts: 'FEmusic_charts', - 'Moods & Genres': 'FEmusic_moods_and_genres', - Library: 'FEmusic_library_landing', - Playlists: 'FEmusic_liked_playlists', - Songs: 'FEmusic_liked_videos', - Albums: 'FEmusic_liked_albums', - Artists: 'FEmusic_library_corpus_track_artists', - 'Subscribed Artists': 'FEmusic_library_corpus_artists', - Uploads: 'FEmusic_library_privately_owned_landing', - 'Uploaded Playlists': 'FEmusic_liked_playlists', - 'Uploaded Songs': 'FEmusic_library_privately_owned_tracks', - 'Uploaded Albums': 'FEmusic_library_privately_owned_releases', - 'Uploaded Artists': 'FEmusic_library_privately_owned_artists', + 'Default': '', + 'Home': 'FEmusic_home', + 'Explore': 'FEmusic_explore', + 'New Releases': 'FEmusic_new_releases', + 'Charts': 'FEmusic_charts', + 'Moods & Genres': 'FEmusic_moods_and_genres', + 'Library': 'FEmusic_library_landing', + 'Playlists': 'FEmusic_liked_playlists', + 'Songs': 'FEmusic_liked_videos', + 'Albums': 'FEmusic_liked_albums', + 'Artists': 'FEmusic_library_corpus_track_artists', + 'Subscribed Artists': 'FEmusic_library_corpus_artists', + 'Uploads': 'FEmusic_library_privately_owned_landing', + 'Uploaded Playlists': 'FEmusic_liked_playlists', + 'Uploaded Songs': 'FEmusic_library_privately_owned_tracks', + 'Uploaded Albums': 'FEmusic_library_privately_owned_releases', + 'Uploaded Artists': 'FEmusic_library_privately_owned_artists', }; module.exports = { - startingPages, + startingPages, }; diff --git a/providers/prompt-custom-titlebar.js b/providers/prompt-custom-titlebar.js index 222a6bd6..852013a8 100644 --- a/providers/prompt-custom-titlebar.js +++ b/providers/prompt-custom-titlebar.js @@ -1,14 +1,14 @@ -const { Titlebar, Color } = require("custom-electron-titlebar"); +const { Titlebar, Color } = require('custom-electron-titlebar'); module.exports = () => { - new Titlebar({ - backgroundColor: Color.fromHex("#050505"), - minimizable: false, - maximizable: false, - menu: null - }); - const mainStyle = document.querySelector("#container").style; - mainStyle.width = "100%"; - mainStyle.position = "fixed"; - mainStyle.border = "unset"; + new Titlebar({ + backgroundColor: Color.fromHex('#050505'), + minimizable: false, + maximizable: false, + menu: null, + }); + const mainStyle = document.querySelector('#container').style; + mainStyle.width = '100%'; + mainStyle.position = 'fixed'; + mainStyle.border = 'unset'; }; diff --git a/providers/prompt-options.js b/providers/prompt-options.js index a34d3b1c..a86e7c73 100644 --- a/providers/prompt-options.js +++ b/providers/prompt-options.js @@ -1,18 +1,20 @@ -const path = require("path"); -const is = require("electron-is"); -const { isEnabled } = require("../config/plugins"); +const path = require('node:path'); -const iconPath = path.join(__dirname, "..", "assets", "youtube-music-tray.png"); -const customTitlebarPath = path.join(__dirname, "prompt-custom-titlebar.js"); +const is = require('electron-is'); -const promptOptions = !is.macOS() && isEnabled("in-app-menu") ? { - customStylesheet: "dark", - // The following are used for custom titlebar - frame: false, - customScript: customTitlebarPath, +const { isEnabled } = require('../config/plugins'); + +const iconPath = path.join(__dirname, '..', 'assets', 'youtube-music-tray.png'); +const customTitlebarPath = path.join(__dirname, 'prompt-custom-titlebar.js'); + +const promptOptions = !is.macOS() && isEnabled('in-app-menu') ? { + customStylesheet: 'dark', + // The following are used for custom titlebar + frame: false, + customScript: customTitlebarPath, } : { - customStylesheet: "dark", - icon: iconPath + customStylesheet: 'dark', + icon: iconPath, }; module.exports = () => promptOptions; diff --git a/providers/protocol-handler.js b/providers/protocol-handler.js index 6b0d36e1..08a8ef29 100644 --- a/providers/protocol-handler.js +++ b/providers/protocol-handler.js @@ -1,44 +1,45 @@ -const { app } = require("electron"); -const path = require("path"); -const getSongControls = require("./song-controls"); +const path = require('node:path'); -const APP_PROTOCOL = "youtubemusic"; +const { app } = require('electron'); + +const getSongControls = require('./song-controls'); + +const APP_PROTOCOL = 'youtubemusic'; let protocolHandler; function setupProtocolHandler(win) { - if (process.defaultApp && process.argv.length >= 2) { - app.setAsDefaultProtocolClient( - APP_PROTOCOL, - process.execPath, - [path.resolve(process.argv[1])] - ); - } else { - app.setAsDefaultProtocolClient(APP_PROTOCOL) - } + if (process.defaultApp && process.argv.length >= 2) { + app.setAsDefaultProtocolClient( + APP_PROTOCOL, + process.execPath, + [path.resolve(process.argv[1])], + ); + } else { + app.setAsDefaultProtocolClient(APP_PROTOCOL); + } - const songControls = getSongControls(win); + const songControls = getSongControls(win); - protocolHandler = (cmd) => { - if (Object.keys(songControls).includes(cmd)) { - songControls[cmd](); - } - } + protocolHandler = (cmd) => { + if (Object.keys(songControls).includes(cmd)) { + songControls[cmd](); + } + }; } function handleProtocol(cmd) { - protocolHandler(cmd); + protocolHandler(cmd); } function changeProtocolHandler(f) { - protocolHandler = f; + protocolHandler = f; } module.exports = { - APP_PROTOCOL, - setupProtocolHandler, - handleProtocol, - changeProtocolHandler, + APP_PROTOCOL, + setupProtocolHandler, + handleProtocol, + changeProtocolHandler, }; - diff --git a/providers/song-controls-front.js b/providers/song-controls-front.js index 4bc33274..80901188 100644 --- a/providers/song-controls-front.js +++ b/providers/song-controls-front.js @@ -1,8 +1,8 @@ -const { ipcRenderer } = require("electron"); +const { ipcRenderer } = require('electron'); module.exports.setupSongControls = () => { - document.addEventListener('apiLoaded', e => { - ipcRenderer.on("seekTo", (_, t) => e.detail.seekTo(t)); - ipcRenderer.on("seekBy", (_, t) => e.detail.seekBy(t)); - }, { once: true, passive: true }) + document.addEventListener('apiLoaded', (e) => { + ipcRenderer.on('seekTo', (_, t) => e.detail.seekTo(t)); + ipcRenderer.on('seekBy', (_, t) => e.detail.seekBy(t)); + }, { once: true, passive: true }); }; diff --git a/providers/song-controls.js b/providers/song-controls.js index 93f352d1..e881a186 100644 --- a/providers/song-controls.js +++ b/providers/song-controls.js @@ -1,57 +1,59 @@ // This is used for to control the songs const pressKey = (window, key, modifiers = []) => { - window.webContents.sendInputEvent({ - type: "keydown", - modifiers, - keyCode: key, - }); + window.webContents.sendInputEvent({ + type: 'keydown', + modifiers, + keyCode: key, + }); }; module.exports = (win) => { - const commands = { - // Playback - previous: () => pressKey(win, "k"), - next: () => pressKey(win, "j"), - playPause: () => pressKey(win, ";"), - like: () => pressKey(win, "+"), - dislike: () => pressKey(win, "_"), - go10sBack: () => pressKey(win, "h"), - go10sForward: () => pressKey(win, "l"), - go1sBack: () => pressKey(win, "h", ["shift"]), - go1sForward: () => pressKey(win, "l", ["shift"]), - shuffle: () => pressKey(win, "s"), - switchRepeat: (n = 1) => { - for (let i = 0; i < n; i++) pressKey(win, "r"); - }, - // General - volumeMinus10: () => pressKey(win, "-"), - volumePlus10: () => pressKey(win, "="), - fullscreen: () => pressKey(win, "f"), - muteUnmute: () => pressKey(win, "m"), - maximizeMinimisePlayer: () => pressKey(win, "q"), - // Navigation - goToHome: () => { - pressKey(win, "g"); - pressKey(win, "h"); - }, - goToLibrary: () => { - pressKey(win, "g"); - pressKey(win, "l"); - }, - goToSettings: () => { - pressKey(win, "g"); - pressKey(win, ","); - }, - goToExplore: () => { - pressKey(win, "g"); - pressKey(win, "e"); - }, - search: () => pressKey(win, "/"), - showShortcuts: () => pressKey(win, "/", ["shift"]), - }; - return { - ...commands, - play: commands.playPause, - pause: commands.playPause - }; + const commands = { + // Playback + previous: () => pressKey(win, 'k'), + next: () => pressKey(win, 'j'), + playPause: () => pressKey(win, ';'), + like: () => pressKey(win, '+'), + dislike: () => pressKey(win, '_'), + go10sBack: () => pressKey(win, 'h'), + go10sForward: () => pressKey(win, 'l'), + go1sBack: () => pressKey(win, 'h', ['shift']), + go1sForward: () => pressKey(win, 'l', ['shift']), + shuffle: () => pressKey(win, 's'), + switchRepeat(n = 1) { + for (let i = 0; i < n; i++) { + pressKey(win, 'r'); + } + }, + // General + volumeMinus10: () => pressKey(win, '-'), + volumePlus10: () => pressKey(win, '='), + fullscreen: () => pressKey(win, 'f'), + muteUnmute: () => pressKey(win, 'm'), + maximizeMinimisePlayer: () => pressKey(win, 'q'), + // Navigation + goToHome() { + pressKey(win, 'g'); + pressKey(win, 'h'); + }, + goToLibrary() { + pressKey(win, 'g'); + pressKey(win, 'l'); + }, + goToSettings() { + pressKey(win, 'g'); + pressKey(win, ','); + }, + goToExplore() { + pressKey(win, 'g'); + pressKey(win, 'e'); + }, + search: () => pressKey(win, '/'), + showShortcuts: () => pressKey(win, '/', ['shift']), + }; + return { + ...commands, + play: commands.playPause, + pause: commands.playPause, + }; }; diff --git a/providers/song-info-front.js b/providers/song-info-front.js index 32349ad9..aa63a608 100644 --- a/providers/song-info-front.js +++ b/providers/song-info-front.js @@ -1,100 +1,105 @@ -const { ipcRenderer } = require("electron"); -const { getImage } = require("./song-info"); -const { singleton } = require("../providers/decorators"); +const { ipcRenderer } = require('electron'); + +const { getImage } = require('./song-info'); + +const { singleton } = require('../providers/decorators'); global.songInfo = {}; -const $ = s => document.querySelector(s); -const $$ = s => Array.from(document.querySelectorAll(s)); +const $ = (s) => document.querySelector(s); +const $$ = (s) => [...document.querySelectorAll(s)]; -ipcRenderer.on("update-song-info", async (_, extractedSongInfo) => { - global.songInfo = JSON.parse(extractedSongInfo); - global.songInfo.image = await getImage(global.songInfo.imageSrc); +ipcRenderer.on('update-song-info', async (_, extractedSongInfo) => { + global.songInfo = JSON.parse(extractedSongInfo); + global.songInfo.image = await getImage(global.songInfo.imageSrc); }); -// used because 'loadeddata' or 'loadedmetadata' weren't firing on song start for some users (https://github.com/th-ch/youtube-music/issues/473) +// Used because 'loadeddata' or 'loadedmetadata' weren't firing on song start for some users (https://github.com/th-ch/youtube-music/issues/473) const srcChangedEvent = new CustomEvent('srcChanged'); module.exports.setupSeekedListener = singleton(() => { - $('video')?.addEventListener('seeked', v => ipcRenderer.send('seeked', v.target.currentTime)); + $('video')?.addEventListener('seeked', (v) => ipcRenderer.send('seeked', v.target.currentTime)); }); module.exports.setupTimeChangedListener = singleton(() => { - const progressObserver = new MutationObserver(mutations => { - ipcRenderer.send('timeChanged', mutations[0].target.value); - global.songInfo.elapsedSeconds = mutations[0].target.value; - }); - progressObserver.observe($('#progress-bar'), { attributeFilter: ["value"] }); + const progressObserver = new MutationObserver((mutations) => { + ipcRenderer.send('timeChanged', mutations[0].target.value); + global.songInfo.elapsedSeconds = mutations[0].target.value; + }); + progressObserver.observe($('#progress-bar'), { attributeFilter: ['value'] }); }); module.exports.setupRepeatChangedListener = singleton(() => { - const repeatObserver = new MutationObserver(mutations => { - ipcRenderer.send('repeatChanged', mutations[0].target.__dataHost.getState().queue.repeatMode); - }); - repeatObserver.observe($('#right-controls .repeat'), { attributeFilter: ["title"] }); + const repeatObserver = new MutationObserver((mutations) => { + ipcRenderer.send('repeatChanged', mutations[0].target.__dataHost.getState().queue.repeatMode); + }); + repeatObserver.observe($('#right-controls .repeat'), { attributeFilter: ['title'] }); - // Emit the initial value as well; as it's persistent between launches. - ipcRenderer.send('repeatChanged', $('ytmusic-player-bar').getState().queue.repeatMode); + // Emit the initial value as well; as it's persistent between launches. + ipcRenderer.send('repeatChanged', $('ytmusic-player-bar').getState().queue.repeatMode); }); module.exports.setupVolumeChangedListener = singleton((api) => { - $('video').addEventListener('volumechange', (_) => { - ipcRenderer.send('volumeChanged', api.getVolume()); - }); - // Emit the initial value as well; as it's persistent between launches. - ipcRenderer.send('volumeChanged', api.getVolume()); + $('video').addEventListener('volumechange', (_) => { + ipcRenderer.send('volumeChanged', api.getVolume()); + }); + // Emit the initial value as well; as it's persistent between launches. + ipcRenderer.send('volumeChanged', api.getVolume()); }); module.exports = () => { - document.addEventListener('apiLoaded', apiEvent => { - ipcRenderer.on("setupTimeChangedListener", async () => { - this.setupTimeChangedListener(); - }); + document.addEventListener('apiLoaded', (apiEvent) => { + ipcRenderer.on('setupTimeChangedListener', async () => { + this.setupTimeChangedListener(); + }); - ipcRenderer.on("setupRepeatChangedListener", async () => { - this.setupRepeatChangedListener(); - }); + ipcRenderer.on('setupRepeatChangedListener', async () => { + this.setupRepeatChangedListener(); + }); - ipcRenderer.on("setupVolumeChangedListener", async () => { - this.setupVolumeChangedListener(apiEvent.detail); - }); + ipcRenderer.on('setupVolumeChangedListener', async () => { + this.setupVolumeChangedListener(apiEvent.detail); + }); - ipcRenderer.on("setupSeekedListener", async () => { - this.setupSeekedListener(); - }); + ipcRenderer.on('setupSeekedListener', async () => { + this.setupSeekedListener(); + }); - const video = $('video'); - // name = "dataloaded" and abit later "dataupdated" - apiEvent.detail.addEventListener('videodatachange', (name, _dataEvent) => { - if (name !== 'dataloaded') return; - video.dispatchEvent(srcChangedEvent); - setTimeout(sendSongInfo, 200); - }) + const video = $('video'); + // Name = "dataloaded" and abit later "dataupdated" + apiEvent.detail.addEventListener('videodatachange', (name, _dataEvent) => { + if (name !== 'dataloaded') { + return; + } - for (const status of ['playing', 'pause']) { - video.addEventListener(status, e => { - if (Math.round(e.target.currentTime) > 0) { - ipcRenderer.send("playPaused", { - isPaused: status === 'pause', - elapsedSeconds: Math.floor(e.target.currentTime) - }); - } - }); - } + video.dispatchEvent(srcChangedEvent); + setTimeout(sendSongInfo, 200); + }); - function sendSongInfo() { - const data = apiEvent.detail.getPlayerResponse(); + for (const status of ['playing', 'pause']) { + video.addEventListener(status, (e) => { + if (Math.round(e.target.currentTime) > 0) { + ipcRenderer.send('playPaused', { + isPaused: status === 'pause', + elapsedSeconds: Math.floor(e.target.currentTime), + }); + } + }); + } - data.videoDetails.album = $$( - ".byline.ytmusic-player-bar > .yt-simple-endpoint" - ).find(e => - e.href?.includes("browse/FEmusic_library_privately_owned_release") - || e.href?.includes("browse/MPREb") - )?.textContent; + function sendSongInfo() { + const data = apiEvent.detail.getPlayerResponse(); - data.videoDetails.elapsedSeconds = 0; - data.videoDetails.isPaused = false; - ipcRenderer.send("video-src-changed", JSON.stringify(data)); - } - }, { once: true, passive: true }); + data.videoDetails.album = $$( + '.byline.ytmusic-player-bar > .yt-simple-endpoint', + ).find((e) => + e.href?.includes('browse/FEmusic_library_privately_owned_release') + || e.href?.includes('browse/MPREb'), + )?.textContent; + + data.videoDetails.elapsedSeconds = 0; + data.videoDetails.isPaused = false; + ipcRenderer.send('video-src-changed', JSON.stringify(data)); + } + }, { once: true, passive: true }); }; diff --git a/providers/song-info.js b/providers/song-info.js index d63bddf0..a3d9ad94 100644 --- a/providers/song-info.js +++ b/providers/song-info.js @@ -1,78 +1,78 @@ -const { ipcMain, nativeImage } = require("electron"); +const { ipcMain, nativeImage } = require('electron'); +const fetch = require('node-fetch'); -const fetch = require("node-fetch"); - -const config = require("../config"); - -const { cache } = require("../providers/decorators") +const config = require('../config'); +const { cache } = require('../providers/decorators'); // Fill songInfo with empty values /** * @typedef {songInfo} SongInfo */ const songInfo = { - title: "", - artist: "", - views: 0, - uploadDate: "", - imageSrc: "", - image: null, - isPaused: undefined, - songDuration: 0, - elapsedSeconds: 0, - url: "", - album: undefined, - videoId: "", - playlistId: "", + title: '', + artist: '', + views: 0, + uploadDate: '', + imageSrc: '', + image: null, + isPaused: undefined, + songDuration: 0, + elapsedSeconds: 0, + url: '', + album: undefined, + videoId: '', + playlistId: '', }; // Grab the native image using the src const getImage = cache( - /** - * @returns {Promise} - */ - async (src) => { - const result = await fetch(src); - const buffer = await result.buffer(); - const output = nativeImage.createFromBuffer(buffer); - if (output.isEmpty() && !src.endsWith(".jpg") && src.includes(".jpg")) { // fix hidden webp files (https://github.com/th-ch/youtube-music/issues/315) - return getImage(src.slice(0, src.lastIndexOf(".jpg") + 4)); - } else { - return output; - } - } + /** + * @returns {Promise} + */ + async (src) => { + const result = await fetch(src); + const buffer = await result.buffer(); + const output = nativeImage.createFromBuffer(buffer); + if (output.isEmpty() && !src.endsWith('.jpg') && src.includes('.jpg')) { // Fix hidden webp files (https://github.com/th-ch/youtube-music/issues/315) + return getImage(src.slice(0, src.lastIndexOf('.jpg') + 4)); + } + + return output; + }, ); const handleData = async (responseText, win) => { - const data = JSON.parse(responseText); - if (!data) return; + const data = JSON.parse(responseText); + if (!data) { + return; + } - const microformat = data.microformat?.microformatDataRenderer; - if (microformat) { - songInfo.uploadDate = microformat.uploadDate; - songInfo.url = microformat.urlCanonical?.split("&")[0]; - songInfo.playlistId = new URL(microformat.urlCanonical).searchParams.get("list"); - // used for options.resumeOnStart - config.set("url", microformat.urlCanonical); - } + const microformat = data.microformat?.microformatDataRenderer; + if (microformat) { + songInfo.uploadDate = microformat.uploadDate; + songInfo.url = microformat.urlCanonical?.split('&')[0]; + songInfo.playlistId = new URL(microformat.urlCanonical).searchParams.get('list'); + // Used for options.resumeOnStart + config.set('url', microformat.urlCanonical); + } - const videoDetails = data.videoDetails; - if (videoDetails) { - songInfo.title = cleanupName(videoDetails.title); - songInfo.artist = cleanupName(videoDetails.author); - songInfo.views = videoDetails.viewCount; - songInfo.songDuration = videoDetails.lengthSeconds; - songInfo.elapsedSeconds = videoDetails.elapsedSeconds; - songInfo.isPaused = videoDetails.isPaused; - songInfo.videoId = videoDetails.videoId; - songInfo.album = data?.videoDetails?.album; // Will be undefined if video exist + const { videoDetails } = data; + if (videoDetails) { + songInfo.title = cleanupName(videoDetails.title); + songInfo.artist = cleanupName(videoDetails.author); + songInfo.views = videoDetails.viewCount; + songInfo.songDuration = videoDetails.lengthSeconds; + songInfo.elapsedSeconds = videoDetails.elapsedSeconds; + songInfo.isPaused = videoDetails.isPaused; + songInfo.videoId = videoDetails.videoId; + songInfo.album = data?.videoDetails?.album; // Will be undefined if video exist - const thumbnails = videoDetails.thumbnail?.thumbnails; - songInfo.imageSrc = thumbnails[thumbnails.length - 1]?.url.split("?")[0]; - songInfo.image = await getImage(songInfo.imageSrc); - - win.webContents.send("update-song-info", JSON.stringify(songInfo)); - } + const thumbnails = videoDetails.thumbnail?.thumbnails; + songInfo.imageSrc = thumbnails.at(-1)?.url.split('?')[0]; + songInfo.image = await getImage(songInfo.imageSrc); + + win.webContents.send('update-song-info', JSON.stringify(songInfo)); + } }; // This variable will be filled with the callbacks once they register @@ -88,48 +88,55 @@ const callbacks = []; * @param {songInfoCallback} callback */ const registerCallback = (callback) => { - callbacks.push(callback); + callbacks.push(callback); }; let handlingData = false; const registerProvider = (win) => { - // This will be called when the song-info-front finds a new request with song data - ipcMain.on("video-src-changed", async (_, responseText) => { - handlingData = true; - await handleData(responseText, win); - handlingData = false; - callbacks.forEach((c) => { - c(songInfo, "video-src-changed"); - }); - }); - ipcMain.on("playPaused", (_, { isPaused, elapsedSeconds }) => { - songInfo.isPaused = isPaused; - songInfo.elapsedSeconds = elapsedSeconds; - if (handlingData) return; - callbacks.forEach((c) => { - c(songInfo, "playPaused"); - }); - }) + // This will be called when the song-info-front finds a new request with song data + ipcMain.on('video-src-changed', async (_, responseText) => { + handlingData = true; + await handleData(responseText, win); + handlingData = false; + for (const c of callbacks) { + c(songInfo, 'video-src-changed'); + } + }); + ipcMain.on('playPaused', (_, { isPaused, elapsedSeconds }) => { + songInfo.isPaused = isPaused; + songInfo.elapsedSeconds = elapsedSeconds; + if (handlingData) { + return; + } + + for (const c of callbacks) { + c(songInfo, 'playPaused'); + } + }); }; const suffixesToRemove = [ - " - topic", - "vevo", - " (performance video)", - " (clip officiel)", + ' - topic', + 'vevo', + ' (performance video)', + ' (clip officiel)', ]; function cleanupName(name) { - if (!name) return name; - name = name.replace(/\((?:official)?[ ]?(?:music)?[ ]?(?:lyric[s]?)?[ ]?(?:video)?\)$/i, '') - const lowCaseName = name.toLowerCase(); - for (const suffix of suffixesToRemove) { - if (lowCaseName.endsWith(suffix)) { - return name.slice(0, -suffix.length); - } - } - return name; + if (!name) { + return name; + } + + name = name.replace(/\((?:official)? ?(?:music)? ?(?:lyrics?)? ?(?:video)?\)$/i, ''); + const lowCaseName = name.toLowerCase(); + for (const suffix of suffixesToRemove) { + if (lowCaseName.endsWith(suffix)) { + return name.slice(0, -suffix.length); + } + } + + return name; } module.exports = registerCallback; diff --git a/readme.md b/readme.md index 587204f3..680fd6ad 100644 --- a/readme.md +++ b/readme.md @@ -23,35 +23,43 @@ **Electron wrapper around YouTube Music featuring:** - Native look & feel, aims at keeping the original interface -- Framework for custom plugins: change YouTube Music to your needs (style, content, features), enable/disable plugins in one click +- Framework for custom plugins: change YouTube Music to your needs (style, content, features), enable/disable plugins in + one click ## Download -You can check out the [latest release](https://github.com/th-ch/youtube-music/releases/latest) to quickly find the latest version. +You can check out the [latest release](https://github.com/th-ch/youtube-music/releases/latest) to quickly find the +latest version. ### Arch Linux -Install the `youtube-music-bin` package from the AUR. For AUR installation instructions, take a look at this [wiki page](https://wiki.archlinux.org/index.php/Arch_User_Repository#Installing_packages). +Install the `youtube-music-bin` package from the AUR. For AUR installation instructions, take a look at +this [wiki page](https://wiki.archlinux.org/index.php/Arch_User_Repository#Installing_packages). ### MacOS If you get an error "is damaged and can’t be opened." when launching the app, run the following in the Terminal: + ``` xattr -cr /Applications/YouTube\ Music.app ``` ### Windows -You can use the [Scoop package manager](https://scoop.sh) to install the `youtube-music` package from the [`extras` bucket](https://github.com/ScoopInstaller/Extras). +You can use the [Scoop package manager](https://scoop.sh) to install the `youtube-music` package from +the [`extras` bucket](https://github.com/ScoopInstaller/Extras). ``` scoop bucket add extras scoop install extras/youtube-music ``` -Alternately you can use [Winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/), Windows 11s official CLI package manager to install the `th-ch.YouTubeMusic` package. +Alternately you can use [Winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/), Windows 11s +official CLI package manager to install the `th-ch.YouTubeMusic` package. -*Note: Microsoft Defender SmartScreen might block the installation since it is from an "unknown publisher". This is also true for the manual installation when trying to run the executable(.exe) after a manual download here on github (same file).* +*Note: Microsoft Defender SmartScreen might block the installation since it is from an "unknown publisher". This is also +true for the manual installation when trying to run the executable(.exe) after a manual download here on github (same +file).* ``` winget install th-ch.YouTubeMusic @@ -61,7 +69,8 @@ winget install th-ch.YouTubeMusic - **Ad Blocker**: Block all ads and tracking out of the box -- **Audio Compressor**: Apply compression to audio (lowers the volume of the loudest parts of the signal and raises the volume of the softest parts) +- **Audio Compressor**: Apply compression to audio (lowers the volume of the loudest parts of the signal and raises the + volume of the softest parts) - **Blur Nav Bar**: makes navigation bar transparent and blurry @@ -75,15 +84,21 @@ winget install th-ch.YouTubeMusic - **Disable Autoplay**: Makes every song start in "paused" mode -- [**Discord**](https://discord.com/): Show your friends what you listen to with [Rich Presence](https://user-images.githubusercontent.com/28219076/104362104-a7a0b980-5513-11eb-9744-bb89eabe0016.png) +- [**Discord**](https://discord.com/): Show your friends what you listen to + with [Rich Presence](https://user-images.githubusercontent.com/28219076/104362104-a7a0b980-5513-11eb-9744-bb89eabe0016.png) -- **Downloader**: downloads MP3 [directly from the interface](https://user-images.githubusercontent.com/61631665/129977677-83a7d067-c192-45e1-98ae-b5a4927393be.png) [(youtube-dl)](https://github.com/ytdl-org/youtube-dl) +- **Downloader**: downloads + MP3 [directly from the interface](https://user-images.githubusercontent.com/61631665/129977677-83a7d067-c192-45e1-98ae-b5a4927393be.png) [(youtube-dl)](https://github.com/ytdl-org/youtube-dl) -- **Exponential Volume**: Makes the volume slider [exponential](https://greasyfork.org/en/scripts/397686-youtube-music-fix-volume-ratio/) so it's easier to select lower volumes. +- **Exponential Volume**: Makes the volume + slider [exponential](https://greasyfork.org/en/scripts/397686-youtube-music-fix-volume-ratio/) so it's easier to + select lower volumes. -- **In-App Menu**: [gives bars a fancy, dark look](https://user-images.githubusercontent.com/78568641/112215894-923dbf00-8c29-11eb-95c3-3ce15db27eca.png) +- **In-App Menu + **: [gives bars a fancy, dark look](https://user-images.githubusercontent.com/78568641/112215894-923dbf00-8c29-11eb-95c3-3ce15db27eca.png) - > (see [this post](https://github.com/th-ch/youtube-music/issues/410#issuecomment-952060709) if you have problem accessing the menu after enabling this plugin and hide-menu option) + > (see [this post](https://github.com/th-ch/youtube-music/issues/410#issuecomment-952060709) if you have problem + accessing the menu after enabling this plugin and hide-menu option) - [**Last.fm**](https://www.last.fm/): Scrobbles support @@ -93,37 +108,55 @@ winget install th-ch.YouTubeMusic - **No Google Login**: Remove Google login buttons and links from the interface -- **Notifications**: Display a notification when a song starts playing ([interactive notifications](https://user-images.githubusercontent.com/78568641/114102651-63ce0e00-98d0-11eb-9dfe-c5a02bb54f9c.png) are available on windows) +- **Notifications**: Display a notification when a song starts + playing ([interactive notifications](https://user-images.githubusercontent.com/78568641/114102651-63ce0e00-98d0-11eb-9dfe-c5a02bb54f9c.png) + are available on windows) - **Picture in picture**: allows to switch the app to picture-in-picture mode -- **Playback Speed**: Listen fast, listen slow! [Adds a slider that controls song speed](https://user-images.githubusercontent.com/61631665/129976003-e55db5ba-bf42-448c-a059-26a009775e68.png) +- **Playback Speed**: Listen fast, listen + slow! [Adds a slider that controls song speed](https://user-images.githubusercontent.com/61631665/129976003-e55db5ba-bf42-448c-a059-26a009775e68.png) -- **Precise Volume**: Control the volume precisely using mousewheel/hotkeys, with a custom hud and customizable volume steps +- **Precise Volume**: Control the volume precisely using mousewheel/hotkeys, with a custom hud and customizable volume + steps -- **Quality Changer**: Allows changing the video quality with a [button](https://user-images.githubusercontent.com/78568641/138574366-70324a5e-2d64-4f6a-acdd-dc2a2b9cecc5.png) on the video overlay +- **Quality Changer**: Allows changing the video quality with + a [button](https://user-images.githubusercontent.com/78568641/138574366-70324a5e-2d64-4f6a-acdd-dc2a2b9cecc5.png) on + the video overlay -- **Shortcuts**: Allows setting global hotkeys for playback (play/pause/next/previous) + disable [media osd](https://user-images.githubusercontent.com/84923831/128601225-afa38c1f-dea8-4209-9f72-0f84c1dd8b54.png) by overriding media keys + enable Ctrl/CMD + F to search + enable linux mpris support for mediakeys + [custom hotkeys](https://github.com/Araxeus/youtube-music/blob/1e591d6a3df98449bcda6e63baab249b28026148/providers/song-controls.js#L13-L50) for [advanced users](https://github.com/th-ch/youtube-music/issues/106#issuecomment-952156902) +- **Shortcuts**: Allows setting global hotkeys for playback (play/pause/next/previous) + + disable [media osd](https://user-images.githubusercontent.com/84923831/128601225-afa38c1f-dea8-4209-9f72-0f84c1dd8b54.png) + by overriding media keys + enable Ctrl/CMD + F to search + enable linux mpris support for + mediakeys + [custom hotkeys](https://github.com/Araxeus/youtube-music/blob/1e591d6a3df98449bcda6e63baab249b28026148/providers/song-controls.js#L13-L50) + for [advanced users](https://github.com/th-ch/youtube-music/issues/106#issuecomment-952156902) - **Skip-Silences** - Automatically skip silenced sections -- [**SponsorBlock**](https://github.com/ajayyy/SponsorBlock): Automatically Skips non-music parts like intro/outro or parts of music videos where the song isn't playing +- [**SponsorBlock**](https://github.com/ajayyy/SponsorBlock): Automatically Skips non-music parts like intro/outro or + parts of music videos where the song isn't playing -- **Taskbar Media Control**: Control playback from your [Windows taskbar](https://user-images.githubusercontent.com/78568641/111916130-24a35e80-8a82-11eb-80c8-5021c1aa27f4.png) +- **Taskbar Media Control**: Control playback from + your [Windows taskbar](https://user-images.githubusercontent.com/78568641/111916130-24a35e80-8a82-11eb-80c8-5021c1aa27f4.png) - **Touchbar**: Custom TouchBar layout for macOS -- **Tuna-OBS**: Integration with [OBS](https://obsproject.com/)'s plugin [Tuna](https://obsproject.com/forum/resources/tuna.843/) +- **Tuna-OBS**: Integration with [OBS](https://obsproject.com/)'s + plugin [Tuna](https://obsproject.com/forum/resources/tuna.843/) -- **Video Toggle**: Adds a [button](https://user-images.githubusercontent.com/28893833/173663950-63e6610e-a532-49b7-9afa-54cb57ddfc15.png) to switch between Video/Song mode. can also optionally remove the whole video tab +- **Video Toggle**: Adds + a [button](https://user-images.githubusercontent.com/28893833/173663950-63e6610e-a532-49b7-9afa-54cb57ddfc15.png) to + switch between Video/Song mode. can also optionally remove the whole video tab - **Visualizer**: Different music visualizers --- -- **Auto confirm when paused** (Always Enabled): disable the ["Continue Watching?"](https://user-images.githubusercontent.com/61631665/129977894-01c60740-7ec6-4bf0-9a2c-25da24491b0e.png) popup that pause music after a certain time +- **Auto confirm when paused** (Always Enabled): disable + the ["Continue Watching?"](https://user-images.githubusercontent.com/61631665/129977894-01c60740-7ec6-4bf0-9a2c-25da24491b0e.png) + popup that pause music after a certain time -> If `Hide Menu` option is on - you can show the menu with the alt key (or \` [backtick] if using the in-app-menu plugin) +> If `Hide Menu` option is on - you can show the menu with the alt key (or \` [backtick] if using +> the in-app-menu plugin) ## Themes @@ -155,7 +188,7 @@ Create a folder in `plugins/YOUR-PLUGIN-NAME`: ```node module.exports = win => { - // win is the BrowserWindow object + // win is the BrowserWindow object }; ``` @@ -163,8 +196,8 @@ module.exports = win => { ```node module.exports = () => { - // This function will be called as a preload script - // So you can use front features like `document.querySelector` + // This function will be called as a preload script + // So you can use front features like `document.querySelector` }; ``` @@ -174,11 +207,11 @@ module.exports = () => { ```node const path = require("path"); -const { injectCSS } = require("../utils"); +const {injectCSS} = require("../utils"); // back.js module.exports = win => { - injectCSS(win.webContents, path.join(__dirname, "style.css")); + injectCSS(win.webContents, path.join(__dirname, "style.css")); }; ``` @@ -187,23 +220,26 @@ module.exports = win => { ```node // front.js module.exports = () => { - // Remove the login button - document.querySelector(".sign-in-link.ytmusic-nav-bar").remove(); + // Remove the login button + document.querySelector(".sign-in-link.ytmusic-nav-bar").remove(); }; ``` -- communicating between the front and back: can be done using the ipcMain module from electron. See `utils.js` file and example in `navigation` plugin. +- communicating between the front and back: can be done using the ipcMain module from electron. See `utils.js` file and + example in `navigation` plugin. ## Build 1. Clone the repo 2. Run `yarn` to install dependencies 3. Run `yarn build:OS` - - `yarn build:win` - Windows - - `yarn build:linux` - Linux - - `yarn build:mac` - MacOS -Builds the app for macOS, Linux, and Windows, using [electron-builder](https://github.com/electron-userland/electron-builder). +- `yarn build:win` - Windows +- `yarn build:linux` - Linux +- `yarn build:mac` - MacOS + +Builds the app for macOS, Linux, and Windows, +using [electron-builder](https://github.com/electron-userland/electron-builder). ## Tests diff --git a/tests/index.test.js b/tests/index.test.js index 162583aa..a08da6dc 100644 --- a/tests/index.test.js +++ b/tests/index.test.js @@ -1,38 +1,38 @@ -const path = require("path"); +const path = require('node:path'); -const { _electron: electron } = require("playwright"); -const { test, expect } = require("@playwright/test"); +const { _electron: electron } = require('playwright'); +const { test, expect } = require('@playwright/test'); -process.env.NODE_ENV = "test"; +process.env.NODE_ENV = 'test'; -const appPath = path.resolve(__dirname, ".."); +const appPath = path.resolve(__dirname, '..'); -test("YouTube Music App - With default settings, app is launched and visible", async () => { - const app = await electron.launch({ - cwd: appPath, - args: [ - appPath, - "--no-sandbox", - "--disable-gpu", - "--whitelisted-ips=", - "--disable-dev-shm-usage", - ], - }); +test('YouTube Music App - With default settings, app is launched and visible', async () => { + const app = await electron.launch({ + cwd: appPath, + args: [ + appPath, + '--no-sandbox', + '--disable-gpu', + '--whitelisted-ips=', + '--disable-dev-shm-usage', + ], + }); - const window = await app.firstWindow(); + const window = await app.firstWindow(); - const consentForm = await window.$( - "form[action='https://consent.youtube.com/save']" - ); - if (consentForm) { - await consentForm.click("button"); - } + const consentForm = await window.$( + "form[action='https://consent.youtube.com/save']", + ); + if (consentForm) { + await consentForm.click('button'); + } - const title = await window.title(); - expect(title.replace(/\s/g, " ")).toEqual("YouTube Music"); + const title = await window.title(); + expect(title.replaceAll(/\s/g, ' ')).toEqual('YouTube Music'); - const url = window.url(); - expect(url.startsWith("https://music.youtube.com")).toBe(true); + const url = window.url(); + expect(url.startsWith('https://music.youtube.com')).toBe(true); - await app.close(); + await app.close(); }); diff --git a/tray.js b/tray.js index 46b76f83..91172cb8 100644 --- a/tray.js +++ b/tray.js @@ -1,10 +1,10 @@ -const path = require("path"); +const path = require('node:path'); -const { Menu, nativeImage, Tray } = require("electron"); +const { Menu, nativeImage, Tray } = require('electron'); -const { restart } = require("./providers/app-controls"); -const config = require("./config"); -const getSongControls = require("./providers/song-controls"); +const { restart } = require('./providers/app-controls'); +const config = require('./config'); +const getSongControls = require('./providers/song-controls'); // Prevent tray being garbage collected @@ -12,86 +12,90 @@ const getSongControls = require("./providers/song-controls"); let tray; module.exports.setTrayOnClick = (fn) => { - if (!tray) return; - tray.removeAllListeners('click'); - tray.on("click", fn); + if (!tray) { + return; + } + + tray.removeAllListeners('click'); + tray.on('click', fn); }; -// wont do anything on macos since its disabled +// Wont do anything on macos since its disabled module.exports.setTrayOnDoubleClick = (fn) => { - if (!tray) return; - tray.removeAllListeners('double-click'); - tray.on("double-click", fn); + if (!tray) { + return; + } + + tray.removeAllListeners('double-click'); + tray.on('double-click', fn); }; module.exports.setUpTray = (app, win) => { - if (!config.get("options.tray")) { - tray = undefined; - return; - } + if (!config.get('options.tray')) { + tray = undefined; + return; + } - const { playPause, next, previous } = getSongControls(win); - const iconPath = path.join(__dirname, "assets", "youtube-music-tray.png"); + const { playPause, next, previous } = getSongControls(win); + const iconPath = path.join(__dirname, 'assets', 'youtube-music-tray.png'); - let trayIcon = nativeImage.createFromPath(iconPath).resize({ - width: 16, - height: 16, - }); + const trayIcon = nativeImage.createFromPath(iconPath).resize({ + width: 16, + height: 16, + }); - tray = new Tray(trayIcon); + tray = new Tray(trayIcon); - tray.setToolTip("YouTube Music"); + tray.setToolTip('YouTube Music'); - // macOS only - tray.setIgnoreDoubleClickEvents(true); + // MacOS only + tray.setIgnoreDoubleClickEvents(true); - tray.on("click", () => { - if (config.get("options.trayClickPlayPause")) { - playPause(); - } else { - if (win.isVisible()) { - win.hide(); - app.dock?.hide(); - } else { - win.show(); - app.dock?.show(); - } - } - }); + tray.on('click', () => { + if (config.get('options.trayClickPlayPause')) { + playPause(); + } else if (win.isVisible()) { + win.hide(); + app.dock?.hide(); + } else { + win.show(); + app.dock?.show(); + } + }); - let template = [ - { - label: "Play/Pause", - click: () => { - playPause(); - }, - }, - { - label: "Next", - click: () => { - next(); - }, - }, - { - label: "Previous", - click: () => { - previous(); - }, - }, - { - label: "Show", - click: () => { - win.show(); - app.dock?.show(); - }, - }, - { - label: "Restart App", - click: restart - }, - { role: "quit" }, - ]; + const template = [ + { + label: 'Play/Pause', + click() { + playPause(); + }, + }, + { + label: 'Next', + click() { + next(); + }, + }, + { + label: 'Previous', + click() { + previous(); + }, + }, + { + label: 'Show', + click() { + win.show(); + app.dock?.show(); + }, + }, + { + label: 'Restart App', + click: restart, + }, + { role: 'quit' }, + ]; - const trayMenu = Menu.buildFromTemplate(template); - tray.setContextMenu(trayMenu); + const trayMenu = Menu.buildFromTemplate(template); + tray.setContextMenu(trayMenu); }; diff --git a/utils/generate-package-json.js b/utils/generate-package-json.js index bcda791f..7c424d69 100755 --- a/utils/generate-package-json.js +++ b/utils/generate-package-json.js @@ -1,42 +1,42 @@ #!/usr/bin/env node -const { existsSync, writeFile } = require("fs"); -const { join } = require("path"); -const { promisify } = require("util"); +const { existsSync, writeFile } = require('node:fs'); +const { join } = require('node:path'); +const { promisify } = require('node:util'); /** * Generates a fake package.json for given packages that don't have any. * Allows electron-builder to resolve them */ -const generatePackageJson = async packageName => { - const packageFolder = join("node_modules", packageName) - if (!existsSync(packageFolder )) { - console.log( - `${packageName} module not found, exiting…` - ); - return - } +const generatePackageJson = async (packageName) => { + const packageFolder = join('node_modules', packageName); + if (!existsSync(packageFolder)) { + console.log( + `${packageName} module not found, exiting…`, + ); + return; + } - const filepath = join(packageFolder, "package.json"); - if (!existsSync(filepath)) { - console.log( - `No package.json found for ${packageName} module, generating one…` - ); - pkg = { - name: packageName, - version: "0.0.0", - description: "-", - repository: { type: "git", url: "-" }, - readme: "-" - }; - const writeFileAsync = promisify(writeFile); - await writeFileAsync(filepath, JSON.stringify(pkg, null, 2)); - } + const filepath = join(packageFolder, 'package.json'); + if (!existsSync(filepath)) { + console.log( + `No package.json found for ${packageName} module, generating one…`, + ); + let pkg = { + name: packageName, + version: '0.0.0', + description: '-', + repository: { type: 'git', url: '-' }, + readme: '-', + }; + const writeFileAsync = promisify(writeFile); + await writeFileAsync(filepath, JSON.stringify(pkg, null, 2)); + } }; if (require.main === module) { - process.argv.slice(2).forEach(async packageName => { - await generatePackageJson(packageName); - }); + process.argv.slice(2).forEach(async (packageName) => { + await generatePackageJson(packageName); + }); } diff --git a/utils/testing.js b/utils/testing.js index 4e7037a9..a497d84a 100644 --- a/utils/testing.js +++ b/utils/testing.js @@ -1,3 +1,3 @@ -const isTesting = () => process.env.NODE_ENV === "test"; +const isTesting = () => process.env.NODE_ENV === 'test'; module.exports = { isTesting }; diff --git a/web/youtube-music.svg b/web/youtube-music.svg index 1e6ea723..a4d00070 100644 --- a/web/youtube-music.svg +++ b/web/youtube-music.svg @@ -1,379 +1,381 @@ - -
- -
-
-

YouTube Music Desktop App

-

With built-in ad blocker

-

And built-in downloader

-

Cross-platform

-

- Free, - Open source -

- - Download - -
-
-
-
+ color: #cc0000; + text-shadow: 0px 0px 1px #fff; + transform: scale(1); + } + 100% { + opacity: 0; + text-shadow: 0px 0px 50px #fff; + transform: scale(0); + } + } + @keyframes blurFadeIn { + 0% { + opacity: 0; + color: #cc0000; + text-shadow: 0px 0px 40px #fff; + transform: scale(1.3); + } + 50% { + opacity: 0.5; + color: #cc0000; + text-shadow: 0px 0px 10px #fff; + transform: scale(1.1); + } + 100% { + opacity: 1; + text-shadow: 0px 0px 1px #fff; + transform: scale(1); + } + } + @keyframes fadeInBack { + 0% { + opacity: 0; + transform: scale(0); + } + 50% { + opacity: 0.4; + transform: scale(2); + } + 100% { + opacity: 0.2; + transform: scale(5); + } + } + @keyframes fadeInRotate { + 0% { + opacity: 0; + transform: scale(0) rotate(360deg); + } + 100% { + opacity: 1; + transform: scale(1) rotate(0deg); + } + } + +
+
+

YouTube Music Desktop App

+

With built-in ad blocker

+

And built-in downloader

+

Cross-platform

+

+ Free, + Open source +

+ + Download + +
+
+ + diff --git a/youtube-music.css b/youtube-music.css index 79983bb7..686feb4f 100644 --- a/youtube-music.css +++ b/youtube-music.css @@ -4,53 +4,53 @@ /* Allow window dragging */ .center-content.ytmusic-nav-bar { - -webkit-user-select: none; - -webkit-app-region: drag; + -webkit-user-select: none; + -webkit-app-region: drag; } -.center-content.ytmusic-nav-bar > ytmusic-search-box{ - -webkit-app-region: no-drag; +.center-content.ytmusic-nav-bar > ytmusic-search-box { + -webkit-app-region: no-drag; } iron-icon, ytmusic-pivot-bar-item-renderer, .tab-title, a { - -webkit-app-region: no-drag; + -webkit-app-region: no-drag; } /* custom style for navbar */ ytmusic-app-layout { - --ytmusic-nav-bar-height: 90px; + --ytmusic-nav-bar-height: 90px; } ytmusic-search-box.ytmusic-nav-bar { - margin-top: 15px; + margin-top: 15px; } /* Blocking annoying elements */ ytmusic-mealbar-promo-renderer { - display: none !important; + display: none !important; } /* Disable Image Selection */ img { - -webkit-user-select: none; - user-select: none; + -webkit-user-select: none; + user-select: none; } /* Hide cast button which doesn't work */ ytmusic-cast-button { - display: none !important; + display: none !important; } /* Remove useless inaccessible button on top-right corner of the video player */ .ytp-chrome-top-buttons { - display: none !important; + display: none !important; } /* Make youtube-music logo un-draggable */ -ytmusic-nav-bar>div.left-content>a, -ytmusic-nav-bar>div.left-content>a>picture>img { - -webkit-user-drag: none; +ytmusic-nav-bar > div.left-content > a, +ytmusic-nav-bar > div.left-content > a > picture > img { + -webkit-user-drag: none; } From 897cfd3c7d342039fbb27d6935461ab4029a885c Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Tue, 29 Aug 2023 19:14:51 +0900 Subject: [PATCH 07/70] apply fix from eslint --- .eslintrc.js | 1 + config/plugins.js | 3 +- docs/js/main.js | 5 +- index.js | 11 +- package-lock.json | 80 +--- package.json | 2 +- plugins/adblocker/inject.js | 6 +- plugins/crossfade/fader.js | 637 ++++++++++++------------- plugins/crossfade/front.js | 16 +- plugins/crossfade/menu.js | 7 +- plugins/discord/back.js | 4 +- plugins/downloader/back.js | 20 +- plugins/downloader/front.js | 2 +- plugins/in-app-menu/front.js | 6 +- plugins/last-fm/back.js | 18 +- plugins/lyrics-genius/back.js | 4 +- plugins/lyrics-genius/front.js | 6 +- plugins/lyrics-genius/menu.js | 2 +- plugins/no-google-login/front.js | 2 +- plugins/notifications/interactive.js | 43 +- plugins/notifications/utils.js | 8 +- plugins/picture-in-picture/back.js | 1 - plugins/picture-in-picture/front.js | 5 +- plugins/playback-speed/front.js | 5 +- plugins/precise-volume/back.js | 8 +- plugins/precise-volume/front.js | 5 +- plugins/precise-volume/menu.js | 2 +- plugins/quality-changer/front.js | 9 + plugins/shortcuts/mpris.js | 8 +- plugins/tuna-obs/back.js | 11 +- plugins/visualizer/back.js | 2 +- plugins/visualizer/visualizers/wave.js | 5 +- providers/song-info-front.js | 51 +- 33 files changed, 471 insertions(+), 524 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 976dfccc..b2bfdd44 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -46,6 +46,7 @@ module.exports = { allowTemplateLiterals: false, }], 'quote-props': ['error', 'consistent'], + 'semi': ['error', 'always'], }, env: { browser: true, diff --git a/config/plugins.js b/config/plugins.js index 6802ecb4..5589600a 100644 --- a/config/plugins.js +++ b/config/plugins.js @@ -4,10 +4,9 @@ const { restart } = require('../providers/app-controls'); function getEnabled() { const plugins = store.get('plugins'); - const enabledPlugins = Object.entries(plugins).filter(([plugin, options]) => + return Object.entries(plugins).filter(([plugin]) => isEnabled(plugin), ); - return enabledPlugins; } function isEnabled(plugin) { diff --git a/docs/js/main.js b/docs/js/main.js index 8ca35d2a..d7587ce9 100644 --- a/docs/js/main.js +++ b/docs/js/main.js @@ -1,3 +1,5 @@ +/* eslint-disable */ + // Constants const element = document.documentElement; const { body } = document; @@ -40,7 +42,8 @@ const bubbleCanvas = function (t) { e.mouseX = 0; e.mouseY = 0; window.addEventListener('mousemove', (t) => { - (e.mouseX = t.clientX), (e.mouseY = t.clientY); + e.mouseX = t.clientX; + e.mouseY = t.clientY; }); e.randomise(); }; diff --git a/index.js b/index.js index ef3090d1..f88d71a1 100644 --- a/index.js +++ b/index.js @@ -36,7 +36,6 @@ if (!gotTheLock) { } app.commandLine.appendSwitch('enable-features', 'SharedArrayBuffer'); // Required for downloader -app.allowRendererProcessReuse = true; // https://github.com/electron/electron/issues/18397 if (config.get('options.disableHardwareAcceleration')) { if (is.dev()) { console.log('Disabling hardware acceleration'); @@ -60,9 +59,9 @@ require('electron-debug')({ }); let icon = 'assets/youtube-music.png'; -if (process.platform == 'win32') { +if (process.platform === 'win32') { icon = 'assets/generated/icon.ico'; -} else if (process.platform == 'darwin') { +} else if (process.platform === 'darwin') { icon = 'assets/generated/icon.icns'; } @@ -393,7 +392,7 @@ app.on('ready', () => { setupProtocolHandler(mainWindow); - app.on('second-instance', (_event, commandLine, _workingDirectory) => { + app.on('second-instance', (_, commandLine) => { const uri = `${APP_PROTOCOL}://`; const protocolArgv = commandLine.find((arg) => arg.startsWith(uri)); if (protocolArgv) { @@ -541,7 +540,7 @@ function removeContentSecurityPolicy( // When multiple listeners are defined, apply them all session.webRequest.setResolver('onHeadersReceived', (listeners) => { - const response = listeners.reduce( + return listeners.reduce( async (accumulator, listener) => { if (accumulator.cancel) { return accumulator; @@ -552,7 +551,5 @@ function removeContentSecurityPolicy( }, { cancel: false }, ); - - return response; }); } diff --git a/package-lock.json b/package-lock.json index a905e620..4792fc5b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,7 +39,7 @@ "node-fetch": "2.7.0", "simple-youtube-age-restriction-bypass": "git+https://github.com/zerodytrash/Simple-YouTube-Age-Restriction-Bypass.git#v2.5.9", "vudio": "2.1.1", - "youtubei.js": "4.3.0", + "youtubei.js": "6.1.0", "ytpl": "2.3.0" }, "devDependencies": { @@ -1919,11 +1919,6 @@ "bluebird": "^3.5.5" } }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - }, "node_modules/boolean": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", @@ -2607,37 +2602,6 @@ "node": "*" } }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" - }, "node_modules/custom-electron-prompt": { "version": "1.5.7", "resolved": "https://registry.npmjs.org/custom-electron-prompt/-/custom-electron-prompt-1.5.7.tgz", @@ -5018,11 +4982,6 @@ "resolved": "https://registry.npmjs.org/howler/-/howler-2.2.3.tgz", "integrity": "sha512-QM0FFkw0LRX1PR8pNzJVAY25JhIWvbKMBFM4gqk+QdV+kPXOhleWGCB6AiAF/goGjIHK2e/nIElplvjQwhr0jg==" }, - "node_modules/html-escaper": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", - "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==" - }, "node_modules/html-to-text": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz", @@ -5937,18 +5896,6 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, - "node_modules/linkedom": { - "version": "0.14.26", - "resolved": "https://registry.npmjs.org/linkedom/-/linkedom-0.14.26.tgz", - "integrity": "sha512-mK6TrydfFA7phrnp+1j57ycBwFI5bGSW6YXlw9acHoqF+mP/y+FooEYYyniOt5Ot57FSKB3iwmnuQ1UUyNLm5A==", - "dependencies": { - "css-select": "^5.1.0", - "cssom": "^0.5.0", - "html-escaper": "^3.0.3", - "htmlparser2": "^8.0.1", - "uhyphen": "^0.2.0" - } - }, "node_modules/locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -6579,17 +6526,6 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, "node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", @@ -8407,11 +8343,6 @@ "node": ">=0.8.0" } }, - "node_modules/uhyphen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/uhyphen/-/uhyphen-0.2.0.tgz", - "integrity": "sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==" - }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -8815,15 +8746,14 @@ } }, "node_modules/youtubei.js": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/youtubei.js/-/youtubei.js-4.3.0.tgz", - "integrity": "sha512-HdU6Awdr1nUWy0Ph7WdmoYPWL0ovx+S4w40eeTzAENr5xiUENsLuXcvULRc2fRCIxi+n7Q6142VVhmM4yK/g5g==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/youtubei.js/-/youtubei.js-6.1.0.tgz", + "integrity": "sha512-EJmPuQ1pLimrcp5nPDSeZHVthT7KJLxp9Z5sYmihXKn1ct8e7cntKaFnPvy5QsbjpipICpDpQEs+d+owDhjgIg==", "funding": [ "https://github.com/sponsors/LuanRT" ], "dependencies": { - "jintr": "^1.0.0", - "linkedom": "^0.14.12", + "jintr": "^1.1.0", "tslib": "^2.5.0", "undici": "^5.19.1" } diff --git a/package.json b/package.json index 73f063e4..e89f893d 100644 --- a/package.json +++ b/package.json @@ -133,7 +133,7 @@ "node-fetch": "2.7.0", "simple-youtube-age-restriction-bypass": "git+https://github.com/zerodytrash/Simple-YouTube-Age-Restriction-Bypass.git#v2.5.9", "vudio": "2.1.1", - "youtubei.js": "4.3.0", + "youtubei.js": "6.1.0", "ytpl": "2.3.0" }, "overrides": { diff --git a/plugins/adblocker/inject.js b/plugins/adblocker/inject.js index be3eb165..8fadec0e 100644 --- a/plugins/adblocker/inject.js +++ b/plugins/adblocker/inject.js @@ -2,9 +2,9 @@ // https://robwu.nl/crxviewer/?crx=https%3A%2F%2Faddons.mozilla.org%2Fen-US%2Ffirefox%2Faddon%2Fadblock-for-youtube%2F /* - Parts of this code is derived from set-constant.js: - https://github.com/gorhill/uBlock/blob/5de0ce975753b7565759ac40983d31978d1f84ca/assets/resources/scriptlets.js#L704 - */ + Parts of this code is derived from set-constant.js: + https://github.com/gorhill/uBlock/blob/5de0ce975753b7565759ac40983d31978d1f84ca/assets/resources/scriptlets.js#L704 + */ { const pruner = function (o) { diff --git a/plugins/crossfade/fader.js b/plugins/crossfade/fader.js index c7d15810..df3c8db2 100644 --- a/plugins/crossfade/fader.js +++ b/plugins/crossfade/fader.js @@ -15,347 +15,342 @@ * v0.2.0, 07/2016 */ -(function (root) { - 'use strict'; +'use strict'; - // Internal utility: check if value is a valid volume level and throw if not - const validateVolumeLevel = (value) => { - // Number between 0 and 1? - if (!Number.isNaN(value) && value >= 0 && value <= 1) { - // Yup, that's fine +// Internal utility: check if value is a valid volume level and throw if not +const validateVolumeLevel = (value) => { + // Number between 0 and 1? + if (!Number.isNaN(value) && value >= 0 && value <= 1) { + // Yup, that's fine + } else { + // Abort and throw an exception + throw new TypeError('Number between 0 and 1 expected as volume!'); + } +}; + +// Main class +class VolumeFader { + /** + * VolumeFader Constructor + * + * @param media {HTMLMediaElement} - audio or video element to be controlled + * @param options {Object} - an object with optional settings + * @throws {TypeError} if options.initialVolume or options.fadeDuration are invalid + * + * options: + * .logger: {Function} logging `function(stuff, …)` for execution information (default: no logging) + * .fadeScaling: {Mixed} either 'linear', 'logarithmic' or a positive number in dB (default: logarithmic) + * .initialVolume: {Number} media volume 0…1 to apply during setup (volume not touched by default) + * .fadeDuration: {Number} time in milliseconds to complete a fade (default: 1000 ms) + */ + constructor(media, options) { + // Passed media element of correct type? + if (media instanceof HTMLMediaElement) { + // Save reference to media element + this.media = media; } else { // Abort and throw an exception - throw new TypeError('Number between 0 and 1 expected as volume!'); - } - }; - - // Main class - class VolumeFader { - /** - * VolumeFader Constructor - * - * @param media {HTMLMediaElement} - audio or video element to be controlled - * @param options {Object} - an object with optional settings - * @throws {TypeError} if options.initialVolume or options.fadeDuration are invalid - * - * options: - * .logger: {Function} logging `function(stuff, …)` for execution information (default: no logging) - * .fadeScaling: {Mixed} either 'linear', 'logarithmic' or a positive number in dB (default: logarithmic) - * .initialVolume: {Number} media volume 0…1 to apply during setup (volume not touched by default) - * .fadeDuration: {Number} time in milliseconds to complete a fade (default: 1000 ms) - */ - constructor(media, options) { - // Passed media element of correct type? - if (media instanceof HTMLMediaElement) { - // Save reference to media element - this.media = media; - } else { - // Abort and throw an exception - throw new TypeError('Media element expected!'); - } - - // Make sure options is an object - options = options || {}; - - // Log function passed? - if (typeof options.logger === 'function') { - // Set log function to the one specified - this.logger = options.logger; - } else { - // Set log function explicitly to false - this.logger = false; - } - - // Linear volume fading? - if (options.fadeScaling == 'linear') { - // Pass levels unchanged - this.scale = { - internalToVolume: (level) => level, - volumeToInternal: (level) => level, - }; - - // Log setting - this.logger && this.logger('Using linear fading.'); - } - // No linear, but logarithmic fading… - else { - let dynamicRange; - - // Default dynamic range? - if ( - options.fadeScaling === undefined - || options.fadeScaling == 'logarithmic' - ) { - // Set default of 60 dB - dynamicRange = 3; - } - // Custom dynamic range? - else if ( - !Number.isNaN(options.fadeScaling) - && options.fadeScaling > 0 - ) { - // Turn amplitude dB into a multiple of 10 power dB - dynamicRange = options.fadeScaling / 2 / 10; - } - // Unsupported value - else { - // Abort and throw exception - throw new TypeError( - "Expected 'linear', 'logarithmic' or a positive number as fade scaling preference!", - ); - } - - // Use exponential/logarithmic scaler for expansion/compression - this.scale = { - internalToVolume: (level) => - this.exponentialScaler(level, dynamicRange), - volumeToInternal: (level) => - this.logarithmicScaler(level, dynamicRange), - }; - - // Log setting if not default - options.fadeScaling - && this.logger - && this.logger( - 'Using logarithmic fading with ' - + String(10 * dynamicRange) - + ' dB dynamic range.', - ); - } - - // Set initial volume? - if (options.initialVolume !== undefined) { - // Validate volume level and throw if invalid - validateVolumeLevel(options.initialVolume); - - // Set initial volume - this.media.volume = options.initialVolume; - - // Log setting - this.logger - && this.logger( - 'Set initial volume to ' + String(this.media.volume) + '.', - ); - } - - // Fade duration given? - if (options.fadeDuration === undefined) { - // Set default fade duration (1000 ms) - this.fadeDuration = 1000; - } else { - // Try to set given fade duration (will log if successful and throw if not) - this.setFadeDuration(options.fadeDuration); - } - - // Indicate that fader is not active yet - this.active = false; - - // Initialization done - this.logger && this.logger('Initialized for', this.media); + throw new TypeError('Media element expected!'); } - /** - * Re(start) the update cycle. - * (this.active must be truthy for volume updates to take effect) - * - * @return {Object} VolumeFader instance for chaining - */ - start() { - // Set fader to be active - this.active = true; + // Make sure options is an object + options = options || {}; - // Start by running the update method - this.updateVolume(); - - // Return instance for chaining - return this; + // Log function passed? + if (typeof options.logger === 'function') { + // Set log function to the one specified + this.logger = options.logger; + } else { + // Set log function explicitly to false + this.logger = false; } - /** - * Stop the update cycle. - * (interrupting any fade) - * - * @return {Object} VolumeFader instance for chaining - */ - stop() { - // Set fader to be inactive - this.active = false; - - // Return instance for chaining - return this; - } - - /** - * Set fade duration. - * (used for future calls to fadeTo) - * - * @param {Number} fadeDuration - fading length in milliseconds - * @throws {TypeError} if fadeDuration is not a number greater than zero - * @return {Object} VolumeFader instance for chaining - */ - setFadeDuration(fadeDuration) { - // If duration is a valid number > 0… - if (!Number.isNaN(fadeDuration) && fadeDuration > 0) { - // Set fade duration - this.fadeDuration = fadeDuration; - - // Log setting - this.logger - && this.logger('Set fade duration to ' + String(fadeDuration) + ' ms.'); - } else { - // Abort and throw an exception - throw new TypeError('Positive number expected as fade duration!'); - } - - // Return instance for chaining - return this; - } - - /** - * Define a new fade and start fading. - * - * @param {Number} targetVolume - level to fade to in the range 0…1 - * @param {Function} callback - (optional) function to be called when fade is complete - * @throws {TypeError} if targetVolume is not in the range 0…1 - * @return {Object} VolumeFader instance for chaining - */ - fadeTo(targetVolume, callback) { - // Validate volume and throw if invalid - validateVolumeLevel(targetVolume); - - // Define new fade - this.fade = { - // Volume start and end point on internal fading scale - volume: { - start: this.scale.volumeToInternal(this.media.volume), - end: this.scale.volumeToInternal(targetVolume), - }, - // Time start and end point - time: { - start: Date.now(), - end: Date.now() + this.fadeDuration, - }, - // Optional callback function - callback, + // Linear volume fading? + if (options.fadeScaling === 'linear') { + // Pass levels unchanged + this.scale = { + internalToVolume: (level) => level, + volumeToInternal: (level) => level, }; - // Start fading - this.start(); - - // Log new fade - this.logger && this.logger('New fade started:', this.fade); - - // Return instance for chaining - return this; + // Log setting + this.logger && this.logger('Using linear fading.'); } + // No linear, but logarithmic fading… + else { + let dynamicRange; - // Convenience shorthand methods for common fades - fadeIn(callback) { - this.fadeTo(1, callback); - } - - fadeOut(callback) { - this.fadeTo(0, callback); - } - - /** - * Internal: Update media volume. - * (calls itself through requestAnimationFrame) - * - * @param {Number} targetVolume - linear level to fade to (0…1) - * @param {Function} callback - (optional) function to be called when fade is complete - */ - updateVolume() { - // Fader active and fade available to process? - if (this.active && this.fade) { - // Get current time - const now = Date.now(); - - // Time left for fading? - if (now < this.fade.time.end) { - // Compute current fade progress - const progress - = (now - this.fade.time.start) - / (this.fade.time.end - this.fade.time.start); - - // Compute current level on internal scale - const level - = progress * (this.fade.volume.end - this.fade.volume.start) - + this.fade.volume.start; - - // Map fade level to volume level and apply it to media element - this.media.volume = this.scale.internalToVolume(level); - - // Schedule next update - root.requestAnimationFrame(this.updateVolume.bind(this)); - } else { - // Log end of fade - this.logger - && this.logger( - 'Fade to ' + String(this.fade.volume.end) + ' complete.', - ); - - // Time is up, jump to target volume - this.media.volume = this.scale.internalToVolume(this.fade.volume.end); - - // Set fader to be inactive - this.active = false; - - // Done, call back (if callable) - typeof this.fade.callback === 'function' && this.fade.callback(); - - // Clear fade - this.fade = undefined; - } + // Default dynamic range? + if ( + options.fadeScaling === undefined + || options.fadeScaling === 'logarithmic' + ) { + // Set default of 60 dB + dynamicRange = 3; } - } - - /** - * Internal: Exponential scaler with dynamic range limit. - * - * @param {Number} input - logarithmic input level to be expanded (float, 0…1) - * @param {Number} dynamicRange - expanded output range, in multiples of 10 dB (float, 0…∞) - * @return {Number} - expanded level (float, 0…1) - */ - exponentialScaler(input, dynamicRange) { - // Special case: make zero (or any falsy input) return zero - if (input == 0) { - // Since the dynamic range is limited, - // allow a zero to produce a plain zero instead of a small faction - // (audio would not be recognized as silent otherwise) - return 0; + // Custom dynamic range? + else if ( + !Number.isNaN(options.fadeScaling) + && options.fadeScaling > 0 + ) { + // Turn amplitude dB into a multiple of 10 power dB + dynamicRange = options.fadeScaling / 2 / 10; + } + // Unsupported value + else { + // Abort and throw exception + throw new TypeError( + "Expected 'linear', 'logarithmic' or a positive number as fade scaling preference!", + ); } - // Scale 0…1 to minus something × 10 dB - input = (input - 1) * dynamicRange; + // Use exponential/logarithmic scaler for expansion/compression + this.scale = { + internalToVolume: (level) => + this.exponentialScaler(level, dynamicRange), + volumeToInternal: (level) => + this.logarithmicScaler(level, dynamicRange), + }; - // Compute power of 10 - return 10 ** input; + // Log setting if not default + options.fadeScaling + && this.logger + && this.logger( + 'Using logarithmic fading with ' + + String(10 * dynamicRange) + + ' dB dynamic range.', + ); } - /** - * Internal: Logarithmic scaler with dynamic range limit. - * - * @param {Number} input - exponential input level to be compressed (float, 0…1) - * @param {Number} dynamicRange - coerced input range, in multiples of 10 dB (float, 0…∞) - * @return {Number} - compressed level (float, 0…1) - */ - logarithmicScaler(input, dynamicRange) { - // Special case: make zero (or any falsy input) return zero - if (input == 0) { - // Logarithm of zero would be -∞, which would map to zero anyway - return 0; + // Set initial volume? + if (options.initialVolume !== undefined) { + // Validate volume level and throw if invalid + validateVolumeLevel(options.initialVolume); + + // Set initial volume + this.media.volume = options.initialVolume; + + // Log setting + this.logger + && this.logger( + 'Set initial volume to ' + String(this.media.volume) + '.', + ); + } + + // Fade duration given? + if (options.fadeDuration === undefined) { + // Set default fade duration (1000 ms) + this.fadeDuration = 1000; + } else { + // Try to set given fade duration (will log if successful and throw if not) + this.setFadeDuration(options.fadeDuration); + } + + // Indicate that fader is not active yet + this.active = false; + + // Initialization done + this.logger && this.logger('Initialized for', this.media); + } + + /** + * Re(start) the update cycle. + * (this.active must be truthy for volume updates to take effect) + * + * @return {Object} VolumeFader instance for chaining + */ + start() { + // Set fader to be active + this.active = true; + + // Start by running the update method + this.updateVolume(); + + // Return instance for chaining + return this; + } + + /** + * Stop the update cycle. + * (interrupting any fade) + * + * @return {Object} VolumeFader instance for chaining + */ + stop() { + // Set fader to be inactive + this.active = false; + + // Return instance for chaining + return this; + } + + /** + * Set fade duration. + * (used for future calls to fadeTo) + * + * @param {Number} fadeDuration - fading length in milliseconds + * @throws {TypeError} if fadeDuration is not a number greater than zero + * @return {Object} VolumeFader instance for chaining + */ + setFadeDuration(fadeDuration) { + // If duration is a valid number > 0… + if (!Number.isNaN(fadeDuration) && fadeDuration > 0) { + // Set fade duration + this.fadeDuration = fadeDuration; + + // Log setting + this.logger + && this.logger('Set fade duration to ' + String(fadeDuration) + ' ms.'); + } else { + // Abort and throw an exception + throw new TypeError('Positive number expected as fade duration!'); + } + + // Return instance for chaining + return this; + } + + /** + * Define a new fade and start fading. + * + * @param {Number} targetVolume - level to fade to in the range 0…1 + * @param {Function} callback - (optional) function to be called when fade is complete + * @throws {TypeError} if targetVolume is not in the range 0…1 + * @return {Object} VolumeFader instance for chaining + */ + fadeTo(targetVolume, callback) { + // Validate volume and throw if invalid + validateVolumeLevel(targetVolume); + + // Define new fade + this.fade = { + // Volume start and end point on internal fading scale + volume: { + start: this.scale.volumeToInternal(this.media.volume), + end: this.scale.volumeToInternal(targetVolume), + }, + // Time start and end point + time: { + start: Date.now(), + end: Date.now() + this.fadeDuration, + }, + // Optional callback function + callback, + }; + + // Start fading + this.start(); + + // Log new fade + this.logger && this.logger('New fade started:', this.fade); + + // Return instance for chaining + return this; + } + + // Convenience shorthand methods for common fades + fadeIn(callback) { + this.fadeTo(1, callback); + } + + fadeOut(callback) { + this.fadeTo(0, callback); + } + + /** + * Internal: Update media volume. + * (calls itself through requestAnimationFrame) + */ + updateVolume() { + // Fader active and fade available to process? + if (this.active && this.fade) { + // Get current time + const now = Date.now(); + + // Time left for fading? + if (now < this.fade.time.end) { + // Compute current fade progress + const progress + = (now - this.fade.time.start) + / (this.fade.time.end - this.fade.time.start); + + // Compute current level on internal scale + const level + = (progress * (this.fade.volume.end - this.fade.volume.start)) + this.fade.volume.start; + + // Map fade level to volume level and apply it to media element + this.media.volume = this.scale.internalToVolume(level); + + // Schedule next update + window.requestAnimationFrame(this.updateVolume.bind(this)); + } else { + // Log end of fade + this.logger + && this.logger( + 'Fade to ' + String(this.fade.volume.end) + ' complete.', + ); + + // Time is up, jump to target volume + this.media.volume = this.scale.internalToVolume(this.fade.volume.end); + + // Set fader to be inactive + this.active = false; + + // Done, call back (if callable) + typeof this.fade.callback === 'function' && this.fade.callback(); + + // Clear fade + this.fade = undefined; } - - // Compute base-10 logarithm - input = Math.log10(input); - - // Scale minus something × 10 dB to 0…1 (clipping at 0) - return Math.max(1 + input / dynamicRange, 0); } } - // Export class to root scope - root.VolumeFader = VolumeFader; -})(window); + /** + * Internal: Exponential scaler with dynamic range limit. + * + * @param {Number} input - logarithmic input level to be expanded (float, 0…1) + * @param {Number} dynamicRange - expanded output range, in multiples of 10 dB (float, 0…∞) + * @return {Number} - expanded level (float, 0…1) + */ + exponentialScaler(input, dynamicRange) { + // Special case: make zero (or any falsy input) return zero + if (input === 0) { + // Since the dynamic range is limited, + // allow a zero to produce a plain zero instead of a small faction + // (audio would not be recognized as silent otherwise) + return 0; + } + + // Scale 0…1 to minus something × 10 dB + input = (input - 1) * dynamicRange; + + // Compute power of 10 + return 10 ** input; + } + + /** + * Internal: Logarithmic scaler with dynamic range limit. + * + * @param {Number} input - exponential input level to be compressed (float, 0…1) + * @param {Number} dynamicRange - coerced input range, in multiples of 10 dB (float, 0…∞) + * @return {Number} - compressed level (float, 0…1) + */ + logarithmicScaler(input, dynamicRange) { + // Special case: make zero (or any falsy input) return zero + if (input === 0) { + // Logarithm of zero would be -∞, which would map to zero anyway + return 0; + } + + // Compute base-10 logarithm + input = Math.log10(input); + + // Scale minus something × 10 dB to 0…1 (clipping at 0) + return Math.max(1 + (input / dynamicRange), 0); + } +} + +module.exports = { + VolumeFader +}; diff --git a/plugins/crossfade/front.js b/plugins/crossfade/front.js index 11517e0a..526623f7 100644 --- a/plugins/crossfade/front.js +++ b/plugins/crossfade/front.js @@ -2,23 +2,25 @@ const { ipcRenderer } = require('electron'); const { Howl } = require('howler'); // Extracted from https://github.com/bitfasching/VolumeFader -require('./fader'); +const { VolumeFader } = require('./fader'); let transitionAudio; // Howler audio used to fade out the current music let firstVideo = true; let waitForTransition; -const defaultConfig = require('../../config/defaults').plugins.crossfade; - +/** + * @type {PluginConfig} + */ const configProvider = require('./config'); +const defaultConfig = require('../../config/defaults').plugins.crossfade; + let config; const configGetNumber = (key) => Number(config[key]) || defaultConfig[key]; const getStreamURL = async (videoID) => { - const url = await ipcRenderer.invoke('audio-url', videoID); - return url; + return await ipcRenderer.invoke('audio-url', videoID); }; const getVideoIDFromURL = (url) => new URLSearchParams(url.split('?')?.at(-1)).get('v'); @@ -26,7 +28,7 @@ const getVideoIDFromURL = (url) => new URLSearchParams(url.split('?')?.at(-1)).g const isReadyToCrossfade = () => transitionAudio && transitionAudio.state() === 'loaded'; const watchVideoIDChanges = (cb) => { - navigation.addEventListener('navigate', (event) => { + window.navigation.addEventListener('navigate', (event) => { const currentVideoID = getVideoIDFromURL( event.currentTarget.currentEntry.url, ); @@ -126,7 +128,7 @@ const crossfade = async (cb) => { } let resolveTransition; - waitForTransition = new Promise((resolve, reject) => { + waitForTransition = new Promise((resolve) => { resolveTransition = resolve; }); diff --git a/plugins/crossfade/menu.js b/plugins/crossfade/menu.js index 8f94135e..c39c14dc 100644 --- a/plugins/crossfade/menu.js +++ b/plugins/crossfade/menu.js @@ -1,10 +1,9 @@ -const config = require('./config'); - -const defaultOptions = require('../../config/defaults').plugins.crossfade; - const prompt = require('custom-electron-prompt'); +const config = require('./config'); + const promptOptions = require('../../providers/prompt-options'); +const defaultOptions = require('../../config/defaults').plugins.crossfade; module.exports = (win) => [ { diff --git a/plugins/discord/back.js b/plugins/discord/back.js index c4eb4bcf..145e20a6 100644 --- a/plugins/discord/back.js +++ b/plugins/discord/back.js @@ -174,10 +174,10 @@ module.exports = (win, { autoReconnect, activityTimoutEnabled, activityTimoutTim } } else if (!hideDurationLeft) { // Add the start and end time of the song - const songStartTime = Date.now() - songInfo.elapsedSeconds * 1000; + const songStartTime = Date.now() - (songInfo.elapsedSeconds * 1000); activityInfo.startTimestamp = songStartTime; activityInfo.endTimestamp - = songStartTime + songInfo.songDuration * 1000; + = songStartTime + (songInfo.songDuration * 1000); } info.rpc.user?.setActivity(activityInfo).catch(console.error); diff --git a/plugins/downloader/back.js b/plugins/downloader/back.js index 09bfd650..9144f83c 100644 --- a/plugins/downloader/back.js +++ b/plugins/downloader/back.js @@ -31,6 +31,8 @@ const { sendFeedback: sendFeedback_, } = require('./utils'); +const config = require('./config'); + const { fetchFromGenius } = require('../lyrics-genius/back'); const { isEnabled } = require('../../config/plugins'); const { getImage, cleanupName } = require('../../providers/song-info'); @@ -39,8 +41,6 @@ const { cache } = require('../../providers/decorators'); const ffmpegMutex = new Mutex(); -const config = require('./config'); - /** @type {Innertube} */ let yt; let win; @@ -187,14 +187,14 @@ async function downloadSongUnsafe( return; } - const download_options = { + const downloadOptions = { type: 'audio', // Audio, video or video+audio quality: 'best', // Best, bestefficiency, 144p, 240p, 480p, 720p and so on. format: 'any', // Media container format }; - const format = info.chooseFormat(download_options); - const stream = await info.download(download_options); + const format = info.chooseFormat(downloadOptions); + const stream = await info.download(downloadOptions); console.info( `Downloading ${metadata.artist} - ${metadata.title} [${metadata.id}]`, @@ -244,14 +244,14 @@ async function downloadSongUnsafe( async function iterableStreamToMP3( stream, metadata, - content_length, + contentLength, sendFeedback, increasePlaylistProgress = () => { }, ) { const chunks = []; let downloaded = 0; - const total = content_length; + const total = contentLength; for await (const chunk of stream) { downloaded += chunk.length; chunks.push(chunk); @@ -281,7 +281,7 @@ async function iterableStreamToMP3( ffmpeg.setProgress(({ ratio }) => { sendFeedback(`Converting: ${Math.floor(ratio * 100)}%`, ratio); - increasePlaylistProgress(0.15 + ratio * 0.85); + increasePlaylistProgress(0.15 + (ratio * 0.85)); }); await ffmpeg.run( @@ -377,7 +377,7 @@ async function downloadPlaylist(givenUrl) { }); } catch (error) { sendError( - `Error getting playlist info: make sure it isn\'t a private or "Mixed for you" playlist\n\n${error}`, + `Error getting playlist info: make sure it isn't a private or "Mixed for you" playlist\n\n${error}`, ); return; } @@ -434,7 +434,7 @@ async function downloadPlaylist(givenUrl) { const increaseProgress = (itemPercentage) => { const currentProgress = (counter - 1) / playlist.items.length; - const newProgress = currentProgress + progressStep * itemPercentage; + const newProgress = currentProgress + (progressStep * itemPercentage); win.setProgressBar(newProgress); }; diff --git a/plugins/downloader/front.js b/plugins/downloader/front.js index f04e55f5..ef486a24 100644 --- a/plugins/downloader/front.js +++ b/plugins/downloader/front.js @@ -41,7 +41,7 @@ const menuObserver = new MutationObserver(() => { // TODO: re-enable once contextIsolation is set to true // contextBridge.exposeInMainWorld("downloader", { -// download: () => { +// download: () => { global.download = () => { let videoUrl = getSongMenu() // Selector of first button which is always "Start Radio" diff --git a/plugins/in-app-menu/front.js b/plugins/in-app-menu/front.js index 6533dd84..83d8fe38 100644 --- a/plugins/in-app-menu/front.js +++ b/plugins/in-app-menu/front.js @@ -8,7 +8,7 @@ function $(selector) { return document.querySelector(selector); } -module.exports = (options) => { +module.exports = () => { const visible = () => Boolean($('.cet-menubar').firstChild); const bar = new Titlebar({ icon: 'https://cdn-icons-png.flaticon.com/512/5358/5358672.png', @@ -38,7 +38,7 @@ module.exports = (options) => { }); if (isEnabled('picture-in-picture')) { - ipcRenderer.on('pip-toggle', (_, pipEnabled) => { + ipcRenderer.on('pip-toggle', () => { bar.refreshMenu(); }); } @@ -62,7 +62,7 @@ function setupSearchOpenObserver() { } function setupMenuOpenObserver() { - const menuOpenObserver = new MutationObserver((mutations) => { + const menuOpenObserver = new MutationObserver(() => { $('#nav-bar-background').style.webkitAppRegion = [...$('.cet-menubar').childNodes].some((c) => c.classList.contains('open')) ? 'no-drag' : 'drag'; diff --git a/plugins/last-fm/back.js b/plugins/last-fm/back.js index 8153de81..ae63af27 100644 --- a/plugins/last-fm/back.js +++ b/plugins/last-fm/back.js @@ -16,10 +16,10 @@ const createFormData = (parameters) => { return formData; }; -const createQueryString = (parameters, api_sig) => { +const createQueryString = (parameters, apiSignature) => { // Creates a querystring const queryData = []; - parameters.api_sig = api_sig; + parameters.api_sig = apiSignature; for (const key in parameters) { queryData.push(`${encodeURIComponent(key)}=${encodeURIComponent(parameters[key])}`); } @@ -49,15 +49,15 @@ const createApiSig = (parameters, secret) => { return sig; }; -const createToken = async ({ api_key, api_root, secret }) => { +const createToken = async ({ apiKey, apiRoot, secret }) => { // Creates and stores the auth token const data = { method: 'auth.gettoken', - api_key, + apiKey, format: 'json', }; - const api_sig = createApiSig(data, secret); - let response = await fetch(`${api_root}${createQueryString(data, api_sig)}`); + const apiSigature = createApiSig(data, secret); + let response = await fetch(`${apiRoot}${createQueryString(data, apiSigature)}`); response = await response.json(); return response?.token; }; @@ -78,8 +78,8 @@ const getAndSetSessionKey = async (config) => { method: 'auth.getsession', token: config.token, }; - const api_sig = createApiSig(data, config.secret); - let res = await fetch(`${config.api_root}${createQueryString(data, api_sig)}`); + const apiSignature = createApiSig(data, config.secret); + let res = await fetch(`${config.api_root}${createQueryString(data, apiSignature)}`); res = await res.json(); if (res.error) { await authenticate(config); @@ -110,7 +110,7 @@ const postSongDataToAPI = async (songInfo, config, data) => { postData.api_sig = createApiSig(postData, config.secret); fetch('https://ws.audioscrobbler.com/2.0/', { method: 'POST', body: createFormData(postData) }) .catch((error) => { - if (error.response.data.error == 9) { + if (error.response.data.error === 9) { // Session key is invalid, so remove it from the config and reauthenticate config.session_key = undefined; setOptions('last-fm', config); diff --git a/plugins/lyrics-genius/back.js b/plugins/lyrics-genius/back.js index 347470f1..b0a19d78 100644 --- a/plugins/lyrics-genius/back.js +++ b/plugins/lyrics-genius/back.js @@ -8,7 +8,7 @@ const fetch = require('node-fetch'); const { cleanupName } = require('../../providers/song-info'); const { injectCSS } = require('../utils'); -const eastAsianChars = /\p{Script=Han}|\p{Script=Katakana}|\p{Script=Hiragana}|\p{Script=Hangul}|\p{Script=Han}/u; +const eastAsianChars = /\p{Script=Katakana}|\p{Script=Hiragana}|\p{Script=Hangul}|\p{Script=Han}/u; let revRomanized = false; module.exports = async (win, options) => { @@ -89,7 +89,7 @@ const getLyricsList = async (queryString) => { * @returns The lyrics of the song URL provided, null if none */ const getLyrics = async (url) => { - response = await fetch(url); + const response = await fetch(url); if (!response.ok) { return null; } diff --git a/plugins/lyrics-genius/front.js b/plugins/lyrics-genius/front.js index 4139b4b1..b7d0bf7b 100644 --- a/plugins/lyrics-genius/front.js +++ b/plugins/lyrics-genius/front.js @@ -65,14 +65,14 @@ module.exports = () => { function setLyrics(lyricsContainer) { lyricsContainer.innerHTML = `
- ${ + ${ hasLyrics ? lyrics.replaceAll(/\r\n|\r|\n/g, '
') : 'Could not retrieve lyrics from genius' } -
- `; + + `; if (hasLyrics) { lyricsContainer.querySelector('.footer').textContent = 'Source: Genius'; enableLyricsTab(); diff --git a/plugins/lyrics-genius/menu.js b/plugins/lyrics-genius/menu.js index e2af715b..1c771cbe 100644 --- a/plugins/lyrics-genius/menu.js +++ b/plugins/lyrics-genius/menu.js @@ -2,7 +2,7 @@ const { toggleRomanized } = require('./back'); const { setOptions } = require('../../config/plugins'); -module.exports = (win, options, refreshMenu) => [ +module.exports = (win, options) => [ { label: 'Romanized Lyrics', type: 'checkbox', diff --git a/plugins/no-google-login/front.js b/plugins/no-google-login/front.js index c51a3255..57ac376d 100644 --- a/plugins/no-google-login/front.js +++ b/plugins/no-google-login/front.js @@ -15,7 +15,7 @@ function removeLoginElements() { const libraryIconPath = 'M16,6v2h-2v5c0,1.1-0.9,2-2,2s-2-0.9-2-2s0.9-2,2-2c0.37,0,0.7,0.11,1,0.28V6H16z M18,20H4V6H3v15h15V20z M21,3H6v15h15V3z M7,4h13v13H7V4z'; const observer = new MutationObserver(() => { - menuEntries = document.querySelectorAll( + const menuEntries = document.querySelectorAll( '#items ytmusic-guide-entry-renderer', ); for (const item of menuEntries) { diff --git a/plugins/notifications/interactive.js b/plugins/notifications/interactive.js index d41b289d..bb0fdc94 100644 --- a/plugins/notifications/interactive.js +++ b/plugins/notifications/interactive.js @@ -2,8 +2,11 @@ const path = require('node:path'); const { Notification, app, ipcMain } = require('electron'); -const { notificationImage, icons, save_temp_icons, secondsToMinutes, ToastStyles } = require('./utils'); +const { notificationImage, icons, saveTempIcon, secondsToMinutes, ToastStyles } = require('./utils'); +/** + * @type {PluginConfig} + */ const config = require('./config'); const getSongControls = require('../../providers/song-controls'); @@ -25,7 +28,7 @@ module.exports = (win) => { ipcMain.on('timeChanged', (_, t) => currentSeconds = t); if (app.isPackaged) { - save_temp_icons(); + saveTempIcon(); } let savedSongInfo; @@ -108,42 +111,42 @@ function sendNotification(songInfo) { // https://learn.microsoft.com/en-us/windows/apps/design/shell/tiles-and-notifications/toast-schema // https://learn.microsoft.com/en-us/windows/apps/design/shell/tiles-and-notifications/adaptive-interactive-toasts?tabs=xml // https://learn.microsoft.com/en-us/uwp/api/windows.ui.notifications.toasttemplatetype - toastXml: get_xml(songInfo, iconSrc), + toastXml: getXml(songInfo, iconSrc), }); - savedNotification.on('close', (_) => { + savedNotification.on('close', () => { savedNotification = undefined; }); savedNotification.show(); } -const get_xml = (songInfo, iconSrc) => { +const getXml = (songInfo, iconSrc) => { switch (config.get('toastStyle')) { default: case ToastStyles.logo: case ToastStyles.legacy: { - return xml_logo(songInfo, iconSrc); + return xmlLogo(songInfo, iconSrc); } case ToastStyles.banner_top_custom: { - return xml_banner_top_custom(songInfo, iconSrc); + return xmlBannerTopCustom(songInfo, iconSrc); } case ToastStyles.hero: { - return xml_hero(songInfo, iconSrc); + return xmlHero(songInfo, iconSrc); } case ToastStyles.banner_bottom: { - return xml_banner_bottom(songInfo, iconSrc); + return xmlBannerBottom(songInfo, iconSrc); } case ToastStyles.banner_centered_bottom: { - return xml_banner_centered_bottom(songInfo, iconSrc); + return xmlBannerCenteredBottom(songInfo, iconSrc); } case ToastStyles.banner_centered_top: { - return xml_banner_centered_top(songInfo, iconSrc); + return xmlBannerCenteredTop(songInfo, iconSrc); } } }; @@ -186,19 +189,19 @@ const toast = (content, isPaused) => `\ ${getButtons(isPaused)} `; -const xml_image = ({ title, artist, isPaused }, imgSrc, placement) => toast(`\ +const xmlImage = ({ title, artist, isPaused }, imgSrc, placement) => toast(`\ ${title} ${artist}\ `, isPaused); -const xml_logo = (songInfo, imgSrc) => xml_image(songInfo, imgSrc, 'placement="appLogoOverride"'); +const xmlLogo = (songInfo, imgSrc) => xmlImage(songInfo, imgSrc, 'placement="appLogoOverride"'); -const xml_hero = (songInfo, imgSrc) => xml_image(songInfo, imgSrc, 'placement="hero"'); +const xmlHero = (songInfo, imgSrc) => xmlImage(songInfo, imgSrc, 'placement="hero"'); -const xml_banner_bottom = (songInfo, imgSrc) => xml_image(songInfo, imgSrc, ''); +const xmlBannerBottom = (songInfo, imgSrc) => xmlImage(songInfo, imgSrc, ''); -const xml_banner_top_custom = (songInfo, imgSrc) => toast(`\ +const xmlBannerTopCustom = (songInfo, imgSrc) => toast(`\ @@ -206,11 +209,11 @@ const xml_banner_top_custom = (songInfo, imgSrc) => toast(`\ ${songInfo.title} ${songInfo.artist} - ${xml_more_data(songInfo)} + ${xmlMoreData(songInfo)} \ `, songInfo.isPaused); -const xml_more_data = ({ album, elapsedSeconds, songDuration }) => `\ +const xmlMoreData = ({ album, elapsedSeconds, songDuration }) => `\ ${album ? `${album}` : ''} @@ -218,7 +221,7 @@ const xml_more_data = ({ album, elapsedSeconds, songDuration }) => `\ \ `; -const xml_banner_centered_bottom = ({ title, artist, isPaused }, imgSrc) => toast(`\ +const xmlBannerCenteredBottom = ({ title, artist, isPaused }, imgSrc) => toast(`\ @@ -229,7 +232,7 @@ const xml_banner_centered_bottom = ({ title, artist, isPaused }, imgSrc) => toas \ `, isPaused); -const xml_banner_centered_top = ({ title, artist, isPaused }, imgSrc) => toast(`\ +const xmlBannerCenteredTop = ({ title, artist, isPaused }, imgSrc) => toast(`\ diff --git a/plugins/notifications/utils.js b/plugins/notifications/utils.js index 4f992f41..6158bb3f 100644 --- a/plugins/notifications/utils.js +++ b/plugins/notifications/utils.js @@ -69,18 +69,18 @@ module.exports.notificationImage = (songInfo) => { } }; -module.exports.saveImage = cache((img, save_path) => { +module.exports.saveImage = cache((img, savePath) => { try { - fs.writeFileSync(save_path, img.toPNG()); + fs.writeFileSync(savePath, img.toPNG()); } catch (error) { console.log(`Error writing song icon to disk:\n${error.toString()}`); return icon; } - return save_path; + return savePath; }); -module.exports.save_temp_icons = () => { +module.exports.saveTempIcon = () => { for (const kind of Object.keys(module.exports.icons)) { const destinationPath = path.join(userData, 'icons', `${kind}.png`); if (fs.existsSync(destinationPath)) { diff --git a/plugins/picture-in-picture/back.js b/plugins/picture-in-picture/back.js index 040c3fe9..85046057 100644 --- a/plugins/picture-in-picture/back.js +++ b/plugins/picture-in-picture/back.js @@ -1,7 +1,6 @@ const path = require('node:path'); const { app, ipcMain } = require('electron'); -const electronLocalshortcut = require('electron-localshortcut'); const { setOptions } = require('../../config/plugins'); const { injectCSS } = require('../utils'); diff --git a/plugins/picture-in-picture/front.js b/plugins/picture-in-picture/front.js index 0033d6cb..188cc694 100644 --- a/plugins/picture-in-picture/front.js +++ b/plugins/picture-in-picture/front.js @@ -52,7 +52,7 @@ const observer = new MutationObserver(() => { menu.prepend(pipButton); }); -global.togglePictureInPicture = async () => { +const togglePictureInPicture = async () => { if (useNativePiP) { const isInPiP = document.pictureInPictureElement !== null; const video = $('video'); @@ -72,6 +72,7 @@ global.togglePictureInPicture = async () => { ipcRenderer.send('picture-in-picture'); return false; }; +global.togglePictureInPicture = togglePictureInPicture; const listenForToggle = () => { const originalExitButton = $('.exit-fullscreen-button'); @@ -123,7 +124,7 @@ function observeMenu(options) { listenForToggle(); cloneButton('.player-minimize-button').addEventListener('click', async () => { - await global.togglePictureInPicture(); + await togglePictureInPicture(); setTimeout(() => $('#player').click()); }); diff --git a/plugins/playback-speed/front.js b/plugins/playback-speed/front.js index 1f0aaa43..7c01208f 100644 --- a/plugins/playback-speed/front.js +++ b/plugins/playback-speed/front.js @@ -56,8 +56,9 @@ const observePopupContainer = () => { }; const observeVideo = () => { - $('video').addEventListener('ratechange', forcePlaybackRate); - $('video').addEventListener('srcChanged', forcePlaybackRate); + const video = $('video');+ + video.addEventListener('ratechange', forcePlaybackRate); + video.addEventListener('srcChanged', forcePlaybackRate); }; const setupWheelListener = () => { diff --git a/plugins/precise-volume/back.js b/plugins/precise-volume/back.js index 4eab7ca3..e9215973 100644 --- a/plugins/precise-volume/back.js +++ b/plugins/precise-volume/back.js @@ -1,15 +1,15 @@ -const { injectCSS } = require('../utils'); - const path = require('node:path'); +const { globalShortcut } = require('electron'); + +const { injectCSS } = require('../utils'); + /* This is used to determine if plugin is actually active (not if its only enabled in options) */ let enabled = false; -const { globalShortcut } = require('electron'); - module.exports = (win, options) => { enabled = true; injectCSS(win.webContents, path.join(__dirname, 'volume-hud.css')); diff --git a/plugins/precise-volume/front.js b/plugins/precise-volume/front.js index 4c89f326..a8e8f818 100644 --- a/plugins/precise-volume/front.js +++ b/plugins/precise-volume/front.js @@ -26,7 +26,7 @@ const writeOptions = debounce(() => { setOptions('precise-volume', options); }, 1000); -module.exports.moveVolumeHud = debounce((showVideo) => { +const moveVolumeHud = debounce((showVideo) => { const volumeHud = $('#volumeHud'); if (!volumeHud) { return; @@ -36,6 +36,7 @@ module.exports.moveVolumeHud = debounce((showVideo) => { ? `${($('ytmusic-player').clientHeight - $('video').clientHeight) / 2}px` : 0; }, 250); +module.exports.moveVolumeHud = moveVolumeHud; const hideVolumeHud = debounce((volumeHud) => { volumeHud.style.opacity = 0; @@ -215,7 +216,7 @@ const tooltipTargets = [ ]; function setTooltip(volume) { - for (target of tooltipTargets) { + for (const target of tooltipTargets) { $(target).title = `${volume}%`; } } diff --git a/plugins/precise-volume/menu.js b/plugins/precise-volume/menu.js index 8f4316b0..ea4c0ff5 100644 --- a/plugins/precise-volume/menu.js +++ b/plugins/precise-volume/menu.js @@ -6,7 +6,7 @@ const { setMenuOptions } = require('../../config/plugins'); const promptOptions = require('../../providers/prompt-options'); function changeOptions(changedOptions, options, win) { - for (option in changedOptions) { + for (const option in changedOptions) { options[option] = changedOptions[option]; } diff --git a/plugins/quality-changer/front.js b/plugins/quality-changer/front.js index e5f2885f..0ee25ce8 100644 --- a/plugins/quality-changer/front.js +++ b/plugins/quality-changer/front.js @@ -15,6 +15,15 @@ module.exports = () => { }; function setup(event) { + /** + * @type {{ + * getAvailableQualityLevels: () => string[], + * getPlaybackQuality: () => string, + * getAvailableQualityLabels: () => string[], + * setPlaybackQualityRange: (quality: string) => void, + * setPlaybackQuality: (quality: string) => void, + * }} + */ const api = event.detail; $('.top-row-buttons.ytmusic-player').prepend(qualitySettingsButton); diff --git a/plugins/shortcuts/mpris.js b/plugins/shortcuts/mpris.js index f9546b1b..9fe2e4e6 100644 --- a/plugins/shortcuts/mpris.js +++ b/plugins/shortcuts/mpris.js @@ -6,7 +6,7 @@ const getSongControls = require('../../providers/song-controls'); const config = require('../../config'); function setupMPRIS() { - const player = mpris({ + return mpris({ name: 'youtube-music', identity: 'YouTube Music', canRaise: true, @@ -15,8 +15,6 @@ function setupMPRIS() { supportedInterfaces: ['player'], desktopEntry: 'youtube-music', }); - - return player; } /** @param {Electron.BrowserWindow} win */ @@ -108,7 +106,9 @@ function registerMPRIS(win) { player.on('position', seekTo); player.on('shuffle', (enableShuffle) => { - shuffle(); + if (enableShuffle) { + shuffle(); + } }); let mprisVolNewer = false; diff --git a/plugins/tuna-obs/back.js b/plugins/tuna-obs/back.js index 53ab429e..f3f2db87 100644 --- a/plugins/tuna-obs/back.js +++ b/plugins/tuna-obs/back.js @@ -18,7 +18,7 @@ const data = { const post = async (data) => { const port = 1608; - headers = { + const headers = { 'Content-Type': 'application/json', 'Accept': 'application/json', 'Access-Control-Allow-Headers': '*', @@ -43,15 +43,6 @@ module.exports = async (win) => { data.progress = secToMilisec(t); post(data); }); - ipcMain.on('playPaused', (_, { isPaused, elapsedSeconds }) => { - if (!data.title) { - return; - } - - data.status = isPaused ? 'stopped' : 'playing'; - data.progress = secToMilisec(elapsedSeconds); - post(data); - }); registerCallback((songInfo) => { if (!songInfo.title && !songInfo.artist) { diff --git a/plugins/visualizer/back.js b/plugins/visualizer/back.js index 3ec1a80e..7a884474 100644 --- a/plugins/visualizer/back.js +++ b/plugins/visualizer/back.js @@ -2,6 +2,6 @@ const path = require('node:path'); const { injectCSS } = require('../utils'); -module.exports = (win, options) => { +module.exports = (win) => { injectCSS(win.webContents, path.join(__dirname, 'empty-player.css')); }; diff --git a/plugins/visualizer/visualizers/wave.js b/plugins/visualizer/visualizers/wave.js index 9088f7dd..f594c785 100644 --- a/plugins/visualizer/visualizers/wave.js +++ b/plugins/visualizer/visualizers/wave.js @@ -17,12 +17,13 @@ class WaveVisualizer { for (const animation of options.animations) { this.visualizer.addAnimation( eval(`new this.visualizer.animations.${animation.type}( - ${JSON.stringify(animation.config)} - )`), + ${JSON.stringify(animation.config)} + )`), ); } } + // eslint-disable-next-line no-unused-vars resize(width, height) { } diff --git a/providers/song-info-front.js b/providers/song-info-front.js index aa63a608..86a419b1 100644 --- a/providers/song-info-front.js +++ b/providers/song-info-front.js @@ -17,19 +17,21 @@ ipcRenderer.on('update-song-info', async (_, extractedSongInfo) => { // Used because 'loadeddata' or 'loadedmetadata' weren't firing on song start for some users (https://github.com/th-ch/youtube-music/issues/473) const srcChangedEvent = new CustomEvent('srcChanged'); -module.exports.setupSeekedListener = singleton(() => { +const setupSeekedListener = singleton(() => { $('video')?.addEventListener('seeked', (v) => ipcRenderer.send('seeked', v.target.currentTime)); }); +module.exports.setupSeekedListener = setupSeekedListener; -module.exports.setupTimeChangedListener = singleton(() => { +const setupTimeChangedListener = singleton(() => { const progressObserver = new MutationObserver((mutations) => { ipcRenderer.send('timeChanged', mutations[0].target.value); global.songInfo.elapsedSeconds = mutations[0].target.value; }); progressObserver.observe($('#progress-bar'), { attributeFilter: ['value'] }); }); +module.exports.setupTimeChangedListener = setupTimeChangedListener; -module.exports.setupRepeatChangedListener = singleton(() => { +const setupRepeatChangedListener = singleton(() => { const repeatObserver = new MutationObserver((mutations) => { ipcRenderer.send('repeatChanged', mutations[0].target.__dataHost.getState().queue.repeatMode); }); @@ -38,53 +40,66 @@ module.exports.setupRepeatChangedListener = singleton(() => { // Emit the initial value as well; as it's persistent between launches. ipcRenderer.send('repeatChanged', $('ytmusic-player-bar').getState().queue.repeatMode); }); +module.exports.setupRepeatChangedListener = setupRepeatChangedListener; -module.exports.setupVolumeChangedListener = singleton((api) => { - $('video').addEventListener('volumechange', (_) => { +const setupVolumeChangedListener = singleton((api) => { + $('video').addEventListener('volumechange', () => { ipcRenderer.send('volumeChanged', api.getVolume()); }); // Emit the initial value as well; as it's persistent between launches. ipcRenderer.send('volumeChanged', api.getVolume()); }); +module.exports.setupVolumeChangedListener = setupVolumeChangedListener; module.exports = () => { document.addEventListener('apiLoaded', (apiEvent) => { ipcRenderer.on('setupTimeChangedListener', async () => { - this.setupTimeChangedListener(); + setupTimeChangedListener(); }); ipcRenderer.on('setupRepeatChangedListener', async () => { - this.setupRepeatChangedListener(); + setupRepeatChangedListener(); }); ipcRenderer.on('setupVolumeChangedListener', async () => { - this.setupVolumeChangedListener(apiEvent.detail); + setupVolumeChangedListener(apiEvent.detail); }); ipcRenderer.on('setupSeekedListener', async () => { - this.setupSeekedListener(); + setupSeekedListener(); }); + const playPausedHandler = (e, status) => { + if (Math.round(e.target.currentTime) > 0) { + ipcRenderer.send('playPaused', { + isPaused: status === 'pause', + elapsedSeconds: Math.floor(e.target.currentTime), + }); + } + }; + + const playPausedHandlers = { + playing: (e) => playPausedHandler(e, 'playing'), + pause: (e) => playPausedHandler(e, 'pause'), + }; + const video = $('video'); + // Name = "dataloaded" and abit later "dataupdated" - apiEvent.detail.addEventListener('videodatachange', (name, _dataEvent) => { + apiEvent.detail.addEventListener('videodatachange', (name) => { if (name !== 'dataloaded') { return; } video.dispatchEvent(srcChangedEvent); + for (const status of ['playing', 'pause']) { // for fix issue that pause event not fired + video.addEventListener(status, playPausedHandlers[status]); + } setTimeout(sendSongInfo, 200); }); for (const status of ['playing', 'pause']) { - video.addEventListener(status, (e) => { - if (Math.round(e.target.currentTime) > 0) { - ipcRenderer.send('playPaused', { - isPaused: status === 'pause', - elapsedSeconds: Math.floor(e.target.currentTime), - }); - } - }); + video.addEventListener(status, playPausedHandlers[status]); } function sendSongInfo() { From 92da06eb96ccb63ca9210b8ec1f9af5ceb8542af Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Tue, 29 Aug 2023 19:37:31 +0900 Subject: [PATCH 08/70] fix(in-app-menu): custom-electron-titlebar --- package-lock.json | 2 +- package.json | 3 ++- plugins/in-app-menu/front.js | 8 ++++---- providers/prompt-custom-titlebar.js | 4 ++-- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4792fc5b..aa37f37f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,6 @@ "butterchurn-presets": "2.4.7", "custom-electron-prompt": "1.5.7", "custom-electron-titlebar": "4.2.7", - "electron": "26.1.0", "electron-better-web-request": "1.0.1", "electron-debug": "3.2.0", "electron-is": "3.0.0", @@ -46,6 +45,7 @@ "@playwright/test": "1.37.1", "auto-changelog": "2.4.0", "del-cli": "5.0.1", + "electron": "26.1.0", "electron-builder": "24.6.3", "electron-devtools-installer": "3.2.0", "eslint": "8.48.0", diff --git a/package.json b/package.json index e89f893d..6cba4a23 100644 --- a/package.json +++ b/package.json @@ -91,6 +91,7 @@ "build:mac": "npm run clean && electron-builder --mac dmg:x64 -p never", "build:mac:arm64": "npm run clean && electron-builder --mac dmg:arm64 -p never", "build:win": "npm run clean && electron-builder --win -p never", + "build:win:x64": "npm run clean && electron-builder --win nsis:x64 -p never", "lint": "xo", "changelog": "auto-changelog", "plugins": "npm run plugin:adblocker && npm run plugin:bypass-age-restrictions", @@ -115,7 +116,6 @@ "butterchurn-presets": "2.4.7", "custom-electron-prompt": "1.5.7", "custom-electron-titlebar": "4.2.7", - "electron": "26.1.0", "electron-better-web-request": "1.0.1", "electron-debug": "3.2.0", "electron-is": "3.0.0", @@ -144,6 +144,7 @@ "@playwright/test": "1.37.1", "auto-changelog": "2.4.0", "del-cli": "5.0.1", + "electron": "26.1.0", "electron-builder": "24.6.3", "electron-devtools-installer": "3.2.0", "eslint": "8.48.0", diff --git a/plugins/in-app-menu/front.js b/plugins/in-app-menu/front.js index 83d8fe38..8e2175dd 100644 --- a/plugins/in-app-menu/front.js +++ b/plugins/in-app-menu/front.js @@ -1,5 +1,5 @@ const { ipcRenderer } = require('electron'); -const { Titlebar, Color } = require('custom-electron-titlebar'); +const { Titlebar, TitlebarColor } = require('custom-electron-titlebar'); const config = require('../../config'); const { isEnabled } = require('../../config/plugins'); @@ -12,9 +12,9 @@ module.exports = () => { const visible = () => Boolean($('.cet-menubar').firstChild); const bar = new Titlebar({ icon: 'https://cdn-icons-png.flaticon.com/512/5358/5358672.png', - backgroundColor: Color.fromHex('#050505'), - itemBackgroundColor: Color.fromHex('#1d1d1d'), - svgColor: Color.WHITE, + backgroundColor: TitlebarColor.fromHex('#050505'), + itemBackgroundColor: TitlebarColor.fromHex('#1d1d1d'), + svgColor: TitlebarColor.WHITE, menu: config.get('options.hideMenu') ? null : undefined, }); bar.updateTitle(' '); diff --git a/providers/prompt-custom-titlebar.js b/providers/prompt-custom-titlebar.js index 852013a8..0c4a87bb 100644 --- a/providers/prompt-custom-titlebar.js +++ b/providers/prompt-custom-titlebar.js @@ -1,8 +1,8 @@ -const { Titlebar, Color } = require('custom-electron-titlebar'); +const { Titlebar, TitlebarColor } = require('custom-electron-titlebar'); module.exports = () => { new Titlebar({ - backgroundColor: Color.fromHex('#050505'), + backgroundColor: TitlebarColor.fromHex('#050505'), minimizable: false, maximizable: false, menu: null, From aacc2d261b1c9935eb271532a7cfcef571bda02b Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Tue, 29 Aug 2023 21:15:22 +0900 Subject: [PATCH 09/70] chore(deps): remove node-fetch, migration to node v18 fetch API --- package-lock.json | 3480 ++++++++++----------------- package.json | 9 +- plugins/adblocker/blocker.js | 1 - plugins/in-app-menu/front.js | 8 +- plugins/last-fm/back.js | 1 - plugins/lyrics-genius/back.js | 4 +- plugins/sponsorblock/back.js | 5 +- plugins/tuna-obs/back.js | 3 +- providers/prompt-custom-titlebar.js | 4 +- providers/song-info.js | 5 +- 10 files changed, 1342 insertions(+), 2178 deletions(-) diff --git a/package-lock.json b/package-lock.json index aa37f37f..070644d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,8 +11,8 @@ "license": "MIT", "dependencies": { "@cliqz/adblocker-electron": "1.26.6", - "@ffmpeg/core": "0.12.2", - "@ffmpeg/ffmpeg": "0.12.5", + "@ffmpeg/core": "0.11.0", + "@ffmpeg/ffmpeg": "0.11.6", "@foobar404/wave": "2.0.4", "@xhayper/discord-rpc": "1.0.22", "async-mutex": "0.4.0", @@ -20,7 +20,7 @@ "butterchurn": "2.6.7", "butterchurn-presets": "2.4.7", "custom-electron-prompt": "1.5.7", - "custom-electron-titlebar": "4.2.7", + "custom-electron-titlebar": "4.1.6", "electron-better-web-request": "1.0.1", "electron-debug": "3.2.0", "electron-is": "3.0.0", @@ -35,7 +35,6 @@ "keyboardevents-areequal": "0.2.2", "md5": "2.3.0", "mpris-service": "2.1.2", - "node-fetch": "2.7.0", "simple-youtube-age-restriction-bypass": "git+https://github.com/zerodytrash/Simple-YouTube-Age-Restriction-Bypass.git#v2.5.9", "vudio": "2.1.1", "youtubei.js": "6.1.0", @@ -52,6 +51,7 @@ "eslint-plugin-import": "2.28.1", "eslint-plugin-prettier": "5.0.0", "node-gyp": "9.4.0", + "patch-package": "^8.0.0", "playwright": "1.37.1" }, "engines": { @@ -60,18 +60,16 @@ }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/@babel/code-frame": { "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" @@ -82,9 +80,8 @@ }, "node_modules/@babel/code-frame/node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -94,9 +91,8 @@ }, "node_modules/@babel/code-frame/node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -108,42 +104,37 @@ }, "node_modules/@babel/code-frame/node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "1.1.3" } }, "node_modules/@babel/code-frame/node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/@babel/code-frame/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@babel/code-frame/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -153,18 +144,16 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.4.2", @@ -176,9 +165,8 @@ }, "node_modules/@babel/highlight/node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -188,9 +176,8 @@ }, "node_modules/@babel/highlight/node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -202,42 +189,37 @@ }, "node_modules/@babel/highlight/node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "1.1.3" } }, "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@babel/highlight/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -247,8 +229,7 @@ }, "node_modules/@babel/runtime": { "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.11.tgz", - "integrity": "sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==", + "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -258,8 +239,7 @@ }, "node_modules/@cliqz/adblocker": { "version": "1.26.6", - "resolved": "https://registry.npmjs.org/@cliqz/adblocker/-/adblocker-1.26.6.tgz", - "integrity": "sha512-fSNCvyl0FRgKcc2NmHEhaQqeTT0QCLBT3eVZ15ah6baPdCaQm7N5IN/annv9bRalS8Lwbxymb3TBLzXpFTghrw==", + "license": "MPL-2.0", "dependencies": { "@cliqz/adblocker-content": "^1.26.6", "@cliqz/adblocker-extended-selectors": "^1.26.6", @@ -273,16 +253,14 @@ }, "node_modules/@cliqz/adblocker-content": { "version": "1.26.6", - "resolved": "https://registry.npmjs.org/@cliqz/adblocker-content/-/adblocker-content-1.26.6.tgz", - "integrity": "sha512-cebc5AjL/quVVdcClJ7dqqvW5SrqATfUhwqn5MzWtponZ3t3fRpgpFgkt2fNa5rd3iz1UfTcAtWrgpshHYurTA==", + "license": "MPL-2.0", "dependencies": { "@cliqz/adblocker-extended-selectors": "^1.26.6" } }, "node_modules/@cliqz/adblocker-electron": { "version": "1.26.6", - "resolved": "https://registry.npmjs.org/@cliqz/adblocker-electron/-/adblocker-electron-1.26.6.tgz", - "integrity": "sha512-OE0Qh2+OGrx53DkV9gj1JzYdUV1IM7JigpU++5sA6yhsdbZBFijto0SK3iDsMsHeEUVq8DV1oLYspe0UpIU4SA==", + "license": "MPL-2.0", "dependencies": { "@cliqz/adblocker": "^1.26.6", "@cliqz/adblocker-electron-preload": "^1.26.6", @@ -294,8 +272,7 @@ }, "node_modules/@cliqz/adblocker-electron-preload": { "version": "1.26.6", - "resolved": "https://registry.npmjs.org/@cliqz/adblocker-electron-preload/-/adblocker-electron-preload-1.26.6.tgz", - "integrity": "sha512-G564oo1YANQR7mAzuQi7aYsgKwmRurYo0d9E8YaZr6ZD/kDHKxgHLfGPflKuOsYz2gf9zWQT89RsyQxDrjI49g==", + "license": "MPL-2.0", "dependencies": { "@cliqz/adblocker-content": "^1.26.6" }, @@ -305,14 +282,12 @@ }, "node_modules/@cliqz/adblocker-extended-selectors": { "version": "1.26.6", - "resolved": "https://registry.npmjs.org/@cliqz/adblocker-extended-selectors/-/adblocker-extended-selectors-1.26.6.tgz", - "integrity": "sha512-Gpvg6eLO2aHiY7r2y0jueve6YbGkYvWaZ4MiwhQ1wPTwj/MxFqAh9cVHnz3EzoJUtsqoy9bvkhmfkRUatpvvzw==" + "license": "MPL-2.0" }, "node_modules/@develar/schema-utils": { "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", - "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.0", "ajv-keywords": "^3.4.1" @@ -327,9 +302,8 @@ }, "node_modules/@electron/asar": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.4.tgz", - "integrity": "sha512-lykfY3TJRRWFeTxccEKdf1I6BLl2Plw81H0bbp4Fc5iEc67foDCa5pjJQULVgo0wF+Dli75f3xVcdb/67FFZ/g==", "dev": true, + "license": "MIT", "dependencies": { "chromium-pickle-js": "^0.2.0", "commander": "^5.0.0", @@ -345,9 +319,8 @@ }, "node_modules/@electron/asar/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -355,18 +328,16 @@ }, "node_modules/@electron/asar/node_modules/commander": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/@electron/asar/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -376,8 +347,7 @@ }, "node_modules/@electron/get": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.2.tgz", - "integrity": "sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g==", + "license": "MIT", "dependencies": { "debug": "^4.1.1", "env-paths": "^2.2.0", @@ -396,17 +366,15 @@ }, "node_modules/@electron/get/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@electron/notarize": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-1.2.4.tgz", - "integrity": "sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.1.1", "fs-extra": "^9.0.1" @@ -417,9 +385,8 @@ }, "node_modules/@electron/notarize/node_modules/fs-extra": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, + "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -432,9 +399,8 @@ }, "node_modules/@electron/notarize/node_modules/jsonfile": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -444,18 +410,16 @@ }, "node_modules/@electron/notarize/node_modules/universalify": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/@electron/osx-sign": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz", - "integrity": "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "compare-version": "^0.1.2", "debug": "^4.3.4", @@ -474,9 +438,8 @@ }, "node_modules/@electron/osx-sign/node_modules/fs-extra": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -488,9 +451,8 @@ }, "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8.0.0" }, @@ -500,9 +462,8 @@ }, "node_modules/@electron/osx-sign/node_modules/jsonfile": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -512,18 +473,16 @@ }, "node_modules/@electron/osx-sign/node_modules/universalify": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/@electron/universal": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.4.1.tgz", - "integrity": "sha512-lE/U3UNw1YHuowNbTmKNs9UlS3En3cPgwM5MI+agIgr/B1hSze9NdOP0qn7boZaI9Lph8IDv3/24g9IxnJP7aQ==", "dev": true, + "license": "MIT", "dependencies": { "@electron/asar": "^3.2.1", "@malept/cross-spawn-promise": "^1.1.0", @@ -539,9 +498,8 @@ }, "node_modules/@electron/universal/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -549,9 +507,8 @@ }, "node_modules/@electron/universal/node_modules/fs-extra": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, + "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -564,9 +521,8 @@ }, "node_modules/@electron/universal/node_modules/jsonfile": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -576,9 +532,8 @@ }, "node_modules/@electron/universal/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -588,18 +543,16 @@ }, "node_modules/@electron/universal/node_modules/universalify": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -612,18 +565,16 @@ }, "node_modules/@eslint-community/regexpp": { "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -644,9 +595,8 @@ }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -654,9 +604,8 @@ }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -666,50 +615,41 @@ }, "node_modules/@eslint/js": { "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", - "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@ffmpeg/core": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@ffmpeg/core/-/core-0.12.2.tgz", - "integrity": "sha512-UnzHvuNFbzmVZERSDtWGQvna01eKMfOWGG6SUn+s8mnKm5aH2zcrEIMgOMYpc6yJqrdRt0LBtT3ijF65rWlxIA==", - "engines": { - "node": ">=16.6.0" - } + "version": "0.11.0", + "license": "MIT" }, "node_modules/@ffmpeg/ffmpeg": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@ffmpeg/ffmpeg/-/ffmpeg-0.12.5.tgz", - "integrity": "sha512-grDWTaYSm0g/LEtpwkJtw0Kp1Iix/WF3KmtUo0Fm0V5GqKMUVzj1yzyaILg83o96wHSc8Y2d9Q3C37pYAF2wxQ==", + "version": "0.11.6", + "license": "MIT", "dependencies": { - "@ffmpeg/types": "^0.12.0" + "is-url": "^1.2.4", + "node-fetch": "^2.6.1", + "regenerator-runtime": "^0.13.7", + "resolve-url": "^0.2.1" }, "engines": { - "node": ">=18.17.0" + "node": ">=12.16.1" } }, - "node_modules/@ffmpeg/types": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@ffmpeg/types/-/types-0.12.0.tgz", - "integrity": "sha512-AuR4K+L6v1/9hVOsikU4rGGT5nKulQa8HrtYhpgBEq0HojoWB1c9bq3TTkNBpEvS/gC17WDMVJrqIGgXOj1DXA==", - "engines": { - "node": ">=16.6.0" - } + "node_modules/@ffmpeg/ffmpeg/node_modules/regenerator-runtime": { + "version": "0.13.11", + "license": "MIT" }, "node_modules/@foobar404/wave": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@foobar404/wave/-/wave-2.0.4.tgz", - "integrity": "sha512-FEyg37hDvQtrQVlFxbit7ov5e487BjsR32bZfJ4oAb5i+NnlbGaNyy6iYBZ8ocVHo8fgug+SL+mFdDTzqjvPww==" + "license": "MIT" }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", @@ -721,9 +661,8 @@ }, "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -731,9 +670,8 @@ }, "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -743,9 +681,8 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -756,15 +693,13 @@ }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@isaacs/cliui": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -779,9 +714,8 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -791,9 +725,8 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -803,15 +736,13 @@ }, "node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -826,9 +757,8 @@ }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -841,9 +771,8 @@ }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -858,8 +787,6 @@ }, "node_modules/@malept/cross-spawn-promise": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", - "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", "dev": true, "funding": [ { @@ -871,6 +798,7 @@ "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" } ], + "license": "Apache-2.0", "dependencies": { "cross-spawn": "^7.0.1" }, @@ -880,9 +808,8 @@ }, "node_modules/@malept/flatpak-bundler": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", - "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.1.1", "fs-extra": "^9.0.0", @@ -895,9 +822,8 @@ }, "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, + "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -910,9 +836,8 @@ }, "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -922,18 +847,16 @@ }, "node_modules/@malept/flatpak-bundler/node_modules/universalify": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -944,18 +867,16 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -966,17 +887,15 @@ }, "node_modules/@nornagon/put": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@nornagon/put/-/put-0.0.8.tgz", - "integrity": "sha512-ugvXJjwF5ldtUpa7D95kruNJ41yFQDEKyF5CW4TgKJnh+W/zmlBzXXeKTyqIgwMFrkePN2JqOBqcF0M0oOunow==", + "license": "MIT/X11", "engines": { "node": ">=0.3.0" } }, "node_modules/@npmcli/fs": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", "dev": true, + "license": "ISC", "dependencies": { "semver": "^7.3.5" }, @@ -986,9 +905,8 @@ }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=14" @@ -996,9 +914,8 @@ }, "node_modules/@pkgr/utils": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", - "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "fast-glob": "^3.3.0", @@ -1016,9 +933,8 @@ }, "node_modules/@pkgr/utils/node_modules/open": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", - "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", "dev": true, + "license": "MIT", "dependencies": { "default-browser": "^4.0.0", "define-lazy-prop": "^3.0.0", @@ -1034,9 +950,8 @@ }, "node_modules/@playwright/test": { "version": "1.37.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.37.1.tgz", - "integrity": "sha512-bq9zTli3vWJo8S3LwB91U0qDNQDpEXnw7knhxLM0nwDvexQAwx9tO8iKDZSqqneVq+URd/WIoz+BALMqUTgdSg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@types/node": "*", "playwright-core": "1.37.1" @@ -1053,18 +968,15 @@ }, "node_modules/@remusao/guess-url-type": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@remusao/guess-url-type/-/guess-url-type-1.2.1.tgz", - "integrity": "sha512-rbOqre2jW8STjheOsOaQHLgYBaBZ9Owbdt8NO7WvNZftJlaG3y/K9oOkl8ZUpuFBisIhmBuMEW6c+YrQl5inRA==" + "license": "MPL-2.0" }, "node_modules/@remusao/small": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@remusao/small/-/small-1.2.1.tgz", - "integrity": "sha512-7MjoGt0TJMVw1GPKgWq6SJPws1SLsUXQRa43Umht+nkyw2jnpy3WpiLNqGdwo5rHr5Wp9B2W/Pm5RQp656UJdw==" + "license": "MPL-2.0" }, "node_modules/@remusao/smaz": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@remusao/smaz/-/smaz-1.9.1.tgz", - "integrity": "sha512-e6BLuP8oaXCZ9+v46Is4ilAZ/Vq6YLgmBP204Ixgk1qTjXmqvFYG7+AS7v9nsZdGOy96r9DWGFbbDVgMxwu1rA==", + "license": "MPL-2.0", "dependencies": { "@remusao/smaz-compress": "^1.9.1", "@remusao/smaz-decompress": "^1.9.1" @@ -1072,26 +984,22 @@ }, "node_modules/@remusao/smaz-compress": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@remusao/smaz-compress/-/smaz-compress-1.9.1.tgz", - "integrity": "sha512-E2f48TwloQu3r6BdLOGF2aczeH7bJ/32oJGqvzT9SKur0cuUnLcZ7ZXP874E2fwmdE+cXzfC7bKzp79cDnmeyw==", + "license": "MPL-2.0", "dependencies": { "@remusao/trie": "^1.4.1" } }, "node_modules/@remusao/smaz-decompress": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@remusao/smaz-decompress/-/smaz-decompress-1.9.1.tgz", - "integrity": "sha512-TfjKKprYe3n47od8auhvJ/Ikj9kQTbDTe71ynKlxslrvvUhlIV3VQSuwYuMWMbdz1fIs0H/fxCN1Z8/H3km6/A==" + "license": "MPL-2.0" }, "node_modules/@remusao/trie": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@remusao/trie/-/trie-1.4.1.tgz", - "integrity": "sha512-yvwa+aCyYI/UjeD39BnpMypG8N06l86wIDW1/PAc6ihBRnodIfZDwccxQN3n1t74wduzaz74m4ZMHZnB06567Q==" + "license": "MPL-2.0" }, "node_modules/@selderee/plugin-htmlparser2": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz", - "integrity": "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==", + "license": "MIT", "dependencies": { "domhandler": "^5.0.3", "selderee": "^0.11.0" @@ -1102,8 +1010,7 @@ }, "node_modules/@sindresorhus/is": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -1113,8 +1020,7 @@ }, "node_modules/@szmarczak/http-timer": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "license": "MIT", "dependencies": { "defer-to-connect": "^2.0.0" }, @@ -1124,17 +1030,15 @@ }, "node_modules/@tootallnate/once": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/@types/cacheable-request": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "license": "MIT", "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", @@ -1144,8 +1048,7 @@ }, "node_modules/@types/chrome": { "version": "0.0.228", - "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.228.tgz", - "integrity": "sha512-rDmyVEF+l9H+6FQYqsEGqQOjBw/uaSx6KJ6o47FwbQmPPcskmt8XlPbKjy5KeQXU3ZLiV2x45Fk4kdtRMSghfQ==", + "license": "MIT", "dependencies": { "@types/filesystem": "*", "@types/har-format": "*" @@ -1153,18 +1056,16 @@ }, "node_modules/@types/debug": { "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", - "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/ms": "*" } }, "node_modules/@types/eslint": { "version": "8.44.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", - "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", "dev": true, + "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -1174,124 +1075,90 @@ }, "node_modules/@types/estree": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", "dev": true, + "license": "MIT", "optional": true, "peer": true }, "node_modules/@types/filesystem": { "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.32.tgz", - "integrity": "sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ==", + "license": "MIT", "dependencies": { "@types/filewriter": "*" } }, "node_modules/@types/filewriter": { "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.29.tgz", - "integrity": "sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ==" + "license": "MIT" }, "node_modules/@types/firefox-webext-browser": { "version": "111.0.1", - "resolved": "https://registry.npmjs.org/@types/firefox-webext-browser/-/firefox-webext-browser-111.0.1.tgz", - "integrity": "sha512-mmHWdQTCT68X0hh0URrsIyWhJeFzZHaiprj6nni/CmsAmqYq27T0eZyu1ePeKJ/zuDD3wqtTzm5TwRFAso+oPw==" + "license": "MIT" }, "node_modules/@types/fs-extra": { "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/har-format": { "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.12.tgz", - "integrity": "sha512-P20p/YBrqUBmzD6KhIQ8EiY4/RRzlekL4eCvfQnulFPfjmiGxKIoyCeI7qam5I7oKH3P8EU4ptEi0EfyGoLysw==" + "license": "MIT" }, "node_modules/@types/http-cache-semantics": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" + "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true, + "license": "MIT", "optional": true, "peer": true }, "node_modules/@types/json5": { "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/keyv": { "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/minimist": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/ms": { "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { "version": "20.5.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", - "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==" + "license": "MIT" }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "node_modules/@types/plist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.2.tgz", - "integrity": "sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw==", "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*", - "xmlbuilder": ">=11.0.1" - } + "license": "MIT" }, "node_modules/@types/responselike": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, - "node_modules/@types/verror": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.6.tgz", - "integrity": "sha512-NNm+gdePAX1VGvPcGZCDKQZKYSiAWigKhKaz5KF94hG6f2s8de9Ow5+7AbXoeKxL8gavZfk4UquSAygOF2duEQ==", - "dev": true, - "optional": true - }, "node_modules/@types/yauzl": { "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "license": "MIT", "optional": true, "dependencies": { "@types/node": "*" @@ -1299,8 +1166,7 @@ }, "node_modules/@xhayper/discord-rpc": { "version": "1.0.22", - "resolved": "https://registry.npmjs.org/@xhayper/discord-rpc/-/discord-rpc-1.0.22.tgz", - "integrity": "sha512-9NUse3AwmmLUgdY9PnI8tcm9ECRuuRRbdJwy7Osa3CPYF12EreTbIY/glEh5VHr66fcZy/IswGVnB477XOsTYA==", + "license": "ISC", "dependencies": { "axios": "^1.4.0", "discord-api-types": "^0.37.52", @@ -1312,46 +1178,30 @@ }, "node_modules/@xmldom/xmldom": { "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" } }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "dev": true, + "license": "BSD-2-Clause" + }, "node_modules/7zip-bin": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.1.1.tgz", - "integrity": "sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/abbrev": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/abstract-socket": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/abstract-socket/-/abstract-socket-2.1.1.tgz", - "integrity": "sha512-YZJizsvS1aBua5Gd01woe4zuyYBGgSMeqDOB6/ChwdTI904KP6QGtJswXl4hcqWxbz86hQBe++HWV0hF1aGUtA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "linux" - ], - "dependencies": { - "bindings": "^1.2.1", - "nan": "^2.12.1" - }, - "engines": { - "node": ">=4.0.0" - } + "dev": true, + "license": "ISC" }, "node_modules/acorn": { "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -1361,18 +1211,16 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/agent-base": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "4" }, @@ -1382,9 +1230,8 @@ }, "node_modules/agentkeepalive": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", "dev": true, + "license": "MIT", "dependencies": { "humanize-ms": "^1.2.1" }, @@ -1394,9 +1241,8 @@ }, "node_modules/aggregate-error": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", "dev": true, + "license": "MIT", "dependencies": { "clean-stack": "^4.0.0", "indent-string": "^5.0.0" @@ -1410,9 +1256,8 @@ }, "node_modules/aggregate-error/node_modules/clean-stack": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "5.0.0" }, @@ -1425,9 +1270,8 @@ }, "node_modules/aggregate-error/node_modules/escape-string-regexp": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -1437,9 +1281,8 @@ }, "node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1453,8 +1296,7 @@ }, "node_modules/ajv-formats": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -1469,8 +1311,7 @@ }, "node_modules/ajv-formats/node_modules/ajv": { "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -1484,32 +1325,28 @@ }, "node_modules/ajv-formats/node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "license": "MIT" }, "node_modules/ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, + "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1522,15 +1359,13 @@ }, "node_modules/app-builder-bin": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-4.0.0.tgz", - "integrity": "sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/app-builder-lib": { "version": "24.6.3", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.6.3.tgz", - "integrity": "sha512-++0Zp7vcCHfXMBGVj7luFxpqvMPk5mcWeTuw7OK0xNAaNtYQTTN0d9YfWRsb1MvviTOOhyHeULWz1CaixrdrDg==", "dev": true, + "license": "MIT", "dependencies": { "@develar/schema-utils": "~2.6.5", "@electron/notarize": "^1.2.3", @@ -1567,9 +1402,8 @@ }, "node_modules/app-builder-lib/node_modules/fs-extra": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -1581,9 +1415,8 @@ }, "node_modules/app-builder-lib/node_modules/jsonfile": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -1593,24 +1426,21 @@ }, "node_modules/app-builder-lib/node_modules/universalify": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/aproba": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/are-we-there-yet": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", "dev": true, + "license": "ISC", "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -1621,14 +1451,12 @@ }, "node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "license": "Python-2.0" }, "node_modules/array-buffer-byte-length": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "is-array-buffer": "^3.0.1" @@ -1639,9 +1467,8 @@ }, "node_modules/array-includes": { "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -1658,9 +1485,8 @@ }, "node_modules/array.prototype.findlastindex": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz", - "integrity": "sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -1677,9 +1503,8 @@ }, "node_modules/array.prototype.flat": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -1695,9 +1520,8 @@ }, "node_modules/array.prototype.flatmap": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -1713,9 +1537,8 @@ }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", - "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", @@ -1733,83 +1556,55 @@ }, "node_modules/arrify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8" - } - }, "node_modules/async": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/async-exit-hook": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", - "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/async-mutex": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.4.0.tgz", - "integrity": "sha512-eJFZ1YhRR8UN8eBLoNzcDPcy/jqjsg6I1AP+KvWQX80BqOSW1oJPJXDylPUEeMr2ZQvHgnQ//Lp6f3RQ1zI7HA==", + "license": "MIT", "dependencies": { "tslib": "^2.4.0" } }, "node_modules/asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "license": "MIT" }, "node_modules/at-least-node": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, + "license": "ISC", "engines": { "node": ">= 4.0.0" } }, "node_modules/atomically": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", - "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", + "license": "MIT", "engines": { "node": ">=10.12.0" } }, "node_modules/auto-changelog": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/auto-changelog/-/auto-changelog-2.4.0.tgz", - "integrity": "sha512-vh17hko1c0ItsEcw6m7qPRf3m45u+XK5QyCrrBFViElZ8jnKrPC1roSznrd1fIB/0vR/zawdECCRJtTuqIXaJw==", "dev": true, + "license": "MIT", "dependencies": { "commander": "^7.2.0", "handlebars": "^4.7.7", @@ -1824,11 +1619,13 @@ "node": ">=8.3" } }, + "node_modules/auto-changelog/node_modules/node-fetch": { + "dev": true + }, "node_modules/available-typed-arrays": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1838,8 +1635,7 @@ }, "node_modules/axios": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", - "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", + "license": "MIT", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -1848,8 +1644,7 @@ }, "node_modules/babel-runtime": { "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "license": "MIT", "dependencies": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" @@ -1857,116 +1652,15 @@ }, "node_modules/babel-runtime/node_modules/regenerator-runtime": { "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + "license": "MIT" }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "optional": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "node_modules/bluebird-lst": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", - "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", - "dev": true, - "dependencies": { - "bluebird": "^3.5.5" - } - }, - "node_modules/boolean": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", - "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", - "optional": true - }, - "node_modules/bplist-parser": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", - "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", - "dev": true, - "dependencies": { - "big-integer": "^1.6.44" - }, - "engines": { - "node": ">= 5.10.0" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-id3-writer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/browser-id3-writer/-/browser-id3-writer-5.0.0.tgz", - "integrity": "sha512-klFXmPe8kQN1y0ZrW411qmrUjJsb1gqPZ+Gb9ZcPKOmFF/8mA9dOZHXP9rGYsNCM8NAodZUFIzoKdl3tMvWsAA==" - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "funding": [ { @@ -1982,25 +1676,79 @@ "url": "https://feross.org/support" } ], - "optional": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "license": "MIT" + }, + "node_modules/big-integer": { + "version": "1.6.51", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">=0.6" } }, + "node_modules/bluebird": { + "version": "3.7.2", + "dev": true, + "license": "MIT" + }, + "node_modules/bluebird-lst": { + "version": "1.0.9", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "^3.5.5" + } + }, + "node_modules/boolean": { + "version": "3.2.0", + "license": "MIT", + "optional": true + }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-id3-writer": { + "version": "5.0.0", + "license": "MIT" + }, "node_modules/buffer-crc32": { "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", "engines": { "node": "*" } }, "node_modules/buffer-equal": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz", - "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4" }, @@ -2010,14 +1758,12 @@ }, "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "license": "MIT" }, "node_modules/builder-util": { "version": "24.5.0", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.5.0.tgz", - "integrity": "sha512-STnBmZN/M5vGcv01u/K8l+H+kplTaq4PAIn3yeuufUKSpcdro0DhJWxPI81k5XcNfC//bjM3+n9nr8F9uV4uAQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/debug": "^4.1.6", "7zip-bin": "~5.1.1", @@ -2039,8 +1785,7 @@ }, "node_modules/builder-util-runtime": { "version": "9.2.1", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.1.tgz", - "integrity": "sha512-2rLv/uQD2x+dJ0J3xtsmI12AlRyk7p45TEbE/6o/fbb633e/S3pPgm+ct+JHsoY7r39dKHnGEFk/AASRFdnXmA==", + "license": "MIT", "dependencies": { "debug": "^4.3.4", "sax": "^1.2.4" @@ -2051,9 +1796,8 @@ }, "node_modules/builder-util/node_modules/fs-extra": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -2065,9 +1809,8 @@ }, "node_modules/builder-util/node_modules/jsonfile": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -2077,18 +1820,16 @@ }, "node_modules/builder-util/node_modules/universalify": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/bundle-name": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", - "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", "dev": true, + "license": "MIT", "dependencies": { "run-applescript": "^5.0.0" }, @@ -2101,8 +1842,6 @@ }, "node_modules/busboy": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", "dependencies": { "streamsearch": "^1.1.0" }, @@ -2112,8 +1851,7 @@ }, "node_modules/butterchurn": { "version": "2.6.7", - "resolved": "https://registry.npmjs.org/butterchurn/-/butterchurn-2.6.7.tgz", - "integrity": "sha512-BJiRA8L0L2+84uoG2SSfkp0kclBuN+vQKf217pK7pMlwEO2ZEg3MtO2/o+l8Qpr8Nbejg8tmL1ZHD1jmhiaaqg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.0.0", "ecma-proposal-math-extensions": "0.0.2" @@ -2121,8 +1859,7 @@ }, "node_modules/butterchurn-presets": { "version": "2.4.7", - "resolved": "https://registry.npmjs.org/butterchurn-presets/-/butterchurn-presets-2.4.7.tgz", - "integrity": "sha512-4MdM8ripz/VfH1BCldrIKdAc/1ryJFBDvqlyow6Ivo1frwj0H3duzvSMFC7/wIjAjxb1QpwVHVqGqS9uAFKhpg==", + "license": "MIT", "dependencies": { "babel-runtime": "^6.26.0", "ecma-proposal-math-extensions": "0.0.2", @@ -2131,9 +1868,8 @@ }, "node_modules/cacache": { "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", @@ -2154,9 +1890,8 @@ }, "node_modules/cacache/node_modules/aggregate-error": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, + "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -2167,9 +1902,8 @@ }, "node_modules/cacache/node_modules/glob": { "version": "10.3.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", - "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.0.3", @@ -2189,27 +1923,24 @@ }, "node_modules/cacache/node_modules/indent-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/cacache/node_modules/lru-cache": { "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/cacache/node_modules/minimatch": { "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -2222,18 +1953,16 @@ }, "node_modules/cacache/node_modules/minipass": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", "dev": true, + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/cacache/node_modules/p-map": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, + "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -2246,16 +1975,14 @@ }, "node_modules/cacheable-lookup": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "license": "MIT", "engines": { "node": ">=10.6.0" } }, "node_modules/cacheable-request": { "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "license": "MIT", "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", @@ -2271,8 +1998,7 @@ }, "node_modules/call-bind": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -2283,18 +2009,16 @@ }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/camelcase": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -2304,9 +2028,8 @@ }, "node_modules/camelcase-keys": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", - "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", "dev": true, + "license": "MIT", "dependencies": { "camelcase": "^6.3.0", "map-obj": "^4.1.0", @@ -2322,9 +2045,8 @@ }, "node_modules/camelcase-keys/node_modules/type-fest": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -2334,9 +2056,8 @@ }, "node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2350,31 +2071,26 @@ }, "node_modules/charenc": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "license": "BSD-3-Clause", "engines": { "node": "*" } }, "node_modules/chownr": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/chromium-pickle-js": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", - "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ci-info": { "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", "dev": true, "funding": [ { @@ -2382,40 +2098,22 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/clean-stack": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "optional": true, - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cliui": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -2427,8 +2125,7 @@ }, "node_modules/clone-response": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "license": "MIT", "dependencies": { "mimic-response": "^1.0.0" }, @@ -2438,9 +2135,8 @@ }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -2450,23 +2146,20 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/color-support": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true, + "license": "ISC", "bin": { "color-support": "bin.js" } }, "node_modules/combined-stream": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -2476,32 +2169,28 @@ }, "node_modules/commander": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/compare-version": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", - "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/conf": { "version": "10.2.0", - "resolved": "https://registry.npmjs.org/conf/-/conf-10.2.0.tgz", - "integrity": "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==", + "license": "MIT", "dependencies": { "ajv": "^8.6.3", "ajv-formats": "^2.1.1", @@ -2523,8 +2212,7 @@ }, "node_modules/conf/node_modules/ajv": { "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -2538,14 +2226,12 @@ }, "node_modules/conf/node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "license": "MIT" }, "node_modules/config-file-ts": { "version": "0.2.4", - "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.4.tgz", - "integrity": "sha512-cKSW0BfrSaAUnxpgvpXPLaaW/umg4bqg4k3GO1JqlRfpx+d5W0GDXznCMkWotJQek5Mmz1MJVChQnz3IVaeMZQ==", "dev": true, + "license": "MIT", "dependencies": { "glob": "^7.1.6", "typescript": "^4.0.2" @@ -2553,38 +2239,23 @@ }, "node_modules/console-control-strings": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/core-js": { "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", - "hasInstallScript": true + "hasInstallScript": true, + "license": "MIT" }, "node_modules/core-util-is": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true - }, - "node_modules/crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", "dev": true, - "optional": true, - "dependencies": { - "buffer": "^5.1.0" - } + "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -2596,32 +2267,28 @@ }, "node_modules/crypt": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "license": "BSD-3-Clause", "engines": { "node": "*" } }, "node_modules/custom-electron-prompt": { "version": "1.5.7", - "resolved": "https://registry.npmjs.org/custom-electron-prompt/-/custom-electron-prompt-1.5.7.tgz", - "integrity": "sha512-ptRPJr6CpT06GWLMtg3GD2Lr7gWfXdWI+hR1S39eq+m/mUa2E118YmX6mPCbHdg5QB/W9UVhSpRqBM8FUh1G8w==", + "license": "MIT", "peerDependencies": { "electron": ">=10.0.0" } }, "node_modules/custom-electron-titlebar": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/custom-electron-titlebar/-/custom-electron-titlebar-4.2.7.tgz", - "integrity": "sha512-5sROnS5jH8jaFsjMwID7aPwnohBJ4HU0dSx81qSGAaznnblc3067D8pyl/zOwj/WosoOPHV2837jbT3j4whvHw==", + "version": "4.1.6", + "license": "MIT", "peerDependencies": { - "electron": ">20.0.0" + "electron": ">20" } }, "node_modules/dbus-next": { "version": "0.9.2", - "resolved": "https://registry.npmjs.org/dbus-next/-/dbus-next-0.9.2.tgz", - "integrity": "sha512-tzQq/+wrTZ2yU+U5PoeXc97KABhX2v55C/T0finH3tSKYuI8H/SqppIFymBBrUHcK13LvEGY3vdj3ikPPenL5g==", + "license": "MIT", "dependencies": { "@nornagon/put": "0.0.8", "event-stream": "3.3.4", @@ -2637,8 +2304,7 @@ }, "node_modules/debounce-fn": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", - "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", + "license": "MIT", "dependencies": { "mimic-fn": "^3.0.0" }, @@ -2651,8 +2317,7 @@ }, "node_modules/debug": { "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -2667,9 +2332,8 @@ }, "node_modules/decamelize": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", - "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -2679,9 +2343,8 @@ }, "node_modules/decamelize-keys": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, + "license": "MIT", "dependencies": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" @@ -2695,26 +2358,23 @@ }, "node_modules/decamelize-keys/node_modules/decamelize": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/decamelize-keys/node_modules/map-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/decompress-response": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" }, @@ -2727,8 +2387,7 @@ }, "node_modules/decompress-response/node_modules/mimic-response": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -2738,8 +2397,7 @@ }, "node_modules/deep-equal": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "license": "MIT", "dependencies": { "is-arguments": "^1.0.4", "is-date-object": "^1.0.1", @@ -2754,23 +2412,20 @@ }, "node_modules/deep-is": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/default-browser": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", - "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", "dev": true, + "license": "MIT", "dependencies": { "bundle-name": "^3.0.0", "default-browser-id": "^3.0.0", @@ -2786,9 +2441,8 @@ }, "node_modules/default-browser-id": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", - "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", "dev": true, + "license": "MIT", "dependencies": { "bplist-parser": "^0.2.0", "untildify": "^4.0.0" @@ -2802,9 +2456,8 @@ }, "node_modules/default-browser/node_modules/execa": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.1", @@ -2825,9 +2478,8 @@ }, "node_modules/default-browser/node_modules/get-stream": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -2837,18 +2489,16 @@ }, "node_modules/default-browser/node_modules/human-signals": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=14.18.0" } }, "node_modules/default-browser/node_modules/is-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -2858,9 +2508,8 @@ }, "node_modules/default-browser/node_modules/mimic-fn": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -2870,9 +2519,8 @@ }, "node_modules/default-browser/node_modules/npm-run-path": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^4.0.0" }, @@ -2885,9 +2533,8 @@ }, "node_modules/default-browser/node_modules/onetime": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^4.0.0" }, @@ -2900,9 +2547,8 @@ }, "node_modules/default-browser/node_modules/path-key": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -2912,9 +2558,8 @@ }, "node_modules/default-browser/node_modules/strip-final-newline": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -2924,17 +2569,15 @@ }, "node_modules/defer-to-connect": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/define-lazy-prop": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -2944,8 +2587,7 @@ }, "node_modules/define-properties": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "license": "MIT", "dependencies": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -2959,9 +2601,8 @@ }, "node_modules/del": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-7.0.0.tgz", - "integrity": "sha512-tQbV/4u5WVB8HMJr08pgw0b6nG4RGt/tj+7Numvq+zqcvUFeMaIWWOUFltiU+6go8BSO2/ogsB4EasDaj0y68Q==", "dev": true, + "license": "MIT", "dependencies": { "globby": "^13.1.2", "graceful-fs": "^4.2.10", @@ -2981,9 +2622,8 @@ }, "node_modules/del-cli": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/del-cli/-/del-cli-5.0.1.tgz", - "integrity": "sha512-hCDHJd0u0jKFqizgInYXZaILsqOIA7Zl6e7M3hJwP+SlwUAgtV/EB22EPF4e2+9VAVnBDQQBE6tDRe+/UuoFhg==", "dev": true, + "license": "MIT", "dependencies": { "del": "^7.0.0", "meow": "^10.1.3" @@ -3001,29 +2641,25 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/delegates": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/detect-node": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT", "optional": true }, "node_modules/dir-compare": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", - "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==", "dev": true, + "license": "MIT", "dependencies": { "buffer-equal": "^1.0.0", "minimatch": "^3.0.4" @@ -3031,9 +2667,8 @@ }, "node_modules/dir-compare/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3041,9 +2676,8 @@ }, "node_modules/dir-compare/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3053,9 +2687,8 @@ }, "node_modules/dir-glob": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -3065,14 +2698,12 @@ }, "node_modules/discord-api-types": { "version": "0.37.55", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.55.tgz", - "integrity": "sha512-XIf8AELxg76AH1WzrgB5ziFyIxSs4tLK1XGjFs4oE6t7M7r1B0Chdylaz76ALhvRXAUBGHGFXu/pKAa5Q+LbQg==" + "license": "MIT" }, "node_modules/dmg-builder": { "version": "24.6.3", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.6.3.tgz", - "integrity": "sha512-O7KNT7OKqtV54fMYUpdlyTOCP5DoPuRMLqMTgxxV2PO8Hj/so6zOl5o8GTs8pdDkeAhJzCFOUNB3BDhgXbUbJg==", "dev": true, + "license": "MIT", "dependencies": { "app-builder-lib": "24.6.3", "builder-util": "24.5.0", @@ -3087,9 +2718,8 @@ }, "node_modules/dmg-builder/node_modules/fs-extra": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -3101,9 +2731,8 @@ }, "node_modules/dmg-builder/node_modules/jsonfile": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -3113,44 +2742,16 @@ }, "node_modules/dmg-builder/node_modules/universalify": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, - "node_modules/dmg-license": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", - "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "@types/plist": "^3.0.1", - "@types/verror": "^1.10.3", - "ajv": "^6.10.0", - "crc": "^3.8.0", - "iconv-corefoundation": "^1.1.7", - "plist": "^3.0.4", - "smart-buffer": "^4.0.2", - "verror": "^1.10.0" - }, - "bin": { - "dmg-license": "bin/dmg-license.js" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/doctrine": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -3160,8 +2761,7 @@ }, "node_modules/dom-serializer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -3173,19 +2773,17 @@ }, "node_modules/domelementtype": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/fb55" } - ] + ], + "license": "BSD-2-Clause" }, "node_modules/domhandler": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" }, @@ -3198,8 +2796,7 @@ }, "node_modules/domutils": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -3211,8 +2808,7 @@ }, "node_modules/dot-prop": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "license": "MIT", "dependencies": { "is-obj": "^2.0.0" }, @@ -3225,40 +2821,34 @@ }, "node_modules/dotenv": { "version": "9.0.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", - "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=10" } }, "node_modules/dotenv-expand": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/duplexer": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + "license": "MIT" }, "node_modules/eastasianwidth": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ecma-proposal-math-extensions": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/ecma-proposal-math-extensions/-/ecma-proposal-math-extensions-0.0.2.tgz", - "integrity": "sha512-80BnDp2Fn7RxXlEr5HHZblniY4aQ97MOAicdWWpSo0vkQiISSE9wLR4SqxKsu4gCtXFBIPPzy8JMhay4NWRg/Q==" + "license": "MIT" }, "node_modules/ejs": { "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "jake": "^10.8.5" }, @@ -3271,9 +2861,8 @@ }, "node_modules/electron": { "version": "26.1.0", - "resolved": "https://registry.npmjs.org/electron/-/electron-26.1.0.tgz", - "integrity": "sha512-qEh19H09Pysn3ibms5nZ0haIh5pFoOd7/5Ww7gzmAwDQOulRi8Sa2naeueOyIb1GKpf+6L4ix3iceYRAuA5r5Q==", "hasInstallScript": true, + "license": "MIT", "dependencies": { "@electron/get": "^2.0.0", "@types/node": "^18.11.18", @@ -3288,8 +2877,7 @@ }, "node_modules/electron-better-web-request": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/electron-better-web-request/-/electron-better-web-request-1.0.1.tgz", - "integrity": "sha512-euwLeL82k6fbVODfH5Uz9c4BN047/XyYKfsZcaFhdWfqx05JPu2J0xE7nciJ/1Bb0sTClU1FDLW5H2zQWBB5Gw==", + "license": "ISC", "dependencies": { "url-match-patterns": "^0.2.0", "uuid": "^3.3.2" @@ -3297,9 +2885,8 @@ }, "node_modules/electron-builder": { "version": "24.6.3", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.6.3.tgz", - "integrity": "sha512-O6PqhRXwfxCNTXI4BlhELSeYYO6/tqlxRuy+4+xKBokQvwDDjDgZMMoSgAmanVSCuzjE7MZldI9XYrKFk+EQDw==", "dev": true, + "license": "MIT", "dependencies": { "app-builder-lib": "24.6.3", "builder-util": "24.5.0", @@ -3323,9 +2910,8 @@ }, "node_modules/electron-builder/node_modules/fs-extra": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -3337,9 +2923,8 @@ }, "node_modules/electron-builder/node_modules/jsonfile": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -3349,17 +2934,15 @@ }, "node_modules/electron-builder/node_modules/universalify": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/electron-debug": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/electron-debug/-/electron-debug-3.2.0.tgz", - "integrity": "sha512-7xZh+LfUvJ52M9rn6N+tPuDw6oRAjxUj9SoxAZfJ0hVCXhZCsdkrSt7TgXOiWiEOBgEV8qwUIO/ScxllsPS7ow==", + "license": "MIT", "dependencies": { "electron-is-dev": "^1.1.0", "electron-localshortcut": "^3.1.0" @@ -3370,9 +2953,8 @@ }, "node_modules/electron-devtools-installer": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/electron-devtools-installer/-/electron-devtools-installer-3.2.0.tgz", - "integrity": "sha512-t3UczsYugm4OAbqvdImMCImIMVdFzJAHgbwHpkl5jmfu1izVgUcP/mnrPqJIpEeCK1uZGpt+yHgWEN+9EwoYhQ==", "dev": true, + "license": "MIT", "dependencies": { "rimraf": "^3.0.2", "semver": "^7.2.1", @@ -3382,8 +2964,7 @@ }, "node_modules/electron-is": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/electron-is/-/electron-is-3.0.0.tgz", - "integrity": "sha512-aQv1y3WrDZ+mtO8acbhiiip/8fa0Et7cvZyvlqJm2H7fih4hiJWEFRyYxzLgDG2kmiLdF8l3y5tbek5JFOPQkQ==", + "license": "MIT", "dependencies": { "electron-is-dev": "^0.3.0", "semver": "^5.5.0" @@ -3391,31 +2972,26 @@ }, "node_modules/electron-is-accelerator": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/electron-is-accelerator/-/electron-is-accelerator-0.1.2.tgz", - "integrity": "sha512-fLGSAjXZtdn1sbtZxx52+krefmtNuVwnJCV2gNiVt735/ARUboMl8jnNC9fZEqQdlAv2ZrETfmBUsoQci5evJA==" + "license": "MIT" }, "node_modules/electron-is-dev": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-1.2.0.tgz", - "integrity": "sha512-R1oD5gMBPS7PVU8gJwH6CtT0e6VSoD0+SzSnYpNm+dBkcijgA+K7VAMHDfnRq/lkKPZArpzplTW6jfiMYosdzw==" + "license": "MIT" }, "node_modules/electron-is/node_modules/electron-is-dev": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-0.3.0.tgz", - "integrity": "sha512-jLttuuq8QK67n3mXmIe9pkrO7IH3LGIk12xJkhTmc852U2sCJaRAOpRGPSh+1Xnzck5v9escd9YXzuze9nGejg==" + "license": "MIT" }, "node_modules/electron-is/node_modules/semver": { "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "license": "ISC", "bin": { "semver": "bin/semver" } }, "node_modules/electron-localshortcut": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/electron-localshortcut/-/electron-localshortcut-3.2.1.tgz", - "integrity": "sha512-DWvhKv36GsdXKnaFFhEiK8kZZA+24/yFLgtTwJJHc7AFgDjNRIBJZ/jq62Y/dWv9E4ypYwrVWN2bVrCYw1uv7Q==", + "license": "MIT", "dependencies": { "debug": "^4.0.1", "electron-is-accelerator": "^0.1.0", @@ -3425,9 +3001,8 @@ }, "node_modules/electron-publish": { "version": "24.5.0", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.5.0.tgz", - "integrity": "sha512-zwo70suH15L15B4ZWNDoEg27HIYoPsGJUF7xevLJLSI7JUPC8l2yLBdLGwqueJ5XkDL7ucYyRZzxJVR8ElV9BA==", "dev": true, + "license": "MIT", "dependencies": { "@types/fs-extra": "^9.0.11", "builder-util": "24.5.0", @@ -3440,9 +3015,8 @@ }, "node_modules/electron-publish/node_modules/fs-extra": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -3454,9 +3028,8 @@ }, "node_modules/electron-publish/node_modules/jsonfile": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -3466,17 +3039,15 @@ }, "node_modules/electron-publish/node_modules/universalify": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/electron-store": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/electron-store/-/electron-store-8.1.0.tgz", - "integrity": "sha512-2clHg/juMjOH0GT9cQ6qtmIvK183B39ZXR0bUoPwKwYHJsEF3quqyDzMFUAu+0OP8ijmN2CbPRAelhNbWUbzwA==", + "license": "MIT", "dependencies": { "conf": "^10.2.0", "type-fest": "^2.17.0" @@ -3487,8 +3058,7 @@ }, "node_modules/electron-unhandled": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/electron-unhandled/-/electron-unhandled-4.0.1.tgz", - "integrity": "sha512-6BsLnBg+i96eUnbaIFZyYdyfNX3f80/Nlfqy34YEMxXT9JP3ddNsNnUeiOF8ezN4+et4t4D37gjghKTP0V3jyw==", + "license": "MIT", "dependencies": { "clean-stack": "^2.1.0", "electron-is-dev": "^2.0.0", @@ -3502,16 +3072,14 @@ }, "node_modules/electron-unhandled/node_modules/electron-is-dev": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-2.0.0.tgz", - "integrity": "sha512-3X99K852Yoqu9AcW50qz3ibYBWY79/pBhlMCab8ToEWS48R0T9tyxRiQhwylE7zQdXrMnx2JKqUJyMPmt5FBqA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/electron-updater": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-6.1.1.tgz", - "integrity": "sha512-IBT3zJ4yO5UZMF2gOTC9HrlmG4OYSRtOiHKzNAShJvfuicdx6UaXoa6AvhcTxdx6zf/rJyFMRBISS9jhVwTfow==", + "license": "MIT", "dependencies": { "builder-util-runtime": "9.2.1", "fs-extra": "^10.1.0", @@ -3525,8 +3093,7 @@ }, "node_modules/electron-updater/node_modules/fs-extra": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -3538,8 +3105,7 @@ }, "node_modules/electron-updater/node_modules/jsonfile": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -3549,27 +3115,23 @@ }, "node_modules/electron-updater/node_modules/universalify": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/electron/node_modules/@types/node": { "version": "18.17.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.12.tgz", - "integrity": "sha512-d6xjC9fJ/nSnfDeU0AMDsaJyb1iHsqCSOdi84w4u+SlN/UgQdY5tRhpMzaFYsI4mnpvgTivEaQd0yOUhAtOnEQ==" + "license": "MIT" }, "node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/encoding": { "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "license": "MIT", "optional": true, "dependencies": { "iconv-lite": "^0.6.2" @@ -3577,24 +3139,21 @@ }, "node_modules/end-of-stream": { "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", "dependencies": { "once": "^1.4.0" } }, "node_modules/ensure-error": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ensure-error/-/ensure-error-2.1.0.tgz", - "integrity": "sha512-+BMSJHw9gxiJAAp2ZR1E0TNcL09dD3lOvkl7WVm4+Y6xnes/pMetP/TzCHiDduh8ihNDjbGfuYxl7l4PA1xZ8A==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/entities": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -3604,32 +3163,28 @@ }, "node_modules/env-paths": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/err-code": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/error-ex": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-abstract": { "version": "1.22.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", - "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.0", "arraybuffer.prototype.slice": "^1.0.1", @@ -3680,9 +3235,8 @@ }, "node_modules/es-set-tostringtag": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3", "has": "^1.0.3", @@ -3694,18 +3248,16 @@ }, "node_modules/es-shim-unscopables": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", "dev": true, + "license": "MIT", "dependencies": { "has": "^1.0.3" } }, "node_modules/es-to-primitive": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, + "license": "MIT", "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -3720,24 +3272,21 @@ }, "node_modules/es6-error": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "license": "MIT", "optional": true }, "node_modules/escalade": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -3747,9 +3296,8 @@ }, "node_modules/eslint": { "version": "8.48.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", - "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -3801,9 +3349,8 @@ }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", @@ -3812,18 +3359,16 @@ }, "node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-import-resolver-node/node_modules/resolve": { "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "dev": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -3838,9 +3383,8 @@ }, "node_modules/eslint-module-utils": { "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7" }, @@ -3855,18 +3399,16 @@ }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import": { "version": "2.28.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", - "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", "dev": true, + "license": "MIT", "dependencies": { "array-includes": "^3.1.6", "array.prototype.findlastindex": "^1.2.2", @@ -3895,9 +3437,8 @@ }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3905,18 +3446,16 @@ }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -3926,9 +3465,8 @@ }, "node_modules/eslint-plugin-import/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3938,18 +3476,16 @@ }, "node_modules/eslint-plugin-import/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/eslint-plugin-prettier": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", - "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", "dev": true, + "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0", "synckit": "^0.8.5" @@ -3976,9 +3512,8 @@ }, "node_modules/eslint-scope": { "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -3992,9 +3527,8 @@ }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -4004,9 +3538,8 @@ }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4014,9 +3547,8 @@ }, "node_modules/eslint/node_modules/find-up": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -4030,9 +3562,8 @@ }, "node_modules/eslint/node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -4042,18 +3573,16 @@ }, "node_modules/eslint/node_modules/is-path-inside": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/eslint/node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -4066,9 +3595,8 @@ }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4078,9 +3606,8 @@ }, "node_modules/eslint/node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -4093,9 +3620,8 @@ }, "node_modules/eslint/node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -4108,18 +3634,16 @@ }, "node_modules/eslint/node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/espree": { "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -4134,9 +3658,8 @@ }, "node_modules/esquery": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -4146,9 +3669,8 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -4158,26 +3680,23 @@ }, "node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/event-stream": { "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", + "license": "MIT", "dependencies": { "duplexer": "~0.1.1", "from": "~0", @@ -4190,9 +3709,8 @@ }, "node_modules/execa": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -4213,9 +3731,8 @@ }, "node_modules/execa/node_modules/get-stream": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -4225,14 +3742,12 @@ }, "node_modules/exponential-backoff": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/extract-zip": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "license": "BSD-2-Clause", "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", @@ -4248,32 +3763,19 @@ "@types/yauzl": "^2.9.1" } }, - "node_modules/extsprintf": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", - "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "optional": true - }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "license": "MIT" }, "node_modules/fast-diff": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/fast-glob": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -4287,38 +3789,33 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fastq": { "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/fd-slicer": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "license": "MIT", "dependencies": { "pend": "~1.2.0" } }, "node_modules/file-entry-cache": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -4326,33 +3823,24 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "optional": true - }, "node_modules/filelist": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, + "license": "Apache-2.0", "dependencies": { "minimatch": "^5.0.1" } }, "node_modules/filename-reserved-regex": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/filenamify": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", - "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", + "license": "MIT", "dependencies": { "filename-reserved-regex": "^2.0.0", "strip-outer": "^1.0.1", @@ -4367,9 +3855,8 @@ }, "node_modules/fill-range": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -4379,8 +3866,7 @@ }, "node_modules/find-up": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "license": "MIT", "dependencies": { "locate-path": "^3.0.0" }, @@ -4388,11 +3874,18 @@ "node": ">=6" } }, + "node_modules/find-yarn-workspace-root": { + "version": "2.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "micromatch": "^4.0.2" + } + }, "node_modules/flat-cache": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", - "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.7", "keyv": "^4.5.3", @@ -4404,20 +3897,18 @@ }, "node_modules/flatted": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/follow-redirects": { "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -4429,18 +3920,16 @@ }, "node_modules/for-each": { "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, + "license": "MIT", "dependencies": { "is-callable": "^1.1.3" } }, "node_modules/foreground-child": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", "dev": true, + "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -4454,9 +3943,8 @@ }, "node_modules/foreground-child/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -4466,8 +3954,7 @@ }, "node_modules/form-data": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -4479,13 +3966,11 @@ }, "node_modules/from": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==" + "license": "MIT" }, "node_modules/fs-extra": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -4497,9 +3982,8 @@ }, "node_modules/fs-minipass": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -4509,43 +3993,25 @@ }, "node_modules/fs-minipass/node_modules/minipass": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", "dev": true, + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } + "license": "ISC" }, "node_modules/function-bind": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "license": "MIT" }, "node_modules/function.prototype.name": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -4561,17 +4027,15 @@ }, "node_modules/functions-have-names": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/gauge": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", "dev": true, + "license": "ISC", "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", @@ -4588,17 +4052,15 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -4611,8 +4073,7 @@ }, "node_modules/get-stream": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", "dependencies": { "pump": "^3.0.0" }, @@ -4625,9 +4086,8 @@ }, "node_modules/get-symbol-description": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" @@ -4641,9 +4101,8 @@ }, "node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4661,9 +4120,8 @@ }, "node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -4673,9 +4131,8 @@ }, "node_modules/glob/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4683,9 +4140,8 @@ }, "node_modules/glob/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4695,8 +4151,7 @@ }, "node_modules/global-agent": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", - "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "license": "BSD-3-Clause", "optional": true, "dependencies": { "boolean": "^3.0.1", @@ -4712,8 +4167,7 @@ }, "node_modules/global-agent/node_modules/serialize-error": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "license": "MIT", "optional": true, "dependencies": { "type-fest": "^0.13.1" @@ -4727,8 +4181,7 @@ }, "node_modules/global-agent/node_modules/type-fest": { "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "license": "(MIT OR CC0-1.0)", "optional": true, "engines": { "node": ">=10" @@ -4739,9 +4192,8 @@ }, "node_modules/globals": { "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -4754,9 +4206,8 @@ }, "node_modules/globals/node_modules/type-fest": { "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -4766,9 +4217,8 @@ }, "node_modules/globalthis": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "devOptional": true, + "license": "MIT", "dependencies": { "define-properties": "^1.1.3" }, @@ -4781,9 +4231,8 @@ }, "node_modules/globby": { "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, + "license": "MIT", "dependencies": { "dir-glob": "^3.0.1", "fast-glob": "^3.3.0", @@ -4800,9 +4249,8 @@ }, "node_modules/gopd": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -4812,8 +4260,7 @@ }, "node_modules/got": { "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "license": "MIT", "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", @@ -4836,20 +4283,17 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "license": "ISC" }, "node_modules/graphemer": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/handlebars": { "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", @@ -4868,17 +4312,15 @@ }, "node_modules/hard-rejection": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/has": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.1" }, @@ -4888,26 +4330,23 @@ }, "node_modules/has-bigints": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/has-property-descriptors": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.1" }, @@ -4917,8 +4356,7 @@ }, "node_modules/has-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4928,8 +4366,7 @@ }, "node_modules/has-symbols": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4939,8 +4376,7 @@ }, "node_modules/has-tostringtag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, @@ -4953,23 +4389,20 @@ }, "node_modules/has-unicode": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/hexy": { "version": "0.2.11", - "resolved": "https://registry.npmjs.org/hexy/-/hexy-0.2.11.tgz", - "integrity": "sha512-ciq6hFsSG/Bpt2DmrZJtv+56zpPdnq+NQ4ijEFrveKN0ZG1mhl/LdT1NQZ9se6ty1fACcI4d4vYqC9v8EYpH2A==", + "license": "MIT", "bin": { "hexy": "bin/hexy_cmd.js" } }, "node_modules/hosted-git-info": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -4979,13 +4412,11 @@ }, "node_modules/howler": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/howler/-/howler-2.2.3.tgz", - "integrity": "sha512-QM0FFkw0LRX1PR8pNzJVAY25JhIWvbKMBFM4gqk+QdV+kPXOhleWGCB6AiAF/goGjIHK2e/nIElplvjQwhr0jg==" + "license": "MIT" }, "node_modules/html-to-text": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz", - "integrity": "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==", + "license": "MIT", "dependencies": { "@selderee/plugin-htmlparser2": "^0.11.0", "deepmerge": "^4.3.1", @@ -4999,8 +4430,6 @@ }, "node_modules/htmlparser2": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -5008,6 +4437,7 @@ "url": "https://github.com/sponsors/fb55" } ], + "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", @@ -5017,14 +4447,12 @@ }, "node_modules/http-cache-semantics": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + "license": "BSD-2-Clause" }, "node_modules/http-proxy-agent": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, + "license": "MIT", "dependencies": { "@tootallnate/once": "2", "agent-base": "6", @@ -5036,8 +4464,7 @@ }, "node_modules/http2-wrapper": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "license": "MIT", "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" @@ -5048,9 +4475,8 @@ }, "node_modules/https-proxy-agent": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -5061,44 +4487,24 @@ }, "node_modules/human-signals": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } }, "node_modules/humanize-ms": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.0.0" } }, - "node_modules/iconv-corefoundation": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", - "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "cli-truncate": "^2.1.0", - "node-addon-api": "^1.6.3" - }, - "engines": { - "node": "^8.11.2 || >=10" - } - }, "node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "devOptional": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -5106,47 +4512,23 @@ "node": ">=0.10.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true - }, "node_modules/ignore": { "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/immediate": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -5160,27 +4542,24 @@ }, "node_modules/import-fresh/node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } }, "node_modules/indent-string": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -5190,9 +4569,8 @@ }, "node_modules/inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -5200,15 +4578,13 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/internal-slot": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.0", "has": "^1.0.3", @@ -5220,14 +4596,12 @@ }, "node_modules/ip": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-arguments": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -5241,9 +4615,8 @@ }, "node_modules/is-array-buffer": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.0", @@ -5255,15 +4628,13 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-bigint": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, + "license": "MIT", "dependencies": { "has-bigints": "^1.0.1" }, @@ -5273,9 +4644,8 @@ }, "node_modules/is-boolean-object": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -5289,14 +4659,12 @@ }, "node_modules/is-buffer": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "license": "MIT" }, "node_modules/is-callable": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5306,9 +4674,8 @@ }, "node_modules/is-ci": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", "dev": true, + "license": "MIT", "dependencies": { "ci-info": "^3.2.0" }, @@ -5318,9 +4685,8 @@ }, "node_modules/is-core-module": { "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dev": true, + "license": "MIT", "dependencies": { "has": "^1.0.3" }, @@ -5330,8 +4696,7 @@ }, "node_modules/is-date-object": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -5344,9 +4709,8 @@ }, "node_modules/is-docker": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, + "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -5359,27 +4723,24 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -5389,9 +4750,8 @@ }, "node_modules/is-inside-container": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, + "license": "MIT", "dependencies": { "is-docker": "^3.0.0" }, @@ -5407,9 +4767,8 @@ }, "node_modules/is-inside-container/node_modules/is-docker": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, + "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -5422,15 +4781,13 @@ }, "node_modules/is-lambda": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-negative-zero": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5440,18 +4797,16 @@ }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/is-number-object": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -5464,17 +4819,15 @@ }, "node_modules/is-obj": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-path-cwd": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-3.0.0.tgz", - "integrity": "sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -5484,9 +4837,8 @@ }, "node_modules/is-path-inside": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", - "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -5496,17 +4848,15 @@ }, "node_modules/is-plain-obj": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-regex": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -5520,9 +4870,8 @@ }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -5532,9 +4881,8 @@ }, "node_modules/is-stream": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -5544,9 +4892,8 @@ }, "node_modules/is-string": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -5559,9 +4906,8 @@ }, "node_modules/is-symbol": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, + "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, @@ -5574,9 +4920,8 @@ }, "node_modules/is-typed-array": { "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, + "license": "MIT", "dependencies": { "which-typed-array": "^1.1.11" }, @@ -5587,11 +4932,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-url": { + "version": "1.2.4", + "license": "MIT" + }, "node_modules/is-weakref": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -5601,9 +4949,8 @@ }, "node_modules/is-wsl": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, + "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, @@ -5613,15 +4960,13 @@ }, "node_modules/isarray": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/isbinaryfile": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.0.tgz", - "integrity": "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 14.0.0" }, @@ -5631,15 +4976,13 @@ }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/jackspeak": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.0.tgz", - "integrity": "sha512-uKmsITSsF4rUWQHzqaRUuyAir3fZfW3f202Ee34lz/gZCi970CPZwyQXLGNgWJvvZbvFyzeyGq0+4fcG/mBKZg==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -5655,9 +4998,8 @@ }, "node_modules/jake": { "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -5673,9 +5015,8 @@ }, "node_modules/jake/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5683,9 +5024,8 @@ }, "node_modules/jake/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -5695,25 +5035,22 @@ }, "node_modules/jintr": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jintr/-/jintr-1.1.0.tgz", - "integrity": "sha512-Tu9wk3BpN2v+kb8yT6YBtue+/nbjeLFv4vvVC4PJ7oCidHKbifWhvORrAbQfxVIQZG+67am/mDagpiGSVtvrZg==", "funding": [ "https://github.com/sponsors/LuanRT" ], + "license": "MIT", "dependencies": { "acorn": "^8.8.0" } }, "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -5722,49 +5059,51 @@ } }, "node_modules/jsbi": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-2.0.5.tgz", - "integrity": "sha512-TzO/62Hxeb26QMb4IGlI/5X+QLr9Uqp1FPkwp2+KOICW+Q+vSuFj61c8pkT6wAns4WcK56X7CmSHhJeDGWOqxQ==" + "version": "2.0.5" }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema-typed": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", - "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==" + "license": "BSD-2-Clause" + }, + "node_modules/json-stable-stringify": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "jsonify": "^0.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stringify-safe": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "license": "ISC", "optional": true }, "node_modules/json5": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -5774,17 +5113,23 @@ }, "node_modules/jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, + "node_modules/jsonify": { + "version": "0.0.1", + "dev": true, + "license": "Public Domain", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/jszip": { "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", "dev": true, + "license": "(MIT OR GPL-3.0-or-later)", "dependencies": { "lie": "~3.3.0", "pako": "~1.0.2", @@ -5794,15 +5139,13 @@ }, "node_modules/jszip/node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jszip/node_modules/readable-stream": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -5815,64 +5158,63 @@ }, "node_modules/jszip/node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jszip/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/keyboardevent-from-electron-accelerator": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/keyboardevent-from-electron-accelerator/-/keyboardevent-from-electron-accelerator-2.0.0.tgz", - "integrity": "sha512-iQcmNA0M4ETMNi0kG/q0h/43wZk7rMeKYrXP7sqKIJbHkTU8Koowgzv+ieR/vWJbOwxx5nDC3UnudZ0aLSu4VA==" + "license": "MIT" }, "node_modules/keyboardevents-areequal": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/keyboardevents-areequal/-/keyboardevents-areequal-0.2.2.tgz", - "integrity": "sha512-Nv+Kr33T0mEjxR500q+I6IWisOQ0lK1GGOncV0kWE6n4KFmpcu7RUX5/2B0EUtX51Cb0HjZ9VJsSY3u4cBa0kw==" + "license": "MIT" }, "node_modules/keyv": { "version": "4.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } }, "node_modules/kind-of": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/klaw-sync": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, "node_modules/lazy-val": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", - "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==" + "license": "MIT" }, "node_modules/leac": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz", - "integrity": "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==", + "license": "MIT", "funding": { "url": "https://ko-fi.com/killymxi" } }, "node_modules/levn": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -5883,23 +5225,20 @@ }, "node_modules/lie": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", "dev": true, + "license": "MIT", "dependencies": { "immediate": "~3.0.5" } }, "node_modules/lines-and-columns": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/locate-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "license": "MIT", "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -5910,47 +5249,39 @@ }, "node_modules/lodash": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + "license": "MIT" }, "node_modules/lodash.escaperegexp": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" + "license": "MIT" }, "node_modules/lodash.isequal": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/long": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + "license": "Apache-2.0" }, "node_modules/lowercase-keys": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -5960,9 +5291,8 @@ }, "node_modules/make-fetch-happen": { "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "dev": true, + "license": "ISC", "dependencies": { "agentkeepalive": "^4.2.1", "cacache": "^17.0.0", @@ -5986,18 +5316,16 @@ }, "node_modules/make-fetch-happen/node_modules/lru-cache": { "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/map-obj": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -6006,14 +5334,11 @@ } }, "node_modules/map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==" + "version": "0.1.0" }, "node_modules/matcher": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "license": "MIT", "optional": true, "dependencies": { "escape-string-regexp": "^4.0.0" @@ -6024,8 +5349,7 @@ }, "node_modules/md5": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "license": "BSD-3-Clause", "dependencies": { "charenc": "0.0.2", "crypt": "0.0.2", @@ -6034,9 +5358,8 @@ }, "node_modules/meow": { "version": "10.1.5", - "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", - "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", "dev": true, + "license": "MIT", "dependencies": { "@types/minimist": "^1.2.2", "camelcase-keys": "^7.0.0", @@ -6060,9 +5383,8 @@ }, "node_modules/meow/node_modules/type-fest": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -6072,24 +5394,21 @@ }, "node_modules/merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/micromatch": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -6100,9 +5419,8 @@ }, "node_modules/mime": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -6112,16 +5430,14 @@ }, "node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -6131,42 +5447,37 @@ }, "node_modules/mimic-fn": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/mimic-response": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/min-indent": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/miniget": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/miniget/-/miniget-4.2.3.tgz", - "integrity": "sha512-SjbDPDICJ1zT+ZvQwK0hUcRY4wxlhhNpHL9nJOB2MEAXRGagTljsO8MEDzQMTFf0Q8g4QNi8P9lEm/g7e+qgzA==", + "license": "MIT", "engines": { "node": ">=12" } }, "node_modules/minimatch": { "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -6176,18 +5487,16 @@ }, "node_modules/minimist": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/minimist-options": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, + "license": "MIT", "dependencies": { "arrify": "^1.0.1", "is-plain-obj": "^1.1.0", @@ -6199,18 +5508,16 @@ }, "node_modules/minipass": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=8" } }, "node_modules/minipass-collect": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -6220,9 +5527,8 @@ }, "node_modules/minipass-collect/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -6232,9 +5538,8 @@ }, "node_modules/minipass-fetch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "dev": true, + "license": "MIT", "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", @@ -6249,18 +5554,16 @@ }, "node_modules/minipass-fetch/node_modules/minipass": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", "dev": true, + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/minipass-flush": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -6270,9 +5573,8 @@ }, "node_modules/minipass-flush/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -6282,9 +5584,8 @@ }, "node_modules/minipass-pipeline": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -6294,9 +5595,8 @@ }, "node_modules/minipass-pipeline/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -6306,9 +5606,8 @@ }, "node_modules/minipass-sized": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -6318,9 +5617,8 @@ }, "node_modules/minipass-sized/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -6330,9 +5628,8 @@ }, "node_modules/minizlib": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, + "license": "MIT", "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -6343,9 +5640,8 @@ }, "node_modules/minizlib/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -6355,9 +5651,8 @@ }, "node_modules/mkdirp": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -6367,8 +5662,7 @@ }, "node_modules/mpris-service": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/mpris-service/-/mpris-service-2.1.2.tgz", - "integrity": "sha512-AC6WepCnFWwOME9OWplHZ8ps/BB+g9QrEpUKCv7wX82fDPzR3nPrypOFmL/Fm0JloEAu6QTWSfDLLc6mM/jinw==", + "license": "MIT", "dependencies": { "dbus-next": "^0.9.2", "deep-equal": "^1.0.1", @@ -6377,42 +5671,25 @@ }, "node_modules/ms": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", - "optional": true + "license": "MIT" }, "node_modules/natural-compare": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/negotiator": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/neo-async": { "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/node-addon-api": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", - "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", "dev": true, - "optional": true + "license": "MIT" }, "node_modules/node-fetch": { "version": "2.7.0", @@ -6435,9 +5712,8 @@ }, "node_modules/node-gyp": { "version": "9.4.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", - "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", "dev": true, + "license": "MIT", "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", @@ -6460,9 +5736,8 @@ }, "node_modules/nopt": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", "dev": true, + "license": "ISC", "dependencies": { "abbrev": "^1.0.0" }, @@ -6475,9 +5750,8 @@ }, "node_modules/normalize-package-data": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", @@ -6490,8 +5764,7 @@ }, "node_modules/normalize-url": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -6501,9 +5774,8 @@ }, "node_modules/npm-run-path": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -6513,9 +5785,8 @@ }, "node_modules/npmlog": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", "dev": true, + "license": "ISC", "dependencies": { "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", @@ -6528,17 +5799,15 @@ }, "node_modules/object-inspect": { "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-is": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -6552,17 +5821,15 @@ }, "node_modules/object-keys": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -6578,9 +5845,8 @@ }, "node_modules/object.fromentries": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -6595,9 +5861,8 @@ }, "node_modules/object.groupby": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -6607,9 +5872,8 @@ }, "node_modules/object.values": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -6624,16 +5888,14 @@ }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -6646,17 +5908,30 @@ }, "node_modules/onetime/node_modules/mimic-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/open": { + "version": "7.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/optionator": { "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, + "license": "MIT", "dependencies": { "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", @@ -6669,18 +5944,24 @@ "node": ">= 0.8.0" } }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/p-cancelable": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -6693,8 +5974,7 @@ }, "node_modules/p-locate": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "license": "MIT", "dependencies": { "p-limit": "^2.0.0" }, @@ -6704,9 +5984,8 @@ }, "node_modules/p-map": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", - "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", "dev": true, + "license": "MIT", "dependencies": { "aggregate-error": "^4.0.0" }, @@ -6719,23 +5998,20 @@ }, "node_modules/p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/pako": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true + "dev": true, + "license": "(MIT AND Zlib)" }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -6745,9 +6021,8 @@ }, "node_modules/parse-github-url": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", - "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", "dev": true, + "license": "MIT", "bin": { "parse-github-url": "cli.js" }, @@ -6757,9 +6032,8 @@ }, "node_modules/parse-json": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -6775,8 +6049,7 @@ }, "node_modules/parseley": { "version": "0.12.1", - "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.12.1.tgz", - "integrity": "sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==", + "license": "MIT", "dependencies": { "leac": "^0.6.0", "peberminta": "^0.9.0" @@ -6785,43 +6058,130 @@ "url": "https://ko-fi.com/killymxi" } }, + "node_modules/patch-package": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "ci-info": "^3.7.0", + "cross-spawn": "^7.0.3", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^9.0.0", + "json-stable-stringify": "^1.0.2", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "rimraf": "^2.6.3", + "semver": "^7.5.3", + "slash": "^2.0.0", + "tmp": "^0.0.33", + "yaml": "^2.2.2" + }, + "bin": { + "patch-package": "index.js" + }, + "engines": { + "node": ">=14", + "npm": ">5" + } + }, + "node_modules/patch-package/node_modules/fs-extra": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/patch-package/node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/patch-package/node_modules/rimraf": { + "version": "2.7.1", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/patch-package/node_modules/slash": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/patch-package/node_modules/tmp": { + "version": "0.0.33", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/patch-package/node_modules/universalify": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/path-exists": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-parse": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/path-scurry": { "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^9.1.1 || ^10.0.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -6835,54 +6195,50 @@ }, "node_modules/path-scurry/node_modules/lru-cache": { "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", "dev": true, + "license": "ISC", "engines": { "node": "14 || >=16.14" } }, "node_modules/path-type": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/pause-stream": { "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "license": [ + "MIT", + "Apache2" + ], "dependencies": { "through": "~2.3" } }, "node_modules/peberminta": { "version": "0.9.0", - "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.9.0.tgz", - "integrity": "sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==", + "license": "MIT", "funding": { "url": "https://ko-fi.com/killymxi" } }, "node_modules/pend": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + "license": "MIT" }, "node_modules/picocolors": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -6892,8 +6248,7 @@ }, "node_modules/pkg-up": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "license": "MIT", "dependencies": { "find-up": "^3.0.0" }, @@ -6903,10 +6258,9 @@ }, "node_modules/playwright": { "version": "1.37.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.37.1.tgz", - "integrity": "sha512-bgUXRrQKhT48zHdxDYQTpf//0xDfDd5hLeEhjuSw8rXEGoT9YeElpfvs/izonTNY21IQZ7d3s22jLxYaAnubbQ==", "dev": true, "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { "playwright-core": "1.37.1" }, @@ -6919,9 +6273,8 @@ }, "node_modules/playwright-core": { "version": "1.37.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.37.1.tgz", - "integrity": "sha512-17EuQxlSIYCmEMwzMqusJ2ztDgJePjrbttaefgdsiqeLWidjYz9BxXaTaZWxH1J95SHGk6tjE+dwgWILJoUZfA==", "dev": true, + "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" }, @@ -6931,9 +6284,8 @@ }, "node_modules/plist": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, + "license": "MIT", "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -6945,18 +6297,16 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } }, "node_modules/prettier": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz", - "integrity": "sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==", "dev": true, + "license": "MIT", "peer": true, "bin": { "prettier": "bin/prettier.cjs" @@ -6970,9 +6320,8 @@ }, "node_modules/prettier-linter-helpers": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, + "license": "MIT", "dependencies": { "fast-diff": "^1.1.2" }, @@ -6982,23 +6331,20 @@ }, "node_modules/process-nextick-args": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/progress": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/promise-retry": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, + "license": "MIT", "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" @@ -7009,13 +6355,11 @@ }, "node_modules/proxy-from-env": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + "license": "MIT" }, "node_modules/pump": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -7023,343 +6367,13 @@ }, "node_modules/punycode": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/queue-microtask": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-config-file": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.3.2.tgz", - "integrity": "sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==", - "dev": true, - "dependencies": { - "config-file-ts": "^0.2.4", - "dotenv": "^9.0.2", - "dotenv-expand": "^5.1.0", - "js-yaml": "^4.1.0", - "json5": "^2.2.0", - "lazy-val": "^1.0.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/read-pkg": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", - "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", - "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", - "dev": true, - "dependencies": { - "find-up": "^5.0.0", - "read-pkg": "^6.0.0", - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/redent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", - "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", - "dev": true, - "dependencies": { - "indent-string": "^5.0.0", - "strip-indent": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" - }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/run-applescript": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", - "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", - "dev": true, - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -7375,14 +6389,320 @@ "url": "https://feross.org/support" } ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-config-file": { + "version": "6.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "config-file-ts": "^0.2.4", + "dotenv": "^9.0.2", + "dotenv-expand": "^5.1.0", + "js-yaml": "^4.1.0", + "json5": "^2.2.0", + "lazy-val": "^1.0.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/read-pkg": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^5.0.0", + "read-pkg": "^6.0.0", + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "1.4.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "1.4.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/redent": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^5.0.0", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "license": "MIT" + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "license": "MIT" + }, + "node_modules/responselike": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/run-applescript": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/rxjs": { "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "license": "Apache-2.0", "optional": true, "dependencies": { "tslib": "^2.1.0" @@ -7390,9 +6710,8 @@ }, "node_modules/safe-array-concat": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", - "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.0", @@ -7408,8 +6727,6 @@ }, "node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -7423,13 +6740,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/safe-regex-test": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", @@ -7441,28 +6758,24 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/sanitize-filename": { "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", "dev": true, + "license": "WTFPL OR ISC", "dependencies": { "truncate-utf8-bytes": "^1.0.0" } }, "node_modules/sax": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + "license": "ISC" }, "node_modules/selderee": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.11.0.tgz", - "integrity": "sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==", + "license": "MIT", "dependencies": { "parseley": "^0.12.0" }, @@ -7472,8 +6785,7 @@ }, "node_modules/semver": { "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -7486,14 +6798,12 @@ }, "node_modules/semver-compare": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "license": "MIT", "optional": true }, "node_modules/serialize-error": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", - "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -7506,8 +6816,7 @@ }, "node_modules/serialize-error/node_modules/type-fest": { "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -7517,21 +6826,18 @@ }, "node_modules/set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/setimmediate": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -7541,18 +6847,16 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/side-channel": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -7564,15 +6868,13 @@ }, "node_modules/signal-exit": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/simple-update-notifier": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -7594,9 +6896,8 @@ }, "node_modules/slash": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -7604,26 +6905,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "optional": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/smart-buffer": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -7631,9 +6916,8 @@ }, "node_modules/socks": { "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "dev": true, + "license": "MIT", "dependencies": { "ip": "^2.0.0", "smart-buffer": "^4.2.0" @@ -7645,9 +6929,8 @@ }, "node_modules/socks-proxy-agent": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^6.0.2", "debug": "^4.3.3", @@ -7659,16 +6942,14 @@ }, "node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-support": { "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -7676,9 +6957,8 @@ }, "node_modules/spdx-correct": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -7686,15 +6966,13 @@ }, "node_modules/spdx-exceptions": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true + "dev": true, + "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, + "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -7702,14 +6980,12 @@ }, "node_modules/spdx-license-ids": { "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/split": { "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", + "license": "MIT", "dependencies": { "through": "2" }, @@ -7719,15 +6995,13 @@ }, "node_modules/sprintf-js": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "license": "BSD-3-Clause", "optional": true }, "node_modules/ssri": { "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -7737,52 +7011,45 @@ }, "node_modules/ssri/node_modules/minipass": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", "dev": true, + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/stat-mode": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", - "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/stream-combiner": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", + "license": "MIT", "dependencies": { "duplexer": "~0.1.1" } }, "node_modules/streamsearch": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", "engines": { "node": ">=10.0.0" } }, "node_modules/string_decoder": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -7795,9 +7062,8 @@ "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -7809,9 +7075,8 @@ }, "node_modules/string.prototype.trim": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -7826,9 +7091,8 @@ }, "node_modules/string.prototype.trimend": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -7840,9 +7104,8 @@ }, "node_modules/string.prototype.trimstart": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -7854,9 +7117,8 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -7867,9 +7129,8 @@ "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -7879,27 +7140,24 @@ }, "node_modules/strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/strip-final-newline": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/strip-indent": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", "dev": true, + "license": "MIT", "dependencies": { "min-indent": "^1.0.1" }, @@ -7912,9 +7170,8 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -7924,8 +7181,7 @@ }, "node_modules/strip-outer": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.2" }, @@ -7935,16 +7191,14 @@ }, "node_modules/strip-outer/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/sumchecker": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", - "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "license": "Apache-2.0", "dependencies": { "debug": "^4.1.0" }, @@ -7954,9 +7208,8 @@ }, "node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -7966,9 +7219,8 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7978,9 +7230,8 @@ }, "node_modules/synckit": { "version": "0.8.5", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", - "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", "dev": true, + "license": "MIT", "dependencies": { "@pkgr/utils": "^2.3.1", "tslib": "^2.5.0" @@ -7994,9 +7245,8 @@ }, "node_modules/tar": { "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", "dev": true, + "license": "ISC", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -8011,9 +7261,8 @@ }, "node_modules/tar/node_modules/fs-minipass": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -8023,9 +7272,8 @@ }, "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -8035,9 +7283,8 @@ }, "node_modules/temp-file": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", - "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", "dev": true, + "license": "MIT", "dependencies": { "async-exit-hook": "^2.0.1", "fs-extra": "^10.0.0" @@ -8045,9 +7292,8 @@ }, "node_modules/temp-file/node_modules/fs-extra": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -8059,9 +7305,8 @@ }, "node_modules/temp-file/node_modules/jsonfile": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -8071,29 +7316,25 @@ }, "node_modules/temp-file/node_modules/universalify": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/text-table": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + "license": "MIT" }, "node_modules/titleize": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", - "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -8103,22 +7344,19 @@ }, "node_modules/tldts-core": { "version": "6.0.14", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.0.14.tgz", - "integrity": "sha512-ESYhU/bgs6jiHlnl5h029f+0dB7EKRiTaxM/jHLZ6powScbmsgsrFcFjmyrjDgCvI/BRY79TEBBClmqLNEPyjQ==" + "license": "MIT" }, "node_modules/tldts-experimental": { "version": "6.0.14", - "resolved": "https://registry.npmjs.org/tldts-experimental/-/tldts-experimental-6.0.14.tgz", - "integrity": "sha512-q9tVxHEotaG1buC8E4k+1iGecpM9iLD9FqWzWUKMilUoCpK8uJcO20iDA9ORCojqZdsMXgPgBlSetwiw5ML0tg==", + "license": "MIT", "dependencies": { "tldts-core": "^6.0.14" } }, "node_modules/tmp": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dev": true, + "license": "MIT", "dependencies": { "rimraf": "^3.0.0" }, @@ -8128,18 +7366,16 @@ }, "node_modules/tmp-promise": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", - "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", "dev": true, + "license": "MIT", "dependencies": { "tmp": "^0.2.0" } }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -8149,14 +7385,12 @@ }, "node_modules/tr46": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "license": "MIT" }, "node_modules/trim-newlines": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", - "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -8166,8 +7400,7 @@ }, "node_modules/trim-repeated": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.2" }, @@ -8177,26 +7410,23 @@ }, "node_modules/trim-repeated/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/truncate-utf8-bytes": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", "dev": true, + "license": "WTFPL", "dependencies": { "utf8-byte-length": "^1.0.1" } }, "node_modules/tsconfig-paths": { "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", "dev": true, + "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -8206,9 +7436,8 @@ }, "node_modules/tsconfig-paths/node_modules/json5": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -8218,14 +7447,12 @@ }, "node_modules/tslib": { "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -8235,8 +7462,7 @@ }, "node_modules/type-fest": { "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" }, @@ -8246,9 +7472,8 @@ }, "node_modules/typed-array-buffer": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1", @@ -8260,9 +7485,8 @@ }, "node_modules/typed-array-byte-length": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "for-each": "^0.3.3", @@ -8278,9 +7502,8 @@ }, "node_modules/typed-array-byte-offset": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -8297,9 +7520,8 @@ }, "node_modules/typed-array-length": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "for-each": "^0.3.3", @@ -8311,17 +7533,15 @@ }, "node_modules/typed-emitter": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/typed-emitter/-/typed-emitter-2.1.0.tgz", - "integrity": "sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==", + "license": "MIT", "optionalDependencies": { "rxjs": "*" } }, "node_modules/typescript": { "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -8332,9 +7552,8 @@ }, "node_modules/uglify-js": { "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, + "license": "BSD-2-Clause", "optional": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -8345,9 +7564,8 @@ }, "node_modules/unbox-primitive": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -8360,8 +7578,7 @@ }, "node_modules/undici": { "version": "5.23.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.23.0.tgz", - "integrity": "sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==", + "license": "MIT", "dependencies": { "busboy": "^1.6.0" }, @@ -8371,9 +7588,8 @@ }, "node_modules/unique-filename": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", "dev": true, + "license": "ISC", "dependencies": { "unique-slug": "^4.0.0" }, @@ -8383,9 +7599,8 @@ }, "node_modules/unique-slug": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" }, @@ -8395,26 +7610,23 @@ }, "node_modules/universalify": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "license": "MIT", "engines": { "node": ">= 4.0.0" } }, "node_modules/untildify": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/unzip-crx-3": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/unzip-crx-3/-/unzip-crx-3-0.2.0.tgz", - "integrity": "sha512-0+JiUq/z7faJ6oifVB5nSwt589v1KCduqIJupNVDoWSXZtWDmjDGO3RAEOvwJ07w90aoXoP4enKsR7ecMrJtWQ==", "dev": true, + "license": "MIT", "dependencies": { "jszip": "^3.1.0", "mkdirp": "^0.5.1", @@ -8423,9 +7635,8 @@ }, "node_modules/unzip-crx-3/node_modules/mkdirp": { "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.6" }, @@ -8435,80 +7646,55 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/url-match-patterns": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/url-match-patterns/-/url-match-patterns-0.2.0.tgz", - "integrity": "sha512-vtaWyxq+CyrQP4/dapGddkSGwGypQOD2qjHcsqp9ahsjRWzGtjqm+ANxApH46OfWQfpkL6cuyPwsm80386jdjQ==", + "license": "MIT", "dependencies": { "lodash": "^4.3.0" } }, "node_modules/utf8-byte-length": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", - "dev": true + "dev": true, + "license": "WTFPL" }, "node_modules/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/uuid": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "license": "MIT", "bin": { "uuid": "bin/uuid" } }, "node_modules/validate-npm-package-license": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, - "node_modules/verror": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", - "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", - "dev": true, - "optional": true, - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/vudio": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/vudio/-/vudio-2.1.1.tgz", - "integrity": "sha512-VkFQcFt/b/kpF5Eg5Sq+oXUo1Zp5aRFF4BSmIrOzau5o+5WMWwX9ae/EGJZstCyZFiCTU5iw1Y+u2BCGW6Y6Jw==" + "license": "MIT" }, "node_modules/webidl-conversions": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "license": "BSD-2-Clause" }, "node_modules/whatwg-url": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -8516,9 +7702,8 @@ }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -8531,9 +7716,8 @@ }, "node_modules/which-boxed-primitive": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, + "license": "MIT", "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -8547,9 +7731,8 @@ }, "node_modules/which-typed-array": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", - "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -8566,24 +7749,21 @@ }, "node_modules/wide-align": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "node_modules/wordwrap": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -8599,9 +7779,8 @@ "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -8616,13 +7795,11 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "license": "ISC" }, "node_modules/ws": { "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -8641,8 +7818,7 @@ }, "node_modules/xml2js": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", - "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "license": "MIT", "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -8653,46 +7829,48 @@ }, "node_modules/xml2js/node_modules/xmlbuilder": { "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", "engines": { "node": ">=4.0" } }, "node_modules/xmlbuilder": { "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.0" } }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yaku": { "version": "0.16.7", - "resolved": "https://registry.npmjs.org/yaku/-/yaku-0.16.7.tgz", - "integrity": "sha512-Syu3IB3rZvKvYk7yTiyl1bo/jiEFaaStrgv1V2TIJTqYPStSMQVO8EQjg/z+DRzLq/4LIIharNT3iH1hylEIRw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.3.2", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 14" + } }, "node_modules/yargs": { "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -8708,26 +7886,23 @@ }, "node_modules/yargs-parser": { "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yargs/node_modules/yargs-parser": { "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/yauzl": { "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" @@ -8735,9 +7910,8 @@ }, "node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -8747,11 +7921,10 @@ }, "node_modules/youtubei.js": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/youtubei.js/-/youtubei.js-6.1.0.tgz", - "integrity": "sha512-EJmPuQ1pLimrcp5nPDSeZHVthT7KJLxp9Z5sYmihXKn1ct8e7cntKaFnPvy5QsbjpipICpDpQEs+d+owDhjgIg==", "funding": [ "https://github.com/sponsors/LuanRT" ], + "license": "MIT", "dependencies": { "jintr": "^1.1.0", "tslib": "^2.5.0", @@ -8760,8 +7933,7 @@ }, "node_modules/ytpl": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ytpl/-/ytpl-2.3.0.tgz", - "integrity": "sha512-Cfw2rxq3PFK6qgWr2Z8gsRefVahEzbn9XEuiJldqdXHE6GhO7kTfEvbZKdfXing1SmgW635uJ/UL2g8r0fvu2Q==", + "license": "MIT", "dependencies": { "miniget": "^4.2.2" }, diff --git a/package.json b/package.json index 6cba4a23..543ec9d8 100644 --- a/package.json +++ b/package.json @@ -106,8 +106,8 @@ }, "dependencies": { "@cliqz/adblocker-electron": "1.26.6", - "@ffmpeg/core": "0.12.2", - "@ffmpeg/ffmpeg": "0.12.5", + "@ffmpeg/core": "0.11.0", + "@ffmpeg/ffmpeg": "0.11.6", "@foobar404/wave": "2.0.4", "@xhayper/discord-rpc": "1.0.22", "async-mutex": "0.4.0", @@ -115,7 +115,7 @@ "butterchurn": "2.6.7", "butterchurn-presets": "2.4.7", "custom-electron-prompt": "1.5.7", - "custom-electron-titlebar": "4.2.7", + "custom-electron-titlebar": "4.1.6", "electron-better-web-request": "1.0.1", "electron-debug": "3.2.0", "electron-is": "3.0.0", @@ -130,7 +130,6 @@ "keyboardevents-areequal": "0.2.2", "md5": "2.3.0", "mpris-service": "2.1.2", - "node-fetch": "2.7.0", "simple-youtube-age-restriction-bypass": "git+https://github.com/zerodytrash/Simple-YouTube-Age-Restriction-Bypass.git#v2.5.9", "vudio": "2.1.1", "youtubei.js": "6.1.0", @@ -138,6 +137,7 @@ }, "overrides": { "xml2js": "0.6.2", + "node-fetch": "2.7.0", "@electron/universal": "1.4.1" }, "devDependencies": { @@ -151,6 +151,7 @@ "eslint-plugin-import": "2.28.1", "eslint-plugin-prettier": "5.0.0", "node-gyp": "9.4.0", + "patch-package": "^8.0.0", "playwright": "1.37.1" }, "auto-changelog": { diff --git a/plugins/adblocker/blocker.js b/plugins/adblocker/blocker.js index c5d0b73d..49c6085f 100644 --- a/plugins/adblocker/blocker.js +++ b/plugins/adblocker/blocker.js @@ -2,7 +2,6 @@ const { promises } = require('node:fs'); // Used for caching const path = require('node:path'); const { ElectronBlocker } = require('@cliqz/adblocker-electron'); -const fetch = require('node-fetch'); const SOURCES = [ 'https://raw.githubusercontent.com/kbinani/adblock-youtube-ads/master/signed.txt', diff --git a/plugins/in-app-menu/front.js b/plugins/in-app-menu/front.js index 8e2175dd..83d8fe38 100644 --- a/plugins/in-app-menu/front.js +++ b/plugins/in-app-menu/front.js @@ -1,5 +1,5 @@ const { ipcRenderer } = require('electron'); -const { Titlebar, TitlebarColor } = require('custom-electron-titlebar'); +const { Titlebar, Color } = require('custom-electron-titlebar'); const config = require('../../config'); const { isEnabled } = require('../../config/plugins'); @@ -12,9 +12,9 @@ module.exports = () => { const visible = () => Boolean($('.cet-menubar').firstChild); const bar = new Titlebar({ icon: 'https://cdn-icons-png.flaticon.com/512/5358/5358672.png', - backgroundColor: TitlebarColor.fromHex('#050505'), - itemBackgroundColor: TitlebarColor.fromHex('#1d1d1d'), - svgColor: TitlebarColor.WHITE, + backgroundColor: Color.fromHex('#050505'), + itemBackgroundColor: Color.fromHex('#1d1d1d'), + svgColor: Color.WHITE, menu: config.get('options.hideMenu') ? null : undefined, }); bar.updateTitle(' '); diff --git a/plugins/last-fm/back.js b/plugins/last-fm/back.js index ae63af27..9d735168 100644 --- a/plugins/last-fm/back.js +++ b/plugins/last-fm/back.js @@ -1,5 +1,4 @@ const { shell } = require('electron'); -const fetch = require('node-fetch'); const md5 = require('md5'); const { setOptions } = require('../../config/plugins'); diff --git a/plugins/lyrics-genius/back.js b/plugins/lyrics-genius/back.js index b0a19d78..0c87db12 100644 --- a/plugins/lyrics-genius/back.js +++ b/plugins/lyrics-genius/back.js @@ -3,7 +3,6 @@ const { join } = require('node:path'); const { ipcMain } = require('electron'); const is = require('electron-is'); const { convert } = require('html-to-text'); -const fetch = require('node-fetch'); const { cleanupName } = require('../../providers/song-info'); const { injectCSS } = require('../utils'); @@ -99,7 +98,7 @@ const getLyrics = async (url) => { } const html = await response.text(); - const lyrics = convert(html, { + return convert(html, { baseElements: { selectors: ['[class^="Lyrics__Container"]', '.lyrics'], }, @@ -116,7 +115,6 @@ const getLyrics = async (url) => { }, }, }); - return lyrics; }; module.exports.toggleRomanized = toggleRomanized; diff --git a/plugins/sponsorblock/back.js b/plugins/sponsorblock/back.js index 82d5a314..2014705f 100644 --- a/plugins/sponsorblock/back.js +++ b/plugins/sponsorblock/back.js @@ -1,5 +1,4 @@ const { ipcMain } = require('electron'); -const fetch = require('node-fetch'); const is = require('electron-is'); const { sortSegments } = require('./segments'); @@ -38,11 +37,9 @@ const fetchSegments = async (apiURL, categories) => { } const segments = await resp.json(); - const sortedSegments = sortSegments( + return sortSegments( segments.map((submission) => submission.segment), ); - - return sortedSegments; } catch (error) { if (is.dev()) { console.log('error on sponsorblock request:', error); diff --git a/plugins/tuna-obs/back.js b/plugins/tuna-obs/back.js index f3f2db87..a1a7d0c2 100644 --- a/plugins/tuna-obs/back.js +++ b/plugins/tuna-obs/back.js @@ -1,5 +1,4 @@ const { ipcMain } = require('electron'); -const fetch = require('node-fetch'); const registerCallback = require('../../providers/song-info'); @@ -24,7 +23,7 @@ const post = async (data) => { 'Access-Control-Allow-Headers': '*', 'Access-Control-Allow-Origin': '*', }; - const url = `http://localhost:${port}/`; + const url = `http://127.0.0.1:${port}/`; fetch(url, { method: 'POST', headers, diff --git a/providers/prompt-custom-titlebar.js b/providers/prompt-custom-titlebar.js index 0c4a87bb..852013a8 100644 --- a/providers/prompt-custom-titlebar.js +++ b/providers/prompt-custom-titlebar.js @@ -1,8 +1,8 @@ -const { Titlebar, TitlebarColor } = require('custom-electron-titlebar'); +const { Titlebar, Color } = require('custom-electron-titlebar'); module.exports = () => { new Titlebar({ - backgroundColor: TitlebarColor.fromHex('#050505'), + backgroundColor: Color.fromHex('#050505'), minimizable: false, maximizable: false, menu: null, diff --git a/providers/song-info.js b/providers/song-info.js index a3d9ad94..841a0845 100644 --- a/providers/song-info.js +++ b/providers/song-info.js @@ -1,5 +1,4 @@ const { ipcMain, nativeImage } = require('electron'); -const fetch = require('node-fetch'); const config = require('../config'); const { cache } = require('../providers/decorators'); @@ -31,8 +30,8 @@ const getImage = cache( */ async (src) => { const result = await fetch(src); - const buffer = await result.buffer(); - const output = nativeImage.createFromBuffer(buffer); + const buffer = await result.arrayBuffer(); + const output = nativeImage.createFromBuffer(Buffer.from(buffer)); if (output.isEmpty() && !src.endsWith('.jpg') && src.includes('.jpg')) { // Fix hidden webp files (https://github.com/th-ch/youtube-music/issues/315) return getImage(src.slice(0, src.lastIndexOf('.jpg') + 4)); } From 4284bcc32981c205a5541c3c2f2b932796ac82eb Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Wed, 30 Aug 2023 21:46:23 +0900 Subject: [PATCH 10/70] fix: video event listener --- providers/song-info-front.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/providers/song-info-front.js b/providers/song-info-front.js index 86a419b1..f41e371c 100644 --- a/providers/song-info-front.js +++ b/providers/song-info-front.js @@ -83,13 +83,12 @@ module.exports = () => { pause: (e) => playPausedHandler(e, 'pause'), }; - const video = $('video'); - // Name = "dataloaded" and abit later "dataupdated" apiEvent.detail.addEventListener('videodatachange', (name) => { if (name !== 'dataloaded') { return; } + const video = $('video'); video.dispatchEvent(srcChangedEvent); for (const status of ['playing', 'pause']) { // for fix issue that pause event not fired @@ -98,6 +97,7 @@ module.exports = () => { setTimeout(sendSongInfo, 200); }); + const video = $('video'); for (const status of ['playing', 'pause']) { video.addEventListener(status, playPausedHandlers[status]); } From 06b9cf9255989e6904e1485e91d482dd20e57e0d Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Wed, 30 Aug 2023 22:05:36 +0900 Subject: [PATCH 11/70] chore(deps): electron 27.0.0-alpha.4 --- package-lock.json | 10 +++++----- package.json | 5 +++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 070644d8..971b07bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,7 @@ "@playwright/test": "1.37.1", "auto-changelog": "2.4.0", "del-cli": "5.0.1", - "electron": "26.1.0", + "electron": "27.0.0-alpha.4", "electron-builder": "24.6.3", "electron-devtools-installer": "3.2.0", "eslint": "8.48.0", @@ -2860,9 +2860,10 @@ } }, "node_modules/electron": { - "version": "26.1.0", + "version": "27.0.0-alpha.4", + "resolved": "https://registry.npmjs.org/electron/-/electron-27.0.0-alpha.4.tgz", + "integrity": "sha512-onFtU9wcvUG2BvK+3nBzJx+h95PEq+dPOXwUKIeA2E/LcxgtAwHihImftzLodUDyrZHDyRSbbAXuNrKlSsZOlw==", "hasInstallScript": true, - "license": "MIT", "dependencies": { "@electron/get": "^2.0.0", "@types/node": "^18.11.18", @@ -5693,8 +5694,7 @@ }, "node_modules/node-fetch": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, diff --git a/package.json b/package.json index 543ec9d8..1e3fea37 100644 --- a/package.json +++ b/package.json @@ -138,13 +138,14 @@ "overrides": { "xml2js": "0.6.2", "node-fetch": "2.7.0", - "@electron/universal": "1.4.1" + "@electron/universal": "1.4.1", + "electron": "27.0.0-alpha.4" }, "devDependencies": { "@playwright/test": "1.37.1", "auto-changelog": "2.4.0", "del-cli": "5.0.1", - "electron": "26.1.0", + "electron": "27.0.0-alpha.4", "electron-builder": "24.6.3", "electron-devtools-installer": "3.2.0", "eslint": "8.48.0", From b67a4ed9bb147370e7cc26f905c9cb6ffcab440b Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Fri, 1 Sep 2023 21:21:34 +0900 Subject: [PATCH 12/70] chore(deps): electron 27.0.0-alpha.5 --- package-lock.json | 3378 ++++++++++++++++++++++++++++----------------- package.json | 4 +- 2 files changed, 2149 insertions(+), 1233 deletions(-) diff --git a/package-lock.json b/package-lock.json index 971b07bf..2cd08e2c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,7 @@ "@playwright/test": "1.37.1", "auto-changelog": "2.4.0", "del-cli": "5.0.1", - "electron": "27.0.0-alpha.4", + "electron": "27.0.0-alpha.5", "electron-builder": "24.6.3", "electron-devtools-installer": "3.2.0", "eslint": "8.48.0", @@ -60,16 +60,18 @@ }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/@babel/code-frame": { "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, - "license": "MIT", "dependencies": { "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" @@ -80,8 +82,9 @@ }, "node_modules/@babel/code-frame/node_modules/ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -91,8 +94,9 @@ }, "node_modules/@babel/code-frame/node_modules/chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -104,37 +108,42 @@ }, "node_modules/@babel/code-frame/node_modules/color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "1.1.3" } }, "node_modules/@babel/code-frame/node_modules/color-name": { "version": "1.1.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/@babel/code-frame/node_modules/has-flag": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@babel/code-frame/node_modules/supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -144,16 +153,18 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", + "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.4.2", @@ -165,8 +176,9 @@ }, "node_modules/@babel/highlight/node_modules/ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -176,8 +188,9 @@ }, "node_modules/@babel/highlight/node_modules/chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -189,37 +202,42 @@ }, "node_modules/@babel/highlight/node_modules/color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "1.1.3" } }, "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@babel/highlight/node_modules/supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -229,7 +247,8 @@ }, "node_modules/@babel/runtime": { "version": "7.22.11", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.11.tgz", + "integrity": "sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -237,9 +256,15 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/runtime/node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, "node_modules/@cliqz/adblocker": { "version": "1.26.6", - "license": "MPL-2.0", + "resolved": "https://registry.npmjs.org/@cliqz/adblocker/-/adblocker-1.26.6.tgz", + "integrity": "sha512-fSNCvyl0FRgKcc2NmHEhaQqeTT0QCLBT3eVZ15ah6baPdCaQm7N5IN/annv9bRalS8Lwbxymb3TBLzXpFTghrw==", "dependencies": { "@cliqz/adblocker-content": "^1.26.6", "@cliqz/adblocker-extended-selectors": "^1.26.6", @@ -253,14 +278,16 @@ }, "node_modules/@cliqz/adblocker-content": { "version": "1.26.6", - "license": "MPL-2.0", + "resolved": "https://registry.npmjs.org/@cliqz/adblocker-content/-/adblocker-content-1.26.6.tgz", + "integrity": "sha512-cebc5AjL/quVVdcClJ7dqqvW5SrqATfUhwqn5MzWtponZ3t3fRpgpFgkt2fNa5rd3iz1UfTcAtWrgpshHYurTA==", "dependencies": { "@cliqz/adblocker-extended-selectors": "^1.26.6" } }, "node_modules/@cliqz/adblocker-electron": { "version": "1.26.6", - "license": "MPL-2.0", + "resolved": "https://registry.npmjs.org/@cliqz/adblocker-electron/-/adblocker-electron-1.26.6.tgz", + "integrity": "sha512-OE0Qh2+OGrx53DkV9gj1JzYdUV1IM7JigpU++5sA6yhsdbZBFijto0SK3iDsMsHeEUVq8DV1oLYspe0UpIU4SA==", "dependencies": { "@cliqz/adblocker": "^1.26.6", "@cliqz/adblocker-electron-preload": "^1.26.6", @@ -272,7 +299,8 @@ }, "node_modules/@cliqz/adblocker-electron-preload": { "version": "1.26.6", - "license": "MPL-2.0", + "resolved": "https://registry.npmjs.org/@cliqz/adblocker-electron-preload/-/adblocker-electron-preload-1.26.6.tgz", + "integrity": "sha512-G564oo1YANQR7mAzuQi7aYsgKwmRurYo0d9E8YaZr6ZD/kDHKxgHLfGPflKuOsYz2gf9zWQT89RsyQxDrjI49g==", "dependencies": { "@cliqz/adblocker-content": "^1.26.6" }, @@ -282,12 +310,14 @@ }, "node_modules/@cliqz/adblocker-extended-selectors": { "version": "1.26.6", - "license": "MPL-2.0" + "resolved": "https://registry.npmjs.org/@cliqz/adblocker-extended-selectors/-/adblocker-extended-selectors-1.26.6.tgz", + "integrity": "sha512-Gpvg6eLO2aHiY7r2y0jueve6YbGkYvWaZ4MiwhQ1wPTwj/MxFqAh9cVHnz3EzoJUtsqoy9bvkhmfkRUatpvvzw==" }, "node_modules/@develar/schema-utils": { "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.12.0", "ajv-keywords": "^3.4.1" @@ -302,8 +332,9 @@ }, "node_modules/@electron/asar": { "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.4.tgz", + "integrity": "sha512-lykfY3TJRRWFeTxccEKdf1I6BLl2Plw81H0bbp4Fc5iEc67foDCa5pjJQULVgo0wF+Dli75f3xVcdb/67FFZ/g==", "dev": true, - "license": "MIT", "dependencies": { "chromium-pickle-js": "^0.2.0", "commander": "^5.0.0", @@ -319,8 +350,9 @@ }, "node_modules/@electron/asar/node_modules/brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -328,16 +360,18 @@ }, "node_modules/@electron/asar/node_modules/commander": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/@electron/asar/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -347,7 +381,8 @@ }, "node_modules/@electron/get": { "version": "2.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.2.tgz", + "integrity": "sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g==", "dependencies": { "debug": "^4.1.1", "env-paths": "^2.2.0", @@ -366,15 +401,17 @@ }, "node_modules/@electron/get/node_modules/semver": { "version": "6.3.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } }, "node_modules/@electron/notarize": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-1.2.4.tgz", + "integrity": "sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^4.1.1", "fs-extra": "^9.0.1" @@ -385,8 +422,9 @@ }, "node_modules/@electron/notarize/node_modules/fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -399,8 +437,9 @@ }, "node_modules/@electron/notarize/node_modules/jsonfile": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -410,16 +449,18 @@ }, "node_modules/@electron/notarize/node_modules/universalify": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/@electron/osx-sign": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz", + "integrity": "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "compare-version": "^0.1.2", "debug": "^4.3.4", @@ -438,8 +479,9 @@ }, "node_modules/@electron/osx-sign/node_modules/fs-extra": { "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -451,8 +493,9 @@ }, "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 8.0.0" }, @@ -462,8 +505,9 @@ }, "node_modules/@electron/osx-sign/node_modules/jsonfile": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -473,16 +517,18 @@ }, "node_modules/@electron/osx-sign/node_modules/universalify": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/@electron/universal": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.4.1.tgz", + "integrity": "sha512-lE/U3UNw1YHuowNbTmKNs9UlS3En3cPgwM5MI+agIgr/B1hSze9NdOP0qn7boZaI9Lph8IDv3/24g9IxnJP7aQ==", "dev": true, - "license": "MIT", "dependencies": { "@electron/asar": "^3.2.1", "@malept/cross-spawn-promise": "^1.1.0", @@ -498,8 +544,9 @@ }, "node_modules/@electron/universal/node_modules/brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -507,8 +554,9 @@ }, "node_modules/@electron/universal/node_modules/fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -521,8 +569,9 @@ }, "node_modules/@electron/universal/node_modules/jsonfile": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -532,8 +581,9 @@ }, "node_modules/@electron/universal/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -543,16 +593,18 @@ }, "node_modules/@electron/universal/node_modules/universalify": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, - "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -565,16 +617,18 @@ }, "node_modules/@eslint-community/regexpp": { "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", + "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", "dev": true, - "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -595,8 +649,9 @@ }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -604,8 +659,9 @@ }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -615,19 +671,22 @@ }, "node_modules/@eslint/js": { "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", + "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", "dev": true, - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@ffmpeg/core": { "version": "0.11.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@ffmpeg/core/-/core-0.11.0.tgz", + "integrity": "sha512-9Tt/+2PMpkGPXUK8n6He9G8Y+qR6qmCPSCw9iEKZxHHOvJ9BE/r0Fccj+YgDZTlyu6rXxc9x6EqCaFBIt7qzjA==" }, "node_modules/@ffmpeg/ffmpeg": { "version": "0.11.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@ffmpeg/ffmpeg/-/ffmpeg-0.11.6.tgz", + "integrity": "sha512-uN8J8KDjADEavPhNva6tYO9Fj0lWs9z82swF3YXnTxWMBoFLGq3LZ6FLlIldRKEzhOBKnkVfA8UnFJuvGvNxcA==", "dependencies": { "is-url": "^1.2.4", "node-fetch": "^2.6.1", @@ -638,18 +697,16 @@ "node": ">=12.16.1" } }, - "node_modules/@ffmpeg/ffmpeg/node_modules/regenerator-runtime": { - "version": "0.13.11", - "license": "MIT" - }, "node_modules/@foobar404/wave": { "version": "2.0.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@foobar404/wave/-/wave-2.0.4.tgz", + "integrity": "sha512-FEyg37hDvQtrQVlFxbit7ov5e487BjsR32bZfJ4oAb5i+NnlbGaNyy6iYBZ8ocVHo8fgug+SL+mFdDTzqjvPww==" }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", @@ -661,8 +718,9 @@ }, "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -670,8 +728,9 @@ }, "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -681,8 +740,9 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -693,13 +753,15 @@ }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", - "dev": true, - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true }, "node_modules/@isaacs/cliui": { "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, - "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -714,8 +776,9 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -725,8 +788,9 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -736,13 +800,15 @@ }, "node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, - "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -757,8 +823,9 @@ }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -771,8 +838,9 @@ }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -787,6 +855,8 @@ }, "node_modules/@malept/cross-spawn-promise": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", + "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", "dev": true, "funding": [ { @@ -798,7 +868,6 @@ "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" } ], - "license": "Apache-2.0", "dependencies": { "cross-spawn": "^7.0.1" }, @@ -808,8 +877,9 @@ }, "node_modules/@malept/flatpak-bundler": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", + "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^4.1.1", "fs-extra": "^9.0.0", @@ -822,8 +892,9 @@ }, "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -836,8 +907,9 @@ }, "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -847,16 +919,18 @@ }, "node_modules/@malept/flatpak-bundler/node_modules/universalify": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -867,16 +941,18 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, - "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -887,15 +963,17 @@ }, "node_modules/@nornagon/put": { "version": "0.0.8", - "license": "MIT/X11", + "resolved": "https://registry.npmjs.org/@nornagon/put/-/put-0.0.8.tgz", + "integrity": "sha512-ugvXJjwF5ldtUpa7D95kruNJ41yFQDEKyF5CW4TgKJnh+W/zmlBzXXeKTyqIgwMFrkePN2JqOBqcF0M0oOunow==", "engines": { "node": ">=0.3.0" } }, "node_modules/@npmcli/fs": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", "dev": true, - "license": "ISC", "dependencies": { "semver": "^7.3.5" }, @@ -905,8 +983,9 @@ }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, - "license": "MIT", "optional": true, "engines": { "node": ">=14" @@ -914,8 +993,9 @@ }, "node_modules/@pkgr/utils": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", "dev": true, - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "fast-glob": "^3.3.0", @@ -933,8 +1013,9 @@ }, "node_modules/@pkgr/utils/node_modules/open": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", "dev": true, - "license": "MIT", "dependencies": { "default-browser": "^4.0.0", "define-lazy-prop": "^3.0.0", @@ -950,8 +1031,9 @@ }, "node_modules/@playwright/test": { "version": "1.37.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.37.1.tgz", + "integrity": "sha512-bq9zTli3vWJo8S3LwB91U0qDNQDpEXnw7knhxLM0nwDvexQAwx9tO8iKDZSqqneVq+URd/WIoz+BALMqUTgdSg==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@types/node": "*", "playwright-core": "1.37.1" @@ -968,15 +1050,18 @@ }, "node_modules/@remusao/guess-url-type": { "version": "1.2.1", - "license": "MPL-2.0" + "resolved": "https://registry.npmjs.org/@remusao/guess-url-type/-/guess-url-type-1.2.1.tgz", + "integrity": "sha512-rbOqre2jW8STjheOsOaQHLgYBaBZ9Owbdt8NO7WvNZftJlaG3y/K9oOkl8ZUpuFBisIhmBuMEW6c+YrQl5inRA==" }, "node_modules/@remusao/small": { "version": "1.2.1", - "license": "MPL-2.0" + "resolved": "https://registry.npmjs.org/@remusao/small/-/small-1.2.1.tgz", + "integrity": "sha512-7MjoGt0TJMVw1GPKgWq6SJPws1SLsUXQRa43Umht+nkyw2jnpy3WpiLNqGdwo5rHr5Wp9B2W/Pm5RQp656UJdw==" }, "node_modules/@remusao/smaz": { "version": "1.9.1", - "license": "MPL-2.0", + "resolved": "https://registry.npmjs.org/@remusao/smaz/-/smaz-1.9.1.tgz", + "integrity": "sha512-e6BLuP8oaXCZ9+v46Is4ilAZ/Vq6YLgmBP204Ixgk1qTjXmqvFYG7+AS7v9nsZdGOy96r9DWGFbbDVgMxwu1rA==", "dependencies": { "@remusao/smaz-compress": "^1.9.1", "@remusao/smaz-decompress": "^1.9.1" @@ -984,22 +1069,26 @@ }, "node_modules/@remusao/smaz-compress": { "version": "1.9.1", - "license": "MPL-2.0", + "resolved": "https://registry.npmjs.org/@remusao/smaz-compress/-/smaz-compress-1.9.1.tgz", + "integrity": "sha512-E2f48TwloQu3r6BdLOGF2aczeH7bJ/32oJGqvzT9SKur0cuUnLcZ7ZXP874E2fwmdE+cXzfC7bKzp79cDnmeyw==", "dependencies": { "@remusao/trie": "^1.4.1" } }, "node_modules/@remusao/smaz-decompress": { "version": "1.9.1", - "license": "MPL-2.0" + "resolved": "https://registry.npmjs.org/@remusao/smaz-decompress/-/smaz-decompress-1.9.1.tgz", + "integrity": "sha512-TfjKKprYe3n47od8auhvJ/Ikj9kQTbDTe71ynKlxslrvvUhlIV3VQSuwYuMWMbdz1fIs0H/fxCN1Z8/H3km6/A==" }, "node_modules/@remusao/trie": { "version": "1.4.1", - "license": "MPL-2.0" + "resolved": "https://registry.npmjs.org/@remusao/trie/-/trie-1.4.1.tgz", + "integrity": "sha512-yvwa+aCyYI/UjeD39BnpMypG8N06l86wIDW1/PAc6ihBRnodIfZDwccxQN3n1t74wduzaz74m4ZMHZnB06567Q==" }, "node_modules/@selderee/plugin-htmlparser2": { "version": "0.11.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz", + "integrity": "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==", "dependencies": { "domhandler": "^5.0.3", "selderee": "^0.11.0" @@ -1010,7 +1099,8 @@ }, "node_modules/@sindresorhus/is": { "version": "4.6.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "engines": { "node": ">=10" }, @@ -1020,7 +1110,8 @@ }, "node_modules/@szmarczak/http-timer": { "version": "4.0.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "dependencies": { "defer-to-connect": "^2.0.0" }, @@ -1030,15 +1121,17 @@ }, "node_modules/@tootallnate/once": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true, - "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/@types/cacheable-request": { "version": "6.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", @@ -1048,7 +1141,8 @@ }, "node_modules/@types/chrome": { "version": "0.0.228", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.228.tgz", + "integrity": "sha512-rDmyVEF+l9H+6FQYqsEGqQOjBw/uaSx6KJ6o47FwbQmPPcskmt8XlPbKjy5KeQXU3ZLiV2x45Fk4kdtRMSghfQ==", "dependencies": { "@types/filesystem": "*", "@types/har-format": "*" @@ -1056,109 +1150,117 @@ }, "node_modules/@types/debug": { "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", + "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/ms": "*" } }, - "node_modules/@types/eslint": { - "version": "8.44.2", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/@types/filesystem": { "version": "0.0.32", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.32.tgz", + "integrity": "sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ==", "dependencies": { "@types/filewriter": "*" } }, "node_modules/@types/filewriter": { "version": "0.0.29", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.29.tgz", + "integrity": "sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ==" }, "node_modules/@types/firefox-webext-browser": { "version": "111.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/firefox-webext-browser/-/firefox-webext-browser-111.0.1.tgz", + "integrity": "sha512-mmHWdQTCT68X0hh0URrsIyWhJeFzZHaiprj6nni/CmsAmqYq27T0eZyu1ePeKJ/zuDD3wqtTzm5TwRFAso+oPw==" }, "node_modules/@types/fs-extra": { "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/har-format": { "version": "1.2.12", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.12.tgz", + "integrity": "sha512-P20p/YBrqUBmzD6KhIQ8EiY4/RRzlekL4eCvfQnulFPfjmiGxKIoyCeI7qam5I7oKH3P8EU4ptEi0EfyGoLysw==" }, "node_modules/@types/http-cache-semantics": { "version": "4.0.1", - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.12", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" }, "node_modules/@types/json5": { "version": "0.0.29", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true }, "node_modules/@types/keyv": { "version": "3.1.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/minimist": { "version": "1.2.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true }, "node_modules/@types/ms": { "version": "0.7.31", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "dev": true }, "node_modules/@types/node": { "version": "20.5.7", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", + "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==" }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "node_modules/@types/plist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.2.tgz", + "integrity": "sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw==", "dev": true, - "license": "MIT" + "optional": true, + "dependencies": { + "@types/node": "*", + "xmlbuilder": ">=11.0.1" + } }, "node_modules/@types/responselike": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", "dependencies": { "@types/node": "*" } }, + "node_modules/@types/verror": { + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.6.tgz", + "integrity": "sha512-NNm+gdePAX1VGvPcGZCDKQZKYSiAWigKhKaz5KF94hG6f2s8de9Ow5+7AbXoeKxL8gavZfk4UquSAygOF2duEQ==", + "dev": true, + "optional": true + }, "node_modules/@types/yauzl": { "version": "2.10.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", "optional": true, "dependencies": { "@types/node": "*" @@ -1166,7 +1268,8 @@ }, "node_modules/@xhayper/discord-rpc": { "version": "1.0.22", - "license": "ISC", + "resolved": "https://registry.npmjs.org/@xhayper/discord-rpc/-/discord-rpc-1.0.22.tgz", + "integrity": "sha512-9NUse3AwmmLUgdY9PnI8tcm9ECRuuRRbdJwy7Osa3CPYF12EreTbIY/glEh5VHr66fcZy/IswGVnB477XOsTYA==", "dependencies": { "axios": "^1.4.0", "discord-api-types": "^0.37.52", @@ -1178,30 +1281,52 @@ }, "node_modules/@xmldom/xmldom": { "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", "dev": true, - "license": "MIT", "engines": { "node": ">=10.0.0" } }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", - "dev": true, - "license": "BSD-2-Clause" + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true }, "node_modules/7zip-bin": { "version": "5.1.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.1.1.tgz", + "integrity": "sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==", + "dev": true }, "node_modules/abbrev": { "version": "1.1.1", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/abstract-socket": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/abstract-socket/-/abstract-socket-2.1.1.tgz", + "integrity": "sha512-YZJizsvS1aBua5Gd01woe4zuyYBGgSMeqDOB6/ChwdTI904KP6QGtJswXl4hcqWxbz86hQBe++HWV0hF1aGUtA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "linux" + ], + "dependencies": { + "bindings": "^1.2.1", + "nan": "^2.12.1" + }, + "engines": { + "node": ">=4.0.0" + } }, "node_modules/acorn": { "version": "8.10.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "bin": { "acorn": "bin/acorn" }, @@ -1211,16 +1336,18 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/agent-base": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, - "license": "MIT", "dependencies": { "debug": "4" }, @@ -1230,8 +1357,9 @@ }, "node_modules/agentkeepalive": { "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", "dev": true, - "license": "MIT", "dependencies": { "humanize-ms": "^1.2.1" }, @@ -1241,8 +1369,9 @@ }, "node_modules/aggregate-error": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", + "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", "dev": true, - "license": "MIT", "dependencies": { "clean-stack": "^4.0.0", "indent-string": "^5.0.0" @@ -1256,8 +1385,9 @@ }, "node_modules/aggregate-error/node_modules/clean-stack": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", + "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", "dev": true, - "license": "MIT", "dependencies": { "escape-string-regexp": "5.0.0" }, @@ -1270,8 +1400,9 @@ }, "node_modules/aggregate-error/node_modules/escape-string-regexp": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -1281,8 +1412,9 @@ }, "node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1296,7 +1428,8 @@ }, "node_modules/ajv-formats": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dependencies": { "ajv": "^8.0.0" }, @@ -1311,7 +1444,8 @@ }, "node_modules/ajv-formats/node_modules/ajv": { "version": "8.12.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -1325,28 +1459,32 @@ }, "node_modules/ajv-formats/node_modules/json-schema-traverse": { "version": "1.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/ajv-keywords": { "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, - "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } }, "node_modules/ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1359,13 +1497,15 @@ }, "node_modules/app-builder-bin": { "version": "4.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-4.0.0.tgz", + "integrity": "sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==", + "dev": true }, "node_modules/app-builder-lib": { "version": "24.6.3", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.6.3.tgz", + "integrity": "sha512-++0Zp7vcCHfXMBGVj7luFxpqvMPk5mcWeTuw7OK0xNAaNtYQTTN0d9YfWRsb1MvviTOOhyHeULWz1CaixrdrDg==", "dev": true, - "license": "MIT", "dependencies": { "@develar/schema-utils": "~2.6.5", "@electron/notarize": "^1.2.3", @@ -1402,8 +1542,9 @@ }, "node_modules/app-builder-lib/node_modules/fs-extra": { "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -1415,8 +1556,9 @@ }, "node_modules/app-builder-lib/node_modules/jsonfile": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -1426,21 +1568,24 @@ }, "node_modules/app-builder-lib/node_modules/universalify": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/aproba": { "version": "2.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true }, "node_modules/are-we-there-yet": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", "dev": true, - "license": "ISC", "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -1451,12 +1596,14 @@ }, "node_modules/argparse": { "version": "2.0.1", - "license": "Python-2.0" + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/array-buffer-byte-length": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "is-array-buffer": "^3.0.1" @@ -1467,8 +1614,9 @@ }, "node_modules/array-includes": { "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -1484,15 +1632,16 @@ } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.2", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "get-intrinsic": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -1503,8 +1652,9 @@ }, "node_modules/array.prototype.flat": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -1520,8 +1670,9 @@ }, "node_modules/array.prototype.flatmap": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -1537,8 +1688,9 @@ }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", "dev": true, - "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", @@ -1556,55 +1708,83 @@ }, "node_modules/arrify": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/async": { "version": "3.2.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true }, "node_modules/async-exit-hook": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/async-mutex": { "version": "0.4.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.4.0.tgz", + "integrity": "sha512-eJFZ1YhRR8UN8eBLoNzcDPcy/jqjsg6I1AP+KvWQX80BqOSW1oJPJXDylPUEeMr2ZQvHgnQ//Lp6f3RQ1zI7HA==", "dependencies": { "tslib": "^2.4.0" } }, "node_modules/asynckit": { "version": "0.4.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/at-least-node": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, - "license": "ISC", "engines": { "node": ">= 4.0.0" } }, "node_modules/atomically": { "version": "1.7.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", + "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", "engines": { "node": ">=10.12.0" } }, "node_modules/auto-changelog": { "version": "2.4.0", + "resolved": "https://registry.npmjs.org/auto-changelog/-/auto-changelog-2.4.0.tgz", + "integrity": "sha512-vh17hko1c0ItsEcw6m7qPRf3m45u+XK5QyCrrBFViElZ8jnKrPC1roSznrd1fIB/0vR/zawdECCRJtTuqIXaJw==", "dev": true, - "license": "MIT", "dependencies": { "commander": "^7.2.0", "handlebars": "^4.7.7", @@ -1619,13 +1799,11 @@ "node": ">=8.3" } }, - "node_modules/auto-changelog/node_modules/node-fetch": { - "dev": true - }, "node_modules/available-typed-arrays": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1635,7 +1813,8 @@ }, "node_modules/axios": { "version": "1.5.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", + "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -1644,7 +1823,8 @@ }, "node_modules/babel-runtime": { "version": "6.26.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", "dependencies": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" @@ -1652,15 +1832,116 @@ }, "node_modules/babel-runtime/node_modules/regenerator-runtime": { "version": "0.11.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" }, "node_modules/balanced-match": { "version": "1.0.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, "node_modules/base64-js": { "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/bluebird-lst": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", + "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.5" + } + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "optional": true + }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-id3-writer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/browser-id3-writer/-/browser-id3-writer-5.0.0.tgz", + "integrity": "sha512-klFXmPe8kQN1y0ZrW411qmrUjJsb1gqPZ+Gb9ZcPKOmFF/8mA9dOZHXP9rGYsNCM8NAodZUFIzoKdl3tMvWsAA==" + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "funding": [ { @@ -1676,79 +1957,25 @@ "url": "https://feross.org/support" } ], - "license": "MIT" - }, - "node_modules/big-integer": { - "version": "1.6.51", - "dev": true, - "license": "Unlicense", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "dev": true, - "license": "MIT" - }, - "node_modules/bluebird-lst": { - "version": "1.0.9", - "dev": true, - "license": "MIT", + "optional": true, "dependencies": { - "bluebird": "^3.5.5" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/boolean": { - "version": "3.2.0", - "license": "MIT", - "optional": true - }, - "node_modules/bplist-parser": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "big-integer": "^1.6.44" - }, - "engines": { - "node": ">= 5.10.0" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-id3-writer": { - "version": "5.0.0", - "license": "MIT" - }, "node_modules/buffer-crc32": { "version": "0.2.13", - "license": "MIT", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "engines": { "node": "*" } }, "node_modules/buffer-equal": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz", + "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.4" }, @@ -1758,12 +1985,14 @@ }, "node_modules/buffer-from": { "version": "1.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/builder-util": { "version": "24.5.0", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.5.0.tgz", + "integrity": "sha512-STnBmZN/M5vGcv01u/K8l+H+kplTaq4PAIn3yeuufUKSpcdro0DhJWxPI81k5XcNfC//bjM3+n9nr8F9uV4uAQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/debug": "^4.1.6", "7zip-bin": "~5.1.1", @@ -1785,7 +2014,8 @@ }, "node_modules/builder-util-runtime": { "version": "9.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.1.tgz", + "integrity": "sha512-2rLv/uQD2x+dJ0J3xtsmI12AlRyk7p45TEbE/6o/fbb633e/S3pPgm+ct+JHsoY7r39dKHnGEFk/AASRFdnXmA==", "dependencies": { "debug": "^4.3.4", "sax": "^1.2.4" @@ -1796,8 +2026,9 @@ }, "node_modules/builder-util/node_modules/fs-extra": { "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -1809,8 +2040,9 @@ }, "node_modules/builder-util/node_modules/jsonfile": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -1820,16 +2052,18 @@ }, "node_modules/builder-util/node_modules/universalify": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/bundle-name": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", "dev": true, - "license": "MIT", "dependencies": { "run-applescript": "^5.0.0" }, @@ -1842,6 +2076,8 @@ }, "node_modules/busboy": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", "dependencies": { "streamsearch": "^1.1.0" }, @@ -1851,7 +2087,8 @@ }, "node_modules/butterchurn": { "version": "2.6.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/butterchurn/-/butterchurn-2.6.7.tgz", + "integrity": "sha512-BJiRA8L0L2+84uoG2SSfkp0kclBuN+vQKf217pK7pMlwEO2ZEg3MtO2/o+l8Qpr8Nbejg8tmL1ZHD1jmhiaaqg==", "dependencies": { "@babel/runtime": "^7.0.0", "ecma-proposal-math-extensions": "0.0.2" @@ -1859,7 +2096,8 @@ }, "node_modules/butterchurn-presets": { "version": "2.4.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/butterchurn-presets/-/butterchurn-presets-2.4.7.tgz", + "integrity": "sha512-4MdM8ripz/VfH1BCldrIKdAc/1ryJFBDvqlyow6Ivo1frwj0H3duzvSMFC7/wIjAjxb1QpwVHVqGqS9uAFKhpg==", "dependencies": { "babel-runtime": "^6.26.0", "ecma-proposal-math-extensions": "0.0.2", @@ -1868,8 +2106,9 @@ }, "node_modules/cacache": { "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", "dev": true, - "license": "ISC", "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", @@ -1890,8 +2129,9 @@ }, "node_modules/cacache/node_modules/aggregate-error": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, - "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -1901,9 +2141,10 @@ } }, "node_modules/cacache/node_modules/glob": { - "version": "10.3.3", + "version": "10.3.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.4.tgz", + "integrity": "sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ==", "dev": true, - "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.0.3", @@ -1923,24 +2164,27 @@ }, "node_modules/cacache/node_modules/indent-string": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/cacache/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/cacache/node_modules/minimatch": { "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1953,16 +2197,18 @@ }, "node_modules/cacache/node_modules/minipass": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", + "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", "dev": true, - "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/cacache/node_modules/p-map": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, - "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -1975,14 +2221,16 @@ }, "node_modules/cacheable-lookup": { "version": "5.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", "engines": { "node": ">=10.6.0" } }, "node_modules/cacheable-request": { "version": "7.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", @@ -1998,7 +2246,8 @@ }, "node_modules/call-bind": { "version": "1.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -2009,16 +2258,18 @@ }, "node_modules/callsites": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/camelcase": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -2028,8 +2279,9 @@ }, "node_modules/camelcase-keys": { "version": "7.0.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", + "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", "dev": true, - "license": "MIT", "dependencies": { "camelcase": "^6.3.0", "map-obj": "^4.1.0", @@ -2045,8 +2297,9 @@ }, "node_modules/camelcase-keys/node_modules/type-fest": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -2056,8 +2309,9 @@ }, "node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2071,26 +2325,31 @@ }, "node_modules/charenc": { "version": "0.0.2", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", "engines": { "node": "*" } }, "node_modules/chownr": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, - "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/chromium-pickle-js": { "version": "0.2.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", + "dev": true }, "node_modules/ci-info": { "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", "dev": true, "funding": [ { @@ -2098,22 +2357,40 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/clean-stack": { "version": "2.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "engines": { "node": ">=6" } }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "optional": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cliui": { "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, - "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -2125,7 +2402,8 @@ }, "node_modules/clone-response": { "version": "1.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "dependencies": { "mimic-response": "^1.0.0" }, @@ -2135,8 +2413,9 @@ }, "node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -2146,20 +2425,23 @@ }, "node_modules/color-name": { "version": "1.1.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/color-support": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true, - "license": "ISC", "bin": { "color-support": "bin.js" } }, "node_modules/combined-stream": { "version": "1.0.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -2169,28 +2451,32 @@ }, "node_modules/commander": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/compare-version": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/concat-map": { "version": "0.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true }, "node_modules/conf": { "version": "10.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/conf/-/conf-10.2.0.tgz", + "integrity": "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==", "dependencies": { "ajv": "^8.6.3", "ajv-formats": "^2.1.1", @@ -2212,7 +2498,8 @@ }, "node_modules/conf/node_modules/ajv": { "version": "8.12.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -2226,12 +2513,14 @@ }, "node_modules/conf/node_modules/json-schema-traverse": { "version": "1.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/config-file-ts": { "version": "0.2.4", + "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.4.tgz", + "integrity": "sha512-cKSW0BfrSaAUnxpgvpXPLaaW/umg4bqg4k3GO1JqlRfpx+d5W0GDXznCMkWotJQek5Mmz1MJVChQnz3IVaeMZQ==", "dev": true, - "license": "MIT", "dependencies": { "glob": "^7.1.6", "typescript": "^4.0.2" @@ -2239,23 +2528,38 @@ }, "node_modules/console-control-strings": { "version": "1.1.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true }, "node_modules/core-js": { "version": "2.6.12", - "hasInstallScript": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": true }, "node_modules/core-util-is": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "node_modules/crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", "dev": true, - "license": "MIT" + "optional": true, + "dependencies": { + "buffer": "^5.1.0" + } }, "node_modules/cross-spawn": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -2267,28 +2571,32 @@ }, "node_modules/crypt": { "version": "0.0.2", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", "engines": { "node": "*" } }, "node_modules/custom-electron-prompt": { "version": "1.5.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/custom-electron-prompt/-/custom-electron-prompt-1.5.7.tgz", + "integrity": "sha512-ptRPJr6CpT06GWLMtg3GD2Lr7gWfXdWI+hR1S39eq+m/mUa2E118YmX6mPCbHdg5QB/W9UVhSpRqBM8FUh1G8w==", "peerDependencies": { "electron": ">=10.0.0" } }, "node_modules/custom-electron-titlebar": { "version": "4.1.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/custom-electron-titlebar/-/custom-electron-titlebar-4.1.6.tgz", + "integrity": "sha512-AGULUZMxhEZDpl0Z1jfZzXgQEdhAPe8YET0dYQA/19t8oCrTFzF2PzdvJNCmxGU4Ai3jPWVeCPKg4vM7ffU0Mg==", "peerDependencies": { "electron": ">20" } }, "node_modules/dbus-next": { "version": "0.9.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/dbus-next/-/dbus-next-0.9.2.tgz", + "integrity": "sha512-tzQq/+wrTZ2yU+U5PoeXc97KABhX2v55C/T0finH3tSKYuI8H/SqppIFymBBrUHcK13LvEGY3vdj3ikPPenL5g==", "dependencies": { "@nornagon/put": "0.0.8", "event-stream": "3.3.4", @@ -2304,7 +2612,8 @@ }, "node_modules/debounce-fn": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", + "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", "dependencies": { "mimic-fn": "^3.0.0" }, @@ -2317,7 +2626,8 @@ }, "node_modules/debug": { "version": "4.3.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -2332,8 +2642,9 @@ }, "node_modules/decamelize": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", + "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -2343,8 +2654,9 @@ }, "node_modules/decamelize-keys": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, - "license": "MIT", "dependencies": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" @@ -2358,23 +2670,26 @@ }, "node_modules/decamelize-keys/node_modules/decamelize": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/decamelize-keys/node_modules/map-obj": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/decompress-response": { "version": "6.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dependencies": { "mimic-response": "^3.1.0" }, @@ -2387,7 +2702,8 @@ }, "node_modules/decompress-response/node_modules/mimic-response": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "engines": { "node": ">=10" }, @@ -2397,7 +2713,8 @@ }, "node_modules/deep-equal": { "version": "1.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", "dependencies": { "is-arguments": "^1.0.4", "is-date-object": "^1.0.1", @@ -2412,20 +2729,23 @@ }, "node_modules/deep-is": { "version": "0.1.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true }, "node_modules/deepmerge": { "version": "4.3.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "engines": { "node": ">=0.10.0" } }, "node_modules/default-browser": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", "dev": true, - "license": "MIT", "dependencies": { "bundle-name": "^3.0.0", "default-browser-id": "^3.0.0", @@ -2441,8 +2761,9 @@ }, "node_modules/default-browser-id": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", "dev": true, - "license": "MIT", "dependencies": { "bplist-parser": "^0.2.0", "untildify": "^4.0.0" @@ -2454,130 +2775,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/default-browser/node_modules/execa": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/default-browser/node_modules/get-stream": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/human-signals": { - "version": "4.3.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/default-browser/node_modules/is-stream": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/mimic-fn": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/npm-run-path": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/onetime": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/path-key": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/strip-final-newline": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/defer-to-connect": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "engines": { "node": ">=10" } }, "node_modules/define-lazy-prop": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -2587,7 +2797,8 @@ }, "node_modules/define-properties": { "version": "1.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dependencies": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -2600,9 +2811,10 @@ } }, "node_modules/del": { - "version": "7.0.0", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/del/-/del-7.1.0.tgz", + "integrity": "sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg==", "dev": true, - "license": "MIT", "dependencies": { "globby": "^13.1.2", "graceful-fs": "^4.2.10", @@ -2622,8 +2834,9 @@ }, "node_modules/del-cli": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/del-cli/-/del-cli-5.0.1.tgz", + "integrity": "sha512-hCDHJd0u0jKFqizgInYXZaILsqOIA7Zl6e7M3hJwP+SlwUAgtV/EB22EPF4e2+9VAVnBDQQBE6tDRe+/UuoFhg==", "dev": true, - "license": "MIT", "dependencies": { "del": "^7.0.0", "meow": "^10.1.3" @@ -2641,25 +2854,29 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "engines": { "node": ">=0.4.0" } }, "node_modules/delegates": { "version": "1.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true }, "node_modules/detect-node": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "optional": true }, "node_modules/dir-compare": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", + "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==", "dev": true, - "license": "MIT", "dependencies": { "buffer-equal": "^1.0.0", "minimatch": "^3.0.4" @@ -2667,8 +2884,9 @@ }, "node_modules/dir-compare/node_modules/brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2676,8 +2894,9 @@ }, "node_modules/dir-compare/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2687,8 +2906,9 @@ }, "node_modules/dir-glob": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, - "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -2697,13 +2917,15 @@ } }, "node_modules/discord-api-types": { - "version": "0.37.55", - "license": "MIT" + "version": "0.37.56", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.56.tgz", + "integrity": "sha512-Ih3wj0ZTaQxaJRqUEXHMIXfXB86bwMGC0wc2nNsyCJqeo3lC4qnxXtFIsC+IGI46+dSIinuayCAZ6sLEEM02Bw==" }, "node_modules/dmg-builder": { "version": "24.6.3", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.6.3.tgz", + "integrity": "sha512-O7KNT7OKqtV54fMYUpdlyTOCP5DoPuRMLqMTgxxV2PO8Hj/so6zOl5o8GTs8pdDkeAhJzCFOUNB3BDhgXbUbJg==", "dev": true, - "license": "MIT", "dependencies": { "app-builder-lib": "24.6.3", "builder-util": "24.5.0", @@ -2718,8 +2940,9 @@ }, "node_modules/dmg-builder/node_modules/fs-extra": { "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -2731,8 +2954,9 @@ }, "node_modules/dmg-builder/node_modules/jsonfile": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -2742,16 +2966,44 @@ }, "node_modules/dmg-builder/node_modules/universalify": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 10.0.0" } }, + "node_modules/dmg-license": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", + "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "@types/plist": "^3.0.1", + "@types/verror": "^1.10.3", + "ajv": "^6.10.0", + "crc": "^3.8.0", + "iconv-corefoundation": "^1.1.7", + "plist": "^3.0.4", + "smart-buffer": "^4.0.2", + "verror": "^1.10.0" + }, + "bin": { + "dmg-license": "bin/dmg-license.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/doctrine": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -2761,7 +3013,8 @@ }, "node_modules/dom-serializer": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -2773,17 +3026,19 @@ }, "node_modules/domelementtype": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/fb55" } - ], - "license": "BSD-2-Clause" + ] }, "node_modules/domhandler": { "version": "5.0.3", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dependencies": { "domelementtype": "^2.3.0" }, @@ -2796,7 +3051,8 @@ }, "node_modules/domutils": { "version": "3.1.0", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -2808,7 +3064,8 @@ }, "node_modules/dot-prop": { "version": "6.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", "dependencies": { "is-obj": "^2.0.0" }, @@ -2821,34 +3078,40 @@ }, "node_modules/dotenv": { "version": "9.0.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", + "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=10" } }, "node_modules/dotenv-expand": { "version": "5.1.0", - "dev": true, - "license": "BSD-2-Clause" + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true }, "node_modules/duplexer": { "version": "0.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" }, "node_modules/eastasianwidth": { "version": "0.2.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true }, "node_modules/ecma-proposal-math-extensions": { "version": "0.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ecma-proposal-math-extensions/-/ecma-proposal-math-extensions-0.0.2.tgz", + "integrity": "sha512-80BnDp2Fn7RxXlEr5HHZblniY4aQ97MOAicdWWpSo0vkQiISSE9wLR4SqxKsu4gCtXFBIPPzy8JMhay4NWRg/Q==" }, "node_modules/ejs": { "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "jake": "^10.8.5" }, @@ -2860,9 +3123,9 @@ } }, "node_modules/electron": { - "version": "27.0.0-alpha.4", - "resolved": "https://registry.npmjs.org/electron/-/electron-27.0.0-alpha.4.tgz", - "integrity": "sha512-onFtU9wcvUG2BvK+3nBzJx+h95PEq+dPOXwUKIeA2E/LcxgtAwHihImftzLodUDyrZHDyRSbbAXuNrKlSsZOlw==", + "version": "27.0.0-alpha.5", + "resolved": "https://registry.npmjs.org/electron/-/electron-27.0.0-alpha.5.tgz", + "integrity": "sha512-svKvOe6mJCq9UNDJVM0U/8LQ5BeASFlz83QmsNAdY/8X5li2/50ieGzkuLPMVw8G/Fqg5eYuuRiqnik1av7tbw==", "hasInstallScript": true, "dependencies": { "@electron/get": "^2.0.0", @@ -2878,7 +3141,8 @@ }, "node_modules/electron-better-web-request": { "version": "1.0.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/electron-better-web-request/-/electron-better-web-request-1.0.1.tgz", + "integrity": "sha512-euwLeL82k6fbVODfH5Uz9c4BN047/XyYKfsZcaFhdWfqx05JPu2J0xE7nciJ/1Bb0sTClU1FDLW5H2zQWBB5Gw==", "dependencies": { "url-match-patterns": "^0.2.0", "uuid": "^3.3.2" @@ -2886,8 +3150,9 @@ }, "node_modules/electron-builder": { "version": "24.6.3", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.6.3.tgz", + "integrity": "sha512-O6PqhRXwfxCNTXI4BlhELSeYYO6/tqlxRuy+4+xKBokQvwDDjDgZMMoSgAmanVSCuzjE7MZldI9XYrKFk+EQDw==", "dev": true, - "license": "MIT", "dependencies": { "app-builder-lib": "24.6.3", "builder-util": "24.5.0", @@ -2911,8 +3176,9 @@ }, "node_modules/electron-builder/node_modules/fs-extra": { "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -2924,8 +3190,9 @@ }, "node_modules/electron-builder/node_modules/jsonfile": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -2935,15 +3202,17 @@ }, "node_modules/electron-builder/node_modules/universalify": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/electron-debug": { "version": "3.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/electron-debug/-/electron-debug-3.2.0.tgz", + "integrity": "sha512-7xZh+LfUvJ52M9rn6N+tPuDw6oRAjxUj9SoxAZfJ0hVCXhZCsdkrSt7TgXOiWiEOBgEV8qwUIO/ScxllsPS7ow==", "dependencies": { "electron-is-dev": "^1.1.0", "electron-localshortcut": "^3.1.0" @@ -2954,8 +3223,9 @@ }, "node_modules/electron-devtools-installer": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/electron-devtools-installer/-/electron-devtools-installer-3.2.0.tgz", + "integrity": "sha512-t3UczsYugm4OAbqvdImMCImIMVdFzJAHgbwHpkl5jmfu1izVgUcP/mnrPqJIpEeCK1uZGpt+yHgWEN+9EwoYhQ==", "dev": true, - "license": "MIT", "dependencies": { "rimraf": "^3.0.2", "semver": "^7.2.1", @@ -2965,7 +3235,8 @@ }, "node_modules/electron-is": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/electron-is/-/electron-is-3.0.0.tgz", + "integrity": "sha512-aQv1y3WrDZ+mtO8acbhiiip/8fa0Et7cvZyvlqJm2H7fih4hiJWEFRyYxzLgDG2kmiLdF8l3y5tbek5JFOPQkQ==", "dependencies": { "electron-is-dev": "^0.3.0", "semver": "^5.5.0" @@ -2973,26 +3244,31 @@ }, "node_modules/electron-is-accelerator": { "version": "0.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/electron-is-accelerator/-/electron-is-accelerator-0.1.2.tgz", + "integrity": "sha512-fLGSAjXZtdn1sbtZxx52+krefmtNuVwnJCV2gNiVt735/ARUboMl8jnNC9fZEqQdlAv2ZrETfmBUsoQci5evJA==" }, "node_modules/electron-is-dev": { "version": "1.2.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-1.2.0.tgz", + "integrity": "sha512-R1oD5gMBPS7PVU8gJwH6CtT0e6VSoD0+SzSnYpNm+dBkcijgA+K7VAMHDfnRq/lkKPZArpzplTW6jfiMYosdzw==" }, "node_modules/electron-is/node_modules/electron-is-dev": { "version": "0.3.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-0.3.0.tgz", + "integrity": "sha512-jLttuuq8QK67n3mXmIe9pkrO7IH3LGIk12xJkhTmc852U2sCJaRAOpRGPSh+1Xnzck5v9escd9YXzuze9nGejg==" }, "node_modules/electron-is/node_modules/semver": { "version": "5.7.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "bin": { "semver": "bin/semver" } }, "node_modules/electron-localshortcut": { "version": "3.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/electron-localshortcut/-/electron-localshortcut-3.2.1.tgz", + "integrity": "sha512-DWvhKv36GsdXKnaFFhEiK8kZZA+24/yFLgtTwJJHc7AFgDjNRIBJZ/jq62Y/dWv9E4ypYwrVWN2bVrCYw1uv7Q==", "dependencies": { "debug": "^4.0.1", "electron-is-accelerator": "^0.1.0", @@ -3002,8 +3278,9 @@ }, "node_modules/electron-publish": { "version": "24.5.0", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.5.0.tgz", + "integrity": "sha512-zwo70suH15L15B4ZWNDoEg27HIYoPsGJUF7xevLJLSI7JUPC8l2yLBdLGwqueJ5XkDL7ucYyRZzxJVR8ElV9BA==", "dev": true, - "license": "MIT", "dependencies": { "@types/fs-extra": "^9.0.11", "builder-util": "24.5.0", @@ -3016,8 +3293,9 @@ }, "node_modules/electron-publish/node_modules/fs-extra": { "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -3029,8 +3307,9 @@ }, "node_modules/electron-publish/node_modules/jsonfile": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -3040,15 +3319,17 @@ }, "node_modules/electron-publish/node_modules/universalify": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/electron-store": { "version": "8.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/electron-store/-/electron-store-8.1.0.tgz", + "integrity": "sha512-2clHg/juMjOH0GT9cQ6qtmIvK183B39ZXR0bUoPwKwYHJsEF3quqyDzMFUAu+0OP8ijmN2CbPRAelhNbWUbzwA==", "dependencies": { "conf": "^10.2.0", "type-fest": "^2.17.0" @@ -3059,7 +3340,8 @@ }, "node_modules/electron-unhandled": { "version": "4.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/electron-unhandled/-/electron-unhandled-4.0.1.tgz", + "integrity": "sha512-6BsLnBg+i96eUnbaIFZyYdyfNX3f80/Nlfqy34YEMxXT9JP3ddNsNnUeiOF8ezN4+et4t4D37gjghKTP0V3jyw==", "dependencies": { "clean-stack": "^2.1.0", "electron-is-dev": "^2.0.0", @@ -3073,14 +3355,16 @@ }, "node_modules/electron-unhandled/node_modules/electron-is-dev": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-2.0.0.tgz", + "integrity": "sha512-3X99K852Yoqu9AcW50qz3ibYBWY79/pBhlMCab8ToEWS48R0T9tyxRiQhwylE7zQdXrMnx2JKqUJyMPmt5FBqA==", "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/electron-updater": { "version": "6.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-6.1.1.tgz", + "integrity": "sha512-IBT3zJ4yO5UZMF2gOTC9HrlmG4OYSRtOiHKzNAShJvfuicdx6UaXoa6AvhcTxdx6zf/rJyFMRBISS9jhVwTfow==", "dependencies": { "builder-util-runtime": "9.2.1", "fs-extra": "^10.1.0", @@ -3094,7 +3378,8 @@ }, "node_modules/electron-updater/node_modules/fs-extra": { "version": "10.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -3106,7 +3391,8 @@ }, "node_modules/electron-updater/node_modules/jsonfile": { "version": "6.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dependencies": { "universalify": "^2.0.0" }, @@ -3116,23 +3402,27 @@ }, "node_modules/electron-updater/node_modules/universalify": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "engines": { "node": ">= 10.0.0" } }, "node_modules/electron/node_modules/@types/node": { "version": "18.17.12", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.12.tgz", + "integrity": "sha512-d6xjC9fJ/nSnfDeU0AMDsaJyb1iHsqCSOdi84w4u+SlN/UgQdY5tRhpMzaFYsI4mnpvgTivEaQd0yOUhAtOnEQ==" }, "node_modules/emoji-regex": { "version": "8.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "node_modules/encoding": { "version": "0.1.13", - "license": "MIT", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "optional": true, "dependencies": { "iconv-lite": "^0.6.2" @@ -3140,21 +3430,24 @@ }, "node_modules/end-of-stream": { "version": "1.4.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dependencies": { "once": "^1.4.0" } }, "node_modules/ensure-error": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ensure-error/-/ensure-error-2.1.0.tgz", + "integrity": "sha512-+BMSJHw9gxiJAAp2ZR1E0TNcL09dD3lOvkl7WVm4+Y6xnes/pMetP/TzCHiDduh8ihNDjbGfuYxl7l4PA1xZ8A==", "engines": { "node": ">=8" } }, "node_modules/entities": { "version": "4.5.0", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "engines": { "node": ">=0.12" }, @@ -3164,28 +3457,32 @@ }, "node_modules/env-paths": { "version": "2.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "engines": { "node": ">=6" } }, "node_modules/err-code": { "version": "2.0.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true }, "node_modules/error-ex": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-abstract": { "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", "dev": true, - "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.0", "arraybuffer.prototype.slice": "^1.0.1", @@ -3236,8 +3533,9 @@ }, "node_modules/es-set-tostringtag": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", "dev": true, - "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3", "has": "^1.0.3", @@ -3249,16 +3547,18 @@ }, "node_modules/es-shim-unscopables": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", "dev": true, - "license": "MIT", "dependencies": { "has": "^1.0.3" } }, "node_modules/es-to-primitive": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, - "license": "MIT", "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -3273,21 +3573,24 @@ }, "node_modules/es6-error": { "version": "4.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "optional": true }, "node_modules/escalade": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/escape-string-regexp": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "devOptional": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -3297,8 +3600,9 @@ }, "node_modules/eslint": { "version": "8.48.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", + "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -3350,8 +3654,9 @@ }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", @@ -3360,32 +3665,18 @@ }, "node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, - "node_modules/eslint-import-resolver-node/node_modules/resolve": { - "version": "1.22.4", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/eslint-module-utils": { "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^3.2.7" }, @@ -3400,16 +3691,18 @@ }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import": { "version": "2.28.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", + "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", "dev": true, - "license": "MIT", "dependencies": { "array-includes": "^3.1.6", "array.prototype.findlastindex": "^1.2.2", @@ -3438,8 +3731,9 @@ }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3447,16 +3741,18 @@ }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -3466,8 +3762,9 @@ }, "node_modules/eslint-plugin-import/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3477,16 +3774,18 @@ }, "node_modules/eslint-plugin-import/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/eslint-plugin-prettier": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", + "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", "dev": true, - "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0", "synckit": "^0.8.5" @@ -3513,8 +3812,9 @@ }, "node_modules/eslint-scope": { "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -3528,8 +3828,9 @@ }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -3539,65 +3840,28 @@ }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/eslint/node_modules/is-path-inside": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3605,46 +3869,11 @@ "node": "*" } }, - "node_modules/eslint/node_modules/p-limit": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/espree": { "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -3659,8 +3888,9 @@ }, "node_modules/esquery": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -3670,8 +3900,9 @@ }, "node_modules/esrecurse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -3681,23 +3912,26 @@ }, "node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/esutils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/event-stream": { "version": "3.3.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", "dependencies": { "duplexer": "~0.1.1", "from": "~0", @@ -3709,22 +3943,23 @@ } }, "node_modules/execa": { - "version": "5.1.1", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", "dev": true, - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": ">=10" + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" @@ -3732,8 +3967,9 @@ }, "node_modules/execa/node_modules/get-stream": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -3741,14 +3977,43 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/execa/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/exponential-backoff": { "version": "3.1.1", - "dev": true, - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true }, "node_modules/extract-zip": { "version": "2.0.1", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", @@ -3764,19 +4029,32 @@ "@types/yauzl": "^2.9.1" } }, + "node_modules/extsprintf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "optional": true + }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-diff": { "version": "1.3.0", - "dev": true, - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true }, "node_modules/fast-glob": { "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -3788,35 +4066,52 @@ "node": ">=8.6.0" } }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true }, "node_modules/fastq": { "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, - "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/fd-slicer": { "version": "1.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dependencies": { "pend": "~1.2.0" } }, "node_modules/file-entry-cache": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, - "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -3824,24 +4119,33 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, "node_modules/filelist": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, - "license": "Apache-2.0", "dependencies": { "minimatch": "^5.0.1" } }, "node_modules/filename-reserved-regex": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", "engines": { "node": ">=4" } }, "node_modules/filenamify": { "version": "4.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", + "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", "dependencies": { "filename-reserved-regex": "^2.0.0", "strip-outer": "^1.0.1", @@ -3856,8 +4160,9 @@ }, "node_modules/fill-range": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, - "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -3866,27 +4171,35 @@ } }, "node_modules/find-up": { - "version": "3.0.0", - "license": "MIT", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, "dependencies": { - "locate-path": "^3.0.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/find-yarn-workspace-root": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", + "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "micromatch": "^4.0.2" } }, "node_modules/flat-cache": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", "dev": true, - "license": "MIT", "dependencies": { "flatted": "^3.2.7", "keyv": "^4.5.3", @@ -3898,18 +4211,20 @@ }, "node_modules/flatted": { "version": "3.2.7", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true }, "node_modules/follow-redirects": { "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], - "license": "MIT", "engines": { "node": ">=4.0" }, @@ -3921,16 +4236,18 @@ }, "node_modules/for-each": { "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, - "license": "MIT", "dependencies": { "is-callable": "^1.1.3" } }, "node_modules/foreground-child": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", "dev": true, - "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -3944,8 +4261,9 @@ }, "node_modules/foreground-child/node_modules/signal-exit": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "license": "ISC", "engines": { "node": ">=14" }, @@ -3955,7 +4273,8 @@ }, "node_modules/form-data": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -3967,11 +4286,13 @@ }, "node_modules/from": { "version": "0.1.7", - "license": "MIT" + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==" }, "node_modules/fs-extra": { "version": "8.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -3983,8 +4304,9 @@ }, "node_modules/fs-minipass": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "dev": true, - "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -3994,25 +4316,43 @@ }, "node_modules/fs-minipass/node_modules/minipass": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", + "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", "dev": true, - "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/fs.realpath": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, - "license": "ISC" + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, "node_modules/function-bind": { "version": "1.1.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/function.prototype.name": { "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -4028,15 +4368,17 @@ }, "node_modules/functions-have-names": { "version": "1.2.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/gauge": { "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", "dev": true, - "license": "ISC", "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", @@ -4053,15 +4395,17 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, - "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { "version": "1.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -4074,7 +4418,8 @@ }, "node_modules/get-stream": { "version": "5.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dependencies": { "pump": "^3.0.0" }, @@ -4087,8 +4432,9 @@ }, "node_modules/get-symbol-description": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" @@ -4102,8 +4448,9 @@ }, "node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4120,20 +4467,22 @@ } }, "node_modules/glob-parent": { - "version": "5.1.2", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "license": "ISC", "dependencies": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" } }, "node_modules/glob/node_modules/brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4141,8 +4490,9 @@ }, "node_modules/glob/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4152,7 +4502,8 @@ }, "node_modules/global-agent": { "version": "3.0.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", "optional": true, "dependencies": { "boolean": "^3.0.1", @@ -4168,7 +4519,8 @@ }, "node_modules/global-agent/node_modules/serialize-error": { "version": "7.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", "optional": true, "dependencies": { "type-fest": "^0.13.1" @@ -4182,7 +4534,8 @@ }, "node_modules/global-agent/node_modules/type-fest": { "version": "0.13.1", - "license": "(MIT OR CC0-1.0)", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", "optional": true, "engines": { "node": ">=10" @@ -4193,8 +4546,9 @@ }, "node_modules/globals": { "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -4207,8 +4561,9 @@ }, "node_modules/globals/node_modules/type-fest": { "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -4218,8 +4573,9 @@ }, "node_modules/globalthis": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "devOptional": true, - "license": "MIT", "dependencies": { "define-properties": "^1.1.3" }, @@ -4232,8 +4588,9 @@ }, "node_modules/globby": { "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, - "license": "MIT", "dependencies": { "dir-glob": "^3.0.1", "fast-glob": "^3.3.0", @@ -4250,8 +4607,9 @@ }, "node_modules/gopd": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, - "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -4261,7 +4619,8 @@ }, "node_modules/got": { "version": "11.8.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", @@ -4284,17 +4643,20 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", - "license": "ISC" + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/graphemer": { "version": "1.4.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true }, "node_modules/handlebars": { "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dev": true, - "license": "MIT", "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", @@ -4313,15 +4675,17 @@ }, "node_modules/hard-rejection": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/has": { "version": "1.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dependencies": { "function-bind": "^1.1.1" }, @@ -4331,23 +4695,26 @@ }, "node_modules/has-bigints": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/has-property-descriptors": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "dependencies": { "get-intrinsic": "^1.1.1" }, @@ -4357,7 +4724,8 @@ }, "node_modules/has-proto": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "engines": { "node": ">= 0.4" }, @@ -4367,7 +4735,8 @@ }, "node_modules/has-symbols": { "version": "1.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "engines": { "node": ">= 0.4" }, @@ -4377,7 +4746,8 @@ }, "node_modules/has-tostringtag": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dependencies": { "has-symbols": "^1.0.2" }, @@ -4390,20 +4760,23 @@ }, "node_modules/has-unicode": { "version": "2.0.1", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true }, "node_modules/hexy": { "version": "0.2.11", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hexy/-/hexy-0.2.11.tgz", + "integrity": "sha512-ciq6hFsSG/Bpt2DmrZJtv+56zpPdnq+NQ4ijEFrveKN0ZG1mhl/LdT1NQZ9se6ty1fACcI4d4vYqC9v8EYpH2A==", "bin": { "hexy": "bin/hexy_cmd.js" } }, "node_modules/hosted-git-info": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -4413,11 +4786,13 @@ }, "node_modules/howler": { "version": "2.2.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/howler/-/howler-2.2.3.tgz", + "integrity": "sha512-QM0FFkw0LRX1PR8pNzJVAY25JhIWvbKMBFM4gqk+QdV+kPXOhleWGCB6AiAF/goGjIHK2e/nIElplvjQwhr0jg==" }, "node_modules/html-to-text": { "version": "9.0.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz", + "integrity": "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==", "dependencies": { "@selderee/plugin-htmlparser2": "^0.11.0", "deepmerge": "^4.3.1", @@ -4431,6 +4806,8 @@ }, "node_modules/htmlparser2": { "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -4438,7 +4815,6 @@ "url": "https://github.com/sponsors/fb55" } ], - "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", @@ -4448,12 +4824,14 @@ }, "node_modules/http-cache-semantics": { "version": "4.1.1", - "license": "BSD-2-Clause" + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "node_modules/http-proxy-agent": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, - "license": "MIT", "dependencies": { "@tootallnate/once": "2", "agent-base": "6", @@ -4465,7 +4843,8 @@ }, "node_modules/http2-wrapper": { "version": "1.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" @@ -4476,8 +4855,9 @@ }, "node_modules/https-proxy-agent": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, - "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -4487,25 +4867,45 @@ } }, "node_modules/human-signals": { - "version": "2.1.0", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", "dev": true, - "license": "Apache-2.0", "engines": { - "node": ">=10.17.0" + "node": ">=14.18.0" } }, "node_modules/humanize-ms": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.0.0" } }, + "node_modules/iconv-corefoundation": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", + "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "cli-truncate": "^2.1.0", + "node-addon-api": "^1.6.3" + }, + "engines": { + "node": "^8.11.2 || >=10" + } + }, "node_modules/iconv-lite": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "devOptional": true, - "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -4513,23 +4913,47 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true + }, "node_modules/ignore": { "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/immediate": { "version": "3.0.6", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true }, "node_modules/import-fresh": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -4541,26 +4965,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.19" } }, "node_modules/indent-string": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -4570,8 +4988,9 @@ }, "node_modules/inflight": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, - "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -4579,13 +4998,15 @@ }, "node_modules/inherits": { "version": "2.0.4", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "node_modules/internal-slot": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, - "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.0", "has": "^1.0.3", @@ -4597,12 +5018,14 @@ }, "node_modules/ip": { "version": "2.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true }, "node_modules/is-arguments": { "version": "1.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -4616,8 +5039,9 @@ }, "node_modules/is-array-buffer": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.0", @@ -4629,13 +5053,15 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true }, "node_modules/is-bigint": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, - "license": "MIT", "dependencies": { "has-bigints": "^1.0.1" }, @@ -4645,8 +5071,9 @@ }, "node_modules/is-boolean-object": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -4660,12 +5087,14 @@ }, "node_modules/is-buffer": { "version": "1.1.6", - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "node_modules/is-callable": { "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4675,8 +5104,9 @@ }, "node_modules/is-ci": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", "dev": true, - "license": "MIT", "dependencies": { "ci-info": "^3.2.0" }, @@ -4686,8 +5116,9 @@ }, "node_modules/is-core-module": { "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dev": true, - "license": "MIT", "dependencies": { "has": "^1.0.3" }, @@ -4697,7 +5128,8 @@ }, "node_modules/is-date-object": { "version": "1.0.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -4710,8 +5142,9 @@ }, "node_modules/is-docker": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, - "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -4724,24 +5157,27 @@ }, "node_modules/is-extglob": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-glob": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, - "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -4751,8 +5187,9 @@ }, "node_modules/is-inside-container": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, - "license": "MIT", "dependencies": { "is-docker": "^3.0.0" }, @@ -4768,8 +5205,9 @@ }, "node_modules/is-inside-container/node_modules/is-docker": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, - "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -4782,13 +5220,15 @@ }, "node_modules/is-lambda": { "version": "1.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true }, "node_modules/is-negative-zero": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4798,16 +5238,18 @@ }, "node_modules/is-number": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/is-number-object": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -4820,15 +5262,17 @@ }, "node_modules/is-obj": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "engines": { "node": ">=8" } }, "node_modules/is-path-cwd": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-3.0.0.tgz", + "integrity": "sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==", "dev": true, - "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -4838,8 +5282,9 @@ }, "node_modules/is-path-inside": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -4849,15 +5294,17 @@ }, "node_modules/is-plain-obj": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-regex": { "version": "1.1.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -4871,8 +5318,9 @@ }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -4881,11 +5329,12 @@ } }, "node_modules/is-stream": { - "version": "2.0.1", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, - "license": "MIT", "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -4893,8 +5342,9 @@ }, "node_modules/is-string": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -4907,8 +5357,9 @@ }, "node_modules/is-symbol": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, - "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, @@ -4921,8 +5372,9 @@ }, "node_modules/is-typed-array": { "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, - "license": "MIT", "dependencies": { "which-typed-array": "^1.1.11" }, @@ -4935,12 +5387,14 @@ }, "node_modules/is-url": { "version": "1.2.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" }, "node_modules/is-weakref": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -4950,8 +5404,9 @@ }, "node_modules/is-wsl": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, - "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, @@ -4961,13 +5416,15 @@ }, "node_modules/isarray": { "version": "2.0.5", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true }, "node_modules/isbinaryfile": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.0.tgz", + "integrity": "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 14.0.0" }, @@ -4977,13 +5434,15 @@ }, "node_modules/isexe": { "version": "2.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true }, "node_modules/jackspeak": { - "version": "2.3.0", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.1.tgz", + "integrity": "sha512-4iSY3Bh1Htv+kLhiiZunUhQ+OYXIn0ze3ulq8JeWrFKmhPAJSySV2+kdtRh2pGcCeF0s6oR8Oc+pYZynJj4t8A==", "dev": true, - "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -4999,8 +5458,9 @@ }, "node_modules/jake": { "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", "dev": true, - "license": "Apache-2.0", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -5016,8 +5476,9 @@ }, "node_modules/jake/node_modules/brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5025,8 +5486,9 @@ }, "node_modules/jake/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -5036,22 +5498,25 @@ }, "node_modules/jintr": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jintr/-/jintr-1.1.0.tgz", + "integrity": "sha512-Tu9wk3BpN2v+kb8yT6YBtue+/nbjeLFv4vvVC4PJ7oCidHKbifWhvORrAbQfxVIQZG+67am/mDagpiGSVtvrZg==", "funding": [ "https://github.com/sponsors/LuanRT" ], - "license": "MIT", "dependencies": { "acorn": "^8.8.0" } }, "node_modules/js-tokens": { "version": "4.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "node_modules/js-yaml": { "version": "4.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dependencies": { "argparse": "^2.0.1" }, @@ -5060,30 +5525,37 @@ } }, "node_modules/jsbi": { - "version": "2.0.5" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-2.0.5.tgz", + "integrity": "sha512-TzO/62Hxeb26QMb4IGlI/5X+QLr9Uqp1FPkwp2+KOICW+Q+vSuFj61c8pkT6wAns4WcK56X7CmSHhJeDGWOqxQ==" }, "node_modules/json-buffer": { "version": "3.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/json-schema-typed": { "version": "7.0.3", - "license": "BSD-2-Clause" + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", + "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==" }, "node_modules/json-stable-stringify": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz", + "integrity": "sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==", "dev": true, - "license": "MIT", "dependencies": { "jsonify": "^0.0.1" }, @@ -5093,18 +5565,21 @@ }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true }, "node_modules/json-stringify-safe": { "version": "5.0.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "optional": true }, "node_modules/json5": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -5114,23 +5589,26 @@ }, "node_modules/jsonfile": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/jsonify": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", "dev": true, - "license": "Public Domain", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/jszip": { "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", "dev": true, - "license": "(MIT OR GPL-3.0-or-later)", "dependencies": { "lie": "~3.3.0", "pako": "~1.0.2", @@ -5140,13 +5618,15 @@ }, "node_modules/jszip/node_modules/isarray": { "version": "1.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/jszip/node_modules/readable-stream": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, - "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -5159,63 +5639,73 @@ }, "node_modules/jszip/node_modules/safe-buffer": { "version": "5.1.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/jszip/node_modules/string_decoder": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/keyboardevent-from-electron-accelerator": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/keyboardevent-from-electron-accelerator/-/keyboardevent-from-electron-accelerator-2.0.0.tgz", + "integrity": "sha512-iQcmNA0M4ETMNi0kG/q0h/43wZk7rMeKYrXP7sqKIJbHkTU8Koowgzv+ieR/vWJbOwxx5nDC3UnudZ0aLSu4VA==" }, "node_modules/keyboardevents-areequal": { "version": "0.2.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/keyboardevents-areequal/-/keyboardevents-areequal-0.2.2.tgz", + "integrity": "sha512-Nv+Kr33T0mEjxR500q+I6IWisOQ0lK1GGOncV0kWE6n4KFmpcu7RUX5/2B0EUtX51Cb0HjZ9VJsSY3u4cBa0kw==" }, "node_modules/keyv": { "version": "4.5.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", "dependencies": { "json-buffer": "3.0.1" } }, "node_modules/kind-of": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/klaw-sync": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.1.11" } }, "node_modules/lazy-val": { "version": "1.0.5", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", + "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==" }, "node_modules/leac": { "version": "0.6.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz", + "integrity": "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==", "funding": { "url": "https://ko-fi.com/killymxi" } }, "node_modules/levn": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -5226,63 +5716,77 @@ }, "node_modules/lie": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", "dev": true, - "license": "MIT", "dependencies": { "immediate": "~3.0.5" } }, "node_modules/lines-and-columns": { "version": "1.2.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true }, "node_modules/locate-path": { - "version": "3.0.0", - "license": "MIT", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash": { "version": "4.17.21", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash.debounce": { "version": "4.0.8", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, "node_modules/lodash.escaperegexp": { "version": "4.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" }, "node_modules/lodash.isequal": { "version": "4.5.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" }, "node_modules/lodash.merge": { "version": "4.6.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true }, "node_modules/long": { "version": "4.0.0", - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, "node_modules/lowercase-keys": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "engines": { "node": ">=8" } }, "node_modules/lru-cache": { "version": "6.0.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { "yallist": "^4.0.0" }, @@ -5292,8 +5796,9 @@ }, "node_modules/make-fetch-happen": { "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "dev": true, - "license": "ISC", "dependencies": { "agentkeepalive": "^4.2.1", "cacache": "^17.0.0", @@ -5317,16 +5822,18 @@ }, "node_modules/make-fetch-happen/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/map-obj": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -5335,11 +5842,14 @@ } }, "node_modules/map-stream": { - "version": "0.1.0" + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==" }, "node_modules/matcher": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", "optional": true, "dependencies": { "escape-string-regexp": "^4.0.0" @@ -5350,7 +5860,8 @@ }, "node_modules/md5": { "version": "2.3.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", "dependencies": { "charenc": "0.0.2", "crypt": "0.0.2", @@ -5359,8 +5870,9 @@ }, "node_modules/meow": { "version": "10.1.5", + "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", + "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", "dev": true, - "license": "MIT", "dependencies": { "@types/minimist": "^1.2.2", "camelcase-keys": "^7.0.0", @@ -5384,8 +5896,9 @@ }, "node_modules/meow/node_modules/type-fest": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -5395,21 +5908,24 @@ }, "node_modules/merge-stream": { "version": "2.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true }, "node_modules/merge2": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/micromatch": { "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, - "license": "MIT", "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -5420,8 +5936,9 @@ }, "node_modules/mime": { "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, - "license": "MIT", "bin": { "mime": "cli.js" }, @@ -5431,14 +5948,16 @@ }, "node_modules/mime-db": { "version": "1.52.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { "version": "2.1.35", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { "mime-db": "1.52.0" }, @@ -5448,37 +5967,42 @@ }, "node_modules/mimic-fn": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", "engines": { "node": ">=8" } }, "node_modules/mimic-response": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "engines": { "node": ">=4" } }, "node_modules/min-indent": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/miniget": { "version": "4.2.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/miniget/-/miniget-4.2.3.tgz", + "integrity": "sha512-SjbDPDICJ1zT+ZvQwK0hUcRY4wxlhhNpHL9nJOB2MEAXRGagTljsO8MEDzQMTFf0Q8g4QNi8P9lEm/g7e+qgzA==", "engines": { "node": ">=12" } }, "node_modules/minimatch": { "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -5488,16 +6012,18 @@ }, "node_modules/minimist": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/minimist-options": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, - "license": "MIT", "dependencies": { "arrify": "^1.0.1", "is-plain-obj": "^1.1.0", @@ -5509,16 +6035,18 @@ }, "node_modules/minipass": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, - "license": "ISC", "engines": { "node": ">=8" } }, "node_modules/minipass-collect": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "dev": true, - "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -5528,8 +6056,9 @@ }, "node_modules/minipass-collect/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -5539,8 +6068,9 @@ }, "node_modules/minipass-fetch": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "dev": true, - "license": "MIT", "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", @@ -5555,16 +6085,18 @@ }, "node_modules/minipass-fetch/node_modules/minipass": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", + "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", "dev": true, - "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/minipass-flush": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dev": true, - "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -5574,8 +6106,9 @@ }, "node_modules/minipass-flush/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -5585,8 +6118,9 @@ }, "node_modules/minipass-pipeline": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, - "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -5596,8 +6130,9 @@ }, "node_modules/minipass-pipeline/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -5607,8 +6142,9 @@ }, "node_modules/minipass-sized": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dev": true, - "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -5618,8 +6154,9 @@ }, "node_modules/minipass-sized/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -5629,8 +6166,9 @@ }, "node_modules/minizlib": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, - "license": "MIT", "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -5641,8 +6179,9 @@ }, "node_modules/minizlib/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -5652,8 +6191,9 @@ }, "node_modules/mkdirp": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, - "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -5663,7 +6203,8 @@ }, "node_modules/mpris-service": { "version": "2.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mpris-service/-/mpris-service-2.1.2.tgz", + "integrity": "sha512-AC6WepCnFWwOME9OWplHZ8ps/BB+g9QrEpUKCv7wX82fDPzR3nPrypOFmL/Fm0JloEAu6QTWSfDLLc6mM/jinw==", "dependencies": { "dbus-next": "^0.9.2", "deep-equal": "^1.0.1", @@ -5672,29 +6213,47 @@ }, "node_modules/ms": { "version": "2.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "optional": true }, "node_modules/natural-compare": { "version": "1.4.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true }, "node_modules/negotiator": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/neo-async": { "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/node-addon-api": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", "dev": true, - "license": "MIT" + "optional": true }, "node_modules/node-fetch": { "version": "2.7.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -5712,8 +6271,9 @@ }, "node_modules/node-gyp": { "version": "9.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", + "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", "dev": true, - "license": "MIT", "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", @@ -5736,8 +6296,9 @@ }, "node_modules/nopt": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", "dev": true, - "license": "ISC", "dependencies": { "abbrev": "^1.0.0" }, @@ -5750,8 +6311,9 @@ }, "node_modules/normalize-package-data": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", @@ -5764,7 +6326,8 @@ }, "node_modules/normalize-url": { "version": "6.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "engines": { "node": ">=10" }, @@ -5773,20 +6336,37 @@ } }, "node_modules/npm-run-path": { - "version": "4.0.1", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, - "license": "MIT", "dependencies": { - "path-key": "^3.0.0" + "path-key": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/npmlog": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", "dev": true, - "license": "ISC", "dependencies": { "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", @@ -5799,15 +6379,17 @@ }, "node_modules/object-inspect": { "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-is": { "version": "1.1.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -5821,15 +6403,17 @@ }, "node_modules/object-keys": { "version": "1.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -5845,8 +6429,9 @@ }, "node_modules/object.fromentries": { "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -5861,8 +6446,9 @@ }, "node_modules/object.groupby": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -5872,8 +6458,9 @@ }, "node_modules/object.values": { "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -5888,14 +6475,16 @@ }, "node_modules/once": { "version": "1.4.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { "version": "5.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -5908,15 +6497,17 @@ }, "node_modules/onetime/node_modules/mimic-fn": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "engines": { "node": ">=6" } }, "node_modules/open": { "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, - "license": "MIT", "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -5930,8 +6521,9 @@ }, "node_modules/optionator": { "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, - "license": "MIT", "dependencies": { "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", @@ -5946,46 +6538,56 @@ }, "node_modules/os-tmpdir": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/p-cancelable": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", "engines": { "node": ">=8" } }, "node_modules/p-limit": { - "version": "2.3.0", - "license": "MIT", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "3.0.0", - "license": "MIT", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, "dependencies": { - "p-limit": "^2.0.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-map": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", + "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", "dev": true, - "license": "MIT", "dependencies": { "aggregate-error": "^4.0.0" }, @@ -5998,20 +6600,23 @@ }, "node_modules/p-try": { "version": "2.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "engines": { "node": ">=6" } }, "node_modules/pako": { "version": "1.0.11", - "dev": true, - "license": "(MIT AND Zlib)" + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true }, "node_modules/parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -6021,8 +6626,9 @@ }, "node_modules/parse-github-url": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", + "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", "dev": true, - "license": "MIT", "bin": { "parse-github-url": "cli.js" }, @@ -6032,8 +6638,9 @@ }, "node_modules/parse-json": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -6049,7 +6656,8 @@ }, "node_modules/parseley": { "version": "0.12.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.12.1.tgz", + "integrity": "sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==", "dependencies": { "leac": "^0.6.0", "peberminta": "^0.9.0" @@ -6060,8 +6668,9 @@ }, "node_modules/patch-package": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.0.tgz", + "integrity": "sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA==", "dev": true, - "license": "MIT", "dependencies": { "@yarnpkg/lockfile": "^1.1.0", "chalk": "^4.1.2", @@ -6089,8 +6698,9 @@ }, "node_modules/patch-package/node_modules/fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -6103,8 +6713,9 @@ }, "node_modules/patch-package/node_modules/jsonfile": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -6114,8 +6725,9 @@ }, "node_modules/patch-package/node_modules/rimraf": { "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, - "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -6125,63 +6737,60 @@ }, "node_modules/patch-package/node_modules/slash": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/patch-package/node_modules/tmp": { - "version": "0.0.33", - "dev": true, - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/patch-package/node_modules/universalify": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/path-exists": { - "version": "3.0.0", - "license": "MIT", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/path-is-absolute": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-parse": { "version": "1.0.7", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true }, "node_modules/path-scurry": { "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", "dev": true, - "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^9.1.1 || ^10.0.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -6195,50 +6804,54 @@ }, "node_modules/path-scurry/node_modules/lru-cache": { "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", "dev": true, - "license": "ISC", "engines": { "node": "14 || >=16.14" } }, "node_modules/path-type": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/pause-stream": { "version": "0.0.11", - "license": [ - "MIT", - "Apache2" - ], + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", "dependencies": { "through": "~2.3" } }, "node_modules/peberminta": { "version": "0.9.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.9.0.tgz", + "integrity": "sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==", "funding": { "url": "https://ko-fi.com/killymxi" } }, "node_modules/pend": { "version": "1.2.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" }, "node_modules/picocolors": { "version": "1.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true }, "node_modules/picomatch": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8.6" }, @@ -6248,7 +6861,8 @@ }, "node_modules/pkg-up": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", "dependencies": { "find-up": "^3.0.0" }, @@ -6256,11 +6870,68 @@ "node": ">=8" } }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, "node_modules/playwright": { "version": "1.37.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.37.1.tgz", + "integrity": "sha512-bgUXRrQKhT48zHdxDYQTpf//0xDfDd5hLeEhjuSw8rXEGoT9YeElpfvs/izonTNY21IQZ7d3s22jLxYaAnubbQ==", "dev": true, "hasInstallScript": true, - "license": "Apache-2.0", "dependencies": { "playwright-core": "1.37.1" }, @@ -6273,8 +6944,9 @@ }, "node_modules/playwright-core": { "version": "1.37.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.37.1.tgz", + "integrity": "sha512-17EuQxlSIYCmEMwzMqusJ2ztDgJePjrbttaefgdsiqeLWidjYz9BxXaTaZWxH1J95SHGk6tjE+dwgWILJoUZfA==", "dev": true, - "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" }, @@ -6284,8 +6956,9 @@ }, "node_modules/plist": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, - "license": "MIT", "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -6297,16 +6970,18 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8.0" } }, "node_modules/prettier": { - "version": "3.0.2", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", + "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", "dev": true, - "license": "MIT", "peer": true, "bin": { "prettier": "bin/prettier.cjs" @@ -6320,8 +6995,9 @@ }, "node_modules/prettier-linter-helpers": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, - "license": "MIT", "dependencies": { "fast-diff": "^1.1.2" }, @@ -6331,20 +7007,23 @@ }, "node_modules/process-nextick-args": { "version": "2.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true }, "node_modules/progress": { "version": "2.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "engines": { "node": ">=0.4.0" } }, "node_modules/promise-retry": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, - "license": "MIT", "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" @@ -6355,11 +7034,13 @@ }, "node_modules/proxy-from-env": { "version": "1.1.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "node_modules/pump": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -6367,13 +7048,16 @@ }, "node_modules/punycode": { "version": "2.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "engines": { "node": ">=6" } }, "node_modules/queue-microtask": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -6388,12 +7072,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/quick-lru": { "version": "5.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "engines": { "node": ">=10" }, @@ -6403,8 +7087,9 @@ }, "node_modules/read-config-file": { "version": "6.3.2", + "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.3.2.tgz", + "integrity": "sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==", "dev": true, - "license": "MIT", "dependencies": { "config-file-ts": "^0.2.4", "dotenv": "^9.0.2", @@ -6419,8 +7104,9 @@ }, "node_modules/read-pkg": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", + "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", "dev": true, - "license": "MIT", "dependencies": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^3.0.2", @@ -6436,8 +7122,9 @@ }, "node_modules/read-pkg-up": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", + "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^5.0.0", "read-pkg": "^6.0.0", @@ -6450,75 +7137,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/read-pkg-up/node_modules/type-fest": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -6528,8 +7151,9 @@ }, "node_modules/read-pkg/node_modules/type-fest": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -6539,8 +7163,9 @@ }, "node_modules/readable-stream": { "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, - "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -6552,8 +7177,9 @@ }, "node_modules/redent": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", + "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", "dev": true, - "license": "MIT", "dependencies": { "indent-string": "^5.0.0", "strip-indent": "^4.0.0" @@ -6566,12 +7192,14 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.14.0", - "license": "MIT" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/regexp.prototype.flags": { "version": "1.5.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -6586,30 +7214,62 @@ }, "node_modules/require-directory": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/require-from-string": { "version": "2.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "engines": { "node": ">=0.10.0" } }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/resolve-alpn": { "version": "1.2.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } }, "node_modules/resolve-url": { "version": "0.2.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated" }, "node_modules/responselike": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", "dependencies": { "lowercase-keys": "^2.0.0" }, @@ -6619,16 +7279,18 @@ }, "node_modules/retry": { "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/reusify": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, - "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -6636,8 +7298,9 @@ }, "node_modules/rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, - "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -6650,7 +7313,8 @@ }, "node_modules/roarr": { "version": "2.15.4", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", "optional": true, "dependencies": { "boolean": "^3.0.1", @@ -6666,8 +7330,9 @@ }, "node_modules/run-applescript": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", "dev": true, - "license": "MIT", "dependencies": { "execa": "^5.0.0" }, @@ -6678,8 +7343,87 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/run-applescript/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/run-applescript/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/run-applescript/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/run-applescript/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/run-parallel": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -6695,14 +7439,14 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/rxjs": { "version": "7.8.1", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "optional": true, "dependencies": { "tslib": "^2.1.0" @@ -6710,8 +7454,9 @@ }, "node_modules/safe-array-concat": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.0", @@ -6727,6 +7472,8 @@ }, "node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -6740,13 +7487,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/safe-regex-test": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", @@ -6758,24 +7505,28 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "devOptional": true }, "node_modules/sanitize-filename": { "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", "dev": true, - "license": "WTFPL OR ISC", "dependencies": { "truncate-utf8-bytes": "^1.0.0" } }, "node_modules/sax": { "version": "1.2.4", - "license": "ISC" + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "node_modules/selderee": { "version": "0.11.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.11.0.tgz", + "integrity": "sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==", "dependencies": { "parseley": "^0.12.0" }, @@ -6785,7 +7536,8 @@ }, "node_modules/semver": { "version": "7.5.4", - "license": "ISC", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -6798,12 +7550,14 @@ }, "node_modules/semver-compare": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", "optional": true }, "node_modules/serialize-error": { "version": "8.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", + "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", "dependencies": { "type-fest": "^0.20.2" }, @@ -6816,7 +7570,8 @@ }, "node_modules/serialize-error/node_modules/type-fest": { "version": "0.20.2", - "license": "(MIT OR CC0-1.0)", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "engines": { "node": ">=10" }, @@ -6826,18 +7581,21 @@ }, "node_modules/set-blocking": { "version": "2.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true }, "node_modules/setimmediate": { "version": "1.0.5", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true }, "node_modules/shebang-command": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -6847,16 +7605,18 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/side-channel": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -6868,13 +7628,15 @@ }, "node_modules/signal-exit": { "version": "3.0.7", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, "node_modules/simple-update-notifier": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -6896,8 +7658,9 @@ }, "node_modules/slash": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -6905,10 +7668,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "optional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/smart-buffer": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -6916,8 +7695,9 @@ }, "node_modules/socks": { "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "dev": true, - "license": "MIT", "dependencies": { "ip": "^2.0.0", "smart-buffer": "^4.2.0" @@ -6929,8 +7709,9 @@ }, "node_modules/socks-proxy-agent": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "dev": true, - "license": "MIT", "dependencies": { "agent-base": "^6.0.2", "debug": "^4.3.3", @@ -6942,14 +7723,16 @@ }, "node_modules/source-map": { "version": "0.6.1", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-support": { "version": "0.5.21", - "license": "MIT", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -6957,8 +7740,9 @@ }, "node_modules/spdx-correct": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, - "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -6966,13 +7750,15 @@ }, "node_modules/spdx-exceptions": { "version": "2.3.0", - "dev": true, - "license": "CC-BY-3.0" + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true }, "node_modules/spdx-expression-parse": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, - "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -6980,12 +7766,14 @@ }, "node_modules/spdx-license-ids": { "version": "3.0.13", - "dev": true, - "license": "CC0-1.0" + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true }, "node_modules/split": { "version": "0.3.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", "dependencies": { "through": "2" }, @@ -6995,13 +7783,15 @@ }, "node_modules/sprintf-js": { "version": "1.1.2", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", "optional": true }, "node_modules/ssri": { "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", "dev": true, - "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -7011,45 +7801,52 @@ }, "node_modules/ssri/node_modules/minipass": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", + "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", "dev": true, - "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/stat-mode": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/stream-combiner": { "version": "0.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", "dependencies": { "duplexer": "~0.1.1" } }, "node_modules/streamsearch": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", "engines": { "node": ">=10.0.0" } }, "node_modules/string_decoder": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, - "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/string-width": { "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -7062,8 +7859,9 @@ "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -7075,8 +7873,9 @@ }, "node_modules/string.prototype.trim": { "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -7091,8 +7890,9 @@ }, "node_modules/string.prototype.trimend": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -7104,8 +7904,9 @@ }, "node_modules/string.prototype.trimstart": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -7117,8 +7918,9 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -7129,8 +7931,9 @@ "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -7140,24 +7943,30 @@ }, "node_modules/strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/strip-final-newline": { - "version": "2.0.0", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, - "license": "MIT", "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/strip-indent": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", "dev": true, - "license": "MIT", "dependencies": { "min-indent": "^1.0.1" }, @@ -7170,8 +7979,9 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -7181,7 +7991,8 @@ }, "node_modules/strip-outer": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", "dependencies": { "escape-string-regexp": "^1.0.2" }, @@ -7191,14 +8002,16 @@ }, "node_modules/strip-outer/node_modules/escape-string-regexp": { "version": "1.0.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "engines": { "node": ">=0.8.0" } }, "node_modules/sumchecker": { "version": "3.0.1", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", "dependencies": { "debug": "^4.1.0" }, @@ -7208,8 +8021,9 @@ }, "node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -7219,8 +8033,9 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7230,8 +8045,9 @@ }, "node_modules/synckit": { "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", "dev": true, - "license": "MIT", "dependencies": { "@pkgr/utils": "^2.3.1", "tslib": "^2.5.0" @@ -7245,8 +8061,9 @@ }, "node_modules/tar": { "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", "dev": true, - "license": "ISC", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -7261,8 +8078,9 @@ }, "node_modules/tar/node_modules/fs-minipass": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, - "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -7272,8 +8090,9 @@ }, "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -7283,8 +8102,9 @@ }, "node_modules/temp-file": { "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", + "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", "dev": true, - "license": "MIT", "dependencies": { "async-exit-hook": "^2.0.1", "fs-extra": "^10.0.0" @@ -7292,8 +8112,9 @@ }, "node_modules/temp-file/node_modules/fs-extra": { "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -7305,8 +8126,9 @@ }, "node_modules/temp-file/node_modules/jsonfile": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -7316,25 +8138,29 @@ }, "node_modules/temp-file/node_modules/universalify": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/text-table": { "version": "0.2.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true }, "node_modules/through": { "version": "2.3.8", - "license": "MIT" + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, "node_modules/titleize": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -7344,19 +8170,43 @@ }, "node_modules/tldts-core": { "version": "6.0.14", - "license": "MIT" + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.0.14.tgz", + "integrity": "sha512-ESYhU/bgs6jiHlnl5h029f+0dB7EKRiTaxM/jHLZ6powScbmsgsrFcFjmyrjDgCvI/BRY79TEBBClmqLNEPyjQ==" }, "node_modules/tldts-experimental": { "version": "6.0.14", - "license": "MIT", + "resolved": "https://registry.npmjs.org/tldts-experimental/-/tldts-experimental-6.0.14.tgz", + "integrity": "sha512-q9tVxHEotaG1buC8E4k+1iGecpM9iLD9FqWzWUKMilUoCpK8uJcO20iDA9ORCojqZdsMXgPgBlSetwiw5ML0tg==", "dependencies": { "tldts-core": "^6.0.14" } }, "node_modules/tmp": { - "version": "0.2.1", + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/tmp-promise/node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dev": true, - "license": "MIT", "dependencies": { "rimraf": "^3.0.0" }, @@ -7364,18 +8214,11 @@ "node": ">=8.17.0" } }, - "node_modules/tmp-promise": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "tmp": "^0.2.0" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -7385,12 +8228,14 @@ }, "node_modules/tr46": { "version": "0.0.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/trim-newlines": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", + "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -7400,7 +8245,8 @@ }, "node_modules/trim-repeated": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", "dependencies": { "escape-string-regexp": "^1.0.2" }, @@ -7410,23 +8256,26 @@ }, "node_modules/trim-repeated/node_modules/escape-string-regexp": { "version": "1.0.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "engines": { "node": ">=0.8.0" } }, "node_modules/truncate-utf8-bytes": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", "dev": true, - "license": "WTFPL", "dependencies": { "utf8-byte-length": "^1.0.1" } }, "node_modules/tsconfig-paths": { "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", "dev": true, - "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -7436,8 +8285,9 @@ }, "node_modules/tsconfig-paths/node_modules/json5": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, - "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -7447,12 +8297,14 @@ }, "node_modules/tslib": { "version": "2.6.2", - "license": "0BSD" + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/type-check": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -7462,7 +8314,8 @@ }, "node_modules/type-fest": { "version": "2.19.0", - "license": "(MIT OR CC0-1.0)", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "engines": { "node": ">=12.20" }, @@ -7472,8 +8325,9 @@ }, "node_modules/typed-array-buffer": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1", @@ -7485,8 +8339,9 @@ }, "node_modules/typed-array-byte-length": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "for-each": "^0.3.3", @@ -7502,8 +8357,9 @@ }, "node_modules/typed-array-byte-offset": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", "dev": true, - "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -7520,8 +8376,9 @@ }, "node_modules/typed-array-length": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "for-each": "^0.3.3", @@ -7533,15 +8390,17 @@ }, "node_modules/typed-emitter": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/typed-emitter/-/typed-emitter-2.1.0.tgz", + "integrity": "sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==", "optionalDependencies": { "rxjs": "*" } }, "node_modules/typescript": { "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, - "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -7552,8 +8411,9 @@ }, "node_modules/uglify-js": { "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, - "license": "BSD-2-Clause", "optional": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -7564,8 +8424,9 @@ }, "node_modules/unbox-primitive": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -7578,7 +8439,8 @@ }, "node_modules/undici": { "version": "5.23.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.23.0.tgz", + "integrity": "sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==", "dependencies": { "busboy": "^1.6.0" }, @@ -7588,8 +8450,9 @@ }, "node_modules/unique-filename": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", "dev": true, - "license": "ISC", "dependencies": { "unique-slug": "^4.0.0" }, @@ -7599,8 +8462,9 @@ }, "node_modules/unique-slug": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", "dev": true, - "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" }, @@ -7610,23 +8474,26 @@ }, "node_modules/universalify": { "version": "0.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "engines": { "node": ">= 4.0.0" } }, "node_modules/untildify": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/unzip-crx-3": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/unzip-crx-3/-/unzip-crx-3-0.2.0.tgz", + "integrity": "sha512-0+JiUq/z7faJ6oifVB5nSwt589v1KCduqIJupNVDoWSXZtWDmjDGO3RAEOvwJ07w90aoXoP4enKsR7ecMrJtWQ==", "dev": true, - "license": "MIT", "dependencies": { "jszip": "^3.1.0", "mkdirp": "^0.5.1", @@ -7635,8 +8502,9 @@ }, "node_modules/unzip-crx-3/node_modules/mkdirp": { "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, - "license": "MIT", "dependencies": { "minimist": "^1.2.6" }, @@ -7646,55 +8514,80 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/url-match-patterns": { "version": "0.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/url-match-patterns/-/url-match-patterns-0.2.0.tgz", + "integrity": "sha512-vtaWyxq+CyrQP4/dapGddkSGwGypQOD2qjHcsqp9ahsjRWzGtjqm+ANxApH46OfWQfpkL6cuyPwsm80386jdjQ==", "dependencies": { "lodash": "^4.3.0" } }, "node_modules/utf8-byte-length": { "version": "1.0.4", - "dev": true, - "license": "WTFPL" + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", + "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", + "dev": true }, "node_modules/util-deprecate": { "version": "1.0.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true }, "node_modules/uuid": { "version": "3.4.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "bin": { "uuid": "bin/uuid" } }, "node_modules/validate-npm-package-license": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, - "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, + "node_modules/verror": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", + "dev": true, + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/vudio": { "version": "2.1.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/vudio/-/vudio-2.1.1.tgz", + "integrity": "sha512-VkFQcFt/b/kpF5Eg5Sq+oXUo1Zp5aRFF4BSmIrOzau5o+5WMWwX9ae/EGJZstCyZFiCTU5iw1Y+u2BCGW6Y6Jw==" }, "node_modules/webidl-conversions": { "version": "3.0.1", - "license": "BSD-2-Clause" + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/whatwg-url": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -7702,8 +8595,9 @@ }, "node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -7716,8 +8610,9 @@ }, "node_modules/which-boxed-primitive": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, - "license": "MIT", "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -7731,8 +8626,9 @@ }, "node_modules/which-typed-array": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "dev": true, - "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -7749,21 +8645,24 @@ }, "node_modules/wide-align": { "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "dev": true, - "license": "ISC", "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "node_modules/wordwrap": { "version": "1.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true }, "node_modules/wrap-ansi": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -7779,8 +8678,9 @@ "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -7795,11 +8695,13 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "license": "ISC" + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { "version": "8.13.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", "engines": { "node": ">=10.0.0" }, @@ -7818,7 +8720,8 @@ }, "node_modules/xml2js": { "version": "0.6.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -7829,48 +8732,55 @@ }, "node_modules/xml2js/node_modules/xmlbuilder": { "version": "11.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "engines": { "node": ">=4.0" } }, "node_modules/xmlbuilder": { "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8.0" } }, "node_modules/y18n": { "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, - "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yaku": { "version": "0.16.7", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/yaku/-/yaku-0.16.7.tgz", + "integrity": "sha512-Syu3IB3rZvKvYk7yTiyl1bo/jiEFaaStrgv1V2TIJTqYPStSMQVO8EQjg/z+DRzLq/4LIIharNT3iH1hylEIRw==", + "dev": true }, "node_modules/yallist": { "version": "4.0.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yaml": { "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", "dev": true, - "license": "ISC", "engines": { "node": ">= 14" } }, "node_modules/yargs": { "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, - "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -7886,23 +8796,26 @@ }, "node_modules/yargs-parser": { "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, - "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yargs/node_modules/yargs-parser": { "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/yauzl": { "version": "2.10.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" @@ -7910,8 +8823,9 @@ }, "node_modules/yocto-queue": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -7921,10 +8835,11 @@ }, "node_modules/youtubei.js": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/youtubei.js/-/youtubei.js-6.1.0.tgz", + "integrity": "sha512-EJmPuQ1pLimrcp5nPDSeZHVthT7KJLxp9Z5sYmihXKn1ct8e7cntKaFnPvy5QsbjpipICpDpQEs+d+owDhjgIg==", "funding": [ "https://github.com/sponsors/LuanRT" ], - "license": "MIT", "dependencies": { "jintr": "^1.1.0", "tslib": "^2.5.0", @@ -7933,7 +8848,8 @@ }, "node_modules/ytpl": { "version": "2.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ytpl/-/ytpl-2.3.0.tgz", + "integrity": "sha512-Cfw2rxq3PFK6qgWr2Z8gsRefVahEzbn9XEuiJldqdXHE6GhO7kTfEvbZKdfXing1SmgW635uJ/UL2g8r0fvu2Q==", "dependencies": { "miniget": "^4.2.2" }, diff --git a/package.json b/package.json index 1e3fea37..9e0d3a56 100644 --- a/package.json +++ b/package.json @@ -139,13 +139,13 @@ "xml2js": "0.6.2", "node-fetch": "2.7.0", "@electron/universal": "1.4.1", - "electron": "27.0.0-alpha.4" + "electron": "27.0.0-alpha.5" }, "devDependencies": { "@playwright/test": "1.37.1", "auto-changelog": "2.4.0", "del-cli": "5.0.1", - "electron": "27.0.0-alpha.4", + "electron": "27.0.0-alpha.5", "electron-builder": "24.6.3", "electron-devtools-installer": "3.2.0", "eslint": "8.48.0", From 3e3fdb3c3f631dbad47caaa5620d876f5641d114 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Fri, 1 Sep 2023 21:22:21 +0900 Subject: [PATCH 13/70] fix: use net.fetch instead of node native fetch --- plugins/last-fm/back.js | 8 ++++---- plugins/lyrics-genius/back.js | 6 +++--- plugins/tuna-obs/back.js | 4 ++-- providers/song-info.js | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/plugins/last-fm/back.js b/plugins/last-fm/back.js index 9d735168..7593f1c1 100644 --- a/plugins/last-fm/back.js +++ b/plugins/last-fm/back.js @@ -1,4 +1,4 @@ -const { shell } = require('electron'); +const { shell, net } = require('electron'); const md5 = require('md5'); const { setOptions } = require('../../config/plugins'); @@ -56,7 +56,7 @@ const createToken = async ({ apiKey, apiRoot, secret }) => { format: 'json', }; const apiSigature = createApiSig(data, secret); - let response = await fetch(`${apiRoot}${createQueryString(data, apiSigature)}`); + let response = await net.fetch(`${apiRoot}${createQueryString(data, apiSigature)}`); response = await response.json(); return response?.token; }; @@ -78,7 +78,7 @@ const getAndSetSessionKey = async (config) => { token: config.token, }; const apiSignature = createApiSig(data, config.secret); - let res = await fetch(`${config.api_root}${createQueryString(data, apiSignature)}`); + let res = await net.fetch(`${config.api_root}${createQueryString(data, apiSignature)}`); res = await res.json(); if (res.error) { await authenticate(config); @@ -107,7 +107,7 @@ const postSongDataToAPI = async (songInfo, config, data) => { }; postData.api_sig = createApiSig(postData, config.secret); - fetch('https://ws.audioscrobbler.com/2.0/', { method: 'POST', body: createFormData(postData) }) + net.fetch('https://ws.audioscrobbler.com/2.0/', { method: 'POST', body: createFormData(postData) }) .catch((error) => { if (error.response.data.error === 9) { // Session key is invalid, so remove it from the config and reauthenticate diff --git a/plugins/lyrics-genius/back.js b/plugins/lyrics-genius/back.js index 0c87db12..1913c193 100644 --- a/plugins/lyrics-genius/back.js +++ b/plugins/lyrics-genius/back.js @@ -1,6 +1,6 @@ const { join } = require('node:path'); -const { ipcMain } = require('electron'); +const { ipcMain, net } = require('electron'); const is = require('electron-is'); const { convert } = require('html-to-text'); @@ -59,7 +59,7 @@ const fetchFromGenius = async (metadata) => { * @returns The lyrics of the first song found using the Genius-Lyrics API */ const getLyricsList = async (queryString) => { - const response = await fetch( + const response = await net.fetch( `https://genius.com/api/search/multi?per_page=5&q=${encodeURIComponent(queryString)}`, ); if (!response.ok) { @@ -88,7 +88,7 @@ const getLyricsList = async (queryString) => { * @returns The lyrics of the song URL provided, null if none */ const getLyrics = async (url) => { - const response = await fetch(url); + const response = await net.fetch(url); if (!response.ok) { return null; } diff --git a/plugins/tuna-obs/back.js b/plugins/tuna-obs/back.js index a1a7d0c2..96e83381 100644 --- a/plugins/tuna-obs/back.js +++ b/plugins/tuna-obs/back.js @@ -1,4 +1,4 @@ -const { ipcMain } = require('electron'); +const { ipcMain, net } = require('electron'); const registerCallback = require('../../providers/song-info'); @@ -24,7 +24,7 @@ const post = async (data) => { 'Access-Control-Allow-Origin': '*', }; const url = `http://127.0.0.1:${port}/`; - fetch(url, { + net.fetch(url, { method: 'POST', headers, body: JSON.stringify({ data }), diff --git a/providers/song-info.js b/providers/song-info.js index 841a0845..4c80b574 100644 --- a/providers/song-info.js +++ b/providers/song-info.js @@ -1,4 +1,4 @@ -const { ipcMain, nativeImage } = require('electron'); +const { ipcMain, nativeImage, net } = require('electron'); const config = require('../config'); const { cache } = require('../providers/decorators'); @@ -29,7 +29,7 @@ const getImage = cache( * @returns {Promise} */ async (src) => { - const result = await fetch(src); + const result = await net.fetch(src); const buffer = await result.arrayBuffer(); const output = nativeImage.createFromBuffer(Buffer.from(buffer)); if (output.isEmpty() && !src.endsWith('.jpg') && src.includes('.jpg')) { // Fix hidden webp files (https://github.com/th-ch/youtube-music/issues/315) From 82bcadcd64ce203452ab2ab2fe7d36844854580a Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Sun, 3 Sep 2023 00:25:48 +0900 Subject: [PATCH 14/70] feat: typescript part 1 Co-authored-by: Su-Yong --- .eslintrc.js | 16 +- .gitignore | 1 + config/{defaults.js => defaults.ts} | 33 +- config/dynamic.js | 214 -- config/dynamic.ts | 240 +++ config/index.js | 31 - config/index.ts | 57 + config/plugins.js | 55 - config/plugins.ts | 63 + config/{store.js => store.ts} | 43 +- custom-electron-prompt.d.ts | 46 + index.js => index.ts | 102 +- menu.js => menu.ts | 76 +- package-lock.json | 324 ++- package.json | 23 +- plugins/adblocker/back.js | 13 - plugins/adblocker/back.ts | 20 + plugins/adblocker/{blocker.js => blocker.ts} | 15 +- plugins/adblocker/config.js | 13 - plugins/adblocker/config.ts | 17 + plugins/adblocker/inject.js | 2 + plugins/adblocker/menu.js | 15 - plugins/adblocker/menu.ts | 19 + plugins/adblocker/{preload.js => preload.ts} | 6 +- plugins/navigation/actions.js | 24 - plugins/navigation/actions.ts | 21 + plugins/navigation/back.js | 2 +- .../picture-in-picture/{back.js => back.ts} | 43 +- .../picture-in-picture/{front.js => front.ts} | 6 +- .../picture-in-picture/{menu.js => menu.ts} | 2 +- plugins/utils.js | 68 - plugins/utils.ts | 74 + preload.js => preload.ts | 64 +- providers/app-controls.js | 35 - providers/app-controls.ts | 35 + providers/{decorators.js => decorators.ts} | 98 +- .../{dom-elements.js => dom-elements.ts} | 4 +- .../{extracted-data.js => extracted-data.ts} | 4 +- ...-titlebar.js => prompt-custom-titlebar.ts} | 8 +- .../{prompt-options.js => prompt-options.ts} | 8 +- providers/protocol-handler.js | 45 - providers/protocol-handler.ts | 45 + providers/song-controls-front.js | 8 - providers/song-controls-front.ts | 8 + .../{song-controls.js => song-controls.ts} | 9 +- providers/song-info-front.js | 120 -- providers/song-info-front.ts | 124 ++ providers/{song-info.js => song-info.ts} | 76 +- reset.d.ts | 15 + tray.js => tray.ts | 26 +- tsconfig.json | 23 + types/datahost-get-state.ts | 1823 +++++++++++++++++ types/get-player-response.ts | 464 +++++ types/youtube-player.ts | 189 ++ utils/testing.js | 3 - utils/testing.ts | 3 + utils/type-utils.ts | 5 + 57 files changed, 3958 insertions(+), 968 deletions(-) rename config/{defaults.js => defaults.ts} (89%) delete mode 100644 config/dynamic.js create mode 100644 config/dynamic.ts delete mode 100644 config/index.js create mode 100644 config/index.ts delete mode 100644 config/plugins.js create mode 100644 config/plugins.ts rename config/{store.js => store.ts} (67%) create mode 100644 custom-electron-prompt.d.ts rename index.js => index.ts (81%) rename menu.js => menu.ts (86%) delete mode 100644 plugins/adblocker/back.js create mode 100644 plugins/adblocker/back.ts rename plugins/adblocker/{blocker.js => blocker.ts} (84%) delete mode 100644 plugins/adblocker/config.js create mode 100644 plugins/adblocker/config.ts delete mode 100644 plugins/adblocker/menu.js create mode 100644 plugins/adblocker/menu.ts rename plugins/adblocker/{preload.js => preload.ts} (71%) delete mode 100644 plugins/navigation/actions.js create mode 100644 plugins/navigation/actions.ts rename plugins/picture-in-picture/{back.js => back.ts} (67%) rename plugins/picture-in-picture/{front.js => front.ts} (95%) rename plugins/picture-in-picture/{menu.js => menu.ts} (97%) delete mode 100644 plugins/utils.js create mode 100644 plugins/utils.ts rename preload.js => preload.ts (61%) delete mode 100644 providers/app-controls.js create mode 100644 providers/app-controls.ts rename providers/{decorators.js => decorators.ts} (52%) rename providers/{dom-elements.js => dom-elements.ts} (54%) rename providers/{extracted-data.js => extracted-data.ts} (91%) rename providers/{prompt-custom-titlebar.js => prompt-custom-titlebar.ts} (53%) rename providers/{prompt-options.js => prompt-options.ts} (72%) delete mode 100644 providers/protocol-handler.js create mode 100644 providers/protocol-handler.ts delete mode 100644 providers/song-controls-front.js create mode 100644 providers/song-controls-front.ts rename providers/{song-controls.js => song-controls.ts} (82%) delete mode 100644 providers/song-info-front.js create mode 100644 providers/song-info-front.ts rename providers/{song-info.js => song-info.ts} (64%) create mode 100644 reset.d.ts rename tray.js => tray.ts (68%) create mode 100644 tsconfig.json create mode 100644 types/datahost-get-state.ts create mode 100644 types/get-player-response.ts create mode 100644 types/youtube-player.ts delete mode 100644 utils/testing.js create mode 100644 utils/testing.ts create mode 100644 utils/type-utils.ts diff --git a/.eslintrc.js b/.eslintrc.js index b2bfdd44..e1698f08 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -2,14 +2,26 @@ module.exports = { extends: [ 'eslint:recommended', 'plugin:import/recommended', + 'plugin:import/typescript', + 'plugin:@typescript-eslint/eslint-recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:@typescript-eslint/recommended-requiring-type-checking', ], - plugins: ['import'], + plugins: ['@typescript-eslint', 'import'], + parser: '@typescript-eslint/parser', parserOptions: { - ecmaVersion: 'latest', + project: './tsconfig.json', + tsconfigRootDir: __dirname, + sourceType: 'module', + ecmaVersion: 'latest' }, rules: { 'arrow-parens': ['error', 'always'], 'object-curly-spacing': ['error', 'always'], + '@typescript-eslint/no-floating-promises': 'off', + '@typescript-eslint/no-misused-promises': ['off', { checksVoidReturn: false }], + '@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_' }], + "@typescript-eslint/no-non-null-assertion": "off", 'import/first': 'error', 'import/newline-after-import': 'error', 'import/no-default-export': 'off', diff --git a/.gitignore b/.gitignore index b8b851db..ec2a06da 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ node_modules /dist +/pack electron-builder.yml .vscode/settings.json .idea diff --git a/config/defaults.js b/config/defaults.ts similarity index 89% rename from config/defaults.js rename to config/defaults.ts index a0e07e2b..2d29ef29 100644 --- a/config/defaults.js +++ b/config/defaults.ts @@ -1,22 +1,38 @@ +export interface WindowSizeConfig { + width: number; + height: number; +} + const defaultConfig = { 'window-size': { width: 1100, height: 550, }, + 'window-maximized': false, + 'window-position': { + x: -1, + y: -1, + }, 'url': 'https://music.youtube.com', 'options': { tray: false, appVisible: true, autoUpdates: true, + alwaysOnTop: false, hideMenu: false, + hideMenuWarned: false, startAtLogin: false, disableHardwareAcceleration: false, + removeUpgradeButton: false, restartOnConfigChanges: false, trayClickPlayPause: false, autoResetAppCache: false, resumeOnStart: true, + likeButtons: '', proxy: '', startingPage: '', + overrideUserAgent: false, + themes: {} as string[], }, 'plugins': { // Enabled plugins @@ -26,7 +42,9 @@ const defaultConfig = { 'adblocker': { enabled: true, cache: true, + blocker: 'In player', additionalBlockLists: [], // Additional list of filters, e.g "https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters.txt" + disableDefaultLists: [], }, // Disabled plugins 'shortcuts': { @@ -92,11 +110,14 @@ const defaultConfig = { forceHide: false, }, 'picture-in-picture': { - enabled: false, - alwaysOnTop: true, - savePosition: true, - saveSize: false, - hotkey: 'P', + 'enabled': false, + 'alwaysOnTop': true, + 'savePosition': true, + 'saveSize': false, + 'hotkey': 'P', + 'pip-position': [10, 10], + 'pip-size': [450, 275], + 'isInPiP': false, }, 'captions-selector': { enabled: false, @@ -181,4 +202,4 @@ const defaultConfig = { }, }; -module.exports = defaultConfig; +export default defaultConfig; diff --git a/config/dynamic.js b/config/dynamic.js deleted file mode 100644 index 5e014218..00000000 --- a/config/dynamic.js +++ /dev/null @@ -1,214 +0,0 @@ -const { ipcRenderer, ipcMain } = require('electron'); - -const defaultConfig = require('./defaults'); -const { getOptions, setOptions, setMenuOptions } = require('./plugins'); - -const { sendToFront } = require('../providers/app-controls'); - -const activePlugins = {}; -/** - * [!IMPORTANT!] - * The method is **sync** in the main process and **async** in the renderer process. - */ -module.exports.getActivePlugins - = process.type === 'renderer' - ? async () => ipcRenderer.invoke('get-active-plugins') - : () => activePlugins; - -if (process.type === 'browser') { - ipcMain.handle('get-active-plugins', this.getActivePlugins); -} - -/** - * [!IMPORTANT!] - * The method is **sync** in the main process and **async** in the renderer process. - */ -module.exports.isActive - = process.type === 'renderer' - ? async (plugin) => - plugin in (await ipcRenderer.invoke('get-active-plugins')) - : (plugin) => plugin in activePlugins; - -/** - * This class is used to create a dynamic synced config for plugins. - * - * [!IMPORTANT!] - * The methods are **sync** in the main process and **async** in the renderer process. - * - * @param {string} name - The name of the plugin. - * @param {boolean} [options.enableFront] - Whether the config should be available in front.js. Default: false. - * @param {object} [options.initialOptions] - The initial options for the plugin. Default: loaded from store. - * - * @example - * const { PluginConfig } = require("../../config/dynamic"); - * const config = new PluginConfig("plugin-name", { enableFront: true }); - * module.exports = { ...config }; - * - * // or - * - * module.exports = (win, options) => { - * const config = new PluginConfig("plugin-name", { - * enableFront: true, - * initialOptions: options, - * }); - * setupMyPlugin(win, config); - * }; - */ -module.exports.PluginConfig = class PluginConfig { - #name; - #config; - #defaultConfig; - #enableFront; - - #subscribers = {}; - #allSubscribers = []; - - constructor(name, { enableFront = false, initialOptions = undefined } = {}) { - const pluginDefaultConfig = defaultConfig.plugins[name] || {}; - const pluginConfig = initialOptions || getOptions(name) || {}; - - this.#name = name; - this.#enableFront = enableFront; - this.#defaultConfig = pluginDefaultConfig; - this.#config = { ...pluginDefaultConfig, ...pluginConfig }; - - if (this.#enableFront) { - this.#setupFront(); - } - - activePlugins[name] = this; - } - - get = (option) => this.#config[option]; - - set = (option, value) => { - this.#config[option] = value; - this.#onChange(option); - this.#save(); - }; - - toggle = (option) => { - this.#config[option] = !this.#config[option]; - this.#onChange(option); - this.#save(); - }; - - getAll = () => ({ ...this.#config }); - - setAll = (options) => { - if (!options || typeof options !== 'object') { - throw new Error('Options must be an object.'); - } - - let changed = false; - for (const [key, value] of Object.entries(options)) { - if (this.#config[key] !== value) { - this.#config[key] = value; - this.#onChange(key, false); - changed = true; - } - } - - if (changed) { - for (const fn of this.#allSubscribers) { - fn(this.#config); - } - } - - this.#save(); - }; - - getDefaultConfig = () => this.#defaultConfig; - - /** - * Use this method to set an option and restart the app if `appConfig.restartOnConfigChange === true` - * - * Used for options that require a restart to take effect. - */ - setAndMaybeRestart = (option, value) => { - this.#config[option] = value; - setMenuOptions(this.#name, this.#config); - this.#onChange(option); - }; - - subscribe = (valueName, fn) => { - this.#subscribers[valueName] = fn; - }; - - subscribeAll = (fn) => { - this.#allSubscribers.push(fn); - }; - - /** Called only from back */ - #save() { - setOptions(this.#name, this.#config); - } - - #onChange(valueName, single = true) { - this.#subscribers[valueName]?.(this.#config[valueName]); - if (single) { - for (const fn of this.#allSubscribers) { - fn(this.#config); - } - } - } - - #setupFront() { - const ignoredMethods = ['subscribe', 'subscribeAll']; - - if (process.type === 'renderer') { - for (const [fnName, fn] of Object.entries(this)) { - if (typeof fn !== 'function' || fn.name in ignoredMethods) { - return; - } - - this[fnName] = async (...args) => await ipcRenderer.invoke( - `${this.#name}-config-${fnName}`, - ...args, - ); - - this.subscribe = (valueName, fn) => { - if (valueName in this.#subscribers) { - console.error(`Already subscribed to ${valueName}`); - } - - this.#subscribers[valueName] = fn; - ipcRenderer.on( - `${this.#name}-config-changed-${valueName}`, - (_, value) => { - fn(value); - }, - ); - ipcRenderer.send(`${this.#name}-config-subscribe`, valueName); - }; - - this.subscribeAll = (fn) => { - ipcRenderer.on(`${this.#name}-config-changed`, (_, value) => { - fn(value); - }); - ipcRenderer.send(`${this.#name}-config-subscribe-all`); - }; - } - } else if (process.type === 'browser') { - for (const [fnName, fn] of Object.entries(this)) { - if (typeof fn !== 'function' || fn.name in ignoredMethods) { - return; - } - - ipcMain.handle(`${this.#name}-config-${fnName}`, (_, ...args) => fn(...args)); - } - - ipcMain.on(`${this.#name}-config-subscribe`, (_, valueName) => { - this.subscribe(valueName, (value) => { - sendToFront(`${this.#name}-config-changed-${valueName}`, value); - }); - }); - - ipcMain.on(`${this.#name}-config-subscribe-all`, () => { - this.subscribeAll((value) => { - sendToFront(`${this.#name}-config-changed`, value); - }); - }); - } - } -}; diff --git a/config/dynamic.ts b/config/dynamic.ts new file mode 100644 index 00000000..0e4faa07 --- /dev/null +++ b/config/dynamic.ts @@ -0,0 +1,240 @@ +/* eslint-disable @typescript-eslint/require-await */ + +import { ipcMain, ipcRenderer } from 'electron'; + +import defaultConfig from './defaults'; + +import { getOptions, setMenuOptions, setOptions } from './plugins'; + + +import { sendToFront } from '../providers/app-controls'; +import { Entries } from '../utils/type-utils'; + +type DefaultPluginsConfig = typeof defaultConfig.plugins; +type OneOfDefaultConfigKey = keyof DefaultPluginsConfig; +type OneOfDefaultConfig = typeof defaultConfig.plugins[OneOfDefaultConfigKey]; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const activePlugins: { [key in OneOfDefaultConfigKey]?: PluginConfig } = {}; + +/** + * [!IMPORTANT!] + * The method is **sync** in the main process and **async** in the renderer process. + */ +export const getActivePlugins + = process.type === 'renderer' + ? async () => ipcRenderer.invoke('get-active-plugins') + : () => activePlugins; + +if (process.type === 'browser') { + ipcMain.handle('get-active-plugins', getActivePlugins); +} + +/** + * [!IMPORTANT!] + * The method is **sync** in the main process and **async** in the renderer process. + */ +export const isActive + = process.type === 'renderer' + ? async (plugin: string) => + plugin in (await ipcRenderer.invoke('get-active-plugins')) + : (plugin: string): boolean => plugin in activePlugins; + +interface PluginConfigOptions { + enableFront: boolean; + initialOptions?: OneOfDefaultConfig; +} + +/** + * This class is used to create a dynamic synced config for plugins. + * + * [!IMPORTANT!] + * The methods are **sync** in the main process and **async** in the renderer process. + * + * @param {string} name - The name of the plugin. + * @param {boolean} [options.enableFront] - Whether the config should be available in front.js. Default: false. + * @param {object} [options.initialOptions] - The initial options for the plugin. Default: loaded from store. + * + * @example + * const { PluginConfig } = require("../../config/dynamic"); + * const config = new PluginConfig("plugin-name", { enableFront: true }); + * module.exports = { ...config }; + * + * // or + * + * module.exports = (win, options) => { + * const config = new PluginConfig("plugin-name", { + * enableFront: true, + * initialOptions: options, + * }); + * setupMyPlugin(win, config); + * }; + */ +type ConfigType = typeof defaultConfig.plugins[T]; +type ValueOf = T[keyof T]; +export class PluginConfig { + private name: string; + private config: ConfigType; + private defaultConfig: ConfigType; + private enableFront: boolean; + + private subscribers: { [key in keyof ConfigType]?: (config: ConfigType) => void } = {}; + private allSubscribers: ((config: ConfigType) => void)[] = []; + + constructor( + name: T, + options: PluginConfigOptions = { + enableFront: false, + }, + ) { + const pluginDefaultConfig = defaultConfig.plugins[name] ?? {}; + const pluginConfig = options.initialOptions || getOptions(name) || {}; + + this.name = name; + this.enableFront = options.enableFront; + this.defaultConfig = pluginDefaultConfig; + this.config = { ...pluginDefaultConfig, ...pluginConfig }; + + if (this.enableFront) { + this.#setupFront(); + } + + activePlugins[name] = this; + } + + async get(key: keyof ConfigType): Promise>> { + return this.config[key]; + } + + set(key: keyof ConfigType, value: ValueOf>) { + this.config[key] = value; + this.#onChange(key); + this.#save(); + } + + getAll() { + return { ...this.config }; + } + + setAll(options: ConfigType) { + if (!options || typeof options !== 'object') { + throw new Error('Options must be an object.'); + } + + let changed = false; + for (const [key, value] of Object.entries(options) as Entries) { + if (this.config[key] !== value) { + this.config[key] = value; + this.#onChange(key, false); + changed = true; + } + } + + if (changed) { + for (const fn of this.allSubscribers) { + fn(this.config); + } + } + + this.#save(); + } + + getDefaultConfig() { + return this.defaultConfig; + } + + /** + * Use this method to set an option and restart the app if `appConfig.restartOnConfigChange === true` + * + * Used for options that require a restart to take effect. + */ + setAndMaybeRestart(key: keyof ConfigType, value: ValueOf>) { + this.config[key] = value; + setMenuOptions(this.name, this.config); + this.#onChange(key); + } + + subscribe(valueName: keyof ConfigType, fn: (config: ConfigType) => void) { + this.subscribers[valueName] = fn; + } + + subscribeAll(fn: (config: ConfigType) => void) { + this.allSubscribers.push(fn); + } + + /** Called only from back */ + #save() { + setOptions(this.name, this.config); + } + + #onChange(valueName: keyof ConfigType, single: boolean = true) { + this.subscribers[valueName]?.(this.config[valueName] as ConfigType); + if (single) { + for (const fn of this.allSubscribers) { + fn(this.config); + } + } + } + + #setupFront() { + const ignoredMethods = ['subscribe', 'subscribeAll']; + + if (process.type === 'renderer') { + for (const [fnName, fn] of Object.entries(this) as Entries) { + if (typeof fn !== 'function' || fn.name in ignoredMethods) { + return; + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-return + this[fnName] = (async (...args: any) => await ipcRenderer.invoke( + `${this.name}-config-${String(fnName)}`, + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + ...args, + )) as typeof this[keyof this]; + + this.subscribe = (valueName, fn: (config: ConfigType) => void) => { + if (valueName in this.subscribers) { + console.error(`Already subscribed to ${String(valueName)}`); + } + + this.subscribers[valueName] = fn; + ipcRenderer.on( + `${this.name}-config-changed-${String(valueName)}`, + (_, value: ConfigType) => { + fn(value); + }, + ); + ipcRenderer.send(`${this.name}-config-subscribe`, valueName); + }; + + this.subscribeAll = (fn: (config: ConfigType) => void) => { + ipcRenderer.on(`${this.name}-config-changed`, (_, value: ConfigType) => { + fn(value); + }); + ipcRenderer.send(`${this.name}-config-subscribe-all`); + }; + } + } else if (process.type === 'browser') { + for (const [fnName, fn] of Object.entries(this) as Entries) { + if (typeof fn !== 'function' || fn.name in ignoredMethods) { + return; + } + + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-return + ipcMain.handle(`${this.name}-config-${String(fnName)}`, (_, ...args) => fn(...args)); + } + + ipcMain.on(`${this.name}-config-subscribe`, (_, valueName: keyof ConfigType) => { + this.subscribe(valueName, (value) => { + sendToFront(`${this.name}-config-changed-${String(valueName)}`, value); + }); + }); + + ipcMain.on(`${this.name}-config-subscribe-all`, () => { + this.subscribeAll((value) => { + sendToFront(`${this.name}-config-changed`, value); + }); + }); + } + } +} diff --git a/config/index.js b/config/index.js deleted file mode 100644 index b8adb91f..00000000 --- a/config/index.js +++ /dev/null @@ -1,31 +0,0 @@ -const defaultConfig = require('./defaults'); -const plugins = require('./plugins'); -const store = require('./store'); - -const { restart } = require('../providers/app-controls'); - -const set = (key, value) => { - store.set(key, value); -}; - -function setMenuOption(key, value) { - set(key, value); - if (store.get('options.restartOnConfigChanges')) { - restart(); - } -} - -const get = (key) => store.get(key); - -module.exports = { - defaultConfig, - get, - set, - setMenuOption, - edit: () => store.openInEditor(), - watch(cb) { - store.onDidChange('options', cb); - store.onDidChange('plugins', cb); - }, - plugins, -}; diff --git a/config/index.ts b/config/index.ts new file mode 100644 index 00000000..a27666dc --- /dev/null +++ b/config/index.ts @@ -0,0 +1,57 @@ +import Store from 'electron-store'; + +import defaultConfig from './defaults'; +import plugins from './plugins'; +import store from './store'; + +import { restart } from '../providers/app-controls'; + + +const set = (key: string, value: unknown) => { + store.set(key, value); +}; + +function setMenuOption(key: string, value: unknown) { + set(key, value); + if (store.get('options.restartOnConfigChanges')) { + restart(); + } +} + +// MAGIC OF TYPESCRIPT + +type Prev = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...0[]] +type Join = K extends string | number ? + P extends string | number ? + `${K}${'' extends P ? '' : '.'}${P}` + : never : never; +type Paths = [D] extends [never] ? never : T extends object ? + { [K in keyof T]-?: K extends string | number ? + `${K}` | Join> + : never + }[keyof T] : '' + +type FirstKey = T extends `${infer K}.${string}` ? K : T; +type NextKey = T extends `${string}.${infer K}` ? K : T; +type PathValue = ( + T extends object + ? FirstKey extends keyof T + ? PathValue], NextKey> + : T + : T +); +const get = >(key: Key) => store.get(key) as PathValue; + +export default { + defaultConfig, + get, + set, + setMenuOption, + edit: () => store.openInEditor(), + watch(cb: Parameters[1]) { + store.onDidChange('options', cb); + store.onDidChange('plugins', cb); + }, + plugins, +}; diff --git a/config/plugins.js b/config/plugins.js deleted file mode 100644 index 5589600a..00000000 --- a/config/plugins.js +++ /dev/null @@ -1,55 +0,0 @@ -const store = require('./store'); - -const { restart } = require('../providers/app-controls'); - -function getEnabled() { - const plugins = store.get('plugins'); - return Object.entries(plugins).filter(([plugin]) => - isEnabled(plugin), - ); -} - -function isEnabled(plugin) { - const pluginConfig = store.get('plugins')[plugin]; - return pluginConfig !== undefined && pluginConfig.enabled; -} - -function setOptions(plugin, options) { - const plugins = store.get('plugins'); - store.set('plugins', { - ...plugins, - [plugin]: { - ...plugins[plugin], - ...options, - }, - }); -} - -function setMenuOptions(plugin, options) { - setOptions(plugin, options); - if (store.get('options.restartOnConfigChanges')) { - restart(); - } -} - -function getOptions(plugin) { - return store.get('plugins')[plugin]; -} - -function enable(plugin) { - setMenuOptions(plugin, { enabled: true }); -} - -function disable(plugin) { - setMenuOptions(plugin, { enabled: false }); -} - -module.exports = { - isEnabled, - getEnabled, - enable, - disable, - setOptions, - setMenuOptions, - getOptions, -}; diff --git a/config/plugins.ts b/config/plugins.ts new file mode 100644 index 00000000..f9ed8d64 --- /dev/null +++ b/config/plugins.ts @@ -0,0 +1,63 @@ +import store from './store'; +import defaultConfig from './defaults'; + +import { restart } from '../providers/app-controls'; +import { Entries } from '../utils/type-utils'; + +interface Plugin { + enabled: boolean; +} + +type DefaultPluginsConfig = typeof defaultConfig.plugins; + +export function getEnabled() { + const plugins = store.get('plugins') as DefaultPluginsConfig; + return (Object.entries(plugins) as Entries).filter(([plugin]) => + isEnabled(plugin), + ); +} + +export function isEnabled(plugin: string) { + const pluginConfig = (store.get('plugins') as Record)[plugin]; + return pluginConfig !== undefined && pluginConfig.enabled; +} + +export function setOptions(plugin: string, options: T) { + const plugins = store.get('plugins') as Record; + store.set('plugins', { + ...plugins, + [plugin]: { + ...plugins[plugin], + ...options, + }, + }); +} + +export function setMenuOptions(plugin: string, options: T) { + setOptions(plugin, options); + if (store.get('options.restartOnConfigChanges')) { + restart(); + } +} + +export function getOptions(plugin: string): T { + return (store.get('plugins') as Record)[plugin]; +} + +export function enable(plugin: string) { + setMenuOptions(plugin, { enabled: true }); +} + +export function disable(plugin: string) { + setMenuOptions(plugin, { enabled: false }); +} + +export default { + isEnabled, + getEnabled, + enable, + disable, + setOptions, + setMenuOptions, + getOptions, +}; diff --git a/config/store.js b/config/store.ts similarity index 67% rename from config/store.js rename to config/store.ts index c755b1c2..f5fdac9d 100644 --- a/config/store.js +++ b/config/store.ts @@ -1,15 +1,16 @@ -const Store = require('electron-store'); +import Store from 'electron-store'; +import Conf from 'conf'; -const defaults = require('./defaults'); +import defaults from './defaults'; -const setDefaultPluginOptions = (store, plugin) => { +const setDefaultPluginOptions = (store: Conf>, plugin: keyof typeof defaults.plugins) => { if (!store.get(`plugins.${plugin}`)) { store.set(`plugins.${plugin}`, defaults.plugins[plugin]); } }; const migrations = { - '>=1.20.0'(store) { + '>=1.20.0'(store: Conf>) { setDefaultPluginOptions(store, 'visualizer'); if (store.get('plugins.notifications.toastStyle') === undefined) { @@ -25,14 +26,14 @@ const migrations = { store.set('options.likeButtons', 'force'); } }, - '>=1.17.0'(store) { + '>=1.17.0'(store: Conf>) { setDefaultPluginOptions(store, 'picture-in-picture'); if (store.get('plugins.video-toggle.mode') === undefined) { store.set('plugins.video-toggle.mode', 'custom'); } }, - '>=1.14.0'(store) { + '>=1.14.0'(store: Conf>) { if ( typeof store.get('plugins.precise-volume.globalShortcuts') !== 'object' ) { @@ -44,18 +45,25 @@ const migrations = { store.set('plugins.video-toggle.enabled', true); } }, - '>=1.13.0'(store) { + '>=1.13.0'(store: Conf>) { if (store.get('plugins.discord.listenAlong') === undefined) { store.set('plugins.discord.listenAlong', true); } }, - '>=1.12.0'(store) { - const options = store.get('plugins.shortcuts'); + '>=1.12.0'(store: Conf>) { + const options = store.get('plugins.shortcuts') as Record>; let updated = false; for (const optionType of ['global', 'local']) { if (Array.isArray(options[optionType])) { - const updatedOptions = {}; - for (const optionObject of options[optionType]) { + const optionsArray = options[optionType] as { + action: string; + shortcut: unknown; + }[]; + const updatedOptions: Record = {}; + for (const optionObject of optionsArray) { if (optionObject.action && optionObject.shortcut) { updatedOptions[optionObject.action] = optionObject.shortcut; } @@ -70,20 +78,21 @@ const migrations = { store.set('plugins.shortcuts', options); } }, - '>=1.11.0'(store) { + '>=1.11.0'(store: Conf>) { if (store.get('options.resumeOnStart') === undefined) { store.set('options.resumeOnStart', true); } }, - '>=1.7.0'(store) { - const enabledPlugins = store.get('plugins'); + '>=1.7.0'(store: Conf>) { + const enabledPlugins = store.get('plugins') as string[]; if (!Array.isArray(enabledPlugins)) { console.warn('Plugins are not in array format, cannot migrate'); return; } // Include custom options - const plugins = { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const plugins: Record = { adblocker: { enabled: true, cache: true, @@ -95,7 +104,9 @@ const migrations = { downloadFolder: undefined, // Custom download folder (absolute path) }, }; + for (const enabledPlugin of enabledPlugins) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment plugins[enabledPlugin] = { ...plugins[enabledPlugin], enabled: true, @@ -106,7 +117,7 @@ const migrations = { }, }; -module.exports = new Store({ +export default new Store({ defaults, clearInvalidConfig: false, migrations, diff --git a/custom-electron-prompt.d.ts b/custom-electron-prompt.d.ts new file mode 100644 index 00000000..9fdceaf0 --- /dev/null +++ b/custom-electron-prompt.d.ts @@ -0,0 +1,46 @@ +declare module 'custom-electron-prompt' { + import { BrowserWindow } from 'electron'; + + export interface PromptCounterOptions { + minimum?: number; + maximum?: number; + multiFire?: boolean; + } + + export interface PromptKeybindOptions { + value: string; + label: string; + default: string; + } + + export interface PromptOptions { + width?: number; + height?: number; + resizable?: boolean; + title?: string; + label?: string; + buttonLabels?: { + ok?: string; + cancel?: string; + }; + alwaysOnTop?: boolean; + value?: string; + type?: 'input' | 'select' | 'counter'; + selectOptions?: Record; + keybindOptions?: PromptKeybindOptions[]; + counterOptions?: PromptCounterOptions; + icon?: string; + useHtmlLabel?: boolean; + customStylesheet?: string; + menuBarVisible?: boolean; + skipTaskbar?: boolean; + frame?: boolean; + customScript?: string; + enableRemoteModule?: boolean; + inputAttrs: Partial; + } + + const prompt: (options?: PromptOptions, parent?: BrowserWindow) => Promise; + + export default prompt; +} diff --git a/index.js b/index.ts similarity index 81% rename from index.js rename to index.ts index f88d71a1..ddb892f6 100644 --- a/index.js +++ b/index.ts @@ -1,20 +1,23 @@ -'use strict'; -const path = require('node:path'); +import path from 'node:path'; -const electron = require('electron'); -const enhanceWebRequest = require('electron-better-web-request').default; -const is = require('electron-is'); -const unhandled = require('electron-unhandled'); -const { autoUpdater } = require('electron-updater'); +import electron, { BrowserWindow } from 'electron'; +import enhanceWebRequest from 'electron-better-web-request'; +import is from 'electron-is'; +import unhandled from 'electron-unhandled'; +import { autoUpdater } from 'electron-updater'; +import electronDebug from 'electron-debug'; + +import { BetterWebRequest } from 'electron-better-web-request/lib/electron-better-web-request'; + +import config from './config'; +import { setApplicationMenu } from './menu'; +import { fileExists, injectCSS } from './plugins/utils'; +import { isTesting } from './utils/testing'; +import { setUpTray } from './tray'; +import { setupSongInfo } from './providers/song-info'; +import { restart, setupAppControls } from './providers/app-controls'; +import { APP_PROTOCOL, handleProtocol, setupProtocolHandler } from './providers/protocol-handler'; -const config = require('./config'); -const { setApplicationMenu } = require('./menu'); -const { fileExists, injectCSS } = require('./plugins/utils'); -const { isTesting } = require('./utils/testing'); -const { setUpTray } = require('./tray'); -const { setupSongInfo } = require('./providers/song-info'); -const { setupAppControls, restart } = require('./providers/app-controls'); -const { APP_PROTOCOL, setupProtocolHandler, handleProtocol } = require('./providers/protocol-handler'); // Catch errors and log them unhandled({ @@ -27,7 +30,7 @@ process.env.NODE_OPTIONS = ''; const { app } = electron; // Prevent window being garbage collected -let mainWindow; +let mainWindow: Electron.BrowserWindow | null; autoUpdater.autoDownload = false; const gotTheLock = app.requestSingleInstanceLock(); @@ -45,7 +48,7 @@ if (config.get('options.disableHardwareAcceleration')) { } if (is.linux() && config.plugins.isEnabled('shortcuts')) { - // Stops chromium from launching it's own mpris service + // Stops chromium from launching its own MPRIS service app.commandLine.appendSwitch('disable-features', 'MediaSessionService'); } @@ -54,7 +57,7 @@ if (config.get('options.proxy')) { } // Adds debug features like hotkeys for triggering dev tools and reload -require('electron-debug')({ +electronDebug({ showDevTools: false, // Disable automatic devTools on new window }); @@ -67,15 +70,14 @@ if (process.platform === 'win32') { function onClosed() { // Dereference the window - // For multiple windows store them in an array + // For multiple Windows store them in an array mainWindow = null; } -/** @param {Electron.BrowserWindow} win */ -function loadPlugins(win) { +function loadPlugins(win: BrowserWindow) { injectCSS(win.webContents, path.join(__dirname, 'youtube-music.css')); // Load user CSS - const themes = config.get('options.themes'); + const themes: string[] = config.get('options.themes'); if (Array.isArray(themes)) { for (const cssFile of themes) { fileExists( @@ -101,7 +103,8 @@ function loadPlugins(win) { console.log('Loaded plugin - ' + plugin); const pluginPath = path.join(__dirname, 'plugins', plugin, 'back.js'); fileExists(pluginPath, () => { - const handle = require(pluginPath); + // eslint-disable-next-line @typescript-eslint/no-var-requires + const handle = require(pluginPath) as (window: BrowserWindow, option: typeof options) => void; handle(win, options); }); } @@ -110,7 +113,7 @@ function loadPlugins(win) { function createMainWindow() { const windowSize = config.get('window-size'); const windowMaximized = config.get('window-maximized'); - const windowPosition = config.get('window-position'); + const windowPosition: Electron.Point = config.get('window-position'); const useInlineMenu = config.plugins.isEnabled('in-app-menu'); const win = new electron.BrowserWindow({ @@ -120,12 +123,11 @@ function createMainWindow() { backgroundColor: '#000', show: false, webPreferences: { - // TODO: re-enable contextIsolation once it can work with ffmepg.wasm + // TODO: re-enable contextIsolation once it can work with FFMpeg.wasm // Possible bundling? https://github.com/ffmpegwasm/ffmpeg.wasm/issues/126 contextIsolation: false, preload: path.join(__dirname, 'preload.js'), nodeIntegrationInSubFrames: true, - affinity: 'main-window', // Main window, and addition windows should work in one process ...(isTesting() ? undefined : { @@ -158,7 +160,7 @@ function createMainWindow() { // Window is offscreen if (is.dev()) { console.log( - `Window tried to render offscreen, windowSize=${winSize}, displaySize=${displaySize}, position=${windowPosition}`, + `Window tried to render offscreen, windowSize=${String(winSize)}, displaySize=${String(displaySize)}, position=${String(windowPosition)}`, ); } } else { @@ -180,10 +182,12 @@ function createMainWindow() { win.webContents.loadURL(urlToLoad); win.on('closed', onClosed); + type PiPOptions = typeof config.defaultConfig.plugins['picture-in-picture']; const setPiPOptions = config.plugins.isEnabled('picture-in-picture') - ? (key, value) => require('./plugins/picture-in-picture/back').setOptions({ [key]: value }) - : () => { - }; + // eslint-disable-next-line @typescript-eslint/no-var-requires + ? (key: string, value: unknown) => (require('./plugins/picture-in-picture/back') as typeof import('./plugins/picture-in-picture/back')) + .setOptions({ [key]: value }) + : () => {}; win.on('move', () => { if (win.isMaximized()) { @@ -191,17 +195,18 @@ function createMainWindow() { } const position = win.getPosition(); - const isPiPEnabled + const isPiPEnabled: boolean = config.plugins.isEnabled('picture-in-picture') - && config.plugins.getOptions('picture-in-picture').isInPiP; + && config.plugins.getOptions('picture-in-picture').isInPiP; if (!isPiPEnabled) { + lateSave('window-position', { x: position[0], y: position[1] }); - } else if (config.plugins.getOptions('picture-in-picture').savePosition) { + } else if (config.plugins.getOptions('picture-in-picture').savePosition) { lateSave('pip-position', position, setPiPOptions); } }); - let winWasMaximized; + let winWasMaximized: boolean; win.on('resize', () => { const windowSize = win.getSize(); @@ -209,7 +214,7 @@ function createMainWindow() { const isPiPEnabled = config.plugins.isEnabled('picture-in-picture') - && config.plugins.getOptions('picture-in-picture').isInPiP; + && config.plugins.getOptions('picture-in-picture').isInPiP; if (!isPiPEnabled && winWasMaximized !== isMaximized) { winWasMaximized = isMaximized; @@ -225,14 +230,14 @@ function createMainWindow() { width: windowSize[0], height: windowSize[1], }); - } else if (config.plugins.getOptions('picture-in-picture').saveSize) { + } else if (config.plugins.getOptions('picture-in-picture').saveSize) { lateSave('pip-size', windowSize, setPiPOptions); } }); - const savedTimeouts = {}; + const savedTimeouts: Record = {}; - function lateSave(key, value, fn = config.set) { + function lateSave(key: string, value: unknown, fn: (key: string, value: unknown) => void = config.set) { if (savedTimeouts[key]) { clearTimeout(savedTimeouts[key]); } @@ -243,7 +248,7 @@ function createMainWindow() { }, 600); } - win.webContents.on('render-process-gone', (event, webContents, details) => { + app.on('render-process-gone', (event, webContents, details) => { showUnresponsiveDialog(win, details); }); @@ -434,7 +439,7 @@ app.on('ready', () => { autoUpdater.on('update-available', () => { const downloadLink = 'https://github.com/th-ch/youtube-music/releases/latest'; - const dialogOptions = { + const dialogOptions: Electron.MessageBoxOptions = { type: 'info', buttons: ['OK', 'Download', 'Disable updates'], title: 'Application Update', @@ -486,13 +491,13 @@ app.on('ready', () => { // Hide the window instead of quitting (quit is available in tray options) if (!forceQuit) { event.preventDefault(); - mainWindow.hide(); + mainWindow!.hide(); } }); } }); -function showUnresponsiveDialog(win, details) { +function showUnresponsiveDialog(win: BrowserWindow, details: Electron.RenderProcessGoneDetails) { if (details) { console.log('Unresponsive Error!\n' + JSON.stringify(details, null, '\t')); } @@ -501,7 +506,7 @@ function showUnresponsiveDialog(win, details) { type: 'error', title: 'Window Unresponsive', message: 'The Application is Unresponsive', - details: 'We are sorry for the inconvenience! please choose what to do:', + detail: 'We are sorry for the inconvenience! please choose what to do:', buttons: ['Wait', 'Relaunch', 'Quit'], cancelId: 0, }).then((result) => { @@ -519,8 +524,10 @@ function showUnresponsiveDialog(win, details) { }); } +// HACK: electron-better-web-request's typing is wrong +type BetterSession = Omit & { webRequest: BetterWebRequest & Electron.WebRequest }; function removeContentSecurityPolicy( - session = electron.session.defaultSession, + session: BetterSession = electron.session.defaultSession as BetterSession, ) { // Allows defining multiple "onHeadersReceived" listeners // by enhancing the session. @@ -538,15 +545,16 @@ function removeContentSecurityPolicy( callback({ cancel: false, responseHeaders: details.responseHeaders }); }); + type ResolverListener = { apply: () => Record; context: unknown }; // When multiple listeners are defined, apply them all - session.webRequest.setResolver('onHeadersReceived', (listeners) => { + session.webRequest.setResolver('onHeadersReceived', (listeners: ResolverListener[]) => { return listeners.reduce( - async (accumulator, listener) => { + (accumulator: Record, listener: ResolverListener) => { if (accumulator.cancel) { return accumulator; } - const result = await listener.apply(); + const result = listener.apply(); return { ...accumulator, ...result }; }, { cancel: false }, diff --git a/menu.js b/menu.ts similarity index 86% rename from menu.js rename to menu.ts index a67def73..629d7299 100644 --- a/menu.js +++ b/menu.ts @@ -1,24 +1,26 @@ -const { existsSync } = require('node:fs'); -const path = require('node:path'); +import { existsSync } from 'node:fs'; +import path from 'node:path'; -const { app, clipboard, Menu, dialog } = require('electron'); -const is = require('electron-is'); -const prompt = require('custom-electron-prompt'); +import is from 'electron-is'; +import { app, BrowserWindow, clipboard, dialog, Menu } from 'electron'; +import prompt from 'custom-electron-prompt'; -const { restart } = require('./providers/app-controls'); -const { getAllPlugins } = require('./plugins/utils'); -const config = require('./config'); -const { startingPages } = require('./providers/extracted-data'); -const promptOptions = require('./providers/prompt-options'); +import { restart } from './providers/app-controls'; +import { getAllPlugins } from './plugins/utils'; +import config from './config'; +import { startingPages } from './providers/extracted-data'; +import promptOptions from './providers/prompt-options'; + +export type MenuTemplate = (Electron.MenuItemConstructorOptions | Electron.MenuItem)[]; // True only if in-app-menu was loaded on launch const inAppMenuActive = config.plugins.isEnabled('in-app-menu'); -const pluginEnabledMenu = (plugin, label = '', hasSubmenu = false, refreshMenu = undefined) => ({ +const pluginEnabledMenu = (plugin: string, label = '', hasSubmenu = false, refreshMenu: (() => void ) | undefined = undefined): Electron.MenuItemConstructorOptions => ({ label: label || plugin, type: 'checkbox', checked: config.plugins.isEnabled(plugin), - click(item) { + click(item: Electron.MenuItem) { if (item.checked) { config.plugins.enable(plugin); } else { @@ -26,14 +28,14 @@ const pluginEnabledMenu = (plugin, label = '', hasSubmenu = false, refreshMenu = } if (hasSubmenu) { - refreshMenu(); + refreshMenu?.(); } }, }); -const mainMenuTemplate = (win) => { +export const mainMenuTemplate = (win: BrowserWindow): MenuTemplate => { const refreshMenu = () => { - this.setApplicationMenu(win); + setApplicationMenu(win); if (inAppMenuActive) { win.webContents.send('refreshMenu'); } @@ -55,7 +57,9 @@ const mainMenuTemplate = (win) => { return pluginEnabledMenu(plugin, pluginLabel, true, refreshMenu); } - const getPluginMenu = require(pluginPath); + type PluginType = (window: BrowserWindow, plugins: string, func: () => void) => Electron.MenuItemConstructorOptions[]; + // eslint-disable-next-line @typescript-eslint/no-var-requires + const getPluginMenu = require(pluginPath) as PluginType; return { label: pluginLabel, submenu: [ @@ -63,12 +67,11 @@ const mainMenuTemplate = (win) => { { type: 'separator' }, ...getPluginMenu(win, config.plugins.getOptions(plugin), refreshMenu), ], - }; + } satisfies Electron.MenuItemConstructorOptions; } return pluginEnabledMenu(plugin); - }) - , + }), }, { label: 'Options', @@ -208,7 +211,7 @@ const mainMenuTemplate = (win) => { }, }, ] - : []), + : []) satisfies Electron.MenuItemConstructorOptions[], ...(is.windows() || is.macOS() ? // Only works on Win/Mac // https://www.electronjs.org/docs/api/app#appsetloginitemsettingssettings-macos-windows @@ -222,7 +225,7 @@ const mainMenuTemplate = (win) => { }, }, ] - : []), + : []) satisfies Electron.MenuItemConstructorOptions[], { label: 'Tray', submenu: [ @@ -238,8 +241,7 @@ const mainMenuTemplate = (win) => { { label: 'Enabled + app visible', type: 'radio', - checked: - config.get('options.tray') && config.get('options.appVisible'), + checked: !!(config.get('options.tray') && config.get('options.appVisible')), click() { config.setMenuOption('options.tray', true); config.setMenuOption('options.appVisible', true); @@ -248,8 +250,7 @@ const mainMenuTemplate = (win) => { { label: 'Enabled + app hidden', type: 'radio', - checked: - config.get('options.tray') && !config.get('options.appVisible'), + checked: !!(config.get('options.tray') && !config.get('options.appVisible')), click() { config.setMenuOption('options.tray', true); config.setMenuOption('options.appVisible', false); @@ -320,8 +321,7 @@ const mainMenuTemplate = (win) => { if (webContents.isDevToolsOpened()) { webContents.closeDevTools(); } else { - const devToolsOptions = {}; - webContents.openDevTools(devToolsOptions); + webContents.openDevTools(); } }, } @@ -384,10 +384,8 @@ const mainMenuTemplate = (win) => { }, ]; }; - -module.exports.mainMenuTemplate = mainMenuTemplate; -module.exports.setApplicationMenu = (win) => { - const menuTemplate = [...mainMenuTemplate(win)]; +export const setApplicationMenu = (win: Electron.BrowserWindow) => { + const menuTemplate: MenuTemplate = [...mainMenuTemplate(win)]; if (process.platform === 'darwin') { const { name } = app; menuTemplate.unshift({ @@ -396,17 +394,13 @@ module.exports.setApplicationMenu = (win) => { { role: 'about' }, { type: 'separator' }, { role: 'hide' }, - { role: 'hideothers' }, + { role: 'hideOthers' }, { role: 'unhide' }, { type: 'separator' }, - { - label: 'Select All', - accelerator: 'CmdOrCtrl+A', - selector: 'selectAll:', - }, - { label: 'Cut', accelerator: 'CmdOrCtrl+X', selector: 'cut:' }, - { label: 'Copy', accelerator: 'CmdOrCtrl+C', selector: 'copy:' }, - { label: 'Paste', accelerator: 'CmdOrCtrl+V', selector: 'paste:' }, + { role: 'selectAll' }, + { role: 'cut' }, + { role: 'copy' }, + { role: 'paste' }, { type: 'separator' }, { role: 'minimize' }, { role: 'close' }, @@ -419,7 +413,7 @@ module.exports.setApplicationMenu = (win) => { Menu.setApplicationMenu(menu); }; -async function setProxy(item, win) { +async function setProxy(item: Electron.MenuItem, win: BrowserWindow) { const output = await prompt({ title: 'Set Proxy', label: 'Enter Proxy Address: (leave empty to disable)', diff --git a/package-lock.json b/package-lock.json index 2cd08e2c..0a5d5edd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,7 @@ "browser-id3-writer": "5.0.0", "butterchurn": "2.6.7", "butterchurn-presets": "2.4.7", + "conf": "10.2.0", "custom-electron-prompt": "1.5.7", "custom-electron-titlebar": "4.1.6", "electron-better-web-request": "1.0.1", @@ -42,6 +43,9 @@ }, "devDependencies": { "@playwright/test": "1.37.1", + "@total-typescript/ts-reset": "0.5.1", + "@types/youtube-player": "^5.5.7", + "@typescript-eslint/eslint-plugin": "6.5.0", "auto-changelog": "2.4.0", "del-cli": "5.0.1", "electron": "27.0.0-alpha.5", @@ -52,7 +56,8 @@ "eslint-plugin-prettier": "5.0.0", "node-gyp": "9.4.0", "patch-package": "^8.0.0", - "playwright": "1.37.1" + "playwright": "1.37.1", + "typescript": "5.2.2" }, "engines": { "node": ">=16.0.0" @@ -1128,6 +1133,12 @@ "node": ">= 10" } }, + "node_modules/@total-typescript/ts-reset": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@total-typescript/ts-reset/-/ts-reset-0.5.1.tgz", + "integrity": "sha512-AqlrT8YA1o7Ff5wPfMOL0pvL+1X+sw60NN6CcOCqs658emD6RfiXhF7Gu9QcfKBH7ELY2nInLhKSCWVoNL70MQ==", + "dev": true + }, "node_modules/@types/cacheable-request": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", @@ -1194,6 +1205,12 @@ "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -1250,6 +1267,12 @@ "@types/node": "*" } }, + "node_modules/@types/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==", + "dev": true + }, "node_modules/@types/verror": { "version": "1.10.6", "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.6.tgz", @@ -1266,6 +1289,231 @@ "@types/node": "*" } }, + "node_modules/@types/youtube-player": { + "version": "5.5.7", + "resolved": "https://registry.npmjs.org/@types/youtube-player/-/youtube-player-5.5.7.tgz", + "integrity": "sha512-W8F4eoTIvzXeNrT3JroQPimZLXnlJA8smYygHZUKFPVoYwgs/OhJkA1VBhL3iSs57OQkuINqHlY4SmMT5wtnJg==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.5.0.tgz", + "integrity": "sha512-2pktILyjvMaScU6iK3925uvGU87E+N9rh372uGZgiMYwafaw9SXq86U04XPq3UH6tzRvNgBsub6x2DacHc33lw==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.5.0", + "@typescript-eslint/type-utils": "6.5.0", + "@typescript-eslint/utils": "6.5.0", + "@typescript-eslint/visitor-keys": "6.5.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.5.0.tgz", + "integrity": "sha512-LMAVtR5GN8nY0G0BadkG0XIe4AcNMeyEy3DyhKGAh9k4pLSMBO7rF29JvDBpZGCmp5Pgz5RLHP6eCpSYZJQDuQ==", + "dev": true, + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.5.0", + "@typescript-eslint/types": "6.5.0", + "@typescript-eslint/typescript-estree": "6.5.0", + "@typescript-eslint/visitor-keys": "6.5.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.5.0.tgz", + "integrity": "sha512-A8hZ7OlxURricpycp5kdPTH3XnjG85UpJS6Fn4VzeoH4T388gQJ/PGP4ole5NfKt4WDVhmLaQ/dBLNDC4Xl/Kw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.5.0", + "@typescript-eslint/visitor-keys": "6.5.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.5.0.tgz", + "integrity": "sha512-f7OcZOkRivtujIBQ4yrJNIuwyCQO1OjocVqntl9dgSIZAdKqicj3xFDqDOzHDlGCZX990LqhLQXWRnQvsapq8A==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.5.0", + "@typescript-eslint/utils": "6.5.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.5.0.tgz", + "integrity": "sha512-eqLLOEF5/lU8jW3Bw+8auf4lZSbbljHR2saKnYqON12G/WsJrGeeDHWuQePoEf9ro22+JkbPfWQwKEC5WwLQ3w==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.5.0.tgz", + "integrity": "sha512-q0rGwSe9e5Kk/XzliB9h2LBc9tmXX25G0833r7kffbl5437FPWb2tbpIV9wAATebC/018pGa9fwPDuvGN+LxWQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.5.0", + "@typescript-eslint/visitor-keys": "6.5.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.5.0.tgz", + "integrity": "sha512-9nqtjkNykFzeVtt9Pj6lyR9WEdd8npPhhIPM992FWVkZuS6tmxHfGVnlUcjpUP2hv8r4w35nT33mlxd+Be1ACQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.5.0", + "@typescript-eslint/types": "6.5.0", + "@typescript-eslint/typescript-estree": "6.5.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.5.0.tgz", + "integrity": "sha512-yCB/2wkbv3hPsh02ZS8dFQnij9VVQXJMN/gbQsaaY+zxALkZnxa/wagvLEFsAWMPv7d7lxQmNsIzGU1w/T/WyA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.5.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@xhayper/discord-rpc": { "version": "1.0.22", "resolved": "https://registry.npmjs.org/@xhayper/discord-rpc/-/discord-rpc-1.0.22.tgz", @@ -1631,6 +1879,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/array.prototype.findlastindex": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", @@ -2526,6 +2783,19 @@ "typescript": "^4.0.2" } }, + "node_modules/config-file-ts/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -2624,6 +2894,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/debounce-fn/node_modules/mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -3977,18 +4255,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/execa/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/execa/node_modules/onetime": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", @@ -5966,11 +6232,15 @@ } }, "node_modules/mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/mimic-response": { @@ -8271,6 +8541,18 @@ "utf8-byte-length": "^1.0.1" } }, + "node_modules/ts-api-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.2.tgz", + "integrity": "sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -8397,16 +8679,16 @@ } }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, "node_modules/uglify-js": { diff --git a/package.json b/package.json index 9e0d3a56..5a7dccb6 100644 --- a/package.json +++ b/package.json @@ -76,17 +76,20 @@ } } ] + }, + "directories": { + "output": "./pack/" } }, "scripts": { "test": "playwright test", "test:debug": "DEBUG=pw:browser* playwright test", - "start": "electron .", - "start:debug": "ELECTRON_ENABLE_LOGGING=1 electron .", + "start": "tsc && electron ./dist/index.js", + "start:debug": "ELECTRON_ENABLE_LOGGING=1 electron ./dist/index.js", "generate:package": "node utils/generate-package-json.js", "postinstall": "npm run plugins", - "clean": "del-cli dist", - "build": "npm run clean && electron-builder --win --mac --linux -p never", + "clean": "del-cli dist && del-cli pack", + "build": "npm run clean && tsc && electron-builder --win --mac --linux -p never", "build:linux": "npm run clean && electron-builder --linux -p never", "build:mac": "npm run clean && electron-builder --mac dmg:x64 -p never", "build:mac:arm64": "npm run clean && electron-builder --mac dmg:arm64 -p never", @@ -95,11 +98,12 @@ "lint": "xo", "changelog": "auto-changelog", "plugins": "npm run plugin:adblocker && npm run plugin:bypass-age-restrictions", - "plugin:adblocker": "del-cli plugins/adblocker/ad-blocker-engine.bin && node plugins/adblocker/blocker.js", + "plugin:adblocker": "del-cli plugins/adblocker/ad-blocker-engine.bin && node plugins/adblocker/blocker.ts", "plugin:bypass-age-restrictions": "del-cli node_modules/simple-youtube-age-restriction-bypass/package.json && npm run generate:package simple-youtube-age-restriction-bypass", "release:linux": "npm run clean && electron-builder --linux -p always -c.snap.publish=github", "release:mac": "npm run clean && electron-builder --mac -p always", - "release:win": "npm run clean && electron-builder --win -p always" + "release:win": "npm run clean && electron-builder --win -p always", + "typecheck": "tsc -p tsconfig.json --noEmit" }, "engines": { "node": ">=16.0.0" @@ -114,6 +118,7 @@ "browser-id3-writer": "5.0.0", "butterchurn": "2.6.7", "butterchurn-presets": "2.4.7", + "conf": "10.2.0", "custom-electron-prompt": "1.5.7", "custom-electron-titlebar": "4.1.6", "electron-better-web-request": "1.0.1", @@ -143,6 +148,9 @@ }, "devDependencies": { "@playwright/test": "1.37.1", + "@total-typescript/ts-reset": "0.5.1", + "@types/youtube-player": "^5.5.7", + "@typescript-eslint/eslint-plugin": "6.5.0", "auto-changelog": "2.4.0", "del-cli": "5.0.1", "electron": "27.0.0-alpha.5", @@ -153,7 +161,8 @@ "eslint-plugin-prettier": "5.0.0", "node-gyp": "9.4.0", "patch-package": "^8.0.0", - "playwright": "1.37.1" + "playwright": "1.37.1", + "typescript": "5.2.2" }, "auto-changelog": { "hideCredit": true, diff --git a/plugins/adblocker/back.js b/plugins/adblocker/back.js deleted file mode 100644 index 3255f161..00000000 --- a/plugins/adblocker/back.js +++ /dev/null @@ -1,13 +0,0 @@ -const { loadAdBlockerEngine } = require('./blocker'); -const config = require('./config'); - -module.exports = async (win, options) => { - if (await config.shouldUseBlocklists()) { - loadAdBlockerEngine( - win.webContents.session, - options.cache, - options.additionalBlockLists, - options.disableDefaultLists, - ); - } -}; diff --git a/plugins/adblocker/back.ts b/plugins/adblocker/back.ts new file mode 100644 index 00000000..1360ea46 --- /dev/null +++ b/plugins/adblocker/back.ts @@ -0,0 +1,20 @@ +import { BrowserWindow } from 'electron'; + +import { loadAdBlockerEngine } from './blocker'; +import config from './config'; + +import pluginConfig from '../../config'; + +const AdBlockOptionsObj = pluginConfig.get('plugins.adblocker'); +type AdBlockOptions = typeof AdBlockOptionsObj; + +export default async (win: BrowserWindow, options: AdBlockOptions) => { + if (await config.shouldUseBlocklists()) { + loadAdBlockerEngine( + win.webContents.session, + options.cache, + options.additionalBlockLists, + options.disableDefaultLists, + ); + } +}; diff --git a/plugins/adblocker/blocker.js b/plugins/adblocker/blocker.ts similarity index 84% rename from plugins/adblocker/blocker.js rename to plugins/adblocker/blocker.ts index 49c6085f..9fd0d5e6 100644 --- a/plugins/adblocker/blocker.js +++ b/plugins/adblocker/blocker.ts @@ -1,7 +1,8 @@ -const { promises } = require('node:fs'); // Used for caching -const path = require('node:path'); +// Used for caching +import path from 'node:path'; +import { promises } from 'node:fs'; -const { ElectronBlocker } = require('@cliqz/adblocker-electron'); +import { ElectronBlocker } from '@cliqz/adblocker-electron'; const SOURCES = [ 'https://raw.githubusercontent.com/kbinani/adblock-youtube-ads/master/signed.txt', @@ -15,11 +16,11 @@ const SOURCES = [ 'https://secure.fanboy.co.nz/fanboy-annoyance_ubo.txt', ]; -const loadAdBlockerEngine = ( - session = undefined, +export const loadAdBlockerEngine = ( + session: Electron.Session | undefined = undefined, cache = true, additionalBlockLists = [], - disableDefaultLists = false, + disableDefaultLists: boolean | string[] = false, ) => { // Only use cache if no additional blocklists are passed const cachingOptions @@ -56,7 +57,7 @@ const loadAdBlockerEngine = ( .catch((error) => console.log('Error loading adBlocker engine', error)); }; -module.exports = { loadAdBlockerEngine }; +export default { loadAdBlockerEngine }; if (require.main === module) { loadAdBlockerEngine(); // Generate the engine without enabling it } diff --git a/plugins/adblocker/config.js b/plugins/adblocker/config.js deleted file mode 100644 index ed0ad43f..00000000 --- a/plugins/adblocker/config.js +++ /dev/null @@ -1,13 +0,0 @@ -const { PluginConfig } = require('../../config/dynamic'); - -const config = new PluginConfig('adblocker', { enableFront: true }); - -const blockers = { - WithBlocklists: 'With blocklists', - InPlayer: 'In player', -}; - -const shouldUseBlocklists = async () => - (await config.get('blocker')) !== blockers.InPlayer; - -module.exports = { shouldUseBlocklists, blockers, ...config }; diff --git a/plugins/adblocker/config.ts b/plugins/adblocker/config.ts new file mode 100644 index 00000000..c8c95c45 --- /dev/null +++ b/plugins/adblocker/config.ts @@ -0,0 +1,17 @@ +import { PluginConfig } from '../../config/dynamic'; + +const config = new PluginConfig('adblocker', { enableFront: true }); + +export const blockers = { + WithBlocklists: 'With blocklists', + InPlayer: 'In player', +}; + +export const shouldUseBlocklists = async () => await config.get('blocker') !== blockers.InPlayer; + +export default { + shouldUseBlocklists, + blockers, + get: config.get.bind(this), + set: config.set.bind(this), +}; diff --git a/plugins/adblocker/inject.js b/plugins/adblocker/inject.js index 8fadec0e..513bc960 100644 --- a/plugins/adblocker/inject.js +++ b/plugins/adblocker/inject.js @@ -1,3 +1,5 @@ +/* eslint-disable */ + // Source: https://addons.mozilla.org/en-US/firefox/addon/adblock-for-youtube/ // https://robwu.nl/crxviewer/?crx=https%3A%2F%2Faddons.mozilla.org%2Fen-US%2Ffirefox%2Faddon%2Fadblock-for-youtube%2F diff --git a/plugins/adblocker/menu.js b/plugins/adblocker/menu.js deleted file mode 100644 index 889cbebb..00000000 --- a/plugins/adblocker/menu.js +++ /dev/null @@ -1,15 +0,0 @@ -const config = require('./config'); - -module.exports = () => [ - { - label: 'Blocker', - submenu: Object.values(config.blockers).map((blocker) => ({ - label: blocker, - type: 'radio', - checked: (config.get('blocker') || config.blockers.WithBlocklists) === blocker, - click() { - config.set('blocker', blocker); - }, - })), - }, -]; diff --git a/plugins/adblocker/menu.ts b/plugins/adblocker/menu.ts new file mode 100644 index 00000000..2b08aaeb --- /dev/null +++ b/plugins/adblocker/menu.ts @@ -0,0 +1,19 @@ +import config from './config'; + +export default async () => { + const blockerConfig = await config.get('blocker'); + + return [ + { + label: 'Blocker', + submenu: Object.values(config.blockers).map((blocker) => ({ + label: blocker, + type: 'radio', + checked: (blockerConfig || config.blockers.WithBlocklists) === blocker, + click() { + config.set('blocker', blocker); + }, + })), + }, + ]; +}; diff --git a/plugins/adblocker/preload.js b/plugins/adblocker/preload.ts similarity index 71% rename from plugins/adblocker/preload.js rename to plugins/adblocker/preload.ts index 4aeef0c6..9885df46 100644 --- a/plugins/adblocker/preload.js +++ b/plugins/adblocker/preload.ts @@ -1,10 +1,10 @@ -const config = require('./config'); +import config from './config'; -module.exports = async () => { +export default async () => { if (await config.shouldUseBlocklists()) { // Preload adblocker to inject scripts/styles require('@cliqz/adblocker-electron-preload'); } else if ((await config.get('blocker')) === config.blockers.InPlayer) { - require('./inject'); + require('./inject.js'); } }; diff --git a/plugins/navigation/actions.js b/plugins/navigation/actions.js deleted file mode 100644 index 4a845d2f..00000000 --- a/plugins/navigation/actions.js +++ /dev/null @@ -1,24 +0,0 @@ -const { triggerAction } = require('../utils'); - -const CHANNEL = 'navigation'; -const ACTIONS = { - NEXT: 'next', - BACK: 'back', -}; - -function goToNextPage() { - triggerAction(CHANNEL, ACTIONS.NEXT); -} - -function goToPreviousPage() { - triggerAction(CHANNEL, ACTIONS.BACK); -} - -module.exports = { - CHANNEL, - ACTIONS, - actions: { - goToNextPage, - goToPreviousPage, - }, -}; diff --git a/plugins/navigation/actions.ts b/plugins/navigation/actions.ts new file mode 100644 index 00000000..692ab4e7 --- /dev/null +++ b/plugins/navigation/actions.ts @@ -0,0 +1,21 @@ +import { Actions, triggerAction } from '../utils'; + +export const CHANNEL = 'navigation'; +export const ACTIONS = Actions; + +export function goToNextPage() { + triggerAction(CHANNEL, Actions.NEXT); +} + +export function goToPreviousPage() { + triggerAction(CHANNEL, Actions.BACK); +} + +export default { + CHANNEL, + ACTIONS, + actions: { + goToNextPage, + goToPreviousPage, + }, +}; diff --git a/plugins/navigation/back.js b/plugins/navigation/back.js index b1661b36..c2436c0b 100644 --- a/plugins/navigation/back.js +++ b/plugins/navigation/back.js @@ -1,6 +1,6 @@ const path = require('node:path'); -const { ACTIONS, CHANNEL } = require('./actions.js'); +const { ACTIONS, CHANNEL } = require('./actions.ts'); const { injectCSS, listenAction } = require('../utils'); diff --git a/plugins/picture-in-picture/back.js b/plugins/picture-in-picture/back.ts similarity index 67% rename from plugins/picture-in-picture/back.js rename to plugins/picture-in-picture/back.ts index 85046057..1a588649 100644 --- a/plugins/picture-in-picture/back.js +++ b/plugins/picture-in-picture/back.ts @@ -1,28 +1,35 @@ -const path = require('node:path'); +import path from 'node:path'; -const { app, ipcMain } = require('electron'); +import { app, BrowserWindow, ipcMain } from 'electron'; -const { setOptions } = require('../../config/plugins'); -const { injectCSS } = require('../utils'); +import { setOptions as setPluginOptions } from '../../config/plugins'; +import { injectCSS } from '../utils'; + +import config from '../../config'; let isInPiP = false; -let originalPosition; -let originalSize; -let originalFullScreen; -let originalMaximized; +let originalPosition: number[]; +let originalSize: number[]; +let originalFullScreen: boolean; +let originalMaximized: boolean; -let win; -let options; +let win: BrowserWindow; + +// Magic of TypeScript +const PiPOptionsObj = config.get('plugins.picture-in-picture'); +type PiPOptions = typeof PiPOptionsObj; + +let options: Partial; const pipPosition = () => (options.savePosition && options['pip-position']) || [10, 10]; const pipSize = () => (options.saveSize && options['pip-size']) || [450, 275]; -const setLocalOptions = (_options) => { +const setLocalOptions = (_options: Partial) => { options = { ...options, ..._options }; - setOptions('picture-in-picture', _options); + setPluginOptions('picture-in-picture', _options); }; -const togglePiP = async () => { +const togglePiP = () => { isInPiP = !isInPiP; setLocalOptions({ isInPiP }); @@ -82,7 +89,7 @@ const togglePiP = async () => { win.setWindowButtonVisibility?.(!isInPiP); }; -const blockShortcutsInPiP = (event, input) => { +const blockShortcutsInPiP = (event: Electron.Event, input: Electron.Input) => { const key = input.key.toLowerCase(); if (key === 'f') { @@ -93,14 +100,14 @@ const blockShortcutsInPiP = (event, input) => { } }; -module.exports = (_win, _options) => { +export default (_win: BrowserWindow, _options: PiPOptions) => { options ??= _options; win ??= _win; setLocalOptions({ isInPiP }); injectCSS(win.webContents, path.join(__dirname, 'style.css')); - ipcMain.on('picture-in-picture', async () => { - await togglePiP(); + ipcMain.on('picture-in-picture', () => { + togglePiP(); }); }; -module.exports.setOptions = setLocalOptions; +export const setOptions = setLocalOptions; diff --git a/plugins/picture-in-picture/front.js b/plugins/picture-in-picture/front.ts similarity index 95% rename from plugins/picture-in-picture/front.js rename to plugins/picture-in-picture/front.ts index 188cc694..a4f83d72 100644 --- a/plugins/picture-in-picture/front.js +++ b/plugins/picture-in-picture/front.ts @@ -1,6 +1,6 @@ -const { ipcRenderer } = require('electron'); -const { toKeyEvent } = require('keyboardevent-from-electron-accelerator'); -const keyEventAreEqual = require('keyboardevents-areequal'); +import { ipcRenderer } from 'electron'; +import { toKeyEvent } from 'keyboardevent-from-electron-accelerator'; +import keyEventAreEqual from 'keyboardevents-areequal'; const { getSongMenu } = require('../../providers/dom-elements'); const { ElementFromFile, templatePath } = require('../utils'); diff --git a/plugins/picture-in-picture/menu.js b/plugins/picture-in-picture/menu.ts similarity index 97% rename from plugins/picture-in-picture/menu.js rename to plugins/picture-in-picture/menu.ts index 8c8e7a63..107e9b06 100644 --- a/plugins/picture-in-picture/menu.js +++ b/plugins/picture-in-picture/menu.ts @@ -1,6 +1,6 @@ const prompt = require('custom-electron-prompt'); -const { setOptions } = require('./back.js'); +const { setOptions } = require('./back.ts'); const promptOptions = require('../../providers/prompt-options'); diff --git a/plugins/utils.js b/plugins/utils.js deleted file mode 100644 index 51c117a3..00000000 --- a/plugins/utils.js +++ /dev/null @@ -1,68 +0,0 @@ -const fs = require('node:fs'); -const path = require('node:path'); - -const { ipcMain, ipcRenderer } = require('electron'); - -// Creates a DOM element from a HTML string -module.exports.ElementFromHtml = (html) => { - const template = document.createElement('template'); - html = html.trim(); // Never return a text node of whitespace as the result - template.innerHTML = html; - return template.content.firstChild; -}; - -// Creates a DOM element from a HTML file -module.exports.ElementFromFile = (filepath) => module.exports.ElementFromHtml(fs.readFileSync(filepath, 'utf8')); - -module.exports.templatePath = (pluginPath, name) => path.join(pluginPath, 'templates', name); - -module.exports.triggerAction = (channel, action, ...args) => ipcRenderer.send(channel, action, ...args); - -module.exports.triggerActionSync = (channel, action, ...args) => ipcRenderer.sendSync(channel, action, ...args); - -module.exports.listenAction = (channel, callback) => ipcMain.on(channel, callback); - -module.exports.fileExists = ( - path, - callbackIfExists, - callbackIfError = undefined, -) => { - fs.access(path, fs.F_OK, (error) => { - if (error) { - if (callbackIfError) { - callbackIfError(); - } - - return; - } - - callbackIfExists(); - }); -}; - -const cssToInject = new Map(); -module.exports.injectCSS = (webContents, filepath, cb = undefined) => { - if (cssToInject.size === 0) { - setupCssInjection(webContents); - } - - cssToInject.set(filepath, cb); -}; - -const setupCssInjection = (webContents) => { - webContents.on('did-finish-load', () => { - cssToInject.forEach(async (cb, filepath) => { - await webContents.insertCSS(fs.readFileSync(filepath, 'utf8')); - cb?.(); - }); - }); -}; - -module.exports.getAllPlugins = () => { - const isDirectory = (source) => fs.lstatSync(source).isDirectory(); - return fs - .readdirSync(__dirname) - .map((name) => path.join(__dirname, name)) - .filter(isDirectory) - .map((name) => path.basename(name)); -}; diff --git a/plugins/utils.ts b/plugins/utils.ts new file mode 100644 index 00000000..431b08b1 --- /dev/null +++ b/plugins/utils.ts @@ -0,0 +1,74 @@ +import fs from 'node:fs'; +import path from 'node:path'; + +import { ipcMain, ipcRenderer } from 'electron'; + +import { ValueOf } from '../utils/type-utils'; + + +// Creates a DOM element from an HTML string +export const ElementFromHtml = (html: string) => { + const template = document.createElement('template'); + html = html.trim(); // Never return a text node of whitespace as the result + template.innerHTML = html; + return template.content.firstChild; +}; + +// Creates a DOM element from a HTML file +export const ElementFromFile = (filepath: fs.PathOrFileDescriptor) => ElementFromHtml(fs.readFileSync(filepath, 'utf8')); + +export const templatePath = (pluginPath: string, name: string) => path.join(pluginPath, 'templates', name); + +export const Actions = { + NEXT: 'next', + BACK: 'back', +}; + +export const triggerAction = (channel: string, action: ValueOf, ...args: Parameters) => ipcRenderer.send(channel, action, ...args); + +export const triggerActionSync = (channel: string, action: ValueOf, ...args: Parameters): unknown => ipcRenderer.sendSync(channel, action, ...args); + +export const listenAction = (channel: string, callback: (event: Electron.IpcMainEvent, ...args: Parameters) => void) => ipcMain.on(channel, callback); + +export const fileExists = ( + path: fs.PathLike, + callbackIfExists: { (): void; (): void; (): void; }, + callbackIfError: (() => void) | undefined = undefined, +) => { + fs.access(path, fs.constants.F_OK, (error) => { + if (error) { + callbackIfError?.(); + + return; + } + + callbackIfExists(); + }); +}; + +const cssToInject = new Map(); +export const injectCSS = (webContents: Electron.WebContents, filepath: unknown, cb = undefined) => { + if (cssToInject.size === 0) { + setupCssInjection(webContents); + } + + cssToInject.set(filepath, cb); +}; + +const setupCssInjection = (webContents: Electron.WebContents) => { + webContents.on('did-finish-load', () => { + cssToInject.forEach(async (callback: () => void | undefined, filepath: fs.PathOrFileDescriptor) => { + await webContents.insertCSS(fs.readFileSync(filepath, 'utf8')); + callback?.(); + }); + }); +}; + +export const getAllPlugins = () => { + const isDirectory = (source: fs.PathLike) => fs.lstatSync(source).isDirectory(); + return fs + .readdirSync(__dirname) + .map((name) => path.join(__dirname, name)) + .filter(isDirectory) + .map((name) => path.basename(name)); +}; diff --git a/preload.js b/preload.ts similarity index 61% rename from preload.js rename to preload.ts index 1c0100c3..7c250793 100644 --- a/preload.js +++ b/preload.ts @@ -1,17 +1,24 @@ -const { ipcRenderer } = require('electron'); -const is = require('electron-is'); +import { ipcRenderer } from 'electron'; +import is from 'electron-is'; + +import config from './config'; +import { fileExists } from './plugins/utils'; +import setupSongInfo from './providers/song-info-front'; +import { setupSongControls } from './providers/song-controls-front'; +import { startingPages } from './providers/extracted-data'; -const config = require('./config'); -const { fileExists } = require('./plugins/utils'); -const setupSongInfo = require('./providers/song-info-front'); -const { setupSongControls } = require('./providers/song-controls-front'); -const { startingPages } = require('./providers/extracted-data'); const plugins = config.plugins.getEnabled(); const $ = document.querySelector.bind(document); -let api; +let api: Element | null = null; + +interface Actions { + CHANNEL: string; + ACTIONS: Record, + actions: Record void>, +} plugins.forEach(async ([plugin, options]) => { const preloadPath = await ipcRenderer.invoke( @@ -20,9 +27,10 @@ plugins.forEach(async ([plugin, options]) => { 'plugins', plugin, 'preload.js', - ); + ) as string; fileExists(preloadPath, () => { - const run = require(preloadPath); + // eslint-disable-next-line @typescript-eslint/no-var-requires + const run = require(preloadPath) as (config: typeof options) => Promise; run(options); }); @@ -32,14 +40,16 @@ plugins.forEach(async ([plugin, options]) => { 'plugins', plugin, 'actions.js', - ); + ) as string; fileExists(actionPath, () => { - const actions = require(actionPath).actions || {}; + // eslint-disable-next-line @typescript-eslint/no-var-requires + const actions = (require(actionPath) as Actions).actions ?? {}; // TODO: re-enable once contextIsolation is set to true // contextBridge.exposeInMainWorld(plugin + "Actions", actions); for (const actionName of Object.keys(actions)) { - global[actionName] = actions[actionName]; + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-explicit-any + (global as any)[actionName] = actions[actionName]; } }); }); @@ -52,9 +62,10 @@ document.addEventListener('DOMContentLoaded', () => { 'plugins', plugin, 'front.js', - ); + ) as string; fileExists(pluginPath, () => { - const run = require(pluginPath); + // eslint-disable-next-line @typescript-eslint/no-var-requires + const run = require(pluginPath) as (config: typeof options) => Promise; run(options); }); }); @@ -69,14 +80,15 @@ document.addEventListener('DOMContentLoaded', () => { setupSongControls(); // Add action for reloading - global.reload = () => ipcRenderer.send('reload'); + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-explicit-any + (global as any).reload = () => ipcRenderer.send('reload'); // Blocks the "Are You Still There?" popup by setting the last active time to Date.now every 15min setInterval(() => window._lact = Date.now(), 900_000); // Setup back to front logger if (is.dev()) { - ipcRenderer.on('log', (_event, log) => { + ipcRenderer.on('log', (_event, log: string) => { console.log(JSON.parse(log)); }); } @@ -100,8 +112,12 @@ function listenForApiLoad() { observer.observe(document.documentElement, { childList: true, subtree: true }); } +interface YouTubeMusicAppElement extends HTMLElement { + navigate_(page: string): void; +} + function onApiLoaded() { - const video = $('video'); + const video = $('video')!; const audioContext = new AudioContext(); const audioSource = audioContext.createMediaElementSource(video); audioSource.connect(audioContext.destination); @@ -126,29 +142,29 @@ function onApiLoaded() { ); }, { passive: true }, - ); + );! document.dispatchEvent(new CustomEvent('apiLoaded', { detail: api })); ipcRenderer.send('apiLoaded'); // Navigate to "Starting page" - const startingPage = config.get('options.startingPage'); + const startingPage: string = config.get('options.startingPage'); if (startingPage && startingPages[startingPage]) { - $('ytmusic-app')?.navigate_(startingPages[startingPage]); + ($('ytmusic-app') as YouTubeMusicAppElement)?.navigate_(startingPages[startingPage]); } // Remove upgrade button if (config.get('options.removeUpgradeButton')) { - const upgradeButton = $('ytmusic-pivot-bar-item-renderer[tab-id="SPunlimited"]'); + const upgradeButton: HTMLElement | null = $('ytmusic-pivot-bar-item-renderer[tab-id="SPunlimited"]'); if (upgradeButton) { upgradeButton.style.display = 'none'; } } // Hide / Force show like buttons - const likeButtonsOptions = config.get('options.likeButtons'); + const likeButtonsOptions: string = config.get('options.likeButtons'); if (likeButtonsOptions) { - const likeButtons = $('ytmusic-like-button-renderer'); + const likeButtons: HTMLElement | null = $('ytmusic-like-button-renderer'); if (likeButtons) { likeButtons.style.display = { diff --git a/providers/app-controls.js b/providers/app-controls.js deleted file mode 100644 index 2726ef47..00000000 --- a/providers/app-controls.js +++ /dev/null @@ -1,35 +0,0 @@ -const path = require('node:path'); - -const { app, BrowserWindow, ipcMain, ipcRenderer } = require('electron'); - -const config = require('../config'); - -module.exports.restart = () => { - process.type === 'browser' ? restart() : ipcRenderer.send('restart'); -}; - -module.exports.setupAppControls = () => { - ipcMain.on('restart', restart); - ipcMain.handle('getDownloadsFolder', () => app.getPath('downloads')); - ipcMain.on('reload', () => BrowserWindow.getFocusedWindow().webContents.loadURL(config.get('url'))); - ipcMain.handle('getPath', (_, ...args) => path.join(...args)); -}; - -function restart() { - app.relaunch({ execPath: process.env.PORTABLE_EXECUTABLE_FILE }); - // ExecPath will be undefined if not running portable app, resulting in default behavior - app.quit(); -} - -function sendToFront(channel, ...args) { - for (const win of BrowserWindow.getAllWindows()) { - win.webContents.send(channel, ...args); - } -} - -module.exports.sendToFront - = process.type === 'browser' - ? sendToFront - : () => { - console.error('sendToFront called from renderer'); - }; diff --git a/providers/app-controls.ts b/providers/app-controls.ts new file mode 100644 index 00000000..6137871e --- /dev/null +++ b/providers/app-controls.ts @@ -0,0 +1,35 @@ +import path from 'node:path'; + +import { app, BrowserWindow, ipcMain, ipcRenderer } from 'electron'; + +import config from '../config'; + +export const restart = () => { + process.type === 'browser' ? restartInternal() : ipcRenderer.send('restart'); +}; + +export const setupAppControls = () => { + ipcMain.on('restart', restart); + ipcMain.handle('getDownloadsFolder', () => app.getPath('downloads')); + ipcMain.on('reload', () => BrowserWindow.getFocusedWindow()?.webContents.loadURL(config.get('url'))); + ipcMain.handle('getPath', (_, ...args: string[]) => path.join(...args)); +}; + +function restartInternal() { + app.relaunch({ execPath: process.env.PORTABLE_EXECUTABLE_FILE }); + // ExecPath will be undefined if not running portable app, resulting in default behavior + app.quit(); +} + +function sendToFrontInternal(channel: string, ...args: unknown[]) { + for (const win of BrowserWindow.getAllWindows()) { + win.webContents.send(channel, ...args); + } +} + +export const sendToFront + = process.type === 'browser' + ? sendToFrontInternal + : () => { + console.error('sendToFront called from renderer'); + }; diff --git a/providers/decorators.js b/providers/decorators.ts similarity index 52% rename from providers/decorators.js rename to providers/decorators.ts index 8ed24c0f..3b59e8a8 100644 --- a/providers/decorators.js +++ b/providers/decorators.ts @@ -1,52 +1,28 @@ -module.exports = { - singleton, - debounce, - cache, - throttle, - memoize, - retry, -}; - -/** - * @template T - * @param {T} fn - * @returns {T} - */ -function singleton(fn) { +export function singleton unknown>(fn: T): T { let called = false; - return (...args) => { + + return ((...args) => { if (called) { return; } called = true; return fn(...args); - }; + }) as T; } -/** - * @template T - * @param {T} fn - * @param {number} delay - * @returns {T} - */ -function debounce(fn, delay) { - let timeout; - return (...args) => { +export function debounce unknown>(fn: T, delay: number): T { + let timeout: NodeJS.Timeout; + return ((...args) => { clearTimeout(timeout); timeout = setTimeout(() => fn(...args), delay); - }; + }) as T; } -/** - * @template T - * @param {T} fn - * @returns {T} - */ -function cache(fn) { - let lastArgs; - let lastResult; - return (...args) => { +export function cache R, P extends never[], R>(fn: T): T { + let lastArgs: P; + let lastResult: R; + return ((...args: P) => { if ( args.length !== lastArgs?.length || args.some((arg, i) => arg !== lastArgs[i]) @@ -56,22 +32,16 @@ function cache(fn) { } return lastResult; - }; + }) as T; } /* The following are currently unused, but potentially useful in the future */ -/** - * @template T - * @param {T} fn - * @param {number} delay - * @returns {T} - */ -function throttle(fn, delay) { - let timeout; - return (...args) => { +export function throttle unknown>(fn: T, delay: number): T { + let timeout: NodeJS.Timeout | undefined; + return ((...args) => { if (timeout) { return; } @@ -80,33 +50,24 @@ function throttle(fn, delay) { timeout = undefined; fn(...args); }, delay); - }; + }) as T; } -/** - * @template T - * @param {T} fn - * @returns {T} - */ -function memoize(fn) { +function memoize unknown>(fn: T): T { const cache = new Map(); - return (...args) => { + + return ((...args) => { const key = JSON.stringify(args); if (!cache.has(key)) { cache.set(key, fn(...args)); } - return cache.get(key); - }; + return cache.get(key) as unknown; + }) as T; } -/** - * @template T - * @param {T} fn - * @returns {T} - */ -function retry(fn, { retries = 3, delay = 1000 } = {}) { - return (...args) => { +function retry unknown>(fn: T, { retries = 3, delay = 1000 } = {}): T { + return ((...args) => { try { return fn(...args); } catch (error) { @@ -117,5 +78,14 @@ function retry(fn, { retries = 3, delay = 1000 } = {}) { throw error; } } - }; + }) as T; } + +export default { + singleton, + debounce, + cache, + throttle, + memoize, + retry, +}; diff --git a/providers/dom-elements.js b/providers/dom-elements.ts similarity index 54% rename from providers/dom-elements.js rename to providers/dom-elements.ts index b3b4bed4..6e86d78b 100644 --- a/providers/dom-elements.js +++ b/providers/dom-elements.ts @@ -1,4 +1,4 @@ -const getSongMenu = () => +export const getSongMenu = () => document.querySelector('ytmusic-menu-popup-renderer tp-yt-paper-listbox'); -module.exports = { getSongMenu }; +export default { getSongMenu }; diff --git a/providers/extracted-data.js b/providers/extracted-data.ts similarity index 91% rename from providers/extracted-data.js rename to providers/extracted-data.ts index d852a8cb..f1afa096 100644 --- a/providers/extracted-data.js +++ b/providers/extracted-data.ts @@ -1,4 +1,4 @@ -const startingPages = { +export const startingPages: Record = { 'Default': '', 'Home': 'FEmusic_home', 'Explore': 'FEmusic_explore', @@ -18,6 +18,6 @@ const startingPages = { 'Uploaded Artists': 'FEmusic_library_privately_owned_artists', }; -module.exports = { +export default { startingPages, }; diff --git a/providers/prompt-custom-titlebar.js b/providers/prompt-custom-titlebar.ts similarity index 53% rename from providers/prompt-custom-titlebar.js rename to providers/prompt-custom-titlebar.ts index 852013a8..3a66afe2 100644 --- a/providers/prompt-custom-titlebar.js +++ b/providers/prompt-custom-titlebar.ts @@ -1,13 +1,13 @@ -const { Titlebar, Color } = require('custom-electron-titlebar'); +import { Titlebar, Color } from 'custom-electron-titlebar'; -module.exports = () => { +export default () => { new Titlebar({ backgroundColor: Color.fromHex('#050505'), minimizable: false, maximizable: false, - menu: null, + menu: undefined, }); - const mainStyle = document.querySelector('#container').style; + const mainStyle = (document.querySelector('#container') as HTMLElement)!.style; mainStyle.width = '100%'; mainStyle.position = 'fixed'; mainStyle.border = 'unset'; diff --git a/providers/prompt-options.js b/providers/prompt-options.ts similarity index 72% rename from providers/prompt-options.js rename to providers/prompt-options.ts index a86e7c73..87e27f13 100644 --- a/providers/prompt-options.js +++ b/providers/prompt-options.ts @@ -1,8 +1,8 @@ -const path = require('node:path'); +import path from 'node:path'; -const is = require('electron-is'); +import is from 'electron-is'; -const { isEnabled } = require('../config/plugins'); +import { isEnabled } from '../config/plugins'; const iconPath = path.join(__dirname, '..', 'assets', 'youtube-music-tray.png'); const customTitlebarPath = path.join(__dirname, 'prompt-custom-titlebar.js'); @@ -17,4 +17,4 @@ const promptOptions = !is.macOS() && isEnabled('in-app-menu') ? { icon: iconPath, }; -module.exports = () => promptOptions; +export default () => promptOptions; diff --git a/providers/protocol-handler.js b/providers/protocol-handler.js deleted file mode 100644 index 08a8ef29..00000000 --- a/providers/protocol-handler.js +++ /dev/null @@ -1,45 +0,0 @@ -const path = require('node:path'); - -const { app } = require('electron'); - -const getSongControls = require('./song-controls'); - -const APP_PROTOCOL = 'youtubemusic'; - -let protocolHandler; - -function setupProtocolHandler(win) { - if (process.defaultApp && process.argv.length >= 2) { - app.setAsDefaultProtocolClient( - APP_PROTOCOL, - process.execPath, - [path.resolve(process.argv[1])], - ); - } else { - app.setAsDefaultProtocolClient(APP_PROTOCOL); - } - - const songControls = getSongControls(win); - - protocolHandler = (cmd) => { - if (Object.keys(songControls).includes(cmd)) { - songControls[cmd](); - } - }; -} - -function handleProtocol(cmd) { - protocolHandler(cmd); -} - -function changeProtocolHandler(f) { - protocolHandler = f; -} - -module.exports = { - APP_PROTOCOL, - setupProtocolHandler, - handleProtocol, - changeProtocolHandler, -}; - diff --git a/providers/protocol-handler.ts b/providers/protocol-handler.ts new file mode 100644 index 00000000..49dd88b2 --- /dev/null +++ b/providers/protocol-handler.ts @@ -0,0 +1,45 @@ +import path from 'node:path'; + +import { app, BrowserWindow } from 'electron'; + +import getSongControls from './song-controls'; + +export const APP_PROTOCOL = 'youtubemusic'; + +let protocolHandler: ((cmd: string) => void) | undefined; + +export function setupProtocolHandler(win: BrowserWindow) { + if (process.defaultApp && process.argv.length >= 2) { + app.setAsDefaultProtocolClient( + APP_PROTOCOL, + process.execPath, + [path.resolve(process.argv[1])], + ); + } else { + app.setAsDefaultProtocolClient(APP_PROTOCOL); + } + + const songControls = getSongControls(win); + + protocolHandler = ((cmd: keyof typeof songControls) => { + if (Object.keys(songControls).includes(cmd)) { + songControls[cmd](); + } + }) as (cmd: string) => void; +} + +export function handleProtocol(cmd: string) { + protocolHandler?.(cmd); +} + +export function changeProtocolHandler(f: (cmd: string) => void) { + protocolHandler = f; +} + +export default { + APP_PROTOCOL, + setupProtocolHandler, + handleProtocol, + changeProtocolHandler, +}; + diff --git a/providers/song-controls-front.js b/providers/song-controls-front.js deleted file mode 100644 index 80901188..00000000 --- a/providers/song-controls-front.js +++ /dev/null @@ -1,8 +0,0 @@ -const { ipcRenderer } = require('electron'); - -module.exports.setupSongControls = () => { - document.addEventListener('apiLoaded', (e) => { - ipcRenderer.on('seekTo', (_, t) => e.detail.seekTo(t)); - ipcRenderer.on('seekBy', (_, t) => e.detail.seekBy(t)); - }, { once: true, passive: true }); -}; diff --git a/providers/song-controls-front.ts b/providers/song-controls-front.ts new file mode 100644 index 00000000..012a75b4 --- /dev/null +++ b/providers/song-controls-front.ts @@ -0,0 +1,8 @@ +import { ipcRenderer } from 'electron'; + +export const setupSongControls = () => { + document.addEventListener('apiLoaded', (event) => { + ipcRenderer.on('seekTo', (_, t: number) => event.detail.seekTo(t)); + ipcRenderer.on('seekBy', (_, t: number) => event.detail.seekBy(t)); + }, { once: true, passive: true }); +}; diff --git a/providers/song-controls.js b/providers/song-controls.ts similarity index 82% rename from providers/song-controls.js rename to providers/song-controls.ts index e881a186..eae0fd60 100644 --- a/providers/song-controls.js +++ b/providers/song-controls.ts @@ -1,13 +1,16 @@ // This is used for to control the songs -const pressKey = (window, key, modifiers = []) => { +import { BrowserWindow } from 'electron'; + +type Modifiers = (Electron.MouseInputEvent | Electron.MouseWheelInputEvent | Electron.KeyboardInputEvent)['modifiers']; +export const pressKey = (window: BrowserWindow, key: string, modifiers: Modifiers = []) => { window.webContents.sendInputEvent({ - type: 'keydown', + type: 'keyDown', modifiers, keyCode: key, }); }; -module.exports = (win) => { +export default (win: BrowserWindow) => { const commands = { // Playback previous: () => pressKey(win, 'k'), diff --git a/providers/song-info-front.js b/providers/song-info-front.js deleted file mode 100644 index f41e371c..00000000 --- a/providers/song-info-front.js +++ /dev/null @@ -1,120 +0,0 @@ -const { ipcRenderer } = require('electron'); - -const { getImage } = require('./song-info'); - -const { singleton } = require('../providers/decorators'); - -global.songInfo = {}; - -const $ = (s) => document.querySelector(s); -const $$ = (s) => [...document.querySelectorAll(s)]; - -ipcRenderer.on('update-song-info', async (_, extractedSongInfo) => { - global.songInfo = JSON.parse(extractedSongInfo); - global.songInfo.image = await getImage(global.songInfo.imageSrc); -}); - -// Used because 'loadeddata' or 'loadedmetadata' weren't firing on song start for some users (https://github.com/th-ch/youtube-music/issues/473) -const srcChangedEvent = new CustomEvent('srcChanged'); - -const setupSeekedListener = singleton(() => { - $('video')?.addEventListener('seeked', (v) => ipcRenderer.send('seeked', v.target.currentTime)); -}); -module.exports.setupSeekedListener = setupSeekedListener; - -const setupTimeChangedListener = singleton(() => { - const progressObserver = new MutationObserver((mutations) => { - ipcRenderer.send('timeChanged', mutations[0].target.value); - global.songInfo.elapsedSeconds = mutations[0].target.value; - }); - progressObserver.observe($('#progress-bar'), { attributeFilter: ['value'] }); -}); -module.exports.setupTimeChangedListener = setupTimeChangedListener; - -const setupRepeatChangedListener = singleton(() => { - const repeatObserver = new MutationObserver((mutations) => { - ipcRenderer.send('repeatChanged', mutations[0].target.__dataHost.getState().queue.repeatMode); - }); - repeatObserver.observe($('#right-controls .repeat'), { attributeFilter: ['title'] }); - - // Emit the initial value as well; as it's persistent between launches. - ipcRenderer.send('repeatChanged', $('ytmusic-player-bar').getState().queue.repeatMode); -}); -module.exports.setupRepeatChangedListener = setupRepeatChangedListener; - -const setupVolumeChangedListener = singleton((api) => { - $('video').addEventListener('volumechange', () => { - ipcRenderer.send('volumeChanged', api.getVolume()); - }); - // Emit the initial value as well; as it's persistent between launches. - ipcRenderer.send('volumeChanged', api.getVolume()); -}); -module.exports.setupVolumeChangedListener = setupVolumeChangedListener; - -module.exports = () => { - document.addEventListener('apiLoaded', (apiEvent) => { - ipcRenderer.on('setupTimeChangedListener', async () => { - setupTimeChangedListener(); - }); - - ipcRenderer.on('setupRepeatChangedListener', async () => { - setupRepeatChangedListener(); - }); - - ipcRenderer.on('setupVolumeChangedListener', async () => { - setupVolumeChangedListener(apiEvent.detail); - }); - - ipcRenderer.on('setupSeekedListener', async () => { - setupSeekedListener(); - }); - - const playPausedHandler = (e, status) => { - if (Math.round(e.target.currentTime) > 0) { - ipcRenderer.send('playPaused', { - isPaused: status === 'pause', - elapsedSeconds: Math.floor(e.target.currentTime), - }); - } - }; - - const playPausedHandlers = { - playing: (e) => playPausedHandler(e, 'playing'), - pause: (e) => playPausedHandler(e, 'pause'), - }; - - // Name = "dataloaded" and abit later "dataupdated" - apiEvent.detail.addEventListener('videodatachange', (name) => { - if (name !== 'dataloaded') { - return; - } - const video = $('video'); - - video.dispatchEvent(srcChangedEvent); - for (const status of ['playing', 'pause']) { // for fix issue that pause event not fired - video.addEventListener(status, playPausedHandlers[status]); - } - setTimeout(sendSongInfo, 200); - }); - - const video = $('video'); - for (const status of ['playing', 'pause']) { - video.addEventListener(status, playPausedHandlers[status]); - } - - function sendSongInfo() { - const data = apiEvent.detail.getPlayerResponse(); - - data.videoDetails.album = $$( - '.byline.ytmusic-player-bar > .yt-simple-endpoint', - ).find((e) => - e.href?.includes('browse/FEmusic_library_privately_owned_release') - || e.href?.includes('browse/MPREb'), - )?.textContent; - - data.videoDetails.elapsedSeconds = 0; - data.videoDetails.isPaused = false; - ipcRenderer.send('video-src-changed', JSON.stringify(data)); - } - }, { once: true, passive: true }); -}; diff --git a/providers/song-info-front.ts b/providers/song-info-front.ts new file mode 100644 index 00000000..9e51aa20 --- /dev/null +++ b/providers/song-info-front.ts @@ -0,0 +1,124 @@ +import { ipcRenderer } from 'electron'; + +import { singleton } from './decorators'; +import { getImage, SongInfo } from './song-info'; + +import { YoutubePlayer } from '../types/youtube-player'; +import { GetState } from '../types/datahost-get-state'; + +let songInfo: SongInfo = {} as SongInfo; + +const $ = (s: string): E => document.querySelector(s) as E; +const $$ = (s: string): E[] => [...document.querySelectorAll(s)!] as E[]; + +ipcRenderer.on('update-song-info', async (_, extractedSongInfo: string) => { + songInfo = JSON.parse(extractedSongInfo) as SongInfo; + if (songInfo.imageSrc) songInfo.image = await getImage(songInfo.imageSrc); +}); + +// Used because 'loadeddata' or 'loadedmetadata' weren't firing on song start for some users (https://github.com/th-ch/youtube-music/issues/473) +const srcChangedEvent = new CustomEvent('srcChanged'); + +export const setupSeekedListener = singleton(() => { + $('video')?.addEventListener('seeked', (v) => ipcRenderer.send('seeked', (v.target as HTMLVideoElement).currentTime)); +}); + +export const setupTimeChangedListener = singleton(() => { + const progressObserver = new MutationObserver((mutations) => { + const target = mutations[0].target as HTMLInputElement; + ipcRenderer.send('timeChanged', target.value); + songInfo.elapsedSeconds = Number(target.value); + }); + progressObserver.observe($('#progress-bar'), { attributeFilter: ['value'] }); +}); + +export const setupRepeatChangedListener = singleton(() => { + const repeatObserver = new MutationObserver((mutations) => { + + // provided by YouTube music + // eslint-disable-next-line @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access + ipcRenderer.send('repeatChanged', ((mutations[0].target as any).__dataHost.getState() as GetState).queue.repeatMode); + }); + repeatObserver.observe($('#right-controls .repeat')!, { attributeFilter: ['title'] }); + + // Emit the initial value as well; as it's persistent between launches. + // provided by YouTube music + // eslint-disable-next-line @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unnecessary-type-assertion + ipcRenderer.send('repeatChanged', (($('ytmusic-player-bar') as any).getState() as GetState).queue.repeatMode); +}); + +export const setupVolumeChangedListener = singleton((api: YoutubePlayer) => { + $('video').addEventListener('volumechange', () => { + ipcRenderer.send('volumeChanged', api.getVolume()); + }); + // Emit the initial value as well; as it's persistent between launches. + ipcRenderer.send('volumeChanged', api.getVolume()); +}); + +export default () => { + document.addEventListener('apiLoaded', (apiEvent) => { + ipcRenderer.on('setupTimeChangedListener', () => { + setupTimeChangedListener(); + }); + + ipcRenderer.on('setupRepeatChangedListener', () => { + setupRepeatChangedListener(); + }); + + ipcRenderer.on('setupVolumeChangedListener', () => { + setupVolumeChangedListener(apiEvent.detail); + }); + + ipcRenderer.on('setupSeekedListener', () => { + setupSeekedListener(); + }); + + const playPausedHandler = (e: Event, status: string) => { + if (Math.round((e.target as HTMLVideoElement).currentTime) > 0) { + ipcRenderer.send('playPaused', { + isPaused: status === 'pause', + elapsedSeconds: Math.floor((e.target as HTMLVideoElement).currentTime), + }); + } + }; + + const playPausedHandlers = { + playing: (e: Event) => playPausedHandler(e, 'playing'), + pause: (e: Event) => playPausedHandler(e, 'pause'), + }; + + // Name = "dataloaded" and abit later "dataupdated" + apiEvent.detail.addEventListener('videodatachange', (name: string) => { + if (name !== 'dataloaded') { + return; + } + const video = $('video'); + video.dispatchEvent(srcChangedEvent); + + for (const status of ['playing', 'pause'] as const) { // for fix issue that pause event not fired + video.addEventListener(status, playPausedHandlers[status]); + } + setTimeout(sendSongInfo, 200); + }); + + const video = $('video')!; + for (const status of ['playing', 'pause'] as const) { + video.addEventListener(status, playPausedHandlers[status]); + } + + function sendSongInfo() { + const data = apiEvent.detail.getPlayerResponse(); + + data.videoDetails.album = $$( + '.byline.ytmusic-player-bar > .yt-simple-endpoint', + ).find((e) => + e.href?.includes('browse/FEmusic_library_privately_owned_release') + || e.href?.includes('browse/MPREb'), + )?.textContent; + + data.videoDetails.elapsedSeconds = 0; + data.videoDetails.isPaused = false; + ipcRenderer.send('video-src-changed', JSON.stringify(data)); + } + }, { once: true, passive: true }); +}; diff --git a/providers/song-info.js b/providers/song-info.ts similarity index 64% rename from providers/song-info.js rename to providers/song-info.ts index 4c80b574..655a5336 100644 --- a/providers/song-info.js +++ b/providers/song-info.ts @@ -1,13 +1,28 @@ -const { ipcMain, nativeImage, net } = require('electron'); +import { BrowserWindow, ipcMain, nativeImage, net } from 'electron'; -const config = require('../config'); -const { cache } = require('../providers/decorators'); +import { cache } from './decorators'; + +import config from '../config'; +import { GetPlayerResponse } from '../types/get-player-response'; + +export interface SongInfo { + title: string; + artist: string; + views: number; + uploadDate: string; + imageSrc?: string | null; + image?: Electron.NativeImage | null; + isPaused?: boolean; + songDuration: number; + elapsedSeconds: number; + url: string; + album?: string | null; + videoId: string; + playlistId: string; +} // Fill songInfo with empty values -/** - * @typedef {songInfo} SongInfo - */ -const songInfo = { +export const songInfo: SongInfo = { title: '', artist: '', views: 0, @@ -24,11 +39,9 @@ const songInfo = { }; // Grab the native image using the src -const getImage = cache( - /** - * @returns {Promise} - */ - async (src) => { +export const getImage = cache( + async (src: string): Promise => { + const result = await net.fetch(src); const buffer = await result.arrayBuffer(); const output = nativeImage.createFromBuffer(Buffer.from(buffer)); @@ -40,8 +53,8 @@ const getImage = cache( }, ); -const handleData = async (responseText, win) => { - const data = JSON.parse(responseText); +const handleData = async (responseText: string, win: Electron.BrowserWindow) => { + const data = JSON.parse(responseText) as GetPlayerResponse; if (!data) { return; } @@ -50,7 +63,7 @@ const handleData = async (responseText, win) => { if (microformat) { songInfo.uploadDate = microformat.uploadDate; songInfo.url = microformat.urlCanonical?.split('&')[0]; - songInfo.playlistId = new URL(microformat.urlCanonical).searchParams.get('list'); + songInfo.playlistId = new URL(microformat.urlCanonical).searchParams.get('list') ?? ''; // Used for options.resumeOnStart config.set('url', microformat.urlCanonical); } @@ -59,8 +72,8 @@ const handleData = async (responseText, win) => { if (videoDetails) { songInfo.title = cleanupName(videoDetails.title); songInfo.artist = cleanupName(videoDetails.author); - songInfo.views = videoDetails.viewCount; - songInfo.songDuration = videoDetails.lengthSeconds; + songInfo.views = Number(videoDetails.viewCount); + songInfo.songDuration = Number(videoDetails.lengthSeconds); songInfo.elapsedSeconds = videoDetails.elapsedSeconds; songInfo.isPaused = videoDetails.isPaused; songInfo.videoId = videoDetails.videoId; @@ -68,33 +81,26 @@ const handleData = async (responseText, win) => { const thumbnails = videoDetails.thumbnail?.thumbnails; songInfo.imageSrc = thumbnails.at(-1)?.url.split('?')[0]; - songInfo.image = await getImage(songInfo.imageSrc); + if (songInfo.imageSrc) songInfo.image = await getImage(songInfo.imageSrc); win.webContents.send('update-song-info', JSON.stringify(songInfo)); } }; // This variable will be filled with the callbacks once they register -const callbacks = []; +type SongInfoCallback = (songInfo: SongInfo, event: string) => void; +const callbacks: SongInfoCallback[] = []; // This function will allow plugins to register callback that will be triggered when data changes -/** - * @callback songInfoCallback - * @param {songInfo} songInfo - * @returns {void} - */ -/** - * @param {songInfoCallback} callback - */ -const registerCallback = (callback) => { +const registerCallback = (callback: SongInfoCallback) => { callbacks.push(callback); }; let handlingData = false; -const registerProvider = (win) => { +const registerProvider = (win: BrowserWindow) => { // This will be called when the song-info-front finds a new request with song data - ipcMain.on('video-src-changed', async (_, responseText) => { + ipcMain.on('video-src-changed', async (_, responseText: string) => { handlingData = true; await handleData(responseText, win); handlingData = false; @@ -102,7 +108,7 @@ const registerProvider = (win) => { c(songInfo, 'video-src-changed'); } }); - ipcMain.on('playPaused', (_, { isPaused, elapsedSeconds }) => { + ipcMain.on('playPaused', (_, { isPaused, elapsedSeconds }: { isPaused: boolean, elapsedSeconds: number }) => { songInfo.isPaused = isPaused; songInfo.elapsedSeconds = elapsedSeconds; if (handlingData) { @@ -122,7 +128,7 @@ const suffixesToRemove = [ ' (clip officiel)', ]; -function cleanupName(name) { +export function cleanupName(name: string): string { if (!name) { return name; } @@ -138,7 +144,5 @@ function cleanupName(name) { return name; } -module.exports = registerCallback; -module.exports.setupSongInfo = registerProvider; -module.exports.getImage = getImage; -module.exports.cleanupName = cleanupName; +export default registerCallback; +export const setupSongInfo = registerProvider; diff --git a/reset.d.ts b/reset.d.ts new file mode 100644 index 00000000..31759405 --- /dev/null +++ b/reset.d.ts @@ -0,0 +1,15 @@ +import '@total-typescript/ts-reset'; +import { YoutubePlayer } from './types/youtube-player'; + +declare global { + interface DocumentEventMap { + 'apiLoaded': CustomEvent; + } + + interface Window { + /** + * YouTube Music internal variable (Last interaction time) + */ + _lact: number; + } +} diff --git a/tray.js b/tray.ts similarity index 68% rename from tray.js rename to tray.ts index 91172cb8..f7537057 100644 --- a/tray.js +++ b/tray.ts @@ -1,17 +1,19 @@ -const path = require('node:path'); +import path from 'node:path'; -const { Menu, nativeImage, Tray } = require('electron'); +import { Menu, nativeImage, Tray } from 'electron'; -const { restart } = require('./providers/app-controls'); -const config = require('./config'); -const getSongControls = require('./providers/song-controls'); +import { restart } from './providers/app-controls'; +import config from './config'; +import getSongControls from './providers/song-controls'; + +import type { MenuTemplate } from './menu'; // Prevent tray being garbage collected +let tray: Electron.Tray | undefined; -/** @type {Electron.Tray} */ -let tray; +type TrayEvent = (event: Electron.KeyboardEvent, bounds: Electron.Rectangle) => void; -module.exports.setTrayOnClick = (fn) => { +export const setTrayOnClick = (fn: TrayEvent) => { if (!tray) { return; } @@ -20,8 +22,8 @@ module.exports.setTrayOnClick = (fn) => { tray.on('click', fn); }; -// Wont do anything on macos since its disabled -module.exports.setTrayOnDoubleClick = (fn) => { +// Won't do anything on macOS since its disabled +export const setTrayOnDoubleClick = (fn: TrayEvent) => { if (!tray) { return; } @@ -30,7 +32,7 @@ module.exports.setTrayOnDoubleClick = (fn) => { tray.on('double-click', fn); }; -module.exports.setUpTray = (app, win) => { +export const setUpTray = (app: Electron.App, win: Electron.BrowserWindow) => { if (!config.get('options.tray')) { tray = undefined; return; @@ -63,7 +65,7 @@ module.exports.setUpTray = (app, win) => { } }); - const template = [ + const template: MenuTemplate = [ { label: 'Play/Pause', click() { diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..3d764405 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "CommonJS", + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "resolveJsonModule": true, + "moduleResolution": "node", + "baseUrl": ".", + "outDir": "./dist", + "strict": true, + "noImplicitAny": true, + "strictFunctionTypes": true, + "skipLibCheck": true + }, + "exclude": [ + "*.config.ts", + "./dist" + ], + "paths": { + "*": ["*.d.ts"] + } +} diff --git a/types/datahost-get-state.ts b/types/datahost-get-state.ts new file mode 100644 index 00000000..3f796f05 --- /dev/null +++ b/types/datahost-get-state.ts @@ -0,0 +1,1823 @@ +export interface GetState { + castStatus: CastStatus; + entities: Entities; + download: Download; + likeStatus: LikeStatus; + multiSelect: MultiSelect; + navigation: Navigation; + player: Player; + playerPage: PlayerPage; + queue: Queue; + subscribeStatus: SubscribeStatus; + toggleStates: ToggleStates; + ui: UI; + uploads: Uploads; +} + +export interface CastStatus { + castAvailable: boolean; + castConnectionData: CastConnectionData; + remoteWatchEndpoint: null; +} + +export interface CastConnectionData { + castConnectionState: string; + castReceiverName: string; +} + +export interface Download { + isLeaderTab: boolean; +} + +export interface Entities { +} + +export interface LikeStatus { + videos: Videos; + playlists: Entities; +} + +export interface Videos { + tNVTuUEeWP0: Kqp1PyPRBzA; + KQP1PyPrBzA: Kqp1PyPRBzA; + 'o1iz4L-5zkQ': Kqp1PyPRBzA; +} + +export enum Kqp1PyPRBzA { + Dislike = 'DISLIKE', + Indifferent = 'INDIFFERENT', + Like = 'LIKE', +} + +export interface MultiSelect { + multiSelectedItems: Entities; + latestMultiSelectIndex: number; + multiSelectParams: string; +} + +export interface Navigation { + artistDiscographyBrowseCommand: null; + isLoadingIndicatorShowing: boolean; + libraryTabBrowseCommand: null; + mainContent: MainContent; + playerUiState: string; + playerPageInfo: PlayerPageInfo; +} + +export interface MainContent { + endpoint: MainContentEndpoint; + response: Response; +} + +export interface MainContentEndpoint { + data: Data; + clickTrackingVe: TriggerElement; + createScreenConfig: null; + JSC$8515_innertubePath: string; +} + +export interface TriggerElement { + veData: VeData; + csn: string; +} + +export interface VeData { + veType: number; + veCounter: number; +} + +export interface Data { + query: string; + suggestStats: SuggestStats; +} + +export interface SuggestStats { + validationStatus: string; + parameterValidationStatus: string; + clientName: string; + searchMethod: string; + inputMethods: string[]; + originalQuery: string; + availableSuggestions: unknown[]; + zeroPrefixEnabled: boolean; + firstEditTimeMsec: number; + lastEditTimeMsec: number; +} + +export interface Response { + responseContext: ResponseResponseContext; + contents: ResponseContents; + trackingParams: string; +} + +export interface ResponseContents { + tabbedSearchResultsRenderer: TabbedSearchResultsRenderer; +} + +export interface TabbedSearchResultsRenderer { + tabs: TabbedSearchResultsRendererTab[]; +} + +export interface TabbedSearchResultsRendererTab { + tabRenderer: PurpleTabRenderer; +} + +export interface PurpleTabRenderer { + title: string; + selected?: boolean; + content: PurpleContent; + tabIdentifier: string; + trackingParams: string; + endpoint?: BottomEndpointClass; +} + +export interface PurpleContent { + sectionListRenderer: SectionListRenderer; +} + +export interface SectionListRenderer { + contents?: SectionListRendererContent[]; + trackingParams: string; + header?: SectionListRendererHeader; + continuations?: Continuation[]; +} + +export interface SectionListRendererContent { + musicCardShelfRenderer?: MusicCardShelfRenderer; + musicShelfRenderer?: MusicShelfRenderer; +} + +export interface MusicCardShelfRenderer { + trackingParams: string; + thumbnail: MusicResponsiveListItemRendererThumbnail; + title: Title; + subtitle: LongBylineText; + contents: MusicCardShelfRendererContent[]; + buttons: MusicCardShelfRendererButton[]; + menu: MusicCardShelfRendererMenu; + onTap: OnTap; + header: MusicCardShelfRendererHeader; + thumbnailOverlay: ThumbnailOverlayClass; +} + +export interface MusicCardShelfRendererButton { + buttonRenderer: ButtonButtonRenderer; +} + +export interface ButtonButtonRenderer { + style: string; + size?: string; + isDisabled?: boolean; + text: Subtitle; + icon: DefaultIconClass; + accessibility: AccessibilityDataAccessibility; + trackingParams: string; + accessibilityData: AccessibilityPauseDataClass; + command: ButtonRendererCommand; +} + +export interface AccessibilityDataAccessibility { + label: string; +} + +export interface AccessibilityPauseDataClass { + accessibilityData: AccessibilityDataAccessibility; +} + +export interface ButtonRendererCommand { + clickTrackingParams: string; + watchEndpoint?: CommandWatchEndpoint; + addToPlaylistEndpoint?: Target; +} + +export interface Target { + videoId: string; +} + +export interface CommandWatchEndpoint { + videoId: string; + params: PurpleParams; + watchEndpointMusicSupportedConfigs: PurpleWatchEndpointMusicSupportedConfigs; +} + +export enum PurpleParams { + WAEB = 'wAEB', +} + +export interface PurpleWatchEndpointMusicSupportedConfigs { + watchEndpointMusicConfig: PurpleWatchEndpointMusicConfig; +} + +export interface PurpleWatchEndpointMusicConfig { + musicVideoType: MusicVideoType; +} + +export enum MusicVideoType { + MusicVideoTypeAtv = 'MUSIC_VIDEO_TYPE_ATV', + MusicVideoTypeOmv = 'MUSIC_VIDEO_TYPE_OMV', + MusicVideoTypeUgc = 'MUSIC_VIDEO_TYPE_UGC', +} + +export interface DefaultIconClass { + iconType: IconType; +} + +export enum IconType { + AddToPlaylist = 'ADD_TO_PLAYLIST', + AddToRemoteQueue = 'ADD_TO_REMOTE_QUEUE', + Album = 'ALBUM', + Artist = 'ARTIST', + Favorite = 'FAVORITE', + Flag = 'FLAG', + LibraryAdd = 'LIBRARY_ADD', + LibrarySaved = 'LIBRARY_SAVED', + Mix = 'MIX', + MusicShuffle = 'MUSIC_SHUFFLE', + Pause = 'PAUSE', + PlayArrow = 'PLAY_ARROW', + PlaylistAdd = 'PLAYLIST_ADD', + QueuePlayNext = 'QUEUE_PLAY_NEXT', + Remove = 'REMOVE', + Share = 'SHARE', + Unfavorite = 'UNFAVORITE', + VolumeUp = 'VOLUME_UP', +} + +export interface Subtitle { + runs: ShortBylineTextRun[]; +} + +export interface ShortBylineTextRun { + text: string; +} + +export interface MusicCardShelfRendererContent { + messageRenderer?: MessageRenderer; + musicResponsiveListItemRenderer?: PurpleMusicResponsiveListItemRenderer; +} + +export interface MessageRenderer { + text: Subtitle; + trackingParams: string; + style: MessageRendererStyle; +} + +export interface MessageRendererStyle { + value: string; +} + +export interface PurpleMusicResponsiveListItemRenderer { + trackingParams: string; + thumbnail: MusicResponsiveListItemRendererThumbnail; + overlay: ThumbnailOverlayClass; + flexColumns: FlexColumn[]; + menu: PurpleMenu; + playlistItemData: Target; + flexColumnDisplayStyle: string; + itemHeight: string; +} + +export interface FlexColumn { + musicResponsiveListItemFlexColumnRenderer: MusicResponsiveListItemFlexColumnRenderer; +} + +export interface MusicResponsiveListItemFlexColumnRenderer { + text: Text; + displayPriority: DisplayPriority; +} + +export enum DisplayPriority { + MusicResponsiveListItemColumnDisplayPriorityHigh = 'MUSIC_RESPONSIVE_LIST_ITEM_COLUMN_DISPLAY_PRIORITY_HIGH', +} + +export interface Text { + runs: PurpleRun[]; +} + +export interface PurpleRun { + text: string; + navigationEndpoint?: PurpleNavigationEndpoint; +} + +export interface PurpleNavigationEndpoint { + clickTrackingParams: string; + watchEndpoint?: OnTapWatchEndpoint; + browseEndpoint?: PurpleBrowseEndpoint; +} + +export interface PurpleBrowseEndpoint { + browseId: string; + browseEndpointContextSupportedConfigs: BrowseEndpointContextSupportedConfigs; +} + +export interface BrowseEndpointContextSupportedConfigs { + browseEndpointContextMusicConfig: BrowseEndpointContextMusicConfig; +} + +export interface BrowseEndpointContextMusicConfig { + pageType: PageType; +} + +export enum PageType { + MusicPageTypeAlbum = 'MUSIC_PAGE_TYPE_ALBUM', + MusicPageTypeArtist = 'MUSIC_PAGE_TYPE_ARTIST', + MusicPageTypePlaylist = 'MUSIC_PAGE_TYPE_PLAYLIST', + MusicPageTypeTrackLyrics = 'MUSIC_PAGE_TYPE_TRACK_LYRICS', + MusicPageTypeTrackRelated = 'MUSIC_PAGE_TYPE_TRACK_RELATED', + MusicPageTypeUserChannel = 'MUSIC_PAGE_TYPE_USER_CHANNEL', +} + +export interface OnTapWatchEndpoint { + videoId: string; + watchEndpointMusicSupportedConfigs: PurpleWatchEndpointMusicSupportedConfigs; +} + +export interface PurpleMenu { + menuRenderer: PurpleMenuRenderer; +} + +export interface PurpleMenuRenderer { + items: PurpleItem[]; + trackingParams: string; + accessibility: AccessibilityPauseDataClass; +} + +export interface PurpleItem { + menuNavigationItemRenderer?: MenuItemRenderer; + menuServiceItemRenderer?: MenuItemRenderer; + toggleMenuServiceItemRenderer?: PurpleToggleMenuServiceItemRenderer; +} + +export interface MenuItemRenderer { + text: Subtitle; + icon: DefaultIconClass; + navigationEndpoint?: MenuNavigationItemRendererNavigationEndpoint; + trackingParams: string; + serviceEndpoint?: MenuNavigationItemRendererServiceEndpoint; +} + +export interface MenuNavigationItemRendererNavigationEndpoint { + clickTrackingParams: string; + watchEndpoint?: PurpleWatchEndpoint; + addToPlaylistEndpoint?: AddToPlaylistEndpoint; + browseEndpoint?: PurpleBrowseEndpoint; + shareEntityEndpoint?: ShareEntityEndpoint; + watchPlaylistEndpoint?: WatchPlaylistEndpoint; +} + +export interface AddToPlaylistEndpoint { + videoId?: string; + playlistId?: string; +} + +export interface ShareEntityEndpoint { + serializedShareEntity: string; + sharePanelType: SharePanelType; +} + +export enum SharePanelType { + SharePanelTypeUnifiedSharePanel = 'SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL', +} + +export interface PurpleWatchEndpoint { + videoId: string; + playlistId: string; + params: PurpleParams; + loggingContext: LoggingContext; + watchEndpointMusicSupportedConfigs: PurpleWatchEndpointMusicSupportedConfigs; +} + +export interface LoggingContext { + vssLoggingContext: VssLoggingContext; +} + +export interface VssLoggingContext { + serializedContextData: string; +} + +export interface WatchPlaylistEndpoint { + playlistId: string; + params: string; +} + +export interface MenuNavigationItemRendererServiceEndpoint { + clickTrackingParams: string; + queueAddEndpoint?: QueueAddEndpoint; + removeFromQueueEndpoint?: RemoveFromQueueEndpoint; + getReportFormEndpoint?: GetReportFormEndpoint; +} + +export interface GetReportFormEndpoint { + params: string; +} + +export interface QueueAddEndpoint { + queueTarget: AddToPlaylistEndpoint; + queueInsertPosition: QueueInsertPosition; + commands: CommandElement[]; +} + +export interface CommandElement { + clickTrackingParams: string; + addToToastAction: AddToToastAction; +} + +export interface AddToToastAction { + item: AddToToastActionItem; +} + +export interface AddToToastActionItem { + notificationTextRenderer: NotificationTextRenderer; +} + +export interface NotificationTextRenderer { + successResponseText: Subtitle; + trackingParams: string; +} + +export enum QueueInsertPosition { + InsertAfterCurrentVideo = 'INSERT_AFTER_CURRENT_VIDEO', + InsertAtEnd = 'INSERT_AT_END', +} + +export interface RemoveFromQueueEndpoint { + videoId: string; + commands: CommandElement[]; + itemId: string; +} + +export interface PurpleToggleMenuServiceItemRenderer { + defaultText: Subtitle; + defaultIcon: DefaultIconClass; + defaultServiceEndpoint: PurpleDefaultServiceEndpoint; + toggledText: Subtitle; + toggledIcon: DefaultIconClass; + toggledServiceEndpoint: PurpleToggledServiceEndpoint; + trackingParams: string; +} + +export interface PurpleDefaultServiceEndpoint { + clickTrackingParams: string; + feedbackEndpoint?: FeedbackEndpoint; + likeEndpoint?: PurpleLikeEndpoint; +} + +export interface FeedbackEndpoint { + feedbackToken: string; +} + +export interface PurpleLikeEndpoint { + status: Kqp1PyPRBzA; + target: Target; + actions?: LikeEndpointAction[]; +} + +export interface LikeEndpointAction { + clickTrackingParams: string; + musicLibraryStatusUpdateCommand: MusicLibraryStatusUpdateCommand; +} + +export interface MusicLibraryStatusUpdateCommand { + libraryStatus: string; + addToLibraryFeedbackToken: string; +} + +export interface PurpleToggledServiceEndpoint { + clickTrackingParams: string; + feedbackEndpoint?: FeedbackEndpoint; + likeEndpoint?: FluffyLikeEndpoint; +} + +export interface FluffyLikeEndpoint { + status: Kqp1PyPRBzA; + target: Target; +} + +export interface ThumbnailOverlayClass { + musicItemThumbnailOverlayRenderer: ThumbnailOverlayMusicItemThumbnailOverlayRenderer; +} + +export interface ThumbnailOverlayMusicItemThumbnailOverlayRenderer { + background: Background; + content: FluffyContent; + contentPosition: string; + displayStyle: string; +} + +export interface Background { + verticalGradient: VerticalGradient; +} + +export interface VerticalGradient { + gradientLayerColors: string[]; +} + +export interface FluffyContent { + musicPlayButtonRenderer: PurpleMusicPlayButtonRenderer; +} + +export interface PurpleMusicPlayButtonRenderer { + playNavigationEndpoint: OnTap; + trackingParams: string; + playIcon: DefaultIconClass; + pauseIcon: DefaultIconClass; + iconColor: number; + backgroundColor: number; + activeBackgroundColor: number; + loadingIndicatorColor: number; + playingIcon: DefaultIconClass; + iconLoadingColor: number; + activeScaleFactor: number; + buttonSize: string; + rippleTarget: string; + accessibilityPlayData: AccessibilityPauseDataClass; + accessibilityPauseData: AccessibilityPauseDataClass; +} + +export interface OnTap { + clickTrackingParams: string; + watchEndpoint: OnTapWatchEndpoint; +} + +export interface MusicResponsiveListItemRendererThumbnail { + musicThumbnailRenderer: MusicThumbnailRenderer; +} + +export interface MusicThumbnailRenderer { + thumbnail: ThumbnailDetailsClass; + thumbnailCrop: string; + thumbnailScale: string; + trackingParams: string; +} + +export interface ThumbnailDetailsClass { + thumbnails: ThumbnailElement[]; +} + +export interface ThumbnailElement { + url: string; + width: number; + height: number; +} + +export interface MusicCardShelfRendererHeader { + musicCardShelfHeaderBasicRenderer: MusicCardShelfHeaderBasicRenderer; +} + +export interface MusicCardShelfHeaderBasicRenderer { + title: Subtitle; + trackingParams: string; +} + +export interface MusicCardShelfRendererMenu { + menuRenderer: FluffyMenuRenderer; +} + +export interface FluffyMenuRenderer { + items: FluffyItem[]; + trackingParams: string; + accessibility: AccessibilityPauseDataClass; +} + +export interface FluffyItem { + menuNavigationItemRenderer?: MenuItemRenderer; + menuServiceItemRenderer?: MenuItemRenderer; + toggleMenuServiceItemRenderer?: FluffyToggleMenuServiceItemRenderer; +} + +export interface FluffyToggleMenuServiceItemRenderer { + defaultText: Subtitle; + defaultIcon: DefaultIconClass; + defaultServiceEndpoint: PurpleServiceEndpoint; + toggledText: Subtitle; + toggledIcon: DefaultIconClass; + toggledServiceEndpoint: PurpleServiceEndpoint; + trackingParams: string; +} + +export interface PurpleServiceEndpoint { + clickTrackingParams: string; + likeEndpoint: FluffyLikeEndpoint; +} + +export interface LongBylineText { + runs: LongBylineTextRun[]; +} + +export interface LongBylineTextRun { + text: string; + navigationEndpoint?: RunEndpoint; +} + +export interface RunEndpoint { + clickTrackingParams: string; + browseEndpoint: PurpleBrowseEndpoint; +} + +export interface Title { + runs: FluffyRun[]; +} + +export interface FluffyRun { + text: string; + navigationEndpoint: OnTap; +} + +export interface MusicShelfRenderer { + title: Subtitle; + contents: MusicShelfRendererContent[]; + trackingParams: string; + bottomText: Subtitle; + bottomEndpoint: BottomEndpointClass; + shelfDivider: ShelfDivider; +} + +export interface BottomEndpointClass { + clickTrackingParams: string; + searchEndpoint: SearchEndpoint; +} + +export interface SearchEndpoint { + query: string; + params: string; +} + +export interface MusicShelfRendererContent { + musicResponsiveListItemRenderer: FluffyMusicResponsiveListItemRenderer; +} + +export interface FluffyMusicResponsiveListItemRenderer { + trackingParams: string; + thumbnail: MusicResponsiveListItemRendererThumbnail; + overlay: PurpleOverlay; + flexColumns: FlexColumn[]; + menu: FluffyMenu; + playlistItemData?: Target; + flexColumnDisplayStyle: string; + itemHeight: string; + navigationEndpoint?: RunEndpoint; +} + +export interface FluffyMenu { + menuRenderer: TentacledMenuRenderer; +} + +export interface TentacledMenuRenderer { + items: TentacledItem[]; + trackingParams: string; + accessibility: AccessibilityPauseDataClass; +} + +export interface TentacledItem { + menuNavigationItemRenderer?: MenuItemRenderer; + menuServiceItemRenderer?: MenuItemRenderer; + toggleMenuServiceItemRenderer?: TentacledToggleMenuServiceItemRenderer; +} + +export interface TentacledToggleMenuServiceItemRenderer { + defaultText: Subtitle; + defaultIcon: DefaultIconClass; + defaultServiceEndpoint: FluffyDefaultServiceEndpoint; + toggledText: Subtitle; + toggledIcon: DefaultIconClass; + toggledServiceEndpoint: FluffyToggledServiceEndpoint; + trackingParams: string; +} + +export interface FluffyDefaultServiceEndpoint { + clickTrackingParams: string; + feedbackEndpoint?: FeedbackEndpoint; + likeEndpoint?: TentacledLikeEndpoint; +} + +export interface TentacledLikeEndpoint { + status: Kqp1PyPRBzA; + target: AddToPlaylistEndpoint; + actions?: LikeEndpointAction[]; +} + +export interface FluffyToggledServiceEndpoint { + clickTrackingParams: string; + feedbackEndpoint?: FeedbackEndpoint; + likeEndpoint?: StickyLikeEndpoint; +} + +export interface StickyLikeEndpoint { + status: Kqp1PyPRBzA; + target: AddToPlaylistEndpoint; +} + +export interface PurpleOverlay { + musicItemThumbnailOverlayRenderer: PurpleMusicItemThumbnailOverlayRenderer; +} + +export interface PurpleMusicItemThumbnailOverlayRenderer { + background: Background; + content: TentacledContent; + contentPosition: string; + displayStyle: string; +} + +export interface TentacledContent { + musicPlayButtonRenderer: FluffyMusicPlayButtonRenderer; +} + +export interface FluffyMusicPlayButtonRenderer { + playNavigationEndpoint: PlayNavigationEndpoint; + trackingParams: string; + playIcon: DefaultIconClass; + pauseIcon: DefaultIconClass; + iconColor: number; + backgroundColor: number; + activeBackgroundColor: number; + loadingIndicatorColor: number; + playingIcon: DefaultIconClass; + iconLoadingColor: number; + activeScaleFactor: number; + buttonSize: string; + rippleTarget: string; + accessibilityPlayData: AccessibilityPauseDataClass; + accessibilityPauseData: AccessibilityPauseDataClass; +} + +export interface PlayNavigationEndpoint { + clickTrackingParams: string; + watchEndpoint?: OnTapWatchEndpoint; + watchPlaylistEndpoint?: WatchPlaylistEndpoint; +} + +export interface ShelfDivider { + musicShelfDividerRenderer: MusicShelfDividerRenderer; +} + +export interface MusicShelfDividerRenderer { + hidden: boolean; +} + +export interface Continuation { + reloadContinuationData: ReloadContinuationData; +} + +export interface ReloadContinuationData { + continuation: string; + clickTrackingParams: string; +} + +export interface SectionListRendererHeader { + chipCloudRenderer: ChipCloudRenderer; +} + +export interface ChipCloudRenderer { + chips: ChipCloudRendererChip[]; + collapsedRowCount: number; + trackingParams: string; + horizontalScrollable: boolean; +} + +export interface ChipCloudRendererChip { + chipCloudChipRenderer: PurpleChipCloudChipRenderer; +} + +export interface PurpleChipCloudChipRenderer { + style: ChipCloudChipRendererStyle; + text: Subtitle; + navigationEndpoint: BottomEndpointClass; + trackingParams: string; + accessibilityData: AccessibilityPauseDataClass; + isSelected: boolean; + uniqueId: string; +} + +export interface ChipCloudChipRendererStyle { + styleType: string; +} + +export interface ResponseResponseContext { + serviceTrackingParams: ServiceTrackingParam[]; + maxAgeSeconds: number; +} + +export interface ServiceTrackingParam { + service: string; + params: Param[]; +} + +export interface Param { + key: string; + value: string; +} + +export interface PlayerPageInfo { + open: boolean; + triggerElement: TriggerElement; +} + +export interface Player { + adPlaying: boolean; + captionsAvailable: boolean; + captionsVisible: boolean; + fullscreened: boolean; + miniPlayerEnabled: boolean; + muted: boolean; + nerdStatsVisible: boolean; + playerResponse: PlayerResponse; + playerTriggerInfo: PlayerTriggerInfo; + preloadedEndpoint_: null; + volume: number; + playbackRate: number; +} + +export interface PlayerResponse { + responseContext: ResponseResponseContext; + playabilityStatus: PlayabilityStatus; + streamingData: StreamingData; + heartbeatParams: HeartbeatParams; + playbackTracking: PlaybackTracking; + captions: Captions; + videoDetails: PlayerResponseVideoDetails; + annotations: Annotation[]; + playerConfig: PlayerConfig; + storyboards: Storyboards; + microformat: Microformat; + trackingParams: string; + attestation: Attestation; + endscreen: Endscreen; + adBreakHeartbeatParams: string; +} + +export interface Annotation { + playerAnnotationsExpandedRenderer: PlayerAnnotationsExpandedRenderer; +} + +export interface PlayerAnnotationsExpandedRenderer { + featuredChannel: FeaturedChannel; + allowSwipeDismiss: boolean; +} + +export interface FeaturedChannel { + startTimeMs: string; + endTimeMs: string; + watermark: ThumbnailDetailsClass; + trackingParams: string; + navigationEndpoint: FeaturedChannelNavigationEndpoint; + channelName: string; + subscribeButton: SubscribeButtonClass; +} + +export interface FeaturedChannelNavigationEndpoint { + clickTrackingParams: string; + browseEndpoint: FluffyBrowseEndpoint; +} + +export interface FluffyBrowseEndpoint { + browseId: string; +} + +export interface SubscribeButtonClass { + subscribeButtonRenderer: SubscribeButtonRenderer; +} + +export interface SubscribeButtonRenderer { + buttonText: Subtitle; + subscribed: boolean; + enabled: boolean; + type: string; + channelId: string; + showPreferences: boolean; + subscribedButtonText: Subtitle; + unsubscribedButtonText: Subtitle; + trackingParams: string; + unsubscribeButtonText: Subtitle; + serviceEndpoints: SubscribeButtonRendererServiceEndpoint[]; +} + +export interface SubscribeButtonRendererServiceEndpoint { + clickTrackingParams: string; + subscribeEndpoint?: SubscribeEndpoint; + signalServiceEndpoint?: SignalServiceEndpoint; +} + +export interface SignalServiceEndpoint { + signal: string; + actions: SignalServiceEndpointAction[]; +} + +export interface SignalServiceEndpointAction { + clickTrackingParams: string; + openPopupAction: OpenPopupAction; +} + +export interface OpenPopupAction { + popup: Popup; + popupType: string; +} + +export interface Popup { + confirmDialogRenderer: ConfirmDialogRenderer; +} + +export interface ConfirmDialogRenderer { + trackingParams: string; + dialogMessages: Subtitle[]; + confirmButton: CancelButtonClass; + cancelButton: CancelButtonClass; +} + +export interface CancelButtonClass { + buttonRenderer: CancelButtonButtonRenderer; +} + +export interface CancelButtonButtonRenderer { + style: string; + isDisabled: boolean; + text: Subtitle; + accessibility?: AccessibilityDataAccessibility; + trackingParams: string; + serviceEndpoint?: UnsubscribeCommand; +} + +export interface UnsubscribeCommand { + clickTrackingParams: string; + unsubscribeEndpoint: SubscribeEndpoint; +} + +export interface SubscribeEndpoint { + channelIds: string[]; + params: string; +} + +export interface Attestation { + playerAttestationRenderer: PlayerAttestationRenderer; +} + +export interface PlayerAttestationRenderer { + challenge: string; + botguardData: BotguardData; +} + +export interface BotguardData { + program: string; + interpreterSafeUrl: InterpreterSafeURL; + serverEnvironment: number; +} + +export interface InterpreterSafeURL { + privateDoNotAccessOrElseTrustedResourceUrlWrappedValue: string; +} + +export interface Captions { + playerCaptionsTracklistRenderer: PlayerCaptionsTracklistRenderer; +} + +export interface PlayerCaptionsTracklistRenderer { + captionTracks: CaptionTrack[]; + audioTracks: AudioTrack[]; + translationLanguages: TranslationLanguage[]; + defaultAudioTrackIndex: number; +} + +export interface AudioTrack { + captionTrackIndices: number[]; + defaultCaptionTrackIndex: number; + visibility: string; + hasDefaultTrack: boolean; + captionsInitialState: string; +} + +export interface CaptionTrack { + baseUrl: string; + name: Subtitle; + vssId: string; + languageCode: string; + kind?: string; + isTranslatable: boolean; +} + +export interface TranslationLanguage { + languageCode: string; + languageName: Subtitle; +} + +export interface Endscreen { + endscreenRenderer: EndscreenRenderer; +} + +export interface EndscreenRenderer { + elements: Element[]; + startMs: string; + trackingParams: string; +} + +export interface Element { + endscreenElementRenderer: EndscreenElementRenderer; +} + +export interface EndscreenElementRenderer { + style: string; + image: ThumbnailDetailsClass; + icon?: EndscreenElementRendererIcon; + left: number; + width: number; + top: number; + aspectRatio: number; + startMs: string; + endMs: string; + title: LengthText; + metadata: Subtitle; + callToAction?: Subtitle; + dismiss?: Subtitle; + endpoint: EndscreenElementRendererEndpoint; + hovercardButton?: SubscribeButtonClass; + trackingParams: string; + isSubscribe?: boolean; + useClassicSubscribeButton?: boolean; + id: string; + thumbnailOverlays?: ThumbnailOverlay[]; +} + +export interface EndscreenElementRendererEndpoint { + clickTrackingParams: string; + browseEndpoint?: FluffyBrowseEndpoint; + commandMetadata?: Entities; + watchEndpoint?: Target; +} + +export interface EndscreenElementRendererIcon { + thumbnails: URLEndpoint[]; +} + +export interface URLEndpoint { + url: string; +} + +export interface ThumbnailOverlay { + thumbnailOverlayTimeStatusRenderer: ThumbnailOverlayTimeStatusRenderer; +} + +export interface ThumbnailOverlayTimeStatusRenderer { + text: LengthText; + style: string; +} + +export interface LengthText { + runs: ShortBylineTextRun[]; + accessibility: AccessibilityPauseDataClass; +} + +export interface HeartbeatParams { + heartbeatToken: string; + intervalMilliseconds: string; + maxRetries: string; + drmSessionId: string; + softFailOnError: boolean; + heartbeatServerData: string; +} + +export interface Microformat { + microformatDataRenderer: MicroformatDataRenderer; +} + +export interface MicroformatDataRenderer { + urlCanonical: string; + title: string; + description: string; + thumbnail: ThumbnailDetailsClass; + siteName: string; + appName: string; + androidPackage: string; + iosAppStoreId: string; + iosAppArguments: string; + ogType: string; + urlApplinksIos: string; + urlApplinksAndroid: string; + urlTwitterIos: string; + urlTwitterAndroid: string; + twitterCardType: string; + twitterSiteHandle: string; + schemaDotOrgType: string; + noindex: boolean; + unlisted: boolean; + paid: boolean; + familySafe: boolean; + tags: string[]; + availableCountries: string[]; + pageOwnerDetails: PageOwnerDetails; + videoDetails: MicroformatDataRendererVideoDetails; + linkAlternates: LinkAlternate[]; + viewCount: string; + publishDate: Date; + category: string; + uploadDate: Date; +} + +export interface LinkAlternate { + hrefUrl: string; + title?: string; + alternateType?: string; +} + +export interface PageOwnerDetails { + name: string; + externalChannelId: string; + youtubeProfileUrl: string; +} + +export interface MicroformatDataRendererVideoDetails { + externalVideoId: string; + durationSeconds: string; + durationIso8601: string; +} + +export interface PlayabilityStatus { + status: string; + playableInEmbed: boolean; + audioOnlyPlayability: AudioOnlyPlayability; + miniplayer: Miniplayer; + contextParams: string; +} + +export interface AudioOnlyPlayability { + audioOnlyPlayabilityRenderer: AudioOnlyPlayabilityRenderer; +} + +export interface AudioOnlyPlayabilityRenderer { + trackingParams: string; + audioOnlyAvailability: string; +} + +export interface Miniplayer { + miniplayerRenderer: MiniplayerRenderer; +} + +export interface MiniplayerRenderer { + playbackMode: string; +} + +export interface PlaybackTracking { + videostatsPlaybackUrl: PtrackingURLClass; + videostatsDelayplayUrl: AtrURLClass; + videostatsWatchtimeUrl: PtrackingURLClass; + ptrackingUrl: PtrackingURLClass; + qoeUrl: PtrackingURLClass; + atrUrl: AtrURLClass; + videostatsScheduledFlushWalltimeSeconds: number[]; + videostatsDefaultFlushIntervalSeconds: number; + googleRemarketingUrl: AtrURLClass; +} + +export interface AtrURLClass { + baseUrl: string; + elapsedMediaTimeSeconds: number; + headers: HeaderElement[]; +} + +export interface HeaderElement { + headerType: HeaderType; +} + +export enum HeaderType { + PlusPageID = 'PLUS_PAGE_ID', + UserAuth = 'USER_AUTH', + VisitorID = 'VISITOR_ID', +} + +export interface PtrackingURLClass { + baseUrl: string; + headers: HeaderElement[]; +} + +export interface PlayerConfig { + audioConfig: AudioConfig; + streamSelectionConfig: StreamSelectionConfig; + mediaCommonConfig: MediaCommonConfig; + webPlayerConfig: WebPlayerConfig; +} + +export interface AudioConfig { + loudnessDb: number; + perceptualLoudnessDb: number; + enablePerFormatLoudness: boolean; +} + +export interface MediaCommonConfig { + dynamicReadaheadConfig: DynamicReadaheadConfig; +} + +export interface DynamicReadaheadConfig { + maxReadAheadMediaTimeMs: number; + minReadAheadMediaTimeMs: number; + readAheadGrowthRateMs: number; +} + +export interface StreamSelectionConfig { + maxBitrate: string; +} + +export interface WebPlayerConfig { + useCobaltTvosDash: boolean; + webPlayerActionsPorting: WebPlayerActionsPorting; + gatewayExperimentGroup: string; +} + +export interface WebPlayerActionsPorting { + subscribeCommand: SubscribeCommand; + unsubscribeCommand: UnsubscribeCommand; + addToWatchLaterCommand: AddToWatchLaterCommand; + removeFromWatchLaterCommand: RemoveFromWatchLaterCommand; +} + +export interface AddToWatchLaterCommand { + clickTrackingParams: string; + playlistEditEndpoint: AddToWatchLaterCommandPlaylistEditEndpoint; +} + +export interface AddToWatchLaterCommandPlaylistEditEndpoint { + playlistId: string; + actions: PurpleAction[]; +} + +export interface PurpleAction { + addedVideoId: string; + action: string; +} + +export interface RemoveFromWatchLaterCommand { + clickTrackingParams: string; + playlistEditEndpoint: RemoveFromWatchLaterCommandPlaylistEditEndpoint; +} + +export interface RemoveFromWatchLaterCommandPlaylistEditEndpoint { + playlistId: string; + actions: FluffyAction[]; +} + +export interface FluffyAction { + action: string; + removedVideoId: string; +} + +export interface SubscribeCommand { + clickTrackingParams: string; + subscribeEndpoint: SubscribeEndpoint; +} + +export interface Storyboards { + playerStoryboardSpecRenderer: PlayerStoryboardSpecRenderer; +} + +export interface PlayerStoryboardSpecRenderer { + spec: string; + recommendedLevel: number; +} + +export interface StreamingData { + expiresInSeconds: string; + formats: Format[]; + adaptiveFormats: AdaptiveFormat[]; + probeUrl: string; +} + +export interface AdaptiveFormat { + itag: number; + mimeType: string; + bitrate: number; + width?: number; + height?: number; + initRange: Range; + indexRange: Range; + lastModified: string; + contentLength: string; + quality: string; + fps?: number; + qualityLabel?: string; + projectionType: ProjectionType; + averageBitrate: number; + approxDurationMs: string; + signatureCipher: string; + colorInfo?: ColorInfo; + highReplication?: boolean; + audioQuality?: string; + audioSampleRate?: string; + audioChannels?: number; + loudnessDb?: number; +} + +export interface ColorInfo { + primaries: string; + transferCharacteristics: string; + matrixCoefficients: string; +} + +export interface Range { + start: string; + end: string; +} + +export enum ProjectionType { + Rectangular = 'RECTANGULAR', +} + +export interface Format { + itag: number; + mimeType: string; + bitrate: number; + width: number; + height: number; + lastModified: string; + quality: string; + fps: number; + qualityLabel: string; + projectionType: ProjectionType; + audioQuality: string; + approxDurationMs: string; + audioSampleRate: string; + audioChannels: number; + signatureCipher: string; +} + +export interface PlayerResponseVideoDetails { + videoId: string; + title: string; + lengthSeconds: string; + channelId: string; + isOwnerViewing: boolean; + isCrawlable: boolean; + thumbnail: ThumbnailDetailsClass; + allowRatings: boolean; + viewCount: string; + author: string; + isPrivate: boolean; + isUnpluggedCorpus: boolean; + musicVideoType: MusicVideoType; + isLiveContent: boolean; + elapsedSeconds: number; + isPaused: boolean; +} + +export interface PlayerTriggerInfo { + screenLayer: number; +} + +export interface PlayerPage { + playerOverlay: PlayerOverlay; + playerPageTabs: PlayerPageTabElement[]; + playerPageTabsContent: Entities; + playerPageTabSelectedIndex: number; + playerPageWatchNextAutomixParams: string; + playerPageWatchNextContinuationParams: string; + playerPageWatchNextMetadata: null; + playerPageWatchNextResponse: PlayerPageWatchNextResponse; + watchNextOverlay: null; +} + +export interface PlayerOverlay { + playerOverlayRenderer: PlayerOverlayRenderer; +} + +export interface PlayerOverlayRenderer { + actions: PlayerOverlayRendererAction[]; + browserMediaSession: BrowserMediaSession; +} + +export interface PlayerOverlayRendererAction { + likeButtonRenderer: LikeButtonRenderer; +} + +export interface LikeButtonRenderer { + target: Target; + likeStatus: Kqp1PyPRBzA; + trackingParams: string; + likesAllowed: boolean; + serviceEndpoints: ServiceEndpoint[]; +} + +export interface ServiceEndpoint { + clickTrackingParams: string; + likeEndpoint: ServiceEndpointLikeEndpoint; +} + +export interface ServiceEndpointLikeEndpoint { + status: Kqp1PyPRBzA; + target: Target; + likeParams?: LikeParams; + dislikeParams?: LikeParams; + removeLikeParams?: LikeParams; +} + +export enum LikeParams { + Oai3D = 'OAI%3D', +} + +export interface BrowserMediaSession { + browserMediaSessionRenderer: BrowserMediaSessionRenderer; +} + +export interface BrowserMediaSessionRenderer { + thumbnailDetails: ThumbnailDetailsClass; +} + +export interface PlayerPageTabElement { + tabRenderer: PlayerPageTabTabRenderer; +} + +export interface PlayerPageTabTabRenderer { + title: string; + content?: StickyContent; + trackingParams: string; + endpoint?: RunEndpoint; + unselectable?: boolean; +} + +export interface StickyContent { + musicQueueRenderer: MusicQueueRenderer; +} + +export interface MusicQueueRenderer { + hack: boolean; +} + +export interface PlayerPageWatchNextResponse { + responseContext: PlayerPageWatchNextResponseResponseContext; + contents: PlayerPageWatchNextResponseContents; + currentVideoEndpoint: CurrentVideoEndpoint; + trackingParams: string; + playerOverlays: PlayerOverlay; + videoReporting: VideoReporting; +} + +export interface PlayerPageWatchNextResponseContents { + singleColumnMusicWatchNextResultsRenderer: SingleColumnMusicWatchNextResultsRenderer; +} + +export interface SingleColumnMusicWatchNextResultsRenderer { + tabbedRenderer: TabbedRenderer; +} + +export interface TabbedRenderer { + watchNextTabbedResultsRenderer: WatchNextTabbedResultsRenderer; +} + +export interface WatchNextTabbedResultsRenderer { + tabs: PlayerPageTabElement[]; +} + +export interface CurrentVideoEndpoint { + clickTrackingParams: string; + watchEndpoint: CurrentVideoEndpointWatchEndpoint; +} + +export interface CurrentVideoEndpointWatchEndpoint { + videoId: string; + playlistId: PlaylistID; + index: number; + playlistSetVideoId: string; + loggingContext: LoggingContext; +} + +export enum PlaylistID { + RDAMVMrkaNKAvksDE = 'RDAMVMrkaNKAvksDE', +} + +export interface PlayerPageWatchNextResponseResponseContext { + serviceTrackingParams: ServiceTrackingParam[]; +} + +export interface VideoReporting { + reportFormModalRenderer: ReportFormModalRenderer; +} + +export interface ReportFormModalRenderer { + optionsSupportedRenderers: OptionsSupportedRenderers; + trackingParams: string; + title: Subtitle; + submitButton: CancelButtonClass; + cancelButton: CancelButtonClass; + footer: Footer; +} + +export interface Footer { + runs: FooterRun[]; +} + +export interface FooterRun { + text: string; + navigationEndpoint?: FluffyNavigationEndpoint; +} + +export interface FluffyNavigationEndpoint { + clickTrackingParams: string; + urlEndpoint: URLEndpoint; +} + +export interface OptionsSupportedRenderers { + optionsRenderer: OptionsRenderer; +} + +export interface OptionsRenderer { + items: OptionsRendererItem[]; + trackingParams: string; +} + +export interface OptionsRendererItem { + optionSelectableItemRenderer: OptionSelectableItemRenderer; +} + +export interface OptionSelectableItemRenderer { + text: Subtitle; + trackingParams: string; + submitEndpoint: SubmitEndpoint; +} + +export interface SubmitEndpoint { + clickTrackingParams: string; + flagEndpoint: FlagEndpoint; +} + +export interface FlagEndpoint { + flagAction: string; +} + +export interface Queue { + automixItems: unknown[]; + autoplay: boolean; + hasShownAutoplay: boolean; + hasUserChangedDefaultAutoplayMode: boolean; + header: QueueHeader; + impressedVideoIds: Entities; + isFetchingChipSteer: boolean; + isGenerating: boolean; + isInfinite: boolean; + isPrefetchingContinuations: boolean; + isRaarEnabled: boolean; + isRaarSkip: boolean; + items: QueueItem[]; + nextQueueItemId: number; + playbackContentMode: string; + queueContextParams: string; + repeatMode: string; + responsiveSignals: ResponsiveSignals; + selectedItemIndex: number; + shuffleEnabled: boolean; + shuffleEndpoints: null; + steeringChips: SteeringChips; + watchNextType: null; +} + +export interface QueueHeader { + title: Subtitle; + subtitle: Subtitle; + buttons: HeaderButton[]; + trackingParams: string; +} + +export interface HeaderButton { + chipCloudChipRenderer: ButtonChipCloudChipRenderer; +} + +export interface ButtonChipCloudChipRenderer { + style: ChipCloudChipRendererStyle; + text: Subtitle; + navigationEndpoint: TentacledNavigationEndpoint; + trackingParams: string; + icon: DefaultIconClass; + accessibilityData: AccessibilityPauseDataClass; + isSelected: boolean; + uniqueId: string; +} + +export interface TentacledNavigationEndpoint { + clickTrackingParams: string; + saveQueueToPlaylistCommand: Entities; +} + +export interface QueueItem { + playlistPanelVideoWrapperRenderer?: PlaylistPanelVideoWrapperRenderer; + playlistPanelVideoRenderer?: ItemPlaylistPanelVideoRenderer; +} + +export interface ItemPlaylistPanelVideoRenderer { + title: Subtitle; + longBylineText: LongBylineText; + thumbnail: ThumbnailDetailsClass; + lengthText: LengthText; + selected: boolean; + navigationEndpoint: PlaylistPanelVideoRendererNavigationEndpoint; + videoId: string; + shortBylineText: Subtitle; + trackingParams: string; + menu: TentacledMenu; + playlistSetVideoId?: string; + canReorder: boolean; +} + +export interface TentacledMenu { + menuRenderer: StickyMenuRenderer; +} + +export interface StickyMenuRenderer { + items: StickyItem[]; + trackingParams: string; + accessibility: AccessibilityPauseDataClass; +} + +export interface StickyItem { + menuNavigationItemRenderer?: MenuItemRenderer; + menuServiceItemRenderer?: MenuItemRenderer; + toggleMenuServiceItemRenderer?: StickyToggleMenuServiceItemRenderer; +} + +export interface StickyToggleMenuServiceItemRenderer { + defaultText: Subtitle; + defaultIcon: DefaultIconClass; + defaultServiceEndpoint: ServiceEndpoint; + toggledText: Subtitle; + toggledIcon: DefaultIconClass; + toggledServiceEndpoint: ServiceEndpoint; + trackingParams: string; +} + +export interface PlaylistPanelVideoRendererNavigationEndpoint { + clickTrackingParams: string; + watchEndpoint: FluffyWatchEndpoint; +} + +export interface FluffyWatchEndpoint { + videoId: string; + playlistId?: PlaylistID; + index: number; + params: FluffyParams; + playerParams?: PlayerParams; + playlistSetVideoId?: string; + loggingContext?: LoggingContext; + watchEndpointMusicSupportedConfigs: FluffyWatchEndpointMusicSupportedConfigs; +} + +export enum FluffyParams { + OAHyAQIIAQ3D3D = 'OAHyAQIIAQ%3D%3D', +} + +export enum PlayerParams { + The8Aub = '8AUB', +} + +export interface FluffyWatchEndpointMusicSupportedConfigs { + watchEndpointMusicConfig: FluffyWatchEndpointMusicConfig; +} + +export interface FluffyWatchEndpointMusicConfig { + hasPersistentPlaylistPanel: boolean; + musicVideoType: MusicVideoType; +} + +export interface PlaylistPanelVideoWrapperRenderer { + primaryRenderer: PrimaryRenderer; + counterpart: Counterpart[]; +} + +export interface Counterpart { + counterpartRenderer: CounterpartRenderer; + segmentMap: SegmentMap; +} + +export interface CounterpartRenderer { + playlistPanelVideoRenderer: CounterpartRendererPlaylistPanelVideoRenderer; +} + +export interface CounterpartRendererPlaylistPanelVideoRenderer { + title: Subtitle; + longBylineText: LongBylineText; + thumbnail: ThumbnailDetailsClass; + lengthText: LengthText; + selected: boolean; + navigationEndpoint: PlaylistPanelVideoRendererNavigationEndpoint; + videoId: string; + shortBylineText: Subtitle; + trackingParams: string; + menu: StickyMenu; + playlistSetVideoId?: string; + canReorder: boolean; +} + +export interface StickyMenu { + menuRenderer: IndigoMenuRenderer; +} + +export interface IndigoMenuRenderer { + items: IndigoItem[]; + trackingParams: string; + accessibility: AccessibilityPauseDataClass; +} + +export interface IndigoItem { + menuNavigationItemRenderer?: MenuItemRenderer; + menuServiceItemRenderer?: MenuItemRenderer; + toggleMenuServiceItemRenderer?: IndigoToggleMenuServiceItemRenderer; +} + +export interface IndigoToggleMenuServiceItemRenderer { + defaultText: Subtitle; + defaultIcon: DefaultIconClass; + defaultServiceEndpoint: FluffyServiceEndpoint; + toggledText: Subtitle; + toggledIcon: DefaultIconClass; + toggledServiceEndpoint: FluffyServiceEndpoint; + trackingParams: string; +} + +export interface FluffyServiceEndpoint { + clickTrackingParams: string; + likeEndpoint?: ServiceEndpointLikeEndpoint; + feedbackEndpoint?: FeedbackEndpoint; +} + +export interface SegmentMap { + segment: Segment[]; +} + +export interface Segment { + primaryVideoStartTimeMilliseconds: string; + counterpartVideoStartTimeMilliseconds: string; + durationMilliseconds: string; +} + +export interface PrimaryRenderer { + playlistPanelVideoRenderer: ItemPlaylistPanelVideoRenderer; +} + +export interface ResponsiveSignals { + videoInteraction: VideoInteraction[]; +} + +export interface VideoInteraction { + queueImpress?: Entities; + videoId: string; + queueIndex: number; + playbackSkip?: Entities; +} + +export interface SteeringChips { + chips: SteeringChipsChip[]; + trackingParams: string; +} + +export interface SteeringChipsChip { + chipCloudChipRenderer: FluffyChipCloudChipRenderer; +} + +export interface FluffyChipCloudChipRenderer { + text: Subtitle; + navigationEndpoint: StickyNavigationEndpoint; + trackingParams: string; + accessibilityData: AccessibilityPauseDataClass; + isSelected: boolean; + uniqueId: string; +} + +export interface StickyNavigationEndpoint { + clickTrackingParams: string; + queueUpdateCommand: QueueUpdateCommand; +} + +export interface QueueUpdateCommand { + queueUpdateSection: QueueUpdateSection; + fetchContentsCommand: FetchContentsCommand; + dedupeAgainstLocalQueue: boolean; +} + +export interface FetchContentsCommand { + clickTrackingParams: string; + watchEndpoint: FetchContentsCommandWatchEndpoint; +} + +export interface FetchContentsCommandWatchEndpoint { + playlistId: string; + params: string; + loggingContext: LoggingContext; + index: number; +} + +export enum QueueUpdateSection { + QueueUpdateSectionQueue = 'QUEUE_UPDATE_SECTION_QUEUE', +} + +export interface SubscribeStatus { + subscribeStatusByChannelId: Entities; +} + +export interface ToggleStates { + feedbackToggleStates: Entities; +} + +export interface UI { + viewportInfo: ViewportInfo; + isGuideCollapsed: boolean; +} + +export interface ViewportInfo { + size: number; + fluid: boolean; +} + +export interface Uploads { + fileUploads: unknown[]; +} diff --git a/types/get-player-response.ts b/types/get-player-response.ts new file mode 100644 index 00000000..3a195500 --- /dev/null +++ b/types/get-player-response.ts @@ -0,0 +1,464 @@ +export interface GetPlayerResponse { + responseContext: ResponseContext; + playabilityStatus: PlayabilityStatus; + streamingData: StreamingData; + heartbeatParams: HeartbeatParams; + playbackTracking: PlaybackTracking; + captions: Captions; + videoDetails: GetPlayerResponseVideoDetails; + playerConfig: PlayerConfig; + storyboards: Storyboards; + microformat: Microformat; + trackingParams: string; + attestation: Attestation; + endscreen: Endscreen; + adBreakHeartbeatParams: string; +} + +export interface Attestation { + playerAttestationRenderer: PlayerAttestationRenderer; +} + +export interface PlayerAttestationRenderer { + challenge: string; + botguardData: BotguardData; +} + +export interface BotguardData { + program: string; + interpreterSafeUrl: InterpreterSafeURL; + serverEnvironment: number; +} + +export interface InterpreterSafeURL { + privateDoNotAccessOrElseTrustedResourceUrlWrappedValue: string; +} + +export interface Captions { + playerCaptionsTracklistRenderer: PlayerCaptionsTracklistRenderer; +} + +export interface PlayerCaptionsTracklistRenderer { + captionTracks: CaptionTrack[]; + audioTracks: AudioTrack[]; + translationLanguages: TranslationLanguage[]; + defaultAudioTrackIndex: number; +} + +export interface AudioTrack { + captionTrackIndices: number[]; +} + +export interface CaptionTrack { + baseUrl: string; + name: Name; + vssId: string; + languageCode: string; + kind: string; + isTranslatable: boolean; +} + +export interface Name { + runs: Run[]; +} + +export interface Run { + text: string; +} + +export interface TranslationLanguage { + languageCode: string; + languageName: Name; +} + +export interface Endscreen { + endscreenRenderer: EndscreenRenderer; +} + +export interface EndscreenRenderer { + elements: Element[]; + startMs: string; + trackingParams: string; +} + +export interface Element { + endscreenElementRenderer: EndscreenElementRenderer; +} + +export interface EndscreenElementRenderer { + style: string; + image: ImageClass; + left: number; + width: number; + top: number; + aspectRatio: number; + startMs: string; + endMs: string; + title: Title; + metadata: Name; + endpoint: Endpoint; + trackingParams: string; + id: string; + thumbnailOverlays: ThumbnailOverlay[]; +} + +export interface Endpoint { + clickTrackingParams: string; + commandMetadata: CommandMetadata; + watchEndpoint: WatchEndpoint; +} + +export interface CommandMetadata { +} + +export interface WatchEndpoint { + videoId: string; +} + +export interface ImageClass { + thumbnails: ThumbnailElement[]; +} + +export interface ThumbnailElement { + url: string; + width: number; + height: number; +} + +export interface ThumbnailOverlay { + thumbnailOverlayTimeStatusRenderer: ThumbnailOverlayTimeStatusRenderer; +} + +export interface ThumbnailOverlayTimeStatusRenderer { + text: Title; + style: string; +} + +export interface Title { + runs: Run[]; + accessibility: Accessibility; +} + +export interface Accessibility { + accessibilityData: AccessibilityData; +} + +export interface AccessibilityData { + label: string; +} + +export interface HeartbeatParams { + heartbeatToken: string; + intervalMilliseconds: string; + maxRetries: string; + drmSessionId: string; + softFailOnError: boolean; + heartbeatServerData: string; +} + +export interface Microformat { + microformatDataRenderer: MicroformatDataRenderer; +} + +export interface MicroformatDataRenderer { + urlCanonical: string; + title: string; + description: string; + thumbnail: ImageClass; + siteName: string; + appName: string; + androidPackage: string; + iosAppStoreId: string; + iosAppArguments: string; + ogType: string; + urlApplinksIos: string; + urlApplinksAndroid: string; + urlTwitterIos: string; + urlTwitterAndroid: string; + twitterCardType: string; + twitterSiteHandle: string; + schemaDotOrgType: string; + noindex: boolean; + unlisted: boolean; + paid: boolean; + familySafe: boolean; + tags: string[]; + availableCountries: string[]; + pageOwnerDetails: PageOwnerDetails; + videoDetails: MicroformatDataRendererVideoDetails; + linkAlternates: LinkAlternate[]; + viewCount: string; + publishDate: string; + category: string; + uploadDate: string; +} + +export interface LinkAlternate { + hrefUrl: string; + title?: string; + alternateType?: string; +} + +export interface PageOwnerDetails { + name: string; + externalChannelId: string; + youtubeProfileUrl: string; +} + +export interface MicroformatDataRendererVideoDetails { + externalVideoId: string; + durationSeconds: string; + durationIso8601: string; +} + +export interface PlayabilityStatus { + status: string; + playableInEmbed: boolean; + audioOnlyPlayability: AudioOnlyPlayability; + miniplayer: Miniplayer; + contextParams: string; +} + +export interface AudioOnlyPlayability { + audioOnlyPlayabilityRenderer: AudioOnlyPlayabilityRenderer; +} + +export interface AudioOnlyPlayabilityRenderer { + trackingParams: string; + audioOnlyAvailability: string; +} + +export interface Miniplayer { + miniplayerRenderer: MiniplayerRenderer; +} + +export interface MiniplayerRenderer { + playbackMode: string; +} + +export interface PlaybackTracking { + videostatsPlaybackUrl: PtrackingURLClass; + videostatsDelayplayUrl: AtrURLClass; + videostatsWatchtimeUrl: PtrackingURLClass; + ptrackingUrl: PtrackingURLClass; + qoeUrl: PtrackingURLClass; + atrUrl: AtrURLClass; + videostatsScheduledFlushWalltimeSeconds: number[]; + videostatsDefaultFlushIntervalSeconds: number; + googleRemarketingUrl: AtrURLClass; +} + +export interface AtrURLClass { + baseUrl: string; + elapsedMediaTimeSeconds: number; + headers: Header[]; +} + +export interface Header { + headerType: HeaderType; +} + +export enum HeaderType { + PlusPageID = 'PLUS_PAGE_ID', + UserAuth = 'USER_AUTH', + VisitorID = 'VISITOR_ID', +} + +export interface PtrackingURLClass { + baseUrl: string; + headers: Header[]; +} + +export interface PlayerConfig { + audioConfig: AudioConfig; + streamSelectionConfig: StreamSelectionConfig; + mediaCommonConfig: MediaCommonConfig; + webPlayerConfig: WebPlayerConfig; +} + +export interface AudioConfig { + loudnessDb: number; + perceptualLoudnessDb: number; + enablePerFormatLoudness: boolean; +} + +export interface MediaCommonConfig { + dynamicReadaheadConfig: DynamicReadaheadConfig; +} + +export interface DynamicReadaheadConfig { + maxReadAheadMediaTimeMs: number; + minReadAheadMediaTimeMs: number; + readAheadGrowthRateMs: number; +} + +export interface StreamSelectionConfig { + maxBitrate: string; +} + +export interface WebPlayerConfig { + useCobaltTvosDash: boolean; + webPlayerActionsPorting: WebPlayerActionsPorting; + gatewayExperimentGroup: string; +} + +export interface WebPlayerActionsPorting { + subscribeCommand: SubscribeCommand; + unsubscribeCommand: UnsubscribeCommand; + addToWatchLaterCommand: AddToWatchLaterCommand; + removeFromWatchLaterCommand: RemoveFromWatchLaterCommand; +} + +export interface AddToWatchLaterCommand { + clickTrackingParams: string; + playlistEditEndpoint: AddToWatchLaterCommandPlaylistEditEndpoint; +} + +export interface AddToWatchLaterCommandPlaylistEditEndpoint { + playlistId: string; + actions: PurpleAction[]; +} + +export interface PurpleAction { + addedVideoId: string; + action: string; +} + +export interface RemoveFromWatchLaterCommand { + clickTrackingParams: string; + playlistEditEndpoint: RemoveFromWatchLaterCommandPlaylistEditEndpoint; +} + +export interface RemoveFromWatchLaterCommandPlaylistEditEndpoint { + playlistId: string; + actions: FluffyAction[]; +} + +export interface FluffyAction { + action: string; + removedVideoId: string; +} + +export interface SubscribeCommand { + clickTrackingParams: string; + subscribeEndpoint: SubscribeEndpoint; +} + +export interface SubscribeEndpoint { + channelIds: string[]; + params: string; +} + +export interface UnsubscribeCommand { + clickTrackingParams: string; + unsubscribeEndpoint: SubscribeEndpoint; +} + +export interface ResponseContext { + serviceTrackingParams: ServiceTrackingParam[]; + maxAgeSeconds: number; +} + +export interface ServiceTrackingParam { + service: string; + params: Param[]; +} + +export interface Param { + key: string; + value: string; +} + +export interface Storyboards { + playerStoryboardSpecRenderer: PlayerStoryboardSpecRenderer; +} + +export interface PlayerStoryboardSpecRenderer { + spec: string; + recommendedLevel: number; +} + +export interface StreamingData { + expiresInSeconds: string; + formats: Format[]; + adaptiveFormats: AdaptiveFormat[]; +} + +export interface AdaptiveFormat { + itag: number; + mimeType: string; + bitrate: number; + width?: number; + height?: number; + initRange: Range; + indexRange: Range; + lastModified: string; + contentLength: string; + quality: string; + fps?: number; + qualityLabel?: string; + projectionType: ProjectionType; + averageBitrate: number; + approxDurationMs: string; + signatureCipher: string; + colorInfo?: ColorInfo; + highReplication?: boolean; + audioQuality?: string; + audioSampleRate?: string; + audioChannels?: number; + loudnessDb?: number; +} + +export interface ColorInfo { + primaries: string; + transferCharacteristics: string; +} + +export interface Range { + start: string; + end: string; +} + +export enum ProjectionType { + Rectangular = 'RECTANGULAR', +} + +export interface Format { + itag: number; + mimeType: string; + bitrate: number; + width: number; + height: number; + lastModified: string; + quality: string; + fps: number; + qualityLabel: string; + projectionType: ProjectionType; + audioQuality: string; + approxDurationMs: string; + audioSampleRate: string; + audioChannels: number; + signatureCipher: string; +} + +export interface GetPlayerResponseVideoDetails { + videoId: string; + title: string; + lengthSeconds: string; + channelId: string; + isOwnerViewing: boolean; + isCrawlable: boolean; + thumbnail: ImageClass; + allowRatings: boolean; + viewCount: string; + author: string; + isPrivate: boolean; + isUnpluggedCorpus: boolean; + musicVideoType: string; + isLiveContent: boolean; + elapsedSeconds: number; + isPaused: boolean; + + // youtube-music only + album?: string | null; +} diff --git a/types/youtube-player.ts b/types/youtube-player.ts new file mode 100644 index 00000000..171c9a49 --- /dev/null +++ b/types/youtube-player.ts @@ -0,0 +1,189 @@ +// TODO: fully type definitions for youtube-player + +import { GetPlayerResponse } from './get-player-response'; + +export interface YoutubePlayer { + getInternalApiInterface: (...params: Parameters) => Return; + getApiInterface: (...params: Parameters) => Return; + cueVideoByPlayerVars: (...params: Parameters) => Return; + loadVideoByPlayerVars: (...params: Parameters) => Return; + preloadVideoByPlayerVars: (...params: Parameters) => Return; + getAdState: (...params: Parameters) => Return; + sendAbandonmentPing: (...params: Parameters) => Return; + setLoopRange: (...params: Parameters) => Return; + getLoopRange: (...params: Parameters) => Return; + setAutonavState: (...params: Parameters) => Return; + seekToLiveHead: (...params: Parameters) => Return; + requestSeekToWallTimeSeconds: (...params: Parameters) => Return; + seekToStreamTime: (...params: Parameters) => Return; + startSeekCsiAction: (...params: Parameters) => Return; + getStreamTimeOffset: (...params: Parameters) => Return; + getVideoData: (...params: Parameters) => Return; + setInlinePreview: (...params: Parameters) => Return; + updateDownloadState: (...params: Parameters) => Return; + queueOfflineAction: (...params: Parameters) => Return; + pauseVideoDownload: (...params: Parameters) => Return; + resumeVideoDownload: (...params: Parameters) => Return; + refreshAllStaleEntities: (...params: Parameters) => Return; + isOrchestrationLeader: (...params: Parameters) => Return; + getAppState: (...params: Parameters) => Return; + updateLastActiveTime: (...params: Parameters) => Return; + setBlackout: (...params: Parameters) => Return; + setUserEngagement: (...params: Parameters) => Return; + updateSubtitlesUserSettings: (...params: Parameters) => Return; + getPresentingPlayerType: (...params: Parameters) => Return; + canPlayType: (...params: Parameters) => Return; + updatePlaylist: (...params: Parameters) => Return; + updateVideoData: (...params: Parameters) => Return; + updateEnvironmentData: (...params: Parameters) => Return; + sendVideoStatsEngageEvent: (...params: Parameters) => Return; + productsInVideoVisibilityUpdated: (...params: Parameters) => Return; + setSafetyMode: (...params: Parameters) => Return; + isAtLiveHead: (...params: Parameters) => Return; + getVideoAspectRatio: (...params: Parameters) => Return; + getPreferredQuality: (...params: Parameters) => Return; + getPlaybackQualityLabel: (...params: Parameters) => Return; + setPlaybackQualityRange: (...params: Parameters) => Return; + onAdUxClicked: (...params: Parameters) => Return; + getFeedbackProductData: (...params: Parameters) => Return; + getStoryboardFrame: (...params: Parameters) => Return; + getStoryboardFrameIndex: (...params: Parameters) => Return; + getStoryboardLevel: (...params: Parameters) => Return; + getNumberOfStoryboardLevels: (...params: Parameters) => Return; + getCaptionWindowContainerId: (...params: Parameters) => Return; + getAvailableQualityLabels: (...params: Parameters) => Return; + addUtcCueRange: (...params: Parameters) => Return; + showAirplayPicker: (...params: Parameters) => Return; + dispatchReduxAction: (...params: Parameters) => Return; + getPlayerResponse: () => GetPlayerResponse; + getHeartbeatResponse: (...params: Parameters) => Return; + changeMarkerVisibility: (...params: Parameters) => Return; + setAutonav: (...params: Parameters) => Return; + isNotServable: (...params: Parameters) => Return; + channelSubscribed: (...params: Parameters) => Return; + channelUnsubscribed: (...params: Parameters) => Return; + togglePictureInPicture: (...params: Parameters) => Return; + supportsGaplessAudio: () => boolean; + supportsGaplessShorts: () => boolean; + enqueueVideoByPlayerVars: (...params: Parameters) => Return; + clearQueue: (...params: Parameters) => Return; + getAudioTrack: (...params: Parameters) => Return; + setAudioTrack: (...params: Parameters) => Return; + getAvailableAudioTracks: (...params: Parameters) => Return; + getMaxPlaybackQuality: (...params: Parameters) => Return; + getUserPlaybackQualityPreference: (...params: Parameters) => Return; + getSubtitlesUserSettings: (...params: Parameters) => Return; + resetSubtitlesUserSettings: (...params: Parameters) => Return; + setMinimized: (...params: Parameters) => Return; + setOverlayVisibility: (...params: Parameters) => Return; + confirmYpcRental: (...params: Parameters) => Return; + toggleSubtitlesOn: (...params: Parameters) => Return; + isSubtitlesOn: (...params: Parameters) => Return; + queueNextVideo: (...params: Parameters) => Return; + handleExternalCall: (...params: Parameters) => Return; + logApiCall: (...params: Parameters) => Return; + isExternalMethodAvailable: (...params: Parameters) => Return; + setScreenLayer: (...params: Parameters) => Return; + getCurrentPlaylistSequence: (...params: Parameters) => Return; + getPlaylistSequenceForTime: (...params: Parameters) => Return; + shouldSendVisibilityState: (...params: Parameters) => Return; + syncVolume: (...params: Parameters) => Return; + highlightSettingsMenuItem: (...params: Parameters) => Return; + openSettingsMenuItem: (...params: Parameters) => Return; + getVisibilityState: (...params: Parameters) => Return; + isMutedByMutedAutoplay: (...params: Parameters) => Return; + setGlobalCrop: (...params: Parameters) => Return; + setInternalSize: (...params: Parameters) => Return; + seekBy: (seconds: number) => void; + showControls: (...params: Parameters) => Return; + hideControls: (...params: Parameters) => Return; + cancelPlayback: (...params: Parameters) => Return; + getProgressState: (...params: Parameters) => Return; + isInline: (...params: Parameters) => Return; + setInline: (...params: Parameters) => Return; + setLoopVideo: (...params: Parameters) => Return; + getLoopVideo: (...params: Parameters) => Return; + getVideoContentRect: (...params: Parameters) => Return; + getVideoStats: (...params: Parameters) => Return; + getStoryboardFormat: (...params: Parameters) => Return; + toggleFullscreen: (...params: Parameters) => Return; + isFullscreen: (...params: Parameters) => Return; + getPlayerSize: (...params: Parameters) => Return; + toggleSubtitles: (...params: Parameters) => Return; + setCenterCrop: (...params: Parameters) => Return; + setFauxFullscreen: (...params: Parameters) => Return; + setSizeStyle: (...params: Parameters) => Return; + handleGlobalKeyDown: (...params: Parameters) => Return; + handleGlobalKeyUp: (...params: Parameters) => Return; + wakeUpControls: (...params: Parameters) => Return; + cueVideoById: (...params: Parameters) => Return; + loadVideoById: (...params: Parameters) => Return; + cueVideoByUrl: (...params: Parameters) => Return; + loadVideoByUrl: (...params: Parameters) => Return; + playVideo: (...params: Parameters) => Return; + pauseVideo: (...params: Parameters) => Return; + stopVideo: (...params: Parameters) => Return; + clearVideo: (...params: Parameters) => Return; + getVideoBytesLoaded: (...params: Parameters) => Return; + getVideoBytesTotal: (...params: Parameters) => Return; + getVideoLoadedFraction: (...params: Parameters) => Return; + getVideoStartBytes: (...params: Parameters) => Return; + cuePlaylist: (...params: Parameters) => Return; + loadPlaylist: (...params: Parameters) => Return; + nextVideo: (...params: Parameters) => Return; + previousVideo: (...params: Parameters) => Return; + playVideoAt: (...params: Parameters) => Return; + setShuffle: (...params: Parameters) => Return; + setLoop: (...params: Parameters) => Return; + getPlaylist: (...params: Parameters) => Return; + getPlaylistIndex: (...params: Parameters) => Return; + getPlaylistId: (...params: Parameters) => Return; + loadModule: (...params: Parameters) => Return; + unloadModule: (...params: Parameters) => Return; + setOption: (...params: Parameters) => Return; + getOption: (...params: Parameters) => Return; + getOptions: (...params: Parameters) => Return; + mute: (...params: Parameters) => Return; + unMute: (...params: Parameters) => Return; + isMuted: (...params: Parameters) => Return; + setVolume: (...params: Parameters) => Return; + getVolume: (...params: Parameters) => Return; + seekTo: (seconds: number) => void; + getPlayerMode: (...params: Parameters) => Return; + getPlayerState: (...params: Parameters) => Return; + getAvailablePlaybackRates: (...params: Parameters) => Return; + getPlaybackQuality: (...params: Parameters) => Return; + setPlaybackQuality: (...params: Parameters) => Return; + getAvailableQualityLevels: (...params: Parameters) => Return; + getCurrentTime: (...params: Parameters) => Return; + getDuration: (...params: Parameters) => Return; + addEventListener: (...params: Parameters) => Return; + removeEventListener: (...params: Parameters) => Return; + getDebugText: (...params: Parameters) => Return; + addCueRange: (...params: Parameters) => Return; + removeCueRange: (...params: Parameters) => Return; + setSize: (...params: Parameters) => Return; + destroy: (...params: Parameters) => Return; + getSphericalProperties: (...params: Parameters) => Return; + setSphericalProperties: (...params: Parameters) => Return; + mutedAutoplay: (...params: Parameters) => Return; + getVideoEmbedCode: (...params: Parameters) => Return; + getVideoUrl: (...params: Parameters) => Return; + getMediaReferenceTime: (...params: Parameters) => Return; + getSize: (...params: Parameters) => Return; + logImaAdEvent: (...params: Parameters) => Return; + preloadVideoById: (...params: Parameters) => Return; + setAccountLinkState: (...params: Parameters) => Return; + updateAccountLinkingConfig: (...params: Parameters) => Return; + getAvailableQualityData: (...params: Parameters) => Return; + setCompositeParam: (...params: Parameters) => Return; + getStatsForNerds: (...params: Parameters) => Return; + showVideoInfo: (...params: Parameters) => Return; + hideVideoInfo: (...params: Parameters) => Return; + isVideoInfoVisible: (...params: Parameters) => Return; + getPlaybackRate: (...params: Parameters) => Return; + setPlaybackRate: (...params: Parameters) => Return; + updateFullerscreenEduButtonSubtleModeState: (...params: Parameters) => Return; + updateFullerscreenEduButtonVisibility: (...params: Parameters) => Return; + addEmbedsConversionTrackingParams: (...params: Parameters) => Return; +} diff --git a/utils/testing.js b/utils/testing.js deleted file mode 100644 index a497d84a..00000000 --- a/utils/testing.js +++ /dev/null @@ -1,3 +0,0 @@ -const isTesting = () => process.env.NODE_ENV === 'test'; - -module.exports = { isTesting }; diff --git a/utils/testing.ts b/utils/testing.ts new file mode 100644 index 00000000..42c31f28 --- /dev/null +++ b/utils/testing.ts @@ -0,0 +1,3 @@ +export const isTesting = () => process.env.NODE_ENV === 'test'; + +export default { isTesting }; diff --git a/utils/type-utils.ts b/utils/type-utils.ts new file mode 100644 index 00000000..36f281b4 --- /dev/null +++ b/utils/type-utils.ts @@ -0,0 +1,5 @@ +export type Entries = { + [K in keyof T]: [K, T[K]]; +}[keyof T][]; + +export type ValueOf = T[keyof T]; From d30755e5fa9530c5769b6265d68f16d17210678e Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Sun, 3 Sep 2023 06:37:47 +0900 Subject: [PATCH 15/70] feat: migration to TypeScript part 2 Co-authored-by: Su-Yong --- config/defaults.ts | 3 + config/dynamic.ts | 19 ++-- custom-electron-prompt.d.ts | 12 ++- navigation.d.ts | 88 +++++++++++++++++++ package-lock.json | 7 ++ package.json | 1 + plugins/adblocker/config.ts | 3 + plugins/adblocker/menu.ts | 10 +-- plugins/audio-compressor/front.js | 19 ---- plugins/audio-compressor/front.ts | 17 ++++ plugins/blur-nav-bar/back.js | 7 -- plugins/blur-nav-bar/back.ts | 9 ++ .../{front.js => front.ts} | 2 +- plugins/captions-selector/back.js | 19 ---- plugins/captions-selector/back.ts | 19 ++++ plugins/captions-selector/config.js | 4 - plugins/captions-selector/config.ts | 4 + .../captions-selector/{front.js => front.ts} | 47 ++++++---- .../captions-selector/{menu.js => menu.ts} | 6 +- .../compact-sidebar/{front.js => front.ts} | 4 +- plugins/crossfade/back.js | 15 ---- plugins/crossfade/back.ts | 15 ++++ plugins/crossfade/config.js | 4 - plugins/crossfade/config.ts | 4 + plugins/crossfade/{fader.js => fader.ts} | 81 ++++++++++++----- plugins/crossfade/{front.js => front.ts} | 71 +++++++-------- plugins/crossfade/{menu.js => menu.ts} | 27 +++--- plugins/disable-autoplay/front.js | 14 --- plugins/disable-autoplay/front.ts | 14 +++ plugins/discord/{back.js => back.ts} | 83 ++++++++--------- plugins/discord/{menu.js => menu.ts} | 34 ++++--- plugins/skip-silences/{front.js => front.ts} | 31 ++++--- .../taskbar-mediacontrol/{back.js => back.ts} | 35 +++++--- plugins/touchbar/{back.js => back.ts} | 20 +++-- plugins/tuna-obs/{back.js => back.ts} | 38 +++++--- plugins/utils.ts | 5 +- providers/song-info.ts | 2 +- reset.d.ts | 19 ++++ tsconfig.json | 1 + types/youtube-player.ts | 6 +- 40 files changed, 523 insertions(+), 296 deletions(-) create mode 100644 navigation.d.ts delete mode 100644 plugins/audio-compressor/front.js create mode 100644 plugins/audio-compressor/front.ts delete mode 100644 plugins/blur-nav-bar/back.js create mode 100644 plugins/blur-nav-bar/back.ts rename plugins/bypass-age-restrictions/{front.js => front.ts} (88%) delete mode 100644 plugins/captions-selector/back.js create mode 100644 plugins/captions-selector/back.ts delete mode 100644 plugins/captions-selector/config.js create mode 100644 plugins/captions-selector/config.ts rename plugins/captions-selector/{front.js => front.ts} (58%) rename plugins/captions-selector/{menu.js => menu.ts} (77%) rename plugins/compact-sidebar/{front.js => front.ts} (71%) delete mode 100644 plugins/crossfade/back.js create mode 100644 plugins/crossfade/back.ts delete mode 100644 plugins/crossfade/config.js create mode 100644 plugins/crossfade/config.ts rename plugins/crossfade/{fader.js => fader.ts} (83%) rename plugins/crossfade/{front.js => front.ts} (59%) rename plugins/crossfade/{menu.js => menu.ts} (70%) delete mode 100644 plugins/disable-autoplay/front.js create mode 100644 plugins/disable-autoplay/front.ts rename plugins/discord/{back.js => back.ts} (68%) rename plugins/discord/{menu.js => menu.ts} (60%) rename plugins/skip-silences/{front.js => front.ts} (77%) rename plugins/taskbar-mediacontrol/{back.js => back.ts} (54%) rename plugins/touchbar/{back.js => back.ts} (82%) rename plugins/tuna-obs/{back.js => back.ts} (55%) diff --git a/config/defaults.ts b/config/defaults.ts index 2d29ef29..c454863a 100644 --- a/config/defaults.ts +++ b/config/defaults.ts @@ -122,6 +122,9 @@ const defaultConfig = { 'captions-selector': { enabled: false, disableCaptions: false, + autoload: false, + lastCaptionsCode: '', + disabledCaptions: false, }, 'skip-silences': { onlySkipBeginning: false, diff --git a/config/dynamic.ts b/config/dynamic.ts index 0e4faa07..01134b53 100644 --- a/config/dynamic.ts +++ b/config/dynamic.ts @@ -70,13 +70,14 @@ interface PluginConfigOptions { * setupMyPlugin(win, config); * }; */ -type ConfigType = typeof defaultConfig.plugins[T]; +export type ConfigType = typeof defaultConfig.plugins[T]; type ValueOf = T[keyof T]; +type Mode = Mode extends 'r' ? Promise : T; export class PluginConfig { - private name: string; - private config: ConfigType; - private defaultConfig: ConfigType; - private enableFront: boolean; + private readonly name: string; + private readonly config: ConfigType; + private readonly defaultConfig: ConfigType; + private readonly enableFront: boolean; private subscribers: { [key in keyof ConfigType]?: (config: ConfigType) => void } = {}; private allSubscribers: ((config: ConfigType) => void)[] = []; @@ -102,7 +103,7 @@ export class PluginConfig { activePlugins[name] = this; } - async get(key: keyof ConfigType): Promise>> { + get = keyof ConfigType>(key: Key): ConfigType[Key] { return this.config[key]; } @@ -112,11 +113,11 @@ export class PluginConfig { this.#save(); } - getAll() { + getAll(): ConfigType { return { ...this.config }; } - setAll(options: ConfigType) { + setAll(options: Partial>) { if (!options || typeof options !== 'object') { throw new Error('Options must be an object.'); } @@ -124,7 +125,7 @@ export class PluginConfig { let changed = false; for (const [key, value] of Object.entries(options) as Entries) { if (this.config[key] !== value) { - this.config[key] = value; + if (value !== undefined) this.config[key] = value; this.#onChange(key, false); changed = true; } diff --git a/custom-electron-prompt.d.ts b/custom-electron-prompt.d.ts index 9fdceaf0..49e30352 100644 --- a/custom-electron-prompt.d.ts +++ b/custom-electron-prompt.d.ts @@ -24,8 +24,8 @@ declare module 'custom-electron-prompt' { cancel?: string; }; alwaysOnTop?: boolean; - value?: string; - type?: 'input' | 'select' | 'counter'; + value?: unknown; + type?: 'input' | 'select' | 'counter' | 'multiInput'; selectOptions?: Record; keybindOptions?: PromptKeybindOptions[]; counterOptions?: PromptCounterOptions; @@ -37,7 +37,13 @@ declare module 'custom-electron-prompt' { frame?: boolean; customScript?: string; enableRemoteModule?: boolean; - inputAttrs: Partial; + inputAttrs?: Partial; + multiInputOptions?: { + label: string; + value: unknown; + inputAttrs?: Partial; + selectOptions?: Record; + }[]; } const prompt: (options?: PromptOptions, parent?: BrowserWindow) => Promise; diff --git a/navigation.d.ts b/navigation.d.ts new file mode 100644 index 00000000..7d80de52 --- /dev/null +++ b/navigation.d.ts @@ -0,0 +1,88 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +interface NavigationOptions { + info: any; +} + +interface NavigationHistoryEntry extends EventTarget { + readonly url?: string; + readonly key: string; + readonly id: string; + readonly index: number; + readonly sameDocument: boolean; + getState(): any; + ondispose: ((this: NavigationHistoryEntry, ev: Event) => any) | null; +} + +interface NavigationTransition { + readonly navigationType: NavigationType; + readonly from: NavigationHistoryEntry; + readonly finished: Promise; +} + +interface NavigationResult { + committed: Promise; + finished: Promise; +} + +interface NavigationNavigateOptions extends NavigationOptions { + state: any; + history?: NavigationHistoryBehavior; +} + +interface NavigationReloadOptions extends NavigationOptions { + state: any; +} + +interface NavigationUpdateCurrentEntryOptions { + state: any; +} + +interface NavigationEventsMap { + currententrychange: NavigateEvent; + navigate: NavigateEvent; + navigateerror: NavigateEvent; + navigatesuccess: NavigateEvent; +} + +interface Navigation extends EventTarget { + entries(): Array; + readonly currentEntry?: NavigationHistoryEntry; + updateCurrentEntry(options: NavigationUpdateCurrentEntryOptions): undefined; + readonly transition?: NavigationTransition; + readonly canGoBack: boolean; + readonly canGoForward: boolean; + navigate(url: string, options?: NavigationNavigateOptions): NavigationResult; + reload(options?: NavigationReloadOptions): NavigationResult; + traverseTo(key: string, options?: NavigationOptions): NavigationResult; + back(options?: NavigationOptions): NavigationResult; + forward(options?: NavigationOptions): NavigationResult; + onnavigate: ((this: Navigation, ev: Event) => any) | null; + onnavigatesuccess: ((this: Navigation, ev: Event) => any) | null; + onnavigateerror: ((this: Navigation, ev: Event) => any) | null; + oncurrententrychange: ((this: Navigation, ev: Event) => any) | null; + + addEventListener(name: K, listener: (event: NavigationEventsMap[K]) => void); +} + +declare class NavigateEvent extends Event { + canIntercept: boolean; + destination: NavigationHistoryEntry; + downloadRequest: string | null; + formData: FormData; + hashChange: boolean; + info: Record; + navigationType: 'push' | 'reload' | 'replace' | 'traverse'; + signal: AbortSignal; + userInitiated: boolean; + + intercept(options?: Record): void; + scroll(): void; +} + +type NavigationHistoryBehavior = 'auto' | 'push' | 'replace'; + +declare const Navigation: { + prototype: Navigation; + new(): Navigation; +}; diff --git a/package-lock.json b/package-lock.json index 0a5d5edd..8bd2a261 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,6 +44,7 @@ "devDependencies": { "@playwright/test": "1.37.1", "@total-typescript/ts-reset": "0.5.1", + "@types/howler": "^2.2.8", "@types/youtube-player": "^5.5.7", "@typescript-eslint/eslint-plugin": "6.5.0", "auto-changelog": "2.4.0", @@ -1200,6 +1201,12 @@ "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.12.tgz", "integrity": "sha512-P20p/YBrqUBmzD6KhIQ8EiY4/RRzlekL4eCvfQnulFPfjmiGxKIoyCeI7qam5I7oKH3P8EU4ptEi0EfyGoLysw==" }, + "node_modules/@types/howler": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@types/howler/-/howler-2.2.8.tgz", + "integrity": "sha512-7OK+cGHTWIDCOvBlEc61Lzj2tJhCpmeqiqdeNbZvTxLHluBMF6xz/2wjoQkK1M8mJIStp40OdPnkp8xIvwwsuw==", + "dev": true + }, "node_modules/@types/http-cache-semantics": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", diff --git a/package.json b/package.json index 5a7dccb6..6fe08c21 100644 --- a/package.json +++ b/package.json @@ -149,6 +149,7 @@ "devDependencies": { "@playwright/test": "1.37.1", "@total-typescript/ts-reset": "0.5.1", + "@types/howler": "^2.2.8", "@types/youtube-player": "^5.5.7", "@typescript-eslint/eslint-plugin": "6.5.0", "auto-changelog": "2.4.0", diff --git a/plugins/adblocker/config.ts b/plugins/adblocker/config.ts index c8c95c45..59cd7ee9 100644 --- a/plugins/adblocker/config.ts +++ b/plugins/adblocker/config.ts @@ -1,3 +1,6 @@ +/* eslint-disable @typescript-eslint/await-thenable */ +/* renderer */ + import { PluginConfig } from '../../config/dynamic'; const config = new PluginConfig('adblocker', { enableFront: true }); diff --git a/plugins/adblocker/menu.ts b/plugins/adblocker/menu.ts index 2b08aaeb..1e8f43e0 100644 --- a/plugins/adblocker/menu.ts +++ b/plugins/adblocker/menu.ts @@ -1,15 +1,13 @@ -import config from './config'; - -export default async () => { - const blockerConfig = await config.get('blocker'); +import config, { blockers } from './config'; +export default () => { return [ { label: 'Blocker', - submenu: Object.values(config.blockers).map((blocker) => ({ + submenu: Object.values(blockers).map((blocker: string) => ({ label: blocker, type: 'radio', - checked: (blockerConfig || config.blockers.WithBlocklists) === blocker, + checked: (config.get('blocker') || blockers.WithBlocklists) === blocker, click() { config.set('blocker', blocker); }, diff --git a/plugins/audio-compressor/front.js b/plugins/audio-compressor/front.js deleted file mode 100644 index faeb7742..00000000 --- a/plugins/audio-compressor/front.js +++ /dev/null @@ -1,19 +0,0 @@ -const applyCompressor = (e) => { - const { audioContext } = e.detail; - - const compressor = audioContext.createDynamicsCompressor(); - compressor.threshold.value = -50; - compressor.ratio.value = 12; - compressor.knee.value = 40; - compressor.attack.value = 0; - compressor.release.value = 0.25; - - e.detail.audioSource.connect(compressor); - compressor.connect(audioContext.destination); -}; - -module.exports = () => - document.addEventListener('audioCanPlay', applyCompressor, { - once: true, // Only create the audio compressor once, not on each video - passive: true, - }); diff --git a/plugins/audio-compressor/front.ts b/plugins/audio-compressor/front.ts new file mode 100644 index 00000000..66fd94dd --- /dev/null +++ b/plugins/audio-compressor/front.ts @@ -0,0 +1,17 @@ +export default () => + document.addEventListener('audioCanPlay', (e) => { + const { audioContext } = e.detail; + + const compressor = audioContext.createDynamicsCompressor(); + compressor.threshold.value = -50; + compressor.ratio.value = 12; + compressor.knee.value = 40; + compressor.attack.value = 0; + compressor.release.value = 0.25; + + e.detail.audioSource.connect(compressor); + compressor.connect(audioContext.destination); + }, { + once: true, // Only create the audio compressor once, not on each video + passive: true, + }); diff --git a/plugins/blur-nav-bar/back.js b/plugins/blur-nav-bar/back.js deleted file mode 100644 index 897e8bc3..00000000 --- a/plugins/blur-nav-bar/back.js +++ /dev/null @@ -1,7 +0,0 @@ -const path = require('node:path'); - -const { injectCSS } = require('../utils'); - -module.exports = (win) => { - injectCSS(win.webContents, path.join(__dirname, 'style.css')); -}; diff --git a/plugins/blur-nav-bar/back.ts b/plugins/blur-nav-bar/back.ts new file mode 100644 index 00000000..5634e5ef --- /dev/null +++ b/plugins/blur-nav-bar/back.ts @@ -0,0 +1,9 @@ +import path from 'node:path'; + +import { BrowserWindow } from 'electron'; + +import { injectCSS } from '../utils'; + +export default (win: BrowserWindow) => { + injectCSS(win.webContents, path.join(__dirname, 'style.css')); +}; diff --git a/plugins/bypass-age-restrictions/front.js b/plugins/bypass-age-restrictions/front.ts similarity index 88% rename from plugins/bypass-age-restrictions/front.js rename to plugins/bypass-age-restrictions/front.ts index 3c7d9242..21dcab69 100644 --- a/plugins/bypass-age-restrictions/front.js +++ b/plugins/bypass-age-restrictions/front.ts @@ -1,4 +1,4 @@ -module.exports = () => { +export default () => { // See https://github.com/zerodytrash/Simple-YouTube-Age-Restriction-Bypass#userscript require('simple-youtube-age-restriction-bypass/dist/Simple-YouTube-Age-Restriction-Bypass.user.js'); }; diff --git a/plugins/captions-selector/back.js b/plugins/captions-selector/back.js deleted file mode 100644 index 2f204fce..00000000 --- a/plugins/captions-selector/back.js +++ /dev/null @@ -1,19 +0,0 @@ -const { ipcMain } = require('electron'); -const prompt = require('custom-electron-prompt'); - -const promptOptions = require('../../providers/prompt-options'); - -module.exports = (win) => { - ipcMain.handle('captionsSelector', async (_, captionLabels, currentIndex) => await prompt( - { - title: 'Choose Caption', - label: `Current Caption: ${captionLabels[currentIndex] || 'None'}`, - type: 'select', - value: currentIndex, - selectOptions: captionLabels, - resizable: true, - ...promptOptions(), - }, - win, - )); -}; diff --git a/plugins/captions-selector/back.ts b/plugins/captions-selector/back.ts new file mode 100644 index 00000000..8073ddde --- /dev/null +++ b/plugins/captions-selector/back.ts @@ -0,0 +1,19 @@ +import { BrowserWindow, ipcMain } from 'electron'; +import prompt from 'custom-electron-prompt'; + +import promptOptions from '../../providers/prompt-options'; + +export default (win: BrowserWindow) => { + ipcMain.handle('captionsSelector', async (_, captionLabels: Record, currentIndex: string) => await prompt( + { + title: 'Choose Caption', + label: `Current Caption: ${captionLabels[currentIndex] || 'None'}`, + type: 'select', + value: currentIndex, + selectOptions: captionLabels, + resizable: true, + ...promptOptions(), + }, + win, + )); +}; diff --git a/plugins/captions-selector/config.js b/plugins/captions-selector/config.js deleted file mode 100644 index 46789327..00000000 --- a/plugins/captions-selector/config.js +++ /dev/null @@ -1,4 +0,0 @@ -const { PluginConfig } = require('../../config/dynamic'); - -const config = new PluginConfig('captions-selector', { enableFront: true }); -module.exports = { ...config }; diff --git a/plugins/captions-selector/config.ts b/plugins/captions-selector/config.ts new file mode 100644 index 00000000..97867c7e --- /dev/null +++ b/plugins/captions-selector/config.ts @@ -0,0 +1,4 @@ +import { PluginConfig } from '../../config/dynamic'; + +const config = new PluginConfig('captions-selector', { enableFront: true }); +export default { ...config } as PluginConfig<'captions-selector'>; diff --git a/plugins/captions-selector/front.js b/plugins/captions-selector/front.ts similarity index 58% rename from plugins/captions-selector/front.js rename to plugins/captions-selector/front.ts index 2eff05ba..cfa61c1b 100644 --- a/plugins/captions-selector/front.js +++ b/plugins/captions-selector/front.ts @@ -1,20 +1,37 @@ -const { ipcRenderer } = require('electron'); +/* eslint-disable @typescript-eslint/await-thenable */ +/* renderer */ -const configProvider = require('./config'); +import { ipcRenderer } from 'electron'; -const { ElementFromFile, templatePath } = require('../utils'); +import configProvider from './config'; -let config; +import { ElementFromFile, templatePath } from '../utils'; +import { YoutubePlayer } from '../../types/youtube-player'; +import { ConfigType } from '../../config/dynamic'; -function $(selector) { - return document.querySelector(selector); +interface LanguageOptions { + displayName: string; + id: string | null; + is_default: boolean; + is_servable: boolean; + is_translateable: boolean; + kind: string; + languageCode: string; // 2 length + languageName: string; + name: string | null; + vss_id: string; } +let config: ConfigType<'captions-selector'>; + +const $ = (selector: string): Element => document.querySelector(selector)!; + const captionsSettingsButton = ElementFromFile( templatePath(__dirname, 'captions-settings-template.html'), ); -module.exports = async () => { +export default async () => { + // RENDERER config = await configProvider.getAll(); configProvider.subscribeAll((newConfig) => { @@ -23,12 +40,12 @@ module.exports = async () => { document.addEventListener('apiLoaded', (event) => setup(event.detail), { once: true, passive: true }); }; -function setup(api) { +function setup(api: YoutubePlayer) { $('.right-controls-buttons').append(captionsSettingsButton); - let captionTrackList = api.getOption('captions', 'tracklist'); + let captionTrackList = api.getOption('captions', 'tracklist') ?? []; - $('video').addEventListener('srcChanged', async () => { + $('video').addEventListener('srcChanged', () => { if (config.disableCaptions) { setTimeout(() => api.unloadModule('captions'), 100); captionsSettingsButton.style.display = 'none'; @@ -37,8 +54,8 @@ function setup(api) { api.loadModule('captions'); - setTimeout(async () => { - captionTrackList = api.getOption('captions', 'tracklist'); + setTimeout(() => { + captionTrackList = api.getOption('captions', 'tracklist') ?? []; if (config.autoload && config.lastCaptionsCode) { api.setOption('captions', 'track', { @@ -54,9 +71,9 @@ function setup(api) { captionsSettingsButton.addEventListener('click', async () => { if (captionTrackList?.length) { - const currentCaptionTrack = api.getOption('captions', 'track'); + const currentCaptionTrack = api.getOption('captions', 'track')!; let currentIndex = currentCaptionTrack - ? captionTrackList.indexOf(captionTrackList.find((track) => track.languageCode === currentCaptionTrack.languageCode)) + ? captionTrackList.indexOf(captionTrackList.find((track) => track.languageCode === currentCaptionTrack.languageCode)!) : null; const captionLabels = [ @@ -64,7 +81,7 @@ function setup(api) { 'None', ]; - currentIndex = await ipcRenderer.invoke('captionsSelector', captionLabels, currentIndex); + currentIndex = await ipcRenderer.invoke('captionsSelector', captionLabels, currentIndex) as number; if (currentIndex === null) { return; } diff --git a/plugins/captions-selector/menu.js b/plugins/captions-selector/menu.ts similarity index 77% rename from plugins/captions-selector/menu.js rename to plugins/captions-selector/menu.ts index 42dc202c..e5880cea 100644 --- a/plugins/captions-selector/menu.js +++ b/plugins/captions-selector/menu.ts @@ -1,6 +1,8 @@ -const config = require('./config'); +import config from './config'; -module.exports = () => [ +import { MenuTemplate } from '../../menu'; + +export default (): MenuTemplate => [ { label: 'Automatically select last used caption', type: 'checkbox', diff --git a/plugins/compact-sidebar/front.js b/plugins/compact-sidebar/front.ts similarity index 71% rename from plugins/compact-sidebar/front.js rename to plugins/compact-sidebar/front.ts index 6b2e2b94..b2bd8f03 100644 --- a/plugins/compact-sidebar/front.js +++ b/plugins/compact-sidebar/front.ts @@ -1,10 +1,10 @@ -module.exports = () => { +export default () => { const compactSidebar = document.querySelector('#mini-guide'); const isCompactSidebarDisabled = compactSidebar === null || window.getComputedStyle(compactSidebar).display === 'none'; if (isCompactSidebarDisabled) { - document.querySelector('#button').click(); + (document.querySelector('#button') as HTMLButtonElement)?.click(); } }; diff --git a/plugins/crossfade/back.js b/plugins/crossfade/back.js deleted file mode 100644 index 18d10f86..00000000 --- a/plugins/crossfade/back.js +++ /dev/null @@ -1,15 +0,0 @@ -const { ipcMain } = require('electron'); -const { Innertube } = require('youtubei.js'); - -require('./config'); - -module.exports = async () => { - const yt = await Innertube.create(); - - ipcMain.handle('audio-url', async (_, videoID) => { - const info = await yt.getBasicInfo(videoID); - const url = info.streaming_data?.formats[0].decipher(yt.session.player); - - return url; - }); -}; diff --git a/plugins/crossfade/back.ts b/plugins/crossfade/back.ts new file mode 100644 index 00000000..ff4d1647 --- /dev/null +++ b/plugins/crossfade/back.ts @@ -0,0 +1,15 @@ +import { ipcMain } from 'electron'; +import { Innertube } from 'youtubei.js'; + +import config from './config'; + +export default async () => { + const yt = await Innertube.create(); + + ipcMain.handle('audio-url', async (_, videoID: string) => { + const info = await yt.getBasicInfo(videoID); + const url = info.streaming_data?.formats[0].decipher(yt.session.player); + + return url; + }); +}; diff --git a/plugins/crossfade/config.js b/plugins/crossfade/config.js deleted file mode 100644 index bfd742d7..00000000 --- a/plugins/crossfade/config.js +++ /dev/null @@ -1,4 +0,0 @@ -const { PluginConfig } = require('../../config/dynamic'); - -const config = new PluginConfig('crossfade', { enableFront: true }); -module.exports = { ...config }; diff --git a/plugins/crossfade/config.ts b/plugins/crossfade/config.ts new file mode 100644 index 00000000..186ff14d --- /dev/null +++ b/plugins/crossfade/config.ts @@ -0,0 +1,4 @@ +import { PluginConfig } from '../../config/dynamic'; + +const config = new PluginConfig('crossfade', { enableFront: true }); +export default { ...config } as PluginConfig<'crossfade'>; diff --git a/plugins/crossfade/fader.js b/plugins/crossfade/fader.ts similarity index 83% rename from plugins/crossfade/fader.js rename to plugins/crossfade/fader.ts index df3c8db2..e403100a 100644 --- a/plugins/crossfade/fader.js +++ b/plugins/crossfade/fader.ts @@ -18,7 +18,7 @@ 'use strict'; // Internal utility: check if value is a valid volume level and throw if not -const validateVolumeLevel = (value) => { +const validateVolumeLevel = (value: number) => { // Number between 0 and 1? if (!Number.isNaN(value) && value >= 0 && value <= 1) { // Yup, that's fine @@ -29,8 +29,51 @@ const validateVolumeLevel = (value) => { } }; +type VolumeLogger = (message: string, ...args: Params) => void; +interface VolumeFaderOptions { + /** + * logging `function(stuff, …)` for execution information (default: no logging) + */ + logger?: VolumeLogger; + /** + * either 'linear', 'logarithmic' or a positive number in dB (default: logarithmic) + */ + fadeScaling?: string | number; + /** + * media volume 0…1 to apply during setup (volume not touched by default) + */ + initialVolume?: number; + /** + * time in milliseconds to complete a fade (default: 1000 ms) + */ + fadeDuration?: number; +} + +interface VolumeFade { + volume: { + start: number; + end: number; + }; + time: { + start: number; + end: number; + }; + callback?: () => void; +} + // Main class -class VolumeFader { +export class VolumeFader { + private media: HTMLMediaElement; + private logger: VolumeLogger | false; + private scale: { + internalToVolume: (level: number) => number; + volumeToInternal: (level: number) => number; + }; + private fadeDuration: number = 1000; + private active: boolean = false; + private fade: VolumeFade | undefined; + + /** * VolumeFader Constructor * @@ -38,13 +81,8 @@ class VolumeFader { * @param options {Object} - an object with optional settings * @throws {TypeError} if options.initialVolume or options.fadeDuration are invalid * - * options: - * .logger: {Function} logging `function(stuff, …)` for execution information (default: no logging) - * .fadeScaling: {Mixed} either 'linear', 'logarithmic' or a positive number in dB (default: logarithmic) - * .initialVolume: {Number} media volume 0…1 to apply during setup (volume not touched by default) - * .fadeDuration: {Number} time in milliseconds to complete a fade (default: 1000 ms) */ - constructor(media, options) { + constructor(media: HTMLMediaElement, options: VolumeFaderOptions) { // Passed media element of correct type? if (media instanceof HTMLMediaElement) { // Save reference to media element @@ -70,8 +108,8 @@ class VolumeFader { if (options.fadeScaling === 'linear') { // Pass levels unchanged this.scale = { - internalToVolume: (level) => level, - volumeToInternal: (level) => level, + internalToVolume: (level: number) => level, + volumeToInternal: (level: number) => level, }; // Log setting @@ -79,7 +117,7 @@ class VolumeFader { } // No linear, but logarithmic fading… else { - let dynamicRange; + let dynamicRange: number; // Default dynamic range? if ( @@ -91,7 +129,8 @@ class VolumeFader { } // Custom dynamic range? else if ( - !Number.isNaN(options.fadeScaling) + typeof options.fadeScaling === 'number' + && !Number.isNaN(options.fadeScaling) && options.fadeScaling > 0 ) { // Turn amplitude dB into a multiple of 10 power dB @@ -107,9 +146,9 @@ class VolumeFader { // Use exponential/logarithmic scaler for expansion/compression this.scale = { - internalToVolume: (level) => + internalToVolume: (level: number) => this.exponentialScaler(level, dynamicRange), - volumeToInternal: (level) => + volumeToInternal: (level: number) => this.logarithmicScaler(level, dynamicRange), }; @@ -193,7 +232,7 @@ class VolumeFader { * @throws {TypeError} if fadeDuration is not a number greater than zero * @return {Object} VolumeFader instance for chaining */ - setFadeDuration(fadeDuration) { + setFadeDuration(fadeDuration: number) { // If duration is a valid number > 0… if (!Number.isNaN(fadeDuration) && fadeDuration > 0) { // Set fade duration @@ -219,7 +258,7 @@ class VolumeFader { * @throws {TypeError} if targetVolume is not in the range 0…1 * @return {Object} VolumeFader instance for chaining */ - fadeTo(targetVolume, callback) { + fadeTo(targetVolume: number, callback?: () => void) { // Validate volume and throw if invalid validateVolumeLevel(targetVolume); @@ -250,11 +289,11 @@ class VolumeFader { } // Convenience shorthand methods for common fades - fadeIn(callback) { + fadeIn(callback: () => void) { this.fadeTo(1, callback); } - fadeOut(callback) { + fadeOut(callback: () => void) { this.fadeTo(0, callback); } @@ -313,7 +352,7 @@ class VolumeFader { * @param {Number} dynamicRange - expanded output range, in multiples of 10 dB (float, 0…∞) * @return {Number} - expanded level (float, 0…1) */ - exponentialScaler(input, dynamicRange) { + exponentialScaler(input: number, dynamicRange: number) { // Special case: make zero (or any falsy input) return zero if (input === 0) { // Since the dynamic range is limited, @@ -336,7 +375,7 @@ class VolumeFader { * @param {Number} dynamicRange - coerced input range, in multiples of 10 dB (float, 0…∞) * @return {Number} - compressed level (float, 0…1) */ - logarithmicScaler(input, dynamicRange) { + logarithmicScaler(input: number, dynamicRange: number) { // Special case: make zero (or any falsy input) return zero if (input === 0) { // Logarithm of zero would be -∞, which would map to zero anyway @@ -351,6 +390,6 @@ class VolumeFader { } } -module.exports = { +export default { VolumeFader }; diff --git a/plugins/crossfade/front.js b/plugins/crossfade/front.ts similarity index 59% rename from plugins/crossfade/front.js rename to plugins/crossfade/front.ts index 526623f7..aeff1064 100644 --- a/plugins/crossfade/front.js +++ b/plugins/crossfade/front.ts @@ -1,38 +1,39 @@ -const { ipcRenderer } = require('electron'); -const { Howl } = require('howler'); +/* eslint-disable @typescript-eslint/await-thenable */ +/* renderer */ + +import { ipcRenderer } from 'electron'; +import { Howl } from 'howler'; // Extracted from https://github.com/bitfasching/VolumeFader -const { VolumeFader } = require('./fader'); +import { VolumeFader } from './fader'; -let transitionAudio; // Howler audio used to fade out the current music +import configProvider from './config'; + +import defaultConfigs from '../../config/defaults'; +import { ConfigType } from '../../config/dynamic'; + +let transitionAudio: Howl; // Howler audio used to fade out the current music let firstVideo = true; -let waitForTransition; +let waitForTransition: Promise; -/** - * @type {PluginConfig} - */ -const configProvider = require('./config'); +const defaultConfig = defaultConfigs.plugins.crossfade; -const defaultConfig = require('../../config/defaults').plugins.crossfade; +let config: ConfigType<'crossfade'>; -let config; +const configGetNumber = (key: keyof ConfigType<'crossfade'>): number => Number(config[key]) || (defaultConfig[key] as number); -const configGetNumber = (key) => Number(config[key]) || defaultConfig[key]; +const getStreamURL = async (videoID: string) => ipcRenderer.invoke('audio-url', videoID) as Promise; -const getStreamURL = async (videoID) => { - return await ipcRenderer.invoke('audio-url', videoID); -}; - -const getVideoIDFromURL = (url) => new URLSearchParams(url.split('?')?.at(-1)).get('v'); +const getVideoIDFromURL = (url: string) => new URLSearchParams(url.split('?')?.at(-1)).get('v'); const isReadyToCrossfade = () => transitionAudio && transitionAudio.state() === 'loaded'; -const watchVideoIDChanges = (cb) => { +const watchVideoIDChanges = (cb: (id: string) => void) => { window.navigation.addEventListener('navigate', (event) => { const currentVideoID = getVideoIDFromURL( - event.currentTarget.currentEntry.url, + (event.currentTarget as Navigation).currentEntry?.url ?? '', ); - const nextVideoID = getVideoIDFromURL(event.destination.url); + const nextVideoID = getVideoIDFromURL(event.destination.url ?? ''); if ( nextVideoID @@ -51,7 +52,7 @@ const watchVideoIDChanges = (cb) => { }); }; -const createAudioForCrossfade = async (url) => { +const createAudioForCrossfade = (url: string) => { if (transitionAudio) { transitionAudio.unload(); } @@ -61,19 +62,19 @@ const createAudioForCrossfade = async (url) => { html5: true, volume: 0, }); - await syncVideoWithTransitionAudio(); + syncVideoWithTransitionAudio(); }; -const syncVideoWithTransitionAudio = async () => { - const video = document.querySelector('video'); +const syncVideoWithTransitionAudio = () => { + const video = document.querySelector('video')!; const videoFader = new VolumeFader(video, { fadeScaling: configGetNumber('fadeScaling'), fadeDuration: configGetNumber('fadeInDuration'), }); - await transitionAudio.play(); - await transitionAudio.seek(video.currentTime); + transitionAudio.play(); + transitionAudio.seek(video.currentTime); video.addEventListener('seeking', () => { transitionAudio.seek(video.currentTime); @@ -83,9 +84,9 @@ const syncVideoWithTransitionAudio = async () => { transitionAudio.pause(); }); - video.addEventListener('play', async () => { - await transitionAudio.play(); - await transitionAudio.seek(video.currentTime); + video.addEventListener('play', () => { + transitionAudio.play(); + transitionAudio.seek(video.currentTime); // Fade in const videoVolume = video.volume; @@ -102,7 +103,7 @@ const syncVideoWithTransitionAudio = async () => { video.removeEventListener('timeupdate', transitionBeforeEnd); // Go to next video - XXX: does not support "repeat 1" mode - document.querySelector('.next-button').click(); + (document.querySelector('.next-button') as HTMLButtonElement).click(); } }; @@ -121,18 +122,18 @@ const onApiLoaded = () => { }); }; -const crossfade = async (cb) => { +const crossfade = (cb: () => void) => { if (!isReadyToCrossfade()) { cb(); return; } - let resolveTransition; - waitForTransition = new Promise((resolve) => { + let resolveTransition: () => void; + waitForTransition = new Promise((resolve) => { resolveTransition = resolve; }); - const video = document.querySelector('video'); + const video = document.querySelector('video')!; const fader = new VolumeFader(transitionAudio._sounds[0]._node, { initialVolume: video.volume, @@ -148,7 +149,7 @@ const crossfade = async (cb) => { }); }; -module.exports = async () => { +export default async () => { config = await configProvider.getAll(); configProvider.subscribeAll((newConfig) => { diff --git a/plugins/crossfade/menu.js b/plugins/crossfade/menu.ts similarity index 70% rename from plugins/crossfade/menu.js rename to plugins/crossfade/menu.ts index c39c14dc..93034d48 100644 --- a/plugins/crossfade/menu.js +++ b/plugins/crossfade/menu.ts @@ -1,11 +1,16 @@ -const prompt = require('custom-electron-prompt'); +import prompt from 'custom-electron-prompt'; -const config = require('./config'); +import { BrowserWindow } from 'electron'; -const promptOptions = require('../../providers/prompt-options'); -const defaultOptions = require('../../config/defaults').plugins.crossfade; +import config from './config'; -module.exports = (win) => [ +import promptOptions from '../../providers/prompt-options'; +import configOptions from '../../config/defaults'; +import { ConfigType } from '../../config/dynamic'; + +const defaultOptions = configOptions.plugins.crossfade; + +export default (win: BrowserWindow) => [ { label: 'Advanced', async click() { @@ -17,7 +22,7 @@ module.exports = (win) => [ }, ]; -async function promptCrossfadeValues(win, options) { +async function promptCrossfadeValues(win: BrowserWindow, options: ConfigType<'crossfade'>): Promise> | undefined> { const res = await prompt( { title: 'Crossfade Options', @@ -29,8 +34,8 @@ async function promptCrossfadeValues(win, options) { inputAttrs: { type: 'number', required: true, - min: 0, - step: 100, + min: '0', + step: '100', }, }, { @@ -39,8 +44,8 @@ async function promptCrossfadeValues(win, options) { inputAttrs: { type: 'number', required: true, - min: 0, - step: 100, + min: '0', + step: '100', }, }, { @@ -50,7 +55,7 @@ async function promptCrossfadeValues(win, options) { inputAttrs: { type: 'number', required: true, - min: 0, + min: '0', }, }, { diff --git a/plugins/disable-autoplay/front.js b/plugins/disable-autoplay/front.js deleted file mode 100644 index c9cca0d6..00000000 --- a/plugins/disable-autoplay/front.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = () => { - document.addEventListener('apiLoaded', (apiEvent) => { - apiEvent.detail.addEventListener('videodatachange', (name) => { - if (name === 'dataloaded') { - apiEvent.detail.pauseVideo(); - document.querySelector('video').addEventListener('timeupdate', (e) => { - e.target.pause(); - }); - } else { - document.querySelector('video').ontimeupdate = null; - } - }); - }, { once: true, passive: true }); -}; diff --git a/plugins/disable-autoplay/front.ts b/plugins/disable-autoplay/front.ts new file mode 100644 index 00000000..5e4cd47d --- /dev/null +++ b/plugins/disable-autoplay/front.ts @@ -0,0 +1,14 @@ +export default () => { + document.addEventListener('apiLoaded', (apiEvent) => { + apiEvent.detail.addEventListener('videodatachange', (name: string) => { + if (name === 'dataloaded') { + apiEvent.detail.pauseVideo(); + (document.querySelector('video') as HTMLVideoElement)?.addEventListener('timeupdate', (e) => { + (e.target as HTMLVideoElement)?.pause(); + }); + } else { + (document.querySelector('video') as HTMLVideoElement).ontimeupdate = null; + } + }); + }, { once: true, passive: true }); +}; diff --git a/plugins/discord/back.js b/plugins/discord/back.ts similarity index 68% rename from plugins/discord/back.js rename to plugins/discord/back.ts index 145e20a6..eb9ce125 100644 --- a/plugins/discord/back.js +++ b/plugins/discord/back.ts @@ -1,36 +1,35 @@ -'use strict'; -const { dialog, app } = require('electron'); -const Discord = require('@xhayper/discord-rpc'); -const { dev } = require('electron-is'); +import { app, dialog } from 'electron'; +import Discord from '@xhayper/discord-rpc'; +import { dev } from 'electron-is'; -const registerCallback = require('../../providers/song-info'); +import { SetActivity } from '@xhayper/discord-rpc/dist/structures/ClientUser'; + +import registerCallback from '../../providers/song-info'; +import pluginConfig from '../../config'; // Application ID registered by @Zo-Bro-23 const clientId = '1043858434585526382'; -/** - * @typedef {Object} Info - * @property {import('@xhayper/discord-rpc').Client} rpc - * @property {boolean} ready - * @property {boolean} autoReconnect - * @property {import('../../providers/song-info').SongInfo} lastSongInfo - */ -/** - * @type {Info} - */ -const info = { +export interface Info { + rpc: import('@xhayper/discord-rpc').Client; + ready: boolean; + autoReconnect: boolean; + lastSongInfo?: import('../../providers/song-info').SongInfo; +} + +const info: Info = { rpc: new Discord.Client({ clientId, }), ready: false, autoReconnect: true, - lastSongInfo: null, + lastSongInfo: undefined, }; /** * @type {(() => void)[]} */ -const refreshCallbacks = []; +const refreshCallbacks: (() => void)[] = []; const resetInfo = () => { info.ready = false; @@ -85,8 +84,8 @@ const connectRecursive = () => { connectTimeout().catch(connectRecursive); }; -let window; -const connect = (showError = false) => { +let window: Electron.BrowserWindow; +export const connect = (showError = false) => { if (info.rpc.isConnected) { if (dev()) { console.log('Attempted to connect with active connection'); @@ -98,7 +97,7 @@ const connect = (showError = false) => { info.ready = false; // Startup the rpc client - info.rpc.login({ clientId }).catch((error) => { + info.rpc.login().catch((error: Error) => { resetInfo(); if (dev()) { console.error(error); @@ -116,14 +115,17 @@ const connect = (showError = false) => { }); }; -let clearActivity; -/** - * @type {import('../../providers/song-info').songInfoCallback} - */ -let updateActivity; +let clearActivity: NodeJS.Timeout | undefined; +let updateActivity: import('../../providers/song-info').SongInfoCallback; -module.exports = (win, { autoReconnect, activityTimoutEnabled, activityTimoutTime, listenAlong, hideDurationLeft }) => { - info.autoReconnect = autoReconnect; +const DiscordOptionsObj = pluginConfig.get('plugins.discord'); +type DiscordOptions = typeof DiscordOptionsObj; + +export default ( + win: Electron.BrowserWindow, + options: DiscordOptions, +) => { + info.autoReconnect = options.autoReconnect; window = win; // We get multiple events @@ -146,7 +148,7 @@ module.exports = (win, { autoReconnect, activityTimoutEnabled, activityTimoutTim } // Clear directly if timeout is 0 - if (songInfo.isPaused && activityTimoutEnabled && activityTimoutTime === 0) { + if (songInfo.isPaused && options.activityTimoutEnabled && options.activityTimoutTime === 0) { info.rpc.user?.clearActivity().catch(console.error); return; } @@ -154,12 +156,12 @@ module.exports = (win, { autoReconnect, activityTimoutEnabled, activityTimoutTim // Song information changed, so lets update the rich presence // @see https://discord.com/developers/docs/topics/gateway#activity-object // not all options are transfered through https://github.com/discordjs/RPC/blob/6f83d8d812c87cb7ae22064acd132600407d7d05/src/client.js#L518-530 - const activityInfo = { + const activityInfo: SetActivity = { details: songInfo.title, state: songInfo.artist, - largeImageKey: songInfo.imageSrc, - largeImageText: songInfo.album, - buttons: listenAlong ? [ + largeImageKey: songInfo.imageSrc ?? '', + largeImageText: songInfo.album ?? '', + buttons: options.listenAlong ? [ { label: 'Listen Along', url: songInfo.url }, ] : undefined, }; @@ -169,10 +171,10 @@ module.exports = (win, { autoReconnect, activityTimoutEnabled, activityTimoutTim activityInfo.smallImageKey = 'paused'; activityInfo.smallImageText = 'Paused'; // Set start the timer so the activity gets cleared after a while if enabled - if (activityTimoutEnabled) { - clearActivity = setTimeout(() => info.rpc.user?.clearActivity().catch(console.error), activityTimoutTime ?? 10_000); + if (options.activityTimoutEnabled) { + clearActivity = setTimeout(() => info.rpc.user?.clearActivity().catch(console.error), options.activityTimoutTime ?? 10_000); } - } else if (!hideDurationLeft) { + } else if (!options.hideDurationLeft) { // Add the start and end time of the song const songStartTime = Date.now() - (songInfo.elapsedSeconds * 1000); activityInfo.startTimestamp = songStartTime; @@ -188,10 +190,10 @@ module.exports = (win, { autoReconnect, activityTimoutEnabled, activityTimoutTim registerCallback(updateActivity); connect(); }); - app.on('window-all-closed', module.exports.clear); + app.on('window-all-closed', clear); }; -module.exports.clear = () => { +export const clear = () => { if (info.rpc) { info.rpc.user?.clearActivity(); } @@ -199,6 +201,5 @@ module.exports.clear = () => { clearTimeout(clearActivity); }; -module.exports.connect = connect; -module.exports.registerRefresh = (cb) => refreshCallbacks.push(cb); -module.exports.isConnected = () => info.rpc !== null; +export const registerRefresh = (cb: () => void) => refreshCallbacks.push(cb); +export const isConnected = () => info.rpc !== null; diff --git a/plugins/discord/menu.js b/plugins/discord/menu.ts similarity index 60% rename from plugins/discord/menu.js rename to plugins/discord/menu.ts index c2086586..6723b3f6 100644 --- a/plugins/discord/menu.js +++ b/plugins/discord/menu.ts @@ -1,16 +1,22 @@ -const prompt = require('custom-electron-prompt'); +import prompt from 'custom-electron-prompt'; -const { clear, connect, registerRefresh, isConnected } = require('./back'); +import { Electron } from 'playwright'; -const { setMenuOptions } = require('../../config/plugins'); -const promptOptions = require('../../providers/prompt-options'); -const { singleton } = require('../../providers/decorators'); +import { clear, connect, isConnected, registerRefresh } from './back'; -const registerRefreshOnce = singleton((refreshMenu) => { +import { setMenuOptions } from '../../config/plugins'; +import promptOptions from '../../providers/prompt-options'; +import { singleton } from '../../providers/decorators'; +import config from '../../config'; + +const registerRefreshOnce = singleton((refreshMenu: () => void) => { registerRefresh(refreshMenu); }); -module.exports = (win, options, refreshMenu) => { +const DiscordOptionsObj = config.get('plugins.discord'); +type DiscordOptions = typeof DiscordOptionsObj; + +export default (win: Electron.BrowserWindow, options: DiscordOptions, refreshMenu: () => void) => { registerRefreshOnce(refreshMenu); return [ @@ -23,7 +29,7 @@ module.exports = (win, options, refreshMenu) => { label: 'Auto reconnect', type: 'checkbox', checked: options.autoReconnect, - click(item) { + click(item: Electron.MenuItem) { options.autoReconnect = item.checked; setMenuOptions('discord', options); }, @@ -36,7 +42,7 @@ module.exports = (win, options, refreshMenu) => { label: 'Clear activity after timeout', type: 'checkbox', checked: options.activityTimoutEnabled, - click(item) { + click(item: Electron.MenuItem) { options.activityTimoutEnabled = item.checked; setMenuOptions('discord', options); }, @@ -45,7 +51,7 @@ module.exports = (win, options, refreshMenu) => { label: 'Listen Along', type: 'checkbox', checked: options.listenAlong, - click(item) { + click(item: Electron.MenuItem) { options.listenAlong = item.checked; setMenuOptions('discord', options); }, @@ -54,7 +60,7 @@ module.exports = (win, options, refreshMenu) => { label: 'Hide duration left', type: 'checkbox', checked: options.hideDurationLeft, - click(item) { + click(item: Electron.MenuItem) { options.hideDurationLeft = item.checked; setMenuOptions('discord', options); }, @@ -66,11 +72,11 @@ module.exports = (win, options, refreshMenu) => { ]; }; -async function setInactivityTimeout(win, options) { +async function setInactivityTimeout(win: Electron.BrowserWindow, options: DiscordOptions) { const output = await prompt({ title: 'Set Inactivity Timeout', label: 'Enter inactivity timeout in seconds:', - value: Math.round((options.activityTimoutTime ?? 0) / 1e3), + value: String(Math.round((options.activityTimoutTime ?? 0) / 1e3)), type: 'counter', counterOptions: { minimum: 0, multiFire: true }, width: 450, @@ -78,7 +84,7 @@ async function setInactivityTimeout(win, options) { }, win); if (output) { - options.activityTimoutTime = Math.round(output * 1e3); + options.activityTimoutTime = Math.round(~~output * 1e3); setMenuOptions('discord', options); } } diff --git a/plugins/skip-silences/front.js b/plugins/skip-silences/front.ts similarity index 77% rename from plugins/skip-silences/front.js rename to plugins/skip-silences/front.ts index bf2508fb..6ad8853a 100644 --- a/plugins/skip-silences/front.js +++ b/plugins/skip-silences/front.ts @@ -1,4 +1,9 @@ -module.exports = (options) => { +import config from '../../config'; + +const SkipSilencesOptionsObj = config.get('plugins.skip-silences'); +type SkipSilencesOptions = typeof SkipSilencesOptionsObj; + +export default (options: SkipSilencesOptions) => { let isSilent = false; let hasAudioStarted = false; @@ -6,7 +11,7 @@ module.exports = (options) => { const threshold = -100; // DB (-100 = absolute silence, 0 = loudest) const interval = 2; // Ms const history = 10; - const speakingHistory = Array.from({ length: history }).fill(0); + const speakingHistory = Array.from({ length: history }).fill(0) as number[]; document.addEventListener( 'audioCanPlay', @@ -53,11 +58,13 @@ module.exports = (options) => { if (history == 0 // Silent && !( - video.paused - || video.seeking - || video.ended - || video.muted - || video.volume === 0 + video && ( + video.paused + || video.seeking + || video.ended + || video.muted + || video.volume === 0 + ) ) ) { isSilent = true; @@ -66,7 +73,7 @@ module.exports = (options) => { } speakingHistory.shift(); - speakingHistory.push(0 + (currentVolume > threshold)); + speakingHistory.push(Number(currentVolume > threshold)); looper(); }, interval); @@ -79,17 +86,17 @@ module.exports = (options) => { return; } - if (isSilent && !video.paused) { + if (isSilent && video && !video.paused) { video.currentTime += 0.2; // In s } }; - video.addEventListener('play', () => { + video?.addEventListener('play', () => { hasAudioStarted = false; skipSilence(); }); - video.addEventListener('seeked', () => { + video?.addEventListener('seeked', () => { hasAudioStarted = false; skipSilence(); }); @@ -100,7 +107,7 @@ module.exports = (options) => { ); }; -function getMaxVolume(analyser, fftBins) { +function getMaxVolume(analyser: AnalyserNode, fftBins: Float32Array) { let maxVolume = Number.NEGATIVE_INFINITY; analyser.getFloatFrequencyData(fftBins); diff --git a/plugins/taskbar-mediacontrol/back.js b/plugins/taskbar-mediacontrol/back.ts similarity index 54% rename from plugins/taskbar-mediacontrol/back.js rename to plugins/taskbar-mediacontrol/back.ts index 92d11fa5..ea411b23 100644 --- a/plugins/taskbar-mediacontrol/back.js +++ b/plugins/taskbar-mediacontrol/back.ts @@ -1,12 +1,19 @@ -const path = require('node:path'); +import path from 'node:path'; -const getSongControls = require('../../providers/song-controls'); -const registerCallback = require('../../providers/song-info'); +import { BrowserWindow, nativeImage } from 'electron'; -let controls; -let currentSongInfo; +import getSongControls from '../../providers/song-controls'; +import registerCallback, { SongInfo } from '../../providers/song-info'; -module.exports = (win) => { + +let controls: { + playPause: () => void; + next: () => void; + previous: () => void; +}; +let currentSongInfo: SongInfo; + +export default (win: BrowserWindow) => { const { playPause, next, previous } = getSongControls(win); controls = { playPause, next, previous }; @@ -23,7 +30,7 @@ module.exports = (win) => { }); }; -function setThumbar(win, songInfo) { +function setThumbar(win: BrowserWindow, songInfo: SongInfo) { // Wait for song to start before setting thumbar if (!songInfo?.title) { return; @@ -33,28 +40,28 @@ function setThumbar(win, songInfo) { win.setThumbarButtons([ { tooltip: 'Previous', - icon: get('previous'), + icon: nativeImage.createFromPath(get('previous')), click() { - controls.previous(win.webContents); + controls.previous(); }, }, { tooltip: 'Play/Pause', // Update icon based on play state - icon: songInfo.isPaused ? get('play') : get('pause'), + icon: nativeImage.createFromPath(songInfo.isPaused ? get('play') : get('pause')), click() { - controls.playPause(win.webContents); + controls.playPause(); }, }, { tooltip: 'Next', - icon: get('next'), + icon: nativeImage.createFromPath(get('next')), click() { - controls.next(win.webContents); + controls.next(); }, }, ]); } // Util -function get(kind) { +function get(kind: string) { return path.join(__dirname, '../../assets/media-icons-black', `${kind}.png`); } diff --git a/plugins/touchbar/back.js b/plugins/touchbar/back.ts similarity index 82% rename from plugins/touchbar/back.js rename to plugins/touchbar/back.ts index 8696a6b9..01091b33 100644 --- a/plugins/touchbar/back.js +++ b/plugins/touchbar/back.ts @@ -1,4 +1,7 @@ -const { TouchBar } = require('electron'); +import { TouchBar, NativeImage, BrowserWindow } from 'electron'; + +import registerCallback from '../../providers/song-info'; +import getSongControls from '../../providers/song-controls'; const { TouchBarButton, @@ -8,21 +11,20 @@ const { TouchBarScrubber, } = TouchBar; -const registerCallback = require('../../providers/song-info'); -const getSongControls = require('../../providers/song-controls'); - // Songtitle label const songTitle = new TouchBarLabel({ label: '', }); // This will store the song controls once available -let controls = []; +let controls: (() => void)[] = []; // This will store the song image once available -const songImage = {}; +const songImage: { + icon?: NativeImage; +} = {}; // Pause/play button -const pausePlayButton = new TouchBarButton(); +const pausePlayButton = new TouchBarButton({}); // The song control buttons (control functions are in the same order) const buttons = new TouchBarSegmentedControl({ @@ -59,7 +61,7 @@ const touchBar = new TouchBar({ ], }); -module.exports = (win) => { +module.exports = (win: BrowserWindow) => { const { playPause, next, previous, dislike, like } = getSongControls(win); // If the page is ready, register the callback @@ -79,7 +81,7 @@ module.exports = (win) => { // Get image source songImage.icon = songInfo.image ? songInfo.image.resize({ height: 23 }) - : null; + : undefined; win.setTouchBar(touchBar); }); diff --git a/plugins/tuna-obs/back.js b/plugins/tuna-obs/back.ts similarity index 55% rename from plugins/tuna-obs/back.js rename to plugins/tuna-obs/back.ts index 96e83381..8df6fd98 100644 --- a/plugins/tuna-obs/back.js +++ b/plugins/tuna-obs/back.ts @@ -1,13 +1,26 @@ -const { ipcMain, net } = require('electron'); +import { ipcMain, net, BrowserWindow } from 'electron'; -const registerCallback = require('../../providers/song-info'); +import registerCallback from '../../providers/song-info'; -const secToMilisec = (t) => Math.round(Number(t) * 1e3); -const data = { +const secToMilisec = (t: number) => Math.round(Number(t) * 1e3); + +interface Data { + album: string | null | undefined; + album_url: string; + artists: string[]; + cover: string; + cover_url: string; + duration: number; + progress: number; + status: string; + title: string; +} + +const data: Data = { cover: '', cover_url: '', title: '', - artists: [], + artists: [] as string[], status: '', progress: 0, duration: 0, @@ -15,7 +28,7 @@ const data = { album: undefined, }; -const post = async (data) => { +const post = (data: Data) => { const port = 1608; const headers = { 'Content-Type': 'application/json', @@ -28,13 +41,12 @@ const post = async (data) => { method: 'POST', headers, body: JSON.stringify({ data }), - }).catch((error) => console.log(`Error: '${error.code || error.errno}' - when trying to access obs-tuna webserver at port ${port}`)); + }).catch((error: { code: number, errno: number }) => console.log(`Error: '${error.code || error.errno}' - when trying to access obs-tuna webserver at port ${port}`)); }; -/** @param {Electron.BrowserWindow} win */ -module.exports = async (win) => { +module.exports = (win: BrowserWindow) => { ipcMain.on('apiLoaded', () => win.webContents.send('setupTimeChangedListener')); - ipcMain.on('timeChanged', async (_, t) => { + ipcMain.on('timeChanged', (_, t: number) => { if (!data.title) { return; } @@ -50,9 +62,9 @@ module.exports = async (win) => { data.duration = secToMilisec(songInfo.songDuration); data.progress = secToMilisec(songInfo.elapsedSeconds); - data.cover = songInfo.imageSrc; - data.cover_url = songInfo.imageSrc; - data.album_url = songInfo.imageSrc; + data.cover = songInfo.imageSrc ?? ''; + data.cover_url = songInfo.imageSrc ?? ''; + data.album_url = songInfo.imageSrc ?? ''; data.title = songInfo.title; data.artists = [songInfo.artist]; data.status = songInfo.isPaused ? 'stopped' : 'playing'; diff --git a/plugins/utils.ts b/plugins/utils.ts index 431b08b1..e5bfdc63 100644 --- a/plugins/utils.ts +++ b/plugins/utils.ts @@ -7,11 +7,12 @@ import { ValueOf } from '../utils/type-utils'; // Creates a DOM element from an HTML string -export const ElementFromHtml = (html: string) => { +export const ElementFromHtml = (html: string): HTMLElement => { const template = document.createElement('template'); html = html.trim(); // Never return a text node of whitespace as the result template.innerHTML = html; - return template.content.firstChild; + + return template.content.firstElementChild as HTMLElement; }; // Creates a DOM element from a HTML file diff --git a/providers/song-info.ts b/providers/song-info.ts index 655a5336..486daef9 100644 --- a/providers/song-info.ts +++ b/providers/song-info.ts @@ -88,7 +88,7 @@ const handleData = async (responseText: string, win: Electron.BrowserWindow) => }; // This variable will be filled with the callbacks once they register -type SongInfoCallback = (songInfo: SongInfo, event: string) => void; +export type SongInfoCallback = (songInfo: SongInfo, event?: string) => void; const callbacks: SongInfoCallback[] = []; // This function will allow plugins to register callback that will be triggered when data changes diff --git a/reset.d.ts b/reset.d.ts index 31759405..b3b3d290 100644 --- a/reset.d.ts +++ b/reset.d.ts @@ -2,8 +2,14 @@ import '@total-typescript/ts-reset'; import { YoutubePlayer } from './types/youtube-player'; declare global { + interface Compressor { + audioSource: MediaElementAudioSourceNode; + audioContext: AudioContext; + } + interface DocumentEventMap { 'apiLoaded': CustomEvent; + 'audioCanPlay': CustomEvent; } interface Window { @@ -11,5 +17,18 @@ declare global { * YouTube Music internal variable (Last interaction time) */ _lact: number; + navigation: Navigation; + } +} + + // import { Howl as _Howl } from 'howler'; +declare module 'howler' { + interface Howl { + _sounds: { + _paused: boolean; + _ended: boolean; + _id: string; + _node: HTMLMediaElement; + }[]; } } diff --git a/tsconfig.json b/tsconfig.json index 3d764405..d4d53dcd 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,7 @@ { "compilerOptions": { "target": "ESNext", + "lib": ["dom"], "module": "CommonJS", "allowSyntheticDefaultImports": true, "esModuleInterop": true, diff --git a/types/youtube-player.ts b/types/youtube-player.ts index 171c9a49..51ee4c1f 100644 --- a/types/youtube-player.ts +++ b/types/youtube-player.ts @@ -140,9 +140,9 @@ export interface YoutubePlayer { getPlaylistId: (...params: Parameters) => Return; loadModule: (...params: Parameters) => Return; unloadModule: (...params: Parameters) => Return; - setOption: (...params: Parameters) => Return; - getOption: (...params: Parameters) => Return; - getOptions: (...params: Parameters) => Return; + setOption: (optionName: string, key: string, value: T) => void; + getOption: (optionName: string, key: string) => T | null | undefined; + getOptions: () => string[]; mute: (...params: Parameters) => Return; unMute: (...params: Parameters) => Return; isMuted: (...params: Parameters) => Return; From 1f52995dc45be8dfb6b617b4920b87b835d9915a Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Sun, 3 Sep 2023 16:55:21 +0900 Subject: [PATCH 16/70] feat(exponential-volume): migration to TypeScript --- .../exponential-volume/{front.js => front.ts} | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) rename plugins/exponential-volume/{front.js => front.ts} (77%) diff --git a/plugins/exponential-volume/front.js b/plugins/exponential-volume/front.ts similarity index 77% rename from plugins/exponential-volume/front.js rename to plugins/exponential-volume/front.ts index 9a442251..3a185cdb 100644 --- a/plugins/exponential-volume/front.js +++ b/plugins/exponential-volume/front.ts @@ -1,4 +1,4 @@ -// "Youtube Music fix volume ratio 0.4" by Marco Pfeiffer +// "YouTube Music fix volume ratio 0.4" by Marco Pfeiffer // https://greasyfork.org/en/scripts/397686-youtube-music-fix-volume-ratio/ const exponentialVolume = () => { @@ -7,40 +7,39 @@ const exponentialVolume = () => { // 0.05 (or 5%) is the lowest you can select in the UI which with an exponent of 3 becomes 0.000125 or 0.0125% const EXPONENT = 3; - const storedOriginalVolumes = new WeakMap(); - const { get, set } = Object.getOwnPropertyDescriptor( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const storedOriginalVolumes = new WeakMap(); + const propertyDescriptor = Object.getOwnPropertyDescriptor( HTMLMediaElement.prototype, 'volume', ); Object.defineProperty(HTMLMediaElement.prototype, 'volume', { get() { - const lowVolume = get.call(this); + const lowVolume = propertyDescriptor?.get?.call(this) as number ?? 0; const calculatedOriginalVolume = lowVolume ** (1 / EXPONENT); // The calculated value has some accuracy issues which can lead to problems for implementations that expect exact values. // To avoid this, I'll store the unmodified volume to return it when read here. // This mostly solves the issue, but the initial read has no stored value and the volume can also change though external influences. // To avoid ill effects, I check if the stored volume is somewhere in the same range as the calculated volume. - const storedOriginalVolume = storedOriginalVolumes.get(this); + const storedOriginalVolume = storedOriginalVolumes.get(this) ?? 0; const storedDeviation = Math.abs( storedOriginalVolume - calculatedOriginalVolume, ); - const originalVolume - = storedDeviation < 0.01 + return storedDeviation < 0.01 ? storedOriginalVolume : calculatedOriginalVolume; - return originalVolume; }, - set(originalVolume) { + set(originalVolume: number) { const lowVolume = originalVolume ** EXPONENT; storedOriginalVolumes.set(this, originalVolume); - set.call(this, lowVolume); + propertyDescriptor?.set?.call(this, lowVolume); }, }); }; -module.exports = () => +export default () => document.addEventListener('apiLoaded', exponentialVolume, { once: true, passive: true, From 8b5a094eb51520b3b4953db2a293b19b04c33932 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Sun, 3 Sep 2023 16:57:36 +0900 Subject: [PATCH 17/70] feat(exponential-volume): fix type of WeakMap Co-authored-by: Su-Yong --- plugins/exponential-volume/front.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/plugins/exponential-volume/front.ts b/plugins/exponential-volume/front.ts index 3a185cdb..931acb09 100644 --- a/plugins/exponential-volume/front.ts +++ b/plugins/exponential-volume/front.ts @@ -7,14 +7,13 @@ const exponentialVolume = () => { // 0.05 (or 5%) is the lowest you can select in the UI which with an exponent of 3 becomes 0.000125 or 0.0125% const EXPONENT = 3; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const storedOriginalVolumes = new WeakMap(); + const storedOriginalVolumes = new WeakMap(); const propertyDescriptor = Object.getOwnPropertyDescriptor( HTMLMediaElement.prototype, 'volume', ); Object.defineProperty(HTMLMediaElement.prototype, 'volume', { - get() { + get(this: HTMLMediaElement) { const lowVolume = propertyDescriptor?.get?.call(this) as number ?? 0; const calculatedOriginalVolume = lowVolume ** (1 / EXPONENT); From 03c1ab0e98996689e1bd6a267240b772dbd983df Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Sun, 3 Sep 2023 17:29:47 +0900 Subject: [PATCH 18/70] feat(exponential-volume): fix type of function Co-authored-by: Su-Yong --- plugins/exponential-volume/front.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/exponential-volume/front.ts b/plugins/exponential-volume/front.ts index 931acb09..3f2c5d0c 100644 --- a/plugins/exponential-volume/front.ts +++ b/plugins/exponential-volume/front.ts @@ -30,7 +30,7 @@ const exponentialVolume = () => { ? storedOriginalVolume : calculatedOriginalVolume; }, - set(originalVolume: number) { + set(this: HTMLMediaElement, originalVolume: number) { const lowVolume = originalVolume ** EXPONENT; storedOriginalVolumes.set(this, originalVolume); propertyDescriptor?.set?.call(this, lowVolume); From 278618bc83a052d221ba09710f3eda95fbfa8017 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Sun, 3 Sep 2023 21:02:57 +0900 Subject: [PATCH 19/70] feat: migration to TypeScript part 3 Co-authored-by: Su-Yong --- config/defaults.ts | 42 ++- package-lock.json | 47 ++- package.json | 6 +- plugins/discord/back.ts | 4 +- plugins/downloader/{back.js => back.ts} | 279 +++++++++--------- plugins/downloader/config.js | 4 - plugins/downloader/config.ts | 4 + plugins/downloader/{front.js => front.ts} | 25 +- plugins/downloader/{menu.js => menu.ts} | 12 +- plugins/downloader/{utils.js => utils.ts} | 16 +- plugins/in-app-menu/back.js | 23 -- plugins/in-app-menu/back.ts | 27 ++ .../in-app-menu/custom-electron-titlebar.d.ts | 9 + plugins/in-app-menu/front.js | 78 ----- plugins/in-app-menu/front.ts | 96 ++++++ plugins/last-fm/{back.js => back.ts} | 101 ++++--- plugins/lyrics-genius/{back.js => back.ts} | 60 ++-- plugins/lyrics-genius/{front.js => front.ts} | 51 ++-- plugins/lyrics-genius/menu.js | 16 - plugins/lyrics-genius/menu.ts | 18 ++ plugins/lyrics-genius/types.ts | 121 ++++++++ plugins/tuna-obs/back.ts | 2 +- providers/song-info-front.ts | 3 +- providers/song-info.ts | 8 +- tsconfig.json | 2 +- 25 files changed, 674 insertions(+), 380 deletions(-) rename plugins/downloader/{back.js => back.ts} (59%) delete mode 100644 plugins/downloader/config.js create mode 100644 plugins/downloader/config.ts rename plugins/downloader/{front.js => front.ts} (69%) rename plugins/downloader/{menu.js => menu.ts} (76%) rename plugins/downloader/{utils.js => utils.ts} (57%) delete mode 100644 plugins/in-app-menu/back.js create mode 100644 plugins/in-app-menu/back.ts create mode 100644 plugins/in-app-menu/custom-electron-titlebar.d.ts delete mode 100644 plugins/in-app-menu/front.js create mode 100644 plugins/in-app-menu/front.ts rename plugins/last-fm/{back.js => back.ts} (53%) rename plugins/lyrics-genius/{back.js => back.ts} (65%) rename plugins/lyrics-genius/{front.js => front.ts} (63%) delete mode 100644 plugins/lyrics-genius/menu.js create mode 100644 plugins/lyrics-genius/menu.ts create mode 100644 plugins/lyrics-genius/types.ts diff --git a/config/defaults.ts b/config/defaults.ts index c454863a..a09e916f 100644 --- a/config/defaults.ts +++ b/config/defaults.ts @@ -3,6 +3,39 @@ export interface WindowSizeConfig { height: number; } +export interface DefaultConfig { + 'window-size': { + width: number; + height: number; + } + 'window-maximized': boolean; + 'window-position': { + x: number; + y: number; + } + url: string; + options: { + tray: boolean; + appVisible: boolean; + autoUpdates: boolean; + alwaysOnTop: boolean; + hideMenu: boolean; + hideMenuWarned: boolean; + startAtLogin: boolean; + disableHardwareAcceleration: boolean; + removeUpgradeButton: boolean; + restartOnConfigChanges: boolean; + trayClickPlayPause: boolean; + autoResetAppCache: boolean; + resumeOnStart: boolean; + likeButtons: string; + proxy: string; + startingPage: string; + overrideUserAgent: boolean; + themes: string[]; + } +} + const defaultConfig = { 'window-size': { width: 1100, @@ -54,15 +87,22 @@ const defaultConfig = { 'downloader': { enabled: false, ffmpegArgs: [], // E.g. ["-b:a", "192k"] for an audio bitrate of 192kb/s - downloadFolder: undefined, // Custom download folder (absolute path) + downloadFolder: undefined as string | undefined, // Custom download folder (absolute path) preset: 'mp3', + skipExisting: false, + playlistMaxItems: undefined as number | undefined, }, 'last-fm': { enabled: false, + token: undefined as string | undefined, // Token used for authentication + session_key: undefined as string | undefined, // Session key used for scrobbling api_root: 'http://ws.audioscrobbler.com/2.0/', api_key: '04d76faaac8726e60988e14c105d421a', // Api key registered by @semvis123 secret: 'a5d2a36fdf64819290f6982481eaffa2', }, + 'lyric-genius': { + romanizedLyrics: false, + }, 'discord': { enabled: false, autoReconnect: true, // If enabled, will try to reconnect to discord every 5 seconds after disconnecting or failing to connect diff --git a/package-lock.json b/package-lock.json index 8bd2a261..51f51d3d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,6 +36,7 @@ "keyboardevents-areequal": "0.2.2", "md5": "2.3.0", "mpris-service": "2.1.2", + "node-id3": "0.2.6", "simple-youtube-age-restriction-bypass": "git+https://github.com/zerodytrash/Simple-YouTube-Age-Restriction-Bypass.git#v2.5.9", "vudio": "2.1.1", "youtubei.js": "6.1.0", @@ -44,7 +45,10 @@ "devDependencies": { "@playwright/test": "1.37.1", "@total-typescript/ts-reset": "0.5.1", + "@types/electron-localshortcut": "^3.1.0", "@types/howler": "^2.2.8", + "@types/html-to-text": "^9.0.1", + "@types/md5": "^2.3.2", "@types/youtube-player": "^5.5.7", "@typescript-eslint/eslint-plugin": "6.5.0", "auto-changelog": "2.4.0", @@ -1169,6 +1173,15 @@ "@types/ms": "*" } }, + "node_modules/@types/electron-localshortcut": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/electron-localshortcut/-/electron-localshortcut-3.1.0.tgz", + "integrity": "sha512-upKSXMxBPRdz5kmcXfdfn+hWH9PCAvwhyVozDXTIwwHQ1lUJcdSgGUfxOC1QBlnAPKPqcW/r4icWfMosKz8ibg==", + "dev": true, + "dependencies": { + "electron": "*" + } + }, "node_modules/@types/filesystem": { "version": "0.0.32", "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.32.tgz", @@ -1207,6 +1220,12 @@ "integrity": "sha512-7OK+cGHTWIDCOvBlEc61Lzj2tJhCpmeqiqdeNbZvTxLHluBMF6xz/2wjoQkK1M8mJIStp40OdPnkp8xIvwwsuw==", "dev": true }, + "node_modules/@types/html-to-text": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@types/html-to-text/-/html-to-text-9.0.1.tgz", + "integrity": "sha512-sHu702QGb0SP2F0Zt+CxdCmGZIZ0gEaaCjqOh/V4iba1wTxPVntEPOM/vHm5bel08TILhB3+OxUTkDJWnr/zHQ==", + "dev": true + }, "node_modules/@types/http-cache-semantics": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", @@ -1232,6 +1251,12 @@ "@types/node": "*" } }, + "node_modules/@types/md5": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@types/md5/-/md5-2.3.2.tgz", + "integrity": "sha512-v+JFDu96+UYJ3/UWzB0mEglIS//MZXgRaJ4ubUPwOM0gvLc/kcQ3TWNYwENEK7/EcXGQVrW8h/XqednSjBd/Og==", + "dev": true + }, "node_modules/@types/minimist": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", @@ -6571,6 +6596,25 @@ "node": "^12.13 || ^14.13 || >=16" } }, + "node_modules/node-id3": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/node-id3/-/node-id3-0.2.6.tgz", + "integrity": "sha512-w8GuKXLlPpDjTxLowCt/uYMhRQzED3cg2GdSG1i6RSGKeDzPvxlXeLQuQInKljahPZ0aDnmyX7FX8BbJOM7REg==", + "dependencies": { + "iconv-lite": "0.6.2" + } + }, + "node_modules/node-id3/node_modules/iconv-lite": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/nopt": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", @@ -7783,8 +7827,7 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "devOptional": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sanitize-filename": { "version": "1.6.3", diff --git a/package.json b/package.json index 6fe08c21..3c2c0ee3 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,7 @@ "lint": "xo", "changelog": "auto-changelog", "plugins": "npm run plugin:adblocker && npm run plugin:bypass-age-restrictions", - "plugin:adblocker": "del-cli plugins/adblocker/ad-blocker-engine.bin && node plugins/adblocker/blocker.ts", + "plugin:adblocker": "del-cli plugins/adblocker/ad-blocker-engine.bin && tsc plugins/adblocker/blocker.ts && node dist/plugins/adblocker/blocker.js", "plugin:bypass-age-restrictions": "del-cli node_modules/simple-youtube-age-restriction-bypass/package.json && npm run generate:package simple-youtube-age-restriction-bypass", "release:linux": "npm run clean && electron-builder --linux -p always -c.snap.publish=github", "release:mac": "npm run clean && electron-builder --mac -p always", @@ -135,6 +135,7 @@ "keyboardevents-areequal": "0.2.2", "md5": "2.3.0", "mpris-service": "2.1.2", + "node-id3": "0.2.6", "simple-youtube-age-restriction-bypass": "git+https://github.com/zerodytrash/Simple-YouTube-Age-Restriction-Bypass.git#v2.5.9", "vudio": "2.1.1", "youtubei.js": "6.1.0", @@ -149,7 +150,10 @@ "devDependencies": { "@playwright/test": "1.37.1", "@total-typescript/ts-reset": "0.5.1", + "@types/electron-localshortcut": "^3.1.0", "@types/howler": "^2.2.8", + "@types/html-to-text": "^9.0.1", + "@types/md5": "^2.3.2", "@types/youtube-player": "^5.5.7", "@typescript-eslint/eslint-plugin": "6.5.0", "auto-changelog": "2.4.0", diff --git a/plugins/discord/back.ts b/plugins/discord/back.ts index eb9ce125..f0970c3a 100644 --- a/plugins/discord/back.ts +++ b/plugins/discord/back.ts @@ -162,7 +162,7 @@ export default ( largeImageKey: songInfo.imageSrc ?? '', largeImageText: songInfo.album ?? '', buttons: options.listenAlong ? [ - { label: 'Listen Along', url: songInfo.url }, + { label: 'Listen Along', url: songInfo.url ?? '' }, ] : undefined, }; @@ -176,7 +176,7 @@ export default ( } } else if (!options.hideDurationLeft) { // Add the start and end time of the song - const songStartTime = Date.now() - (songInfo.elapsedSeconds * 1000); + const songStartTime = Date.now() - ((songInfo.elapsedSeconds ?? 0) * 1000); activityInfo.startTimestamp = songStartTime; activityInfo.endTimestamp = songStartTime + (songInfo.songDuration * 1000); diff --git a/plugins/downloader/back.js b/plugins/downloader/back.ts similarity index 59% rename from plugins/downloader/back.js rename to plugins/downloader/back.ts index 9144f83c..f30f532a 100644 --- a/plugins/downloader/back.js +++ b/plugins/downloader/back.ts @@ -1,58 +1,64 @@ -const { + +import { existsSync, mkdirSync, createWriteStream, writeFileSync, -} = require('node:fs'); -const { join } = require('node:path'); +} from 'node:fs'; +import { join } from 'node:path'; +import { randomBytes } from 'node:crypto'; -const { randomBytes } = require('node:crypto'); +import { app, BrowserWindow, dialog, ipcMain } from 'electron'; +import { ClientType, Innertube, UniversalCache, Utils } from 'youtubei.js'; +import is from 'electron-is'; +import ytpl from 'ytpl'; + // REPLACE with youtubei getplaylist https://github.com/LuanRT/YouTube.js#getplaylistid +import filenamify from 'filenamify'; +import { Mutex } from 'async-mutex'; +import { createFFmpeg } from '@ffmpeg/ffmpeg'; -const { ipcMain, app, dialog } = require('electron'); -const is = require('electron-is'); -const { Innertube, UniversalCache, Utils, ClientType } = require('youtubei.js'); -const ytpl = require('ytpl'); // REPLACE with youtubei getplaylist https://github.com/LuanRT/YouTube.js#getplaylistid -const filenamify = require('filenamify'); -const ID3Writer = require('browser-id3-writer'); -const { Mutex } = require('async-mutex'); -const ffmpeg = require('@ffmpeg/ffmpeg').createFFmpeg({ +import NodeID3, { TagConstants } from 'node-id3'; + +import PlayerErrorMessage from 'youtubei.js/dist/src/parser/classes/PlayerErrorMessage'; +import { FormatOptions } from 'youtubei.js/dist/src/types/FormatUtils'; + +import TrackInfo from 'youtubei.js/dist/src/parser/ytmusic/TrackInfo'; + +import { VideoInfo } from 'youtubei.js/dist/src/parser/youtube'; + +import { cropMaxWidth, getFolder, presets, sendFeedback as sendFeedback_, setBadge } from './utils'; + +import config from './config'; + +import { fetchFromGenius } from '../lyrics-genius/back'; +import { isEnabled } from '../../config/plugins'; +import { cleanupName, getImage, SongInfo } from '../../providers/song-info'; +import { injectCSS } from '../utils'; +import { cache } from '../../providers/decorators'; +import { GetPlayerResponse } from '../../types/get-player-response'; + +type CustomSongInfo = SongInfo & { trackId?: string }; + +const ffmpeg = createFFmpeg({ log: false, logger() { }, // Console.log, progress() { }, // Console.log, }); - -const { - presets, - cropMaxWidth, - getFolder, - setBadge, - sendFeedback: sendFeedback_, -} = require('./utils'); - -const config = require('./config'); - -const { fetchFromGenius } = require('../lyrics-genius/back'); -const { isEnabled } = require('../../config/plugins'); -const { getImage, cleanupName } = require('../../providers/song-info'); -const { injectCSS } = require('../utils'); -const { cache } = require('../../providers/decorators'); - const ffmpegMutex = new Mutex(); -/** @type {Innertube} */ -let yt; -let win; -let playingUrl; +let yt: Innertube; +let win: BrowserWindow; +let playingUrl: string; -const sendError = (error, source) => { +const sendError = (error: Error, source?: string) => { win.setProgressBar(-1); // Close progress bar setBadge(0); // Close badge sendFeedback_(win); // Reset feedback const songNameMessage = source ? `\nin ${source}` : ''; - const cause = error.cause ? `\n\n${error.cause.toString()}` : ''; + const cause = error.cause ? `\n\n${String(error.cause)}` : ''; const message = `${error.toString()}${songNameMessage}${cause}`; console.error(message); @@ -65,7 +71,7 @@ const sendError = (error, source) => { }); }; -module.exports = async (win_) => { +export default async (win_: BrowserWindow) => { win = win_; injectCSS(win.webContents, join(__dirname, 'style.css')); @@ -73,52 +79,48 @@ module.exports = async (win_) => { cache: new UniversalCache(false), generate_session_locally: true, }); - ipcMain.on('download-song', (_, url) => downloadSong(url)); - ipcMain.on('video-src-changed', async (_, data) => { - playingUrl - = JSON.parse(data)?.microformat?.microformatDataRenderer?.urlCanonical; + ipcMain.on('download-song', (_, url: string) => downloadSong(url)); + ipcMain.on('video-src-changed', (_, data: string) => { + playingUrl = (JSON.parse(data) as GetPlayerResponse).microformat.microformatDataRenderer.urlCanonical; }); - ipcMain.on('download-playlist-request', async (_event, url) => + ipcMain.on('download-playlist-request', async (_event, url: string) => downloadPlaylist(url), ); }; -module.exports.downloadSong = downloadSong; -module.exports.downloadPlaylist = downloadPlaylist; - -async function downloadSong( - url, - playlistFolder = undefined, - trackId = undefined, - increasePlaylistProgress = () => { +export async function downloadSong( + url: string, + playlistFolder: string | undefined = undefined, + trackId: string | undefined = undefined, + increasePlaylistProgress: (value: number) => void = () => { }, ) { let resolvedName; try { await downloadSongUnsafe( url, - (name) => resolvedName = name, + (name: string) => resolvedName = name, playlistFolder, trackId, increasePlaylistProgress, ); - } catch (error) { - sendError(error, resolvedName || url); + } catch (error: unknown) { + sendError(error as Error, resolvedName || url); } } async function downloadSongUnsafe( - url, - setName, - playlistFolder = undefined, - trackId = undefined, - increasePlaylistProgress = () => { + url: string, + setName: (name: string) => void, + playlistFolder: string | undefined = undefined, + trackId: string | undefined = undefined, + increasePlaylistProgress: (value: number) => void = () => { }, ) { - const sendFeedback = (message, progress) => { + const sendFeedback = (message: unknown, progress?: number) => { if (!playlistFolder) { sendFeedback_(win, message); - if (!isNaN(progress)) { + if (progress && !isNaN(progress)) { win.setProgressBar(progress); } } @@ -127,7 +129,9 @@ async function downloadSongUnsafe( sendFeedback('Downloading...', 2); const id = getVideoId(url); - let info = await yt.music.getInfo(id); + if (typeof id !== 'string') throw new Error('Video not found'); + + let info: TrackInfo | VideoInfo = await yt.music.getInfo(id); if (!info) { throw new Error('Video not found'); @@ -164,19 +168,19 @@ async function downloadSongUnsafe( } if (playabilityStatus.status === 'UNPLAYABLE') { - /** - * @typedef {import('youtubei.js/dist/src/parser/classes/PlayerErrorMessage').default} PlayerErrorMessage - * @type {PlayerErrorMessage} - */ - const errorScreen = playabilityStatus.error_screen; + const errorScreen = playabilityStatus.error_screen as PlayerErrorMessage | null; throw new Error( - `[${playabilityStatus.status}] ${errorScreen.reason.text}: ${errorScreen.subreason.text}`, + `[${playabilityStatus.status}] ${errorScreen?.reason.text}: ${errorScreen?.subreason.text}`, ); } - const extension = presets[config.get('preset')]?.extension || 'mp3'; + const preset = config.get('preset') ?? 'mp3'; + let presetSetting: { extension: string; ffmpegArgs: string[] } | null = null; + if (preset === 'opus') { + presetSetting = presets[preset]; + } - const filename = filenamify(`${name}.${extension}`, { + const filename = filenamify(`${name}.${presetSetting?.extension ?? 'mp3'}`, { replacement: '_', maxLength: 255, }); @@ -187,7 +191,7 @@ async function downloadSongUnsafe( return; } - const downloadOptions = { + const downloadOptions: FormatOptions = { type: 'audio', // Audio, video or video+audio quality: 'best', // Best, bestefficiency, 144p, 240p, 480p, 720p and so on. format: 'any', // Media container format @@ -197,7 +201,7 @@ async function downloadSongUnsafe( const stream = await info.download(downloadOptions); console.info( - `Downloading ${metadata.artist} - ${metadata.title} [${metadata.id}]`, + `Downloading ${metadata.artist} - ${metadata.title} [${metadata.videoId}]`, ); const iterableStream = Utils.streamToIterable(stream); @@ -206,10 +210,10 @@ async function downloadSongUnsafe( mkdirSync(dir); } - if (presets[config.get('preset')]) { + if (presetSetting) { const file = createWriteStream(filePath); let downloaded = 0; - const total = format.content_length; + const total: number = format.content_length ?? 1; for await (const chunk of iterableStream) { downloaded += chunk.length; @@ -223,18 +227,23 @@ async function downloadSongUnsafe( await ffmpegWriteTags( filePath, metadata, - presets[config.get('preset')]?.ffmpegArgs, + presetSetting.ffmpegArgs, ); sendFeedback(null, -1); } else { const fileBuffer = await iterableStreamToMP3( iterableStream, metadata, - format.content_length, + format.content_length ?? 0, sendFeedback, increasePlaylistProgress, ); - writeFileSync(filePath, await writeID3(fileBuffer, metadata, sendFeedback)); + if (fileBuffer) { + const buffer = await writeID3(Buffer.from(fileBuffer), metadata, sendFeedback); + if (buffer) { + writeFileSync(filePath, buffer); + } + } } sendFeedback(null, -1); @@ -242,11 +251,11 @@ async function downloadSongUnsafe( } async function iterableStreamToMP3( - stream, - metadata, - contentLength, - sendFeedback, - increasePlaylistProgress = () => { + stream: AsyncGenerator, + metadata: CustomSongInfo, + contentLength: number, + sendFeedback: (str: string, value?: number) => void, + increasePlaylistProgress: (value: number) => void = () => { }, ) { const chunks = []; @@ -294,66 +303,69 @@ async function iterableStreamToMP3( sendFeedback('Saving…'); return ffmpeg.FS('readFile', `${safeVideoName}.mp3`); - } catch (error) { - sendError(error, safeVideoName); + } catch (error: unknown) { + sendError(error as Error, safeVideoName); } finally { releaseFFmpegMutex(); } } -const getCoverBuffer = cache(async (url) => { +const getCoverBuffer = cache(async (url: string) => { const nativeImage = cropMaxWidth(await getImage(url)); return nativeImage && !nativeImage.isEmpty() ? nativeImage.toPNG() : null; }); -async function writeID3(buffer, metadata, sendFeedback) { +async function writeID3(buffer: Buffer, metadata: CustomSongInfo, sendFeedback: (str: string, value?: number) => void) { try { sendFeedback('Writing ID3 tags...'); - - const coverBuffer = await getCoverBuffer(metadata.image); - - const writer = new ID3Writer(buffer); + const tags: NodeID3.Tags = {}; // Create the metadata tags - writer.setFrame('TIT2', metadata.title).setFrame('TPE1', [metadata.artist]); + tags.title = metadata.title; + tags.artist = metadata.artist; + if (metadata.album) { - writer.setFrame('TALB', metadata.album); + tags.album = metadata.album; } + const coverBuffer = await getCoverBuffer(metadata.imageSrc ?? ''); if (coverBuffer) { - writer.setFrame('APIC', { - type: 3, - data: coverBuffer, - description: '', - }); + tags.image = { + mime: 'image/png', + type: { + id: TagConstants.AttachedPicture.PictureType.FRONT_COVER, + }, + description: 'thumbnail', + imageBuffer: coverBuffer, + }; } if (isEnabled('lyrics-genius')) { const lyrics = await fetchFromGenius(metadata); if (lyrics) { - writer.setFrame('USLT', { - description: '', - lyrics, - }); + tags.unsynchronisedLyrics = { + language: '', + text: lyrics, + }; } } if (metadata.trackId) { - writer.setFrame('TRCK', metadata.trackId); + tags.trackNumber = metadata.trackId; } - writer.addTag(); - return Buffer.from(writer.arrayBuffer); - } catch (error) { - sendError(error, `${metadata.artist} - ${metadata.title}`); + return NodeID3.write(tags, buffer); + } catch (error: unknown) { + sendError(error as Error, `${metadata.artist} - ${metadata.title}`); + return null; } } -async function downloadPlaylist(givenUrl) { +export async function downloadPlaylist(givenUrl?: string | URL) { try { - givenUrl = new URL(givenUrl); + givenUrl = new URL(givenUrl ?? ''); } catch { - givenUrl = undefined; + return; } const playlistId @@ -366,18 +378,18 @@ async function downloadPlaylist(givenUrl) { return; } - const sendFeedback = (message) => sendFeedback_(win, message); + const sendFeedback = (message?: unknown) => sendFeedback_(win, message); console.log(`trying to get playlist ID: '${playlistId}'`); sendFeedback('Getting playlist info…'); - let playlist; + let playlist: ytpl.Result; try { playlist = await ytpl(playlistId, { limit: config.get('playlistMaxItems') || Number.POSITIVE_INFINITY, }); - } catch (error) { + } catch (error: unknown) { sendError( - `Error getting playlist info: make sure it isn't a private or "Mixed for you" playlist\n\n${error}`, + Error(`Error getting playlist info: make sure it isn't a private or "Mixed for you" playlist\n\n${String(error)}`), ); return; } @@ -432,8 +444,8 @@ async function downloadPlaylist(givenUrl) { const progressStep = 1 / playlist.items.length; - const increaseProgress = (itemPercentage) => { - const currentProgress = (counter - 1) / playlist.items.length; + const increaseProgress = (itemPercentage: number) => { + const currentProgress = (counter - 1) / (playlist.items.length ?? 1); const newProgress = currentProgress + (progressStep * itemPercentage); win.setProgressBar(newProgress); }; @@ -445,11 +457,11 @@ async function downloadPlaylist(givenUrl) { await downloadSong( song.url, playlistFolder, - trackId, + trackId?.toString(), increaseProgress, ).catch((error) => sendError( - `Error downloading "${song.author.name} - ${song.title}":\n ${error}`, + new Error(`Error downloading "${song.author.name} - ${song.title}":\n ${error}`) ), ); @@ -457,8 +469,8 @@ async function downloadPlaylist(givenUrl) { setBadge(playlist.items.length - counter); counter++; } - } catch (error) { - sendError(error); + } catch (error: unknown) { + sendError(error as Error); } finally { win.setProgressBar(-1); // Close progress bar setBadge(0); // Close badge counter @@ -466,7 +478,7 @@ async function downloadPlaylist(givenUrl) { } } -async function ffmpegWriteTags(filePath, metadata, ffmpegArgs = []) { +async function ffmpegWriteTags(filePath: string, metadata: CustomSongInfo, ffmpegArgs: string[] = []) { const releaseFFmpegMutex = await ffmpegMutex.acquire(); try { @@ -481,16 +493,16 @@ async function ffmpegWriteTags(filePath, metadata, ffmpegArgs = []) { ...ffmpegArgs, filePath, ); - } catch (error) { - sendError(error); + } catch (error: unknown) { + sendError(error as Error); } finally { releaseFFmpegMutex(); } } -function getFFmpegMetadataArgs(metadata) { +function getFFmpegMetadataArgs(metadata: CustomSongInfo) { if (!metadata) { - return; + return []; } return [ @@ -504,7 +516,7 @@ function getFFmpegMetadataArgs(metadata) { // Playlist radio modifier needs to be cut from playlist ID const INVALID_PLAYLIST_MODIFIER = 'RDAMPL'; -const getPlaylistID = (aURL) => { +const getPlaylistID = (aURL: URL) => { const result = aURL?.searchParams.get('list') || aURL?.searchParams.get('playlist'); if (result?.startsWith(INVALID_PLAYLIST_MODIFIER)) { @@ -514,7 +526,7 @@ const getPlaylistID = (aURL) => { return result; }; -const getVideoId = (url) => { +const getVideoId = (url: URL | string): string | null => { if (typeof url === 'string') { url = new URL(url); } @@ -522,18 +534,21 @@ const getVideoId = (url) => { return url.searchParams.get('v'); }; -const getMetadata = (info) => ({ - id: info.basic_info.id, - title: cleanupName(info.basic_info.title), - artist: cleanupName(info.basic_info.author), - album: info.player_overlays?.browser_media_session?.album?.text, - image: info.basic_info.thumbnail?.find((t) => !t.url.endsWith('.webp'))?.url, +const getMetadata = (info: TrackInfo): CustomSongInfo => ({ + videoId: info.basic_info.id!, + title: cleanupName(info.basic_info.title!), + artist: cleanupName(info.basic_info.author!), + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-explicit-any + album: (info.player_overlays?.browser_media_session as any)?.album?.text as string | undefined, + imageSrc: info.basic_info.thumbnail?.find((t) => !t.url.endsWith('.webp'))?.url, + views: info.basic_info.view_count!, + songDuration: info.basic_info.duration!, }); // This is used to bypass age restrictions -const getAndroidTvInfo = async (id) => { +const getAndroidTvInfo = async (id: string): Promise => { const innertube = await Innertube.create({ - clientType: ClientType.TV_EMBEDDED, + client_type: ClientType.TV_EMBEDDED, generate_session_locally: true, retrieve_player: true, }); diff --git a/plugins/downloader/config.js b/plugins/downloader/config.js deleted file mode 100644 index 8ea738d8..00000000 --- a/plugins/downloader/config.js +++ /dev/null @@ -1,4 +0,0 @@ -const { PluginConfig } = require('../../config/dynamic'); - -const config = new PluginConfig('downloader'); -module.exports = { ...config }; diff --git a/plugins/downloader/config.ts b/plugins/downloader/config.ts new file mode 100644 index 00000000..ec22de5a --- /dev/null +++ b/plugins/downloader/config.ts @@ -0,0 +1,4 @@ +import { PluginConfig } from '../../config/dynamic'; + +const config = new PluginConfig('downloader'); +export default { ...config } as PluginConfig<'downloader'>; diff --git a/plugins/downloader/front.js b/plugins/downloader/front.ts similarity index 69% rename from plugins/downloader/front.js rename to plugins/downloader/front.ts index ef486a24..b53f5dfc 100644 --- a/plugins/downloader/front.js +++ b/plugins/downloader/front.ts @@ -1,11 +1,12 @@ -const { ipcRenderer } = require('electron'); +import { ipcRenderer } from 'electron'; -const { defaultConfig } = require('../../config'); -const { getSongMenu } = require('../../providers/dom-elements'); -const { ElementFromFile, templatePath } = require('../utils'); +import defaultConfig from '../../config/defaults'; +import { getSongMenu } from '../../providers/dom-elements'; +import { ElementFromFile, templatePath } from '../utils'; +import { getSongInfo } from '../../providers/song-info-front'; -let menu = null; -let progress = null; +let menu: Element | null = null; +let progress: Element | null = null; const downloadButton = ElementFromFile( templatePath(__dirname, 'download.html'), ); @@ -24,7 +25,7 @@ const menuObserver = new MutationObserver(() => { return; } - const menuUrl = document.querySelector('tp-yt-paper-listbox [tabindex="0"] #navigation-endpoint')?.href; + const menuUrl = (document.querySelector('tp-yt-paper-listbox [tabindex="0"] #navigation-endpoint') as HTMLAnchorElement | undefined)?.href; if (!menuUrl?.includes('watch?') && doneFirstLoad) { return; } @@ -42,7 +43,7 @@ const menuObserver = new MutationObserver(() => { // TODO: re-enable once contextIsolation is set to true // contextBridge.exposeInMainWorld("downloader", { // download: () => { -global.download = () => { +export const download = () => { let videoUrl = getSongMenu() // Selector of first button which is always "Start Radio" ?.querySelector('ytmusic-menu-navigation-item-renderer[tabindex="0"] #navigation-endpoint') @@ -57,21 +58,21 @@ global.download = () => { return; } } else { - videoUrl = global.songInfo.url || window.location.href; + videoUrl = getSongInfo().url || window.location.href; } ipcRenderer.send('download-song', videoUrl); }; -module.exports = () => { +export default () => { document.addEventListener('apiLoaded', () => { - menuObserver.observe(document.querySelector('ytmusic-popup-container'), { + menuObserver.observe(document.querySelector('ytmusic-popup-container')!, { childList: true, subtree: true, }); }, { once: true, passive: true }); - ipcRenderer.on('downloader-feedback', (_, feedback) => { + ipcRenderer.on('downloader-feedback', (_, feedback: string) => { if (progress) { progress.innerHTML = feedback || 'Download'; } else { diff --git a/plugins/downloader/menu.js b/plugins/downloader/menu.ts similarity index 76% rename from plugins/downloader/menu.js rename to plugins/downloader/menu.ts index 57953fe9..be5f8430 100644 --- a/plugins/downloader/menu.js +++ b/plugins/downloader/menu.ts @@ -1,10 +1,12 @@ -const { dialog } = require('electron'); +import { dialog } from 'electron'; -const { downloadPlaylist } = require('./back'); -const { defaultMenuDownloadLabel, getFolder, presets } = require('./utils'); -const config = require('./config'); +import { downloadPlaylist } from './back'; +import { defaultMenuDownloadLabel, getFolder, presets } from './utils'; +import config from './config'; -module.exports = () => [ +import { MenuTemplate } from '../../menu'; + +export default (): MenuTemplate => [ { label: defaultMenuDownloadLabel, click: () => downloadPlaylist(), diff --git a/plugins/downloader/utils.js b/plugins/downloader/utils.ts similarity index 57% rename from plugins/downloader/utils.js rename to plugins/downloader/utils.ts index 2b311d60..7de1f096 100644 --- a/plugins/downloader/utils.js +++ b/plugins/downloader/utils.ts @@ -1,14 +1,14 @@ -const { app } = require('electron'); -const is = require('electron-is'); +import { app, BrowserWindow } from 'electron'; +import is from 'electron-is'; -module.exports.getFolder = (customFolder) => customFolder || app.getPath('downloads'); -module.exports.defaultMenuDownloadLabel = 'Download playlist'; +export const getFolder = (customFolder: string) => customFolder || app.getPath('downloads'); +export const defaultMenuDownloadLabel = 'Download playlist'; -module.exports.sendFeedback = (win, message) => { +export const sendFeedback = (win: BrowserWindow, message?: unknown) => { win.webContents.send('downloader-feedback', message); }; -module.exports.cropMaxWidth = (image) => { +export const cropMaxWidth = (image: Electron.NativeImage) => { const imageSize = image.getSize(); // Standart youtube artwork width with margins from both sides is 280 + 720 + 280 if (imageSize.width === 1280 && imageSize.height === 720) { @@ -24,7 +24,7 @@ module.exports.cropMaxWidth = (image) => { }; // Presets for FFmpeg -module.exports.presets = { +export const presets = { 'None (defaults to mp3)': undefined, 'opus': { extension: 'opus', @@ -32,7 +32,7 @@ module.exports.presets = { }, }; -module.exports.setBadge = (n) => { +export const setBadge = (n: number) => { if (is.linux() || is.macOS()) { app.setBadgeCount(n); } diff --git a/plugins/in-app-menu/back.js b/plugins/in-app-menu/back.js deleted file mode 100644 index 9b5e4577..00000000 --- a/plugins/in-app-menu/back.js +++ /dev/null @@ -1,23 +0,0 @@ -const path = require('node:path'); - -const electronLocalshortcut = require('electron-localshortcut'); -const { setupTitlebar, attachTitlebarToWindow } = require('custom-electron-titlebar/main'); - -const { injectCSS } = require('../utils'); - -setupTitlebar(); - -// Tracks menu visibility - -module.exports = (win) => { - // Css for custom scrollbar + disable drag area(was causing bugs) - injectCSS(win.webContents, path.join(__dirname, 'style.css')); - - win.once('ready-to-show', () => { - attachTitlebarToWindow(win); - - electronLocalshortcut.register(win, '`', () => { - win.webContents.send('toggleMenu'); - }); - }); -}; diff --git a/plugins/in-app-menu/back.ts b/plugins/in-app-menu/back.ts new file mode 100644 index 00000000..3fd13edf --- /dev/null +++ b/plugins/in-app-menu/back.ts @@ -0,0 +1,27 @@ +import path from 'node:path'; + +import { register } from 'electron-localshortcut'; +// eslint-disable-next-line import/no-unresolved +import { attachTitlebarToWindow, setupTitlebar } from 'custom-electron-titlebar/main'; + +import { BrowserWindow } from 'electron'; + +import { injectCSS } from '../utils'; + + +setupTitlebar(); + +// Tracks menu visibility + +module.exports = (win: BrowserWindow) => { + // Css for custom scrollbar + disable drag area(was causing bugs) + injectCSS(win.webContents, path.join(__dirname, 'style.css')); + + win.once('ready-to-show', () => { + attachTitlebarToWindow(win); + + register(win, '`', () => { + win.webContents.send('toggleMenu'); + }); + }); +}; diff --git a/plugins/in-app-menu/custom-electron-titlebar.d.ts b/plugins/in-app-menu/custom-electron-titlebar.d.ts new file mode 100644 index 00000000..f724278d --- /dev/null +++ b/plugins/in-app-menu/custom-electron-titlebar.d.ts @@ -0,0 +1,9 @@ +declare module 'custom-electron-titlebar' { + // eslint-disable-next-line import/no-unresolved + import OriginalTitlebar from 'custom-electron-titlebar/dist/titlebar'; + // eslint-disable-next-line import/no-unresolved + import { Color as OriginalColor } from 'custom-electron-titlebar/dist/vs/base/common/color'; + + export const Color: typeof OriginalColor; + export const Titlebar: typeof OriginalTitlebar; +} diff --git a/plugins/in-app-menu/front.js b/plugins/in-app-menu/front.js deleted file mode 100644 index 83d8fe38..00000000 --- a/plugins/in-app-menu/front.js +++ /dev/null @@ -1,78 +0,0 @@ -const { ipcRenderer } = require('electron'); -const { Titlebar, Color } = require('custom-electron-titlebar'); - -const config = require('../../config'); -const { isEnabled } = require('../../config/plugins'); - -function $(selector) { - return document.querySelector(selector); -} - -module.exports = () => { - const visible = () => Boolean($('.cet-menubar').firstChild); - const bar = new Titlebar({ - icon: 'https://cdn-icons-png.flaticon.com/512/5358/5358672.png', - backgroundColor: Color.fromHex('#050505'), - itemBackgroundColor: Color.fromHex('#1d1d1d'), - svgColor: Color.WHITE, - menu: config.get('options.hideMenu') ? null : undefined, - }); - bar.updateTitle(' '); - document.title = 'Youtube Music'; - - const toggleMenu = () => { - if (visible()) { - bar.updateMenu(null); - } else { - bar.refreshMenu(); - } - }; - - $('.cet-window-icon').addEventListener('click', toggleMenu); - ipcRenderer.on('toggleMenu', toggleMenu); - - ipcRenderer.on('refreshMenu', () => { - if (visible()) { - bar.refreshMenu(); - } - }); - - if (isEnabled('picture-in-picture')) { - ipcRenderer.on('pip-toggle', () => { - bar.refreshMenu(); - }); - } - - // Increases the right margin of Navbar background when the scrollbar is visible to avoid blocking it (z-index doesn't affect it) - document.addEventListener('apiLoaded', () => { - setNavbarMargin(); - const playPageObserver = new MutationObserver(setNavbarMargin); - playPageObserver.observe($('ytmusic-app-layout'), { attributeFilter: ['player-page-open_', 'playerPageOpen_'] }); - setupSearchOpenObserver(); - setupMenuOpenObserver(); - }, { once: true, passive: true }); -}; - -function setupSearchOpenObserver() { - const searchOpenObserver = new MutationObserver((mutations) => { - $('#nav-bar-background').style.webkitAppRegion - = mutations[0].target.opened ? 'no-drag' : 'drag'; - }); - searchOpenObserver.observe($('ytmusic-search-box'), { attributeFilter: ['opened'] }); -} - -function setupMenuOpenObserver() { - const menuOpenObserver = new MutationObserver(() => { - $('#nav-bar-background').style.webkitAppRegion - = [...$('.cet-menubar').childNodes].some((c) => c.classList.contains('open')) - ? 'no-drag' : 'drag'; - }); - menuOpenObserver.observe($('.cet-menubar'), { subtree: true, attributeFilter: ['class'] }); -} - -function setNavbarMargin() { - $('#nav-bar-background').style.right - = $('ytmusic-app-layout').playerPageOpen_ - ? '0px' - : '12px'; -} diff --git a/plugins/in-app-menu/front.ts b/plugins/in-app-menu/front.ts new file mode 100644 index 00000000..61c09387 --- /dev/null +++ b/plugins/in-app-menu/front.ts @@ -0,0 +1,96 @@ +import { ipcRenderer, Menu } from 'electron'; +// eslint-disable-next-line import/no-unresolved +import { Color, Titlebar } from 'custom-electron-titlebar'; + +import config from '../../config'; +import { isEnabled } from '../../config/plugins'; + +function $(selector: string) { + return document.querySelector(selector); +} + +module.exports = () => { + const visible = () => Boolean($('.cet-menubar')?.firstChild); + const bar = new Titlebar({ + icon: 'https://cdn-icons-png.flaticon.com/512/5358/5358672.png', + backgroundColor: Color.fromHex('#050505'), + itemBackgroundColor: Color.fromHex('#1d1d1d') , + svgColor: Color.WHITE, + menu: config.get('options.hideMenu') ? null as unknown as Menu : undefined, + }); + bar.updateTitle(' '); + document.title = 'Youtube Music'; + + const toggleMenu = () => { + if (visible()) { + bar.updateMenu(null as unknown as Menu); + } else { + bar.refreshMenu(); + } + }; + + $('.cet-window-icon')?.addEventListener('click', toggleMenu); + ipcRenderer.on('toggleMenu', toggleMenu); + + ipcRenderer.on('refreshMenu', () => { + if (visible()) { + bar.refreshMenu(); + } + }); + + if (isEnabled('picture-in-picture')) { + ipcRenderer.on('pip-toggle', () => { + bar.refreshMenu(); + }); + } + + // Increases the right margin of Navbar background when the scrollbar is visible to avoid blocking it (z-index doesn't affect it) + document.addEventListener('apiLoaded', () => { + setNavbarMargin(); + const playPageObserver = new MutationObserver(setNavbarMargin); + const appLayout = $('ytmusic-app-layout'); + if (appLayout) { + playPageObserver.observe(appLayout, { attributeFilter: ['player-page-open_', 'playerPageOpen_'] }); + } + setupSearchOpenObserver(); + setupMenuOpenObserver(); + }, { once: true, passive: true }); +}; + +function setupSearchOpenObserver() { + const searchOpenObserver = new MutationObserver((mutations) => { + ($('#nav-bar-background') as HTMLElement) + .style + .setProperty( + '-webkit-app-region', + (mutations[0].target as HTMLElement & { opened: boolean }).opened ? 'no-drag' : 'drag', + ); + }); + const searchBox = $('ytmusic-search-box'); + if (searchBox) { + searchOpenObserver.observe(searchBox, { attributeFilter: ['opened'] }); + } +} + +function setupMenuOpenObserver() { + const cetMenubar = $('.cet-menubar'); + if (cetMenubar) { + const menuOpenObserver = new MutationObserver(() => { + ($('#nav-bar-background') as HTMLElement) + .style + .setProperty( + '-webkit-app-region', + Array.from(cetMenubar.childNodes).some((c) => (c as HTMLElement).classList.contains('open')) ? 'no-drag' : 'drag', + ); + }); + menuOpenObserver.observe(cetMenubar, { subtree: true, attributeFilter: ['class'] }); + } +} + +function setNavbarMargin() { + const navBarBackground = $('#nav-bar-background') as HTMLElement; + navBarBackground.style.right + = ($('ytmusic-app-layout') as HTMLElement & { playerPageOpen_: boolean }).playerPageOpen_ + ? '0px' + : '12px'; +} diff --git a/plugins/last-fm/back.js b/plugins/last-fm/back.ts similarity index 53% rename from plugins/last-fm/back.js rename to plugins/last-fm/back.ts index 7593f1c1..2a83d9ee 100644 --- a/plugins/last-fm/back.js +++ b/plugins/last-fm/back.ts @@ -1,32 +1,41 @@ -const { shell, net } = require('electron'); -const md5 = require('md5'); +import { BrowserWindow, net, shell } from 'electron'; +import md5 from 'md5'; -const { setOptions } = require('../../config/plugins'); -const registerCallback = require('../../providers/song-info'); -const defaultConfig = require('../../config/defaults'); +import { setOptions } from '../../config/plugins'; +import registerCallback, { SongInfo } from '../../providers/song-info'; +import defaultConfig from '../../config/defaults'; +import config from '../../config'; -const createFormData = (parameters) => { +const LastFMOptionsObj = config.get('plugins.last-fm'); +type LastFMOptions = typeof LastFMOptionsObj; + +interface LastFmData { + method: string, + timestamp?: number, +} + +const createFormData = (parameters: Record) => { // Creates the body for in the post request const formData = new URLSearchParams(); for (const key in parameters) { - formData.append(key, parameters[key]); + formData.append(key, String(parameters[key])); } return formData; }; -const createQueryString = (parameters, apiSignature) => { +const createQueryString = (parameters: Record, apiSignature: string) => { // Creates a querystring const queryData = []; parameters.api_sig = apiSignature; for (const key in parameters) { - queryData.push(`${encodeURIComponent(key)}=${encodeURIComponent(parameters[key])}`); + queryData.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(parameters[key]))}`); } return '?' + queryData.join('&'); }; -const createApiSig = (parameters, secret) => { +const createApiSig = (parameters: Record, secret: string) => { // This function creates the api signature, see: https://www.last.fm/api/authspec const keys = []; for (const key in parameters) { @@ -40,7 +49,7 @@ const createApiSig = (parameters, secret) => { continue; } - sig += `${key}${parameters[key]}`; + sig += `${key}${String(parameters[key])}`; } sig += secret; @@ -48,7 +57,7 @@ const createApiSig = (parameters, secret) => { return sig; }; -const createToken = async ({ apiKey, apiRoot, secret }) => { +const createToken = async ({ api_key: apiKey, api_root: apiRoot, secret }: LastFMOptions) => { // Creates and stores the auth token const data = { method: 'auth.gettoken', @@ -56,20 +65,18 @@ const createToken = async ({ apiKey, apiRoot, secret }) => { format: 'json', }; const apiSigature = createApiSig(data, secret); - let response = await net.fetch(`${apiRoot}${createQueryString(data, apiSigature)}`); - response = await response.json(); - return response?.token; + const response = await net.fetch(`${apiRoot}${createQueryString(data, apiSigature)}`); + const json = await response.json() as Record; + return json?.token; }; -const authenticate = async (config) => { +const authenticateAndGetToken = async (config: LastFMOptions) => { // Asks the user for authentication - config.token = await createToken(config); - setOptions('last-fm', config); - shell.openExternal(`https://www.last.fm/api/auth/?api_key=${config.api_key}&token=${config.token}`); - return config; + await shell.openExternal(`https://www.last.fm/api/auth/?api_key=${config.api_key}&token=${config.token}`); + return await createToken(config); }; -const getAndSetSessionKey = async (config) => { +const getAndSetSessionKey = async (config: LastFMOptions) => { // Get and store the session key const data = { api_key: config.api_key, @@ -78,18 +85,25 @@ const getAndSetSessionKey = async (config) => { token: config.token, }; const apiSignature = createApiSig(data, config.secret); - let res = await net.fetch(`${config.api_root}${createQueryString(data, apiSignature)}`); - res = await res.json(); - if (res.error) { - await authenticate(config); + const response = await net.fetch(`${config.api_root}${createQueryString(data, apiSignature)}`); + const json = await response.json() as { + error?: string, + session?: { + key: string, + } + }; + if (json.error) { + config.token = await authenticateAndGetToken(config); + setOptions('last-fm', config); + } + if (json.session) { + config.session_key = json?.session?.key; + setOptions('last-fm', config); } - - config.session_key = res?.session?.key; - setOptions('last-fm', config); return config; }; -const postSongDataToAPI = async (songInfo, config, data) => { +const postSongDataToAPI = async (songInfo: SongInfo, config: LastFMOptions, data: LastFmData) => { // This sends a post request to the api, and adds the common data if (!config.session_key) { await getAndSetSessionKey(config); @@ -101,6 +115,7 @@ const postSongDataToAPI = async (songInfo, config, data) => { artist: songInfo.artist, ...(songInfo.album ? { album: songInfo.album } : undefined), // Will be undefined if current song is a video api_key: config.api_key, + api_sig: '', sk: config.session_key, format: 'json', ...data, @@ -108,26 +123,32 @@ const postSongDataToAPI = async (songInfo, config, data) => { postData.api_sig = createApiSig(postData, config.secret); net.fetch('https://ws.audioscrobbler.com/2.0/', { method: 'POST', body: createFormData(postData) }) - .catch((error) => { - if (error.response.data.error === 9) { + .catch(async (error: { + response?: { + data?: { + error: number, + } + } + }) => { + if (error?.response?.data?.error === 9) { // Session key is invalid, so remove it from the config and reauthenticate config.session_key = undefined; + config.token = await authenticateAndGetToken(config); setOptions('last-fm', config); - authenticate(config); } }); }; -const addScrobble = (songInfo, config) => { +const addScrobble = (songInfo: SongInfo, config: LastFMOptions) => { // This adds one scrobbled song to last.fm const data = { method: 'track.scrobble', - timestamp: Math.trunc((Date.now() - songInfo.elapsedSeconds) / 1000), + timestamp: Math.trunc((Date.now() - (songInfo.elapsedSeconds ?? 0)) / 1000), }; postSongDataToAPI(songInfo, config, data); }; -const setNowPlaying = (songInfo, config) => { +const setNowPlaying = (songInfo: SongInfo, config: LastFMOptions) => { // This sets the now playing status in last.fm const data = { method: 'track.updateNowPlaying', @@ -136,9 +157,9 @@ const setNowPlaying = (songInfo, config) => { }; // This will store the timeout that will trigger addScrobble -let scrobbleTimer; +let scrobbleTimer: NodeJS.Timeout | undefined; -const lastfm = async (_win, config) => { +const lastfm = async (_win: BrowserWindow, config: LastFMOptions) => { if (!config.api_root) { // Settings are not present, creating them with the default values config = defaultConfig.plugins['last-fm']; @@ -156,11 +177,11 @@ const lastfm = async (_win, config) => { clearTimeout(scrobbleTimer); if (!songInfo.isPaused) { setNowPlaying(songInfo, config); - // Scrobble when the song is half way through, or has passed the 4 minute mark + // Scrobble when the song is halfway through, or has passed the 4-minute mark const scrobbleTime = Math.min(Math.ceil(songInfo.songDuration / 2), 4 * 60); - if (scrobbleTime > songInfo.elapsedSeconds) { + if (scrobbleTime > (songInfo.elapsedSeconds ?? 0)) { // Scrobble still needs to happen - const timeToWait = (scrobbleTime - songInfo.elapsedSeconds) * 1000; + const timeToWait = (scrobbleTime - (songInfo.elapsedSeconds ?? 0)) * 1000; scrobbleTimer = setTimeout(addScrobble, timeToWait, songInfo, config); } } diff --git a/plugins/lyrics-genius/back.js b/plugins/lyrics-genius/back.ts similarity index 65% rename from plugins/lyrics-genius/back.js rename to plugins/lyrics-genius/back.ts index 1913c193..b443b2fb 100644 --- a/plugins/lyrics-genius/back.js +++ b/plugins/lyrics-genius/back.ts @@ -1,36 +1,43 @@ -const { join } = require('node:path'); +import { join } from 'node:path'; -const { ipcMain, net } = require('electron'); -const is = require('electron-is'); -const { convert } = require('html-to-text'); +import { BrowserWindow, ipcMain, net } from 'electron'; +import is from 'electron-is'; +import { convert } from 'html-to-text'; -const { cleanupName } = require('../../providers/song-info'); -const { injectCSS } = require('../utils'); +import { GetGeniusLyric } from './types'; + +import { cleanupName, SongInfo } from '../../providers/song-info'; + +import { injectCSS } from '../utils'; +import config from '../../config'; const eastAsianChars = /\p{Script=Katakana}|\p{Script=Hiragana}|\p{Script=Hangul}|\p{Script=Han}/u; let revRomanized = false; -module.exports = async (win, options) => { +const LyricGeniusTypeObj = config.get('plugins.lyric-genius'); +export type LyricGeniusType = typeof LyricGeniusTypeObj; + +export default (win: BrowserWindow, options: LyricGeniusType) => { if (options.romanizedLyrics) { revRomanized = true; } injectCSS(win.webContents, join(__dirname, 'style.css')); - ipcMain.on('search-genius-lyrics', async (event, extractedSongInfo) => { - const metadata = JSON.parse(extractedSongInfo); - event.returnValue = await fetchFromGenius(metadata); + ipcMain.handle('search-genius-lyrics', async (_, extractedSongInfo: string) => { + const metadata = JSON.parse(extractedSongInfo) as SongInfo; + return await fetchFromGenius(metadata); }); }; -const toggleRomanized = () => { +export const toggleRomanized = () => { revRomanized = !revRomanized; }; -const fetchFromGenius = async (metadata) => { +export const fetchFromGenius = async (metadata: SongInfo) => { const songTitle = `${cleanupName(metadata.title)}`; const songArtist = `${cleanupName(metadata.artist)}`; - let lyrics; + let lyrics: string | null; /* Uses Regex to test the title and artist first for said characters if romanization is enabled. Otherwise normal Genius Lyrics behavior is observed. @@ -46,7 +53,7 @@ const fetchFromGenius = async (metadata) => { /* If the romanization toggle is on, and we did not detect any characters in the title or artist, we do a check for characters in the lyrics themselves. If this check proves true, we search for Romanized lyrics. */ - if (revRomanized && !hasAsianChars && eastAsianChars.test(lyrics)) { + if (revRomanized && !hasAsianChars && lyrics && eastAsianChars.test(lyrics)) { lyrics = await getLyricsList(`${songArtist} ${songTitle} Romanized`); } @@ -58,7 +65,7 @@ const fetchFromGenius = async (metadata) => { * @param {*} queryString * @returns The lyrics of the first song found using the Genius-Lyrics API */ -const getLyricsList = async (queryString) => { +const getLyricsList = async (queryString: string): Promise => { const response = await net.fetch( `https://genius.com/api/search/multi?per_page=5&q=${encodeURIComponent(queryString)}`, ); @@ -69,17 +76,17 @@ const getLyricsList = async (queryString) => { /* Fetch the first URL with the api, giving a collection of song results. Pick the first song, parsing the json given by the API. */ - const info = await response.json(); - let url = ''; - try { - url = info.response.sections.find((section) => section.type === 'song') - .hits[0].result.url; - } catch { + const info = await response.json() as GetGeniusLyric; + const url = info + .response + .sections + .find((section) => section.type === 'song')?.hits[0].result.url; + + if (url) { + return await getLyrics(url); + } else { return null; } - - const lyrics = await getLyrics(url); - return lyrics; }; /** @@ -87,7 +94,7 @@ const getLyricsList = async (queryString) => { * @param {*} url * @returns The lyrics of the song URL provided, null if none */ -const getLyrics = async (url) => { +const getLyrics = async (url: string): Promise => { const response = await net.fetch(url); if (!response.ok) { return null; @@ -116,6 +123,3 @@ const getLyrics = async (url) => { }, }); }; - -module.exports.toggleRomanized = toggleRomanized; -module.exports.fetchFromGenius = fetchFromGenius; diff --git a/plugins/lyrics-genius/front.js b/plugins/lyrics-genius/front.ts similarity index 63% rename from plugins/lyrics-genius/front.js rename to plugins/lyrics-genius/front.ts index b7d0bf7b..c87daf23 100644 --- a/plugins/lyrics-genius/front.js +++ b/plugins/lyrics-genius/front.ts @@ -1,8 +1,8 @@ -const { ipcRenderer } = require('electron'); -const is = require('electron-is'); +import { ipcRenderer } from 'electron'; +import is from 'electron-is'; -module.exports = () => { - ipcRenderer.on('update-song-info', (_, extractedSongInfo) => setTimeout(() => { +export default () => { + ipcRenderer.on('update-song-info', (_, extractedSongInfo: string) => setTimeout(async () => { const tabList = document.querySelectorAll('tp-yt-paper-tab'); const tabs = { upNext: tabList[0], @@ -17,10 +17,10 @@ module.exports = () => { let hasLyrics = true; - const lyrics = ipcRenderer.sendSync( + const lyrics = await ipcRenderer.invoke( 'search-genius-lyrics', extractedSongInfo, - ); + ) as string; if (!lyrics) { // Delete previous lyrics if tab is open and couldn't get new lyrics checkLyricsContainer(() => { @@ -40,17 +40,21 @@ module.exports = () => { checkLyricsContainer(); - tabs.lyrics.addEventListener('click', () => { + const lyricsTabHandler = () => { const tabContainer = document.querySelector('ytmusic-tab-renderer'); - const observer = new MutationObserver((_, observer) => { - checkLyricsContainer(() => observer.disconnect()); - }); - observer.observe(tabContainer, { - attributes: true, - childList: true, - subtree: true, - }); - }); + if (tabContainer) { + const observer = new MutationObserver((_, observer) => { + checkLyricsContainer(() => observer.disconnect()); + }); + observer.observe(tabContainer, { + attributes: true, + childList: true, + subtree: true, + }); + } + }; + + tabs.lyrics.addEventListener('click', lyricsTabHandler); function checkLyricsContainer(callback = () => { }) { @@ -63,7 +67,7 @@ module.exports = () => { } } - function setLyrics(lyricsContainer) { + function setLyrics(lyricsContainer: Element) { lyricsContainer.innerHTML = `
${ hasLyrics @@ -74,15 +78,20 @@ module.exports = () => {
`; if (hasLyrics) { - lyricsContainer.querySelector('.footer').textContent = 'Source: Genius'; - enableLyricsTab(); + const footer = lyricsContainer.querySelector('.footer'); + if (footer) { + footer.textContent = 'Source: Genius'; + enableLyricsTab(); + } } } - function setTabsOnclick(callback) { + const defaultHandler = () => {}; + + function setTabsOnclick(callback: EventListenerOrEventListenerObject | undefined) { for (const tab of [tabs.upNext, tabs.discover]) { if (tab) { - tab.addEventListener('click', callback); + tab.addEventListener('click', callback ?? defaultHandler); } } } diff --git a/plugins/lyrics-genius/menu.js b/plugins/lyrics-genius/menu.js deleted file mode 100644 index 1c771cbe..00000000 --- a/plugins/lyrics-genius/menu.js +++ /dev/null @@ -1,16 +0,0 @@ -const { toggleRomanized } = require('./back'); - -const { setOptions } = require('../../config/plugins'); - -module.exports = (win, options) => [ - { - label: 'Romanized Lyrics', - type: 'checkbox', - checked: options.romanizedLyrics, - click(item) { - options.romanizedLyrics = item.checked; - setOptions('lyrics-genius', options); - toggleRomanized(); - }, - }, -]; diff --git a/plugins/lyrics-genius/menu.ts b/plugins/lyrics-genius/menu.ts new file mode 100644 index 00000000..6dc6cd70 --- /dev/null +++ b/plugins/lyrics-genius/menu.ts @@ -0,0 +1,18 @@ +import { BrowserWindow, MenuItem } from 'electron'; + +import { LyricGeniusType, toggleRomanized } from './back'; + +import { setOptions } from '../../config/plugins'; + +module.exports = (win: BrowserWindow, options: LyricGeniusType) => [ + { + label: 'Romanized Lyrics', + type: 'checkbox', + checked: options.romanizedLyrics, + click(item: MenuItem) { + options.romanizedLyrics = item.checked; + setOptions('lyrics-genius', options); + toggleRomanized(); + }, + }, +]; diff --git a/plugins/lyrics-genius/types.ts b/plugins/lyrics-genius/types.ts new file mode 100644 index 00000000..fac46ada --- /dev/null +++ b/plugins/lyrics-genius/types.ts @@ -0,0 +1,121 @@ +export interface GetGeniusLyric { + meta: Meta; + response: Response; +} + +export interface Meta { + status: number; +} + +export interface Response { + sections: Section[]; +} + +export interface Section { + type: string; + hits: Hit[]; +} + +export interface Hit { + highlights: Highlight[]; + index: Index; + type: Index; + result: Result; +} + +export interface Highlight { + property: string; + value: string; + snippet: boolean; + ranges: Range[]; +} + +export interface Range { + start: number; + end: number; +} + +export enum Index { + Album = 'album', + Lyric = 'lyric', + Song = 'song', +} + +export interface Result { + _type: Index; + annotation_count?: number; + api_path: string; + artist_names?: string; + full_title: string; + header_image_thumbnail_url?: string; + header_image_url?: string; + id: number; + instrumental?: boolean; + lyrics_owner_id?: number; + lyrics_state?: LyricsState; + lyrics_updated_at?: number; + path?: string; + pyongs_count?: number | null; + relationships_index_url?: string; + release_date_components: ReleaseDateComponents; + release_date_for_display: string; + release_date_with_abbreviated_month_for_display?: string; + song_art_image_thumbnail_url?: string; + song_art_image_url?: string; + stats?: Stats; + title?: string; + title_with_featured?: string; + updated_by_human_at?: number; + url: string; + featured_artists?: string[]; + primary_artist?: Artist; + cover_art_thumbnail_url?: string; + cover_art_url?: string; + name?: string; + name_with_artist?: string; + artist?: Artist; +} + +export interface Artist { + _type: Type; + api_path: string; + header_image_url: string; + id: number; + image_url: string; + index_character: IndexCharacter; + is_meme_verified: boolean; + is_verified: boolean; + name: string; + slug: string; + url: string; + iq?: number; +} + +// TODO: Add more types +export enum Type { + Artist = 'artist', +} + +// TODO: Add more index characters +export enum IndexCharacter { + G = 'g', + Y = 'y', +} + +// TODO: Add more states +export enum LyricsState { + Complete = 'complete', +} + +export interface ReleaseDateComponents { + year: number; + month: number; + day: number | null; +} + +export interface Stats { + unreviewed_annotations: number; + concurrents?: number; + hot: boolean; + pageviews?: number; +} diff --git a/plugins/tuna-obs/back.ts b/plugins/tuna-obs/back.ts index 8df6fd98..76c26997 100644 --- a/plugins/tuna-obs/back.ts +++ b/plugins/tuna-obs/back.ts @@ -61,7 +61,7 @@ module.exports = (win: BrowserWindow) => { } data.duration = secToMilisec(songInfo.songDuration); - data.progress = secToMilisec(songInfo.elapsedSeconds); + data.progress = secToMilisec(songInfo.elapsedSeconds ?? 0); data.cover = songInfo.imageSrc ?? ''; data.cover_url = songInfo.imageSrc ?? ''; data.album_url = songInfo.imageSrc ?? ''; diff --git a/providers/song-info-front.ts b/providers/song-info-front.ts index 9e51aa20..602d6d49 100644 --- a/providers/song-info-front.ts +++ b/providers/song-info-front.ts @@ -7,9 +7,10 @@ import { YoutubePlayer } from '../types/youtube-player'; import { GetState } from '../types/datahost-get-state'; let songInfo: SongInfo = {} as SongInfo; +export const getSongInfo = () => songInfo; const $ = (s: string): E => document.querySelector(s) as E; -const $$ = (s: string): E[] => [...document.querySelectorAll(s)!] as E[]; +const $$ = (s: string): E[] => Array.from(document.querySelectorAll(s)); ipcRenderer.on('update-song-info', async (_, extractedSongInfo: string) => { songInfo = JSON.parse(extractedSongInfo) as SongInfo; diff --git a/providers/song-info.ts b/providers/song-info.ts index 486daef9..4ffc1110 100644 --- a/providers/song-info.ts +++ b/providers/song-info.ts @@ -9,16 +9,16 @@ export interface SongInfo { title: string; artist: string; views: number; - uploadDate: string; + uploadDate?: string; imageSrc?: string | null; image?: Electron.NativeImage | null; isPaused?: boolean; songDuration: number; - elapsedSeconds: number; - url: string; + elapsedSeconds?: number; + url?: string; album?: string | null; videoId: string; - playlistId: string; + playlistId?: string; } // Fill songInfo with empty values diff --git a/tsconfig.json b/tsconfig.json index d4d53dcd..18fce570 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "target": "ESNext", - "lib": ["dom"], + "lib": ["dom", "es2022"], "module": "CommonJS", "allowSyntheticDefaultImports": true, "esModuleInterop": true, From c0d7972da3d0099fa360e594ff23097244543148 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Sun, 3 Sep 2023 21:05:22 +0900 Subject: [PATCH 20/70] fix: Remove upgrade button https://github.com/th-ch/youtube-music/pull/1206 --- preload.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/preload.ts b/preload.ts index 7c250793..b8da3363 100644 --- a/preload.ts +++ b/preload.ts @@ -155,10 +155,11 @@ function onApiLoaded() { // Remove upgrade button if (config.get('options.removeUpgradeButton')) { - const upgradeButton: HTMLElement | null = $('ytmusic-pivot-bar-item-renderer[tab-id="SPunlimited"]'); - if (upgradeButton) { - upgradeButton.style.display = 'none'; - } + const styles = document.createElement('style'); + styles.innerHTML = `ytmusic-guide-section-renderer #items ytmusic-guide-entry-renderer:last-child { + display: none; + }`; + document.head.appendChild(styles); } // Hide / Force show like buttons From 53f5bda3825e1b233a1d2793e2ecb48d0b3858b1 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Mon, 4 Sep 2023 02:27:53 +0900 Subject: [PATCH 21/70] feat: migration to TypeScript FINAL Co-authored-by: Su-Yong --- config/defaults.ts | 15 +- custom-electron-prompt.d.ts | 63 +++-- menu.ts | 7 +- package-lock.json | 250 ++++++++++++++++-- package.json | 18 +- plugins/adblocker/back.ts | 5 +- plugins/captions-selector/front.ts | 2 +- plugins/crossfade/front.ts | 2 +- plugins/crossfade/menu.ts | 2 +- plugins/discord/back.ts | 5 +- plugins/discord/menu.ts | 6 +- plugins/downloader/back.ts | 2 +- plugins/downloader/menu.ts | 2 +- plugins/in-app-menu/back.ts | 2 +- plugins/in-app-menu/front.ts | 4 +- plugins/last-fm/back.ts | 7 +- plugins/lyrics-genius/back.ts | 6 +- plugins/lyrics-genius/menu.ts | 2 +- plugins/navigation/{back.js => back.ts} | 14 +- plugins/navigation/{front.js => front.ts} | 8 +- plugins/no-google-login/back.js | 7 - plugins/no-google-login/back.ts | 9 + .../no-google-login/{front.js => front.ts} | 6 +- plugins/notifications/back.js | 49 ---- plugins/notifications/back.ts | 51 ++++ plugins/notifications/config.js | 5 - plugins/notifications/config.ts | 5 + .../{interactive.js => interactive.ts} | 85 +++--- plugins/notifications/{menu.js => menu.ts} | 25 +- plugins/notifications/{utils.js => utils.ts} | 43 +-- plugins/picture-in-picture/back.ts | 6 +- plugins/picture-in-picture/front.ts | 103 +++++--- ...yboardevent-from-electron-accelerator.d.ts | 12 + .../keyboardevents-areequal.d.ts | 14 + plugins/picture-in-picture/menu.ts | 16 +- plugins/playback-speed/{front.js => front.ts} | 52 ++-- plugins/precise-volume/{back.js => back.ts} | 19 +- plugins/precise-volume/{front.js => front.ts} | 101 ++++--- plugins/precise-volume/{menu.js => menu.ts} | 34 ++- plugins/precise-volume/preload.js | 32 --- plugins/precise-volume/preload.ts | 41 +++ plugins/quality-changer/{back.js => back.ts} | 6 +- .../quality-changer/{front.js => front.ts} | 32 +-- plugins/shortcuts/{back.js => back.ts} | 31 ++- plugins/shortcuts/{menu.js => menu.ts} | 23 +- plugins/shortcuts/mpris-service.d.ts | 129 +++++++++ plugins/shortcuts/{mpris.js => mpris.ts} | 54 ++-- plugins/skip-silences/front.ts | 5 +- plugins/sponsorblock/{back.js => back.ts} | 25 +- plugins/sponsorblock/front.js | 30 --- plugins/sponsorblock/front.ts | 35 +++ .../sponsorblock/{segments.js => segments.ts} | 12 +- plugins/sponsorblock/types.ts | 12 + plugins/touchbar/back.ts | 2 +- plugins/tuna-obs/back.ts | 2 +- plugins/utils.ts | 4 +- plugins/video-toggle/back.js | 11 - plugins/video-toggle/back.ts | 14 + plugins/video-toggle/{front.js => front.ts} | 78 +++--- plugins/video-toggle/{menu.js => menu.ts} | 8 +- plugins/visualizer/back.js | 7 - plugins/visualizer/back.ts | 9 + plugins/visualizer/{front.js => front.ts} | 27 +- plugins/visualizer/{menu.js => menu.ts} | 14 +- plugins/visualizer/visualizers/butterchurn.js | 47 ---- plugins/visualizer/visualizers/visualizer.ts | 18 ++ plugins/visualizer/visualizers/vudio.js | 33 --- plugins/visualizer/visualizers/vudio.ts | 49 ++++ plugins/visualizer/visualizers/wave.js | 34 --- plugins/visualizer/visualizers/wave.ts | 49 ++++ plugins/visualizer/vudio.d.ts | 34 +++ types/youtube-player.ts | 12 +- 72 files changed, 1290 insertions(+), 693 deletions(-) rename plugins/navigation/{back.js => back.ts} (65%) rename plugins/navigation/{front.js => front.ts} (71%) delete mode 100644 plugins/no-google-login/back.js create mode 100644 plugins/no-google-login/back.ts rename plugins/no-google-login/{front.js => front.ts} (92%) delete mode 100644 plugins/notifications/back.js create mode 100644 plugins/notifications/back.ts delete mode 100644 plugins/notifications/config.js create mode 100644 plugins/notifications/config.ts rename plugins/notifications/{interactive.js => interactive.ts} (71%) rename plugins/notifications/{menu.js => menu.ts} (68%) rename plugins/notifications/{utils.js => utils.ts} (62%) create mode 100644 plugins/picture-in-picture/keyboardevent-from-electron-accelerator.d.ts create mode 100644 plugins/picture-in-picture/keyboardevents-areequal.d.ts rename plugins/playback-speed/{front.js => front.ts} (52%) rename plugins/precise-volume/{back.js => back.ts} (55%) rename plugins/precise-volume/{front.js => front.ts} (64%) rename plugins/precise-volume/{menu.js => menu.ts} (60%) delete mode 100644 plugins/precise-volume/preload.js create mode 100644 plugins/precise-volume/preload.ts rename plugins/quality-changer/{back.js => back.ts} (55%) rename plugins/quality-changer/{front.js => front.ts} (55%) rename plugins/shortcuts/{back.js => back.ts} (54%) rename plugins/shortcuts/{menu.js => menu.ts} (56%) create mode 100644 plugins/shortcuts/mpris-service.d.ts rename plugins/shortcuts/{mpris.js => mpris.ts} (76%) rename plugins/sponsorblock/{back.js => back.ts} (53%) delete mode 100644 plugins/sponsorblock/front.js create mode 100644 plugins/sponsorblock/front.ts rename plugins/sponsorblock/{segments.js => segments.ts} (69%) create mode 100644 plugins/sponsorblock/types.ts delete mode 100644 plugins/video-toggle/back.js create mode 100644 plugins/video-toggle/back.ts rename plugins/video-toggle/{front.js => front.ts} (52%) rename plugins/video-toggle/{menu.js => menu.ts} (85%) delete mode 100644 plugins/visualizer/back.js create mode 100644 plugins/visualizer/back.ts rename plugins/visualizer/{front.js => front.ts} (62%) rename plugins/visualizer/{menu.js => menu.ts} (54%) delete mode 100644 plugins/visualizer/visualizers/butterchurn.js create mode 100644 plugins/visualizer/visualizers/visualizer.ts delete mode 100644 plugins/visualizer/visualizers/vudio.js create mode 100644 plugins/visualizer/visualizers/vudio.ts delete mode 100644 plugins/visualizer/visualizers/wave.js create mode 100644 plugins/visualizer/visualizers/wave.ts create mode 100644 plugins/visualizer/vudio.d.ts diff --git a/config/defaults.ts b/config/defaults.ts index a09e916f..f5143f32 100644 --- a/config/defaults.ts +++ b/config/defaults.ts @@ -83,6 +83,16 @@ const defaultConfig = { 'shortcuts': { enabled: false, overrideMediaKeys: false, + global: { + previous: '', + playPause: '', + next: '', + } as Record, + local: { + previous: '', + playPause: '', + next: '', + } as Record, }, 'downloader': { enabled: false, @@ -130,7 +140,7 @@ const defaultConfig = { volumeUp: '', volumeDown: '', }, - savedVolume: undefined, // Plugin save volume between session here + savedVolume: undefined as number | undefined, // Plugin save volume between session here }, 'sponsorblock': { enabled: false, @@ -146,8 +156,10 @@ const defaultConfig = { }, 'video-toggle': { enabled: false, + hideVideo: false, mode: 'custom', forceHide: false, + align: '', }, 'picture-in-picture': { 'enabled': false, @@ -158,6 +170,7 @@ const defaultConfig = { 'pip-position': [10, 10], 'pip-size': [450, 275], 'isInPiP': false, + 'useNativePiP': false, }, 'captions-selector': { enabled: false, diff --git a/custom-electron-prompt.d.ts b/custom-electron-prompt.d.ts index 49e30352..6f08d3d1 100644 --- a/custom-electron-prompt.d.ts +++ b/custom-electron-prompt.d.ts @@ -1,19 +1,29 @@ declare module 'custom-electron-prompt' { import { BrowserWindow } from 'electron'; - export interface PromptCounterOptions { + export type SelectOptions = Record; + + export interface CounterOptions { minimum?: number; maximum?: number; multiFire?: boolean; } - export interface PromptKeybindOptions { + export interface KeybindOptions { value: string; label: string; - default: string; + default?: string; } - export interface PromptOptions { + export interface InputOptions { + label: string; + value: unknown; + inputAttrs?: Partial; + selectOptions?: SelectOptions; + } + + interface BasePromptOptions { + type?: T; width?: number; height?: number; resizable?: boolean; @@ -25,10 +35,6 @@ declare module 'custom-electron-prompt' { }; alwaysOnTop?: boolean; value?: unknown; - type?: 'input' | 'select' | 'counter' | 'multiInput'; - selectOptions?: Record; - keybindOptions?: PromptKeybindOptions[]; - counterOptions?: PromptCounterOptions; icon?: string; useHtmlLabel?: boolean; customStylesheet?: string; @@ -38,15 +44,42 @@ declare module 'custom-electron-prompt' { customScript?: string; enableRemoteModule?: boolean; inputAttrs?: Partial; - multiInputOptions?: { - label: string; - value: unknown; - inputAttrs?: Partial; - selectOptions?: Record; - }[]; } - const prompt: (options?: PromptOptions, parent?: BrowserWindow) => Promise; + export type InputPromptOptions = BasePromptOptions<'input'>; + export interface SelectPromptOptions extends BasePromptOptions<'select'> { + selectOptions: SelectOptions; + } + export interface CounterPromptOptions extends BasePromptOptions<'counter'> { + counterOptions: CounterOptions; + } + export interface MultiInputPromptOptions extends BasePromptOptions<'multiInput'> { + multiInputOptions: InputOptions[]; + } + export interface KeybindPromptOptions extends BasePromptOptions<'keybind'> { + keybindOptions: KeybindOptions[]; + } + + export type PromptOptions = ( + T extends 'input' ? InputPromptOptions : + T extends 'select' ? SelectPromptOptions : + T extends 'counter' ? CounterPromptOptions : + T extends 'keybind' ? KeybindPromptOptions : + T extends 'multiInput' ? MultiInputPromptOptions : + never + ); + + type PromptResult = T extends 'input' ? string : + T extends 'select' ? string : + T extends 'counter' ? number : + T extends 'keybind' ? { + value: string; + accelerator: string + }[] : + T extends 'multiInput' ? string[] : + never; + + const prompt: (options?: PromptOptions & { type: T }, parent?: BrowserWindow) => Promise | null>; export default prompt; } diff --git a/menu.ts b/menu.ts index 629d7299..0377bb5d 100644 --- a/menu.ts +++ b/menu.ts @@ -58,8 +58,9 @@ export const mainMenuTemplate = (win: BrowserWindow): MenuTemplate => { } type PluginType = (window: BrowserWindow, plugins: string, func: () => void) => Electron.MenuItemConstructorOptions[]; - // eslint-disable-next-line @typescript-eslint/no-var-requires - const getPluginMenu = require(pluginPath) as PluginType; + + // eslint-disable-next-line @typescript-eslint/no-var-requires,@typescript-eslint/no-unsafe-member-access + const getPluginMenu = require(pluginPath).default as PluginType; return { label: pluginLabel, submenu: [ @@ -274,7 +275,7 @@ export const mainMenuTemplate = (win: BrowserWindow): MenuTemplate => { { label: 'Proxy', type: 'checkbox', - checked: Boolean(config.get('options.proxy')), + checked: !!(config.get('options.proxy')), click(item) { setProxy(item, win); }, diff --git a/package-lock.json b/package-lock.json index 51f51d3d..b804d614 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,6 +52,7 @@ "@types/youtube-player": "^5.5.7", "@typescript-eslint/eslint-plugin": "6.5.0", "auto-changelog": "2.4.0", + "copyfiles": "2.4.1", "del-cli": "5.0.1", "electron": "27.0.0-alpha.5", "electron-builder": "24.6.3", @@ -2834,6 +2835,76 @@ "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "dev": true }, + "node_modules/copyfiles": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", + "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==", + "dev": true, + "dependencies": { + "glob": "^7.0.5", + "minimatch": "^3.0.3", + "mkdirp": "^1.0.4", + "noms": "0.0.0", + "through2": "^2.0.1", + "untildify": "^4.0.0", + "yargs": "^16.1.0" + }, + "bin": { + "copyfiles": "copyfiles", + "copyup": "copyfiles" + } + }, + "node_modules/copyfiles/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/copyfiles/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/copyfiles/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/copyfiles/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/core-js": { "version": "2.6.12", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", @@ -3162,6 +3233,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/del/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -3543,6 +3629,21 @@ "unzip-crx-3": "^0.2.0" } }, + "node_modules/electron-devtools-installer/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/electron-is": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/electron-is/-/electron-is-3.0.0.tgz", @@ -4507,6 +4608,21 @@ "node": ">=12.0.0" } }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/flatted": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", @@ -6596,6 +6712,21 @@ "node": "^12.13 || ^14.13 || >=16" } }, + "node_modules/node-gyp/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/node-id3": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/node-id3/-/node-id3-0.2.6.tgz", @@ -6615,6 +6746,40 @@ "node": ">=0.10.0" } }, + "node_modules/noms": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", + "integrity": "sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "~1.0.31" + } + }, + "node_modules/noms/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/noms/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/noms/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + }, "node_modules/nopt": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", @@ -7617,21 +7782,6 @@ "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/roarr": { "version": "2.15.4", "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", @@ -8476,6 +8626,52 @@ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/through2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/titleize": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", @@ -8522,6 +8718,21 @@ "tmp": "^0.2.0" } }, + "node_modules/tmp-promise/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/tmp-promise/node_modules/tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -9079,6 +9290,15 @@ "node": ">=8.0" } }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index 3c2c0ee3..d1c01766 100644 --- a/package.json +++ b/package.json @@ -84,21 +84,22 @@ "scripts": { "test": "playwright test", "test:debug": "DEBUG=pw:browser* playwright test", - "start": "tsc && electron ./dist/index.js", + "start": "tsc && npm run copy-files && electron ./dist/index.js", "start:debug": "ELECTRON_ENABLE_LOGGING=1 electron ./dist/index.js", "generate:package": "node utils/generate-package-json.js", "postinstall": "npm run plugins", "clean": "del-cli dist && del-cli pack", - "build": "npm run clean && tsc && electron-builder --win --mac --linux -p never", - "build:linux": "npm run clean && electron-builder --linux -p never", - "build:mac": "npm run clean && electron-builder --mac dmg:x64 -p never", - "build:mac:arm64": "npm run clean && electron-builder --mac dmg:arm64 -p never", - "build:win": "npm run clean && electron-builder --win -p never", - "build:win:x64": "npm run clean && electron-builder --win nsis:x64 -p never", + "copy-files": "copyfiles -u 1 plugins/**/*.html plugins/**/*.css plugins/**/*.bin plugins/**/*.js dist/plugins/", + "build": "npm run clean && tsc && npm run copy-files && electron-builder --win --mac --linux -p never", + "build:linux": "npm run clean && tsc && npm run copy-files && electron-builder --linux -p never", + "build:mac": "npm run clean && tsc && npm run copy-files && electron-builder --mac dmg:x64 -p never", + "build:mac:arm64": "npm run clean && tsc && npm run copy-files && electron-builder --mac dmg:arm64 -p never", + "build:win": "npm run clean && tsc && npm run copy-files && electron-builder --win -p never", + "build:win:x64": "npm run clean && tsc && npm run copy-files && electron-builder --win nsis:x64 -p never", "lint": "xo", "changelog": "auto-changelog", "plugins": "npm run plugin:adblocker && npm run plugin:bypass-age-restrictions", - "plugin:adblocker": "del-cli plugins/adblocker/ad-blocker-engine.bin && tsc plugins/adblocker/blocker.ts && node dist/plugins/adblocker/blocker.js", + "plugin:adblocker": "del-cli plugins/adblocker/ad-blocker-engine.bin && tsc && node dist/plugins/adblocker/blocker.js", "plugin:bypass-age-restrictions": "del-cli node_modules/simple-youtube-age-restriction-bypass/package.json && npm run generate:package simple-youtube-age-restriction-bypass", "release:linux": "npm run clean && electron-builder --linux -p always -c.snap.publish=github", "release:mac": "npm run clean && electron-builder --mac -p always", @@ -157,6 +158,7 @@ "@types/youtube-player": "^5.5.7", "@typescript-eslint/eslint-plugin": "6.5.0", "auto-changelog": "2.4.0", + "copyfiles": "2.4.1", "del-cli": "5.0.1", "electron": "27.0.0-alpha.5", "electron-builder": "24.6.3", diff --git a/plugins/adblocker/back.ts b/plugins/adblocker/back.ts index 1360ea46..f02f28a0 100644 --- a/plugins/adblocker/back.ts +++ b/plugins/adblocker/back.ts @@ -3,10 +3,9 @@ import { BrowserWindow } from 'electron'; import { loadAdBlockerEngine } from './blocker'; import config from './config'; -import pluginConfig from '../../config'; +import type { ConfigType } from '../../config/dynamic'; -const AdBlockOptionsObj = pluginConfig.get('plugins.adblocker'); -type AdBlockOptions = typeof AdBlockOptionsObj; +type AdBlockOptions = ConfigType<'adblocker'>; export default async (win: BrowserWindow, options: AdBlockOptions) => { if (await config.shouldUseBlocklists()) { diff --git a/plugins/captions-selector/front.ts b/plugins/captions-selector/front.ts index cfa61c1b..ee9adc53 100644 --- a/plugins/captions-selector/front.ts +++ b/plugins/captions-selector/front.ts @@ -7,7 +7,7 @@ import configProvider from './config'; import { ElementFromFile, templatePath } from '../utils'; import { YoutubePlayer } from '../../types/youtube-player'; -import { ConfigType } from '../../config/dynamic'; +import type { ConfigType } from '../../config/dynamic'; interface LanguageOptions { displayName: string; diff --git a/plugins/crossfade/front.ts b/plugins/crossfade/front.ts index aeff1064..203ddbb0 100644 --- a/plugins/crossfade/front.ts +++ b/plugins/crossfade/front.ts @@ -10,7 +10,7 @@ import { VolumeFader } from './fader'; import configProvider from './config'; import defaultConfigs from '../../config/defaults'; -import { ConfigType } from '../../config/dynamic'; +import type { ConfigType } from '../../config/dynamic'; let transitionAudio: Howl; // Howler audio used to fade out the current music let firstVideo = true; diff --git a/plugins/crossfade/menu.ts b/plugins/crossfade/menu.ts index 93034d48..dd0057f2 100644 --- a/plugins/crossfade/menu.ts +++ b/plugins/crossfade/menu.ts @@ -6,7 +6,7 @@ import config from './config'; import promptOptions from '../../providers/prompt-options'; import configOptions from '../../config/defaults'; -import { ConfigType } from '../../config/dynamic'; +import type { ConfigType } from '../../config/dynamic'; const defaultOptions = configOptions.plugins.crossfade; diff --git a/plugins/discord/back.ts b/plugins/discord/back.ts index f0970c3a..a505934d 100644 --- a/plugins/discord/back.ts +++ b/plugins/discord/back.ts @@ -5,7 +5,7 @@ import { dev } from 'electron-is'; import { SetActivity } from '@xhayper/discord-rpc/dist/structures/ClientUser'; import registerCallback from '../../providers/song-info'; -import pluginConfig from '../../config'; +import type { ConfigType } from '../../config/dynamic'; // Application ID registered by @Zo-Bro-23 const clientId = '1043858434585526382'; @@ -118,8 +118,7 @@ export const connect = (showError = false) => { let clearActivity: NodeJS.Timeout | undefined; let updateActivity: import('../../providers/song-info').SongInfoCallback; -const DiscordOptionsObj = pluginConfig.get('plugins.discord'); -type DiscordOptions = typeof DiscordOptionsObj; +type DiscordOptions = ConfigType<'discord'>; export default ( win: Electron.BrowserWindow, diff --git a/plugins/discord/menu.ts b/plugins/discord/menu.ts index 6723b3f6..a8ea14c6 100644 --- a/plugins/discord/menu.ts +++ b/plugins/discord/menu.ts @@ -7,14 +7,14 @@ import { clear, connect, isConnected, registerRefresh } from './back'; import { setMenuOptions } from '../../config/plugins'; import promptOptions from '../../providers/prompt-options'; import { singleton } from '../../providers/decorators'; -import config from '../../config'; + +import type { ConfigType } from '../../config/dynamic'; const registerRefreshOnce = singleton((refreshMenu: () => void) => { registerRefresh(refreshMenu); }); -const DiscordOptionsObj = config.get('plugins.discord'); -type DiscordOptions = typeof DiscordOptionsObj; +type DiscordOptions = ConfigType<'discord'>; export default (win: Electron.BrowserWindow, options: DiscordOptions, refreshMenu: () => void) => { registerRefreshOnce(refreshMenu); diff --git a/plugins/downloader/back.ts b/plugins/downloader/back.ts index f30f532a..90a201c8 100644 --- a/plugins/downloader/back.ts +++ b/plugins/downloader/back.ts @@ -411,7 +411,7 @@ export async function downloadPlaylist(givenUrl?: string | URL) { const safePlaylistTitle = filenamify(playlist.title, { replacement: ' ' }); - const folder = getFolder(config.get('downloadFolder')); + const folder = getFolder(config.get('downloadFolder') ?? ''); const playlistFolder = join(folder, safePlaylistTitle); if (existsSync(playlistFolder)) { if (!config.get('skipExisting')) { diff --git a/plugins/downloader/menu.ts b/plugins/downloader/menu.ts index be5f8430..c49a6389 100644 --- a/plugins/downloader/menu.ts +++ b/plugins/downloader/menu.ts @@ -16,7 +16,7 @@ export default (): MenuTemplate => [ click() { const result = dialog.showOpenDialogSync({ properties: ['openDirectory', 'createDirectory'], - defaultPath: getFolder(config.get('downloadFolder')), + defaultPath: getFolder(config.get('downloadFolder') ?? ''), }); if (result) { config.set('downloadFolder', result[0]); diff --git a/plugins/in-app-menu/back.ts b/plugins/in-app-menu/back.ts index 3fd13edf..61a00cbd 100644 --- a/plugins/in-app-menu/back.ts +++ b/plugins/in-app-menu/back.ts @@ -13,7 +13,7 @@ setupTitlebar(); // Tracks menu visibility -module.exports = (win: BrowserWindow) => { +export default (win: BrowserWindow) => { // Css for custom scrollbar + disable drag area(was causing bugs) injectCSS(win.webContents, path.join(__dirname, 'style.css')); diff --git a/plugins/in-app-menu/front.ts b/plugins/in-app-menu/front.ts index 61c09387..ae5179c2 100644 --- a/plugins/in-app-menu/front.ts +++ b/plugins/in-app-menu/front.ts @@ -9,8 +9,8 @@ function $(selector: string) { return document.querySelector(selector); } -module.exports = () => { - const visible = () => Boolean($('.cet-menubar')?.firstChild); +export default () => { + const visible = () => !!($('.cet-menubar')?.firstChild); const bar = new Titlebar({ icon: 'https://cdn-icons-png.flaticon.com/512/5358/5358672.png', backgroundColor: Color.fromHex('#050505'), diff --git a/plugins/last-fm/back.ts b/plugins/last-fm/back.ts index 2a83d9ee..69a93cc6 100644 --- a/plugins/last-fm/back.ts +++ b/plugins/last-fm/back.ts @@ -4,10 +4,9 @@ import md5 from 'md5'; import { setOptions } from '../../config/plugins'; import registerCallback, { SongInfo } from '../../providers/song-info'; import defaultConfig from '../../config/defaults'; -import config from '../../config'; +import type { ConfigType } from '../../config/dynamic'; -const LastFMOptionsObj = config.get('plugins.last-fm'); -type LastFMOptions = typeof LastFMOptionsObj; +type LastFMOptions = ConfigType<'last-fm'>; interface LastFmData { method: string, @@ -188,4 +187,4 @@ const lastfm = async (_win: BrowserWindow, config: LastFMOptions) => { }); }; -module.exports = lastfm; +export default lastfm; diff --git a/plugins/lyrics-genius/back.ts b/plugins/lyrics-genius/back.ts index b443b2fb..79522d13 100644 --- a/plugins/lyrics-genius/back.ts +++ b/plugins/lyrics-genius/back.ts @@ -9,13 +9,13 @@ import { GetGeniusLyric } from './types'; import { cleanupName, SongInfo } from '../../providers/song-info'; import { injectCSS } from '../utils'; -import config from '../../config'; + +import type { ConfigType } from '../../config/dynamic'; const eastAsianChars = /\p{Script=Katakana}|\p{Script=Hiragana}|\p{Script=Hangul}|\p{Script=Han}/u; let revRomanized = false; -const LyricGeniusTypeObj = config.get('plugins.lyric-genius'); -export type LyricGeniusType = typeof LyricGeniusTypeObj; +export type LyricGeniusType = ConfigType<'lyric-genius'>; export default (win: BrowserWindow, options: LyricGeniusType) => { if (options.romanizedLyrics) { diff --git a/plugins/lyrics-genius/menu.ts b/plugins/lyrics-genius/menu.ts index 6dc6cd70..9e5eb9dc 100644 --- a/plugins/lyrics-genius/menu.ts +++ b/plugins/lyrics-genius/menu.ts @@ -4,7 +4,7 @@ import { LyricGeniusType, toggleRomanized } from './back'; import { setOptions } from '../../config/plugins'; -module.exports = (win: BrowserWindow, options: LyricGeniusType) => [ +export default (_: BrowserWindow, options: LyricGeniusType) => [ { label: 'Romanized Lyrics', type: 'checkbox', diff --git a/plugins/navigation/back.js b/plugins/navigation/back.ts similarity index 65% rename from plugins/navigation/back.js rename to plugins/navigation/back.ts index c2436c0b..bdf7e77d 100644 --- a/plugins/navigation/back.js +++ b/plugins/navigation/back.ts @@ -1,15 +1,17 @@ -const path = require('node:path'); +import path from 'node:path'; -const { ACTIONS, CHANNEL } = require('./actions.ts'); +import { BrowserWindow } from 'electron'; -const { injectCSS, listenAction } = require('../utils'); +import { ACTIONS, CHANNEL } from './actions'; -function handle(win) { +import { injectCSS, listenAction } from '../utils'; + +export function handle(win: BrowserWindow) { injectCSS(win.webContents, path.join(__dirname, 'style.css'), () => { win.webContents.send('navigation-css-ready'); }); - listenAction(CHANNEL, (event, action) => { + listenAction(CHANNEL, (_, action) => { switch (action) { case ACTIONS.NEXT: { if (win.webContents.canGoForward()) { @@ -34,4 +36,4 @@ function handle(win) { }); } -module.exports = handle; +export default handle; diff --git a/plugins/navigation/front.js b/plugins/navigation/front.ts similarity index 71% rename from plugins/navigation/front.js rename to plugins/navigation/front.ts index 30135e05..d4ffe80c 100644 --- a/plugins/navigation/front.js +++ b/plugins/navigation/front.ts @@ -1,8 +1,8 @@ -const { ipcRenderer } = require('electron'); +import { ipcRenderer } from 'electron'; -const { ElementFromFile, templatePath } = require('../utils'); +import { ElementFromFile, templatePath } from '../utils'; -function run() { +export function run() { ipcRenderer.on('navigation-css-ready', () => { const forwardButton = ElementFromFile( templatePath(__dirname, 'forward.html'), @@ -16,4 +16,4 @@ function run() { }); } -module.exports = run; +export default run; diff --git a/plugins/no-google-login/back.js b/plugins/no-google-login/back.js deleted file mode 100644 index 897e8bc3..00000000 --- a/plugins/no-google-login/back.js +++ /dev/null @@ -1,7 +0,0 @@ -const path = require('node:path'); - -const { injectCSS } = require('../utils'); - -module.exports = (win) => { - injectCSS(win.webContents, path.join(__dirname, 'style.css')); -}; diff --git a/plugins/no-google-login/back.ts b/plugins/no-google-login/back.ts new file mode 100644 index 00000000..5634e5ef --- /dev/null +++ b/plugins/no-google-login/back.ts @@ -0,0 +1,9 @@ +import path from 'node:path'; + +import { BrowserWindow } from 'electron'; + +import { injectCSS } from '../utils'; + +export default (win: BrowserWindow) => { + injectCSS(win.webContents, path.join(__dirname, 'style.css')); +}; diff --git a/plugins/no-google-login/front.js b/plugins/no-google-login/front.ts similarity index 92% rename from plugins/no-google-login/front.js rename to plugins/no-google-login/front.ts index 57ac376d..b0f4158d 100644 --- a/plugins/no-google-login/front.js +++ b/plugins/no-google-login/front.ts @@ -18,7 +18,7 @@ function removeLoginElements() { const menuEntries = document.querySelectorAll( '#items ytmusic-guide-entry-renderer', ); - for (const item of menuEntries) { + menuEntries.forEach((item) => { const icon = item.querySelector('path'); if (icon) { observer.disconnect(); @@ -26,7 +26,7 @@ function removeLoginElements() { item.remove(); } } - } + }); }); observer.observe(document.documentElement, { childList: true, @@ -34,4 +34,4 @@ function removeLoginElements() { }); } -module.exports = removeLoginElements; +export default removeLoginElements; diff --git a/plugins/notifications/back.js b/plugins/notifications/back.js deleted file mode 100644 index 867f65e6..00000000 --- a/plugins/notifications/back.js +++ /dev/null @@ -1,49 +0,0 @@ -const { Notification } = require('electron'); -const is = require('electron-is'); - -const { notificationImage } = require('./utils'); -const config = require('./config'); - -const registerCallback = require('../../providers/song-info'); - -const notify = (info) => { - // Fill the notification with content - const notification = { - title: info.title || 'Playing', - body: info.artist, - icon: notificationImage(info), - silent: true, - urgency: config.get('urgency'), - }; - - // Send the notification - const currentNotification = new Notification(notification); - currentNotification.show(); - - return currentNotification; -}; - -const setup = () => { - let oldNotification; - let currentUrl; - - registerCallback((songInfo) => { - if (!songInfo.isPaused && (songInfo.url !== currentUrl || config.get('unpauseNotification'))) { - // Close the old notification - oldNotification?.close(); - currentUrl = songInfo.url; - // This fixes a weird bug that would cause the notification to be updated instead of showing - setTimeout(() => { - oldNotification = notify(songInfo); - }, 10); - } - }); -}; - -/** @param {Electron.BrowserWindow} win */ -module.exports = (win, options) => { - // Register the callback for new song information - is.windows() && options.interactive - ? require('./interactive')(win) - : setup(); -}; diff --git a/plugins/notifications/back.ts b/plugins/notifications/back.ts new file mode 100644 index 00000000..bc73819d --- /dev/null +++ b/plugins/notifications/back.ts @@ -0,0 +1,51 @@ +import { BrowserWindow, Notification } from 'electron'; + +import is from 'electron-is'; + +import { notificationImage } from './utils'; +import config from './config'; +import interactive from './interactive'; + +import registerCallback, { SongInfo } from '../../providers/song-info'; + +import type { ConfigType } from '../../config/dynamic'; + +type NotificationOptions = ConfigType<'notifications'>; + +const notify = (info: SongInfo) => { + // Send the notification + const currentNotification = new Notification({ + title: info.title || 'Playing', + body: info.artist, + icon: notificationImage(info), + silent: true, + urgency: config.get('urgency') as 'normal' | 'critical' | 'low', + }); + currentNotification.show(); + + return currentNotification; +}; + +const setup = () => { + let oldNotification: Notification; + let currentUrl: string | undefined; + + registerCallback((songInfo: SongInfo) => { + if (!songInfo.isPaused && (songInfo.url !== currentUrl || config.get('unpauseNotification'))) { + // Close the old notification + oldNotification?.close(); + currentUrl = songInfo.url; + // This fixes a weird bug that would cause the notification to be updated instead of showing + setTimeout(() => { + oldNotification = notify(songInfo); + }, 10); + } + }); +}; + +export default (win: BrowserWindow, options: NotificationOptions) => { + // Register the callback for new song information + is.windows() && options.interactive + ? interactive(win) + : setup(); +}; diff --git a/plugins/notifications/config.js b/plugins/notifications/config.js deleted file mode 100644 index 2bd87052..00000000 --- a/plugins/notifications/config.js +++ /dev/null @@ -1,5 +0,0 @@ -const { PluginConfig } = require('../../config/dynamic'); - -const config = new PluginConfig('notifications'); - -module.exports = { ...config }; diff --git a/plugins/notifications/config.ts b/plugins/notifications/config.ts new file mode 100644 index 00000000..91244414 --- /dev/null +++ b/plugins/notifications/config.ts @@ -0,0 +1,5 @@ +import { PluginConfig } from '../../config/dynamic'; + +const config = new PluginConfig('notifications'); + +export default { ...config } as PluginConfig<'notifications'>; diff --git a/plugins/notifications/interactive.js b/plugins/notifications/interactive.ts similarity index 71% rename from plugins/notifications/interactive.js rename to plugins/notifications/interactive.ts index bb0fdc94..ab724ba2 100644 --- a/plugins/notifications/interactive.js +++ b/plugins/notifications/interactive.ts @@ -1,38 +1,32 @@ -const path = require('node:path'); +import path from 'node:path'; -const { Notification, app, ipcMain } = require('electron'); +import { app, BrowserWindow, ipcMain, Notification } from 'electron'; -const { notificationImage, icons, saveTempIcon, secondsToMinutes, ToastStyles } = require('./utils'); +import { icons, notificationImage, saveTempIcon, secondsToMinutes, ToastStyles } from './utils'; +import config from './config'; -/** - * @type {PluginConfig} - */ -const config = require('./config'); +import getSongControls from '../../providers/song-controls'; +import registerCallback, { SongInfo } from '../../providers/song-info'; +import { changeProtocolHandler } from '../../providers/protocol-handler'; +import { setTrayOnClick, setTrayOnDoubleClick } from '../../tray'; -const getSongControls = require('../../providers/song-controls'); -const registerCallback = require('../../providers/song-info'); -const { changeProtocolHandler } = require('../../providers/protocol-handler'); -const { setTrayOnClick, setTrayOnDoubleClick } = require('../../tray'); +let songControls: ReturnType; +let savedNotification: Notification | undefined; - -let songControls; -let savedNotification; - -/** @param {Electron.BrowserWindow} win */ -module.exports = (win) => { +export default (win: BrowserWindow) => { songControls = getSongControls(win); let currentSeconds = 0; ipcMain.on('apiLoaded', () => win.webContents.send('setupTimeChangedListener')); - ipcMain.on('timeChanged', (_, t) => currentSeconds = t); + ipcMain.on('timeChanged', (_, t: number) => currentSeconds = t); if (app.isPackaged) { saveTempIcon(); } - let savedSongInfo; - let lastUrl; + let savedSongInfo: SongInfo; + let lastUrl: string | undefined; // Register songInfoCallback registerCallback((songInfo) => { @@ -78,7 +72,7 @@ module.exports = (win) => { changeProtocolHandler( (cmd) => { if (Object.keys(songControls).includes(cmd)) { - songControls[cmd](); + songControls[cmd as keyof typeof songControls](); if (config.get('refreshOnPlayPause') && ( cmd === 'pause' || (cmd === 'play' && !config.get('unpauseNotification')) @@ -97,11 +91,18 @@ module.exports = (win) => { ); }; -function sendNotification(songInfo) { +function sendNotification(songInfo: SongInfo) { const iconSrc = notificationImage(songInfo); savedNotification?.close(); + let icon: string; + if (typeof iconSrc === 'object') { + icon = iconSrc.toDataURL(); + } else { + icon = iconSrc; + } + savedNotification = new Notification({ title: songInfo.title || 'Playing', body: songInfo.artist, @@ -111,7 +112,7 @@ function sendNotification(songInfo) { // https://learn.microsoft.com/en-us/windows/apps/design/shell/tiles-and-notifications/toast-schema // https://learn.microsoft.com/en-us/windows/apps/design/shell/tiles-and-notifications/adaptive-interactive-toasts?tabs=xml // https://learn.microsoft.com/en-us/uwp/api/windows.ui.notifications.toasttemplatetype - toastXml: getXml(songInfo, iconSrc), + toastXml: getXml(songInfo, icon), }); savedNotification.on('close', () => { @@ -121,7 +122,7 @@ function sendNotification(songInfo) { savedNotification.show(); } -const getXml = (songInfo, iconSrc) => { +const getXml = (songInfo: SongInfo, iconSrc: string) => { switch (config.get('toastStyle')) { default: case ToastStyles.logo: @@ -155,7 +156,7 @@ const iconLocation = app.isPackaged ? path.resolve(app.getPath('userData'), 'icons') : path.resolve(__dirname, '..', '..', 'assets/media-icons-black'); -const display = (kind) => { +const display = (kind: keyof typeof icons) => { if (config.get('toastStyle') === ToastStyles.legacy) { return `content="${icons[kind]}"`; } @@ -166,10 +167,10 @@ const display = (kind) => { `; }; -const getButton = (kind) => +const getButton = (kind: keyof typeof icons) => ``; -const getButtons = (isPaused) => `\ +const getButtons = (isPaused: boolean) => `\ ${getButton('previous')} ${isPaused ? getButton('play') : getButton('pause')} @@ -177,7 +178,7 @@ const getButtons = (isPaused) => `\ \ `; -const toast = (content, isPaused) => `\ +const toast = (content: string, isPaused: boolean) => `\ `; -const xmlImage = ({ title, artist, isPaused }, imgSrc, placement) => toast(`\ +const xmlImage = ({ title, artist, isPaused }: SongInfo, imgSrc: string, placement: string) => toast(`\ ${title} ${artist}\ -`, isPaused); +`, isPaused ?? false); -const xmlLogo = (songInfo, imgSrc) => xmlImage(songInfo, imgSrc, 'placement="appLogoOverride"'); +const xmlLogo = (songInfo: SongInfo, imgSrc: string) => xmlImage(songInfo, imgSrc, 'placement="appLogoOverride"'); -const xmlHero = (songInfo, imgSrc) => xmlImage(songInfo, imgSrc, 'placement="hero"'); +const xmlHero = (songInfo: SongInfo, imgSrc: string) => xmlImage(songInfo, imgSrc, 'placement="hero"'); -const xmlBannerBottom = (songInfo, imgSrc) => xmlImage(songInfo, imgSrc, ''); +const xmlBannerBottom = (songInfo: SongInfo, imgSrc: string) => xmlImage(songInfo, imgSrc, ''); -const xmlBannerTopCustom = (songInfo, imgSrc) => toast(`\ +const xmlBannerTopCustom = (songInfo: SongInfo, imgSrc: string) => toast(`\ @@ -211,17 +212,17 @@ const xmlBannerTopCustom = (songInfo, imgSrc) => toast(`\
${xmlMoreData(songInfo)}
\ -`, songInfo.isPaused); +`, songInfo.isPaused ?? false); -const xmlMoreData = ({ album, elapsedSeconds, songDuration }) => `\ +const xmlMoreData = ({ album, elapsedSeconds, songDuration }: SongInfo) => `\ ${album ? `${album}` : ''} - ${secondsToMinutes(elapsedSeconds)} / ${secondsToMinutes(songDuration)} + ${secondsToMinutes(elapsedSeconds ?? 0)} / ${secondsToMinutes(songDuration)} \ `; -const xmlBannerCenteredBottom = ({ title, artist, isPaused }, imgSrc) => toast(`\ +const xmlBannerCenteredBottom = ({ title, artist, isPaused }: SongInfo, imgSrc: string) => toast(`\ @@ -230,9 +231,9 @@ const xmlBannerCenteredBottom = ({ title, artist, isPaused }, imgSrc) => toast(` \ -`, isPaused); +`, isPaused ?? false); -const xmlBannerCenteredTop = ({ title, artist, isPaused }, imgSrc) => toast(`\ +const xmlBannerCenteredTop = ({ title, artist, isPaused }: SongInfo, imgSrc: string) => toast(`\ @@ -241,9 +242,9 @@ const xmlBannerCenteredTop = ({ title, artist, isPaused }, imgSrc) => toast(`\ ${artist} \ -`, isPaused); +`, isPaused ?? false); -const titleFontPicker = (title) => { +const titleFontPicker = (title: string) => { if (title.length <= 13) { return 'Header'; } diff --git a/plugins/notifications/menu.js b/plugins/notifications/menu.ts similarity index 68% rename from plugins/notifications/menu.js rename to plugins/notifications/menu.ts index 8886f3c3..48bbaafd 100644 --- a/plugins/notifications/menu.js +++ b/plugins/notifications/menu.ts @@ -1,9 +1,14 @@ -const is = require('electron-is'); +import is from 'electron-is'; -const { urgencyLevels, ToastStyles, snakeToCamel } = require('./utils'); -const config = require('./config'); +import {BrowserWindow, MenuItem} from 'electron'; -module.exports = (_win, options) => [ +import { snakeToCamel, ToastStyles, urgencyLevels } from './utils'; + +import config from './config'; + +import type { ConfigType } from '../../config/dynamic'; + +export default (_win: BrowserWindow, options: ConfigType<'notifications'>) => [ ...(is.linux() ? [ { @@ -24,7 +29,7 @@ module.exports = (_win, options) => [ type: 'checkbox', checked: options.interactive, // Doesn't update until restart - click: (item) => config.setAndMaybeRestart('interactive', item.checked), + click: (item: MenuItem) => config.setAndMaybeRestart('interactive', item.checked), }, { // Submenu with settings for interactive notifications (name shouldn't be too long) @@ -34,19 +39,19 @@ module.exports = (_win, options) => [ label: 'Open/Close on tray click', type: 'checkbox', checked: options.trayControls, - click: (item) => config.set('trayControls', item.checked), + click: (item: MenuItem) => config.set('trayControls', item.checked), }, { label: 'Hide Button Text', type: 'checkbox', checked: options.hideButtonText, - click: (item) => config.set('hideButtonText', item.checked), + click: (item: MenuItem) => config.set('hideButtonText', item.checked), }, { label: 'Refresh on Play/Pause', type: 'checkbox', checked: options.refreshOnPlayPause, - click: (item) => config.set('refreshOnPlayPause', item.checked), + click: (item: MenuItem) => config.set('refreshOnPlayPause', item.checked), }, ], }, @@ -60,11 +65,11 @@ module.exports = (_win, options) => [ label: 'Show notification on unpause', type: 'checkbox', checked: options.unpauseNotification, - click: (item) => config.set('unpauseNotification', item.checked), + click: (item: MenuItem) => config.set('unpauseNotification', item.checked), }, ]; -function getToastStyleMenuItems(options) { +export function getToastStyleMenuItems(options: ConfigType<'notifications'>) { const array = Array.from({ length: Object.keys(ToastStyles).length }); // ToastStyles index starts from 1 diff --git a/plugins/notifications/utils.js b/plugins/notifications/utils.ts similarity index 62% rename from plugins/notifications/utils.js rename to plugins/notifications/utils.ts index 6158bb3f..7870730c 100644 --- a/plugins/notifications/utils.js +++ b/plugins/notifications/utils.ts @@ -1,19 +1,20 @@ -const path = require('node:path'); +import path from 'node:path'; +import fs from 'node:fs'; -const fs = require('node:fs'); +import { app, NativeImage } from 'electron'; -const { app } = require('electron'); +import config from './config'; -const config = require('./config'); +import { cache } from '../../providers/decorators'; +import { SongInfo } from '../../providers/song-info'; const icon = 'assets/youtube-music.png'; const userData = app.getPath('userData'); const temporaryIcon = path.join(userData, 'tempIcon.png'); const temporaryBanner = path.join(userData, 'tempBanner.png'); -const { cache } = require('../../providers/decorators'); -module.exports.ToastStyles = { +export const ToastStyles = { logo: 1, banner_centered_top: 2, hero: 3, @@ -23,20 +24,20 @@ module.exports.ToastStyles = { legacy: 7, }; -module.exports.icons = { +export const icons = { play: '\u{1405}', // ᐅ pause: '\u{2016}', // ‖ next: '\u{1433}', // ᐳ previous: '\u{1438}', // ᐸ }; -module.exports.urgencyLevels = [ +export const urgencyLevels = [ { name: 'Low', value: 'low' }, { name: 'Normal', value: 'normal' }, { name: 'High', value: 'critical' }, ]; -const nativeImageToLogo = cache((nativeImage) => { +const nativeImageToLogo = cache((nativeImage: NativeImage) => { const temporaryImage = nativeImage.resize({ height: 256 }); const margin = Math.max(temporaryImage.getSize().width - 256, 0); @@ -48,7 +49,7 @@ const nativeImageToLogo = cache((nativeImage) => { }); }); -module.exports.notificationImage = (songInfo) => { +export const notificationImage = (songInfo: SongInfo) => { if (!songInfo.image) { return icon; } @@ -58,30 +59,30 @@ module.exports.notificationImage = (songInfo) => { } switch (config.get('toastStyle')) { - case module.exports.ToastStyles.logo: - case module.exports.ToastStyles.legacy: { - return this.saveImage(nativeImageToLogo(songInfo.image), temporaryIcon); + case ToastStyles.logo: + case ToastStyles.legacy: { + return saveImage(nativeImageToLogo(songInfo.image), temporaryIcon); } default: { - return this.saveImage(songInfo.image, temporaryBanner); + return saveImage(songInfo.image, temporaryBanner); } } }; -module.exports.saveImage = cache((img, savePath) => { +export const saveImage = cache((img: NativeImage, savePath: string) => { try { fs.writeFileSync(savePath, img.toPNG()); - } catch (error) { - console.log(`Error writing song icon to disk:\n${error.toString()}`); + } catch (error: unknown) { + console.log(`Error writing song icon to disk:\n${String(error)}`); return icon; } return savePath; }); -module.exports.saveTempIcon = () => { - for (const kind of Object.keys(module.exports.icons)) { +export const saveTempIcon = () => { + for (const kind of Object.keys(icons)) { const destinationPath = path.join(userData, 'icons', `${kind}.png`); if (fs.existsSync(destinationPath)) { continue; @@ -94,13 +95,13 @@ module.exports.saveTempIcon = () => { } }; -module.exports.snakeToCamel = (string_) => string_.replaceAll(/([-_][a-z]|^[a-z])/g, (group) => +export const snakeToCamel = (string_: string) => string_.replaceAll(/([-_][a-z]|^[a-z])/g, (group) => group.toUpperCase() .replace('-', ' ') .replace('_', ' '), ); -module.exports.secondsToMinutes = (seconds) => { +export const secondsToMinutes = (seconds: number) => { const minutes = Math.floor(seconds / 60); const secondsLeft = seconds % 60; return `${minutes}:${secondsLeft < 10 ? '0' : ''}${secondsLeft}`; diff --git a/plugins/picture-in-picture/back.ts b/plugins/picture-in-picture/back.ts index 1a588649..2041e404 100644 --- a/plugins/picture-in-picture/back.ts +++ b/plugins/picture-in-picture/back.ts @@ -5,7 +5,7 @@ import { app, BrowserWindow, ipcMain } from 'electron'; import { setOptions as setPluginOptions } from '../../config/plugins'; import { injectCSS } from '../utils'; -import config from '../../config'; +import type { ConfigType } from '../../config/dynamic'; let isInPiP = false; let originalPosition: number[]; @@ -15,9 +15,7 @@ let originalMaximized: boolean; let win: BrowserWindow; -// Magic of TypeScript -const PiPOptionsObj = config.get('plugins.picture-in-picture'); -type PiPOptions = typeof PiPOptionsObj; +type PiPOptions = ConfigType<'picture-in-picture'>; let options: Partial; diff --git a/plugins/picture-in-picture/front.ts b/plugins/picture-in-picture/front.ts index a4f83d72..88cdebed 100644 --- a/plugins/picture-in-picture/front.ts +++ b/plugins/picture-in-picture/front.ts @@ -2,31 +2,44 @@ import { ipcRenderer } from 'electron'; import { toKeyEvent } from 'keyboardevent-from-electron-accelerator'; import keyEventAreEqual from 'keyboardevents-areequal'; -const { getSongMenu } = require('../../providers/dom-elements'); -const { ElementFromFile, templatePath } = require('../utils'); +import { getSongMenu } from '../../providers/dom-elements'; -function $(selector) { +import { ElementFromFile, templatePath } from '../utils'; + +import type { ConfigType } from '../../config/dynamic'; + +type PiPOptions = ConfigType<'picture-in-picture'>; + +function $(selector: string) { return document.querySelector(selector); } let useNativePiP = false; -let menu = null; +let menu: Element | null = null; const pipButton = ElementFromFile( templatePath(__dirname, 'picture-in-picture.html'), ); // Will also clone -function replaceButton(query, button) { - const svg = button.querySelector('#icon svg').cloneNode(true); - button.replaceWith(button.cloneNode(true)); - button.remove(); - const newButton = $(query); - newButton.querySelector('#icon').append(svg); - return newButton; +function replaceButton(query: string, button: Element) { + const svg = button.querySelector('#icon svg')?.cloneNode(true); + if (svg) { + button.replaceWith(button.cloneNode(true)); + button.remove(); + const newButton = $(query); + if (newButton) { + newButton.querySelector('#icon')?.append(svg); + } + return newButton; + } + return null; } -function cloneButton(query) { - replaceButton(query, $(query)); +function cloneButton(query: string) { + const button = $(query); + if (button) { + replaceButton(query, button); + } return $(query); } @@ -38,13 +51,18 @@ const observer = new MutationObserver(() => { } } - if (menu.contains(pipButton) || !menu.parentElement.eventSink_?.matches('ytmusic-menu-renderer.ytmusic-player-bar')) { + if ( + menu.contains(pipButton) || + !(menu.parentElement as (HTMLElement & { eventSink_: Element }) | null) + ?.eventSink_ + ?.matches('ytmusic-menu-renderer.ytmusic-player-bar') + ) { return; } - const menuUrl = $( + const menuUrl = ($( 'tp-yt-paper-listbox [tabindex="0"] #navigation-endpoint', - )?.href; + ) as HTMLAnchorElement)?.href; if (menuUrl && !menuUrl.includes('watch?')) { return; } @@ -55,15 +73,15 @@ const observer = new MutationObserver(() => { const togglePictureInPicture = async () => { if (useNativePiP) { const isInPiP = document.pictureInPictureElement !== null; - const video = $('video'); + const video = $('video') as HTMLVideoElement | null; const togglePiP = () => isInPiP ? document.exitPictureInPicture.call(document) - : video.requestPictureInPicture.call(video); + : video?.requestPictureInPicture?.call(video); try { await togglePiP(); - $('#icon').click(); // Close the menu + ($('#icon') as HTMLButtonElement | null)?.click(); // Close the menu return true; } catch { } @@ -72,24 +90,26 @@ const togglePictureInPicture = async () => { ipcRenderer.send('picture-in-picture'); return false; }; -global.togglePictureInPicture = togglePictureInPicture; +// For UI (HTML) +// eslint-disable-next-line @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-member-access +(global as any).togglePictureInPicture = togglePictureInPicture; const listenForToggle = () => { - const originalExitButton = $('.exit-fullscreen-button'); - const appLayout = $('ytmusic-app-layout'); - const expandMenu = $('#expanding-menu'); - const middleControls = $('.middle-controls'); - const playerPage = $('ytmusic-player-page'); - const togglePlayerPageButton = $('.toggle-player-page-button'); - const fullScreenButton = $('.fullscreen-button'); - const player = $('#player'); - const onPlayerDblClick = player.onDoubleClick_; + const originalExitButton = $('.exit-fullscreen-button') as HTMLButtonElement; + const appLayout = $('ytmusic-app-layout') as HTMLElement; + const expandMenu = $('#expanding-menu') as HTMLElement; + const middleControls = $('.middle-controls') as HTMLButtonElement; + const playerPage = $('ytmusic-player-page') as HTMLElement & { playerPageOpen_: boolean }; + const togglePlayerPageButton = $('.toggle-player-page-button') as HTMLButtonElement; + const fullScreenButton = $('.fullscreen-button') as HTMLButtonElement; + const player = ($('#player') as (HTMLVideoElement & { onDoubleClick_: () => void | undefined })); + const onPlayerDblClick = player?.onDoubleClick_; - const titlebar = $('.cet-titlebar'); + const titlebar = $('.cet-titlebar') as HTMLElement; - ipcRenderer.on('pip-toggle', (_, isPip) => { + ipcRenderer.on('pip-toggle', (_, isPip: boolean) => { if (isPip) { - replaceButton('.exit-fullscreen-button', originalExitButton).addEventListener('click', () => togglePictureInPicture()); + replaceButton('.exit-fullscreen-button', originalExitButton)?.addEventListener('click', () => togglePictureInPicture()); player.onDoubleClick_ = () => { }; @@ -104,9 +124,9 @@ const listenForToggle = () => { titlebar.style.display = 'none'; } } else { - $('.exit-fullscreen-button').replaceWith(originalExitButton); + $('.exit-fullscreen-button')?.replaceWith(originalExitButton); player.onDoubleClick_ = onPlayerDblClick; - expandMenu.onmouseleave = undefined; + expandMenu.onmouseleave = null; originalExitButton.click(); appLayout.classList.remove('pip'); if (titlebar) { @@ -116,22 +136,23 @@ const listenForToggle = () => { }); }; -function observeMenu(options) { +function observeMenu(options: PiPOptions) { useNativePiP = options.useNativePiP; document.addEventListener( 'apiLoaded', () => { listenForToggle(); - cloneButton('.player-minimize-button').addEventListener('click', async () => { + cloneButton('.player-minimize-button')?.addEventListener('click', async () => { await togglePictureInPicture(); - setTimeout(() => $('#player').click()); + setTimeout(() => ($('#player') as HTMLButtonElement | undefined)?.click()); }); // Allows easily closing the menu by programmatically clicking outside of it - $('#expanding-menu').removeAttribute('no-cancel-on-outside-click'); + $('#expanding-menu')?.removeAttribute('no-cancel-on-outside-click'); // TODO: think about wether an additional button in songMenu is needed - observer.observe($('ytmusic-popup-container'), { + const popupContainer = $('ytmusic-popup-container'); + if (popupContainer) observer.observe(popupContainer, { childList: true, subtree: true, }); @@ -140,7 +161,7 @@ function observeMenu(options) { ); } -module.exports = (options) => { +export default (options: PiPOptions) => { observeMenu(options); if (options.hotkey) { @@ -148,7 +169,7 @@ module.exports = (options) => { window.addEventListener('keydown', (event) => { if ( keyEventAreEqual(event, hotkeyEvent) - && !$('ytmusic-search-box').opened + && !($('ytmusic-search-box') as (HTMLElement & { opened: boolean }) | undefined)?.opened ) { togglePictureInPicture(); } diff --git a/plugins/picture-in-picture/keyboardevent-from-electron-accelerator.d.ts b/plugins/picture-in-picture/keyboardevent-from-electron-accelerator.d.ts new file mode 100644 index 00000000..67af6f51 --- /dev/null +++ b/plugins/picture-in-picture/keyboardevent-from-electron-accelerator.d.ts @@ -0,0 +1,12 @@ +declare module 'keyboardevent-from-electron-accelerator' { + interface KeyboardEvent { + key?: string; + code?: string; + metaKey?: boolean; + altKey?: boolean; + ctrlKey?: boolean; + shiftKey?: boolean; + } + + export const toKeyEvent: (accelerator: string) => KeyboardEvent; +} diff --git a/plugins/picture-in-picture/keyboardevents-areequal.d.ts b/plugins/picture-in-picture/keyboardevents-areequal.d.ts new file mode 100644 index 00000000..ac219b1f --- /dev/null +++ b/plugins/picture-in-picture/keyboardevents-areequal.d.ts @@ -0,0 +1,14 @@ +declare module 'keyboardevents-areequal' { + interface KeyboardEvent { + key?: string; + code?: string; + metaKey?: boolean; + altKey?: boolean; + ctrlKey?: boolean; + shiftKey?: boolean; + } + + const areEqual: (event1: KeyboardEvent, event2: KeyboardEvent) => boolean; + + export default areEqual; +} diff --git a/plugins/picture-in-picture/menu.ts b/plugins/picture-in-picture/menu.ts index 107e9b06..ff154698 100644 --- a/plugins/picture-in-picture/menu.ts +++ b/plugins/picture-in-picture/menu.ts @@ -1,10 +1,14 @@ -const prompt = require('custom-electron-prompt'); +import prompt from 'custom-electron-prompt'; -const { setOptions } = require('./back.ts'); +import { BrowserWindow } from 'electron'; -const promptOptions = require('../../providers/prompt-options'); +import { setOptions } from './back'; -module.exports = (win, options) => [ +import promptOptions from '../../providers/prompt-options'; +import type { ConfigType } from '../../config/dynamic'; +import { MenuTemplate } from '../../menu'; + +export default (win: BrowserWindow, options: ConfigType<'picture-in-picture'>): MenuTemplate => [ { label: 'Always on top', type: 'checkbox', @@ -33,7 +37,7 @@ module.exports = (win, options) => [ { label: 'Hotkey', type: 'checkbox', - checked: options.hotkey, + checked: !!options.hotkey, async click(item) { const output = await prompt({ title: 'Picture in Picture Hotkey', @@ -51,7 +55,7 @@ module.exports = (win, options) => [ const { value, accelerator } = output[0]; setOptions({ [value]: accelerator }); - item.checked = Boolean(accelerator); + item.checked = !!accelerator; } else { // Reset checkbox if prompt was canceled item.checked = !item.checked; diff --git a/plugins/playback-speed/front.js b/plugins/playback-speed/front.ts similarity index 52% rename from plugins/playback-speed/front.js rename to plugins/playback-speed/front.ts index 7c01208f..77bf85cb 100644 --- a/plugins/playback-speed/front.js +++ b/plugins/playback-speed/front.ts @@ -1,14 +1,15 @@ -const { getSongMenu } = require('../../providers/dom-elements'); -const { ElementFromFile, templatePath } = require('../utils'); -const { singleton } = require('../../providers/decorators'); +import { getSongMenu } from '../../providers/dom-elements'; +import { ElementFromFile, templatePath } from '../utils'; +import { singleton } from '../../providers/decorators'; -function $(selector) { + +function $(selector: string) { return document.querySelector(selector); } const slider = ElementFromFile(templatePath(__dirname, 'slider.html')); -const roundToTwo = (n) => Math.round(n * 1e2) / 1e2; +const roundToTwo = (n: number) => Math.round(n * 1e2) / 1e2; const MIN_PLAYBACK_SPEED = 0.07; const MAX_PLAYBACK_SPEED = 16; @@ -16,19 +17,19 @@ const MAX_PLAYBACK_SPEED = 16; let playbackSpeed = 1; const updatePlayBackSpeed = () => { - $('video').playbackRate = playbackSpeed; + ($('video') as HTMLVideoElement).playbackRate = playbackSpeed; const playbackSpeedElement = $('#playback-speed-value'); if (playbackSpeedElement) { - playbackSpeedElement.innerHTML = playbackSpeed; + playbackSpeedElement.innerHTML = String(playbackSpeed); } }; -let menu; +let menu: Element | null = null; const setupSliderListener = singleton(() => { - $('#playback-speed-slider').addEventListener('immediate-value-changed', (e) => { - playbackSpeed = e.detail.value || MIN_PLAYBACK_SPEED; + $('#playback-speed-slider')?.addEventListener('immediate-value-changed', (e) => { + playbackSpeed = (e as CustomEvent<{ value: number; }>).detail.value || MIN_PLAYBACK_SPEED; if (isNaN(playbackSpeed)) { playbackSpeed = 1; } @@ -43,20 +44,28 @@ const observePopupContainer = () => { menu = getSongMenu(); } - if (menu && menu.parentElement.eventSink_?.matches('ytmusic-menu-renderer.ytmusic-player-bar') && !menu.contains(slider)) { + if ( + menu && + (menu.parentElement as HTMLElement & { eventSink_: Element | null }) + ?.eventSink_ + ?.matches('ytmusic-menu-renderer.ytmusic-player-bar')&& !menu.contains(slider) + ) { menu.prepend(slider); setupSliderListener(); } }); - observer.observe($('ytmusic-popup-container'), { - childList: true, - subtree: true, - }); + const popupContainer = $('ytmusic-popup-container'); + if (popupContainer) { + observer.observe(popupContainer, { + childList: true, + subtree: true, + }); + } }; const observeVideo = () => { - const video = $('video');+ + const video = $('video') as HTMLVideoElement; video.addEventListener('ratechange', forcePlaybackRate); video.addEventListener('srcChanged', forcePlaybackRate); }; @@ -76,17 +85,18 @@ const setupWheelListener = () => { updatePlayBackSpeed(); // Update slider position - $('#playback-speed-slider').value = playbackSpeed; + ($('#playback-speed-slider') as HTMLElement & { value: number }).value = playbackSpeed; }); }; -function forcePlaybackRate(e) { - if (e.target.playbackRate !== playbackSpeed) { - e.target.playbackRate = playbackSpeed; +function forcePlaybackRate(e: Event) { + const videoElement = (e.target as HTMLVideoElement); + if (videoElement.playbackRate !== playbackSpeed) { + videoElement.playbackRate = playbackSpeed; } } -module.exports = () => { +export default () => { document.addEventListener('apiLoaded', () => { observePopupContainer(); observeVideo(); diff --git a/plugins/precise-volume/back.js b/plugins/precise-volume/back.ts similarity index 55% rename from plugins/precise-volume/back.js rename to plugins/precise-volume/back.ts index e9215973..e4ef4ea9 100644 --- a/plugins/precise-volume/back.js +++ b/plugins/precise-volume/back.ts @@ -1,17 +1,20 @@ -const path = require('node:path'); +import path from 'node:path'; -const { globalShortcut } = require('electron'); +import { globalShortcut, BrowserWindow } from 'electron'; -const { injectCSS } = require('../utils'); +import { injectCSS } from '../utils'; +import type { ConfigType } from '../../config/dynamic'; /* This is used to determine if plugin is actually active -(not if its only enabled in options) +(not if it's only enabled in options) */ -let enabled = false; +let isEnabled = false; -module.exports = (win, options) => { - enabled = true; +export const enabled = () => isEnabled; + +export default (win: BrowserWindow, options: ConfigType<'precise-volume'>) => { + isEnabled = true; injectCSS(win.webContents, path.join(__dirname, 'volume-hud.css')); if (options.globalShortcuts?.volumeUp) { @@ -22,5 +25,3 @@ module.exports = (win, options) => { globalShortcut.register((options.globalShortcuts.volumeDown), () => win.webContents.send('changeVolume', false)); } }; - -module.exports.enabled = () => enabled; diff --git a/plugins/precise-volume/front.js b/plugins/precise-volume/front.ts similarity index 64% rename from plugins/precise-volume/front.js rename to plugins/precise-volume/front.ts index a8e8f818..5dad588c 100644 --- a/plugins/precise-volume/front.js +++ b/plugins/precise-volume/front.ts @@ -1,22 +1,25 @@ -const { ipcRenderer } = require('electron'); +import { ipcRenderer } from 'electron'; -const { setOptions, setMenuOptions, isEnabled } = require('../../config/plugins'); +import { setOptions, setMenuOptions, isEnabled } from '../../config/plugins'; +import { debounce } from '../../providers/decorators'; -function $(selector) { +import { YoutubePlayer } from '../../types/youtube-player'; + +import type { ConfigType } from '../../config/dynamic'; + +function $(selector: string) { return document.querySelector(selector); } -const { debounce } = require('../../providers/decorators'); +let api: YoutubePlayer; +let options: ConfigType<'precise-volume'>; -let api; -let options; - -module.exports = (_options) => { +export default (_options: ConfigType<'precise-volume'>) => { options = _options; document.addEventListener('apiLoaded', (e) => { api = e.detail; - ipcRenderer.on('changeVolume', (_, toIncrease) => changeVolume(toIncrease)); - ipcRenderer.on('setVolume', (_, value) => setVolume(value)); + ipcRenderer.on('changeVolume', (_, toIncrease: boolean) => changeVolume(toIncrease)); + ipcRenderer.on('setVolume', (_, value: number) => setVolume(value)); firstRun(); }, { once: true, passive: true }); }; @@ -26,23 +29,22 @@ const writeOptions = debounce(() => { setOptions('precise-volume', options); }, 1000); -const moveVolumeHud = debounce((showVideo) => { - const volumeHud = $('#volumeHud'); +export const moveVolumeHud = debounce((showVideo: boolean) => { + const volumeHud = $('#volumeHud') as HTMLElement | undefined; if (!volumeHud) { return; } volumeHud.style.top = showVideo - ? `${($('ytmusic-player').clientHeight - $('video').clientHeight) / 2}px` - : 0; + ? `${($('ytmusic-player')!.clientHeight - $('video')!.clientHeight) / 2}px` + : '0'; }, 250); -module.exports.moveVolumeHud = moveVolumeHud; -const hideVolumeHud = debounce((volumeHud) => { - volumeHud.style.opacity = 0; +const hideVolumeHud = debounce((volumeHud: HTMLElement) => { + volumeHud.style.opacity = '0'; }, 2000); -const hideVolumeSlider = debounce((slider) => { +const hideVolumeSlider = debounce((slider: HTMLElement) => { slider.classList.remove('on-hover'); }, 2500); @@ -61,14 +63,15 @@ function firstRun() { setupLocalArrowShortcuts(); - const noVid = $('#main-panel')?.computedStyleMap().get('display').value === 'none'; + // Workaround: computedStyleMap().get(string) returns CSSKeywordValue instead of CSSStyleValue + const noVid = ($('#main-panel')?.computedStyleMap().get('display') as CSSKeywordValue)?.value === 'none'; injectVolumeHud(noVid); if (!noVid) { setupVideoPlayerOnwheel(); if (!isEnabled('video-toggle')) { // Video-toggle handles hud positioning on its own const videoMode = () => api.getPlayerResponse().videoDetails?.musicVideoType !== 'MUSIC_VIDEO_TYPE_ATV'; - $('video').addEventListener('srcChanged', () => moveVolumeHud(videoMode())); + $('video')?.addEventListener('srcChanged', () => moveVolumeHud(videoMode())); } } @@ -79,51 +82,55 @@ function firstRun() { }); } -function injectVolumeHud(noVid) { +function injectVolumeHud(noVid: boolean) { if (noVid) { const position = 'top: 18px; right: 60px;'; const mainStyle = 'font-size: xx-large;'; - $('.center-content.ytmusic-nav-bar').insertAdjacentHTML('beforeend', + $('.center-content.ytmusic-nav-bar')?.insertAdjacentHTML('beforeend', ``); } else { const position = 'top: 10px; left: 10px;'; const mainStyle = 'font-size: xxx-large; webkit-text-stroke: 1px black; font-weight: 600;'; - $('#song-video').insertAdjacentHTML('afterend', + $('#song-video')?.insertAdjacentHTML('afterend', ``); } } -function showVolumeHud(volume) { - const volumeHud = $('#volumeHud'); +function showVolumeHud(volume: number) { + const volumeHud = $('#volumeHud') as HTMLElement | undefined; if (!volumeHud) { return; } volumeHud.textContent = `${volume}%`; - volumeHud.style.opacity = 1; + volumeHud.style.opacity = '1'; hideVolumeHud(volumeHud); } /** Add onwheel event to video player */ function setupVideoPlayerOnwheel() { - $('#main-panel').addEventListener('wheel', (event) => { + const panel = $('#main-panel') as HTMLElement | undefined; + if (!panel) return; + + panel.addEventListener('wheel', (event) => { event.preventDefault(); // Event.deltaY < 0 means wheel-up changeVolume(event.deltaY < 0); }); } -function saveVolume(volume) { +function saveVolume(volume: number) { options.savedVolume = volume; writeOptions(); } /** Add onwheel event to play bar and also track if play bar is hovered */ function setupPlaybar() { - const playerbar = $('ytmusic-player-bar'); + const playerbar = $('ytmusic-player-bar') as HTMLElement | undefined; + if (!playerbar) return; playerbar.addEventListener('wheel', (event) => { event.preventDefault(); @@ -148,23 +155,28 @@ function setupSliderObserver() { const sliderObserver = new MutationObserver((mutations) => { for (const mutation of mutations) { // This checks that volume-slider was manually set - if (mutation.oldValue !== mutation.target.value - && (typeof options.savedVolume !== 'number' || Math.abs(options.savedVolume - mutation.target.value) > 4)) { + const target = mutation.target as HTMLInputElement; + const targetValueNumeric = Number(target.value); + if (mutation.oldValue !== target.value + && (typeof options.savedVolume !== 'number' || Math.abs(options.savedVolume - targetValueNumeric) > 4)) { // Diff>4 means it was manually set - setTooltip(mutation.target.value); - saveVolume(mutation.target.value); + setTooltip(targetValueNumeric); + saveVolume(targetValueNumeric); } } }); + const slider = $('#volume-slider'); + if (!slider) return; + // Observing only changes in 'value' of volume-slider - sliderObserver.observe($('#volume-slider'), { + sliderObserver.observe(slider, { attributeFilter: ['value'], attributeOldValue: true, }); } -function setVolume(value) { +function setVolume(value: number) { api.setVolume(value); // Save the new volume saveVolume(value); @@ -181,7 +193,7 @@ function setVolume(value) { } /** If (toIncrease = false) then volume decrease */ -function changeVolume(toIncrease) { +function changeVolume(toIncrease: boolean) { // Apply volume change if valid const steps = Number(options.steps || 1); setVolume(toIncrease @@ -190,17 +202,20 @@ function changeVolume(toIncrease) { } function updateVolumeSlider() { + const savedVolume = options.savedVolume ?? 0; // Slider value automatically rounds to multiples of 5 for (const slider of ['#volume-slider', '#expand-volume-slider']) { - $(slider).value - = options.savedVolume > 0 && options.savedVolume < 5 + ($(slider) as HTMLInputElement).value + = String(savedVolume > 0 && savedVolume < 5 ? 5 - : options.savedVolume; + : savedVolume); } } function showVolumeSlider() { - const slider = $('#volume-slider'); + const slider = $('#volume-slider') as HTMLElement | null; + if (!slider) return; + // This class display the volume slider if not in minimized mode slider.classList.add('on-hover'); @@ -215,16 +230,16 @@ const tooltipTargets = [ '#expand-volume', ]; -function setTooltip(volume) { +function setTooltip(volume: number) { for (const target of tooltipTargets) { - $(target).title = `${volume}%`; + ($(target) as HTMLElement).title = `${volume}%`; } } function setupLocalArrowShortcuts() { if (options.arrowsShortcut) { window.addEventListener('keydown', (event) => { - if ($('ytmusic-search-box').opened) { + if (($('ytmusic-search-box') as (HTMLElement & { opened: boolean }) | null)?.opened) { return; } diff --git a/plugins/precise-volume/menu.js b/plugins/precise-volume/menu.ts similarity index 60% rename from plugins/precise-volume/menu.js rename to plugins/precise-volume/menu.ts index ea4c0ff5..de6dfceb 100644 --- a/plugins/precise-volume/menu.js +++ b/plugins/precise-volume/menu.ts @@ -1,15 +1,20 @@ -const prompt = require('custom-electron-prompt'); +import prompt, { KeybindOptions } from 'custom-electron-prompt'; -const { enabled } = require('./back'); +import { BrowserWindow, MenuItem } from 'electron'; -const { setMenuOptions } = require('../../config/plugins'); -const promptOptions = require('../../providers/prompt-options'); +import { enabled } from './back'; -function changeOptions(changedOptions, options, win) { +import { setMenuOptions } from '../../config/plugins'; +import promptOptions from '../../providers/prompt-options'; +import { MenuTemplate } from '../../menu'; + +import type { ConfigType } from '../../config/dynamic'; + +function changeOptions(changedOptions: Partial>, options: ConfigType<'precise-volume'>, win: BrowserWindow) { for (const option in changedOptions) { - options[option] = changedOptions[option]; + // HACK: Weird TypeScript error + (options as Record)[option] = (changedOptions as Record)[option]; } - // Dynamically change setting if plugin is enabled if (enabled()) { win.webContents.send('setOptions', changedOptions); @@ -18,7 +23,7 @@ function changeOptions(changedOptions, options, win) { } } -module.exports = (win, options) => [ +export default (win: BrowserWindow, options: ConfigType<'precise-volume'>): MenuTemplate => [ { label: 'Local Arrowkeys Controls', type: 'checkbox', @@ -40,9 +45,9 @@ module.exports = (win, options) => [ ]; // Helper function for globalShortcuts prompt -const kb = (label_, value_, default_) => ({ value: value_, label: label_, default: default_ || undefined }); +const kb = (label_: string, value_: string, default_: string): KeybindOptions => ({ 'value': value_, 'label': label_, 'default': default_ || undefined }); -async function promptVolumeSteps(win, options) { +async function promptVolumeSteps(win: BrowserWindow, options: ConfigType<'precise-volume'>) { const output = await prompt({ title: 'Volume Steps', label: 'Choose Volume Increase/Decrease Steps', @@ -58,7 +63,7 @@ async function promptVolumeSteps(win, options) { } } -async function promptGlobalShortcuts(win, options, item) { +async function promptGlobalShortcuts(win: BrowserWindow, options: ConfigType<'precise-volume'>, item: MenuItem) { const output = await prompt({ title: 'Global Volume Keybinds', label: 'Choose Global Volume Keybinds:', @@ -71,9 +76,12 @@ async function promptGlobalShortcuts(win, options, item) { }, win); if (output) { - const newGlobalShortcuts = {}; + const newGlobalShortcuts: { + volumeUp: string; + volumeDown: string; + } = { volumeUp: '', volumeDown: '' }; for (const { value, accelerator } of output) { - newGlobalShortcuts[value] = accelerator; + newGlobalShortcuts[value as keyof typeof newGlobalShortcuts] = accelerator; } changeOptions({ globalShortcuts: newGlobalShortcuts }, options, win); diff --git a/plugins/precise-volume/preload.js b/plugins/precise-volume/preload.js deleted file mode 100644 index ab16e6c1..00000000 --- a/plugins/precise-volume/preload.js +++ /dev/null @@ -1,32 +0,0 @@ -const is = require('electron-is'); - -let ignored = { - id: ['volume-slider', 'expand-volume-slider'], - types: ['mousewheel', 'keydown', 'keyup'], -}; - -function overrideAddEventListener() { - // Save native addEventListener - Element.prototype._addEventListener = Element.prototype.addEventListener; - // Override addEventListener to Ignore specific events in volume-slider - Element.prototype.addEventListener = function (type, listener, useCapture = false) { - if (!( - ignored.id.includes(this.id) - && ignored.types.includes(type) - )) { - this._addEventListener(type, listener, useCapture); - } else if (is.dev()) { - console.log(`Ignoring event: "${this.id}.${type}()"`); - } - }; -} - -module.exports = () => { - overrideAddEventListener(); - // Restore original function after finished loading to avoid keeping Element.prototype altered - window.addEventListener('load', () => { - Element.prototype.addEventListener = Element.prototype._addEventListener; - Element.prototype._addEventListener = undefined; - ignored = undefined; - }, { once: true }); -}; diff --git a/plugins/precise-volume/preload.ts b/plugins/precise-volume/preload.ts new file mode 100644 index 00000000..363ee527 --- /dev/null +++ b/plugins/precise-volume/preload.ts @@ -0,0 +1,41 @@ +/* what */ +/* eslint-disable @typescript-eslint/ban-ts-comment */ + +import is from 'electron-is'; + +const ignored = { + id: ['volume-slider', 'expand-volume-slider'], + types: ['mousewheel', 'keydown', 'keyup'], +}; + +function overrideAddEventListener() { + // YO WHAT ARE YOU DOING NOW?!?! + // Save native addEventListener + // @ts-ignore + // eslint-disable-next-line @typescript-eslint/unbound-method + Element.prototype._addEventListener = Element.prototype.addEventListener; + // Override addEventListener to Ignore specific events in volume-slider + Element.prototype.addEventListener = function (type: string, listener: (event: Event) => void, useCapture = false) { + if (!( + ignored.id.includes(this.id) + && ignored.types.includes(type) + )) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access + (this as any)._addEventListener(type, listener, useCapture); + } else if (is.dev()) { + console.log(`Ignoring event: "${this.id}.${type}()"`); + } + }; +} + +export default () => { + overrideAddEventListener(); + // Restore original function after finished loading to avoid keeping Element.prototype altered + window.addEventListener('load', () => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-member-access + Element.prototype.addEventListener = (Element.prototype as any)._addEventListener; + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-member-access + (Element.prototype as any)._addEventListener = undefined; + + }, { once: true }); +}; diff --git a/plugins/quality-changer/back.js b/plugins/quality-changer/back.ts similarity index 55% rename from plugins/quality-changer/back.js rename to plugins/quality-changer/back.ts index eafce7a2..957320dd 100644 --- a/plugins/quality-changer/back.js +++ b/plugins/quality-changer/back.ts @@ -1,7 +1,7 @@ -const { ipcMain, dialog } = require('electron'); +import { ipcMain, dialog } from 'electron'; -module.exports = () => { - ipcMain.handle('qualityChanger', async (_, qualityLabels, currentIndex) => await dialog.showMessageBox({ +export default () => { + ipcMain.handle('qualityChanger', async (_, qualityLabels: string[], currentIndex: number) => await dialog.showMessageBox({ type: 'question', buttons: qualityLabels, defaultId: currentIndex, diff --git a/plugins/quality-changer/front.js b/plugins/quality-changer/front.ts similarity index 55% rename from plugins/quality-changer/front.js rename to plugins/quality-changer/front.ts index 0ee25ce8..dd47a87b 100644 --- a/plugins/quality-changer/front.js +++ b/plugins/quality-changer/front.ts @@ -1,8 +1,9 @@ -const { ipcRenderer } = require('electron'); +import { ipcRenderer } from 'electron'; -const { ElementFromFile, templatePath } = require('../utils'); +import { ElementFromFile, templatePath } from '../utils'; +import { YoutubePlayer } from '../../types/youtube-player'; -function $(selector) { +function $(selector: string): HTMLElement | null { return document.querySelector(selector); } @@ -10,32 +11,19 @@ const qualitySettingsButton = ElementFromFile( templatePath(__dirname, 'qualitySettingsTemplate.html'), ); -module.exports = () => { - document.addEventListener('apiLoaded', setup, { once: true, passive: true }); -}; - -function setup(event) { - /** - * @type {{ - * getAvailableQualityLevels: () => string[], - * getPlaybackQuality: () => string, - * getAvailableQualityLabels: () => string[], - * setPlaybackQualityRange: (quality: string) => void, - * setPlaybackQuality: (quality: string) => void, - * }} - */ +function setup(event: CustomEvent) { const api = event.detail; - $('.top-row-buttons.ytmusic-player').prepend(qualitySettingsButton); + $('.top-row-buttons.ytmusic-player')?.prepend(qualitySettingsButton); qualitySettingsButton.addEventListener('click', function chooseQuality() { - setTimeout(() => $('#player').click()); + setTimeout(() => $('#player')?.click()); const qualityLevels = api.getAvailableQualityLevels(); const currentIndex = qualityLevels.indexOf(api.getPlaybackQuality()); - ipcRenderer.invoke('qualityChanger', api.getAvailableQualityLabels(), currentIndex).then((promise) => { + ipcRenderer.invoke('qualityChanger', api.getAvailableQualityLabels(), currentIndex).then((promise: { response: number }) => { if (promise.response === -1) { return; } @@ -46,3 +34,7 @@ function setup(event) { }); }); } + +export default () => { + document.addEventListener('apiLoaded', setup, { once: true, passive: true }); +}; diff --git a/plugins/shortcuts/back.js b/plugins/shortcuts/back.ts similarity index 54% rename from plugins/shortcuts/back.js rename to plugins/shortcuts/back.ts index ca4500a4..8447092f 100644 --- a/plugins/shortcuts/back.js +++ b/plugins/shortcuts/back.ts @@ -1,24 +1,26 @@ -const { globalShortcut } = require('electron'); -const is = require('electron-is'); -const electronLocalshortcut = require('electron-localshortcut'); +import { BrowserWindow, globalShortcut } from 'electron'; +import is from 'electron-is'; +import electronLocalshortcut from 'electron-localshortcut'; -const registerMPRIS = require('./mpris'); +import registerMPRIS from './mpris'; -const getSongControls = require('../../providers/song-controls'); +import getSongControls from '../../providers/song-controls'; -function _registerGlobalShortcut(webContents, shortcut, action) { +import type { ConfigType } from '../../config/dynamic'; + +function _registerGlobalShortcut(webContents: Electron.WebContents, shortcut: string, action: (webContents: Electron.WebContents) => void) { globalShortcut.register(shortcut, () => { action(webContents); }); } -function _registerLocalShortcut(win, shortcut, action) { +function _registerLocalShortcut(win: BrowserWindow, shortcut: string, action: (webContents: Electron.WebContents) => void) { electronLocalshortcut.register(win, shortcut, () => { action(win.webContents); }); } -function registerShortcuts(win, options) { +function registerShortcuts(win: BrowserWindow, options: ConfigType<'shortcuts'>) { const songControls = getSongControls(win); const { playPause, next, previous, search } = songControls; @@ -39,28 +41,29 @@ function registerShortcuts(win, options) { const shortcutOptions = { global, local }; for (const optionType in shortcutOptions) { - registerAllShortcuts(shortcutOptions[optionType], optionType); + registerAllShortcuts(shortcutOptions[optionType as 'global' | 'local'], optionType); } - function registerAllShortcuts(container, type) { + function registerAllShortcuts(container: Record, type: string) { for (const action in container) { if (!container[action]) { continue; // Action accelerator is empty } console.debug(`Registering ${type} shortcut`, container[action], ':', action); - if (!songControls[action]) { + const actionCallback: () => void = songControls[action as keyof typeof songControls]; + if (typeof actionCallback !== 'function') { console.warn('Invalid action', action); continue; } if (type === 'global') { - _registerGlobalShortcut(win.webContents, container[action], songControls[action]); + _registerGlobalShortcut(win.webContents, container[action], actionCallback); } else { // Type === "local" - _registerLocalShortcut(win, local[action], songControls[action]); + _registerLocalShortcut(win, local[action], actionCallback); } } } } -module.exports = registerShortcuts; +export default registerShortcuts; diff --git a/plugins/shortcuts/menu.js b/plugins/shortcuts/menu.ts similarity index 56% rename from plugins/shortcuts/menu.js rename to plugins/shortcuts/menu.ts index 66f6a566..b5bc2471 100644 --- a/plugins/shortcuts/menu.js +++ b/plugins/shortcuts/menu.ts @@ -1,9 +1,14 @@ -const prompt = require('custom-electron-prompt'); +import prompt, { KeybindOptions } from 'custom-electron-prompt'; -const { setMenuOptions } = require('../../config/plugins'); -const promptOptions = require('../../providers/prompt-options'); +import { BrowserWindow } from 'electron'; -module.exports = (win, options) => [ +import { setMenuOptions } from '../../config/plugins'; +import type { ConfigType } from '../../config/dynamic'; + +import promptOptions from '../../providers/prompt-options'; +import { MenuTemplate } from '../../menu'; + +export default (win: BrowserWindow, options: ConfigType<'shortcuts'>): MenuTemplate => [ { label: 'Set Global Song Controls', click: () => promptKeybind(options, win), @@ -16,7 +21,11 @@ module.exports = (win, options) => [ }, ]; -function setOption(options, key = null, newValue = null) { +function setOption = keyof ConfigType<'shortcuts'>>( + options: ConfigType<'shortcuts'>, + key: Key | null = null, + newValue: ConfigType<'shortcuts'>[Key] | null = null, +) { if (key && newValue !== null) { options[key] = newValue; } @@ -25,9 +34,9 @@ function setOption(options, key = null, newValue = null) { } // Helper function for keybind prompt -const kb = (label_, value_, default_) => ({ value: value_, label: label_, default: default_ }); +const kb = (label_: string, value_: string, default_: string): KeybindOptions => ({ value: value_, label: label_, default: default_ }); -async function promptKeybind(options, win) { +async function promptKeybind(options: ConfigType<'shortcuts'>, win: BrowserWindow) { const output = await prompt({ title: 'Global Keybinds', label: 'Choose Global Keybinds for Songs Control:', diff --git a/plugins/shortcuts/mpris-service.d.ts b/plugins/shortcuts/mpris-service.d.ts new file mode 100644 index 00000000..3f9ceff8 --- /dev/null +++ b/plugins/shortcuts/mpris-service.d.ts @@ -0,0 +1,129 @@ +declare module 'mpris-service' { + import { EventEmitter } from 'events'; + + import dbus from 'dbus-next'; + + + interface RootInterfaceOptions { + identity: string; + supportedUriSchemes: string[]; + supportedMimeTypes: string[]; + desktopEntry: string; + } + + export interface Track { + 'mpris:trackid'?: string; + 'mpris:length'?: number; + 'mpris:artUrl'?: string; + 'xesam:album'?: string; + 'xesam:albumArtist'?: string[]; + 'xesam:artist'?: string[]; + 'xesam:asText'?: string; + 'xesam:audioBPM'?: number; + 'xesam:autoRating'?: number; + 'xesam:comment'?: string[]; + 'xesam:composer'?: string[]; + 'xesam:contentCreated'?: string; + 'xesam:discNumber'?: number; + 'xesam:firstUsed'?: string; + 'xesam:genre'?: string[]; + 'xesam:lastUsed'?: string; + 'xesam:lyricist'?: string[]; + 'xesam:title'?: string; + 'xesam:trackNumber'?: number; + 'xesam:url'?: string; + 'xesam:useCount'?: number; + 'xesam:userRating'?: number; + } + + declare class Player extends EventEmitter { + constructor(opts: { + name: string; + identity: string; + supportedMimeTypes?: string[]; + supportedInterfaces?: string[]; + }); + + name: string; + identity: string; + fullscreen: boolean; + supportedUriSchemes: string[]; + supportedMimeTypes: string[]; + canQuit: boolean; + canRaise: boolean; + canSetFullscreen: boolean; + hasTrackList: boolean; + desktopEntry: string; + playbackStatus: string; + loopStatus: string; + shuffle: boolean; + metadata: object; + volume: number; + canControl: boolean; + canPause: boolean; + canPlay: boolean; + canSeek: boolean; + canGoNext: boolean; + canGoPrevious: boolean; + rate: number; + minimumRate: number; + maximumRate: number; + playlists: unknown[]; + activePlaylist: string; + + init(opts: RootInterfaceOptions): void; + + objectPath(subpath?: string): string; + + seeked(position: number): void; + + getTrackIndex(trackId: string): number; + + getTrack(trackId: string): Track; + + addTrack(track: Track): void; + + removeTrack(trackId: string): void; + + getPlaylistIndex(playlistId: string): number; + + setPlaylists(playlists: Track[]): void; + + setActivePlaylist(playlistId: string): void; + + static PLAYBACK_STATUS_PLAYING: 'Playing'; + static PLAYBACK_STATUS_PAUSED: 'Paused'; + static PLAYBACK_STATUS_STOPPED: 'Stopped'; + static LOOP_STATUS_NONE: 'None'; + static LOOP_STATUS_TRACK: 'Track'; + static LOOP_STATUS_PLAYLIST: 'Playlist'; + } + + interface MprisInterface extends dbus.interface.Interface { + setProperty(property: string, valuePlain: unknown): void; + } + + interface RootInterface { + } + + interface PlayerInterface { + } + + interface TracklistInterface { + + TrackListReplaced(tracks: Track[]): void; + + TrackAdded(afterTrack: string): void; + + TrackRemoved(trackId: string): void; + } + + interface PlaylistsInterface { + + PlaylistChanged(playlist: unknown[]): void; + + setActivePlaylistId(playlistId: string): void; + } + + export default Player; +} diff --git a/plugins/shortcuts/mpris.js b/plugins/shortcuts/mpris.ts similarity index 76% rename from plugins/shortcuts/mpris.js rename to plugins/shortcuts/mpris.ts index 9fe2e4e6..5c7d3dad 100644 --- a/plugins/shortcuts/mpris.js +++ b/plugins/shortcuts/mpris.ts @@ -1,32 +1,34 @@ -const { ipcMain } = require('electron'); -const mpris = require('mpris-service'); +import { BrowserWindow, ipcMain } from 'electron'; -const registerCallback = require('../../providers/song-info'); -const getSongControls = require('../../providers/song-controls'); -const config = require('../../config'); +import mpris, { Track } from 'mpris-service'; + +import registerCallback from '../../providers/song-info'; +import getSongControls from '../../providers/song-controls'; +import config from '../../config'; function setupMPRIS() { - return mpris({ + const instance = new mpris({ name: 'youtube-music', identity: 'YouTube Music', - canRaise: true, - supportedUriSchemes: ['https'], supportedMimeTypes: ['audio/mpeg'], supportedInterfaces: ['player'], - desktopEntry: 'youtube-music', }); + instance.canRaise = true; + instance.supportedUriSchemes = ['https']; + instance.desktopEntry = 'youtube-music'; + return instance; } -/** @param {Electron.BrowserWindow} win */ -function registerMPRIS(win) { +function registerMPRIS(win: BrowserWindow) { const songControls = getSongControls(win); const { playPause, next, previous, volumeMinus10, volumePlus10, shuffle } = songControls; try { - const secToMicro = (n) => Math.round(Number(n) * 1e6); - const microToSec = (n) => Math.round(Number(n) / 1e6); + // TODO: "Typing" for this arguments + const secToMicro = (n: unknown) => Math.round(Number(n) * 1e6); + const microToSec = (n: unknown) => Math.round(Number(n) / 1e6); - const seekTo = (e) => win.webContents.send('seekTo', microToSec(e.position)); - const seekBy = (o) => win.webContents.send('seekBy', microToSec(o)); + const seekTo = (e: { position: unknown }) => win.webContents.send('seekTo', microToSec(e.position)); + const seekBy = (o: unknown) => win.webContents.send('seekBy', microToSec(o)); const player = setupMPRIS(); @@ -37,12 +39,12 @@ function registerMPRIS(win) { win.webContents.send('setupVolumeChangedListener', 'mpris'); }); - ipcMain.on('seeked', (_, t) => player.seeked(secToMicro(t))); + ipcMain.on('seeked', (_, t: number) => player.seeked(secToMicro(t))); let currentSeconds = 0; - ipcMain.on('timeChanged', (_, t) => currentSeconds = t); + ipcMain.on('timeChanged', (_, t: number) => currentSeconds = t); - ipcMain.on('repeatChanged', (_, mode) => { + ipcMain.on('repeatChanged', (_, mode: string) => { switch (mode) { case 'NONE': { player.loopStatus = mpris.LOOP_STATUS_NONE; @@ -64,7 +66,7 @@ function registerMPRIS(win) { } } }); - player.on('loopStatus', (status) => { + player.on('loopStatus', (status: string) => { // SwitchRepeat cycles between states in that order const switches = [mpris.LOOP_STATUS_NONE, mpris.LOOP_STATUS_PLAYLIST, mpris.LOOP_STATUS_TRACK]; const currentIndex = switches.indexOf(player.loopStatus); @@ -75,8 +77,6 @@ function registerMPRIS(win) { songControls.switchRepeat(delta); }); - player.getPosition = () => secToMicro(currentSeconds); - player.on('raise', () => { win.setSkipTaskbar(false); win.show(); @@ -114,7 +114,7 @@ function registerMPRIS(win) { let mprisVolNewer = false; let autoUpdate = false; ipcMain.on('volumeChanged', (_, newVol) => { - if (Number.parseInt(player.volume * 100) !== newVol) { + if (~~(player.volume * 100) !== newVol) { if (mprisVolNewer) { mprisVolNewer = false; autoUpdate = false; @@ -130,8 +130,8 @@ function registerMPRIS(win) { player.on('volume', (newVolume) => { if (config.plugins.isEnabled('precise-volume')) { // With precise volume we can set the volume to the exact value. - const newVol = Number.parseInt(newVolume * 100); - if (Number.parseInt(player.volume * 100) !== newVol && !autoUpdate) { + const newVol = ~~(newVolume * 100); + if (~~(player.volume * 100) !== newVol && !autoUpdate) { mprisVolNewer = true; autoUpdate = false; win.webContents.send('setVolume', newVol); @@ -155,9 +155,9 @@ function registerMPRIS(win) { registerCallback((songInfo) => { if (player) { - const data = { + const data: Track = { 'mpris:length': secToMicro(songInfo.songDuration), - 'mpris:artUrl': songInfo.imageSrc, + 'mpris:artUrl': songInfo.imageSrc ?? undefined, 'xesam:title': songInfo.title, 'xesam:url': songInfo.url, 'xesam:artist': [songInfo.artist], @@ -177,4 +177,4 @@ function registerMPRIS(win) { } } -module.exports = registerMPRIS; +export default registerMPRIS; diff --git a/plugins/skip-silences/front.ts b/plugins/skip-silences/front.ts index 6ad8853a..b1db4199 100644 --- a/plugins/skip-silences/front.ts +++ b/plugins/skip-silences/front.ts @@ -1,7 +1,6 @@ -import config from '../../config'; +import type { ConfigType } from '../../config/dynamic'; -const SkipSilencesOptionsObj = config.get('plugins.skip-silences'); -type SkipSilencesOptions = typeof SkipSilencesOptionsObj; +type SkipSilencesOptions = ConfigType<'skip-silences'>; export default (options: SkipSilencesOptions) => { let isSilent = false; diff --git a/plugins/sponsorblock/back.js b/plugins/sponsorblock/back.ts similarity index 53% rename from plugins/sponsorblock/back.js rename to plugins/sponsorblock/back.ts index 2014705f..1a95c776 100644 --- a/plugins/sponsorblock/back.js +++ b/plugins/sponsorblock/back.ts @@ -1,26 +1,31 @@ -const { ipcMain } = require('electron'); -const is = require('electron-is'); +import { BrowserWindow, ipcMain } from 'electron'; +import is from 'electron-is'; -const { sortSegments } = require('./segments'); +import { sortSegments } from './segments'; -const defaultConfig = require('../../config/defaults'); +import { SkipSegment } from './types'; -let videoID; +import defaultConfig from '../../config/defaults'; +import { GetPlayerResponse } from '../../types/get-player-response'; -module.exports = (win, options) => { +import type { ConfigType } from '../../config/dynamic'; + +let videoID: string; + +export default (win: BrowserWindow, options: ConfigType<'sponsorblock'>) => { const { apiURL, categories } = { ...defaultConfig.plugins.sponsorblock, ...options, }; - ipcMain.on('video-src-changed', async (_, data) => { - videoID = JSON.parse(data)?.videoDetails?.videoId; + ipcMain.on('video-src-changed', async (_, data: string) => { + videoID = (JSON.parse(data) as GetPlayerResponse)?.videoDetails?.videoId; const segments = await fetchSegments(apiURL, categories); win.webContents.send('sponsorblock-skip', segments); }); }; -const fetchSegments = async (apiURL, categories) => { +const fetchSegments = async (apiURL: string, categories: string[]) => { const sponsorBlockURL = `${apiURL}/api/skipSegments?videoID=${videoID}&categories=${JSON.stringify( categories, )}`; @@ -36,7 +41,7 @@ const fetchSegments = async (apiURL, categories) => { return []; } - const segments = await resp.json(); + const segments = await resp.json() as SkipSegment[]; return sortSegments( segments.map((submission) => submission.segment), ); diff --git a/plugins/sponsorblock/front.js b/plugins/sponsorblock/front.js deleted file mode 100644 index d045f36b..00000000 --- a/plugins/sponsorblock/front.js +++ /dev/null @@ -1,30 +0,0 @@ -const { ipcRenderer } = require('electron'); -const is = require('electron-is'); - -let currentSegments = []; - -module.exports = () => { - ipcRenderer.on('sponsorblock-skip', (_, segments) => { - currentSegments = segments; - }); - - document.addEventListener('apiLoaded', () => { - const video = document.querySelector('video'); - - video.addEventListener('timeupdate', (e) => { - for (const segment of currentSegments) { - if ( - e.target.currentTime >= segment[0] - && e.target.currentTime < segment[1] - ) { - e.target.currentTime = segment[1]; - if (is.dev()) { - console.log('SponsorBlock: skipping segment', segment); - } - } - } - }); - // Reset segments on song end - video.addEventListener('emptied', () => currentSegments = []); - }, { once: true, passive: true }); -}; diff --git a/plugins/sponsorblock/front.ts b/plugins/sponsorblock/front.ts new file mode 100644 index 00000000..960c97ba --- /dev/null +++ b/plugins/sponsorblock/front.ts @@ -0,0 +1,35 @@ +import { ipcRenderer } from 'electron'; +import is from 'electron-is'; + +import { Segment } from './types'; + +let currentSegments: Segment[] = []; + +export default () => { + ipcRenderer.on('sponsorblock-skip', (_, segments: Segment[]) => { + currentSegments = segments; + }); + + document.addEventListener('apiLoaded', () => { + const video = document.querySelector('video') as HTMLVideoElement | undefined; + if (!video) return; + + video.addEventListener('timeupdate', (e) => { + const target = e.target as HTMLVideoElement; + + for (const segment of currentSegments) { + if ( + target.currentTime >= segment[0] + && target.currentTime < segment[1] + ) { + target.currentTime = segment[1]; + if (is.dev()) { + console.log('SponsorBlock: skipping segment', segment); + } + } + } + }); + // Reset segments on song end + video.addEventListener('emptied', () => currentSegments = []); + }, { once: true, passive: true }); +}; diff --git a/plugins/sponsorblock/segments.js b/plugins/sponsorblock/segments.ts similarity index 69% rename from plugins/sponsorblock/segments.js rename to plugins/sponsorblock/segments.ts index bc034878..e6d38666 100644 --- a/plugins/sponsorblock/segments.js +++ b/plugins/sponsorblock/segments.ts @@ -1,13 +1,15 @@ // Segments are an array [ [start, end], … ] -module.exports.sortSegments = (segments) => { +import { Segment } from './types'; + +export const sortSegments = (segments: Segment[]) => { segments.sort((segment1, segment2) => segment1[0] === segment2[0] ? segment1[1] - segment2[1] : segment1[0] - segment2[0], ); - const compiledSegments = []; - let currentSegment; + const compiledSegments: Segment[] = []; + let currentSegment: Segment | undefined; for (const segment of segments) { if (!currentSegment) { @@ -24,7 +26,9 @@ module.exports.sortSegments = (segments) => { currentSegment[1] = Math.max(currentSegment[1], segment[1]); } - compiledSegments.push(currentSegment); + if (currentSegment) { + compiledSegments.push(currentSegment); + } return compiledSegments; }; diff --git a/plugins/sponsorblock/types.ts b/plugins/sponsorblock/types.ts new file mode 100644 index 00000000..4bfe7e36 --- /dev/null +++ b/plugins/sponsorblock/types.ts @@ -0,0 +1,12 @@ +export type Segment = [number, number]; + +export interface SkipSegment { // Array of this object + segment: Segment; //[0, 15.23] start and end time in seconds + UUID: string, + category: string, // [1] + videoDuration: number // Duration of video when submission occurred (to be used to determine when a submission is out of date). 0 when unknown. +- 1 second + actionType: string, // [3] + locked: number, // if submission is locked + votes: number, // Votes on segment + description: string, // title for chapters, empty string for other segments +} diff --git a/plugins/touchbar/back.ts b/plugins/touchbar/back.ts index 01091b33..bbfea578 100644 --- a/plugins/touchbar/back.ts +++ b/plugins/touchbar/back.ts @@ -61,7 +61,7 @@ const touchBar = new TouchBar({ ], }); -module.exports = (win: BrowserWindow) => { +export default (win: BrowserWindow) => { const { playPause, next, previous, dislike, like } = getSongControls(win); // If the page is ready, register the callback diff --git a/plugins/tuna-obs/back.ts b/plugins/tuna-obs/back.ts index 76c26997..c01b6557 100644 --- a/plugins/tuna-obs/back.ts +++ b/plugins/tuna-obs/back.ts @@ -44,7 +44,7 @@ const post = (data: Data) => { }).catch((error: { code: number, errno: number }) => console.log(`Error: '${error.code || error.errno}' - when trying to access obs-tuna webserver at port ${port}`)); }; -module.exports = (win: BrowserWindow) => { +export default (win: BrowserWindow) => { ipcMain.on('apiLoaded', () => win.webContents.send('setupTimeChangedListener')); ipcMain.on('timeChanged', (_, t: number) => { if (!data.title) { diff --git a/plugins/utils.ts b/plugins/utils.ts index e5bfdc63..441af4f8 100644 --- a/plugins/utils.ts +++ b/plugins/utils.ts @@ -29,7 +29,7 @@ export const triggerAction = (channel: string, act export const triggerActionSync = (channel: string, action: ValueOf, ...args: Parameters): unknown => ipcRenderer.sendSync(channel, action, ...args); -export const listenAction = (channel: string, callback: (event: Electron.IpcMainEvent, ...args: Parameters) => void) => ipcMain.on(channel, callback); +export const listenAction = (channel: string, callback: (event: Electron.IpcMainEvent, action: string) => void) => ipcMain.on(channel, callback); export const fileExists = ( path: fs.PathLike, @@ -48,7 +48,7 @@ export const fileExists = ( }; const cssToInject = new Map(); -export const injectCSS = (webContents: Electron.WebContents, filepath: unknown, cb = undefined) => { +export const injectCSS = (webContents: Electron.WebContents, filepath: unknown, cb: (() => void) | undefined = undefined) => { if (cssToInject.size === 0) { setupCssInjection(webContents); } diff --git a/plugins/video-toggle/back.js b/plugins/video-toggle/back.js deleted file mode 100644 index d6d0968f..00000000 --- a/plugins/video-toggle/back.js +++ /dev/null @@ -1,11 +0,0 @@ -const path = require('node:path'); - -const { injectCSS } = require('../utils'); - -module.exports = (win, options) => { - if (options.forceHide) { - injectCSS(win.webContents, path.join(__dirname, 'force-hide.css')); - } else if (!options.mode || options.mode === 'custom') { - injectCSS(win.webContents, path.join(__dirname, 'button-switcher.css')); - } -}; diff --git a/plugins/video-toggle/back.ts b/plugins/video-toggle/back.ts new file mode 100644 index 00000000..944900e8 --- /dev/null +++ b/plugins/video-toggle/back.ts @@ -0,0 +1,14 @@ +import path from 'node:path'; + +import { BrowserWindow } from 'electron'; + +import { injectCSS } from '../utils'; +import type { ConfigType } from '../../config/dynamic'; + +export default (win: BrowserWindow, options: ConfigType<'video-toggle'>) => { + if (options.forceHide) { + injectCSS(win.webContents, path.join(__dirname, 'force-hide.css')); + } else if (!options.mode || options.mode === 'custom') { + injectCSS(win.webContents, path.join(__dirname, 'button-switcher.css')); + } +}; diff --git a/plugins/video-toggle/front.js b/plugins/video-toggle/front.ts similarity index 52% rename from plugins/video-toggle/front.js rename to plugins/video-toggle/front.ts index c36d0015..839b899f 100644 --- a/plugins/video-toggle/front.js +++ b/plugins/video-toggle/front.ts @@ -1,37 +1,41 @@ -const { ElementFromFile, templatePath } = require('../utils'); -const { setOptions, isEnabled } = require('../../config/plugins'); +import { ElementFromFile, templatePath } from '../utils'; +import { setOptions, isEnabled } from '../../config/plugins'; -const moveVolumeHud = isEnabled('precise-volume') ? require('../precise-volume/front').moveVolumeHud : () => { -}; +import { moveVolumeHud as preciseVolumeMoveVolumeHud } from '../precise-volume/front'; +import type { ConfigType } from '../../config/dynamic'; +import { YoutubePlayer } from '../../types/youtube-player'; +import { ThumbnailElement } from '../../types/get-player-response'; -function $(selector) { +const moveVolumeHud = isEnabled('precise-volume') ? preciseVolumeMoveVolumeHud : () => {}; + +function $(selector: string): HTMLElement | null { return document.querySelector(selector); } -let options; -let player; -let video; -let api; +let options: ConfigType<'video-toggle'>; +let player: HTMLElement & { videoMode_: boolean }; +let video: HTMLVideoElement; +let api: YoutubePlayer; const switchButtonDiv = ElementFromFile( templatePath(__dirname, 'button_template.html'), ); -module.exports = (_options) => { +export default (_options: ConfigType<'video-toggle'>) => { if (_options.forceHide) { return; } switch (_options.mode) { case 'native': { - $('ytmusic-player-page').setAttribute('has-av-switcher'); - $('ytmusic-player').setAttribute('has-av-switcher'); + $('ytmusic-player-page')?.setAttribute('has-av-switcher', ''); + $('ytmusic-player')?.setAttribute('has-av-switcher', ''); return; } case 'disabled': { - $('ytmusic-player-page').removeAttribute('has-av-switcher'); - $('ytmusic-player').removeAttribute('has-av-switcher'); + $('ytmusic-player-page')?.removeAttribute('has-av-switcher'); + $('ytmusic-player')?.removeAttribute('has-av-switcher'); return; } @@ -43,15 +47,15 @@ module.exports = (_options) => { } }; -function setup(e) { +function setup(e: CustomEvent) { api = e.detail; - player = $('ytmusic-player'); - video = $('video'); + player = $('ytmusic-player') as typeof player; + video = $('video') as HTMLVideoElement; - $('#main-panel').append(switchButtonDiv); + ($('#main-panel') as HTMLVideoElement).append(switchButtonDiv); if (options.hideVideo) { - $('.video-switch-button-checkbox').checked = false; + ($('.video-switch-button-checkbox') as HTMLInputElement).checked = false; changeDisplay(false); forcePlaybackMode(); // Fix black video @@ -60,8 +64,9 @@ function setup(e) { // Button checked = show video switchButtonDiv.addEventListener('change', (e) => { - options.hideVideo = !e.target.checked; - changeDisplay(e.target.checked); + const target = e.target as HTMLInputElement; + options.hideVideo = target.checked; + changeDisplay(target.checked); setOptions('video-toggle', options); }); @@ -87,12 +92,12 @@ function setup(e) { } } -function changeDisplay(showVideo) { +function changeDisplay(showVideo: boolean) { player.style.margin = showVideo ? '' : 'auto 0px'; player.setAttribute('playback-mode', showVideo ? 'OMV_PREFERRED' : 'ATV_PREFERRED'); - $('#song-video.ytmusic-player').style.display = showVideo ? 'block' : 'none'; - $('#song-image').style.display = showVideo ? 'none' : 'block'; + $('#song-video.ytmusic-player')!.style.display = showVideo ? 'block' : 'none'; + $('#song-image')!.style.display = showVideo ? 'none' : 'block'; if (showVideo && !video.style.top) { video.style.top = `${(player.clientHeight - video.clientHeight) / 2}px`; @@ -108,12 +113,12 @@ function videoStarted() { // Hide toggle button switchButtonDiv.style.display = 'none'; } else { - // Switch to high res thumbnail - forceThumbnail($('#song-image img')); + // Switch to high-res thumbnail + forceThumbnail($('#song-image img') as HTMLImageElement); // Show toggle button switchButtonDiv.style.display = 'initial'; // Change display to video mode if video exist & video is hidden & option.hideVideo = false - if (!options.hideVideo && $('#song-video.ytmusic-player').style.display === 'none') { + if (!options.hideVideo && $('#song-video.ytmusic-player')?.style.display === 'none') { changeDisplay(true); } else { moveVolumeHud(!options.hideVideo); @@ -126,9 +131,10 @@ function videoStarted() { function forcePlaybackMode() { const playbackModeObserver = new MutationObserver((mutations) => { for (const mutation of mutations) { - if (mutation.target.getAttribute('playback-mode') !== 'ATV_PREFERRED') { + const target = mutation.target as HTMLElement; + if (target.getAttribute('playback-mode') !== 'ATV_PREFERRED') { playbackModeObserver.disconnect(); - mutation.target.setAttribute('playback-mode', 'ATV_PREFERRED'); + target.setAttribute('playback-mode', 'ATV_PREFERRED'); } } }); @@ -142,19 +148,21 @@ function observeThumbnail() { } for (const mutation of mutations) { - if (!mutation.target.src.startsWith('data:')) { + const target = mutation.target as HTMLImageElement; + if (!target.src.startsWith('data:')) { continue; } - forceThumbnail(mutation.target); + forceThumbnail(target); } }); - playbackModeObserver.observe($('#song-image img'), { attributeFilter: ['src'] }); + playbackModeObserver.observe($('#song-image img')!, { attributeFilter: ['src'] }); } -function forceThumbnail(img) { - const thumbnails = $('#movie_player').getPlayerResponse()?.videoDetails?.thumbnail?.thumbnails; +function forceThumbnail(img: HTMLImageElement) { + const thumbnails: ThumbnailElement[] = ($('#movie_player') as unknown as YoutubePlayer).getPlayerResponse()?.videoDetails?.thumbnail?.thumbnails ?? []; if (thumbnails && thumbnails.length > 0) { - img.src = thumbnails.at(-1).url.split('?')[0]; + const thumbnail = thumbnails.at(-1)?.url.split('?')[0]; + if (typeof thumbnail === 'string') img.src = thumbnail; } } diff --git a/plugins/video-toggle/menu.js b/plugins/video-toggle/menu.ts similarity index 85% rename from plugins/video-toggle/menu.js rename to plugins/video-toggle/menu.ts index 76703796..8afac05e 100644 --- a/plugins/video-toggle/menu.js +++ b/plugins/video-toggle/menu.ts @@ -1,6 +1,10 @@ -const { setMenuOptions } = require('../../config/plugins'); +import { BrowserWindow } from 'electron'; -module.exports = (win, options) => [ +import { setMenuOptions } from '../../config/plugins'; +import type { ConfigType } from '../../config/dynamic'; +import { MenuTemplate } from '../../menu'; + +export default (win: BrowserWindow, options: ConfigType<'video-toggle'>): MenuTemplate => [ { label: 'Mode', submenu: [ diff --git a/plugins/visualizer/back.js b/plugins/visualizer/back.js deleted file mode 100644 index 7a884474..00000000 --- a/plugins/visualizer/back.js +++ /dev/null @@ -1,7 +0,0 @@ -const path = require('node:path'); - -const { injectCSS } = require('../utils'); - -module.exports = (win) => { - injectCSS(win.webContents, path.join(__dirname, 'empty-player.css')); -}; diff --git a/plugins/visualizer/back.ts b/plugins/visualizer/back.ts new file mode 100644 index 00000000..a66e9ded --- /dev/null +++ b/plugins/visualizer/back.ts @@ -0,0 +1,9 @@ +import path from 'node:path'; + +import { BrowserWindow } from 'electron'; + +import { injectCSS } from '../utils'; + +export default (win: BrowserWindow) => { + injectCSS(win.webContents, path.join(__dirname, 'empty-player.css')); +}; diff --git a/plugins/visualizer/front.js b/plugins/visualizer/front.ts similarity index 62% rename from plugins/visualizer/front.js rename to plugins/visualizer/front.ts index 67194dea..591fcef8 100644 --- a/plugins/visualizer/front.js +++ b/plugins/visualizer/front.ts @@ -1,19 +1,28 @@ -const defaultConfig = require('../../config/defaults'); +import { Visualizer } from './visualizers/visualizer'; -module.exports = (options) => { +import vudio from './visualizers/vudio'; +import wave from './visualizers/wave'; + +import type { ConfigType } from '../../config/dynamic'; +import defaultConfig from '../../config/defaults'; + +export default (options: ConfigType<'visualizer'>) => { const optionsWithDefaults = { ...defaultConfig.plugins.visualizer, ...options, }; - const VisualizerType = require(`./visualizers/${optionsWithDefaults.type}`); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let visualizerType: { new(...args: any[]): Visualizer } = vudio; + if (optionsWithDefaults.type === 'wave') visualizerType = wave; document.addEventListener( 'audioCanPlay', (e) => { - const video = document.querySelector('video'); - const visualizerContainer = document.querySelector('#player'); + const video = document.querySelector('video') as (HTMLVideoElement & { captureStream(): MediaStream; }); + const visualizerContainer = document.querySelector('#player') as HTMLElement; - let canvas = document.querySelector('#visualizer'); + let canvas = document.querySelector('#visualizer') as HTMLCanvasElement; if (!canvas) { canvas = document.createElement('canvas'); canvas.id = 'visualizer'; @@ -33,17 +42,17 @@ module.exports = (options) => { gainNode.gain.value = 1.25; e.detail.audioSource.connect(gainNode); - const visualizer = new VisualizerType( + const visualizer = new visualizerType( e.detail.audioContext, e.detail.audioSource, visualizerContainer, canvas, gainNode, video.captureStream(), - optionsWithDefaults[optionsWithDefaults.type], + optionsWithDefaults, ); - const resizeVisualizer = (width, height) => { + const resizeVisualizer = (width: number, height: number) => { resizeCanvas(); visualizer.resize(width, height); }; diff --git a/plugins/visualizer/menu.js b/plugins/visualizer/menu.ts similarity index 54% rename from plugins/visualizer/menu.js rename to plugins/visualizer/menu.ts index 310332f3..681e0527 100644 --- a/plugins/visualizer/menu.js +++ b/plugins/visualizer/menu.ts @@ -1,13 +1,19 @@ -const { readdirSync } = require('node:fs'); -const path = require('node:path'); +import { readdirSync } from 'node:fs'; +import path from 'node:path'; -const { setMenuOptions } = require('../../config/plugins'); +import { BrowserWindow } from 'electron'; + +import { setMenuOptions } from '../../config/plugins'; + +import { MenuTemplate } from '../../menu'; + +import type { ConfigType } from '../../config/dynamic'; const visualizerTypes = readdirSync(path.join(__dirname, 'visualizers')).map( (filename) => path.parse(filename).name, ); -module.exports = (win, options) => [ +export default (win: BrowserWindow, options: ConfigType<'visualizer'>): MenuTemplate => [ { label: 'Type', submenu: visualizerTypes.map((visualizerType) => ({ diff --git a/plugins/visualizer/visualizers/butterchurn.js b/plugins/visualizer/visualizers/butterchurn.js deleted file mode 100644 index 2c8b5a1f..00000000 --- a/plugins/visualizer/visualizers/butterchurn.js +++ /dev/null @@ -1,47 +0,0 @@ -const butterchurn = require('butterchurn'); -const butterchurnPresets = require('butterchurn-presets'); - -const presets = butterchurnPresets.getPresets(); - -class ButterchurnVisualizer { - constructor( - audioContext, - audioSource, - visualizerContainer, - canvas, - audioNode, - stream, - options, - ) { - this.visualizer = butterchurn.default.createVisualizer( - audioContext, - canvas, - { - width: canvas.width, - height: canvas.height, - }, - ); - - const preset = presets[options.preset]; - this.visualizer.loadPreset(preset, options.blendTimeInSeconds); - - this.visualizer.connectAudio(audioNode); - - this.renderingFrequencyInMs = options.renderingFrequencyInMs; - } - - resize(width, height) { - this.visualizer.setRendererSize(width, height); - } - - render() { - const renderVisualizer = () => { - requestAnimationFrame(() => renderVisualizer()); - this.visualizer.render(); - }; - - setTimeout(renderVisualizer(), this.renderingFrequencyInMs); - } -} - -module.exports = ButterchurnVisualizer; diff --git a/plugins/visualizer/visualizers/visualizer.ts b/plugins/visualizer/visualizers/visualizer.ts new file mode 100644 index 00000000..38555ca4 --- /dev/null +++ b/plugins/visualizer/visualizers/visualizer.ts @@ -0,0 +1,18 @@ +import type { ConfigType } from '../../../config/dynamic'; + +export abstract class Visualizer { + abstract visualizer: T; + + protected constructor( + audioContext: AudioContext, + audioSource: MediaElementAudioSourceNode, + visualizerContainer: HTMLElement, + canvas: HTMLCanvasElement, + audioNode: GainNode, + stream: MediaStream, + options: ConfigType<'visualizer'>, + ) {} + + abstract resize(width: number, height: number): void; + abstract render(): void; +} diff --git a/plugins/visualizer/visualizers/vudio.js b/plugins/visualizer/visualizers/vudio.js deleted file mode 100644 index c2a04aca..00000000 --- a/plugins/visualizer/visualizers/vudio.js +++ /dev/null @@ -1,33 +0,0 @@ -const Vudio = require('vudio/umd/vudio'); - -class VudioVisualizer { - constructor( - audioContext, - audioSource, - visualizerContainer, - canvas, - audioNode, - stream, - options, - ) { - this.visualizer = new Vudio(stream, canvas, { - width: canvas.width, - height: canvas.height, - // Visualizer config - ...options, - }); - } - - resize(width, height) { - this.visualizer.setOption({ - width, - height, - }); - } - - render() { - this.visualizer.dance(); - } -} - -module.exports = VudioVisualizer; diff --git a/plugins/visualizer/visualizers/vudio.ts b/plugins/visualizer/visualizers/vudio.ts new file mode 100644 index 00000000..052bae98 --- /dev/null +++ b/plugins/visualizer/visualizers/vudio.ts @@ -0,0 +1,49 @@ +import Vudio from 'vudio'; + +import { Visualizer } from './visualizer'; + +import type { ConfigType } from '../../../config/dynamic'; + +class VudioVisualizer extends Visualizer { + visualizer: Vudio; + + constructor( + audioContext: AudioContext, + audioSource: MediaElementAudioSourceNode, + visualizerContainer: HTMLElement, + canvas: HTMLCanvasElement, + audioNode: GainNode, + stream: MediaStream, + options: ConfigType<'visualizer'>, + ) { + super( + audioContext, + audioSource, + visualizerContainer, + canvas, + audioNode, + stream, + options, + ); + + this.visualizer = new Vudio(stream, canvas, { + width: canvas.width, + height: canvas.height, + // Visualizer config + ...options, + }); + } + + resize(width: number, height: number) { + this.visualizer.setOptions({ + width, + height, + }); + } + + render() { + this.visualizer.dance(); + } +} + +export default VudioVisualizer; diff --git a/plugins/visualizer/visualizers/wave.js b/plugins/visualizer/visualizers/wave.js deleted file mode 100644 index f594c785..00000000 --- a/plugins/visualizer/visualizers/wave.js +++ /dev/null @@ -1,34 +0,0 @@ -const { Wave } = require('@foobar404/wave'); - -class WaveVisualizer { - constructor( - audioContext, - audioSource, - visualizerContainer, - canvas, - audioNode, - stream, - options, - ) { - this.visualizer = new Wave( - { context: audioContext, source: audioSource }, - canvas, - ); - for (const animation of options.animations) { - this.visualizer.addAnimation( - eval(`new this.visualizer.animations.${animation.type}( - ${JSON.stringify(animation.config)} - )`), - ); - } - } - - // eslint-disable-next-line no-unused-vars - resize(width, height) { - } - - render() { - } -} - -module.exports = WaveVisualizer; diff --git a/plugins/visualizer/visualizers/wave.ts b/plugins/visualizer/visualizers/wave.ts new file mode 100644 index 00000000..21a4005e --- /dev/null +++ b/plugins/visualizer/visualizers/wave.ts @@ -0,0 +1,49 @@ +import { Wave } from '@foobar404/wave'; + +import { Visualizer } from './visualizer'; + +import type { ConfigType } from '../../../config/dynamic'; + +class WaveVisualizer extends Visualizer { + visualizer: Wave; + + constructor( + audioContext: AudioContext, + audioSource: MediaElementAudioSourceNode, + visualizerContainer: HTMLElement, + canvas: HTMLCanvasElement, + audioNode: GainNode, + stream: MediaStream, + options: ConfigType<'visualizer'>, + ) { + super( + audioContext, + audioSource, + visualizerContainer, + canvas, + audioNode, + stream, + options, + ); + + this.visualizer = new Wave( + { context: audioContext, source: audioSource }, + canvas, + ); + for (const animation of options.wave.animations) { + const TargetVisualizer = this.visualizer.animations[animation.type as keyof typeof this.visualizer.animations]; + + this.visualizer.addAnimation( + new TargetVisualizer(animation.config as never), // Magic of Typescript + ); + } + } + + resize(_: number, __: number) { + } + + render() { + } +} + +export default WaveVisualizer; diff --git a/plugins/visualizer/vudio.d.ts b/plugins/visualizer/vudio.d.ts new file mode 100644 index 00000000..6e5b3b1f --- /dev/null +++ b/plugins/visualizer/vudio.d.ts @@ -0,0 +1,34 @@ +declare module 'vudio' { + interface NoneWaveformOptions { + maxHeight?: number; + minHeight?: number; + spacing?: number; + color?: string | string[]; + shadowBlur?: number; + shadowColor?: string; + fadeSide?: boolean; + } + + interface WaveformOptions extends NoneWaveformOptions{ + horizontalAlign: 'left' | 'center' | 'right'; + verticalAlign: 'top' | 'middle' | 'bottom'; + } + + interface VudioOptions { + effect?: 'waveform' | 'circlewave' | 'circlebar' | 'lighting'; + accuracy?: number; + width?: number; + height?: number; + waveform?: WaveformOptions + } + + class Vudio { + constructor(audio: HTMLAudioElement | MediaStream, canvas: HTMLCanvasElement, options: VudioOptions = {}); + + dance(): void; + pause(): void; + setOptions(options: VudioOptions): void; + } + + export default Vudio; +} diff --git a/types/youtube-player.ts b/types/youtube-player.ts index 51ee4c1f..f19a7db9 100644 --- a/types/youtube-player.ts +++ b/types/youtube-player.ts @@ -43,7 +43,7 @@ export interface YoutubePlayer { getVideoAspectRatio: (...params: Parameters) => Return; getPreferredQuality: (...params: Parameters) => Return; getPlaybackQualityLabel: (...params: Parameters) => Return; - setPlaybackQualityRange: (...params: Parameters) => Return; + setPlaybackQualityRange: (quality: string) => void; onAdUxClicked: (...params: Parameters) => Return; getFeedbackProductData: (...params: Parameters) => Return; getStoryboardFrame: (...params: Parameters) => Return; @@ -51,7 +51,7 @@ export interface YoutubePlayer { getStoryboardLevel: (...params: Parameters) => Return; getNumberOfStoryboardLevels: (...params: Parameters) => Return; getCaptionWindowContainerId: (...params: Parameters) => Return; - getAvailableQualityLabels: (...params: Parameters) => Return; + getAvailableQualityLabels: () => string[]; addUtcCueRange: (...params: Parameters) => Return; showAirplayPicker: (...params: Parameters) => Return; dispatchReduxAction: (...params: Parameters) => Return; @@ -147,14 +147,14 @@ export interface YoutubePlayer { unMute: (...params: Parameters) => Return; isMuted: (...params: Parameters) => Return; setVolume: (...params: Parameters) => Return; - getVolume: (...params: Parameters) => Return; + getVolume: () => number; seekTo: (seconds: number) => void; getPlayerMode: (...params: Parameters) => Return; getPlayerState: (...params: Parameters) => Return; getAvailablePlaybackRates: (...params: Parameters) => Return; - getPlaybackQuality: (...params: Parameters) => Return; - setPlaybackQuality: (...params: Parameters) => Return; - getAvailableQualityLevels: (...params: Parameters) => Return; + getPlaybackQuality: () => string; + setPlaybackQuality: (quality: string) => void; + getAvailableQualityLevels: () => string[]; getCurrentTime: (...params: Parameters) => Return; getDuration: (...params: Parameters) => Return; addEventListener: (...params: Parameters) => Return; From 12825d8bf25a668bb21e9a5a963680d69c4d4394 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Mon, 4 Sep 2023 02:30:16 +0900 Subject: [PATCH 22/70] fix: require --- index.ts | 4 ++-- preload.ts | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/index.ts b/index.ts index ddb892f6..22066606 100644 --- a/index.ts +++ b/index.ts @@ -103,8 +103,8 @@ function loadPlugins(win: BrowserWindow) { console.log('Loaded plugin - ' + plugin); const pluginPath = path.join(__dirname, 'plugins', plugin, 'back.js'); fileExists(pluginPath, () => { - // eslint-disable-next-line @typescript-eslint/no-var-requires - const handle = require(pluginPath) as (window: BrowserWindow, option: typeof options) => void; + // eslint-disable-next-line @typescript-eslint/no-var-requires,@typescript-eslint/no-unsafe-member-access + const handle = require(pluginPath).default as (window: BrowserWindow, option: typeof options) => void; handle(win, options); }); } diff --git a/preload.ts b/preload.ts index b8da3363..d14e23db 100644 --- a/preload.ts +++ b/preload.ts @@ -29,8 +29,8 @@ plugins.forEach(async ([plugin, options]) => { 'preload.js', ) as string; fileExists(preloadPath, () => { - // eslint-disable-next-line @typescript-eslint/no-var-requires - const run = require(preloadPath) as (config: typeof options) => Promise; + // eslint-disable-next-line @typescript-eslint/no-var-requires,@typescript-eslint/no-unsafe-member-access + const run = require(preloadPath).default as (config: typeof options) => Promise; run(options); }); @@ -64,8 +64,8 @@ document.addEventListener('DOMContentLoaded', () => { 'front.js', ) as string; fileExists(pluginPath, () => { - // eslint-disable-next-line @typescript-eslint/no-var-requires - const run = require(pluginPath) as (config: typeof options) => Promise; + // eslint-disable-next-line @typescript-eslint/no-var-requires,@typescript-eslint/no-unsafe-member-access + const run = require(pluginPath).default as (config: typeof options) => Promise; run(options); }); }); From 5069913c561cc03d55e06ae7995eee5624bbcc5f Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Mon, 4 Sep 2023 02:42:25 +0900 Subject: [PATCH 23/70] update build script --- package.json | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index d1c01766..f872918d 100644 --- a/package.json +++ b/package.json @@ -84,21 +84,24 @@ "scripts": { "test": "playwright test", "test:debug": "DEBUG=pw:browser* playwright test", - "start": "tsc && npm run copy-files && electron ./dist/index.js", + "start": "npm run tsc-and-copy && electron ./dist/index.js", "start:debug": "ELECTRON_ENABLE_LOGGING=1 electron ./dist/index.js", "generate:package": "node utils/generate-package-json.js", "postinstall": "npm run plugins", "clean": "del-cli dist && del-cli pack", + "ytm-css-copy-files": "copyfiles youtube-music.css dist/", "copy-files": "copyfiles -u 1 plugins/**/*.html plugins/**/*.css plugins/**/*.bin plugins/**/*.js dist/plugins/", - "build": "npm run clean && tsc && npm run copy-files && electron-builder --win --mac --linux -p never", - "build:linux": "npm run clean && tsc && npm run copy-files && electron-builder --linux -p never", - "build:mac": "npm run clean && tsc && npm run copy-files && electron-builder --mac dmg:x64 -p never", - "build:mac:arm64": "npm run clean && tsc && npm run copy-files && electron-builder --mac dmg:arm64 -p never", - "build:win": "npm run clean && tsc && npm run copy-files && electron-builder --win -p never", - "build:win:x64": "npm run clean && tsc && npm run copy-files && electron-builder --win nsis:x64 -p never", + "tsc-and-copy": "tsc && npm run plugin:adblocker-without-tsc && npm run ytm-css-copy-files && npm run copy-files", + "build": "npm run clean && npm run tsc-and-copy && electron-builder --win --mac --linux -p never", + "build:linux": "npm run clean && npm run tsc-and-copy && electron-builder --linux -p never", + "build:mac": "npm run clean && npm run tsc-and-copy && electron-builder --mac dmg:x64 -p never", + "build:mac:arm64": "npm run clean && npm run tsc-and-copy && electron-builder --mac dmg:arm64 -p never", + "build:win": "npm run clean && npm run tsc-and-copy && electron-builder --win -p never", + "build:win:x64": "npm run clean && npm run tsc-and-copy && electron-builder --win nsis:x64 -p never", "lint": "xo", "changelog": "auto-changelog", "plugins": "npm run plugin:adblocker && npm run plugin:bypass-age-restrictions", + "plugin:adblocker-without-tsc": "del-cli plugins/adblocker/ad-blocker-engine.bin && node dist/plugins/adblocker/blocker.js", "plugin:adblocker": "del-cli plugins/adblocker/ad-blocker-engine.bin && tsc && node dist/plugins/adblocker/blocker.js", "plugin:bypass-age-restrictions": "del-cli node_modules/simple-youtube-age-restriction-bypass/package.json && npm run generate:package simple-youtube-age-restriction-bypass", "release:linux": "npm run clean && electron-builder --linux -p always -c.snap.publish=github", From b5472c11df2ba4fee0cf309f70b652f18d3461c3 Mon Sep 17 00:00:00 2001 From: Su-Yong Date: Mon, 4 Sep 2023 03:04:44 +0900 Subject: [PATCH 24/70] fix: fix plugins cannot load config --- config/dynamic.ts | 2 +- plugins/adblocker/config.ts | 6 ++---- plugins/captions-selector/config.ts | 2 +- plugins/crossfade/config.ts | 2 +- plugins/downloader/config.ts | 2 +- plugins/downloader/front.ts | 3 ++- plugins/notifications/config.ts | 2 +- plugins/utils.ts | 1 - 8 files changed, 9 insertions(+), 11 deletions(-) diff --git a/config/dynamic.ts b/config/dynamic.ts index 01134b53..6e93dd45 100644 --- a/config/dynamic.ts +++ b/config/dynamic.ts @@ -104,7 +104,7 @@ export class PluginConfig { } get = keyof ConfigType>(key: Key): ConfigType[Key] { - return this.config[key]; + return this.config?.[key]; } set(key: keyof ConfigType, value: ValueOf>) { diff --git a/plugins/adblocker/config.ts b/plugins/adblocker/config.ts index 59cd7ee9..e8bad5a5 100644 --- a/plugins/adblocker/config.ts +++ b/plugins/adblocker/config.ts @@ -12,9 +12,7 @@ export const blockers = { export const shouldUseBlocklists = async () => await config.get('blocker') !== blockers.InPlayer; -export default { +export default Object.assign(config, { shouldUseBlocklists, blockers, - get: config.get.bind(this), - set: config.set.bind(this), -}; +}); diff --git a/plugins/captions-selector/config.ts b/plugins/captions-selector/config.ts index 97867c7e..f7878eb9 100644 --- a/plugins/captions-selector/config.ts +++ b/plugins/captions-selector/config.ts @@ -1,4 +1,4 @@ import { PluginConfig } from '../../config/dynamic'; const config = new PluginConfig('captions-selector', { enableFront: true }); -export default { ...config } as PluginConfig<'captions-selector'>; +export default config; diff --git a/plugins/crossfade/config.ts b/plugins/crossfade/config.ts index 186ff14d..ffe2232d 100644 --- a/plugins/crossfade/config.ts +++ b/plugins/crossfade/config.ts @@ -1,4 +1,4 @@ import { PluginConfig } from '../../config/dynamic'; const config = new PluginConfig('crossfade', { enableFront: true }); -export default { ...config } as PluginConfig<'crossfade'>; +export default config; diff --git a/plugins/downloader/config.ts b/plugins/downloader/config.ts index ec22de5a..69b1cb78 100644 --- a/plugins/downloader/config.ts +++ b/plugins/downloader/config.ts @@ -1,4 +1,4 @@ import { PluginConfig } from '../../config/dynamic'; const config = new PluginConfig('downloader'); -export default { ...config } as PluginConfig<'downloader'>; +export default config; diff --git a/plugins/downloader/front.ts b/plugins/downloader/front.ts index b53f5dfc..8393376d 100644 --- a/plugins/downloader/front.ts +++ b/plugins/downloader/front.ts @@ -43,7 +43,8 @@ const menuObserver = new MutationObserver(() => { // TODO: re-enable once contextIsolation is set to true // contextBridge.exposeInMainWorld("downloader", { // download: () => { -export const download = () => { +// eslint-disable-next-line @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-member-access +(global as any).download = () => { let videoUrl = getSongMenu() // Selector of first button which is always "Start Radio" ?.querySelector('ytmusic-menu-navigation-item-renderer[tabindex="0"] #navigation-endpoint') diff --git a/plugins/notifications/config.ts b/plugins/notifications/config.ts index 91244414..91605f7a 100644 --- a/plugins/notifications/config.ts +++ b/plugins/notifications/config.ts @@ -2,4 +2,4 @@ import { PluginConfig } from '../../config/dynamic'; const config = new PluginConfig('notifications'); -export default { ...config } as PluginConfig<'notifications'>; +export default config; diff --git a/plugins/utils.ts b/plugins/utils.ts index 441af4f8..73df857a 100644 --- a/plugins/utils.ts +++ b/plugins/utils.ts @@ -5,7 +5,6 @@ import { ipcMain, ipcRenderer } from 'electron'; import { ValueOf } from '../utils/type-utils'; - // Creates a DOM element from an HTML string export const ElementFromHtml = (html: string): HTMLElement => { const template = document.createElement('template'); From 68d985acba0b792680b0fb306bb7df4110dd27ab Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Mon, 4 Sep 2023 03:28:50 +0900 Subject: [PATCH 25/70] fix: Fixes the video-toggle being displayed at the wrong position on fullscreen (#1218) Co-authored-by: MiepHD <63968466+MiepHD@users.noreply.github.com> --- plugins/video-toggle/front.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/video-toggle/front.ts b/plugins/video-toggle/front.ts index 839b899f..bac2d9da 100644 --- a/plugins/video-toggle/front.ts +++ b/plugins/video-toggle/front.ts @@ -52,7 +52,7 @@ function setup(e: CustomEvent) { player = $('ytmusic-player') as typeof player; video = $('video') as HTMLVideoElement; - ($('#main-panel') as HTMLVideoElement).append(switchButtonDiv); + ($('#player') as HTMLVideoElement).prepend(switchButtonDiv); if (options.hideVideo) { ($('.video-switch-button-checkbox') as HTMLInputElement).checked = false; @@ -62,6 +62,11 @@ function setup(e: CustomEvent) { video.style.height = 'auto'; } + //Prevents bubbling to the player which causes it to stop or resume + switchButtonDiv.addEventListener('click', (e) => { + e.stopPropagation(); + }); + // Button checked = show video switchButtonDiv.addEventListener('change', (e) => { const target = e.target as HTMLInputElement; From 72c8c49edfd6db3d5c3cce58596793a62fdccceb Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Mon, 4 Sep 2023 03:50:44 +0900 Subject: [PATCH 26/70] fix: apply fix from eslint --- plugins/adblocker/back.ts | 4 ++-- plugins/adblocker/preload.ts | 1 + plugins/captions-selector/front.ts | 1 + plugins/crossfade/front.ts | 1 + plugins/crossfade/menu.ts | 1 + plugins/discord/back.ts | 1 + plugins/last-fm/back.ts | 1 + plugins/notifications/menu.ts | 2 +- plugins/picture-in-picture/menu.ts | 4 +++- plugins/precise-volume/back.ts | 1 + plugins/shortcuts/menu.ts | 4 +++- plugins/video-toggle/back.ts | 1 + plugins/video-toggle/front.ts | 4 +++- plugins/video-toggle/menu.ts | 4 +++- plugins/visualizer/front.ts | 3 ++- 15 files changed, 25 insertions(+), 8 deletions(-) diff --git a/plugins/adblocker/back.ts b/plugins/adblocker/back.ts index f02f28a0..d33771ae 100644 --- a/plugins/adblocker/back.ts +++ b/plugins/adblocker/back.ts @@ -1,14 +1,14 @@ import { BrowserWindow } from 'electron'; import { loadAdBlockerEngine } from './blocker'; -import config from './config'; +import { shouldUseBlocklists } from './config'; import type { ConfigType } from '../../config/dynamic'; type AdBlockOptions = ConfigType<'adblocker'>; export default async (win: BrowserWindow, options: AdBlockOptions) => { - if (await config.shouldUseBlocklists()) { + if (await shouldUseBlocklists()) { loadAdBlockerEngine( win.webContents.session, options.cache, diff --git a/plugins/adblocker/preload.ts b/plugins/adblocker/preload.ts index 9885df46..33cb6b14 100644 --- a/plugins/adblocker/preload.ts +++ b/plugins/adblocker/preload.ts @@ -4,6 +4,7 @@ export default async () => { if (await config.shouldUseBlocklists()) { // Preload adblocker to inject scripts/styles require('@cliqz/adblocker-electron-preload'); + // eslint-disable-next-line @typescript-eslint/await-thenable } else if ((await config.get('blocker')) === config.blockers.InPlayer) { require('./inject.js'); } diff --git a/plugins/captions-selector/front.ts b/plugins/captions-selector/front.ts index ee9adc53..bba57e0a 100644 --- a/plugins/captions-selector/front.ts +++ b/plugins/captions-selector/front.ts @@ -7,6 +7,7 @@ import configProvider from './config'; import { ElementFromFile, templatePath } from '../utils'; import { YoutubePlayer } from '../../types/youtube-player'; + import type { ConfigType } from '../../config/dynamic'; interface LanguageOptions { diff --git a/plugins/crossfade/front.ts b/plugins/crossfade/front.ts index 203ddbb0..746fe0cd 100644 --- a/plugins/crossfade/front.ts +++ b/plugins/crossfade/front.ts @@ -10,6 +10,7 @@ import { VolumeFader } from './fader'; import configProvider from './config'; import defaultConfigs from '../../config/defaults'; + import type { ConfigType } from '../../config/dynamic'; let transitionAudio: Howl; // Howler audio used to fade out the current music diff --git a/plugins/crossfade/menu.ts b/plugins/crossfade/menu.ts index dd0057f2..fbfa4f0b 100644 --- a/plugins/crossfade/menu.ts +++ b/plugins/crossfade/menu.ts @@ -6,6 +6,7 @@ import config from './config'; import promptOptions from '../../providers/prompt-options'; import configOptions from '../../config/defaults'; + import type { ConfigType } from '../../config/dynamic'; const defaultOptions = configOptions.plugins.crossfade; diff --git a/plugins/discord/back.ts b/plugins/discord/back.ts index a505934d..8fa2f643 100644 --- a/plugins/discord/back.ts +++ b/plugins/discord/back.ts @@ -5,6 +5,7 @@ import { dev } from 'electron-is'; import { SetActivity } from '@xhayper/discord-rpc/dist/structures/ClientUser'; import registerCallback from '../../providers/song-info'; + import type { ConfigType } from '../../config/dynamic'; // Application ID registered by @Zo-Bro-23 diff --git a/plugins/last-fm/back.ts b/plugins/last-fm/back.ts index 69a93cc6..a307b87c 100644 --- a/plugins/last-fm/back.ts +++ b/plugins/last-fm/back.ts @@ -4,6 +4,7 @@ import md5 from 'md5'; import { setOptions } from '../../config/plugins'; import registerCallback, { SongInfo } from '../../providers/song-info'; import defaultConfig from '../../config/defaults'; + import type { ConfigType } from '../../config/dynamic'; type LastFMOptions = ConfigType<'last-fm'>; diff --git a/plugins/notifications/menu.ts b/plugins/notifications/menu.ts index 48bbaafd..127d287a 100644 --- a/plugins/notifications/menu.ts +++ b/plugins/notifications/menu.ts @@ -1,6 +1,6 @@ import is from 'electron-is'; -import {BrowserWindow, MenuItem} from 'electron'; +import { BrowserWindow, MenuItem } from 'electron'; import { snakeToCamel, ToastStyles, urgencyLevels } from './utils'; diff --git a/plugins/picture-in-picture/menu.ts b/plugins/picture-in-picture/menu.ts index ff154698..e8f877d6 100644 --- a/plugins/picture-in-picture/menu.ts +++ b/plugins/picture-in-picture/menu.ts @@ -5,9 +5,11 @@ import { BrowserWindow } from 'electron'; import { setOptions } from './back'; import promptOptions from '../../providers/prompt-options'; -import type { ConfigType } from '../../config/dynamic'; + import { MenuTemplate } from '../../menu'; +import type { ConfigType } from '../../config/dynamic'; + export default (win: BrowserWindow, options: ConfigType<'picture-in-picture'>): MenuTemplate => [ { label: 'Always on top', diff --git a/plugins/precise-volume/back.ts b/plugins/precise-volume/back.ts index e4ef4ea9..2e8ea70a 100644 --- a/plugins/precise-volume/back.ts +++ b/plugins/precise-volume/back.ts @@ -3,6 +3,7 @@ import path from 'node:path'; import { globalShortcut, BrowserWindow } from 'electron'; import { injectCSS } from '../utils'; + import type { ConfigType } from '../../config/dynamic'; /* diff --git a/plugins/shortcuts/menu.ts b/plugins/shortcuts/menu.ts index b5bc2471..68854fe7 100644 --- a/plugins/shortcuts/menu.ts +++ b/plugins/shortcuts/menu.ts @@ -3,11 +3,13 @@ import prompt, { KeybindOptions } from 'custom-electron-prompt'; import { BrowserWindow } from 'electron'; import { setMenuOptions } from '../../config/plugins'; -import type { ConfigType } from '../../config/dynamic'; + import promptOptions from '../../providers/prompt-options'; import { MenuTemplate } from '../../menu'; +import type { ConfigType } from '../../config/dynamic'; + export default (win: BrowserWindow, options: ConfigType<'shortcuts'>): MenuTemplate => [ { label: 'Set Global Song Controls', diff --git a/plugins/video-toggle/back.ts b/plugins/video-toggle/back.ts index 944900e8..1fe17d6c 100644 --- a/plugins/video-toggle/back.ts +++ b/plugins/video-toggle/back.ts @@ -3,6 +3,7 @@ import path from 'node:path'; import { BrowserWindow } from 'electron'; import { injectCSS } from '../utils'; + import type { ConfigType } from '../../config/dynamic'; export default (win: BrowserWindow, options: ConfigType<'video-toggle'>) => { diff --git a/plugins/video-toggle/front.ts b/plugins/video-toggle/front.ts index bac2d9da..d6751dc2 100644 --- a/plugins/video-toggle/front.ts +++ b/plugins/video-toggle/front.ts @@ -2,10 +2,12 @@ import { ElementFromFile, templatePath } from '../utils'; import { setOptions, isEnabled } from '../../config/plugins'; import { moveVolumeHud as preciseVolumeMoveVolumeHud } from '../precise-volume/front'; -import type { ConfigType } from '../../config/dynamic'; + import { YoutubePlayer } from '../../types/youtube-player'; import { ThumbnailElement } from '../../types/get-player-response'; +import type { ConfigType } from '../../config/dynamic'; + const moveVolumeHud = isEnabled('precise-volume') ? preciseVolumeMoveVolumeHud : () => {}; function $(selector: string): HTMLElement | null { diff --git a/plugins/video-toggle/menu.ts b/plugins/video-toggle/menu.ts index 8afac05e..2013d58f 100644 --- a/plugins/video-toggle/menu.ts +++ b/plugins/video-toggle/menu.ts @@ -1,9 +1,11 @@ import { BrowserWindow } from 'electron'; import { setMenuOptions } from '../../config/plugins'; -import type { ConfigType } from '../../config/dynamic'; + import { MenuTemplate } from '../../menu'; +import type { ConfigType } from '../../config/dynamic'; + export default (win: BrowserWindow, options: ConfigType<'video-toggle'>): MenuTemplate => [ { label: 'Mode', diff --git a/plugins/visualizer/front.ts b/plugins/visualizer/front.ts index 591fcef8..9de40808 100644 --- a/plugins/visualizer/front.ts +++ b/plugins/visualizer/front.ts @@ -3,9 +3,10 @@ import { Visualizer } from './visualizers/visualizer'; import vudio from './visualizers/vudio'; import wave from './visualizers/wave'; -import type { ConfigType } from '../../config/dynamic'; import defaultConfig from '../../config/defaults'; +import type { ConfigType } from '../../config/dynamic'; + export default (options: ConfigType<'visualizer'>) => { const optionsWithDefaults = { ...defaultConfig.plugins.visualizer, From a5bdb257d46132b41b7b3a8b900c544d71c7bcd5 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Mon, 4 Sep 2023 03:53:48 +0900 Subject: [PATCH 27/70] fix: remove (abstract) visualizer from menu Co-authored-by: Su-Yong --- plugins/visualizer/menu.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/visualizer/menu.ts b/plugins/visualizer/menu.ts index 681e0527..4a0f54b6 100644 --- a/plugins/visualizer/menu.ts +++ b/plugins/visualizer/menu.ts @@ -9,9 +9,9 @@ import { MenuTemplate } from '../../menu'; import type { ConfigType } from '../../config/dynamic'; -const visualizerTypes = readdirSync(path.join(__dirname, 'visualizers')).map( - (filename) => path.parse(filename).name, -); +const visualizerTypes = readdirSync(path.join(__dirname, 'visualizers')) + .map((filename) => path.parse(filename).name) + .filter((filename) => filename !== 'visualizer'); export default (win: BrowserWindow, options: ConfigType<'visualizer'>): MenuTemplate => [ { From 774815c4e57f3491d1567689a3fe9c93fb2fdce0 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Mon, 4 Sep 2023 03:55:14 +0900 Subject: [PATCH 28/70] remove: butterchurn (it does not work on node v18) --- config/defaults.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/config/defaults.ts b/config/defaults.ts index f5143f32..42bc976a 100644 --- a/config/defaults.ts +++ b/config/defaults.ts @@ -191,13 +191,8 @@ const defaultConfig = { }, 'visualizer': { enabled: false, - type: 'butterchurn', + type: 'vudio', // Config per visualizer - butterchurn: { - preset: 'martin [shadow harlequins shape code] - fata morgana', - renderingFrequencyInMs: 500, - blendTimeInSeconds: 2.7, - }, vudio: { effect: 'lighting', accuracy: 128, From d811ebadb4a275374690704d7d138b4fadb1b9f1 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Mon, 4 Sep 2023 04:04:55 +0900 Subject: [PATCH 29/70] remove unused dependencies --- package-lock.json | 69 ----------------------------------------------- package.json | 3 --- 2 files changed, 72 deletions(-) diff --git a/package-lock.json b/package-lock.json index b804d614..3e5f773b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,9 +16,6 @@ "@foobar404/wave": "2.0.4", "@xhayper/discord-rpc": "1.0.22", "async-mutex": "0.4.0", - "browser-id3-writer": "5.0.0", - "butterchurn": "2.6.7", - "butterchurn-presets": "2.4.7", "conf": "10.2.0", "custom-electron-prompt": "1.5.7", "custom-electron-titlebar": "4.1.6", @@ -256,22 +253,6 @@ "node": ">=4" } }, - "node_modules/@babel/runtime": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.11.tgz", - "integrity": "sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime/node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" - }, "node_modules/@cliqz/adblocker": { "version": "1.26.6", "resolved": "https://registry.npmjs.org/@cliqz/adblocker/-/adblocker-1.26.6.tgz", @@ -2111,20 +2092,6 @@ "proxy-from-env": "^1.1.0" } }, - "node_modules/babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", - "dependencies": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "node_modules/babel-runtime/node_modules/regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2223,11 +2190,6 @@ "node": ">=8" } }, - "node_modules/browser-id3-writer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/browser-id3-writer/-/browser-id3-writer-5.0.0.tgz", - "integrity": "sha512-klFXmPe8kQN1y0ZrW411qmrUjJsb1gqPZ+Gb9ZcPKOmFF/8mA9dOZHXP9rGYsNCM8NAodZUFIzoKdl3tMvWsAA==" - }, "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -2375,25 +2337,6 @@ "node": ">=10.16.0" } }, - "node_modules/butterchurn": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/butterchurn/-/butterchurn-2.6.7.tgz", - "integrity": "sha512-BJiRA8L0L2+84uoG2SSfkp0kclBuN+vQKf217pK7pMlwEO2ZEg3MtO2/o+l8Qpr8Nbejg8tmL1ZHD1jmhiaaqg==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "ecma-proposal-math-extensions": "0.0.2" - } - }, - "node_modules/butterchurn-presets": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/butterchurn-presets/-/butterchurn-presets-2.4.7.tgz", - "integrity": "sha512-4MdM8ripz/VfH1BCldrIKdAc/1ryJFBDvqlyow6Ivo1frwj0H3duzvSMFC7/wIjAjxb1QpwVHVqGqS9uAFKhpg==", - "dependencies": { - "babel-runtime": "^6.26.0", - "ecma-proposal-math-extensions": "0.0.2", - "lodash": "^4.17.4" - } - }, "node_modules/cacache": { "version": "17.1.4", "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", @@ -2905,13 +2848,6 @@ "node": ">=10" } }, - "node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", - "hasInstallScript": true - }, "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -3498,11 +3434,6 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, - "node_modules/ecma-proposal-math-extensions": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/ecma-proposal-math-extensions/-/ecma-proposal-math-extensions-0.0.2.tgz", - "integrity": "sha512-80BnDp2Fn7RxXlEr5HHZblniY4aQ97MOAicdWWpSo0vkQiISSE9wLR4SqxKsu4gCtXFBIPPzy8JMhay4NWRg/Q==" - }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", diff --git a/package.json b/package.json index f872918d..d1c1a59c 100644 --- a/package.json +++ b/package.json @@ -119,9 +119,6 @@ "@foobar404/wave": "2.0.4", "@xhayper/discord-rpc": "1.0.22", "async-mutex": "0.4.0", - "browser-id3-writer": "5.0.0", - "butterchurn": "2.6.7", - "butterchurn-presets": "2.4.7", "conf": "10.2.0", "custom-electron-prompt": "1.5.7", "custom-electron-titlebar": "4.1.6", From 2eaa660a6da0b06dd76d1c6e30e92d7ce033c86b Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Mon, 4 Sep 2023 12:25:43 +0900 Subject: [PATCH 30/70] feat: add more type-definitions for youtube-player Co-authored-by: ArjixWasTaken <53124886+ArjixWasTaken@users.noreply.github.com> --- types/player-api-events.ts | 15 ++++ types/video-details.ts | 25 ++++++ types/youtube-player.ts | 178 ++++++++++++++++++++++--------------- 3 files changed, 147 insertions(+), 71 deletions(-) create mode 100644 types/player-api-events.ts create mode 100644 types/video-details.ts diff --git a/types/player-api-events.ts b/types/player-api-events.ts new file mode 100644 index 00000000..af05c82b --- /dev/null +++ b/types/player-api-events.ts @@ -0,0 +1,15 @@ +export interface PlayerAPIEvents { + videodatachange: { + value: Record & { + videoId: string + title: string + author: string + + playlistId: string + isUpcoming: boolean + loading: boolean + + lengthSeconds: number + } + } & ({ name: 'dataloaded' } | { name: 'dataupdated ' }) +} diff --git a/types/video-details.ts b/types/video-details.ts new file mode 100644 index 00000000..97ab3fc3 --- /dev/null +++ b/types/video-details.ts @@ -0,0 +1,25 @@ +export interface VideoDetails { + video_id: string; + author: string; + title: string; + isPlayable: boolean; + errorCode: null; + video_quality: string; + video_quality_features: unknown[]; + list: string; + backgroundable: boolean; + eventId: string; + cpn: string; + isLive: boolean; + isWindowedLive: boolean; + isManifestless: boolean; + allowLiveDvr: boolean; + isListed: boolean; + isMultiChannelAudio: boolean; + hasProgressBarBoundaries: boolean; + isPremiere: boolean; + itct: string; + progressBarStartPositionUtcTimeMillis: number | null; + progressBarEndPositionUtcTimeMillis: number | null; + paidContentOverlayDurationMs: number; +} diff --git a/types/youtube-player.ts b/types/youtube-player.ts index f19a7db9..c46020bb 100644 --- a/types/youtube-player.ts +++ b/types/youtube-player.ts @@ -1,12 +1,14 @@ // TODO: fully type definitions for youtube-player +import { VideoDetails } from './video-details'; import { GetPlayerResponse } from './get-player-response'; +import { PlayerAPIEvents } from './player-api-events'; export interface YoutubePlayer { getInternalApiInterface: (...params: Parameters) => Return; getApiInterface: (...params: Parameters) => Return; - cueVideoByPlayerVars: (...params: Parameters) => Return; - loadVideoByPlayerVars: (...params: Parameters) => Return; + cueVideoByPlayerVars: () => void; + loadVideoByPlayerVars: () => void; preloadVideoByPlayerVars: (...params: Parameters) => Return; getAdState: (...params: Parameters) => Return; sendAbandonmentPing: (...params: Parameters) => Return; @@ -18,7 +20,7 @@ export interface YoutubePlayer { seekToStreamTime: (...params: Parameters) => Return; startSeekCsiAction: (...params: Parameters) => Return; getStreamTimeOffset: (...params: Parameters) => Return; - getVideoData: (...params: Parameters) => Return; + getVideoData: () => VideoDetails; setInlinePreview: (...params: Parameters) => Return; updateDownloadState: (...params: Parameters) => Return; queueOfflineAction: (...params: Parameters) => Return; @@ -95,82 +97,116 @@ export interface YoutubePlayer { setGlobalCrop: (...params: Parameters) => Return; setInternalSize: (...params: Parameters) => Return; seekBy: (seconds: number) => void; - showControls: (...params: Parameters) => Return; - hideControls: (...params: Parameters) => Return; - cancelPlayback: (...params: Parameters) => Return; - getProgressState: (...params: Parameters) => Return; - isInline: (...params: Parameters) => Return; - setInline: (...params: Parameters) => Return; - setLoopVideo: (...params: Parameters) => Return; - getLoopVideo: (...params: Parameters) => Return; - getVideoContentRect: (...params: Parameters) => Return; - getVideoStats: (...params: Parameters) => Return; - getStoryboardFormat: (...params: Parameters) => Return; - toggleFullscreen: (...params: Parameters) => Return; - isFullscreen: (...params: Parameters) => Return; - getPlayerSize: (...params: Parameters) => Return; - toggleSubtitles: (...params: Parameters) => Return; - setCenterCrop: (...params: Parameters) => Return; - setFauxFullscreen: (...params: Parameters) => Return; - setSizeStyle: (...params: Parameters) => Return; - handleGlobalKeyDown: (...params: Parameters) => Return; - handleGlobalKeyUp: (...params: Parameters) => Return; - wakeUpControls: (...params: Parameters) => Return; - cueVideoById: (...params: Parameters) => Return; - loadVideoById: (...params: Parameters) => Return; + showControls: () => void; + hideControls: () => void; + cancelPlayback: () => void; + getProgressState: () => Return; + isInline: () => boolean; + setInline: (isInline: boolean) => void; + setLoopVideo: (value: boolean) => void; + getLoopVideo: () => boolean; + getVideoContentRect: () => Return; + getVideoStats: () => Return; + getStoryboardFormat: () => Return; + toggleFullscreen: () => Return; + isFullscreen: () => boolean; + getPlayerSize: () => Return; + toggleSubtitles: () => void; + setCenterCrop: (param: Parameter) => void; + setFauxFullscreen: (param: Parameter) => void; + setSizeStyle: (params: Parameter) => void; + handleGlobalKeyDown: () => void; + handleGlobalKeyUp: () => void; + wakeUpControls: () => void; + cueVideoById: (videoId: string) => void; + loadVideoById: (videoId: string) => void; cueVideoByUrl: (...params: Parameters) => Return; loadVideoByUrl: (...params: Parameters) => Return; - playVideo: (...params: Parameters) => Return; - pauseVideo: (...params: Parameters) => Return; - stopVideo: (...params: Parameters) => Return; - clearVideo: (...params: Parameters) => Return; - getVideoBytesLoaded: (...params: Parameters) => Return; - getVideoBytesTotal: (...params: Parameters) => Return; - getVideoLoadedFraction: (...params: Parameters) => Return; - getVideoStartBytes: (...params: Parameters) => Return; - cuePlaylist: (...params: Parameters) => Return; - loadPlaylist: (...params: Parameters) => Return; - nextVideo: (...params: Parameters) => Return; - previousVideo: (...params: Parameters) => Return; - playVideoAt: (...params: Parameters) => Return; - setShuffle: (...params: Parameters) => Return; - setLoop: (...params: Parameters) => Return; - getPlaylist: (...params: Parameters) => Return; - getPlaylistIndex: (...params: Parameters) => Return; - getPlaylistId: (...params: Parameters) => Return; - loadModule: (...params: Parameters) => Return; - unloadModule: (...params: Parameters) => Return; + /** + * Note: This doesn't resume playback, it plays from the start. + */ + playVideo: () => void; + pauseVideo: () => void; + stopVideo: () => void; + clearVideo: () => void; + getVideoBytesLoaded: () => number; + getVideoBytesTotal: () => number; + getVideoLoadedFraction: () => number; + getVideoStartBytes: () => number; + cuePlaylist: () => void; + loadPlaylist: () => void; + nextVideo: () => void; + previousVideo: () => void; + playVideoAt: () => void; + setShuffle: (param: Parameter) => void; + setLoop: (param: Parameter) => void; + getPlaylist: () => Return; + getPlaylistIndex: () => number; + getPlaylistId: () => string | undefined; + loadModule: () => void; + unloadModule: () => void; setOption: (optionName: string, key: string, value: T) => void; getOption: (optionName: string, key: string) => T | null | undefined; getOptions: () => string[]; - mute: (...params: Parameters) => Return; - unMute: (...params: Parameters) => Return; - isMuted: (...params: Parameters) => Return; - setVolume: (...params: Parameters) => Return; + mute: () => void; + unMute: () => void; + isMuted: () => boolean; + /** + * @param volume 0-100 + */ + setVolume: (volume: number) => void; getVolume: () => number; seekTo: (seconds: number) => void; - getPlayerMode: (...params: Parameters) => Return; - getPlayerState: (...params: Parameters) => Return; - getAvailablePlaybackRates: (...params: Parameters) => Return; + getPlayerMode: () => Return; + getPlayerState: () => number; + getAvailablePlaybackRates: () => number[]; getPlaybackQuality: () => string; setPlaybackQuality: (quality: string) => void; getAvailableQualityLevels: () => string[]; - getCurrentTime: (...params: Parameters) => Return; - getDuration: (...params: Parameters) => Return; - addEventListener: (...params: Parameters) => Return; - removeEventListener: (...params: Parameters) => Return; - getDebugText: (...params: Parameters) => Return; + /** + * @return float between start and end in seconds + */ + getCurrentTime: () => number; + /** + * @return int song duration in seconds + */ + getDuration: () => number; + addEventListener: ( + type: K, + listener: ( + this: Document, + name: PlayerAPIEvents[K]['name'], + data: PlayerAPIEvents[K]['value'] + ) => void, + options?: boolean | AddEventListenerOptions | undefined, + ) => void; + removeEventListener: ( + type: K, + listener: ( + this: Document, + name: PlayerAPIEvents[K]['name'], + data: PlayerAPIEvents[K]['value'] + ) => void, + options?: boolean | EventListenerOptions | undefined, + ) => void; + getDebugText: () => string; addCueRange: (...params: Parameters) => Return; removeCueRange: (...params: Parameters) => Return; - setSize: (...params: Parameters) => Return; + setSize: (size: { width: number; height: number }) => void; destroy: (...params: Parameters) => Return; - getSphericalProperties: (...params: Parameters) => Return; - setSphericalProperties: (...params: Parameters) => Return; - mutedAutoplay: (...params: Parameters) => Return; - getVideoEmbedCode: (...params: Parameters) => Return; - getVideoUrl: (...params: Parameters) => Return; - getMediaReferenceTime: (...params: Parameters) => Return; - getSize: (...params: Parameters) => Return; + getSphericalProperties: () => Return; + setSphericalProperties: (param: Parameter) => void; + mutedAutoplay: () => void; + /** + * @return string HTMLIFrameElement + */ + getVideoEmbedCode: () => string; + /** + * @return string full URL of the video (include playlist id) + */ + getVideoUrl: () => string; + getMediaReferenceTime: () => number; + getSize: () => { width: number; height: number }; logImaAdEvent: (...params: Parameters) => Return; preloadVideoById: (...params: Parameters) => Return; setAccountLinkState: (...params: Parameters) => Return; @@ -178,11 +214,11 @@ export interface YoutubePlayer { getAvailableQualityData: (...params: Parameters) => Return; setCompositeParam: (...params: Parameters) => Return; getStatsForNerds: (...params: Parameters) => Return; - showVideoInfo: (...params: Parameters) => Return; - hideVideoInfo: (...params: Parameters) => Return; - isVideoInfoVisible: (...params: Parameters) => Return; - getPlaybackRate: (...params: Parameters) => Return; - setPlaybackRate: (...params: Parameters) => Return; + showVideoInfo: () => void; + hideVideoInfo: () => void; + isVideoInfoVisible: () => boolean; + getPlaybackRate: () => number; + setPlaybackRate: (playbackRate: number) => void; updateFullerscreenEduButtonSubtleModeState: (...params: Parameters) => Return; updateFullerscreenEduButtonVisibility: (...params: Parameters) => Return; addEmbedsConversionTrackingParams: (...params: Parameters) => Return; From 913c69a33db5155621ccb1b990c133ffc10ea634 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Mon, 4 Sep 2023 12:35:46 +0900 Subject: [PATCH 31/70] feat(youtube-player-api): fix type definitions --- types/youtube-player.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/types/youtube-player.ts b/types/youtube-player.ts index c46020bb..c5ee1173 100644 --- a/types/youtube-player.ts +++ b/types/youtube-player.ts @@ -143,8 +143,8 @@ export interface YoutubePlayer { getPlaylist: () => Return; getPlaylistIndex: () => number; getPlaylistId: () => string | undefined; - loadModule: () => void; - unloadModule: () => void; + loadModule: (moduleName: string) => void; + unloadModule: (moduleName: string) => void; setOption: (optionName: string, key: string, value: T) => void; getOption: (optionName: string, key: string) => T | null | undefined; getOptions: () => string[]; From 27086e759f2bc314c3f28887468b1a519702c86e Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Mon, 4 Sep 2023 13:44:53 +0900 Subject: [PATCH 32/70] fix: fix youtube-age-restriction-bypass Co-authored-by: MiepHD <63968466+MiepHD@users.noreply.github.com> --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3e5f773b..8b00e22e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,7 @@ "md5": "2.3.0", "mpris-service": "2.1.2", "node-id3": "0.2.6", - "simple-youtube-age-restriction-bypass": "git+https://github.com/zerodytrash/Simple-YouTube-Age-Restriction-Bypass.git#v2.5.9", + "simple-youtube-age-restriction-bypass": "git+https://github.com/MiepHD/Simple-YouTube-Age-Restriction-Bypass.git#v2.5.5", "vudio": "2.1.1", "youtubei.js": "6.1.0", "ytpl": "2.3.0" @@ -8047,7 +8047,7 @@ }, "node_modules/simple-youtube-age-restriction-bypass": { "version": "2.5.9", - "resolved": "git+ssh://git@github.com/zerodytrash/Simple-YouTube-Age-Restriction-Bypass.git#4c5c61ac73811217a6402e3860591d28d9968d1e", + "resolved": "git+ssh://git@github.com/MiepHD/Simple-YouTube-Age-Restriction-Bypass.git#79b9456c290df42f35f081413e18dc336d340724", "license": "MIT", "workspaces": [ "account-proxy" diff --git a/package.json b/package.json index d1c1a59c..b7b9d562 100644 --- a/package.json +++ b/package.json @@ -137,7 +137,7 @@ "md5": "2.3.0", "mpris-service": "2.1.2", "node-id3": "0.2.6", - "simple-youtube-age-restriction-bypass": "git+https://github.com/zerodytrash/Simple-YouTube-Age-Restriction-Bypass.git#v2.5.9", + "simple-youtube-age-restriction-bypass": "git+https://github.com/MiepHD/Simple-YouTube-Age-Restriction-Bypass.git#v2.5.5", "vudio": "2.1.1", "youtubei.js": "6.1.0", "ytpl": "2.3.0" From 031875ad86a26d74808ddff1dd2fccc0e0c374d6 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Mon, 4 Sep 2023 15:50:35 +0900 Subject: [PATCH 33/70] fix: show interactive icon when using non-packaged mode --- plugins/notifications/interactive.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/notifications/interactive.ts b/plugins/notifications/interactive.ts index ab724ba2..3e33c1e4 100644 --- a/plugins/notifications/interactive.ts +++ b/plugins/notifications/interactive.ts @@ -154,7 +154,7 @@ const getXml = (songInfo: SongInfo, iconSrc: string) => { const iconLocation = app.isPackaged ? path.resolve(app.getPath('userData'), 'icons') - : path.resolve(__dirname, '..', '..', 'assets/media-icons-black'); + : path.resolve(__dirname, '..', '..', '..', 'assets/media-icons-black'); const display = (kind: keyof typeof icons) => { if (config.get('toastStyle') === ToastStyles.legacy) { From 42ad78c6cc93f519a50872e3d1c5ecafd0d232d7 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Mon, 4 Sep 2023 16:29:28 +0900 Subject: [PATCH 34/70] fix(package.json): macOS exclude path --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index b7b9d562..591ad73d 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "productName": "YouTube Music", "version": "1.20.0", "description": "YouTube Music Desktop App - including custom plugins", + "main": "./dist/index.js", "license": "MIT", "repository": "th-ch/youtube-music", "author": { @@ -16,7 +17,7 @@ "mac": { "identity": null, "files": [ - "!plugins/taskbar-mediacontrol${/*}" + "!dist/plugins/taskbar-mediacontrol${/*}" ], "target": [ { From 73287cf8b25432ba4aa2e34bcd3eced0faeeb7cb Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Mon, 4 Sep 2023 17:20:07 +0900 Subject: [PATCH 35/70] fix: assets path --- package.json | 28 +++++++++++++++++++++++----- plugins/notifications/interactive.ts | 2 +- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 591ad73d..e4b8df83 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,13 @@ "mac": { "identity": null, "files": [ - "!dist/plugins/taskbar-mediacontrol${/*}" + "!*", + "dist", + "!dist/plugins/taskbar-mediacontrol${/*}", + "license", + "node_modules", + "package.json", + "tests" ], "target": [ { @@ -33,7 +39,13 @@ "win": { "icon": "assets/generated/icons/win/icon.ico", "files": [ - "!plugins/touchbar${/*}" + "!*", + "dist", + "!dist/plugins/touchbar${/*}", + "license", + "node_modules", + "package.json", + "tests" ], "target": [ { @@ -58,7 +70,13 @@ "linux": { "icon": "assets/generated/icons/png", "files": [ - "!plugins/{touchbar,taskbar-mediacontrol}${/*}" + "!*", + "dist", + "!dist/plugins/{touchbar,taskbar-mediacontrol}${/*}", + "license", + "node_modules", + "package.json", + "tests" ], "category": "AudioVideo", "target": [ @@ -90,9 +108,9 @@ "generate:package": "node utils/generate-package-json.js", "postinstall": "npm run plugins", "clean": "del-cli dist && del-cli pack", - "ytm-css-copy-files": "copyfiles youtube-music.css dist/", + "ytm-resource-copy-files": "copyfiles error.html youtube-music.css assets/**/* dist/", "copy-files": "copyfiles -u 1 plugins/**/*.html plugins/**/*.css plugins/**/*.bin plugins/**/*.js dist/plugins/", - "tsc-and-copy": "tsc && npm run plugin:adblocker-without-tsc && npm run ytm-css-copy-files && npm run copy-files", + "tsc-and-copy": "tsc && npm run plugin:adblocker-without-tsc && npm run ytm-resource-copy-files && npm run copy-files", "build": "npm run clean && npm run tsc-and-copy && electron-builder --win --mac --linux -p never", "build:linux": "npm run clean && npm run tsc-and-copy && electron-builder --linux -p never", "build:mac": "npm run clean && npm run tsc-and-copy && electron-builder --mac dmg:x64 -p never", diff --git a/plugins/notifications/interactive.ts b/plugins/notifications/interactive.ts index 3e33c1e4..ab724ba2 100644 --- a/plugins/notifications/interactive.ts +++ b/plugins/notifications/interactive.ts @@ -154,7 +154,7 @@ const getXml = (songInfo: SongInfo, iconSrc: string) => { const iconLocation = app.isPackaged ? path.resolve(app.getPath('userData'), 'icons') - : path.resolve(__dirname, '..', '..', '..', 'assets/media-icons-black'); + : path.resolve(__dirname, '..', '..', 'assets/media-icons-black'); const display = (kind: keyof typeof icons) => { if (config.get('toastStyle') === ToastStyles.legacy) { From b362118207966c44b5c5105b1909dcc4791ac6af Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Mon, 4 Sep 2023 17:20:33 +0900 Subject: [PATCH 36/70] fix: discord plugin --- plugins/discord/back.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/discord/back.ts b/plugins/discord/back.ts index 8fa2f643..35947c00 100644 --- a/plugins/discord/back.ts +++ b/plugins/discord/back.ts @@ -1,5 +1,5 @@ import { app, dialog } from 'electron'; -import Discord from '@xhayper/discord-rpc'; +import { Client as DiscordClient } from '@xhayper/discord-rpc'; import { dev } from 'electron-is'; import { SetActivity } from '@xhayper/discord-rpc/dist/structures/ClientUser'; @@ -12,14 +12,14 @@ import type { ConfigType } from '../../config/dynamic'; const clientId = '1043858434585526382'; export interface Info { - rpc: import('@xhayper/discord-rpc').Client; + rpc: DiscordClient; ready: boolean; autoReconnect: boolean; lastSongInfo?: import('../../providers/song-info').SongInfo; } const info: Info = { - rpc: new Discord.Client({ + rpc: new DiscordClient({ clientId, }), ready: false, From ae1e106ccd3b05938941ec9dd82b85e4dc4826ba Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Mon, 4 Sep 2023 17:38:03 +0900 Subject: [PATCH 37/70] feat(config): more 'optimized' generic --- config/index.ts | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/config/index.ts b/config/index.ts index a27666dc..739cd2a7 100644 --- a/config/index.ts +++ b/config/index.ts @@ -32,15 +32,11 @@ type Paths = [D] extends [never] ? never : T extends o : never }[keyof T] : '' -type FirstKey = T extends `${infer K}.${string}` ? K : T; -type NextKey = T extends `${string}.${infer K}` ? K : T; -type PathValue = ( - T extends object - ? FirstKey extends keyof T - ? PathValue], NextKey> - : T +type SplitKey = K extends `${infer A}.${infer B}` ? [A, B] : [K, string] +type PathValue = + SplitKey extends [infer A extends keyof T, infer B extends string] + ? PathValue : T -); const get = >(key: Key) => store.get(key) as PathValue; export default { From 9b6e3c850a2a4c7f9e5d4ee25fdc9ff593741e74 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Mon, 4 Sep 2023 17:38:44 +0900 Subject: [PATCH 38/70] fix(config): fix missing semi-colon --- config/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/index.ts b/config/index.ts index 739cd2a7..a517186f 100644 --- a/config/index.ts +++ b/config/index.ts @@ -32,11 +32,11 @@ type Paths = [D] extends [never] ? never : T extends o : never }[keyof T] : '' -type SplitKey = K extends `${infer A}.${infer B}` ? [A, B] : [K, string] +type SplitKey = K extends `${infer A}.${infer B}` ? [A, B] : [K, string]; type PathValue = SplitKey extends [infer A extends keyof T, infer B extends string] ? PathValue - : T + : T; const get = >(key: Key) => store.get(key) as PathValue; export default { From ce264c5d659a5c3b17f18febfddf8d92de5ecf52 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Mon, 4 Sep 2023 17:45:25 +0900 Subject: [PATCH 39/70] fix: minor fix --- menu.ts | 6 +++--- plugins/crossfade/back.ts | 6 +----- plugins/crossfade/fader.ts | 4 ++-- plugins/downloader/back.ts | 16 ++++------------ plugins/navigation/actions.ts | 6 ++++++ 5 files changed, 16 insertions(+), 22 deletions(-) diff --git a/menu.ts b/menu.ts index 0377bb5d..fca99e6d 100644 --- a/menu.ts +++ b/menu.ts @@ -242,7 +242,7 @@ export const mainMenuTemplate = (win: BrowserWindow): MenuTemplate => { { label: 'Enabled + app visible', type: 'radio', - checked: !!(config.get('options.tray') && config.get('options.appVisible')), + checked: config.get('options.tray') && config.get('options.appVisible'), click() { config.setMenuOption('options.tray', true); config.setMenuOption('options.appVisible', true); @@ -251,7 +251,7 @@ export const mainMenuTemplate = (win: BrowserWindow): MenuTemplate => { { label: 'Enabled + app hidden', type: 'radio', - checked: !!(config.get('options.tray') && !config.get('options.appVisible')), + checked: config.get('options.tray') && !config.get('options.appVisible'), click() { config.setMenuOption('options.tray', true); config.setMenuOption('options.appVisible', false); @@ -316,7 +316,7 @@ export const mainMenuTemplate = (win: BrowserWindow): MenuTemplate => { is.macOS() ? { label: 'Toggle DevTools', - // Cannot use "toggleDevTools" role in MacOS + // Cannot use "toggleDevTools" role in macOS click() { const { webContents } = win; if (webContents.isDevToolsOpened()) { diff --git a/plugins/crossfade/back.ts b/plugins/crossfade/back.ts index ff4d1647..56a1355f 100644 --- a/plugins/crossfade/back.ts +++ b/plugins/crossfade/back.ts @@ -1,15 +1,11 @@ import { ipcMain } from 'electron'; import { Innertube } from 'youtubei.js'; -import config from './config'; - export default async () => { const yt = await Innertube.create(); ipcMain.handle('audio-url', async (_, videoID: string) => { const info = await yt.getBasicInfo(videoID); - const url = info.streaming_data?.formats[0].decipher(yt.session.player); - - return url; + return info.streaming_data?.formats[0].decipher(yt.session.player); }); }; diff --git a/plugins/crossfade/fader.ts b/plugins/crossfade/fader.ts index e403100a..c9442ba0 100644 --- a/plugins/crossfade/fader.ts +++ b/plugins/crossfade/fader.ts @@ -63,8 +63,8 @@ interface VolumeFade { // Main class export class VolumeFader { - private media: HTMLMediaElement; - private logger: VolumeLogger | false; + private readonly media: HTMLMediaElement; + private readonly logger: VolumeLogger | false; private scale: { internalToVolume: (level: number) => number; volumeToInternal: (level: number) => number; diff --git a/plugins/downloader/back.ts b/plugins/downloader/back.ts index 90a201c8..46959323 100644 --- a/plugins/downloader/back.ts +++ b/plugins/downloader/back.ts @@ -1,10 +1,4 @@ - -import { - existsSync, - mkdirSync, - createWriteStream, - writeFileSync, -} from 'node:fs'; +import { createWriteStream, existsSync, mkdirSync, writeFileSync, } from 'node:fs'; import { join } from 'node:path'; import { randomBytes } from 'node:crypto'; @@ -12,7 +6,7 @@ import { app, BrowserWindow, dialog, ipcMain } from 'electron'; import { ClientType, Innertube, UniversalCache, Utils } from 'youtubei.js'; import is from 'electron-is'; import ytpl from 'ytpl'; - // REPLACE with youtubei getplaylist https://github.com/LuanRT/YouTube.js#getplaylistid +// REPLACE with youtubei getplaylist https://github.com/LuanRT/YouTube.js#getplaylistid import filenamify from 'filenamify'; import { Mutex } from 'async-mutex'; import { createFFmpeg } from '@ffmpeg/ffmpeg'; @@ -260,11 +254,10 @@ async function iterableStreamToMP3( ) { const chunks = []; let downloaded = 0; - const total = contentLength; for await (const chunk of stream) { downloaded += chunk.length; chunks.push(chunk); - const ratio = downloaded / total; + const ratio = downloaded / contentLength; const progress = Math.floor(ratio * 100); sendFeedback(`Download: ${progress}%`, ratio); // 15% for download, 85% for conversion @@ -552,8 +545,7 @@ const getAndroidTvInfo = async (id: string): Promise => { generate_session_locally: true, retrieve_player: true, }); - const info = await innertube.getBasicInfo(id, 'TV_EMBEDDED'); // GetInfo 404s with the bypass, so we use getBasicInfo instead // that's fine as we only need the streaming data - return info; + return await innertube.getBasicInfo(id, 'TV_EMBEDDED'); }; diff --git a/plugins/navigation/actions.ts b/plugins/navigation/actions.ts index 692ab4e7..32813956 100644 --- a/plugins/navigation/actions.ts +++ b/plugins/navigation/actions.ts @@ -6,10 +6,16 @@ export const ACTIONS = Actions; export function goToNextPage() { triggerAction(CHANNEL, Actions.NEXT); } +// for HTML +// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-explicit-any +(global as any).goToNextPage = goToNextPage; export function goToPreviousPage() { triggerAction(CHANNEL, Actions.BACK); } +// for HTML +// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-explicit-any +(global as any).goToPreviousPage = goToPreviousPage; export default { CHANNEL, From 451d33707ad43209dc3a4472a11a00e6a50dac6e Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Mon, 4 Sep 2023 18:01:54 +0900 Subject: [PATCH 40/70] fix: downloader For example, in South Korea, YouTube Music is only available to YT premium users. Therefore, calling getInfo without passing a cookie will always return `UNPLAYABLE`. --- plugins/downloader/back.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/downloader/back.ts b/plugins/downloader/back.ts index 46959323..f627c105 100644 --- a/plugins/downloader/back.ts +++ b/plugins/downloader/back.ts @@ -69,8 +69,12 @@ export default async (win_: BrowserWindow) => { win = win_; injectCSS(win.webContents, join(__dirname, 'style.css')); + const cookie = (await win.webContents.session.cookies.get({ url: 'https://music.youtube.com' })).map((it) => + it.name + '=' + it.value + ';' + ).join(''); yt = await Innertube.create({ cache: new UniversalCache(false), + cookie, generate_session_locally: true, }); ipcMain.on('download-song', (_, url: string) => downloadSong(url)); From 563daae11ae351269b39c00450a99538ceb616b0 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Mon, 4 Sep 2023 18:58:03 +0900 Subject: [PATCH 41/70] chore(README): update README --- readme.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/readme.md b/readme.md index 680fd6ad..cc17bd3e 100644 --- a/readme.md +++ b/readme.md @@ -4,7 +4,7 @@ [![GitHub release](https://img.shields.io/github/release/th-ch/youtube-music.svg?style=for-the-badge&logo=youtube-music)](https://github.com/th-ch/youtube-music/releases/) [![GitHub license](https://img.shields.io/github/license/th-ch/youtube-music.svg?style=for-the-badge)](https://github.com/th-ch/youtube-music/blob/master/LICENSE) -[![XO code style](https://img.shields.io/badge/code_style-XO-5ed9c7.svg?style=for-the-badge)](https://github.com/sindresorhus/xo) +[![eslint code style](https://img.shields.io/badge/code_style-eslint-5ed9c7.svg?style=for-the-badge)](https://github.com/th-ch/youtube-music/blob/master/.eslintrc.js) [![Build status](https://img.shields.io/github/actions/workflow/status/th-ch/youtube-music/build.yml?branch=master&style=for-the-badge&logo=youtube-music)](https://GitHub.com/th-ch/youtube-music/releases/) [![Known Vulnerabilities](https://img.shields.io/snyk/vulnerabilities/github/th-ch/youtube-music?style=for-the-badge)](https://snyk.io/test/github/th-ch/youtube-music) [![GitHub All Releases](https://img.shields.io/github/downloads/th-ch/youtube-music/total?style=for-the-badge&logo=youtube-music)](https://GitHub.com/th-ch/youtube-music/releases/) @@ -169,8 +169,8 @@ Some predefined themes are available in https://github.com/kerichdev/themes-for- ```sh git clone https://github.com/th-ch/youtube-music cd youtube-music -yarn -yarn start +npm +npm run start ``` ## Build your own plugins @@ -231,12 +231,12 @@ module.exports = () => { ## Build 1. Clone the repo -2. Run `yarn` to install dependencies -3. Run `yarn build:OS` +2. Run `npm i` to install dependencies +3. Run `npm run build:OS` -- `yarn build:win` - Windows -- `yarn build:linux` - Linux -- `yarn build:mac` - MacOS +- `npm run build:win` - Windows +- `npm run build:linux` - Linux +- `npm run build:mac` - MacOS Builds the app for macOS, Linux, and Windows, using [electron-builder](https://github.com/electron-userland/electron-builder). @@ -244,7 +244,7 @@ using [electron-builder](https://github.com/electron-userland/electron-builder). ## Tests ```sh -yarn test +npm run test ``` Uses [Playwright](https://playwright.dev/) to test the app. From 1d6f1d2216142241c78d5fba77028ed4dfeb8142 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Sun, 10 Sep 2023 18:39:41 +0900 Subject: [PATCH 42/70] chore(deps): bump deps --- package-lock.json | 485 +++++++++++++++++++++++++++++++--------------- package.json | 16 +- 2 files changed, 336 insertions(+), 165 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8b00e22e..17df5aba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "electron-localshortcut": "3.2.1", "electron-store": "8.1.0", "electron-unhandled": "4.0.1", - "electron-updater": "6.1.1", + "electron-updater": "6.1.4", "filenamify": "4.3.0", "howler": "2.2.3", "html-to-text": "9.0.5", @@ -47,14 +47,14 @@ "@types/html-to-text": "^9.0.1", "@types/md5": "^2.3.2", "@types/youtube-player": "^5.5.7", - "@typescript-eslint/eslint-plugin": "6.5.0", + "@typescript-eslint/eslint-plugin": "6.6.0", "auto-changelog": "2.4.0", "copyfiles": "2.4.1", - "del-cli": "5.0.1", - "electron": "27.0.0-alpha.5", - "electron-builder": "24.6.3", + "del-cli": "5.1.0", + "electron": "27.0.0-alpha.6", + "electron-builder": "24.6.4", "electron-devtools-installer": "3.2.0", - "eslint": "8.48.0", + "eslint": "8.49.0", "eslint-plugin-import": "2.28.1", "eslint-plugin-prettier": "5.0.0", "node-gyp": "9.4.0", @@ -400,13 +400,14 @@ } }, "node_modules/@electron/notarize": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-1.2.4.tgz", - "integrity": "sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.1.0.tgz", + "integrity": "sha512-Q02xem1D0sg4v437xHgmBLxI2iz/fc0D4K7fiVWHa/AnW8o7D751xyKNXgziA6HrTOme9ul1JfWN5ark8WH1xA==", "dev": true, "dependencies": { "debug": "^4.1.1", - "fs-extra": "^9.0.1" + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" }, "engines": { "node": ">= 10.0.0" @@ -517,9 +518,9 @@ } }, "node_modules/@electron/universal": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.4.1.tgz", - "integrity": "sha512-lE/U3UNw1YHuowNbTmKNs9UlS3En3cPgwM5MI+agIgr/B1hSze9NdOP0qn7boZaI9Lph8IDv3/24g9IxnJP7aQ==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.4.2.tgz", + "integrity": "sha512-ymGwXYBUGFS1DuTqYJwZ0p1gIlELKOf21zPJefij/amzV66vTXRNJ2mAtW0uRsaHfV+pzYTJVrt5oco44DFOMg==", "dev": true, "dependencies": { "@electron/asar": "^3.2.1", @@ -662,9 +663,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", - "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1310,16 +1311,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.5.0.tgz", - "integrity": "sha512-2pktILyjvMaScU6iK3925uvGU87E+N9rh372uGZgiMYwafaw9SXq86U04XPq3UH6tzRvNgBsub6x2DacHc33lw==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.6.0.tgz", + "integrity": "sha512-CW9YDGTQnNYMIo5lMeuiIG08p4E0cXrXTbcZ2saT/ETE7dWUrNxlijsQeU04qAAKkILiLzdQz+cGFxCJjaZUmA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.5.0", - "@typescript-eslint/type-utils": "6.5.0", - "@typescript-eslint/utils": "6.5.0", - "@typescript-eslint/visitor-keys": "6.5.0", + "@typescript-eslint/scope-manager": "6.6.0", + "@typescript-eslint/type-utils": "6.6.0", + "@typescript-eslint/utils": "6.6.0", + "@typescript-eslint/visitor-keys": "6.6.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1344,6 +1345,53 @@ } } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.6.0.tgz", + "integrity": "sha512-pT08u5W/GT4KjPUmEtc2kSYvrH8x89cVzkA0Sy2aaOUIw6YxOIjA8ilwLr/1fLjOedX1QAuBpG9XggWqIIfERw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.6.0", + "@typescript-eslint/visitor-keys": "6.6.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.6.0.tgz", + "integrity": "sha512-CB6QpJQ6BAHlJXdwUmiaXDBmTqIE2bzGTDLADgvqtHWuhfNP3rAOK7kAgRMAET5rDRr9Utt+qAzRBdu3AhR3sg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.6.0.tgz", + "integrity": "sha512-L61uJT26cMOfFQ+lMZKoJNbAEckLe539VhTxiGHrWl5XSKQgA0RTBZJW2HFPy5T0ZvPVSD93QsrTKDkfNwJGyQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.6.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/parser": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.5.0.tgz", @@ -1378,6 +1426,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.5.0.tgz", "integrity": "sha512-A8hZ7OlxURricpycp5kdPTH3XnjG85UpJS6Fn4VzeoH4T388gQJ/PGP4ole5NfKt4WDVhmLaQ/dBLNDC4Xl/Kw==", "dev": true, + "peer": true, "dependencies": { "@typescript-eslint/types": "6.5.0", "@typescript-eslint/visitor-keys": "6.5.0" @@ -1391,13 +1440,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.5.0.tgz", - "integrity": "sha512-f7OcZOkRivtujIBQ4yrJNIuwyCQO1OjocVqntl9dgSIZAdKqicj3xFDqDOzHDlGCZX990LqhLQXWRnQvsapq8A==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.6.0.tgz", + "integrity": "sha512-8m16fwAcEnQc69IpeDyokNO+D5spo0w1jepWWY2Q6y5ZKNuj5EhVQXjtVAeDDqvW6Yg7dhclbsz6rTtOvcwpHg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.5.0", - "@typescript-eslint/utils": "6.5.0", + "@typescript-eslint/typescript-estree": "6.6.0", + "@typescript-eslint/utils": "6.6.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1417,11 +1466,98 @@ } } }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.6.0.tgz", + "integrity": "sha512-CB6QpJQ6BAHlJXdwUmiaXDBmTqIE2bzGTDLADgvqtHWuhfNP3rAOK7kAgRMAET5rDRr9Utt+qAzRBdu3AhR3sg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.6.0.tgz", + "integrity": "sha512-hMcTQ6Al8MP2E6JKBAaSxSVw5bDhdmbCEhGW/V8QXkb9oNsFkA4SBuOMYVPxD3jbtQ4R/vSODBsr76R6fP3tbA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.6.0", + "@typescript-eslint/visitor-keys": "6.6.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.6.0.tgz", + "integrity": "sha512-L61uJT26cMOfFQ+lMZKoJNbAEckLe539VhTxiGHrWl5XSKQgA0RTBZJW2HFPy5T0ZvPVSD93QsrTKDkfNwJGyQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.6.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@typescript-eslint/types": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.5.0.tgz", "integrity": "sha512-eqLLOEF5/lU8jW3Bw+8auf4lZSbbljHR2saKnYqON12G/WsJrGeeDHWuQePoEf9ro22+JkbPfWQwKEC5WwLQ3w==", "dev": true, + "peer": true, "engines": { "node": "^16.0.0 || >=18.0.0" }, @@ -1435,6 +1571,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.5.0.tgz", "integrity": "sha512-q0rGwSe9e5Kk/XzliB9h2LBc9tmXX25G0833r7kffbl5437FPWb2tbpIV9wAATebC/018pGa9fwPDuvGN+LxWQ==", "dev": true, + "peer": true, "dependencies": { "@typescript-eslint/types": "6.5.0", "@typescript-eslint/visitor-keys": "6.5.0", @@ -1462,6 +1599,7 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "peer": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -1482,22 +1620,23 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "peer": true, "engines": { "node": ">=8" } }, "node_modules/@typescript-eslint/utils": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.5.0.tgz", - "integrity": "sha512-9nqtjkNykFzeVtt9Pj6lyR9WEdd8npPhhIPM992FWVkZuS6tmxHfGVnlUcjpUP2hv8r4w35nT33mlxd+Be1ACQ==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.6.0.tgz", + "integrity": "sha512-mPHFoNa2bPIWWglWYdR0QfY9GN0CfvvXX1Sv6DlSTive3jlMTUy+an67//Gysc+0Me9pjitrq0LJp0nGtLgftw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.5.0", - "@typescript-eslint/types": "6.5.0", - "@typescript-eslint/typescript-estree": "6.5.0", + "@typescript-eslint/scope-manager": "6.6.0", + "@typescript-eslint/types": "6.6.0", + "@typescript-eslint/typescript-estree": "6.6.0", "semver": "^7.5.4" }, "engines": { @@ -1511,11 +1650,115 @@ "eslint": "^7.0.0 || ^8.0.0" } }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.6.0.tgz", + "integrity": "sha512-pT08u5W/GT4KjPUmEtc2kSYvrH8x89cVzkA0Sy2aaOUIw6YxOIjA8ilwLr/1fLjOedX1QAuBpG9XggWqIIfERw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.6.0", + "@typescript-eslint/visitor-keys": "6.6.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.6.0.tgz", + "integrity": "sha512-CB6QpJQ6BAHlJXdwUmiaXDBmTqIE2bzGTDLADgvqtHWuhfNP3rAOK7kAgRMAET5rDRr9Utt+qAzRBdu3AhR3sg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.6.0.tgz", + "integrity": "sha512-hMcTQ6Al8MP2E6JKBAaSxSVw5bDhdmbCEhGW/V8QXkb9oNsFkA4SBuOMYVPxD3jbtQ4R/vSODBsr76R6fP3tbA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.6.0", + "@typescript-eslint/visitor-keys": "6.6.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.6.0.tgz", + "integrity": "sha512-L61uJT26cMOfFQ+lMZKoJNbAEckLe539VhTxiGHrWl5XSKQgA0RTBZJW2HFPy5T0ZvPVSD93QsrTKDkfNwJGyQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.6.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@typescript-eslint/visitor-keys": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.5.0.tgz", "integrity": "sha512-yCB/2wkbv3hPsh02ZS8dFQnij9VVQXJMN/gbQsaaY+zxALkZnxa/wagvLEFsAWMPv7d7lxQmNsIzGU1w/T/WyA==", "dev": true, + "peer": true, "dependencies": { "@typescript-eslint/types": "6.5.0", "eslint-visitor-keys": "^3.4.1" @@ -1764,15 +2007,15 @@ "dev": true }, "node_modules/app-builder-lib": { - "version": "24.6.3", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.6.3.tgz", - "integrity": "sha512-++0Zp7vcCHfXMBGVj7luFxpqvMPk5mcWeTuw7OK0xNAaNtYQTTN0d9YfWRsb1MvviTOOhyHeULWz1CaixrdrDg==", + "version": "24.6.4", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.6.4.tgz", + "integrity": "sha512-m9931WXb83teb32N0rKg+ulbn6+Hl8NV5SUpVDOVz9MWOXfhV6AQtTdftf51zJJvCQnQugGtSqoLvgw6mdF/Rg==", "dev": true, "dependencies": { "@develar/schema-utils": "~2.6.5", - "@electron/notarize": "^1.2.3", - "@electron/osx-sign": "^1.0.4", - "@electron/universal": "1.3.4", + "@electron/notarize": "2.1.0", + "@electron/osx-sign": "1.0.5", + "@electron/universal": "1.4.1", "@malept/flatpak-bundler": "^0.4.0", "@types/fs-extra": "9.0.13", "7zip-bin": "~5.1.1", @@ -3150,12 +3393,12 @@ } }, "node_modules/del-cli": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/del-cli/-/del-cli-5.0.1.tgz", - "integrity": "sha512-hCDHJd0u0jKFqizgInYXZaILsqOIA7Zl6e7M3hJwP+SlwUAgtV/EB22EPF4e2+9VAVnBDQQBE6tDRe+/UuoFhg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/del-cli/-/del-cli-5.1.0.tgz", + "integrity": "sha512-xwMeh2acluWeccsfzE7VLsG3yTr7nWikbfw+xhMnpRrF15pGSkw+3/vJZWlGoE4I86UiLRNHicmKt4tkIX9Jtg==", "dev": true, "dependencies": { - "del": "^7.0.0", + "del": "^7.1.0", "meow": "^10.1.3" }, "bin": { @@ -3169,21 +3412,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/del/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -3254,12 +3482,12 @@ "integrity": "sha512-Ih3wj0ZTaQxaJRqUEXHMIXfXB86bwMGC0wc2nNsyCJqeo3lC4qnxXtFIsC+IGI46+dSIinuayCAZ6sLEEM02Bw==" }, "node_modules/dmg-builder": { - "version": "24.6.3", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.6.3.tgz", - "integrity": "sha512-O7KNT7OKqtV54fMYUpdlyTOCP5DoPuRMLqMTgxxV2PO8Hj/so6zOl5o8GTs8pdDkeAhJzCFOUNB3BDhgXbUbJg==", + "version": "24.6.4", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.6.4.tgz", + "integrity": "sha512-BNcHRc9CWEuI9qt0E655bUBU/j/3wUCYBVKGu1kVpbN5lcUdEJJJeiO0NHK3dgKmra6LUUZlo+mWqc+OCbi0zw==", "dev": true, "dependencies": { - "app-builder-lib": "24.6.3", + "app-builder-lib": "24.6.4", "builder-util": "24.5.0", "builder-util-runtime": "9.2.1", "fs-extra": "^10.1.0", @@ -3450,9 +3678,9 @@ } }, "node_modules/electron": { - "version": "27.0.0-alpha.5", - "resolved": "https://registry.npmjs.org/electron/-/electron-27.0.0-alpha.5.tgz", - "integrity": "sha512-svKvOe6mJCq9UNDJVM0U/8LQ5BeASFlz83QmsNAdY/8X5li2/50ieGzkuLPMVw8G/Fqg5eYuuRiqnik1av7tbw==", + "version": "27.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/electron/-/electron-27.0.0-alpha.6.tgz", + "integrity": "sha512-JV7j6Z+N0OOWe8Ipg4gyDWLXz4Gg7LDMh5WWyl2eQnEN6RpQyjZ4x09r8urw+VSynEhD9kric2d9EZdtOgtfFw==", "hasInstallScript": true, "dependencies": { "@electron/get": "^2.0.0", @@ -3476,16 +3704,16 @@ } }, "node_modules/electron-builder": { - "version": "24.6.3", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.6.3.tgz", - "integrity": "sha512-O6PqhRXwfxCNTXI4BlhELSeYYO6/tqlxRuy+4+xKBokQvwDDjDgZMMoSgAmanVSCuzjE7MZldI9XYrKFk+EQDw==", + "version": "24.6.4", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.6.4.tgz", + "integrity": "sha512-uNWQoU7pE7qOaIQ6CJHpBi44RJFVG8OHRBIadUxrsDJVwLLo8Nma3K/EEtx5/UyWAQYdcK4nVPYKoRqBb20hbA==", "dev": true, "dependencies": { - "app-builder-lib": "24.6.3", + "app-builder-lib": "24.6.4", "builder-util": "24.5.0", "builder-util-runtime": "9.2.1", "chalk": "^4.1.2", - "dmg-builder": "24.6.3", + "dmg-builder": "24.6.4", "fs-extra": "^10.1.0", "is-ci": "^3.0.0", "lazy-val": "^1.0.5", @@ -3560,21 +3788,6 @@ "unzip-crx-3": "^0.2.0" } }, - "node_modules/electron-devtools-installer/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/electron-is": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/electron-is/-/electron-is-3.0.0.tgz", @@ -3704,9 +3917,9 @@ } }, "node_modules/electron-updater": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-6.1.1.tgz", - "integrity": "sha512-IBT3zJ4yO5UZMF2gOTC9HrlmG4OYSRtOiHKzNAShJvfuicdx6UaXoa6AvhcTxdx6zf/rJyFMRBISS9jhVwTfow==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-6.1.4.tgz", + "integrity": "sha512-yYAJc6RQjjV4WtInZVn+ZcLyXRhbVXoomKEfUUwDqIk5s2wxzLhWaor7lrNgxODyODhipjg4SVPMhJHi5EnsCA==", "dependencies": { "builder-util-runtime": "9.2.1", "fs-extra": "^10.1.0", @@ -3715,7 +3928,7 @@ "lodash.escaperegexp": "^4.1.2", "lodash.isequal": "^4.5.0", "semver": "^7.3.8", - "typed-emitter": "^2.1.0" + "tiny-typed-emitter": "^2.1.0" } }, "node_modules/electron-updater/node_modules/fs-extra": { @@ -3941,16 +4154,16 @@ } }, "node_modules/eslint": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", - "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.48.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -4539,21 +4752,6 @@ "node": ">=12.0.0" } }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/flatted": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", @@ -6643,21 +6841,6 @@ "node": "^12.13 || ^14.13 || >=16" } }, - "node_modules/node-gyp/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/node-id3": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/node-id3/-/node-id3-0.2.6.tgz", @@ -7713,6 +7896,21 @@ "node": ">=0.10.0" } }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/roarr": { "version": "2.15.4", "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", @@ -7845,15 +8043,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "optional": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, "node_modules/safe-array-concat": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", @@ -8603,6 +8792,11 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/tiny-typed-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz", + "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==" + }, "node_modules/titleize": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", @@ -8649,21 +8843,6 @@ "tmp": "^0.2.0" } }, - "node_modules/tmp-promise/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/tmp-promise/node_modules/tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -8862,14 +9041,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typed-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/typed-emitter/-/typed-emitter-2.1.0.tgz", - "integrity": "sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==", - "optionalDependencies": { - "rxjs": "*" - } - }, "node_modules/typescript": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", diff --git a/package.json b/package.json index e4b8df83..9bbdeb9c 100644 --- a/package.json +++ b/package.json @@ -147,7 +147,7 @@ "electron-localshortcut": "3.2.1", "electron-store": "8.1.0", "electron-unhandled": "4.0.1", - "electron-updater": "6.1.1", + "electron-updater": "6.1.4", "filenamify": "4.3.0", "howler": "2.2.3", "html-to-text": "9.0.5", @@ -164,8 +164,8 @@ "overrides": { "xml2js": "0.6.2", "node-fetch": "2.7.0", - "@electron/universal": "1.4.1", - "electron": "27.0.0-alpha.5" + "@electron/universal": "1.4.2", + "electron": "27.0.0-alpha.6" }, "devDependencies": { "@playwright/test": "1.37.1", @@ -175,14 +175,14 @@ "@types/html-to-text": "^9.0.1", "@types/md5": "^2.3.2", "@types/youtube-player": "^5.5.7", - "@typescript-eslint/eslint-plugin": "6.5.0", + "@typescript-eslint/eslint-plugin": "6.6.0", "auto-changelog": "2.4.0", "copyfiles": "2.4.1", - "del-cli": "5.0.1", - "electron": "27.0.0-alpha.5", - "electron-builder": "24.6.3", + "del-cli": "5.1.0", + "electron": "27.0.0-alpha.6", + "electron-builder": "24.6.4", "electron-devtools-installer": "3.2.0", - "eslint": "8.48.0", + "eslint": "8.49.0", "eslint-plugin-import": "2.28.1", "eslint-plugin-prettier": "5.0.0", "node-gyp": "9.4.0", From 9739dbe27f182c0f987fb9b7611919f87ad59d44 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Mon, 11 Sep 2023 15:58:44 +0900 Subject: [PATCH 43/70] fix(download): Crashes due to genius-lyrics feature --- plugins/downloader/back.ts | 2 +- plugins/lyrics-genius/back.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/downloader/back.ts b/plugins/downloader/back.ts index f627c105..706e8430 100644 --- a/plugins/downloader/back.ts +++ b/plugins/downloader/back.ts @@ -55,7 +55,7 @@ const sendError = (error: Error, source?: string) => { const cause = error.cause ? `\n\n${String(error.cause)}` : ''; const message = `${error.toString()}${songNameMessage}${cause}`; - console.error(message); + console.error(message, error, error?.stack); dialog.showMessageBox({ type: 'info', buttons: ['OK'], diff --git a/plugins/lyrics-genius/back.ts b/plugins/lyrics-genius/back.ts index 79522d13..ce46aa3a 100644 --- a/plugins/lyrics-genius/back.ts +++ b/plugins/lyrics-genius/back.ts @@ -78,9 +78,9 @@ const getLyricsList = async (queryString: string): Promise => { */ const info = await response.json() as GetGeniusLyric; const url = info - .response - .sections - .find((section) => section.type === 'song')?.hits[0].result.url; + ?.response + ?.sections + ?.find((section) => section.type === 'song')?.hits[0]?.result?.url; if (url) { return await getLyrics(url); From c6ee222e4346f693bebac5bc5b92550f31657882 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Tue, 12 Sep 2023 10:52:01 +0900 Subject: [PATCH 44/70] chore(deps): bump deps --- package-lock.json | 136 +++++++++++++++++++++++----------------------- package.json | 8 +-- 2 files changed, 72 insertions(+), 72 deletions(-) diff --git a/package-lock.json b/package-lock.json index 17df5aba..c021b329 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,7 @@ "node-id3": "0.2.6", "simple-youtube-age-restriction-bypass": "git+https://github.com/MiepHD/Simple-YouTube-Age-Restriction-Bypass.git#v2.5.5", "vudio": "2.1.1", - "youtubei.js": "6.1.0", + "youtubei.js": "6.4.0", "ytpl": "2.3.0" }, "devDependencies": { @@ -47,11 +47,11 @@ "@types/html-to-text": "^9.0.1", "@types/md5": "^2.3.2", "@types/youtube-player": "^5.5.7", - "@typescript-eslint/eslint-plugin": "6.6.0", + "@typescript-eslint/eslint-plugin": "6.7.0", "auto-changelog": "2.4.0", "copyfiles": "2.4.1", "del-cli": "5.1.0", - "electron": "27.0.0-alpha.6", + "electron": "27.0.0-beta.1", "electron-builder": "24.6.4", "electron-devtools-installer": "3.2.0", "eslint": "8.49.0", @@ -1311,16 +1311,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.6.0.tgz", - "integrity": "sha512-CW9YDGTQnNYMIo5lMeuiIG08p4E0cXrXTbcZ2saT/ETE7dWUrNxlijsQeU04qAAKkILiLzdQz+cGFxCJjaZUmA==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.0.tgz", + "integrity": "sha512-gUqtknHm0TDs1LhY12K2NA3Rmlmp88jK9Tx8vGZMfHeNMLE3GH2e9TRub+y+SOjuYgtOmok+wt1AyDPZqxbNag==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.6.0", - "@typescript-eslint/type-utils": "6.6.0", - "@typescript-eslint/utils": "6.6.0", - "@typescript-eslint/visitor-keys": "6.6.0", + "@typescript-eslint/scope-manager": "6.7.0", + "@typescript-eslint/type-utils": "6.7.0", + "@typescript-eslint/utils": "6.7.0", + "@typescript-eslint/visitor-keys": "6.7.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1346,13 +1346,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.6.0.tgz", - "integrity": "sha512-pT08u5W/GT4KjPUmEtc2kSYvrH8x89cVzkA0Sy2aaOUIw6YxOIjA8ilwLr/1fLjOedX1QAuBpG9XggWqIIfERw==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.0.tgz", + "integrity": "sha512-lAT1Uau20lQyjoLUQ5FUMSX/dS07qux9rYd5FGzKz/Kf8W8ccuvMyldb8hadHdK/qOI7aikvQWqulnEq2nCEYA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.6.0", - "@typescript-eslint/visitor-keys": "6.6.0" + "@typescript-eslint/types": "6.7.0", + "@typescript-eslint/visitor-keys": "6.7.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1363,9 +1363,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.6.0.tgz", - "integrity": "sha512-CB6QpJQ6BAHlJXdwUmiaXDBmTqIE2bzGTDLADgvqtHWuhfNP3rAOK7kAgRMAET5rDRr9Utt+qAzRBdu3AhR3sg==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.0.tgz", + "integrity": "sha512-ihPfvOp7pOcN/ysoj0RpBPOx3HQTJTrIN8UZK+WFd3/iDeFHHqeyYxa4hQk4rMhsz9H9mXpR61IzwlBVGXtl9Q==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1376,12 +1376,12 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.6.0.tgz", - "integrity": "sha512-L61uJT26cMOfFQ+lMZKoJNbAEckLe539VhTxiGHrWl5XSKQgA0RTBZJW2HFPy5T0ZvPVSD93QsrTKDkfNwJGyQ==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.0.tgz", + "integrity": "sha512-/C1RVgKFDmGMcVGeD8HjKv2bd72oI1KxQDeY8uc66gw9R0OK0eMq48cA+jv9/2Ag6cdrsUGySm1yzYmfz0hxwQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.6.0", + "@typescript-eslint/types": "6.7.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1440,13 +1440,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.6.0.tgz", - "integrity": "sha512-8m16fwAcEnQc69IpeDyokNO+D5spo0w1jepWWY2Q6y5ZKNuj5EhVQXjtVAeDDqvW6Yg7dhclbsz6rTtOvcwpHg==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.0.tgz", + "integrity": "sha512-f/QabJgDAlpSz3qduCyQT0Fw7hHpmhOzY/Rv6zO3yO+HVIdPfIWhrQoAyG+uZVtWAIS85zAyzgAFfyEr+MgBpg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.6.0", - "@typescript-eslint/utils": "6.6.0", + "@typescript-eslint/typescript-estree": "6.7.0", + "@typescript-eslint/utils": "6.7.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1467,9 +1467,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.6.0.tgz", - "integrity": "sha512-CB6QpJQ6BAHlJXdwUmiaXDBmTqIE2bzGTDLADgvqtHWuhfNP3rAOK7kAgRMAET5rDRr9Utt+qAzRBdu3AhR3sg==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.0.tgz", + "integrity": "sha512-ihPfvOp7pOcN/ysoj0RpBPOx3HQTJTrIN8UZK+WFd3/iDeFHHqeyYxa4hQk4rMhsz9H9mXpR61IzwlBVGXtl9Q==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1480,13 +1480,13 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.6.0.tgz", - "integrity": "sha512-hMcTQ6Al8MP2E6JKBAaSxSVw5bDhdmbCEhGW/V8QXkb9oNsFkA4SBuOMYVPxD3jbtQ4R/vSODBsr76R6fP3tbA==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.0.tgz", + "integrity": "sha512-dPvkXj3n6e9yd/0LfojNU8VMUGHWiLuBZvbM6V6QYD+2qxqInE7J+J/ieY2iGwR9ivf/R/haWGkIj04WVUeiSQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.6.0", - "@typescript-eslint/visitor-keys": "6.6.0", + "@typescript-eslint/types": "6.7.0", + "@typescript-eslint/visitor-keys": "6.7.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1507,12 +1507,12 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.6.0.tgz", - "integrity": "sha512-L61uJT26cMOfFQ+lMZKoJNbAEckLe539VhTxiGHrWl5XSKQgA0RTBZJW2HFPy5T0ZvPVSD93QsrTKDkfNwJGyQ==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.0.tgz", + "integrity": "sha512-/C1RVgKFDmGMcVGeD8HjKv2bd72oI1KxQDeY8uc66gw9R0OK0eMq48cA+jv9/2Ag6cdrsUGySm1yzYmfz0hxwQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.6.0", + "@typescript-eslint/types": "6.7.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1626,17 +1626,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.6.0.tgz", - "integrity": "sha512-mPHFoNa2bPIWWglWYdR0QfY9GN0CfvvXX1Sv6DlSTive3jlMTUy+an67//Gysc+0Me9pjitrq0LJp0nGtLgftw==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.0.tgz", + "integrity": "sha512-MfCq3cM0vh2slSikQYqK2Gq52gvOhe57vD2RM3V4gQRZYX4rDPnKLu5p6cm89+LJiGlwEXU8hkYxhqqEC/V3qA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.6.0", - "@typescript-eslint/types": "6.6.0", - "@typescript-eslint/typescript-estree": "6.6.0", + "@typescript-eslint/scope-manager": "6.7.0", + "@typescript-eslint/types": "6.7.0", + "@typescript-eslint/typescript-estree": "6.7.0", "semver": "^7.5.4" }, "engines": { @@ -1651,13 +1651,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.6.0.tgz", - "integrity": "sha512-pT08u5W/GT4KjPUmEtc2kSYvrH8x89cVzkA0Sy2aaOUIw6YxOIjA8ilwLr/1fLjOedX1QAuBpG9XggWqIIfERw==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.0.tgz", + "integrity": "sha512-lAT1Uau20lQyjoLUQ5FUMSX/dS07qux9rYd5FGzKz/Kf8W8ccuvMyldb8hadHdK/qOI7aikvQWqulnEq2nCEYA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.6.0", - "@typescript-eslint/visitor-keys": "6.6.0" + "@typescript-eslint/types": "6.7.0", + "@typescript-eslint/visitor-keys": "6.7.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1668,9 +1668,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.6.0.tgz", - "integrity": "sha512-CB6QpJQ6BAHlJXdwUmiaXDBmTqIE2bzGTDLADgvqtHWuhfNP3rAOK7kAgRMAET5rDRr9Utt+qAzRBdu3AhR3sg==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.0.tgz", + "integrity": "sha512-ihPfvOp7pOcN/ysoj0RpBPOx3HQTJTrIN8UZK+WFd3/iDeFHHqeyYxa4hQk4rMhsz9H9mXpR61IzwlBVGXtl9Q==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1681,13 +1681,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.6.0.tgz", - "integrity": "sha512-hMcTQ6Al8MP2E6JKBAaSxSVw5bDhdmbCEhGW/V8QXkb9oNsFkA4SBuOMYVPxD3jbtQ4R/vSODBsr76R6fP3tbA==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.0.tgz", + "integrity": "sha512-dPvkXj3n6e9yd/0LfojNU8VMUGHWiLuBZvbM6V6QYD+2qxqInE7J+J/ieY2iGwR9ivf/R/haWGkIj04WVUeiSQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.6.0", - "@typescript-eslint/visitor-keys": "6.6.0", + "@typescript-eslint/types": "6.7.0", + "@typescript-eslint/visitor-keys": "6.7.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1708,12 +1708,12 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.6.0.tgz", - "integrity": "sha512-L61uJT26cMOfFQ+lMZKoJNbAEckLe539VhTxiGHrWl5XSKQgA0RTBZJW2HFPy5T0ZvPVSD93QsrTKDkfNwJGyQ==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.0.tgz", + "integrity": "sha512-/C1RVgKFDmGMcVGeD8HjKv2bd72oI1KxQDeY8uc66gw9R0OK0eMq48cA+jv9/2Ag6cdrsUGySm1yzYmfz0hxwQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.6.0", + "@typescript-eslint/types": "6.7.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -3678,9 +3678,9 @@ } }, "node_modules/electron": { - "version": "27.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/electron/-/electron-27.0.0-alpha.6.tgz", - "integrity": "sha512-JV7j6Z+N0OOWe8Ipg4gyDWLXz4Gg7LDMh5WWyl2eQnEN6RpQyjZ4x09r8urw+VSynEhD9kric2d9EZdtOgtfFw==", + "version": "27.0.0-beta.1", + "resolved": "https://registry.npmjs.org/electron/-/electron-27.0.0-beta.1.tgz", + "integrity": "sha512-B1Ua7Vrm2wXZqImxQhlY+2//Oi4XUYcluAf4hPVmfgx2E2d+iBv+AXCit+zoGRg/Aau5JTpFIIVZGTLiqu6FTw==", "hasInstallScript": true, "dependencies": { "@electron/get": "^2.0.0", @@ -9488,9 +9488,9 @@ } }, "node_modules/youtubei.js": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/youtubei.js/-/youtubei.js-6.1.0.tgz", - "integrity": "sha512-EJmPuQ1pLimrcp5nPDSeZHVthT7KJLxp9Z5sYmihXKn1ct8e7cntKaFnPvy5QsbjpipICpDpQEs+d+owDhjgIg==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/youtubei.js/-/youtubei.js-6.4.0.tgz", + "integrity": "sha512-c3Hj+9JmMchVWusVOubHDNrvKybzai1vWzZsVIZ9oxt74W0zaP78S0pPW21i/RnVBx29rAA2+ojs56b/REP/1A==", "funding": [ "https://github.com/sponsors/LuanRT" ], diff --git a/package.json b/package.json index 9bbdeb9c..42547fd2 100644 --- a/package.json +++ b/package.json @@ -158,14 +158,14 @@ "node-id3": "0.2.6", "simple-youtube-age-restriction-bypass": "git+https://github.com/MiepHD/Simple-YouTube-Age-Restriction-Bypass.git#v2.5.5", "vudio": "2.1.1", - "youtubei.js": "6.1.0", + "youtubei.js": "6.4.0", "ytpl": "2.3.0" }, "overrides": { "xml2js": "0.6.2", "node-fetch": "2.7.0", "@electron/universal": "1.4.2", - "electron": "27.0.0-alpha.6" + "electron": "27.0.0-beta.1" }, "devDependencies": { "@playwright/test": "1.37.1", @@ -175,11 +175,11 @@ "@types/html-to-text": "^9.0.1", "@types/md5": "^2.3.2", "@types/youtube-player": "^5.5.7", - "@typescript-eslint/eslint-plugin": "6.6.0", + "@typescript-eslint/eslint-plugin": "6.7.0", "auto-changelog": "2.4.0", "copyfiles": "2.4.1", "del-cli": "5.1.0", - "electron": "27.0.0-alpha.6", + "electron": "27.0.0-beta.1", "electron-builder": "24.6.4", "electron-devtools-installer": "3.2.0", "eslint": "8.49.0", From f2b532d8fa9bb27df378af01901acfe016bbab2d Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Wed, 13 Sep 2023 17:45:42 +0900 Subject: [PATCH 45/70] chore(deps): bump electron version --- package-lock.json | 8 ++++---- package.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index c021b329..ebe45a2b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -51,7 +51,7 @@ "auto-changelog": "2.4.0", "copyfiles": "2.4.1", "del-cli": "5.1.0", - "electron": "27.0.0-beta.1", + "electron": "27.0.0-beta.2", "electron-builder": "24.6.4", "electron-devtools-installer": "3.2.0", "eslint": "8.49.0", @@ -3678,9 +3678,9 @@ } }, "node_modules/electron": { - "version": "27.0.0-beta.1", - "resolved": "https://registry.npmjs.org/electron/-/electron-27.0.0-beta.1.tgz", - "integrity": "sha512-B1Ua7Vrm2wXZqImxQhlY+2//Oi4XUYcluAf4hPVmfgx2E2d+iBv+AXCit+zoGRg/Aau5JTpFIIVZGTLiqu6FTw==", + "version": "27.0.0-beta.2", + "resolved": "https://registry.npmjs.org/electron/-/electron-27.0.0-beta.2.tgz", + "integrity": "sha512-rY4NzohK99X34CR0S40YpP0R30cVnyib/K5IN4/n52fUFn1BuMsPpZx5hxMqthHe1+7POOgb8qF7gUzoYz2+pQ==", "hasInstallScript": true, "dependencies": { "@electron/get": "^2.0.0", diff --git a/package.json b/package.json index 42547fd2..1de00ef6 100644 --- a/package.json +++ b/package.json @@ -165,7 +165,7 @@ "xml2js": "0.6.2", "node-fetch": "2.7.0", "@electron/universal": "1.4.2", - "electron": "27.0.0-beta.1" + "electron": "27.0.0-beta.2" }, "devDependencies": { "@playwright/test": "1.37.1", @@ -179,7 +179,7 @@ "auto-changelog": "2.4.0", "copyfiles": "2.4.1", "del-cli": "5.1.0", - "electron": "27.0.0-beta.1", + "electron": "27.0.0-beta.2", "electron-builder": "24.6.4", "electron-devtools-installer": "3.2.0", "eslint": "8.49.0", From ad8b9c9bf7d11073c7fdcc1056f6e72ff83adbfa Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Wed, 13 Sep 2023 21:54:45 +0900 Subject: [PATCH 46/70] fix: resolves #958 --- config/defaults.ts | 2 +- package-lock.json | 31 ++++++++++++------------------- package.json | 4 ++-- plugins/downloader/back.ts | 35 +++++++++++++++++++++++++---------- 4 files changed, 40 insertions(+), 32 deletions(-) diff --git a/config/defaults.ts b/config/defaults.ts index 42bc976a..8aeb13cb 100644 --- a/config/defaults.ts +++ b/config/defaults.ts @@ -96,7 +96,7 @@ const defaultConfig = { }, 'downloader': { enabled: false, - ffmpegArgs: [], // E.g. ["-b:a", "192k"] for an audio bitrate of 192kb/s + ffmpegArgs: ['-b:a', '256k'], // E.g. ["-b:a", "192k"] for an audio bitrate of 192kb/s downloadFolder: undefined as string | undefined, // Custom download folder (absolute path) preset: 'mp3', skipExisting: false, diff --git a/package-lock.json b/package-lock.json index ebe45a2b..8b7d8617 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,8 +11,8 @@ "license": "MIT", "dependencies": { "@cliqz/adblocker-electron": "1.26.6", - "@ffmpeg/core": "0.11.0", - "@ffmpeg/ffmpeg": "0.11.6", + "@ffmpeg.wasm/core-mt": "0.12.0", + "@ffmpeg.wasm/main": "0.12.0", "@foobar404/wave": "2.0.4", "@xhayper/discord-rpc": "1.0.22", "async-mutex": "0.4.0", @@ -671,20 +671,19 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@ffmpeg/core": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@ffmpeg/core/-/core-0.11.0.tgz", - "integrity": "sha512-9Tt/+2PMpkGPXUK8n6He9G8Y+qR6qmCPSCw9iEKZxHHOvJ9BE/r0Fccj+YgDZTlyu6rXxc9x6EqCaFBIt7qzjA==" + "node_modules/@ffmpeg.wasm/core-mt": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@ffmpeg.wasm/core-mt/-/core-mt-0.12.0.tgz", + "integrity": "sha512-M9pjL7JQX4AYl3WI8vGcPGPTz/O7JmhW8ac/fHA3oXTxoRAPwYSY/OsY1N9C0XahIM0+fxa1QSLN9Ekz8sBM/Q==" }, - "node_modules/@ffmpeg/ffmpeg": { - "version": "0.11.6", - "resolved": "https://registry.npmjs.org/@ffmpeg/ffmpeg/-/ffmpeg-0.11.6.tgz", - "integrity": "sha512-uN8J8KDjADEavPhNva6tYO9Fj0lWs9z82swF3YXnTxWMBoFLGq3LZ6FLlIldRKEzhOBKnkVfA8UnFJuvGvNxcA==", + "node_modules/@ffmpeg.wasm/main": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@ffmpeg.wasm/main/-/main-0.12.0.tgz", + "integrity": "sha512-LILAKTrU3Rga2iXLsF9jeFxe2hNQFjWlrKuXPWSdCFeQ7Kg69fO4WwjNJ0CzjOyO6qtndRQMNKqf//N4fLYUBA==", "dependencies": { "is-url": "^1.2.4", - "node-fetch": "^2.6.1", - "regenerator-runtime": "^0.13.7", - "resolve-url": "^0.2.1" + "node-fetch": "^2.6.9", + "regenerator-runtime": "^0.13.11" }, "engines": { "node": ">=12.16.1" @@ -7860,12 +7859,6 @@ "node": ">=4" } }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "deprecated": "https://github.com/lydell/resolve-url#deprecated" - }, "node_modules/responselike": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", diff --git a/package.json b/package.json index 1de00ef6..a3cb0fc5 100644 --- a/package.json +++ b/package.json @@ -133,8 +133,8 @@ }, "dependencies": { "@cliqz/adblocker-electron": "1.26.6", - "@ffmpeg/core": "0.11.0", - "@ffmpeg/ffmpeg": "0.11.6", + "@ffmpeg.wasm/core-mt": "0.12.0", + "@ffmpeg.wasm/main": "0.12.0", "@foobar404/wave": "2.0.4", "@xhayper/discord-rpc": "1.0.22", "async-mutex": "0.4.0", diff --git a/plugins/downloader/back.ts b/plugins/downloader/back.ts index 706e8430..83f27b8a 100644 --- a/plugins/downloader/back.ts +++ b/plugins/downloader/back.ts @@ -9,7 +9,7 @@ import ytpl from 'ytpl'; // REPLACE with youtubei getplaylist https://github.com/LuanRT/YouTube.js#getplaylistid import filenamify from 'filenamify'; import { Mutex } from 'async-mutex'; -import { createFFmpeg } from '@ffmpeg/ffmpeg'; +import { createFFmpeg } from '@ffmpeg.wasm/main'; import NodeID3, { TagConstants } from 'node-id3'; @@ -208,7 +208,9 @@ async function downloadSongUnsafe( mkdirSync(dir); } - if (presetSetting) { + const ffmpegArgs = config.get('ffmpegArgs'); + + if (presetSetting && presetSetting?.extension !== 'mp3') { const file = createWriteStream(filePath); let downloaded = 0; const total: number = format.content_length ?? 1; @@ -226,12 +228,14 @@ async function downloadSongUnsafe( filePath, metadata, presetSetting.ffmpegArgs, + ffmpegArgs, ); sendFeedback(null, -1); } else { const fileBuffer = await iterableStreamToMP3( iterableStream, metadata, + ffmpegArgs, format.content_length ?? 0, sendFeedback, increasePlaylistProgress, @@ -251,6 +255,7 @@ async function downloadSongUnsafe( async function iterableStreamToMP3( stream: AsyncGenerator, metadata: CustomSongInfo, + ffmpegArgs: string[], contentLength: number, sendFeedback: (str: string, value?: number) => void, increasePlaylistProgress: (value: number) => void = () => { @@ -290,16 +295,25 @@ async function iterableStreamToMP3( increasePlaylistProgress(0.15 + (ratio * 0.85)); }); - await ffmpeg.run( - '-i', - safeVideoName, - ...getFFmpegMetadataArgs(metadata), - `${safeVideoName}.mp3`, - ); + try { + await ffmpeg.run( + '-i', + safeVideoName, + ...ffmpegArgs, + ...getFFmpegMetadataArgs(metadata), + `${safeVideoName}.mp3`, + ); + } finally { + ffmpeg.FS('unlink', safeVideoName); + } sendFeedback('Saving…'); - return ffmpeg.FS('readFile', `${safeVideoName}.mp3`); + try { + return ffmpeg.FS('readFile', `${safeVideoName}.mp3`); + } finally { + ffmpeg.FS('unlink', `${safeVideoName}.mp3`); + } } catch (error: unknown) { sendError(error as Error, safeVideoName); } finally { @@ -475,7 +489,7 @@ export async function downloadPlaylist(givenUrl?: string | URL) { } } -async function ffmpegWriteTags(filePath: string, metadata: CustomSongInfo, ffmpegArgs: string[] = []) { +async function ffmpegWriteTags(filePath: string, metadata: CustomSongInfo, presetFFmpegArgs: string[] = [], ffmpegArgs: string[] = []) { const releaseFFmpegMutex = await ffmpegMutex.acquire(); try { @@ -487,6 +501,7 @@ async function ffmpegWriteTags(filePath: string, metadata: CustomSongInfo, ffmpe '-i', filePath, ...getFFmpegMetadataArgs(metadata), + ...presetFFmpegArgs, ...ffmpegArgs, filePath, ); From 7d355ea1f29f188913e48f8ab210a2409a2b3641 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Wed, 13 Sep 2023 22:52:06 +0900 Subject: [PATCH 47/70] fix: resolves #978 --- package.json | 2 -- plugins/last-fm/back.ts | 10 ++++------ 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index a3cb0fc5..3ca92f5e 100644 --- a/package.json +++ b/package.json @@ -153,7 +153,6 @@ "html-to-text": "9.0.5", "keyboardevent-from-electron-accelerator": "2.0.0", "keyboardevents-areequal": "0.2.2", - "md5": "2.3.0", "mpris-service": "2.1.2", "node-id3": "0.2.6", "simple-youtube-age-restriction-bypass": "git+https://github.com/MiepHD/Simple-YouTube-Age-Restriction-Bypass.git#v2.5.5", @@ -173,7 +172,6 @@ "@types/electron-localshortcut": "^3.1.0", "@types/howler": "^2.2.8", "@types/html-to-text": "^9.0.1", - "@types/md5": "^2.3.2", "@types/youtube-player": "^5.5.7", "@typescript-eslint/eslint-plugin": "6.7.0", "auto-changelog": "2.4.0", diff --git a/plugins/last-fm/back.ts b/plugins/last-fm/back.ts index a307b87c..e5826356 100644 --- a/plugins/last-fm/back.ts +++ b/plugins/last-fm/back.ts @@ -1,5 +1,6 @@ +import crypto from 'node:crypto'; + import { BrowserWindow, net, shell } from 'electron'; -import md5 from 'md5'; import { setOptions } from '../../config/plugins'; import registerCallback, { SongInfo } from '../../providers/song-info'; @@ -37,10 +38,7 @@ const createQueryString = (parameters: Record, apiSignature: st const createApiSig = (parameters: Record, secret: string) => { // This function creates the api signature, see: https://www.last.fm/api/authspec - const keys = []; - for (const key in parameters) { - keys.push(key); - } + const keys = Object.keys(parameters); keys.sort(); let sig = ''; @@ -53,7 +51,7 @@ const createApiSig = (parameters: Record, secret: string) => { } sig += secret; - sig = md5(sig); + sig = crypto.createHash('md5').update(sig, 'utf-8').digest('hex'); return sig; }; From 5237311f1fcfa4674543cda4a77b3685c72a71da Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Sun, 17 Sep 2023 21:53:13 +0900 Subject: [PATCH 48/70] chore(deps): bump deps --- package-lock.json | 103 ++++++++++++++-------------------------------- package.json | 18 ++++---- 2 files changed, 40 insertions(+), 81 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8b7d8617..ebc9da75 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,7 +31,6 @@ "html-to-text": "9.0.5", "keyboardevent-from-electron-accelerator": "2.0.0", "keyboardevents-areequal": "0.2.2", - "md5": "2.3.0", "mpris-service": "2.1.2", "node-id3": "0.2.6", "simple-youtube-age-restriction-bypass": "git+https://github.com/MiepHD/Simple-YouTube-Age-Restriction-Bypass.git#v2.5.5", @@ -40,26 +39,25 @@ "ytpl": "2.3.0" }, "devDependencies": { - "@playwright/test": "1.37.1", + "@playwright/test": "1.38.0", "@total-typescript/ts-reset": "0.5.1", - "@types/electron-localshortcut": "^3.1.0", - "@types/howler": "^2.2.8", - "@types/html-to-text": "^9.0.1", - "@types/md5": "^2.3.2", - "@types/youtube-player": "^5.5.7", + "@types/electron-localshortcut": "3.1.0", + "@types/howler": "2.2.9", + "@types/html-to-text": "9.0.2", + "@types/youtube-player": "5.5.7", "@typescript-eslint/eslint-plugin": "6.7.0", "auto-changelog": "2.4.0", "copyfiles": "2.4.1", "del-cli": "5.1.0", - "electron": "27.0.0-beta.2", + "electron": "27.0.0-beta.3", "electron-builder": "24.6.4", "electron-devtools-installer": "3.2.0", "eslint": "8.49.0", "eslint-plugin-import": "2.28.1", "eslint-plugin-prettier": "5.0.0", "node-gyp": "9.4.0", - "patch-package": "^8.0.0", - "playwright": "1.37.1", + "patch-package": "8.0.0", + "playwright": "1.38.0", "typescript": "5.2.2" }, "engines": { @@ -1022,22 +1020,18 @@ } }, "node_modules/@playwright/test": { - "version": "1.37.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.37.1.tgz", - "integrity": "sha512-bq9zTli3vWJo8S3LwB91U0qDNQDpEXnw7knhxLM0nwDvexQAwx9tO8iKDZSqqneVq+URd/WIoz+BALMqUTgdSg==", + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.38.0.tgz", + "integrity": "sha512-xis/RXXsLxwThKnlIXouxmIvvT3zvQj1JE39GsNieMUrMpb3/GySHDh2j8itCG22qKVD4MYLBp7xB73cUW/UUw==", "dev": true, "dependencies": { - "@types/node": "*", - "playwright-core": "1.37.1" + "playwright": "1.38.0" }, "bin": { "playwright": "cli.js" }, "engines": { "node": ">=16" - }, - "optionalDependencies": { - "fsevents": "2.3.2" } }, "node_modules/@remusao/guess-url-type": { @@ -1197,15 +1191,15 @@ "integrity": "sha512-P20p/YBrqUBmzD6KhIQ8EiY4/RRzlekL4eCvfQnulFPfjmiGxKIoyCeI7qam5I7oKH3P8EU4ptEi0EfyGoLysw==" }, "node_modules/@types/howler": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/@types/howler/-/howler-2.2.8.tgz", - "integrity": "sha512-7OK+cGHTWIDCOvBlEc61Lzj2tJhCpmeqiqdeNbZvTxLHluBMF6xz/2wjoQkK1M8mJIStp40OdPnkp8xIvwwsuw==", + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/@types/howler/-/howler-2.2.9.tgz", + "integrity": "sha512-kNi8mBM+IAmMzo1xhFlR8pKUWqCz9kEtiT1Xp5hZW0ynQl2wUg0EAm+brsHvhahMzxlADt0Xhu0jV/NHmk/Ibg==", "dev": true }, "node_modules/@types/html-to-text": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@types/html-to-text/-/html-to-text-9.0.1.tgz", - "integrity": "sha512-sHu702QGb0SP2F0Zt+CxdCmGZIZ0gEaaCjqOh/V4iba1wTxPVntEPOM/vHm5bel08TILhB3+OxUTkDJWnr/zHQ==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@types/html-to-text/-/html-to-text-9.0.2.tgz", + "integrity": "sha512-cO9qsPwfIJ2GKFJ4AgpgmmFoUr0IulsN1clwOiPdChpsY/LVmbpGenUGrvZiYsSXSg/dWsj4NTzWZeIlv3D22w==", "dev": true }, "node_modules/@types/http-cache-semantics": { @@ -1233,12 +1227,6 @@ "@types/node": "*" } }, - "node_modules/@types/md5": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@types/md5/-/md5-2.3.2.tgz", - "integrity": "sha512-v+JFDu96+UYJ3/UWzB0mEglIS//MZXgRaJ4ubUPwOM0gvLc/kcQ3TWNYwENEK7/EcXGQVrW8h/XqednSjBd/Og==", - "dev": true - }, "node_modules/@types/minimist": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", @@ -2798,14 +2786,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", - "engines": { - "node": "*" - } - }, "node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -3120,14 +3100,6 @@ "node": ">= 8" } }, - "node_modules/crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", - "engines": { - "node": "*" - } - }, "node_modules/custom-electron-prompt": { "version": "1.5.7", "resolved": "https://registry.npmjs.org/custom-electron-prompt/-/custom-electron-prompt-1.5.7.tgz", @@ -3677,9 +3649,9 @@ } }, "node_modules/electron": { - "version": "27.0.0-beta.2", - "resolved": "https://registry.npmjs.org/electron/-/electron-27.0.0-beta.2.tgz", - "integrity": "sha512-rY4NzohK99X34CR0S40YpP0R30cVnyib/K5IN4/n52fUFn1BuMsPpZx5hxMqthHe1+7POOgb8qF7gUzoYz2+pQ==", + "version": "27.0.0-beta.3", + "resolved": "https://registry.npmjs.org/electron/-/electron-27.0.0-beta.3.tgz", + "integrity": "sha512-nOj4bXseVhAvcDRb2ocN9AeMfbo6Z4XhYwYPytlHX637yQJC4MKhUSXZEHjTZTzBh8/KmPG8P+wplF0wBMzouw==", "hasInstallScript": true, "dependencies": { "@electron/get": "^2.0.0", @@ -5627,11 +5599,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -6400,16 +6367,6 @@ "node": ">=10" } }, - "node_modules/md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "dependencies": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } - }, "node_modules/meow": { "version": "10.1.5", "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", @@ -7526,25 +7483,27 @@ } }, "node_modules/playwright": { - "version": "1.37.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.37.1.tgz", - "integrity": "sha512-bgUXRrQKhT48zHdxDYQTpf//0xDfDd5hLeEhjuSw8rXEGoT9YeElpfvs/izonTNY21IQZ7d3s22jLxYaAnubbQ==", + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.38.0.tgz", + "integrity": "sha512-fJGw+HO0YY+fU/F1N57DMO+TmXHTrmr905J05zwAQE9xkuwP/QLDk63rVhmyxh03dYnEhnRbsdbH9B0UVVRB3A==", "dev": true, - "hasInstallScript": true, "dependencies": { - "playwright-core": "1.37.1" + "playwright-core": "1.38.0" }, "bin": { "playwright": "cli.js" }, "engines": { "node": ">=16" + }, + "optionalDependencies": { + "fsevents": "2.3.2" } }, "node_modules/playwright-core": { - "version": "1.37.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.37.1.tgz", - "integrity": "sha512-17EuQxlSIYCmEMwzMqusJ2ztDgJePjrbttaefgdsiqeLWidjYz9BxXaTaZWxH1J95SHGk6tjE+dwgWILJoUZfA==", + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.38.0.tgz", + "integrity": "sha512-f8z1y8J9zvmHoEhKgspmCvOExF2XdcxMW8jNRuX4vkQFrzV4MlZ55iwb5QeyiFQgOFCUolXiRHgpjSEnqvO48g==", "dev": true, "bin": { "playwright-core": "cli.js" diff --git a/package.json b/package.json index 3ca92f5e..5ffb3101 100644 --- a/package.json +++ b/package.json @@ -164,28 +164,28 @@ "xml2js": "0.6.2", "node-fetch": "2.7.0", "@electron/universal": "1.4.2", - "electron": "27.0.0-beta.2" + "electron": "27.0.0-beta.3" }, "devDependencies": { - "@playwright/test": "1.37.1", + "@playwright/test": "1.38.0", "@total-typescript/ts-reset": "0.5.1", - "@types/electron-localshortcut": "^3.1.0", - "@types/howler": "^2.2.8", - "@types/html-to-text": "^9.0.1", - "@types/youtube-player": "^5.5.7", + "@types/electron-localshortcut": "3.1.0", + "@types/howler": "2.2.9", + "@types/html-to-text": "9.0.2", + "@types/youtube-player": "5.5.7", "@typescript-eslint/eslint-plugin": "6.7.0", "auto-changelog": "2.4.0", "copyfiles": "2.4.1", "del-cli": "5.1.0", - "electron": "27.0.0-beta.2", + "electron": "27.0.0-beta.3", "electron-builder": "24.6.4", "electron-devtools-installer": "3.2.0", "eslint": "8.49.0", "eslint-plugin-import": "2.28.1", "eslint-plugin-prettier": "5.0.0", "node-gyp": "9.4.0", - "patch-package": "^8.0.0", - "playwright": "1.37.1", + "patch-package": "8.0.0", + "playwright": "1.38.0", "typescript": "5.2.2" }, "auto-changelog": { From 0c06d59a474e363779bcb17a2aecdb831100de5a Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Mon, 18 Sep 2023 01:49:57 +0900 Subject: [PATCH 49/70] fix: fix #1187 --- package-lock.json | 82 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/package-lock.json b/package-lock.json index ebc9da75..91f5ab58 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { - "@cliqz/adblocker-electron": "1.26.6", + "@cliqz/adblocker-electron": "1.26.7--canary.50688cf.0", "@ffmpeg.wasm/core-mt": "0.12.0", "@ffmpeg.wasm/main": "0.12.0", "@foobar404/wave": "2.0.4", @@ -252,56 +252,56 @@ } }, "node_modules/@cliqz/adblocker": { - "version": "1.26.6", - "resolved": "https://registry.npmjs.org/@cliqz/adblocker/-/adblocker-1.26.6.tgz", - "integrity": "sha512-fSNCvyl0FRgKcc2NmHEhaQqeTT0QCLBT3eVZ15ah6baPdCaQm7N5IN/annv9bRalS8Lwbxymb3TBLzXpFTghrw==", + "version": "1.26.7--canary.50688cf.0", + "resolved": "https://registry.npmjs.org/@cliqz/adblocker/-/adblocker-1.26.7--canary.50688cf.0.tgz", + "integrity": "sha512-OTOqCU9HN7RR+icQbF3NwQzg1Yylz4pFsBPIx85a8z6Y+YrvChM1OOowdIWMD1MgEwfH+FgG//wYcF405myQng==", "dependencies": { - "@cliqz/adblocker-content": "^1.26.6", - "@cliqz/adblocker-extended-selectors": "^1.26.6", + "@cliqz/adblocker-content": "1.26.7--canary.50688cf.0", + "@cliqz/adblocker-extended-selectors": "1.26.7--canary.50688cf.0", "@remusao/guess-url-type": "^1.1.2", "@remusao/small": "^1.1.2", "@remusao/smaz": "^1.7.1", - "@types/chrome": "^0.0.228", - "@types/firefox-webext-browser": "^111.0.0", - "tldts-experimental": "^6.0.1" + "@types/chrome": "^0.0.246", + "@types/firefox-webext-browser": "^111.0.1", + "tldts-experimental": "^6.0.12" } }, "node_modules/@cliqz/adblocker-content": { - "version": "1.26.6", - "resolved": "https://registry.npmjs.org/@cliqz/adblocker-content/-/adblocker-content-1.26.6.tgz", - "integrity": "sha512-cebc5AjL/quVVdcClJ7dqqvW5SrqATfUhwqn5MzWtponZ3t3fRpgpFgkt2fNa5rd3iz1UfTcAtWrgpshHYurTA==", + "version": "1.26.7--canary.50688cf.0", + "resolved": "https://registry.npmjs.org/@cliqz/adblocker-content/-/adblocker-content-1.26.7--canary.50688cf.0.tgz", + "integrity": "sha512-pDX4woRHzXiF8qlWU98V2W3W/dpwq1lr+6rnIEe91XOZs4ktQUP/A2Pa9t3qnO98ebgF6JZhaBTz+rgnG2Yvug==", "dependencies": { - "@cliqz/adblocker-extended-selectors": "^1.26.6" + "@cliqz/adblocker-extended-selectors": "1.26.7--canary.50688cf.0" } }, "node_modules/@cliqz/adblocker-electron": { - "version": "1.26.6", - "resolved": "https://registry.npmjs.org/@cliqz/adblocker-electron/-/adblocker-electron-1.26.6.tgz", - "integrity": "sha512-OE0Qh2+OGrx53DkV9gj1JzYdUV1IM7JigpU++5sA6yhsdbZBFijto0SK3iDsMsHeEUVq8DV1oLYspe0UpIU4SA==", + "version": "1.26.7--canary.50688cf.0", + "resolved": "https://registry.npmjs.org/@cliqz/adblocker-electron/-/adblocker-electron-1.26.7--canary.50688cf.0.tgz", + "integrity": "sha512-9W/vd99pdchv3WsmkxxU0M/PwYm1sTpgw4jIRw+drWHTbX0eYV6lWPnHAeMaAz5/19KOKBTdUIVLZS4mNSRCqw==", "dependencies": { - "@cliqz/adblocker": "^1.26.6", - "@cliqz/adblocker-electron-preload": "^1.26.6", - "tldts-experimental": "^6.0.1" + "@cliqz/adblocker": "1.26.7--canary.50688cf.0", + "@cliqz/adblocker-electron-preload": "1.26.7--canary.50688cf.0", + "tldts-experimental": "^6.0.12" }, "peerDependencies": { "electron": ">11" } }, "node_modules/@cliqz/adblocker-electron-preload": { - "version": "1.26.6", - "resolved": "https://registry.npmjs.org/@cliqz/adblocker-electron-preload/-/adblocker-electron-preload-1.26.6.tgz", - "integrity": "sha512-G564oo1YANQR7mAzuQi7aYsgKwmRurYo0d9E8YaZr6ZD/kDHKxgHLfGPflKuOsYz2gf9zWQT89RsyQxDrjI49g==", + "version": "1.26.7--canary.50688cf.0", + "resolved": "https://registry.npmjs.org/@cliqz/adblocker-electron-preload/-/adblocker-electron-preload-1.26.7--canary.50688cf.0.tgz", + "integrity": "sha512-ECSJNTNmfZAmYaZ0FaFZvcCFGFMTFjyn3rW450XYdsjD6tnhhPef4N62Je74xbm0I2GK3TPvID4KzH9F0CjOCQ==", "dependencies": { - "@cliqz/adblocker-content": "^1.26.6" + "@cliqz/adblocker-content": "1.26.7--canary.50688cf.0" }, "peerDependencies": { "electron": ">11" } }, "node_modules/@cliqz/adblocker-extended-selectors": { - "version": "1.26.6", - "resolved": "https://registry.npmjs.org/@cliqz/adblocker-extended-selectors/-/adblocker-extended-selectors-1.26.6.tgz", - "integrity": "sha512-Gpvg6eLO2aHiY7r2y0jueve6YbGkYvWaZ4MiwhQ1wPTwj/MxFqAh9cVHnz3EzoJUtsqoy9bvkhmfkRUatpvvzw==" + "version": "1.26.7--canary.50688cf.0", + "resolved": "https://registry.npmjs.org/@cliqz/adblocker-extended-selectors/-/adblocker-extended-selectors-1.26.7--canary.50688cf.0.tgz", + "integrity": "sha512-g++omr1SvhgqRJtUuxUKp8CYPco9iz7Ep3R/RaHoY19c3Q2hwok9WHmiKcg+MwaCKuPE5gXcyUfY21y+VUilsQ==" }, "node_modules/@develar/schema-utils": { "version": "2.6.5", @@ -1132,9 +1132,9 @@ } }, "node_modules/@types/chrome": { - "version": "0.0.228", - "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.228.tgz", - "integrity": "sha512-rDmyVEF+l9H+6FQYqsEGqQOjBw/uaSx6KJ6o47FwbQmPPcskmt8XlPbKjy5KeQXU3ZLiV2x45Fk4kdtRMSghfQ==", + "version": "0.0.246", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.246.tgz", + "integrity": "sha512-MxGxEomGxsJiL9xe/7ZwVgwdn8XVKWbPvxpVQl3nWOjrS0Ce63JsfzxUc4aU3GvRcUPYsfufHmJ17BFyKxeA4g==", "dependencies": { "@types/filesystem": "*", "@types/har-format": "*" @@ -1159,22 +1159,22 @@ } }, "node_modules/@types/filesystem": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.32.tgz", - "integrity": "sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ==", + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.33.tgz", + "integrity": "sha512-2KedRPzwu2K528vFkoXnnWdsG0MtUwPjuA7pRy4vKxlxHEe8qUDZibYHXJKZZr2Cl/ELdCWYqyb/MKwsUuzBWw==", "dependencies": { "@types/filewriter": "*" } }, "node_modules/@types/filewriter": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.29.tgz", - "integrity": "sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ==" + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.30.tgz", + "integrity": "sha512-lB98tui0uxc7erbj0serZfJlHKLNJHwBltPnbmO1WRpL5T325GOHRiQfr2E29V2q+S1brDO63Fpdt6vb3bES9Q==" }, "node_modules/@types/firefox-webext-browser": { - "version": "111.0.1", - "resolved": "https://registry.npmjs.org/@types/firefox-webext-browser/-/firefox-webext-browser-111.0.1.tgz", - "integrity": "sha512-mmHWdQTCT68X0hh0URrsIyWhJeFzZHaiprj6nni/CmsAmqYq27T0eZyu1ePeKJ/zuDD3wqtTzm5TwRFAso+oPw==" + "version": "111.0.2", + "resolved": "https://registry.npmjs.org/@types/firefox-webext-browser/-/firefox-webext-browser-111.0.2.tgz", + "integrity": "sha512-NS7izfYOnQI/Opf3YdZSKkI5Ox89SqEffJHK2zfGY2BYEVuWuM6pSwDRglGl4W0SM84oUQfvLyYH4X6EQZAJ2w==" }, "node_modules/@types/fs-extra": { "version": "9.0.13", @@ -1186,9 +1186,9 @@ } }, "node_modules/@types/har-format": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.12.tgz", - "integrity": "sha512-P20p/YBrqUBmzD6KhIQ8EiY4/RRzlekL4eCvfQnulFPfjmiGxKIoyCeI7qam5I7oKH3P8EU4ptEi0EfyGoLysw==" + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.13.tgz", + "integrity": "sha512-PwBsCBD3lDODn4xpje3Y1di0aDJp4Ww7aSfMRVw6ysnxD4I7Wmq2mBkSKaDtN403hqH5sp6c9xQUvFYY3+lkBg==" }, "node_modules/@types/howler": { "version": "2.2.9", diff --git a/package.json b/package.json index 5ffb3101..da9fabf4 100644 --- a/package.json +++ b/package.json @@ -132,7 +132,7 @@ "node": ">=16.0.0" }, "dependencies": { - "@cliqz/adblocker-electron": "1.26.6", + "@cliqz/adblocker-electron": "1.26.7--canary.50688cf.0", "@ffmpeg.wasm/core-mt": "0.12.0", "@ffmpeg.wasm/main": "0.12.0", "@foobar404/wave": "2.0.4", From fbf92971a50bd998b559e84edf53dcef594ce12b Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Mon, 18 Sep 2023 03:08:15 +0900 Subject: [PATCH 50/70] fix: TrustedHTML warning --- package-lock.json | 7 +++++++ package.json | 3 ++- patches/custom-electron-titlebar+4.1.6.patch | 8 ++++++++ plugins/precise-volume/front.ts | 13 +++++++++---- plugins/utils.ts | 8 +++++++- 5 files changed, 33 insertions(+), 6 deletions(-) create mode 100644 patches/custom-electron-titlebar+4.1.6.patch diff --git a/package-lock.json b/package-lock.json index 91f5ab58..e8e22a1c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,6 +44,7 @@ "@types/electron-localshortcut": "3.1.0", "@types/howler": "2.2.9", "@types/html-to-text": "9.0.2", + "@types/trusted-types": "2.0.4", "@types/youtube-player": "5.5.7", "@typescript-eslint/eslint-plugin": "6.7.0", "auto-changelog": "2.4.0", @@ -1275,6 +1276,12 @@ "integrity": "sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==", "dev": true }, + "node_modules/@types/trusted-types": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.4.tgz", + "integrity": "sha512-IDaobHimLQhjwsQ/NMwRVfa/yL7L/wriQPMhw1ZJall0KX6E1oxk29XMDeilW5qTIg5aoiqf5Udy8U/51aNoQQ==", + "dev": true + }, "node_modules/@types/verror": { "version": "1.10.6", "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.6.tgz", diff --git a/package.json b/package.json index da9fabf4..82bb5b51 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "start": "npm run tsc-and-copy && electron ./dist/index.js", "start:debug": "ELECTRON_ENABLE_LOGGING=1 electron ./dist/index.js", "generate:package": "node utils/generate-package-json.js", - "postinstall": "npm run plugins", + "postinstall": "patch-package && npm run plugins", "clean": "del-cli dist && del-cli pack", "ytm-resource-copy-files": "copyfiles error.html youtube-music.css assets/**/* dist/", "copy-files": "copyfiles -u 1 plugins/**/*.html plugins/**/*.css plugins/**/*.bin plugins/**/*.js dist/plugins/", @@ -172,6 +172,7 @@ "@types/electron-localshortcut": "3.1.0", "@types/howler": "2.2.9", "@types/html-to-text": "9.0.2", + "@types/trusted-types": "2.0.4", "@types/youtube-player": "5.5.7", "@typescript-eslint/eslint-plugin": "6.7.0", "auto-changelog": "2.4.0", diff --git a/patches/custom-electron-titlebar+4.1.6.patch b/patches/custom-electron-titlebar+4.1.6.patch new file mode 100644 index 00000000..c639a434 --- /dev/null +++ b/patches/custom-electron-titlebar+4.1.6.patch @@ -0,0 +1,8 @@ +diff --git a/node_modules/custom-electron-titlebar/dist/index.js b/node_modules/custom-electron-titlebar/dist/index.js +index c00255e..b29bf3b 100644 +--- a/node_modules/custom-electron-titlebar/dist/index.js ++++ b/node_modules/custom-electron-titlebar/dist/index.js +@@ -1 +1 @@ +-!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var i=t();for(var n in i)("object"==typeof exports?exports:e)[n]=i[n]}}(this,(()=>(()=>{"use strict";var e={526:(e,t,i)=>{i.d(t,{Z:()=>a});var n=i(933),s=i.n(n),o=i(476),r=i.n(o)()(s());r.push([e.id,".cet-menubar{display:flex;flex-shrink:1;box-sizing:border-box;height:30px;overflow:hidden;flex-wrap:wrap}.cet-menubar.bottom{order:1;width:100%;padding:0 5px 5px}.cet-menubar.bottom .cet-menubar-menu-button{border-radius:4px}.cet-menubar.bottom .cet-menubar-menu-button .cet-menubar-menu-title{line-height:26px}.cet-menubar .cet-menubar-menu-button{align-items:center;box-sizing:border-box;padding:0px 8px;height:100%;cursor:default;zoom:1;white-space:nowrap;-webkit-app-region:no-drag;outline:0}.cet-menubar .cet-menubar-menu-button .cet-menubar-menu-title{font-size:12px}.cet-menubar .cet-menubar-menu-button.disabled{opacity:.4}.cet-menubar .cet-menubar-menu-button:not(.disabled):focus,.cet-menubar .cet-menubar-menu-button:not(.disabled).open,.cet-menubar .cet-menubar-menu-button:not(.disabled):hover{background-color:rgba(255,255,255,.1)}.cet-menubar .cet-menubar-menu-container{position:absolute;display:block;left:0px;opacity:1;outline:0;border:none;text-align:left;margin:0 auto;padding:2px 0;margin-left:0;overflow-x:visible;overflow-y:visible;-webkit-overflow-scrolling:touch;justify-content:flex-end;white-space:nowrap;border-radius:7px;backdrop-filter:blur(5px);box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);z-index:99999}.cet-menubar .cet-menubar-menu-container::-webkit-scrollbar{width:8px;height:4px;cursor:pointer;background-color:rbga(0, 0, 0, 0)}.cet-menubar .cet-menubar-menu-container::-webkit-scrollbar-track{border:none;background-color:rbga(0, 0, 0, 0)}.cet-menubar .cet-menubar-menu-container::-webkit-scrollbar-thumb{border-radius:10px;background-color:rgba(110,110,110,.2)}.cet-menubar .cet-menubar-menu-container:focus{outline:0}.cet-menubar .cet-menubar-menu-container .cet-action-item{padding:0;transform:none;display:-ms-flexbox;display:flex;outline:none}.cet-menubar .cet-menubar-menu-container .cet-action-item.active{transform:none}.cet-menubar .cet-menubar-menu-container .cet-action-item.disabled .cet-action-menu-item{opacity:.4}.cet-menubar .cet-menubar-menu-container .cet-action-item .cet-submenu{position:absolute}.cet-menubar .cet-menubar-menu-container .cet-action-menu-item{-ms-flex:1 1 auto;flex:1 1 auto;display:-ms-flexbox;display:flex;height:2.231em;margin:2px 4px;align-items:center;position:relative;border-radius:5px}.cet-menubar .cet-menubar-menu-container .cet-action-label{-ms-flex:1 1 auto;flex:1 1 auto;text-decoration:none;padding:0 1em;background:none;font-size:12px;line-height:1}.cet-menubar .cet-menubar-menu-container .cet-action-label:not(.separator){display:inline-block;-webkit-box-sizing:border-box;-o-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0 2em 0 .8em}.cet-menubar .cet-menubar-menu-container .cet-action-label.separator{opacity:.1;font-size:inherit;margin:1px 0;width:100%;border-bottom:1px solid rgba(0,0,0,0)}.cet-menubar .cet-menubar-menu-container .cet-action-label.separator.text{padding:.7em 1em .1em 1em;font-weight:bold;opacity:1}.cet-menubar .cet-menubar-menu-container .cet-action-label:hover{color:inherit}.cet-menubar .cet-menubar-menu-container .keybinding{padding:0 2em 0 1em}.cet-menubar .cet-menubar-menu-container .keybinding,.cet-menubar .cet-menubar-menu-container .cet-submenu-indicator{display:inline-block;-ms-flex:2 1 auto;flex:2 1 auto;padding:0 3.1em 0 1em;text-align:right;font-size:11px;line-height:1}.cet-menubar .cet-menubar-menu-container .cet-submenu-indicator{position:absolute;right:4px;height:12px;width:12px;padding:0}.cet-menubar .cet-menubar-menu-container .cet-submenu-indicator img,.cet-menubar .cet-menubar-menu-container .cet-submenu-indicator svg,.cet-menubar .cet-menubar-menu-container .cet-menu-item-icon img,.cet-menubar .cet-menubar-menu-container .cet-menu-item-icon svg{display:inherit;width:100%;height:100%}.cet-menubar .cet-menubar-menu-container .cet-action-menu-item.checked>.cet-menu-item-icon.checkbox{visibility:visible}.cet-menubar .cet-menubar-menu-container .cet-menu-item-icon{width:14px;height:14px;margin:0 0 0 .4em}.cet-menubar .cet-menubar-menu-container .cet-menu-item-icon.checkbox{visibility:hidden}",""]);const a=r},29:(e,t,i)=>{i.d(t,{Z:()=>a});var n=i(933),s=i.n(n),o=i(476),r=i.n(o)()(s());r.push([e.id,".cet-titlebar{position:absolute;top:0;left:0;right:0;box-sizing:border-box;width:100%;font-size:13px;padding:0 16px;overflow:hidden;flex-shrink:0;align-items:center;justify-content:center;-webkit-user-select:none;-ms-user-select:none;user-select:none;zoom:1;line-height:22px;height:22px;display:flex;flex-wrap:wrap;z-index:99999}.cet-titlebar.cet-windows,.cet-titlebar.cet-linux{padding:0;height:30px;line-height:30px;justify-content:left;overflow:visible}.cet-titlebar.cet-windows .resizer,.cet-titlebar.cet-linux .resizer{-webkit-app-region:no-drag;position:absolute}.cet-titlebar.cet-windows .resizer.top,.cet-titlebar.cet-linux .resizer.top{top:0;width:100%;height:6px}.cet-titlebar.cet-windows .resizer.left,.cet-titlebar.cet-linux .resizer.left{top:0;left:0;width:6px;height:100%}.cet-titlebar.cet-inverted .cet-menubar,.cet-titlebar.cet-inverted .cet-controls-container{flex-direction:row-reverse}.cet-titlebar.cet-inverted .cet-controls-container{margin:0 5px 0 0}.cet-titlebar.cet-shadow{box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)}.cet-titlebar.cet-first-buttons .cet-controls-container{order:-1;margin:0 5px 0 0}.cet-titlebar .cet-drag-region{top:0;left:0;display:block;position:absolute;width:100%;height:100%;z-index:-1;-webkit-app-region:drag}.cet-titlebar .cet-window-icon{display:flex;align-items:center;justify-content:center;width:34px;height:30px;z-index:99;overflow:hidden}.cet-titlebar .cet-window-icon img{height:16px}.cet-titlebar .cet-window-title{flex:0 1 auto;font-size:13px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;zoom:1}.cet-titlebar .cet-window-title.cet-center{position:absolute;left:50%;transform:translate(-50%, 0)}.cet-titlebar .cet-window-title.cet-bigsur{font-size:13px;font-weight:600}.cet-titlebar .cet-controls-container{display:flex;flex-grow:0;flex-shrink:0;text-align:center;position:relative;z-index:99;-webkit-app-region:no-drag;height:30px;font-family:initial}.cet-titlebar .cet-controls-container .cet-icon{width:46px}.cet-titlebar .cet-controls-container .cet-icon:not(.inactive):hover{background-color:rgba(255,255,255,.3)}.cet-titlebar .cet-controls-container .cet-icon:not(.inactive):active{background-color:rgba(255,255,255,.2)}.cet-titlebar .cet-controls-container .cet-icon.inactive svg{opacity:.4}.cet-titlebar .cet-controls-container .cet-icon.cet-window-close:not(.inactive):hover{background-color:rgba(232,17,35,.9) !important}.cet-titlebar .cet-controls-container .cet-icon.cet-window-close:not(.inactive):active{background-color:rgba(232,17,35,.5) !important}.cet-titlebar .cet-controls-container .cet-icon svg{width:10px;height:-webkit-fill-available;fill:#eee}.cet-titlebar.light .cet-controls-container .cet-icon:not(.inactive):hover{background-color:rgba(0,0,0,.2)}.cet-titlebar.light .cet-controls-container .cet-icon:not(.inactive):active{background-color:rgba(0,0,0,.1)}.cet-titlebar.light .cet-controls-container .cet-icon svg{fill:#333}.cet-titlebar.inactive .cet-window-title,.cet-titlebar.inactive .cet-controls-container .cet-icon svg,.cet-titlebar.inactive .cet-menubar .cet-menubar-menu-button{opacity:.85}.cet-container{position:absolute;left:0;right:0;bottom:0}",""]);const a=r},476:e=>{e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var i="",n=void 0!==t[5];return t[4]&&(i+="@supports (".concat(t[4],") {")),t[2]&&(i+="@media ".concat(t[2]," {")),n&&(i+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),i+=e(t),n&&(i+="}"),t[2]&&(i+="}"),t[4]&&(i+="}"),i})).join("")},t.i=function(e,i,n,s,o){"string"==typeof e&&(e=[[null,e,void 0]]);var r={};if(n)for(var a=0;a0?" ".concat(c[5]):""," {").concat(c[1],"}")),c[5]=o),i&&(c[2]?(c[1]="@media ".concat(c[2]," {").concat(c[1],"}"),c[2]=i):c[2]=i),s&&(c[4]?(c[1]="@supports (".concat(c[4],") {").concat(c[1],"}"),c[4]=s):c[4]="".concat(s)),t.push(c))}},t}},933:e=>{e.exports=function(e){return e[1]}},737:(e,t,i)=>{i.r(t),i.d(t,{default:()=>v});var n=i(892),s=i.n(n),o=i(760),r=i.n(o),a=i(311),l=i.n(a),u=i(192),c=i.n(u),h=i(60),d=i.n(h),m=i(865),p=i.n(m),f=i(526),b={};f.Z&&f.Z.locals&&(b.locals=f.Z.locals);var g,_=0,y={};y.styleTagTransform=p(),y.setAttributes=c(),y.insert=l().bind(null,"head"),y.domAPI=r(),y.insertStyleElement=d(),b.use=function(e){return y.options=e||{},_++||(g=s()(f.Z,y)),b},b.unuse=function(){_>0&&!--_&&(g(),g=null)};const v=b},946:(e,t,i)=>{i.r(t),i.d(t,{default:()=>v});var n=i(892),s=i.n(n),o=i(760),r=i.n(o),a=i(311),l=i.n(a),u=i(192),c=i.n(u),h=i(60),d=i.n(h),m=i(865),p=i.n(m),f=i(29),b={};f.Z&&f.Z.locals&&(b.locals=f.Z.locals);var g,_=0,y={};y.styleTagTransform=p(),y.setAttributes=c(),y.insert=l().bind(null,"head"),y.domAPI=r(),y.insertStyleElement=d(),b.use=function(e){return y.options=e||{},_++||(g=s()(f.Z,y)),b},b.unuse=function(){_>0&&!--_&&(g(),g=null)};const v=b},892:e=>{var t=[];function i(e){for(var i=-1,n=0;n{var t={};e.exports=function(e,i){var n=function(e){if(void 0===t[e]){var i=document.querySelector(e);if(window.HTMLIFrameElement&&i instanceof window.HTMLIFrameElement)try{i=i.contentDocument.head}catch(e){i=null}t[e]=i}return t[e]}(e);if(!n)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");n.appendChild(i)}},60:e=>{e.exports=function(e){var t=document.createElement("style");return e.setAttributes(t,e.attributes),e.insert(t,e.options),t}},192:(e,t,i)=>{e.exports=function(e){var t=i.nc;t&&e.setAttribute("nonce",t)}},760:e=>{e.exports=function(e){var t=e.insertStyleElement(e);return{update:function(i){!function(e,t,i){var n="";i.supports&&(n+="@supports (".concat(i.supports,") {")),i.media&&(n+="@media ".concat(i.media," {"));var s=void 0!==i.layer;s&&(n+="@layer".concat(i.layer.length>0?" ".concat(i.layer):""," {")),n+=i.css,s&&(n+="}"),i.media&&(n+="}"),i.supports&&(n+="}");var o=i.sourceMap;o&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(o))))," */")),t.styleTagTransform(n,e,t.options)}(t,e,i)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}},865:e=>{e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}},418:(e,t)=>{var i;Object.defineProperty(t,"__esModule",{value:!0}),t.MenubarState=void 0,(i=t.MenubarState||(t.MenubarState={}))[i.HIDDEN=0]="HIDDEN",i[i.VISIBLE=1]="VISIBLE",i[i.FOCUSED=2]="FOCUSED",i[i.OPEN=3]="OPEN"},303:function(e,t,i){const n=(this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}})(i(58)),s=i(291);e.exports={Titlebar:n.default,Color:s.Color}},410:function(e,t,i){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.cleanMnemonic=t.CETMenu=t.MENU_ESCAPED_MNEMONIC_REGEX=t.MENU_MNEMONIC_REGEX=void 0;const s=i(291),o=i(359),r=i(146),a=i(735),l=i(324),u=i(440),c=i(559),h=i(657),d=i(266),m=n(i(910)),p=i(238);t.MENU_MNEMONIC_REGEX=/\(&([^\s&])\)|(^|[^&])&([^\s&])/,t.MENU_ESCAPED_MNEMONIC_REGEX=/(&)?(&)([^\s&])/g;class f extends c.Disposable{constructor(e,t,i={},n=(()=>{})){super(),this.triggerKeys={keys:[3,10],keyDown:!0},this.parentData={parent:this},this._onDidCancel=this._register(new h.Emitter),this.menuContainer=e,this.menubarOptions=t,this.options=i,this.closeSubMenu=n,this.items=[],this.focusedItem=void 0,this.mnemonics=new Map,this._register((0,o.addDisposableListener)(this.menuContainer,o.EventType.KEY_DOWN,(e=>{const t=new l.StandardKeyboardEvent(e);let i=!0;t.equals(16)?this.focusPrevious():t.equals(18)?this.focusNext():t.equals(9)?this.cancel():this.isTriggerKeyEvent(t)?this.triggerKeys&&this.triggerKeys.keyDown&&this.doTrigger(t):i=!1,i&&(t.preventDefault(),t.stopPropagation())}))),this._register((0,o.addDisposableListener)(this.menuContainer,o.EventType.KEY_UP,(e=>{const t=new l.StandardKeyboardEvent(e);this.isTriggerKeyEvent(t)?(this.triggerKeys&&!this.triggerKeys.keyDown&&this.doTrigger(t),t.preventDefault(),t.stopPropagation()):(t.equals(2)||t.equals(1026))&&this.updateFocusedItem()}))),i.enableMnemonics&&this._register((0,o.addDisposableListener)(this.menuContainer,o.EventType.KEY_DOWN,(e=>{const t=r.KeyCodeUtils.fromString(e.key);if(this.mnemonics.has(t)){const i=this.mnemonics.get(t);if(1===i.length&&(i[0]instanceof b&&this.focusItemByElement(i[0].getContainer()),i[0].onClick(e)),i.length>1){const e=i.shift();e&&(this.focusItemByElement(e.getContainer()),i.push(e)),this.mnemonics.set(t,i)}}}))),a.isLinux&&this._register((0,o.addDisposableListener)(this.menuContainer,o.EventType.KEY_DOWN,(e=>{const t=new l.StandardKeyboardEvent(e);t.equals(14)||t.equals(11)?(this.focusedItem=this.items.length-1,this.focusNext(),o.EventHelper.stop(e,!0)):(t.equals(13)||t.equals(12))&&(this.focusedItem=0,this.focusPrevious(),o.EventHelper.stop(e,!0))}))),this._register((0,o.addDisposableListener)(this.menuContainer,o.EventType.MOUSE_OUT,(e=>{let t=e.relatedTarget;(0,o.isAncestor)(t,this.menuContainer)||(this.focusedItem=void 0,this.updateFocus(),e.stopPropagation())}))),this._register((0,o.addDisposableListener)(this.menuContainer,o.EventType.MOUSE_UP,(e=>{o.EventHelper.stop(e,!0)}))),this._register((0,o.addDisposableListener)(this.menuContainer,o.EventType.MOUSE_OVER,(e=>{let t=e.target;if(t&&(0,o.isAncestor)(t,this.menuContainer)&&t!==this.menuContainer){for(;t.parentElement!==this.menuContainer&&null!==t.parentElement;)t=t.parentElement;if((0,o.hasClass)(t,"cet-action-item")){const e=this.focusedItem;this.setFocusedItem(t),e!==this.focusedItem&&this.updateFocus()}}}))),this.options.ariaLabel&&this.menuContainer.setAttribute("aria-label",this.options.ariaLabel)}get onDidCancel(){return this._onDidCancel.event}setAriaLabel(e){e?this.menuContainer.setAttribute("aria-label",e):this.menuContainer.removeAttribute("aria-label")}isTriggerKeyEvent(e){let t=!1;return this.triggerKeys&&this.triggerKeys.keys.forEach((i=>{t=t||e.equals(i)})),t}updateFocusedItem(){for(let e=0;e{if(!e)return;const t=document.createElement("li");t.className="cet-action-item",t.setAttribute("role","presentation"),this._register((0,o.addDisposableListener)(t,o.EventType.CONTEXT_MENU,(e=>{e.preventDefault(),e.stopPropagation()})));let i=null;if("separator"===e.type)i=new g(e,this.options);else if("submenu"===e.type||e.submenu){const t=e.submenu.items;if(i=new b(e,t,this.parentData,this.menubarOptions,this.options,this.closeSubMenu),this.options.enableMnemonics){const e=i.getMnemonic();if(e&&i.isEnabled()){let t=[];this.mnemonics.has(e)&&(t=this.mnemonics.get(e)),t.push(i),this.mnemonics.set(e,t)}}}else{const t={enableMnemonics:this.options.enableMnemonics};if(i=new u.CETMenuItem(e,t,this.menubarOptions,this.closeSubMenu,this.items),this.options.enableMnemonics){const e=i.getMnemonic();if(e&&i.isEnabled()){let t=[];this.mnemonics.has(e)&&(t=this.mnemonics.get(e)),t.push(i),this.mnemonics.set(e,t)}}}i.render(t),this.menuContainer.appendChild(t),this.items.push(i)}))}focus(e){let t,i=!1;void 0===e?i=!0:"number"==typeof e?t=e:"boolean"==typeof e&&(i=e),i&&void 0===this.focusedItem?(this.focusedItem=this.items.length-1,this.focusNext()):(void 0!==t&&(this.focusedItem=t),this.updateFocus())}focusNext(){void 0===this.focusedItem&&(this.focusedItem=this.items.length-1);const e=this.focusedItem;let t;do{this.focusedItem=(this.focusedItem+1)%this.items.length,t=this.items[this.focusedItem]}while(this.focusedItem!==e&&!t.isEnabled()||t.isSeparator());(this.focusedItem===e&&!t.isEnabled()||t.isSeparator())&&(this.focusedItem=void 0),this.updateFocus()}focusPrevious(){void 0===this.focusedItem&&(this.focusedItem=0);const e=this.focusedItem;let t;do{this.focusedItem=this.focusedItem-1,this.focusedItem<0&&(this.focusedItem=this.items.length-1),t=this.items[this.focusedItem]}while(this.focusedItem!==e&&!t.isEnabled()||t.isSeparator());(this.focusedItem===e&&!t.isEnabled()||t.isSeparator())&&(this.focusedItem=void 0),this.updateFocus()}updateFocus(){void 0===this.focusedItem&&this.menuContainer.focus();for(let e=0;e=100)&&(i=100);const n=i/100,o=e.backgroundColor?.rgba,r=new s.Color(new s.RGBA(o.r,o.g,o.b,n));t.style.backgroundColor=r.toString()}this.items&&this.items.forEach((t=>{(t instanceof u.CETMenuItem||t instanceof g)&&t.style(e)}))}focusItemByElement(e){const t=this.focusedItem;e&&this.setFocusedItem(e),t!==this.focusedItem&&this.updateFocus()}setFocusedItem(e){for(let t=0;t{})){super(e,s,n,r),this.submenuItems=t,this.parentData=i,this.submenuOptions=s,this.submenuDisposables=[],this.mouseOver=!1,this.showScheduler=new d.RunOnceScheduler((()=>{this.mouseOver&&(this.cleanupExistingSubmenu(!1),this.createSubmenu(!1))}),250),this.hideScheduler=new d.RunOnceScheduler((()=>{this.container&&!(0,o.isAncestor)(document.activeElement,this.container)&&this.parentData.submenu===this.mysubmenu&&(this.parentData.parent.focus(!1),this.cleanupExistingSubmenu(!0))}),750)}render(e){super.render(e),this.itemElement&&((0,o.addClass)(this.itemElement,"cet-submenu-item"),this.itemElement.setAttribute("aria-haspopup","true"),this.submenuIndicator=(0,o.append)(this.itemElement,(0,o.$)("span.cet-submenu-indicator")),this.submenuIndicator.innerHTML=m.default.arrow,(0,p.applyFill)(this.submenuIndicator.firstElementChild,this.menubarOptions?.svgColor,this.menuStyle?.foregroundColor),this.submenuIndicator.setAttribute("aria-hidden","true"),this.container&&((0,o.addDisposableListener)(this.container,o.EventType.KEY_UP,(e=>{let t=new l.StandardKeyboardEvent(e);(t.equals(17)||t.equals(3))&&(o.EventHelper.stop(e,!0),this.createSubmenu(!0))})),(0,o.addDisposableListener)(this.container,o.EventType.KEY_DOWN,(e=>{let t=new l.StandardKeyboardEvent(e);(t.equals(17)||t.equals(3))&&o.EventHelper.stop(e,!0)})),(0,o.addDisposableListener)(this.container,o.EventType.MOUSE_OVER,(e=>{this.mouseOver||(this.mouseOver=!0,this.showScheduler.schedule())})),(0,o.addDisposableListener)(this.container,o.EventType.MOUSE_LEAVE,(e=>{this.mouseOver=!1})),(0,o.addDisposableListener)(this.container,o.EventType.FOCUS_OUT,(e=>{this.container&&!(0,o.isAncestor)(document.activeElement,this.container)&&this.hideScheduler.schedule()}))))}onClick(e){o.EventHelper.stop(e,!0),this.cleanupExistingSubmenu(!1),this.createSubmenu(!1)}cleanupExistingSubmenu(e){this.parentData.submenu&&(e||this.parentData.submenu!==this.mysubmenu)&&(this.parentData.submenu.dispose(),this.parentData.submenu=void 0,this.submenuContainer&&(this.submenuContainer=void 0))}createSubmenu(e=!0){if(this.itemElement&&this.container)if(this.parentData.submenu)this.parentData.submenu.focus(!1);else{this.submenuContainer=(0,o.append)(this.container,(0,o.$)("ul.cet-submenu")),(0,o.addClasses)(this.submenuContainer,"cet-menubar-menu-container"),this.parentData.submenu=new f(this.submenuContainer,this.menubarOptions,this.submenuOptions,this.closeSubMenu),this.parentData.submenu.createMenu(this.submenuItems),this.menuStyle&&this.parentData.submenu.style(this.menuStyle);const t=this.container.getBoundingClientRect(),i=this.submenuContainer.getBoundingClientRect(),n=getComputedStyle(this.parentData.parent.getContainer()),s=parseFloat(n.paddingTop||"0")||0;window.innerWidth<=t.right+i.width?(this.submenuContainer.style.left="10px",this.submenuContainer.style.top=`${this.container.offsetTop+t.height}px`):(this.submenuContainer.style.left=`${this.container.offsetWidth}px`,this.submenuContainer.style.top=this.container.offsetTop-s+"px"),this.submenuDisposables.push((0,o.addDisposableListener)(this.submenuContainer,o.EventType.KEY_UP,(e=>{new l.StandardKeyboardEvent(e).equals(15)&&(o.EventHelper.stop(e,!0),this.parentData.parent.focus(),this.parentData.submenu&&(this.parentData.submenu.dispose(),this.parentData.submenu=void 0),this.submenuDisposables=(0,c.dispose)(this.submenuDisposables),this.submenuContainer=void 0)}))),this.submenuDisposables.push((0,o.addDisposableListener)(this.submenuContainer,o.EventType.KEY_DOWN,(e=>{new l.StandardKeyboardEvent(e).equals(15)&&o.EventHelper.stop(e,!0)}))),this.submenuDisposables.push(this.parentData.submenu.onDidCancel((()=>{this.parentData.parent.focus(),this.parentData.submenu&&(this.parentData.submenu.dispose(),this.parentData.submenu=void 0),this.submenuDisposables=(0,c.dispose)(this.submenuDisposables),this.submenuContainer=void 0}))),this.parentData.submenu.focus(e),this.mysubmenu=this.parentData.submenu}}applyStyle(){if(super.applyStyle(),!this.menuStyle)return;const e=this.container&&(0,o.hasClass)(this.container,"focused")&&this.menuStyle.selectionForegroundColor?this.menuStyle.selectionForegroundColor:this.menuStyle.foregroundColor;(0,p.applyFill)(this.submenuIndicator?.firstElementChild,this.menubarOptions?.svgColor,e),this.parentData.submenu&&this.parentData.submenu.style(this.menuStyle)}dispose(){super.dispose(),this.hideScheduler.dispose(),this.mysubmenu&&(this.mysubmenu.dispose(),this.mysubmenu=null),this.submenuContainer&&(this.submenuDisposables=(0,c.dispose)(this.submenuDisposables),this.submenuContainer=void 0)}}class g extends u.CETMenuItem{constructor(e,t){super(e,t)}render(e){e&&(this.separatorElement=(0,o.append)(e,(0,o.$)("a.cet-action-label")),this.separatorElement.setAttribute("role","presentation"),(0,o.addClass)(this.separatorElement,"separator"))}style(e){this.separatorElement&&e.separatorColor&&(this.separatorElement.style.borderBottomColor=e.separatorColor.toString())}}t.cleanMnemonic=function(e){const i=t.MENU_MNEMONIC_REGEX,n=i.exec(e);if(!n)return e;const s=!n[1];return e.replace(i,s?"$2$3":"").trim()}},178:function(e,t,i){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.escape=t.Menubar=void 0;const s=i(298),o=i(359),r=i(410),a=i(324),l=i(146),u=i(559),c=i(657),h=i(478),d=i(735),m=i(418),p=n(i(737));t.Menubar=class{constructor(e,t,i=(()=>{})){this.container=e,this.options=t,p.default.use(),this.menuItems=[],this.mnemonics=new Map,this.closeSubMenu=i,this._focusState=m.MenubarState.VISIBLE,this._onVisibilityChange=new c.Emitter,this._onFocusStateChange=new c.Emitter,f.getInstance().event(this.onModifierKeyToggled,this),(0,o.addDisposableListener)(this.container,o.EventType.KEY_DOWN,(e=>{let t=new a.StandardKeyboardEvent(e),i=!0;const n=e.key?l.KeyCodeUtils.fromString(e.key):0;if(t.equals(15))this.focusPrevious();else if(t.equals(17))this.focusNext();else if(t.equals(9)&&this.isFocused&&!this.isOpen)this.setUnfocusedState();else if(!this.isOpen&&!t.ctrlKey&&this.options?.enableMnemonics&&this.mnemonicsInUse&&this.mnemonics.has(n)){const e=this.mnemonics.get(n);this.onMenuTriggered(e,!1)}else i=!1;i&&(t.preventDefault(),t.stopPropagation())})),(0,o.addDisposableListener)(window,o.EventType.MOUSE_DOWN,(()=>{this.isFocused&&this.setUnfocusedState()})),(0,o.addDisposableListener)(this.container,o.EventType.FOCUS_IN,(e=>{e.relatedTarget&&(this.container.contains(e.relatedTarget)||(this.focusToReturn=e.relatedTarget))})),(0,o.addDisposableListener)(this.container,o.EventType.FOCUS_OUT,(e=>{e.relatedTarget&&(this.container.contains(e.relatedTarget)||(this.focusToReturn=void 0,this.setUnfocusedState()))})),(0,o.addDisposableListener)(window,o.EventType.KEY_DOWN,(e=>{if(!this.options?.enableMnemonics||!e.altKey||e.ctrlKey||e.defaultPrevented)return;const t=l.KeyCodeUtils.fromString(e.key);if(!this.mnemonics.has(t))return;this.mnemonicsInUse=!0,this.updateMnemonicVisibility(!0);const i=this.mnemonics.get(t);this.onMenuTriggered(i,!1)})),this.setUnfocusedState(),this.registerListeners()}registerListeners(){d.isMacintosh||(0,o.addDisposableListener)(window,o.EventType.RESIZE,(()=>{this.blur()}))}setupMenubar(){const e=this.options?.menu?.items;this.onFocusStateChange((e=>this._onFocusStateChange.fire(e))),this.onVisibilityChange((e=>this._onVisibilityChange.fire(e))),e?.forEach((e=>{if(!e)return;const t=this.menuItems.length,i=(0,r.cleanMnemonic)(e.label),n=(0,o.$)("div.cet-menubar-menu-button",{tabindex:-1,"aria-label":i,"aria-haspopup":!0});e.enabled||(0,o.addClass)(n,"disabled");const s=(0,o.$)("div.cet-menubar-menu-title",{"aria-hidden":!0});n.appendChild(s),(0,o.append)(this.container,n);let l=r.MENU_MNEMONIC_REGEX.exec(e.label);if(l){let e=l[1]?l[1]:l[2];this.registerMnemonic(this.menuItems.length,e)}this.updateLabels(s,n,e.label),e.enabled&&((0,o.addDisposableListener)(n,o.EventType.KEY_UP,(e=>{let i=new a.StandardKeyboardEvent(e),n=!0;!i.equals(18)&&!i.equals(3)||this.isOpen?n=!1:(this.focusedMenu={index:t},this.openedViaKeyboard=!0,this.focusState=m.MenubarState.OPEN),n&&(i.preventDefault(),i.stopPropagation())})),(0,o.addDisposableListener)(n,o.EventType.MOUSE_DOWN,(e=>{this.isOpen?this.ignoreNextMouseUp=!1:(this.ignoreNextMouseUp=!0,this.onMenuTriggered(t,!0)),e.preventDefault(),e.stopPropagation()})),(0,o.addDisposableListener)(n,o.EventType.MOUSE_UP,(()=>{this.ignoreNextMouseUp?this.ignoreNextMouseUp=!1:this.isFocused&&this.onMenuTriggered(t,!0)})),(0,o.addDisposableListener)(n,o.EventType.MOUSE_ENTER,(()=>{this.isOpen&&!this.isCurrentMenu(t)?(this.menuItems[t].buttonElement.focus(),this.cleanupMenu(),this.menuItems[t].submenu&&this.showMenu(t,!1)):this.isFocused&&!this.isOpen&&(this.focusedMenu={index:t},n.focus())})),this.menuItems.push({menuItem:e,submenu:e.submenu,buttonElement:n,titleElement:s}))}))}onClick(e){const t=this.menuItems[e].menuItem;s.ipcRenderer.send("menu-event",t.commandId)}get onVisibilityChange(){return this._onVisibilityChange.event}get onFocusStateChange(){return this._onFocusStateChange.event}dispose(){this.menuItems.forEach((e=>{(0,o.removeNode)(e.titleElement),(0,o.removeNode)(e.buttonElement)}))}blur(){this.setUnfocusedState()}setStyles(e){this.menuStyle=e}updateLabels(e,t,i){const n=(0,r.cleanMnemonic)(i);if(this.options?.enableMnemonics){let t=b(i);r.MENU_ESCAPED_MNEMONIC_REGEX.lastIndex=0;let n=r.MENU_ESCAPED_MNEMONIC_REGEX.exec(t);for(;n&&n[1];)n=r.MENU_ESCAPED_MNEMONIC_REGEX.exec(t);n&&(t=`${t.substr(0,n.index)}${t.substr(n.index+n[0].length)}`),t=t.replace(/&&/g,"&"),e.innerHTML=t}else e.innerHTML=n.replace(/&&/g,"&");let s=r.MENU_MNEMONIC_REGEX.exec(i);if(s){let e=s[1]?s[1]:s[3];this.options?.enableMnemonics?t.setAttribute("aria-keyshortcuts","Alt+"+e.toLocaleLowerCase()):t.removeAttribute("aria-keyshortcuts")}}registerMnemonic(e,t){this.mnemonics.set(l.KeyCodeUtils.fromString(t),e)}hideMenubar(){"none"!==this.container.style.display&&(this.container.style.display="none")}showMenubar(){"flex"!==this.container.style.display&&(this.container.style.display="flex")}get focusState(){return this._focusState}set focusState(e){if(e===this._focusState)return;const t=this.isVisible,i=this.isOpen,n=this.isFocused;switch(this._focusState=e,e){case m.MenubarState.HIDDEN:t&&this.hideMenubar(),i&&this.cleanupMenu(),n&&(this.focusedMenu=void 0,this.focusToReturn&&(this.focusToReturn.focus(),this.focusToReturn=void 0));break;case m.MenubarState.VISIBLE:t||this.showMenubar(),i&&this.cleanupMenu(),n&&(this.focusedMenu&&this.menuItems[this.focusedMenu.index]?.buttonElement.blur(),this.focusedMenu=void 0,this.focusToReturn&&(this.focusToReturn.focus(),this.focusToReturn=void 0));break;case m.MenubarState.FOCUSED:t||this.showMenubar(),i&&this.cleanupMenu(),this.focusedMenu&&this.menuItems[this.focusedMenu.index]?.buttonElement.focus();break;case m.MenubarState.OPEN:t||this.showMenubar(),this.focusedMenu&&this.menuItems[this.focusedMenu.index].submenu&&this.showMenu(this.focusedMenu.index,this.openedViaKeyboard)}this._focusState=e}get isVisible(){return this.focusState>=m.MenubarState.VISIBLE}get isFocused(){return this.focusState>=m.MenubarState.FOCUSED}get isOpen(){return this.focusState>=m.MenubarState.OPEN}setUnfocusedState(){this.focusState=m.MenubarState.VISIBLE,this.ignoreNextMouseUp=!1,this.mnemonicsInUse=!1,this.updateMnemonicVisibility(!1)}focusPrevious(){if(!this.focusedMenu)return;let e=(this.focusedMenu.index-1+this.menuItems.length)%this.menuItems.length;e!==this.focusedMenu.index&&(this.isOpen?(this.cleanupMenu(),this.menuItems[e].submenu&&this.showMenu(e)):this.isFocused&&(this.focusedMenu.index=e,this.menuItems[e].buttonElement.focus()))}focusNext(){if(!this.focusedMenu)return;let e=(this.focusedMenu.index+1)%this.menuItems.length;e!==this.focusedMenu.index&&(this.isOpen?(this.cleanupMenu(),this.menuItems[e].submenu&&this.showMenu(e)):this.isFocused&&(this.focusedMenu.index=e,this.menuItems[e].buttonElement.focus()))}updateMnemonicVisibility(e){this.menuItems&&this.menuItems.forEach((t=>{if(t.titleElement.children.length){let i=t.titleElement.children.item(0);i&&e&&(i.style.textDecoration="underline")}}))}get mnemonicsInUse(){return this._mnemonicsInUse}set mnemonicsInUse(e){this._mnemonicsInUse=e}onMenuTriggered(e,t){this.isOpen?this.isCurrentMenu(e)?this.setUnfocusedState():(this.cleanupMenu(),this.menuItems[e].submenu?this.showMenu(e,this.openedViaKeyboard):this.menuItems[e].menuItem.enabled&&this.onClick(e)):(this.focusedMenu={index:e},this.openedViaKeyboard=!t,this.menuItems[e].submenu?this.focusState=m.MenubarState.OPEN:this.menuItems[e].menuItem.enabled&&this.onClick(e))}onModifierKeyToggled(e){const t=!e.altKey&&!e.ctrlKey&&!e.shiftKey;this.isFocused&&"alt"===e.lastKeyPressed&&e.altKey&&(this.setUnfocusedState(),this.mnemonicsInUse=!1,this.awaitingAltRelease=!0),t&&"alt"===e.lastKeyPressed&&"alt"===e.lastKeyReleased&&(this.awaitingAltRelease||(this.isFocused?this.isOpen||this.setUnfocusedState():(this.mnemonicsInUse=!0,this.focusedMenu={index:0},this.focusState=m.MenubarState.FOCUSED))),e.altKey||"alt"!==e.lastKeyReleased||(this.awaitingAltRelease=!1),this.options?.enableMnemonics&&this.menuItems&&!this.isOpen&&this.updateMnemonicVisibility(!this.awaitingAltRelease&&e.altKey||this.mnemonicsInUse)}isCurrentMenu(e){return!!this.focusedMenu&&this.focusedMenu.index===e}cleanupMenu(){this.focusedMenu&&(this.menuItems[this.focusedMenu.index].buttonElement.focus(),this.focusedMenu.holder&&(this.focusedMenu.holder.parentElement&&(0,o.removeClass)(this.focusedMenu.holder.parentElement,"open"),this.focusedMenu.holder.remove()),this.focusedMenu.widget&&this.focusedMenu.widget.dispose(),this.focusedMenu={index:this.focusedMenu.index})}showMenu(e,t=!0){const i=this.menuItems[e],n=i.buttonElement,s=n.getBoundingClientRect(),a=(0,o.$)("ul.cet-menubar-menu-container");(0,o.addClass)(n,"open"),a.tabIndex=0,a.style.top=s.bottom-5+"px",a.style.left=`${s.left}px`,n.appendChild(a),a.style.maxHeight=`${Math.max(10,window.innerHeight-s.top-50)}px`;let l={enableMnemonics:this.mnemonicsInUse&&this.options?.enableMnemonics,ariaLabel:n.attributes.getNamedItem("aria-label")?.value},u=new r.CETMenu(a,this.options,l,this.closeSubMenu);u.createMenu(i.submenu?.items),u.style(this.menuStyle),u.onDidCancel((()=>{this.focusState=m.MenubarState.FOCUSED})),u.focus(t),this.focusedMenu={index:e,holder:a,widget:u}}};class f extends c.Emitter{constructor(){super(),this._subscriptions=[],this._keyStatus={altKey:!1,shiftKey:!1,ctrlKey:!1},this._subscriptions.push((0,h.domEvent)(document.body,"keydown",!0)((e=>{const t=new a.StandardKeyboardEvent(e);if(e.altKey&&!this._keyStatus.altKey)this._keyStatus.lastKeyPressed="alt";else if(e.ctrlKey&&!this._keyStatus.ctrlKey)this._keyStatus.lastKeyPressed="ctrl";else if(e.shiftKey&&!this._keyStatus.shiftKey)this._keyStatus.lastKeyPressed="shift";else{if(6===t.keyCode)return;this._keyStatus.lastKeyPressed=void 0}this._keyStatus.altKey=e.altKey,this._keyStatus.ctrlKey=e.ctrlKey,this._keyStatus.shiftKey=e.shiftKey,this._keyStatus.lastKeyPressed&&this.fire(this._keyStatus)}))),this._subscriptions.push((0,h.domEvent)(document.body,"keyup",!0)((e=>{!e.altKey&&this._keyStatus.altKey?this._keyStatus.lastKeyReleased="alt":!e.ctrlKey&&this._keyStatus.ctrlKey?this._keyStatus.lastKeyReleased="ctrl":!e.shiftKey&&this._keyStatus.shiftKey?this._keyStatus.lastKeyReleased="shift":this._keyStatus.lastKeyReleased=void 0,this._keyStatus.lastKeyPressed!==this._keyStatus.lastKeyReleased&&(this._keyStatus.lastKeyPressed=void 0),this._keyStatus.altKey=e.altKey,this._keyStatus.ctrlKey=e.ctrlKey,this._keyStatus.shiftKey=e.shiftKey,this._keyStatus.lastKeyReleased&&this.fire(this._keyStatus)}))),this._subscriptions.push((0,h.domEvent)(document.body,"mousedown",!0)((e=>{this._keyStatus.lastKeyPressed=void 0}))),this._subscriptions.push((0,h.domEvent)(window,"blur")((e=>{this._keyStatus.lastKeyPressed=void 0,this._keyStatus.lastKeyReleased=void 0,this._keyStatus.altKey=!1,this._keyStatus.shiftKey=!1,this._keyStatus.shiftKey=!1,this.fire(this._keyStatus)})))}static getInstance(){return f.instance||(f.instance=new f),f.instance}dispose(){super.dispose(),this._subscriptions=(0,u.dispose)(this._subscriptions)}}function b(e){return e.replace(/[<>&]/g,(function(e){switch(e){case"<":return"<";case">":return">";case"&":return"&";default:return e}}))}t.escape=b},440:function(e,t,i){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.CETMenuItem=void 0;const s=i(298),o=i(359),r=i(410),a=i(146),l=i(559),u=i(735),c=n(i(910)),h=i(238);class d extends l.Disposable{constructor(e,t={},i,n=(()=>{}),s){if(super(),this.item=e,this.menubarOptions=i,this.options=t,this.closeSubMenu=n,s&&(this.menuContainer=s),this.item.label&&t.enableMnemonics){let e=this.item.label;if(e){let t=r.MENU_MNEMONIC_REGEX.exec(e);t&&(this.mnemonic=a.KeyCodeUtils.fromString((t[1]?t[1]:t[2]).toLocaleUpperCase()))}}}getContainer(){return this.container}getItem(){return this.item}isEnabled(){return this.item.enabled}isSeparator(){return"separator"===this.item.type}render(e){this.container=e,this._register((0,o.addDisposableListener)(this.container,o.EventType.MOUSE_DOWN,(e=>{this.item.enabled&&0===e.button&&this.container&&(0,o.addClass)(this.container,"active")}))),this._register((0,o.addDisposableListener)(this.container,o.EventType.CLICK,(e=>{this.item.enabled&&this.onClick(e)}))),this._register((0,o.addDisposableListener)(this.container,o.EventType.DBLCLICK,(e=>{o.EventHelper.stop(e,!0)}))),[o.EventType.MOUSE_UP,o.EventType.MOUSE_OUT].forEach((e=>{this._register((0,o.addDisposableListener)(this.container,e,(e=>{o.EventHelper.stop(e),(0,o.removeClass)(this.container,"active")})))})),this.itemElement=(0,o.append)(this.container,(0,o.$)("a.cet-action-menu-item")),this.mnemonic&&this.itemElement.setAttribute("aria-keyshortcuts",`${this.mnemonic}`),this.iconElement=(0,o.append)(this.itemElement,(0,o.$)("span.cet-menu-item-icon")),this.iconElement.setAttribute("role","none"),this.labelElement=(0,o.append)(this.itemElement,(0,o.$)("span.cet-action-label")),this.setAccelerator(),this.updateLabel(),this.updateIcon(),this.updateTooltip(),this.updateEnabled(),this.updateChecked(),this.updateVisibility()}onClick(e){o.EventHelper.stop(e,!0),s.ipcRenderer.send("menu-event",this.item.commandId),"checkbox"===this.item.type?(this.item.checked=!this.item.checked,this.updateChecked()):"radio"===this.item.type?this.updateRadioGroup():this.closeSubMenu()}focus(){this.container&&(this.container.focus(),(0,o.addClass)(this.container,"focused")),this.applyStyle()}blur(){this.container&&(this.container.blur(),(0,o.removeClass)(this.container,"focused")),this.applyStyle()}setAccelerator(){var e=null;if(this.item.role)switch(this.item.role.toLocaleLowerCase()){case"undo":e="CtrlOrCmd+Z";break;case"redo":e="CtrlOrCmd+Y";break;case"cut":e="CtrlOrCmd+X";break;case"copy":e="CtrlOrCmd+C";break;case"paste":e="CtrlOrCmd+V";break;case"selectall":e="CtrlOrCmd+A";break;case"minimize":e="CtrlOrCmd+M";break;case"close":e="CtrlOrCmd+W";break;case"reload":e="CtrlOrCmd+R";break;case"forcereload":e="CtrlOrCmd+Shift+R";break;case"toggledevtools":e="CtrlOrCmd+Shift+I";break;case"togglefullscreen":e="F11";break;case"resetzoom":e="CtrlOrCmd+0";break;case"zoomin":e="CtrlOrCmd+Shift+=";break;case"zoomout":e="CtrlOrCmd+-"}this.item.label&&this.item.accelerator&&(e=this.item.accelerator),this.itemElement&&null!==e&&((0,o.append)(this.itemElement,(0,o.$)("span.keybinding")).textContent=m(e))}updateLabel(){if(this.item.label){let e=this.item.label;if(e){const t=(0,r.cleanMnemonic)(e);this.options.enableMnemonics||(e=t),this.labelElement&&this.labelElement.setAttribute("aria-label",t.replace(/&&/g,"&"));const i=r.MENU_MNEMONIC_REGEX.exec(e);if(i){e=escape(e),r.MENU_ESCAPED_MNEMONIC_REGEX.lastIndex=0;let t=r.MENU_ESCAPED_MNEMONIC_REGEX.exec(e);for(;t&&t[1];)t=r.MENU_ESCAPED_MNEMONIC_REGEX.exec(e);t&&(e=`${e.substr(0,t.index)}${e.substr(t.index+t[0].length)}`),e=e.replace(/&&/g,"&"),this.itemElement&&this.itemElement.setAttribute("aria-keyshortcuts",(i[1]?i[1]:i[3]).toLocaleLowerCase())}else e=e.replace(/&&/g,"&")}this.labelElement&&(this.labelElement.innerHTML=e.trim())}}updateIcon(){if(this.item.icon){const e=this.item.icon;this.iconElement&&e&&(0,o.append)(this.iconElement,(0,o.$)("img")).setAttribute("src",e.toString())}else this.iconElement&&"checkbox"===this.item.type?((0,o.addClass)(this.iconElement,"checkbox"),this.iconElement.innerHTML=c.default.check):"radio"===this.item.type&&((0,o.addClass)(this.iconElement,"radio"),this.iconElement.innerHTML=this.item.checked?c.default.radio.checked:c.default.radio.unchecked);(0,h.applyFill)(this.iconElement?.firstElementChild,this.menubarOptions?.svgColor,this.menuStyle?.foregroundColor)}updateTooltip(){let e=null;this.item.sublabel?e=this.item.sublabel:!this.item.label&&this.item.label&&this.item.icon&&(e=this.item.label,this.item.accelerator&&(e=m(this.item.accelerator))),this.itemElement&&e&&(this.itemElement.title=e)}updateEnabled(){this.container&&(this.item.enabled&&"separator"!==this.item.type?((0,o.removeClass)(this.container,"disabled"),this.container.tabIndex=0):(0,o.addClass)(this.container,"disabled"))}updateVisibility(){!1===this.item.visible&&this.itemElement&&this.itemElement.remove()}updateChecked(){this.itemElement&&(this.item.checked?((0,o.addClass)(this.itemElement,"checked"),this.itemElement.setAttribute("aria-checked","true")):((0,o.removeClass)(this.itemElement,"checked"),this.itemElement.setAttribute("aria-checked","false")))}updateRadioGroup(){if(void 0===this.radioGroup&&(this.radioGroup=this.getRadioGroup()),this.menuContainer)for(let e=this.radioGroup.start;e=11,b="60px",g=f?"28px":"22px",_="30px";t.default=class{constructor(e){this._defaultOptions={titleHorizontalAlignment:"center",menuPosition:"left",enableMnemonics:!0,minimizable:!0,maximizable:!0,closeable:!0},this._closeMenu=()=>{this._menubar&&this._menubar.blur()},this._options={...this._defaultOptions,...e},this._platformIcons=u.default[(0,o.PlatformToString)(o.platform).toLocaleLowerCase()],this._titlebar=(0,a.$)("div.cet-titlebar"),this._dragRegion=(0,a.$)("div.cet-drag-region"),this._windowIcon=(0,a.$)("div.cet-window-icon"),this._menubarContainer=(0,a.$)("div.cet-menubar"),this._title=(0,a.$)("div.cet-window-title"),this._windowControls=(0,a.$)("div.cet-controls-container"),this._container=(0,a.$)("div.cet-container"),this._windowControlIcons={minimize:(0,a.$)("div.cet-icon"),maximize:(0,a.$)("div.cet-icon"),close:(0,a.$)("div.cet-icon")},this._resizer={top:(0,a.$)("div.resizer.top"),left:(0,a.$)("div.resizer.left")},this._loadIcons(),this._loadBackgroundColor(),this._setupContainer(),this._setupIcon(),this._setupMenubar(),this._setupTitle(),this._createControls(),this._setupTitlebar(),this._updateStyles(),this._loadEvents(),c.default.use()}_loadIcons(){if(this._options.icons){const e=JSON.parse(this._options.icons);this._platformIcons=e[(0,o.PlatformToString)(o.platform).toLocaleLowerCase()]}}_loadBackgroundColor(){let e=r.Color.fromHex("#ffffff");if(!this._options.backgroundColor){const t=[].slice.call(document.getElementsByTagName("meta"));for(let i of t)if("theme-color"===i.name||"msapplication-TileColor"===i.name){e=r.Color.fromHex(i.content||"#ffffff");break}this._options.backgroundColor=e}}_setupTitlebar(){(0,a.addClass)(this._titlebar,`cet-${(0,o.PlatformToString)(o.platform).toLocaleLowerCase()}`),this._options.order&&(0,a.addClass)(this._titlebar,`cet-${this._options.order}`),this._options.shadow&&(0,a.addClass)(this._titlebar,"cet-shadow"),o.isMacintosh||(this._title.style.cursor="default"),f&&((0,a.addClass)(this._title,"cet-bigsur"),this._titlebar.style.height=g),(0,a.prepend)(document.body,this._titlebar)}_setupContainer(){for(document.body.style.margin="0",document.body.style.overflow="hidden",this._container.style.overflow=this._options.containerOverflow??"auto";document.body.firstChild;)(0,a.append)(this._container,document.body.firstChild);(0,a.append)(document.body,this._container),(0,a.append)(this._titlebar,this._dragRegion),(0,a.append)(this._titlebar,this._resizer.left),(0,a.append)(this._titlebar,this._resizer.top)}_loadEvents(){s.ipcRenderer.on("window-maximize",((e,t)=>this._onDidChangeMaximized(t))),s.ipcRenderer.on("window-fullscreen",((e,t)=>this.onWindowFullScreen(t))),s.ipcRenderer.on("window-focus",((e,t)=>this.onWindowFocus(t))),this._options.minimizable&&(0,a.addDisposableListener)(this._windowControlIcons.minimize,a.EventType.CLICK,(()=>{s.ipcRenderer.send("window-event","window-minimize")})),o.isMacintosh&&(0,a.addDisposableListener)(this._titlebar,a.EventType.DBLCLICK,(()=>{s.ipcRenderer.send("window-event","window-maximize")})),this._options.maximizable&&(0,a.addDisposableListener)(this._windowControlIcons.maximize,a.EventType.CLICK,(()=>{s.ipcRenderer.send("window-event","window-maximize")})),this._options.closeable&&(0,a.addDisposableListener)(this._windowControlIcons.close,a.EventType.CLICK,(()=>{s.ipcRenderer.send("window-event","window-close")}))}_setupIcon(){if(!o.isMacintosh){if(!this._options.icon){let e;const t=[].slice.call(document.getElementsByTagName("link"));for(let i of t)if("icon"===i.rel||"shortcut icon"===i.rel){e=i.href||void 0;break}this._options.icon=e}const e=(0,a.append)(this._windowIcon,(0,a.$)("img"));"string"==typeof this._options.icon?e.setAttribute("src",`${this._options.icon}`):e.setAttribute("src",this._options.icon&&this._options.icon.toDataURL()||""),this._setIconSize(this._options.iconSize),(0,a.append)(this._titlebar,this._windowIcon)}}_setupMenubar(){this._options.menu?this.updateMenu(this._options.menu):null!==this._options.menu&&s.ipcRenderer.invoke("request-application-menu").then((e=>this.updateMenu(e))),this._options.menuPosition&&this.updateMenuPosition(this._options.menuPosition),(0,a.append)(this._titlebar,this._menubarContainer)}_setupTitle(){this.updateTitle(document.title),this.updateTitleAlignment(this._options.titleHorizontalAlignment),(0,a.append)(this._titlebar,this._title)}_setIconSize(e){(!e||e<=16)&&(e=16),e>=24&&(e=24),this._windowIcon.firstElementChild.setAttribute("height",`${e}px`)}_createControl(e,t,i,n,s){e.title=i,e.innerHTML=n,(0,a.addClass)(e,s),t||(0,a.addClass)(e,"inactive"),(0,a.append)(this._windowControls,e)}_createControls(){o.isMacintosh||(this._createControl(this._windowControlIcons.minimize,this._options.minimizable,"Minimize",this._platformIcons.minimize,"cet-window-minimize"),this._createControl(this._windowControlIcons.maximize,this._options.maximizable,"Maximize",this._platformIcons.maximize,"cet-max-restore"),this._createControl(this._windowControlIcons.close,this._options.closeable,"Close",this._platformIcons.close,"cet-window-close"),(0,a.append)(this._titlebar,this._windowControls))}_onBlur(){this._isInactive=!0,this._updateStyles()}_onFocus(){this._isInactive=!1,this._updateStyles()}_onMenubarVisibilityChanged(e){(o.isWindows||o.isLinux)&&e&&((0,a.hide)(this._dragRegion),setTimeout((()=>(0,a.show)(this._dragRegion)),50))}_onMenubarFocusChanged(e){(o.isWindows||o.isLinux)&&(e?(0,a.hide)(this._dragRegion):(0,a.show)(this._dragRegion))}_onDidChangeMaximized(e){this._windowControlIcons.maximize&&(this._windowControlIcons.maximize.title=e?"Restore Down":"Maximize",this._windowControlIcons.maximize.innerHTML=e?this._platformIcons.restore:this._platformIcons.maximize),this._resizer&&(e?(0,a.hide)(this._resizer.top,this._resizer.left):(0,a.show)(this._resizer.top,this._resizer.left))}_updateStyles(){this._isInactive?(0,a.addClass)(this._titlebar,"inactive"):(0,a.removeClass)(this._titlebar,"inactive");const e=this._isInactive?this._options.backgroundColor?.lighten(.15):this._options.backgroundColor;let t;e&&(this._titlebar.style.backgroundColor=e.toString()),e?.isLighter()?((0,a.addClass)(this._titlebar,"light"),t=this._isInactive?h:d):((0,a.removeClass)(this._titlebar,"light"),t=this._isInactive?m:p),this._titlebar.style.color=t.toString();const i=this._options.backgroundColor?.darken(.16),n=i?.isLighter()?h:m,s=!this._options.itemBackgroundColor||this._options.itemBackgroundColor.equals(i)?new r.Color(new r.RGBA(0,0,0,.12)):this._options.itemBackgroundColor,o=s.isLighter()?d:p;this._menubar&&this._menubar.setStyles({backgroundColor:i,foregroundColor:n,selectionBackgroundColor:s,selectionForegroundColor:o,separatorColor:n})}onWindowFocus(e){this._titlebar&&(e?((0,a.removeClass)(this._titlebar,"inactive"),this._onFocus()):((0,a.addClass)(this._titlebar,"inactive"),this._closeMenu(),this._onBlur()))}onWindowFullScreen(e){o.isMacintosh||(e?((0,a.hide)(this._titlebar),this._container.style.top="0px"):((0,a.show)(this._titlebar),"bottom"===this._options.menuPosition?this._container.style.top=b:this._container.style.top=o.isMacintosh?g:_))}updateBackground(e){return this._options.backgroundColor=e,this._updateStyles(),this}updateItemBGColor(e){return this._options.itemBackgroundColor=e,this._updateStyles(),this}updateTitle(e){this._title&&(document.title=e,this._title.innerText=e)}updateIcon(e){e&&this._windowIcon&&(this._windowIcon.src=e)}updateMenu(e){if(!o.isMacintosh){if(this._menubar&&this._menubar.dispose(),!e)return this;this._options.menu=e,this._menubar=new l.Menubar(this._menubarContainer,this._options,this._closeMenu),this._menubar.setupMenubar(),this._menubar.onVisibilityChange((e=>this._onMenubarVisibilityChanged(e))),this._menubar.onFocusStateChange((e=>this._onMenubarFocusChanged(e))),this._updateStyles()}return this}async refreshMenu(){o.isMacintosh||s.ipcRenderer.invoke("request-application-menu").then((e=>this.updateMenu(e)))}updateMenuPosition(e){const t=o.isMacintosh?g:_;return this._options.menuPosition=e,this._titlebar.style.height="bottom"===e?b:t,this._container.style.top="bottom"===e?b:t,"bottom"===e?(0,a.addClass)(this._menubarContainer,"bottom"):(0,a.removeClass)(this._menubarContainer,"bottom"),this}updateTitleAlignment(e){return("left"===e||"right"===e&&"inverted"===this._options.order)&&(this._title.style.marginLeft="8px",this._title.style.marginRight="auto"),("right"===e||"left"===e&&"inverted"===this._options.order)&&(this._title.style.marginRight="8px",this._title.style.marginLeft="auto"),"center"!==e&&void 0!==e||("bottom"!==this._options.menuPosition&&(0,a.addClass)(this._title,"cet-center"),o.isMacintosh||"first-buttons"===this._options.order||(this._windowControls.style.marginLeft="auto"),this._title.style.maxWidth="calc(100vw - 296px)"),this}dispose(){for(this._menubar&&this._menubar.dispose(),this._titlebar.remove();this._container.firstChild;)(0,a.append)(document.body,this._container.firstChild);this._container.remove()}}},238:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.applyFill=void 0,t.applyFill=(e,t,i)=>{let n="";t?n=t.toString():i&&(n=i.toString()),e&&null!==e&&e.setAttribute("fill",n)}},93:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.hasClipboardSupport=t.isEdgeWebView=t.isIPad=t.isWebkitWebView=t.isSafari=t.isChrome=t.isWebKit=t.isFirefox=t.isOpera=t.isEdgeOrIE=t.isEdge=t.isIE=t.onDidChangeAccessibilitySupport=t.getAccessibilitySupport=t.setAccessibilitySupport=t.onDidChangeFullscreen=t.isFullscreen=t.setFullscreen=t.getPixelRatio=t.setZoomFactor=t.getZoomFactor=t.onDidChangeZoomLevel=t.getTimeSinceLastZoomLevelChanged=t.getZoomLevel=t.setZoomLevel=void 0;const n=i(657);class s{constructor(){this._zoomLevel=0,this._lastZoomLevelChangeTime=0,this._onDidChangeZoomLevel=new n.Emitter,this.onDidChangeZoomLevel=this._onDidChangeZoomLevel.event,this._zoomFactor=0,this._fullscreen=!1,this._onDidChangeFullscreen=new n.Emitter,this.onDidChangeFullscreen=this._onDidChangeFullscreen.event,this._accessibilitySupport=0,this._onDidChangeAccessibilitySupport=new n.Emitter,this.onDidChangeAccessibilitySupport=this._onDidChangeAccessibilitySupport.event}getZoomLevel(){return this._zoomLevel}getTimeSinceLastZoomLevelChanged(){return Date.now()-this._lastZoomLevelChangeTime}setZoomLevel(e,t){this._zoomLevel!==e&&(this._zoomLevel=e,this._lastZoomLevelChangeTime=t?0:Date.now(),this._onDidChangeZoomLevel.fire(this._zoomLevel))}getZoomFactor(){return this._zoomFactor}setZoomFactor(e){this._zoomFactor=e}getPixelRatio(){let e=document.createElement("canvas").getContext("2d");return(window.devicePixelRatio||1)/(e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1)}setFullscreen(e){this._fullscreen!==e&&(this._fullscreen=e,this._onDidChangeFullscreen.fire())}isFullscreen(){return this._fullscreen}setAccessibilitySupport(e){this._accessibilitySupport!==e&&(this._accessibilitySupport=e,this._onDidChangeAccessibilitySupport.fire())}getAccessibilitySupport(){return this._accessibilitySupport}}s.INSTANCE=new s,t.setZoomLevel=function(e,t){s.INSTANCE.setZoomLevel(e,t)},t.getZoomLevel=function(){return s.INSTANCE.getZoomLevel()},t.getTimeSinceLastZoomLevelChanged=function(){return s.INSTANCE.getTimeSinceLastZoomLevelChanged()},t.onDidChangeZoomLevel=function(e){return s.INSTANCE.onDidChangeZoomLevel(e)},t.getZoomFactor=function(){return s.INSTANCE.getZoomFactor()},t.setZoomFactor=function(e){s.INSTANCE.setZoomFactor(e)},t.getPixelRatio=function(){return s.INSTANCE.getPixelRatio()},t.setFullscreen=function(e){s.INSTANCE.setFullscreen(e)},t.isFullscreen=function(){return s.INSTANCE.isFullscreen()},t.onDidChangeFullscreen=s.INSTANCE.onDidChangeFullscreen,t.setAccessibilitySupport=function(e){s.INSTANCE.setAccessibilitySupport(e)},t.getAccessibilitySupport=function(){return s.INSTANCE.getAccessibilitySupport()},t.onDidChangeAccessibilitySupport=function(e){return s.INSTANCE.onDidChangeAccessibilitySupport(e)};const o=navigator.userAgent;t.isIE=o.indexOf("Trident")>=0,t.isEdge=o.indexOf("Edge/")>=0,t.isEdgeOrIE=t.isIE||t.isEdge,t.isOpera=o.indexOf("Opera")>=0,t.isFirefox=o.indexOf("Firefox")>=0,t.isWebKit=o.indexOf("AppleWebKit")>=0,t.isChrome=o.indexOf("Chrome")>=0,t.isSafari=!t.isChrome&&o.indexOf("Safari")>=0,t.isWebkitWebView=!t.isChrome&&!t.isSafari&&t.isWebKit,t.isIPad=o.indexOf("iPad")>=0,t.isEdgeWebView=t.isEdge&&o.indexOf("WebView/")>=0,t.hasClipboardSupport=function(){if(t.isIE)return!1;if(t.isEdge){let e=o.indexOf("Edge/"),t=parseInt(o.substring(e+5,o.indexOf(".",e)),10);if(!t||t>=12&&t<=16)return!1}return!0}},478:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.stop=t.domEvent=void 0;const n=i(657);t.domEvent=(e,t,i)=>{const s=e=>o.fire(e),o=new n.Emitter({onFirstListenerAdd:()=>{e.addEventListener(t,s,i)},onLastListenerRemove:()=>{e.removeEventListener(t,s,i)}});return o.event},t.stop=function(e){return n.Event.map(e,(e=>(e.preventDefault(),e.stopPropagation(),e)))}},278:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.IframeUtils=void 0;let i=!1,n=null;function s(e){if(!e.parent||e.parent===e)return null;try{let t=e.location,n=e.parent.location;if(t.protocol!==n.protocol||t.hostname!==n.hostname||t.port!==n.port)return i=!0,null}catch(e){return i=!0,null}return e.parent}function o(e,t){let i,n=e.document.getElementsByTagName("iframe");for(let e=0,s=n.length;e{Object.defineProperty(t,"__esModule",{value:!0}),t.coalesce=void 0,t.coalesce=function(e){return e?e.filter((e=>!!e)):e}},266:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RunOnceScheduler=t.TimeoutTimer=void 0;const n=i(559);class s extends n.Disposable{constructor(e,t){super(),this._token=-1,"function"==typeof e&&"number"==typeof t&&this.setIfNotSet(e,t)}dispose(){this.cancel(),super.dispose()}cancel(){-1!==this._token&&(clearTimeout(this._token),this._token=-1)}cancelAndSet(e,t){this.cancel(),this._token=setTimeout((()=>{this._token=-1,e()}),t)}setIfNotSet(e,t){-1===this._token&&(this._token=setTimeout((()=>{this._token=-1,e()}),t))}}t.TimeoutTimer=s,t.RunOnceScheduler=class{constructor(e,t){this.timeoutToken=-1,this.runner=e,this.timeout=t,this.timeoutHandler=this.onTimeout.bind(this)}dispose(){this.cancel(),this.runner=null}cancel(){this.isScheduled()&&(clearTimeout(this.timeoutToken),this.timeoutToken=-1)}schedule(e=this.timeout){this.cancel(),this.timeoutToken=setTimeout(this.timeoutHandler,e)}isScheduled(){return-1!==this.timeoutToken}onTimeout(){this.timeoutToken=-1,this.runner&&this.doRun()}doRun(){this.runner&&this.runner()}}},291:(e,t)=>{function i(e,t){const i=Math.pow(10,t);return Math.round(e*i)/i}Object.defineProperty(t,"__esModule",{value:!0}),t.Color=t.HSVA=t.HSLA=t.RGBA=void 0;class n{constructor(e,t,n,s=1){this.r=0|Math.min(255,Math.max(0,e)),this.g=0|Math.min(255,Math.max(0,t)),this.b=0|Math.min(255,Math.max(0,n)),this.a=i(Math.max(Math.min(1,s),0),3)}static equals(e,t){return e.r===t.r&&e.g===t.g&&e.b===t.b&&e.a===t.a}}t.RGBA=n;class s{constructor(e,t,n,s){this.h=0|Math.max(Math.min(360,e),0),this.s=i(Math.max(Math.min(1,t),0),3),this.l=i(Math.max(Math.min(1,n),0),3),this.a=i(Math.max(Math.min(1,s),0),3)}static equals(e,t){return e.h===t.h&&e.s===t.s&&e.l===t.l&&e.a===t.a}static fromRGBA(e){const t=e.r/255,i=e.g/255,n=e.b/255,o=e.a,r=Math.max(t,i,n),a=Math.min(t,i,n);let l=0,u=0;const c=(a+r)/2,h=r-a;if(h>0){switch(u=Math.min(c<=.5?h/(2*c):h/(2-2*c),1),r){case t:l=(i-n)/h+(i1&&(i-=1),i<1/6?e+6*(t-e)*i:i<.5?t:i<2/3?e+(t-e)*(2/3-i)*6:e}static toRGBA(e){const t=e.h/360,{s:i,l:o,a:r}=e;let a,l,u;if(0===i)a=l=u=o;else{const e=o<.5?o*(1+i):o+i-o*i,n=2*o-e;a=s._hue2rgb(n,e,t+1/3),l=s._hue2rgb(n,e,t),u=s._hue2rgb(n,e,t-1/3)}return new n(Math.round(255*a),Math.round(255*l),Math.round(255*u),r)}}t.HSLA=s;class o{constructor(e,t,n,s){this.h=0|Math.max(Math.min(360,e),0),this.s=i(Math.max(Math.min(1,t),0),3),this.v=i(Math.max(Math.min(1,n),0),3),this.a=i(Math.max(Math.min(1,s),0),3)}static equals(e,t){return e.h===t.h&&e.s===t.s&&e.v===t.v&&e.a===t.a}static fromRGBA(e){const t=e.r/255,i=e.g/255,n=e.b/255,s=Math.max(t,i,n),r=s-Math.min(t,i,n),a=0===s?0:r/s;let l;return l=0===r?0:s===t?((i-n)/r%6+6)%6:s===i?(n-t)/r+2:(t-i)/r+4,new o(Math.round(60*l),a,s,e.a)}static toRGBA(e){const{h:t,s:i,v:s,a:o}=e,r=s*i,a=r*(1-Math.abs(t/60%2-1)),l=s-r;let[u,c,h]=[0,0,0];return t<60?(u=r,c=a):t<120?(u=a,c=r):t<180?(c=r,h=a):t<240?(c=a,h=r):t<300?(u=a,h=r):t<360&&(u=r,h=a),u=Math.round(255*(u+l)),c=Math.round(255*(c+l)),h=Math.round(255*(h+l)),new n(u,c,h,o)}}t.HSVA=o;class r{constructor(e){if(!e)throw new Error("Color needs a value");if(e instanceof n)this.rgba=e;else if(e instanceof s)this._hsla=e,this.rgba=s.toRGBA(e);else{if(!(e instanceof o))throw new Error("Invalid color ctor argument");this._hsva=e,this.rgba=o.toRGBA(e)}}static fromHex(e){return r.Format.CSS.parseHex(e)||r.RED}get hsla(){return this._hsla?this._hsla:s.fromRGBA(this.rgba)}get hsva(){return this._hsva?this._hsva:o.fromRGBA(this.rgba)}equals(e){return!!e&&n.equals(this.rgba,e.rgba)&&s.equals(this.hsla,e.hsla)&&o.equals(this.hsva,e.hsva)}getRelativeLuminance(){return i(.2126*r._relativeLuminanceForComponent(this.rgba.r)+.7152*r._relativeLuminanceForComponent(this.rgba.g)+.0722*r._relativeLuminanceForComponent(this.rgba.b),4)}static _relativeLuminanceForComponent(e){const t=e/255;return t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4)}getContrastRatio(e){const t=this.getRelativeLuminance(),i=e.getRelativeLuminance();return t>i?(t+.05)/(i+.05):(i+.05)/(t+.05)}isDarker(){return(299*this.rgba.r+587*this.rgba.g+114*this.rgba.b)/1e3<128}isLighter(){return(299*this.rgba.r+587*this.rgba.g+114*this.rgba.b)/1e3>=128}isLighterThan(e){return this.getRelativeLuminance()>e.getRelativeLuminance()}isDarkerThan(e){return this.getRelativeLuminance()r._flatten(t,e)));return r._flatten(this,t)}static _flatten(e,t){const i=1-e.rgba.a;return new r(new n(i*t.rgba.r+e.rgba.a*e.rgba.r,i*t.rgba.g+e.rgba.a*e.rgba.g,i*t.rgba.b+e.rgba.a*e.rgba.b))}toString(){return""+r.Format.CSS.format(this)}static getLighterColor(e,t,i){if(e.isLighterThan(t))return e;i=i||.5;const n=e.getRelativeLuminance(),s=t.getRelativeLuminance();return i=i*(s-n)/s,e.lighten(i)}static getDarkerColor(e,t,i){if(e.isDarkerThan(t))return e;i=i||.5;const n=e.getRelativeLuminance();return i=i*(n-t.getRelativeLuminance())/n,e.darken(i)}}t.Color=r,r.WHITE=new r(new n(255,255,255,1)),r.BLACK=new r(new n(0,0,0,1)),r.RED=new r(new n(255,0,0,1)),r.BLUE=new r(new n(0,0,255,1)),r.GREEN=new r(new n(0,255,0,1)),r.CYAN=new r(new n(0,255,255,1)),r.LIGHTGREY=new r(new n(211,211,211,1)),r.TRANSPARENT=new r(new n(0,0,0,0)),function(e){let t;!function(t){let i;!function(t){function i(e){const t=e.toString(16);return 2!==t.length?"0"+t:t}function s(e){switch(e){case 48:return 0;case 49:return 1;case 50:return 2;case 51:return 3;case 52:return 4;case 53:return 5;case 54:return 6;case 55:return 7;case 56:return 8;case 57:return 9;case 97:case 65:return 10;case 98:case 66:return 11;case 99:case 67:return 12;case 100:case 68:return 13;case 101:case 69:return 14;case 102:case 70:return 15}return 0}t.formatRGB=function(t){return 1===t.rgba.a?`rgb(${t.rgba.r}, ${t.rgba.g}, ${t.rgba.b})`:e.Format.CSS.formatRGBA(t)},t.formatRGBA=function(e){return`rgba(${e.rgba.r}, ${e.rgba.g}, ${e.rgba.b}, ${+e.rgba.a.toFixed(2)})`},t.formatHSL=function(t){return 1===t.hsla.a?`hsl(${t.hsla.h}, ${(100*t.hsla.s).toFixed(2)}%, ${(100*t.hsla.l).toFixed(2)}%)`:e.Format.CSS.formatHSLA(t)},t.formatHSLA=function(e){return`hsla(${e.hsla.h}, ${(100*e.hsla.s).toFixed(2)}%, ${(100*e.hsla.l).toFixed(2)}%, ${e.hsla.a.toFixed(2)})`},t.formatHex=function(e){return`#${i(e.rgba.r)}${i(e.rgba.g)}${i(e.rgba.b)}`},t.formatHexA=function(t,n=!1){return n&&1===t.rgba.a?e.Format.CSS.formatHex(t):`#${i(t.rgba.r)}${i(t.rgba.g)}${i(t.rgba.b)}${i(Math.round(255*t.rgba.a))}`},t.format=function(t){return t?t.isOpaque()?e.Format.CSS.formatHex(t):e.Format.CSS.formatRGBA(t):null},t.parseHex=function(t){if(!t)return null;const i=t.length;if(0===i)return null;if(35!==t.charCodeAt(0))return null;if(7===i){const i=16*s(t.charCodeAt(1))+s(t.charCodeAt(2)),o=16*s(t.charCodeAt(3))+s(t.charCodeAt(4)),r=16*s(t.charCodeAt(5))+s(t.charCodeAt(6));return new e(new n(i,o,r,1))}if(9===i){const i=16*s(t.charCodeAt(1))+s(t.charCodeAt(2)),o=16*s(t.charCodeAt(3))+s(t.charCodeAt(4)),r=16*s(t.charCodeAt(5))+s(t.charCodeAt(6)),a=16*s(t.charCodeAt(7))+s(t.charCodeAt(8));return new e(new n(i,o,r,a/255))}if(4===i){const i=s(t.charCodeAt(1)),o=s(t.charCodeAt(2)),r=s(t.charCodeAt(3));return new e(new n(16*i+i,16*o+o,16*r+r))}if(5===i){const i=s(t.charCodeAt(1)),o=s(t.charCodeAt(2)),r=s(t.charCodeAt(3)),a=s(t.charCodeAt(4));return new e(new n(16*i+i,16*o+o,16*r+r,(16*a+a)/255))}return null}}(i=t.CSS||(t.CSS={}))}(t=e.Format||(e.Format={}))}(r=t.Color||(t.Color={}))},359:function(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,s)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return s(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.getElementsByTagName=t.removeTabIndexAndUpdateFocus=t.hide=t.show=t.join=t.$=t.prepend=t.append=t.trackFocus=t.restoreParentsScrollTop=t.saveParentsScrollTop=t.EventHelper=t.EventType=t.isHTMLElement=t.removeCSSRulesContainingSelector=t.createCSSRule=t.createStyleSheet=t.findParentWithClass=t.isAncestor=t.getLargestChildWidth=t.getTotalHeight=t.getContentHeight=t.getTotalScrollWidth=t.getContentWidth=t.getTotalWidth=t.StandardWindow=t.getDomNodePagePosition=t.position=t.size=t.getTopLeftOffset=t.Dimension=t.getClientArea=t.getComputedStyle=t.addDisposableThrottledListener=t.modify=t.measure=t.scheduleAtNextAnimationFrame=t.runAtThisOrScheduleAtNextAnimationFrame=t.addDisposableNonBubblingMouseOutListener=t.addStandardDisposableListener=t.addDisposableListener=t.toggleClass=t.removeClasses=t.removeClass=t.addClasses=t.addClass=t.hasClass=t.isInDOM=t.removeNode=t.clearNode=void 0,t.animate=t.windowOpenNoOpener=t.computeScreenAwareSize=t.domContentLoaded=t.finalHandler=void 0;const r=o(i(93)),a=i(478),l=i(324),u=i(69),c=i(266),h=i(657),d=i(559),m=o(i(735)),p=i(91);t.clearNode=function(e){for(;e.firstChild;)e.removeChild(e.firstChild)},t.removeNode=function(e){e.parentNode&&e.parentNode.removeChild(e)},t.isInDOM=function(e){for(;e;){if(e===document.body)return!0;e=e.parentNode}return!1};const f=new class{_findClassName(e,t){let i=e.className;if(!i)return void(this._lastStart=-1);t=t.trim();let n=i.length,s=t.length;if(0===s)return void(this._lastStart=-1);if(n=0;){if(o=r+s,(0===r||32===i.charCodeAt(r-1))&&32===i.charCodeAt(o))return this._lastStart=r,void(this._lastEnd=o+1);if(r>0&&32===i.charCodeAt(r-1)&&o===n)return this._lastStart=r-1,void(this._lastEnd=o);if(0===r&&o===n)return this._lastStart=0,void(this._lastEnd=o)}this._lastStart=-1}hasClass(e,t){return this._findClassName(e,t),-1!==this._lastStart}addClasses(e,...t){t.forEach((t=>t.split(" ").forEach((t=>this.addClass(e,t)))))}addClass(e,t){e.className?(this._findClassName(e,t),-1===this._lastStart&&(e.className=e.className+" "+t)):e.className=t}removeClass(e,t){this._findClassName(e,t),-1!==this._lastStart&&(e.className=e.className.substring(0,this._lastStart)+e.className.substring(this._lastEnd||0))}removeClasses(e,...t){t.forEach((t=>t.split(" ").forEach((t=>this.removeClass(e,t)))))}toggleClass(e,t,i){this._findClassName(e,t),-1===this._lastStart||void 0!==i&&i||this.removeClass(e,t),-1!==this._lastStart||void 0!==i&&!i||this.addClass(e,t)}},b=new class{hasClass(e,t){return Boolean(t)&&e.classList&&e.classList.contains(t)}addClasses(e,...t){t.forEach((t=>t.split(" ").forEach((t=>this.addClass(e,t)))))}addClass(e,t){t&&e.classList&&e.classList.add(t)}removeClass(e,t){t&&e.classList&&e.classList.remove(t)}removeClasses(e,...t){t.forEach((t=>t.split(" ").forEach((t=>this.removeClass(e,t)))))}toggleClass(e,t,i){e.classList&&e.classList.toggle(t,i)}},g=r.isIE?f:b;t.hasClass=g.hasClass.bind(g),t.addClass=g.addClass.bind(g),t.addClasses=g.addClasses.bind(g),t.removeClass=g.removeClass.bind(g),t.removeClasses=g.removeClasses.bind(g),t.toggleClass=g.toggleClass.bind(g);class _{constructor(e,t,i,n){this._node=e,this._type=t,this._handler=i,this._useCapture=n||!1,this._node.addEventListener(this._type,this._handler,this._useCapture)}dispose(){this._handler&&(this._node.removeEventListener(this._type,this._handler,this._useCapture),this._node=null,this._handler=null)}}function y(e,t,i,n){return new _(e,t,i,n)}t.addDisposableListener=y,t.addStandardDisposableListener=function(e,t,i,n){let s=i;return"click"===t||"mousedown"===t?s=function(e){return function(t){return e(new u.StandardMouseEvent(t))}}(i):"keydown"!==t&&"keypress"!==t&&"keyup"!==t||(s=function(e){return function(t){return e(new l.StandardKeyboardEvent(t))}}(i)),y(e,t,s,n)},t.addDisposableNonBubblingMouseOutListener=function(e,t){return y(e,"mouseout",(i=>{let n=i.relatedTarget||i.target;for(;n&&n!==e;)n=n.parentNode;n!==e&&t(i)}))};let v=null;class C{constructor(e,t=0){this._runner=e,this.priority=t,this._canceled=!1}dispose(){this._canceled=!0}execute(){if(!this._canceled)try{this._runner()}catch(e){console.error(e)}}static sort(e,t){return t.priority-e.priority}}!function(){let e=[],i=null,n=!1,s=!1,o=()=>{for(n=!1,i=e,e=[],s=!0;i.length>0;)i.sort(C.sort),i.shift().execute();s=!1};t.scheduleAtNextAnimationFrame=(t,i=0)=>{let s=new C(t,i);return e.push(s),n||(n=!0,function(e){if(!v){const e=e=>setTimeout((()=>e((new Date).getTime())),0);v=self.requestAnimationFrame||self.msRequestAnimationFrame||self.webkitRequestAnimationFrame||self.mozRequestAnimationFrame||self.oRequestAnimationFrame||e}v.call(self,e)}(o)),s},t.runAtThisOrScheduleAtNextAnimationFrame=(e,n)=>{if(s){let t=new C(e,n);return i.push(t),t}return(0,t.scheduleAtNextAnimationFrame)(e,n)}}(),t.measure=function(e){return(0,t.scheduleAtNextAnimationFrame)(e,1e4)},t.modify=function(e){return(0,t.scheduleAtNextAnimationFrame)(e,-1e4)};const E=function(e,t){return t};class w extends d.Disposable{constructor(e,t,i,n=E,s=16){super();let o=null,r=0,a=this._register(new c.TimeoutTimer),l=()=>{r=(new Date).getTime(),i(o),o=null};this._register(y(e,t,(e=>{o=n(o,e);let t=(new Date).getTime()-r;t>=s?(a.cancel(),l()):a.setIfNotSet(l,s-t)})))}}function S(e){return document.defaultView.getComputedStyle(e,null)}t.addDisposableThrottledListener=function(e,t,i,n,s){return new w(e,t,i,n,s)},t.getComputedStyle=S;function M(e,t,i){let n=S(e),s="0";return n&&(s=n.getPropertyValue?n.getPropertyValue(t):n.getAttribute(i)),function(e,t){return parseFloat(t)||0}(0,s)}t.getClientArea=function(e){if(e!==document.body)return new L(e.clientWidth,e.clientHeight);if(window.innerWidth&&window.innerHeight)return new L(window.innerWidth,window.innerHeight);if(document.body&&document.body.clientWidth&&document.body.clientHeight)return new L(document.body.clientWidth,document.body.clientHeight);if(document.documentElement&&document.documentElement.clientWidth&&document.documentElement.clientHeight)return new L(document.documentElement.clientWidth,document.documentElement.clientHeight);throw new Error("Unable to figure out browser width and height")};const x=function(e){return M(e,"border-left-width","borderLeftWidth")},T=function(e){return M(e,"border-top-width","borderTopWidth")},I=function(e){return M(e,"margin-left","marginLeft")},k=function(e){return M(e,"margin-right","marginRight")};class L{constructor(e,t){this.width=e,this.height=t}static equals(e,t){return e===t||!(!e||!t)&&e.width===t.width&&e.height===t.height}}function D(e){let t=e.offsetParent,i=e.offsetTop,n=e.offsetLeft;for(;null!==(e=e.parentNode)&&e!==document.body&&e!==document.documentElement;){i-=e.scrollTop;let s=S(e);s&&(n-="rtl"!==s.direction?e.scrollLeft:-e.scrollLeft),e===t&&(n+=x(e),i+=T(e),i+=e.offsetTop,n+=e.offsetLeft,t=e.offsetParent)}return{left:n,top:i}}function A(e){let t=I(e)+k(e);return e.offsetWidth+t}function O(e){let t=I(e)+k(e);return e.scrollWidth+t}function N(e,t){for(;e;){if(e===t)return!0;e=e.parentNode}return!1}function K(e=document.getElementsByTagName("head")[0]){let t=document.createElement("style");return t.type="text/css",t.media="screen",e.appendChild(t),t}t.Dimension=L,t.getTopLeftOffset=D,t.size=function(e,t,i){"number"==typeof t&&(e.style.width=`${t}px`),"number"==typeof i&&(e.style.height=`${i}px`)},t.position=function(e,t,i,n,s,o="absolute"){"number"==typeof t&&(e.style.top=`${t}px`),"number"==typeof i&&(e.style.right=`${i}px`),"number"==typeof n&&(e.style.bottom=`${n}px`),"number"==typeof s&&(e.style.left=`${s}px`),e.style.position=o},t.getDomNodePagePosition=function(e){let i=e.getBoundingClientRect();return{left:i.left+t.StandardWindow.scrollX,top:i.top+t.StandardWindow.scrollY,width:i.width,height:i.height}},t.StandardWindow=new class{get scrollX(){return"number"==typeof window.scrollX?window.scrollX:document.body.scrollLeft+document.documentElement.scrollLeft}get scrollY(){return"number"==typeof window.scrollY?window.scrollY:document.body.scrollTop+document.documentElement.scrollTop}},t.getTotalWidth=A,t.getContentWidth=function(e){let t=x(e)+function(e){return M(e,"border-right-width","borderRightWidth")}(e),i=function(e){return M(e,"padding-left","paddingLeft")}(e)+function(e){return M(e,"padding-right","paddingRight")}(e);return e.offsetWidth-t-i},t.getTotalScrollWidth=O,t.getContentHeight=function(e){let t=T(e)+function(e){return M(e,"border-bottom-width","borderBottomWidth")}(e),i=function(e){return M(e,"padding-top","paddingTop")}(e)+function(e){return M(e,"padding-bottom","paddingBottom")}(e);return e.offsetHeight-t-i},t.getTotalHeight=function(e){let t=function(e){return M(e,"margin-top","marginTop")}(e)+function(e){return M(e,"margin-bottom","marginBottom")}(e);return e.offsetHeight+t},t.getLargestChildWidth=function(e,t){let i=t.map((t=>Math.max(O(t),A(t))+function(e,t){if(null===e)return 0;let i=D(e),n=D(t);return i.left-n.left}(t,e)||0));return Math.max(...i)},t.isAncestor=N,t.findParentWithClass=function(e,i,n){for(;e;){if((0,t.hasClass)(e,i))return e;if(n)if("string"==typeof n){if((0,t.hasClass)(e,n))return null}else if(e===n)return null;e=e.parentNode}return null},t.createStyleSheet=K;let R=null;function F(){return R||(R=K()),R}t.createCSSRule=function(e,t,i=F()){i&&t&&i.sheet.insertRule(e+"{"+t+"}",0)},t.removeCSSRulesContainingSelector=function(e,t=F()){if(!t)return;let i=function(e){return e&&e.sheet&&e.sheet.rules?e.sheet.rules:e&&e.sheet&&e.sheet.cssRules?e.sheet.cssRules:[]}(t),n=[];for(let t=0;t=0;e--)t.sheet.deleteRule(n[e])},t.isHTMLElement=function(e){return"object"==typeof HTMLElement?e instanceof HTMLElement:e&&"object"==typeof e&&1===e.nodeType&&"string"==typeof e.nodeName},t.EventType={MINIMIZE:"minimize",MAXIMIZE:"maximize",UNMAXIMIZE:"unmaximize",ENTER_FULLSCREEN:"enter-full-screen",LEAVE_FULLSCREEN:"leave-full-screen",CLICK:"click",DBLCLICK:"dblclick",MOUSE_UP:"mouseup",MOUSE_DOWN:"mousedown",MOUSE_OVER:"mouseover",MOUSE_MOVE:"mousemove",MOUSE_OUT:"mouseout",MOUSE_ENTER:"mouseenter",MOUSE_LEAVE:"mouseleave",CONTEXT_MENU:"contextmenu",WHEEL:"wheel",KEY_DOWN:"keydown",KEY_PRESS:"keypress",KEY_UP:"keyup",LOAD:"load",UNLOAD:"unload",ABORT:"abort",ERROR:"error",RESIZE:"resize",SCROLL:"scroll",SELECT:"select",CHANGE:"change",SUBMIT:"submit",RESET:"reset",FOCUS:"focus",FOCUS_IN:"focusin",FOCUS_OUT:"focusout",BLUR:"blur",INPUT:"input",STORAGE:"storage",DRAG_START:"dragstart",DRAG:"drag",DRAG_ENTER:"dragenter",DRAG_LEAVE:"dragleave",DRAG_OVER:"dragover",DROP:"drop",DRAG_END:"dragend",ANIMATION_START:r.isWebKit?"webkitAnimationStart":"animationstart",ANIMATION_END:r.isWebKit?"webkitAnimationEnd":"animationend",ANIMATION_ITERATION:r.isWebKit?"webkitAnimationIteration":"animationiteration"},t.EventHelper={stop:function(e,t){e.preventDefault?e.preventDefault():e.returnValue=!1,t&&(e.stopPropagation?e.stopPropagation():e.cancelBubble=!0)}},t.saveParentsScrollTop=function(e){let t=[];for(let i=0;e&&e.nodeType===e.ELEMENT_NODE;i++)t[i]=e.scrollTop,e=e.parentNode;return t},t.restoreParentsScrollTop=function(e,t){for(let i=0;e&&e.nodeType===e.ELEMENT_NODE;i++)e.scrollTop!==t[i]&&(e.scrollTop=t[i]),e=e.parentNode};class P{constructor(e){this._onDidFocus=new h.Emitter,this.onDidFocus=this._onDidFocus.event,this._onDidBlur=new h.Emitter,this.onDidBlur=this._onDidBlur.event,this.disposables=[];let i=N(document.activeElement,e),n=!1;(0,a.domEvent)(e,t.EventType.FOCUS,!0)((()=>{n=!1,i||(i=!0,this._onDidFocus.fire())}),null,this.disposables),(0,a.domEvent)(e,t.EventType.BLUR,!0)((()=>{i&&(n=!0,window.setTimeout((()=>{n&&(n=!1,i=!1,this._onDidBlur.fire())}),0))}),null,this.disposables)}dispose(){this.disposables=(0,d.dispose)(this.disposables),this._onDidFocus.dispose(),this._onDidBlur.dispose()}}t.trackFocus=function(e){return new P(e)},t.append=function(e,...t){return t.forEach((t=>e.appendChild(t))),t[t.length-1]},t.prepend=function(e,t){return e.insertBefore(t,e.firstChild),t};const U=/([\w\-]+)?(#([\w\-]+))?((.([\w\-]+))*)/;t.$=function(e,t,...i){let n=U.exec(e);if(!n)throw new Error("Bad use of emmet");let s=document.createElement(n[1]||"div");return n[3]&&(s.id=n[3]),n[4]&&(s.className=n[4].replace(/\./g," ").trim()),t=t||{},Object.keys(t).forEach((e=>{const i=t[e];/^on\w+$/.test(e)?s[e]=i:"selected"===e?i&&s.setAttribute(e,"true"):s.setAttribute(e,i)})),(0,p.coalesce)(i).forEach((e=>{e instanceof Node?s.appendChild(e):s.appendChild(document.createTextNode(e))})),s},t.join=function(e,t){const i=[];return e.forEach(((e,n)=>{n>0&&(t instanceof Node?i.push(t.cloneNode()):i.push(document.createTextNode(t))),i.push(e)})),i},t.show=function(...e){for(let t of e)t&&(t.style.display="",t.removeAttribute("aria-hidden"))},t.hide=function(...e){for(let t of e)t&&(t.style.display="none",t.setAttribute("aria-hidden","true"))},t.removeTabIndexAndUpdateFocus=function(e){if(e&&e.hasAttribute("tabIndex")){if(document.activeElement===e){let t=function(e,t){for(;e;){if(e instanceof HTMLElement&&e.hasAttribute("tabIndex"))return e;e=e.parentNode}return null}(e.parentElement);t&&t.focus()}e.removeAttribute("tabindex")}},t.getElementsByTagName=function(e){return Array.prototype.slice.call(document.getElementsByTagName(e),0)},t.finalHandler=function(e){return t=>{t.preventDefault(),t.stopPropagation(),e(t)}},t.domContentLoaded=function(){return new Promise((e=>{"complete"===document.readyState||document&&null!==document.body?m.setImmediate(e):window.addEventListener("DOMContentLoaded",e,!1)}))},t.computeScreenAwareSize=function(e){const t=window.devicePixelRatio*e;return Math.max(1,Math.floor(t))/window.devicePixelRatio},t.windowOpenNoOpener=function(e){if(m.isNative||r.isEdgeWebView)window.open(e);else{let t=window.open();t&&(t.opener=null,t.location.href=e)}},t.animate=function(e){const i=()=>{e(),n=(0,t.scheduleAtNextAnimationFrame)(i)};let n=(0,t.scheduleAtNextAnimationFrame)(i);return(0,d.toDisposable)((()=>n.dispose()))}},657:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Relay=t.EventBufferer=t.AsyncEmitter=t.Emitter=t.setGlobalLeakWarningThreshold=t.Event=void 0;const n=i(559),s=i(68);var o;!function(e){const t={dispose(){}};function i(e){return(t,i=null,n)=>{let s=!1;const o=e((e=>{if(!s)return o?o.dispose():s=!0,t.call(i,e)}),null,n);return s&&o.dispose(),o}}function s(e,t){return(i,n=null,s)=>e((e=>i.call(n,t(e))),null,s)}function o(e,t){return(i,n=null,s)=>e((e=>{t(e),i.call(n,e)}),null,s)}function r(e,t){return(i,n=null,s)=>e((e=>t(e)&&i.call(n,e)),null,s)}function a(e,t,i){let n=i;return s(e,(e=>(n=t(n,e),n)))}function u(e){let t,i=!0;return r(e,(e=>{let n=i||e!==t;return i=!1,t=e,n}))}e.None=function(){return t},e.once=i,e.map=s,e.forEach=o,e.filter=r,e.signal=function(e){return e},e.any=function(...e){return(t,i=null,s)=>(0,n.combinedDisposable)(e.map((e=>e((e=>t.call(i,e)),null,s))))},e.reduce=a,e.debounce=function(e,t,i=100,n=!1,s){let o,r,a,u=0;const c=new l({leakWarningThreshold:s,onFirstListenerAdd(){o=e((e=>{u++,r=t(r,e),n&&!a&&c.fire(r),clearTimeout(a),a=setTimeout((()=>{let e=r;r=void 0,a=void 0,(!n||u>1)&&c.fire(e),u=0}),i)}))},onLastListenerRemove(){o.dispose()}});return c.event},e.stopwatch=function(e){const t=(new Date).getTime();return s(i(e),(e=>(new Date).getTime()-t))},e.latch=u,e.buffer=function(e,t=!1,i=[]){let n=i.slice(),s=e((e=>{n?n.push(e):r.fire(e)}));const o=()=>{n&&n.forEach((e=>r.fire(e))),n=null},r=new l({onFirstListenerAdd(){s||(s=e((e=>r.fire(e))))},onFirstListenerDidAdd(){n&&(t?setTimeout(o):o())},onLastListenerRemove(){s&&s.dispose(),s=null}});return r.event},e.echo=function(e,t=!1,i=[]){i=i.slice(),e((e=>{i.push(e),s.fire(e)}));const n=(e,t)=>i.forEach((i=>e.call(t,i))),s=new l({onListenerDidAdd(e,i,s){t?setTimeout((()=>n(i,s))):n(i,s)}});return s.event};class c{constructor(e){this._event=e}get event(){return this._event}map(e){return new c(s(this._event,e))}forEach(e){return new c(o(this._event,e))}filter(e){return new c(r(this._event,e))}reduce(e,t){return new c(a(this._event,e,t))}latch(){return new c(u(this._event))}on(e,t,i){return this._event(e,t,i)}once(e,t,n){return i(this._event)(e,t,n)}}e.chain=function(e){return new c(e)},e.fromNodeEventEmitter=function(e,t,i=(e=>e)){const n=(...e)=>s.fire(i(...e)),s=new l({onFirstListenerAdd:()=>e.on(t,n),onLastListenerRemove:()=>e.removeListener(t,n)});return s.event},e.fromPromise=function(e){const t=new l;let i=!1;return e.then(void 0,(()=>null)).then((()=>{i?t.fire(void 0):setTimeout((()=>t.fire(void 0)),0)})),i=!0,t.event},e.toPromise=function(e){return new Promise((t=>i(e)(t)))}}(o=t.Event||(t.Event={}));let r=-1;t.setGlobalLeakWarningThreshold=function(e){let t=r;return r=e,{dispose(){r=t}}};class a{constructor(e,t=Math.random().toString(18).slice(2,5)){this.customThreshold=e,this.name=t,this._warnCountdown=0}dispose(){this._stacks&&this._stacks.clear()}check(e){let t=r;if("number"==typeof this.customThreshold&&(t=this.customThreshold),t<=0||e{(!i||n{let e=this._stacks.get(i)||0;this._stacks.set(i,e-1)}}}class l{constructor(e){this._disposed=!1,this._options=e,this._leakageMon=r>0?new a(this._options&&this._options.leakWarningThreshold):void 0}get event(){return this._event||(this._event=(e,t,i)=>{this._listeners||(this._listeners=new s.LinkedList);const n=this._listeners.isEmpty();n&&this._options&&this._options.onFirstListenerAdd&&this._options.onFirstListenerAdd(this);const o=this._listeners.push(t?[e,t]:e);let r,a;return n&&this._options&&this._options.onFirstListenerDidAdd&&this._options.onFirstListenerDidAdd(this),this._options&&this._options.onListenerDidAdd&&this._options.onListenerDidAdd(this,e,t),this._leakageMon&&(r=this._leakageMon.check(this._listeners.size)),a={dispose:()=>{r&&r(),a.dispose=l._noop,!this._disposed&&(o(),this._options&&this._options.onLastListenerRemove)&&(this._listeners&&!this._listeners.isEmpty()||this._options.onLastListenerRemove(this))}},Array.isArray(i)&&i.push(a),a}),this._event}fire(e){if(this._listeners){this._deliveryQueue||(this._deliveryQueue=[]);for(let t=this._listeners.iterator(),i=t.next();!i.done;i=t.next())this._deliveryQueue.push([i.value,e]);for(;this._deliveryQueue.length>0;){const[e,t]=this._deliveryQueue.shift();try{"function"==typeof e?e.call(void 0,t):e[0].call(e[1],t)}catch(e){console.error(e)}}}}dispose(){this._listeners&&(this._listeners=void 0),this._deliveryQueue&&(this._deliveryQueue.length=0),this._leakageMon&&this._leakageMon.dispose(),this._disposed=!0}}t.Emitter=l,l._noop=function(){},t.AsyncEmitter=class extends l{async fireAsync(e){if(this._listeners){this._asyncDeliveryQueue||(this._asyncDeliveryQueue=[]);for(let t=this._listeners.iterator(),i=t.next();!i.done;i=t.next()){let t=[];this._asyncDeliveryQueue.push([i.value,e(t,"function"==typeof i.value?i.value:i.value[0]),t])}for(;this._asyncDeliveryQueue.length>0;){const[e,t,i]=this._asyncDeliveryQueue.shift();try{"function"==typeof e?e.call(void 0,t):e[0].call(e[1],t)}catch(e){console.error(e);continue}Object.freeze(i),await Promise.all(i)}}}},t.EventBufferer=class{constructor(){this.buffers=[]}wrapEvent(e){return(t,i,n)=>e((e=>{const n=this.buffers[this.buffers.length-1];n?n.push((()=>t.call(i,e))):t.call(i,e)}),void 0,n)}bufferEvents(e){const t=[];this.buffers.push(t);const i=e();return this.buffers.pop(),t.forEach((e=>e())),i}},t.Relay=class{constructor(){this.listening=!1,this.inputEvent=o.None,this.inputEventListener=n.Disposable.None,this.emitter=new l({onFirstListenerDidAdd:()=>{this.listening=!0,this.inputEventListener=this.inputEvent(this.emitter.fire,this.emitter)},onLastListenerRemove:()=>{this.listening=!1,this.inputEventListener.dispose()}}),this.event=this.emitter.event}set input(e){this.inputEvent=e,this.listening&&(this.inputEventListener.dispose(),this.inputEventListener=e(this.emitter.fire,this.emitter))}dispose(){this.inputEventListener.dispose(),this.emitter.dispose()}}},560:(e,t)=>{var i;Object.defineProperty(t,"__esModule",{value:!0}),t.MappedNavigator=t.MappedIterator=t.ArrayNavigator=t.ArrayIterator=t.getSequenceIterator=t.Iterator=t.FIN=void 0,t.FIN={done:!0,value:void 0},function(e){const i={next:()=>t.FIN};function n(e,t){for(let i=e.next();!i.done;i=e.next())t(i.value)}e.empty=function(){return i},e.fromArray=function(e,i=0,n=e.length){return{next:()=>i>=n?t.FIN:{done:!1,value:e[i++]}}},e.from=function(t){return t?Array.isArray(t)?e.fromArray(t):t:e.empty()},e.map=function(e,i){return{next(){const n=e.next();return n.done?t.FIN:{done:!1,value:i(n.value)}}}},e.filter=function(e,i){return{next(){for(;;){const n=e.next();if(n.done)return t.FIN;if(i(n.value))return{done:!1,value:n.value}}}}},e.forEach=n,e.collect=function(e){const t=[];return n(e,(e=>t.push(e))),t}}(i=t.Iterator||(t.Iterator={})),t.getSequenceIterator=function(e){return Array.isArray(e)?i.fromArray(e):e};class n{constructor(e,t=0,i=e.length,n=t-1){this.items=e,this.start=t,this.end=i,this.index=n}first(){return this.index=this.start,this.current()}next(){return this.index=Math.min(this.index+1,this.end),this.current()}current(){return this.index===this.start-1||this.index===this.end?null:this.items[this.index]}}t.ArrayIterator=n,t.ArrayNavigator=class extends n{constructor(e,t=0,i=e.length,n=t-1){super(e,t,i,n)}current(){return super.current()}previous(){return this.index=Math.max(this.index-1,this.start-1),this.current()}first(){return this.index=this.start,this.current()}last(){return this.index=this.end-1,this.current()}parent(){return null}};class s{constructor(e,t){this.iterator=e,this.fn=t}next(){return this.fn(this.iterator.next())}}t.MappedIterator=s,t.MappedNavigator=class extends s{constructor(e,t){super(e,t),this.navigator=e}current(){return this.fn(this.navigator.current())}previous(){return this.fn(this.navigator.previous())}parent(){return this.fn(this.navigator.parent())}first(){return this.fn(this.navigator.first())}last(){return this.fn(this.navigator.last())}next(){return this.fn(this.navigator.next())}}},146:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResolvedKeybinding=t.ResolvedKeybindingPart=t.ChordKeybinding=t.SimpleKeybinding=t.createSimpleKeybinding=t.createKeybinding=t.KeyChord=t.KeyCodeUtils=void 0;class i{constructor(){this._keyCodeToStr=[],this._strToKeyCode=Object.create(null)}define(e,t){this._keyCodeToStr[e]=t,this._strToKeyCode[t.toLowerCase()]=e}keyCodeToStr(e){return this._keyCodeToStr[e]}strToKeyCode(e){return this._strToKeyCode[e.toLowerCase()]||0}}const n=new i,s=new i,o=new i;function r(e,t){const i=!!(2048&e),n=!!(256&e);return new l(2===t?n:i,!!(1024&e),!!(512&e),2===t?i:n,255&e)}var a;!function(){function e(e,t,i=t,r=i){n.define(e,t),s.define(e,i),o.define(e,r)}e(0,"unknown"),e(1,"Backspace"),e(2,"Tab"),e(3,"Enter"),e(4,"Shift"),e(5,"Ctrl"),e(6,"Alt"),e(7,"PauseBreak"),e(8,"CapsLock"),e(9,"Escape"),e(10,"Space"),e(11,"PageUp"),e(12,"PageDown"),e(13,"End"),e(14,"Home"),e(15,"LeftArrow","Left"),e(16,"UpArrow","Up"),e(17,"RightArrow","Right"),e(18,"DownArrow","Down"),e(19,"Insert"),e(20,"Delete"),e(21,"0"),e(22,"1"),e(23,"2"),e(24,"3"),e(25,"4"),e(26,"5"),e(27,"6"),e(28,"7"),e(29,"8"),e(30,"9"),e(31,"A"),e(32,"B"),e(33,"C"),e(34,"D"),e(35,"E"),e(36,"F"),e(37,"G"),e(38,"H"),e(39,"I"),e(40,"J"),e(41,"K"),e(42,"L"),e(43,"M"),e(44,"N"),e(45,"O"),e(46,"P"),e(47,"Q"),e(48,"R"),e(49,"S"),e(50,"T"),e(51,"U"),e(52,"V"),e(53,"W"),e(54,"X"),e(55,"Y"),e(56,"Z"),e(57,"Meta"),e(58,"ContextMenu"),e(59,"F1"),e(60,"F2"),e(61,"F3"),e(62,"F4"),e(63,"F5"),e(64,"F6"),e(65,"F7"),e(66,"F8"),e(67,"F9"),e(68,"F10"),e(69,"F11"),e(70,"F12"),e(71,"F13"),e(72,"F14"),e(73,"F15"),e(74,"F16"),e(75,"F17"),e(76,"F18"),e(77,"F19"),e(78,"NumLock"),e(79,"ScrollLock"),e(80,";",";","OEM_1"),e(81,"=","=","OEM_PLUS"),e(82,",",",","OEM_COMMA"),e(83,"-","-","OEM_MINUS"),e(84,".",".","OEM_PERIOD"),e(85,"/","/","OEM_2"),e(86,"`","`","OEM_3"),e(110,"ABNT_C1"),e(111,"ABNT_C2"),e(87,"[","[","OEM_4"),e(88,"\\","\\","OEM_5"),e(89,"]","]","OEM_6"),e(90,"'","'","OEM_7"),e(91,"OEM_8"),e(92,"OEM_102"),e(93,"NumPad0"),e(94,"NumPad1"),e(95,"NumPad2"),e(96,"NumPad3"),e(97,"NumPad4"),e(98,"NumPad5"),e(99,"NumPad6"),e(100,"NumPad7"),e(101,"NumPad8"),e(102,"NumPad9"),e(103,"NumPad_Multiply"),e(104,"NumPad_Add"),e(105,"NumPad_Separator"),e(106,"NumPad_Subtract"),e(107,"NumPad_Decimal"),e(108,"NumPad_Divide")}(),(a=t.KeyCodeUtils||(t.KeyCodeUtils={})).toString=function(e){return n.keyCodeToStr(e)},a.fromString=function(e){return n.strToKeyCode(e)},a.toUserSettingsUS=function(e){return s.keyCodeToStr(e)},a.toUserSettingsGeneral=function(e){return o.keyCodeToStr(e)},a.fromUserSettings=function(e){return s.strToKeyCode(e)||o.strToKeyCode(e)},t.KeyChord=function(e,t){return(e|(65535&t)<<16>>>0)>>>0},t.createKeybinding=function(e,t){if(0===e)return null;const i=(65535&e)>>>0,n=(4294901760&e)>>>16;return 0!==n?new u(r(i,t),r(n,t)):r(i,t)},t.createSimpleKeybinding=r;class l{constructor(e,t,i,n,s){this.type=1,this.ctrlKey=e,this.shiftKey=t,this.altKey=i,this.metaKey=n,this.keyCode=s}equals(e){return 1===e.type&&this.ctrlKey===e.ctrlKey&&this.shiftKey===e.shiftKey&&this.altKey===e.altKey&&this.metaKey===e.metaKey&&this.keyCode===e.keyCode}getHashCode(){return`${this.ctrlKey?"1":"0"}${this.shiftKey?"1":"0"}${this.altKey?"1":"0"}${this.metaKey?"1":"0"}${this.keyCode}`}isModifierKey(){return 0===this.keyCode||5===this.keyCode||57===this.keyCode||6===this.keyCode||4===this.keyCode}isDuplicateModifierCase(){return this.ctrlKey&&5===this.keyCode||this.shiftKey&&4===this.keyCode||this.altKey&&6===this.keyCode||this.metaKey&&57===this.keyCode}}t.SimpleKeybinding=l;class u{constructor(e,t){this.type=2,this.firstPart=e,this.chordPart=t}getHashCode(){return`${this.firstPart.getHashCode()};${this.chordPart.getHashCode()}`}}t.ChordKeybinding=u,t.ResolvedKeybindingPart=class{constructor(e,t,i,n,s,o){this.ctrlKey=e,this.shiftKey=t,this.altKey=i,this.metaKey=n,this.keyLabel=s,this.keyAriaLabel=o}},t.ResolvedKeybinding=class{}},559:(e,t)=>{function i(e,...t){return Array.isArray(e)?(e.forEach((e=>e&&e.dispose())),[]):0===t.length?e?(e.dispose(),e):void 0:(i(e),i(t),[])}Object.defineProperty(t,"__esModule",{value:!0}),t.Disposable=t.toDisposable=t.combinedDisposable=t.dispose=t.isDisposable=void 0,t.isDisposable=function(e){return"function"==typeof e.dispose&&0===e.dispose.length},t.dispose=i,t.combinedDisposable=function(e){return{dispose:()=>i(e)}},t.toDisposable=function(e){return{dispose(){e()}}};class n{constructor(){this._toDispose=[],this._lifecycle_disposable_isDisposed=!1}get toDispose(){return this._toDispose}dispose(){this._lifecycle_disposable_isDisposed=!0,this._toDispose=i(this._toDispose)}_register(e){return this._lifecycle_disposable_isDisposed?(console.warn("Registering disposable on object that has already been disposed."),e.dispose()):this._toDispose.push(e),e}}t.Disposable=n,n.None=Object.freeze({dispose(){}})},68:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LinkedList=void 0;const n=i(560);class s{constructor(e){this.element=e}}t.LinkedList=class{constructor(){this._size=0}get size(){return this._size}isEmpty(){return!this._first}clear(){this._first=void 0,this._last=void 0,this._size=0}unshift(e){return this._insert(e,!1)}push(e){return this._insert(e,!0)}_insert(e,t){const i=new s(e);if(this._first)if(t){const e=this._last;this._last=i,i.prev=e,e.next=i}else{const e=this._first;this._first=i,i.next=e,e.prev=i}else this._first=i,this._last=i;return this._size+=1,this._remove.bind(this,i)}shift(){if(this._first){const e=this._first.element;return this._remove(this._first),e}}pop(){if(this._last){const e=this._last.element;return this._remove(this._last),e}}_remove(e){let t=this._first;for(;t instanceof s;){if(t===e){if(t.prev&&t.next){let e=t.prev;e.next=t.next,t.next.prev=e}else t.prev||t.next?t.next?t.prev||(this._first=this._first.next,this._first.prev=void 0):(this._last=this._last.prev,this._last.next=void 0):(this._first=void 0,this._last=void 0);this._size-=1;break}t=t.next}}iterator(){let e,t=this._first;return{next:()=>t?(e?e.value=t.element:e={done:!1,value:t.element},t=t.next,e):n.FIN}}toArray(){let e=[];for(let t=this._first;t instanceof s;t=t.next)e.push(t.element);return e}}},735:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OS=t.setImmediate=t.globals=t.isRootUser=t.platform=t.isWeb=t.isNative=t.isLinux=t.isMacintosh=t.isWindows=t.PlatformToString=void 0;let i=!1,n=!1,s=!1,o=!1,r=!1;const a="undefined"!=typeof process&&void 0!==process.versions&&void 0!==process.versions.electron&&"renderer"===process.type;if("object"!=typeof navigator||a)"object"==typeof process&&(i="win32"===process.platform,n="darwin"===process.platform,s="linux"===process.platform,o=!0);else{const e=navigator.userAgent;i=e.indexOf("Windows")>=0,n=e.indexOf("Macintosh")>=0,s=e.indexOf("Linux")>=0,r=!0}t.PlatformToString=function(e){switch(e){case 0:return"Web";case 1:return"Mac";case 2:return"Linux";case 3:return"Windows"}};let l=0;o&&(n?l=1:i?l=3:s&&(l=2)),t.isWindows=i,t.isMacintosh=n,t.isLinux=s,t.isNative=o,t.isWeb=r,t.platform=l,t.isRootUser=function(){return o&&!i&&0===process.getuid()};const u="object"==typeof global?global:{},c="object"==typeof self?self:u;t.globals=c;let h=null;t.setImmediate=function(e){return null===h&&(h=t.globals.setImmediate?t.globals.setImmediate.bind(t.globals):"undefined"!=typeof process&&"function"==typeof process.nextTick?process.nextTick.bind(process):t.globals.setTimeout.bind(t.globals)),h(e)};const d=i?1:3;t.OS=n?2:d},298:e=>{e.exports=require("electron")},910:e=>{e.exports=JSON.parse("{\"check\":\"\",\"arrow\":\"\",\"radio\":{\"unchecked\":\"\",\"checked\":\"\"},\"windows\":{\"minimize\":\"\",\"maximize\":\"\",\"restore\":\"\",\"close\":\"\"},\"linux\":{\"minimize\":\"\",\"maximize\":\"\",\"restore\":\"\",\"close\":\"\"}}")}},t={};function i(n){var s=t[n];if(void 0!==s)return s.exports;var o=t[n]={id:n,exports:{}};return e[n].call(o.exports,o,o.exports,i),o.exports}return i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var n in t)i.o(t,n)&&!i.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.nc=void 0,i(303)})())); +\ No newline at end of file ++!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var i=t();for(var n in i)("object"==typeof exports?exports:e)[n]=i[n]}}(this,(()=>(()=>{"use strict";var e={526:(e,t,i)=>{i.d(t,{Z:()=>a});var n=i(933),s=i.n(n),o=i(476),r=i.n(o)()(s());r.push([e.id,".cet-menubar{display:flex;flex-shrink:1;box-sizing:border-box;height:30px;overflow:hidden;flex-wrap:wrap}.cet-menubar.bottom{order:1;width:100%;padding:0 5px 5px}.cet-menubar.bottom .cet-menubar-menu-button{border-radius:4px}.cet-menubar.bottom .cet-menubar-menu-button .cet-menubar-menu-title{line-height:26px}.cet-menubar .cet-menubar-menu-button{align-items:center;box-sizing:border-box;padding:0px 8px;height:100%;cursor:default;zoom:1;white-space:nowrap;-webkit-app-region:no-drag;outline:0}.cet-menubar .cet-menubar-menu-button .cet-menubar-menu-title{font-size:12px}.cet-menubar .cet-menubar-menu-button.disabled{opacity:.4}.cet-menubar .cet-menubar-menu-button:not(.disabled):focus,.cet-menubar .cet-menubar-menu-button:not(.disabled).open,.cet-menubar .cet-menubar-menu-button:not(.disabled):hover{background-color:rgba(255,255,255,.1)}.cet-menubar .cet-menubar-menu-container{position:absolute;display:block;left:0px;opacity:1;outline:0;border:none;text-align:left;margin:0 auto;padding:2px 0;margin-left:0;overflow-x:visible;overflow-y:visible;-webkit-overflow-scrolling:touch;justify-content:flex-end;white-space:nowrap;border-radius:7px;backdrop-filter:blur(5px);box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);z-index:99999}.cet-menubar .cet-menubar-menu-container::-webkit-scrollbar{width:8px;height:4px;cursor:pointer;background-color:rbga(0, 0, 0, 0)}.cet-menubar .cet-menubar-menu-container::-webkit-scrollbar-track{border:none;background-color:rbga(0, 0, 0, 0)}.cet-menubar .cet-menubar-menu-container::-webkit-scrollbar-thumb{border-radius:10px;background-color:rgba(110,110,110,.2)}.cet-menubar .cet-menubar-menu-container:focus{outline:0}.cet-menubar .cet-menubar-menu-container .cet-action-item{padding:0;transform:none;display:-ms-flexbox;display:flex;outline:none}.cet-menubar .cet-menubar-menu-container .cet-action-item.active{transform:none}.cet-menubar .cet-menubar-menu-container .cet-action-item.disabled .cet-action-menu-item{opacity:.4}.cet-menubar .cet-menubar-menu-container .cet-action-item .cet-submenu{position:absolute}.cet-menubar .cet-menubar-menu-container .cet-action-menu-item{-ms-flex:1 1 auto;flex:1 1 auto;display:-ms-flexbox;display:flex;height:2.231em;margin:2px 4px;align-items:center;position:relative;border-radius:5px}.cet-menubar .cet-menubar-menu-container .cet-action-label{-ms-flex:1 1 auto;flex:1 1 auto;text-decoration:none;padding:0 1em;background:none;font-size:12px;line-height:1}.cet-menubar .cet-menubar-menu-container .cet-action-label:not(.separator){display:inline-block;-webkit-box-sizing:border-box;-o-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0 2em 0 .8em}.cet-menubar .cet-menubar-menu-container .cet-action-label.separator{opacity:.1;font-size:inherit;margin:1px 0;width:100%;border-bottom:1px solid rgba(0,0,0,0)}.cet-menubar .cet-menubar-menu-container .cet-action-label.separator.text{padding:.7em 1em .1em 1em;font-weight:bold;opacity:1}.cet-menubar .cet-menubar-menu-container .cet-action-label:hover{color:inherit}.cet-menubar .cet-menubar-menu-container .keybinding{padding:0 2em 0 1em}.cet-menubar .cet-menubar-menu-container .keybinding,.cet-menubar .cet-menubar-menu-container .cet-submenu-indicator{display:inline-block;-ms-flex:2 1 auto;flex:2 1 auto;padding:0 3.1em 0 1em;text-align:right;font-size:11px;line-height:1}.cet-menubar .cet-menubar-menu-container .cet-submenu-indicator{position:absolute;right:4px;height:12px;width:12px;padding:0}.cet-menubar .cet-menubar-menu-container .cet-submenu-indicator img,.cet-menubar .cet-menubar-menu-container .cet-submenu-indicator svg,.cet-menubar .cet-menubar-menu-container .cet-menu-item-icon img,.cet-menubar .cet-menubar-menu-container .cet-menu-item-icon svg{display:inherit;width:100%;height:100%}.cet-menubar .cet-menubar-menu-container .cet-action-menu-item.checked>.cet-menu-item-icon.checkbox{visibility:visible}.cet-menubar .cet-menubar-menu-container .cet-menu-item-icon{width:14px;height:14px;margin:0 0 0 .4em}.cet-menubar .cet-menubar-menu-container .cet-menu-item-icon.checkbox{visibility:hidden}",""]);const a=r},29:(e,t,i)=>{i.d(t,{Z:()=>a});var n=i(933),s=i.n(n),o=i(476),r=i.n(o)()(s());r.push([e.id,".cet-titlebar{position:absolute;top:0;left:0;right:0;box-sizing:border-box;width:100%;font-size:13px;padding:0 16px;overflow:hidden;flex-shrink:0;align-items:center;justify-content:center;-webkit-user-select:none;-ms-user-select:none;user-select:none;zoom:1;line-height:22px;height:22px;display:flex;flex-wrap:wrap;z-index:99999}.cet-titlebar.cet-windows,.cet-titlebar.cet-linux{padding:0;height:30px;line-height:30px;justify-content:left;overflow:visible}.cet-titlebar.cet-windows .resizer,.cet-titlebar.cet-linux .resizer{-webkit-app-region:no-drag;position:absolute}.cet-titlebar.cet-windows .resizer.top,.cet-titlebar.cet-linux .resizer.top{top:0;width:100%;height:6px}.cet-titlebar.cet-windows .resizer.left,.cet-titlebar.cet-linux .resizer.left{top:0;left:0;width:6px;height:100%}.cet-titlebar.cet-inverted .cet-menubar,.cet-titlebar.cet-inverted .cet-controls-container{flex-direction:row-reverse}.cet-titlebar.cet-inverted .cet-controls-container{margin:0 5px 0 0}.cet-titlebar.cet-shadow{box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)}.cet-titlebar.cet-first-buttons .cet-controls-container{order:-1;margin:0 5px 0 0}.cet-titlebar .cet-drag-region{top:0;left:0;display:block;position:absolute;width:100%;height:100%;z-index:-1;-webkit-app-region:drag}.cet-titlebar .cet-window-icon{display:flex;align-items:center;justify-content:center;width:34px;height:30px;z-index:99;overflow:hidden}.cet-titlebar .cet-window-icon img{height:16px}.cet-titlebar .cet-window-title{flex:0 1 auto;font-size:13px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;zoom:1}.cet-titlebar .cet-window-title.cet-center{position:absolute;left:50%;transform:translate(-50%, 0)}.cet-titlebar .cet-window-title.cet-bigsur{font-size:13px;font-weight:600}.cet-titlebar .cet-controls-container{display:flex;flex-grow:0;flex-shrink:0;text-align:center;position:relative;z-index:99;-webkit-app-region:no-drag;height:30px;font-family:initial}.cet-titlebar .cet-controls-container .cet-icon{width:46px}.cet-titlebar .cet-controls-container .cet-icon:not(.inactive):hover{background-color:rgba(255,255,255,.3)}.cet-titlebar .cet-controls-container .cet-icon:not(.inactive):active{background-color:rgba(255,255,255,.2)}.cet-titlebar .cet-controls-container .cet-icon.inactive svg{opacity:.4}.cet-titlebar .cet-controls-container .cet-icon.cet-window-close:not(.inactive):hover{background-color:rgba(232,17,35,.9) !important}.cet-titlebar .cet-controls-container .cet-icon.cet-window-close:not(.inactive):active{background-color:rgba(232,17,35,.5) !important}.cet-titlebar .cet-controls-container .cet-icon svg{width:10px;height:-webkit-fill-available;fill:#eee}.cet-titlebar.light .cet-controls-container .cet-icon:not(.inactive):hover{background-color:rgba(0,0,0,.2)}.cet-titlebar.light .cet-controls-container .cet-icon:not(.inactive):active{background-color:rgba(0,0,0,.1)}.cet-titlebar.light .cet-controls-container .cet-icon svg{fill:#333}.cet-titlebar.inactive .cet-window-title,.cet-titlebar.inactive .cet-controls-container .cet-icon svg,.cet-titlebar.inactive .cet-menubar .cet-menubar-menu-button{opacity:.85}.cet-container{position:absolute;left:0;right:0;bottom:0}",""]);const a=r},476:e=>{e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var i="",n=void 0!==t[5];return t[4]&&(i+="@supports (".concat(t[4],") {")),t[2]&&(i+="@media ".concat(t[2]," {")),n&&(i+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),i+=e(t),n&&(i+="}"),t[2]&&(i+="}"),t[4]&&(i+="}"),i})).join("")},t.i=function(e,i,n,s,o){"string"==typeof e&&(e=[[null,e,void 0]]);var r={};if(n)for(var a=0;a0?" ".concat(c[5]):""," {").concat(c[1],"}")),c[5]=o),i&&(c[2]?(c[1]="@media ".concat(c[2]," {").concat(c[1],"}"),c[2]=i):c[2]=i),s&&(c[4]?(c[1]="@supports (".concat(c[4],") {").concat(c[1],"}"),c[4]=s):c[4]="".concat(s)),t.push(c))}},t}},933:e=>{e.exports=function(e){return e[1]}},737:(e,t,i)=>{i.r(t),i.d(t,{default:()=>v});var n=i(892),s=i.n(n),o=i(760),r=i.n(o),a=i(311),l=i.n(a),u=i(192),c=i.n(u),h=i(60),d=i.n(h),m=i(865),p=i.n(m),f=i(526),b={};f.Z&&f.Z.locals&&(b.locals=f.Z.locals);var g,_=0,y={};y.styleTagTransform=p(),y.setAttributes=c(),y.insert=l().bind(null,"head"),y.domAPI=r(),y.insertStyleElement=d(),b.use=function(e){return y.options=e||{},_++||(g=s()(f.Z,y)),b},b.unuse=function(){_>0&&!--_&&(g(),g=null)};const v=b},946:(e,t,i)=>{i.r(t),i.d(t,{default:()=>v});var n=i(892),s=i.n(n),o=i(760),r=i.n(o),a=i(311),l=i.n(a),u=i(192),c=i.n(u),h=i(60),d=i.n(h),m=i(865),p=i.n(m),f=i(29),b={};f.Z&&f.Z.locals&&(b.locals=f.Z.locals);var g,_=0,y={};y.styleTagTransform=p(),y.setAttributes=c(),y.insert=l().bind(null,"head"),y.domAPI=r(),y.insertStyleElement=d(),b.use=function(e){return y.options=e||{},_++||(g=s()(f.Z,y)),b},b.unuse=function(){_>0&&!--_&&(g(),g=null)};const v=b},892:e=>{var t=[];function i(e){for(var i=-1,n=0;n{var t={};e.exports=function(e,i){var n=function(e){if(void 0===t[e]){var i=document.querySelector(e);if(window.HTMLIFrameElement&&i instanceof window.HTMLIFrameElement)try{i=i.contentDocument.head}catch(e){i=null}t[e]=i}return t[e]}(e);if(!n)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");n.appendChild(i)}},60:e=>{e.exports=function(e){var t=document.createElement("style");return e.setAttributes(t,e.attributes),e.insert(t,e.options),t}},192:(e,t,i)=>{e.exports=function(e){var t=i.nc;t&&e.setAttribute("nonce",t)}},760:e=>{e.exports=function(e){var t=e.insertStyleElement(e);return{update:function(i){!function(e,t,i){var n="";i.supports&&(n+="@supports (".concat(i.supports,") {")),i.media&&(n+="@media ".concat(i.media," {"));var s=void 0!==i.layer;s&&(n+="@layer".concat(i.layer.length>0?" ".concat(i.layer):""," {")),n+=i.css,s&&(n+="}"),i.media&&(n+="}"),i.supports&&(n+="}");var o=i.sourceMap;o&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(o))))," */")),t.styleTagTransform(n,e,t.options)}(t,e,i)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}},865:e=>{e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}},418:(e,t)=>{var i;Object.defineProperty(t,"__esModule",{value:!0}),t.MenubarState=void 0,(i=t.MenubarState||(t.MenubarState={}))[i.HIDDEN=0]="HIDDEN",i[i.VISIBLE=1]="VISIBLE",i[i.FOCUSED=2]="FOCUSED",i[i.OPEN=3]="OPEN"},303:function(e,t,i){const n=(this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}})(i(58)),s=i(291);e.exports={Titlebar:n.default,Color:s.Color}},410:function(e,t,i){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.cleanMnemonic=t.CETMenu=t.MENU_ESCAPED_MNEMONIC_REGEX=t.MENU_MNEMONIC_REGEX=void 0;const s=i(291),o=i(359),r=i(146),a=i(735),l=i(324),u=i(440),c=i(559),h=i(657),d=i(266),m=n(i(910)),p=i(238);t.MENU_MNEMONIC_REGEX=/\(&([^\s&])\)|(^|[^&])&([^\s&])/,t.MENU_ESCAPED_MNEMONIC_REGEX=/(&)?(&)([^\s&])/g;class f extends c.Disposable{constructor(e,t,i={},n=(()=>{})){super(),this.triggerKeys={keys:[3,10],keyDown:!0},this.parentData={parent:this},this._onDidCancel=this._register(new h.Emitter),this.menuContainer=e,this.menubarOptions=t,this.options=i,this.closeSubMenu=n,this.items=[],this.focusedItem=void 0,this.mnemonics=new Map,this._register((0,o.addDisposableListener)(this.menuContainer,o.EventType.KEY_DOWN,(e=>{const t=new l.StandardKeyboardEvent(e);let i=!0;t.equals(16)?this.focusPrevious():t.equals(18)?this.focusNext():t.equals(9)?this.cancel():this.isTriggerKeyEvent(t)?this.triggerKeys&&this.triggerKeys.keyDown&&this.doTrigger(t):i=!1,i&&(t.preventDefault(),t.stopPropagation())}))),this._register((0,o.addDisposableListener)(this.menuContainer,o.EventType.KEY_UP,(e=>{const t=new l.StandardKeyboardEvent(e);this.isTriggerKeyEvent(t)?(this.triggerKeys&&!this.triggerKeys.keyDown&&this.doTrigger(t),t.preventDefault(),t.stopPropagation()):(t.equals(2)||t.equals(1026))&&this.updateFocusedItem()}))),i.enableMnemonics&&this._register((0,o.addDisposableListener)(this.menuContainer,o.EventType.KEY_DOWN,(e=>{const t=r.KeyCodeUtils.fromString(e.key);if(this.mnemonics.has(t)){const i=this.mnemonics.get(t);if(1===i.length&&(i[0]instanceof b&&this.focusItemByElement(i[0].getContainer()),i[0].onClick(e)),i.length>1){const e=i.shift();e&&(this.focusItemByElement(e.getContainer()),i.push(e)),this.mnemonics.set(t,i)}}}))),a.isLinux&&this._register((0,o.addDisposableListener)(this.menuContainer,o.EventType.KEY_DOWN,(e=>{const t=new l.StandardKeyboardEvent(e);t.equals(14)||t.equals(11)?(this.focusedItem=this.items.length-1,this.focusNext(),o.EventHelper.stop(e,!0)):(t.equals(13)||t.equals(12))&&(this.focusedItem=0,this.focusPrevious(),o.EventHelper.stop(e,!0))}))),this._register((0,o.addDisposableListener)(this.menuContainer,o.EventType.MOUSE_OUT,(e=>{let t=e.relatedTarget;(0,o.isAncestor)(t,this.menuContainer)||(this.focusedItem=void 0,this.updateFocus(),e.stopPropagation())}))),this._register((0,o.addDisposableListener)(this.menuContainer,o.EventType.MOUSE_UP,(e=>{o.EventHelper.stop(e,!0)}))),this._register((0,o.addDisposableListener)(this.menuContainer,o.EventType.MOUSE_OVER,(e=>{let t=e.target;if(t&&(0,o.isAncestor)(t,this.menuContainer)&&t!==this.menuContainer){for(;t.parentElement!==this.menuContainer&&null!==t.parentElement;)t=t.parentElement;if((0,o.hasClass)(t,"cet-action-item")){const e=this.focusedItem;this.setFocusedItem(t),e!==this.focusedItem&&this.updateFocus()}}}))),this.options.ariaLabel&&this.menuContainer.setAttribute("aria-label",this.options.ariaLabel)}get onDidCancel(){return this._onDidCancel.event}setAriaLabel(e){e?this.menuContainer.setAttribute("aria-label",e):this.menuContainer.removeAttribute("aria-label")}isTriggerKeyEvent(e){let t=!1;return this.triggerKeys&&this.triggerKeys.keys.forEach((i=>{t=t||e.equals(i)})),t}updateFocusedItem(){for(let e=0;e{if(!e)return;const t=document.createElement("li");t.className="cet-action-item",t.setAttribute("role","presentation"),this._register((0,o.addDisposableListener)(t,o.EventType.CONTEXT_MENU,(e=>{e.preventDefault(),e.stopPropagation()})));let i=null;if("separator"===e.type)i=new g(e,this.options);else if("submenu"===e.type||e.submenu){const t=e.submenu.items;if(i=new b(e,t,this.parentData,this.menubarOptions,this.options,this.closeSubMenu),this.options.enableMnemonics){const e=i.getMnemonic();if(e&&i.isEnabled()){let t=[];this.mnemonics.has(e)&&(t=this.mnemonics.get(e)),t.push(i),this.mnemonics.set(e,t)}}}else{const t={enableMnemonics:this.options.enableMnemonics};if(i=new u.CETMenuItem(e,t,this.menubarOptions,this.closeSubMenu,this.items),this.options.enableMnemonics){const e=i.getMnemonic();if(e&&i.isEnabled()){let t=[];this.mnemonics.has(e)&&(t=this.mnemonics.get(e)),t.push(i),this.mnemonics.set(e,t)}}}i.render(t),this.menuContainer.appendChild(t),this.items.push(i)}))}focus(e){let t,i=!1;void 0===e?i=!0:"number"==typeof e?t=e:"boolean"==typeof e&&(i=e),i&&void 0===this.focusedItem?(this.focusedItem=this.items.length-1,this.focusNext()):(void 0!==t&&(this.focusedItem=t),this.updateFocus())}focusNext(){void 0===this.focusedItem&&(this.focusedItem=this.items.length-1);const e=this.focusedItem;let t;do{this.focusedItem=(this.focusedItem+1)%this.items.length,t=this.items[this.focusedItem]}while(this.focusedItem!==e&&!t.isEnabled()||t.isSeparator());(this.focusedItem===e&&!t.isEnabled()||t.isSeparator())&&(this.focusedItem=void 0),this.updateFocus()}focusPrevious(){void 0===this.focusedItem&&(this.focusedItem=0);const e=this.focusedItem;let t;do{this.focusedItem=this.focusedItem-1,this.focusedItem<0&&(this.focusedItem=this.items.length-1),t=this.items[this.focusedItem]}while(this.focusedItem!==e&&!t.isEnabled()||t.isSeparator());(this.focusedItem===e&&!t.isEnabled()||t.isSeparator())&&(this.focusedItem=void 0),this.updateFocus()}updateFocus(){void 0===this.focusedItem&&this.menuContainer.focus();for(let e=0;e=100)&&(i=100);const n=i/100,o=e.backgroundColor?.rgba,r=new s.Color(new s.RGBA(o.r,o.g,o.b,n));t.style.backgroundColor=r.toString()}this.items&&this.items.forEach((t=>{(t instanceof u.CETMenuItem||t instanceof g)&&t.style(e)}))}focusItemByElement(e){const t=this.focusedItem;e&&this.setFocusedItem(e),t!==this.focusedItem&&this.updateFocus()}setFocusedItem(e){for(let t=0;t{})){super(e,s,n,r),this.submenuItems=t,this.parentData=i,this.submenuOptions=s,this.submenuDisposables=[],this.mouseOver=!1,this.showScheduler=new d.RunOnceScheduler((()=>{this.mouseOver&&(this.cleanupExistingSubmenu(!1),this.createSubmenu(!1))}),250),this.hideScheduler=new d.RunOnceScheduler((()=>{this.container&&!(0,o.isAncestor)(document.activeElement,this.container)&&this.parentData.submenu===this.mysubmenu&&(this.parentData.parent.focus(!1),this.cleanupExistingSubmenu(!0))}),750)}render(e){super.render(e),this.itemElement&&((0,o.addClass)(this.itemElement,"cet-submenu-item"),this.itemElement.setAttribute("aria-haspopup","true"),this.submenuIndicator=(0,o.append)(this.itemElement,(0,o.$)("span.cet-submenu-indicator")),this.submenuIndicator.innerHTML=m.default.arrow,(0,p.applyFill)(this.submenuIndicator.firstElementChild,this.menubarOptions?.svgColor,this.menuStyle?.foregroundColor),this.submenuIndicator.setAttribute("aria-hidden","true"),this.container&&((0,o.addDisposableListener)(this.container,o.EventType.KEY_UP,(e=>{let t=new l.StandardKeyboardEvent(e);(t.equals(17)||t.equals(3))&&(o.EventHelper.stop(e,!0),this.createSubmenu(!0))})),(0,o.addDisposableListener)(this.container,o.EventType.KEY_DOWN,(e=>{let t=new l.StandardKeyboardEvent(e);(t.equals(17)||t.equals(3))&&o.EventHelper.stop(e,!0)})),(0,o.addDisposableListener)(this.container,o.EventType.MOUSE_OVER,(e=>{this.mouseOver||(this.mouseOver=!0,this.showScheduler.schedule())})),(0,o.addDisposableListener)(this.container,o.EventType.MOUSE_LEAVE,(e=>{this.mouseOver=!1})),(0,o.addDisposableListener)(this.container,o.EventType.FOCUS_OUT,(e=>{this.container&&!(0,o.isAncestor)(document.activeElement,this.container)&&this.hideScheduler.schedule()}))))}onClick(e){o.EventHelper.stop(e,!0),this.cleanupExistingSubmenu(!1),this.createSubmenu(!1)}cleanupExistingSubmenu(e){this.parentData.submenu&&(e||this.parentData.submenu!==this.mysubmenu)&&(this.parentData.submenu.dispose(),this.parentData.submenu=void 0,this.submenuContainer&&(this.submenuContainer=void 0))}createSubmenu(e=!0){if(this.itemElement&&this.container)if(this.parentData.submenu)this.parentData.submenu.focus(!1);else{this.submenuContainer=(0,o.append)(this.container,(0,o.$)("ul.cet-submenu")),(0,o.addClasses)(this.submenuContainer,"cet-menubar-menu-container"),this.parentData.submenu=new f(this.submenuContainer,this.menubarOptions,this.submenuOptions,this.closeSubMenu),this.parentData.submenu.createMenu(this.submenuItems),this.menuStyle&&this.parentData.submenu.style(this.menuStyle);const t=this.container.getBoundingClientRect(),i=this.submenuContainer.getBoundingClientRect(),n=getComputedStyle(this.parentData.parent.getContainer()),s=parseFloat(n.paddingTop||"0")||0;window.innerWidth<=t.right+i.width?(this.submenuContainer.style.left="10px",this.submenuContainer.style.top=`${this.container.offsetTop+t.height}px`):(this.submenuContainer.style.left=`${this.container.offsetWidth}px`,this.submenuContainer.style.top=this.container.offsetTop-s+"px"),this.submenuDisposables.push((0,o.addDisposableListener)(this.submenuContainer,o.EventType.KEY_UP,(e=>{new l.StandardKeyboardEvent(e).equals(15)&&(o.EventHelper.stop(e,!0),this.parentData.parent.focus(),this.parentData.submenu&&(this.parentData.submenu.dispose(),this.parentData.submenu=void 0),this.submenuDisposables=(0,c.dispose)(this.submenuDisposables),this.submenuContainer=void 0)}))),this.submenuDisposables.push((0,o.addDisposableListener)(this.submenuContainer,o.EventType.KEY_DOWN,(e=>{new l.StandardKeyboardEvent(e).equals(15)&&o.EventHelper.stop(e,!0)}))),this.submenuDisposables.push(this.parentData.submenu.onDidCancel((()=>{this.parentData.parent.focus(),this.parentData.submenu&&(this.parentData.submenu.dispose(),this.parentData.submenu=void 0),this.submenuDisposables=(0,c.dispose)(this.submenuDisposables),this.submenuContainer=void 0}))),this.parentData.submenu.focus(e),this.mysubmenu=this.parentData.submenu}}applyStyle(){if(super.applyStyle(),!this.menuStyle)return;const e=this.container&&(0,o.hasClass)(this.container,"focused")&&this.menuStyle.selectionForegroundColor?this.menuStyle.selectionForegroundColor:this.menuStyle.foregroundColor;(0,p.applyFill)(this.submenuIndicator?.firstElementChild,this.menubarOptions?.svgColor,e),this.parentData.submenu&&this.parentData.submenu.style(this.menuStyle)}dispose(){super.dispose(),this.hideScheduler.dispose(),this.mysubmenu&&(this.mysubmenu.dispose(),this.mysubmenu=null),this.submenuContainer&&(this.submenuDisposables=(0,c.dispose)(this.submenuDisposables),this.submenuContainer=void 0)}}class g extends u.CETMenuItem{constructor(e,t){super(e,t)}render(e){e&&(this.separatorElement=(0,o.append)(e,(0,o.$)("a.cet-action-label")),this.separatorElement.setAttribute("role","presentation"),(0,o.addClass)(this.separatorElement,"separator"))}style(e){this.separatorElement&&e.separatorColor&&(this.separatorElement.style.borderBottomColor=e.separatorColor.toString())}}t.cleanMnemonic=function(e){const i=t.MENU_MNEMONIC_REGEX,n=i.exec(e);if(!n)return e;const s=!n[1];return e.replace(i,s?"$2$3":"").trim()}},178:function(e,t,i){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.escape=t.Menubar=void 0;const s=i(298),o=i(359),r=i(410),a=i(324),l=i(146),u=i(559),c=i(657),h=i(478),d=i(735),m=i(418),p=n(i(737));t.Menubar=class{constructor(e,t,i=(()=>{})){this.container=e,this.options=t,p.default.use(),this.menuItems=[],this.mnemonics=new Map,this.closeSubMenu=i,this._focusState=m.MenubarState.VISIBLE,this._onVisibilityChange=new c.Emitter,this._onFocusStateChange=new c.Emitter,f.getInstance().event(this.onModifierKeyToggled,this),(0,o.addDisposableListener)(this.container,o.EventType.KEY_DOWN,(e=>{let t=new a.StandardKeyboardEvent(e),i=!0;const n=e.key?l.KeyCodeUtils.fromString(e.key):0;if(t.equals(15))this.focusPrevious();else if(t.equals(17))this.focusNext();else if(t.equals(9)&&this.isFocused&&!this.isOpen)this.setUnfocusedState();else if(!this.isOpen&&!t.ctrlKey&&this.options?.enableMnemonics&&this.mnemonicsInUse&&this.mnemonics.has(n)){const e=this.mnemonics.get(n);this.onMenuTriggered(e,!1)}else i=!1;i&&(t.preventDefault(),t.stopPropagation())})),(0,o.addDisposableListener)(window,o.EventType.MOUSE_DOWN,(()=>{this.isFocused&&this.setUnfocusedState()})),(0,o.addDisposableListener)(this.container,o.EventType.FOCUS_IN,(e=>{e.relatedTarget&&(this.container.contains(e.relatedTarget)||(this.focusToReturn=e.relatedTarget))})),(0,o.addDisposableListener)(this.container,o.EventType.FOCUS_OUT,(e=>{e.relatedTarget&&(this.container.contains(e.relatedTarget)||(this.focusToReturn=void 0,this.setUnfocusedState()))})),(0,o.addDisposableListener)(window,o.EventType.KEY_DOWN,(e=>{if(!this.options?.enableMnemonics||!e.altKey||e.ctrlKey||e.defaultPrevented)return;const t=l.KeyCodeUtils.fromString(e.key);if(!this.mnemonics.has(t))return;this.mnemonicsInUse=!0,this.updateMnemonicVisibility(!0);const i=this.mnemonics.get(t);this.onMenuTriggered(i,!1)})),this.setUnfocusedState(),this.registerListeners()}registerListeners(){d.isMacintosh||(0,o.addDisposableListener)(window,o.EventType.RESIZE,(()=>{this.blur()}))}setupMenubar(){const e=this.options?.menu?.items;this.onFocusStateChange((e=>this._onFocusStateChange.fire(e))),this.onVisibilityChange((e=>this._onVisibilityChange.fire(e))),e?.forEach((e=>{if(!e)return;const t=this.menuItems.length,i=(0,r.cleanMnemonic)(e.label),n=(0,o.$)("div.cet-menubar-menu-button",{tabindex:-1,"aria-label":i,"aria-haspopup":!0});e.enabled||(0,o.addClass)(n,"disabled");const s=(0,o.$)("div.cet-menubar-menu-title",{"aria-hidden":!0});n.appendChild(s),(0,o.append)(this.container,n);let l=r.MENU_MNEMONIC_REGEX.exec(e.label);if(l){let e=l[1]?l[1]:l[2];this.registerMnemonic(this.menuItems.length,e)}this.updateLabels(s,n,e.label),e.enabled&&((0,o.addDisposableListener)(n,o.EventType.KEY_UP,(e=>{let i=new a.StandardKeyboardEvent(e),n=!0;!i.equals(18)&&!i.equals(3)||this.isOpen?n=!1:(this.focusedMenu={index:t},this.openedViaKeyboard=!0,this.focusState=m.MenubarState.OPEN),n&&(i.preventDefault(),i.stopPropagation())})),(0,o.addDisposableListener)(n,o.EventType.MOUSE_DOWN,(e=>{this.isOpen?this.ignoreNextMouseUp=!1:(this.ignoreNextMouseUp=!0,this.onMenuTriggered(t,!0)),e.preventDefault(),e.stopPropagation()})),(0,o.addDisposableListener)(n,o.EventType.MOUSE_UP,(()=>{this.ignoreNextMouseUp?this.ignoreNextMouseUp=!1:this.isFocused&&this.onMenuTriggered(t,!0)})),(0,o.addDisposableListener)(n,o.EventType.MOUSE_ENTER,(()=>{this.isOpen&&!this.isCurrentMenu(t)?(this.menuItems[t].buttonElement.focus(),this.cleanupMenu(),this.menuItems[t].submenu&&this.showMenu(t,!1)):this.isFocused&&!this.isOpen&&(this.focusedMenu={index:t},n.focus())})),this.menuItems.push({menuItem:e,submenu:e.submenu,buttonElement:n,titleElement:s}))}))}onClick(e){const t=this.menuItems[e].menuItem;s.ipcRenderer.send("menu-event",t.commandId)}get onVisibilityChange(){return this._onVisibilityChange.event}get onFocusStateChange(){return this._onFocusStateChange.event}dispose(){this.menuItems.forEach((e=>{(0,o.removeNode)(e.titleElement),(0,o.removeNode)(e.buttonElement)}))}blur(){this.setUnfocusedState()}setStyles(e){this.menuStyle=e}updateLabels(e,t,i){const n=(0,r.cleanMnemonic)(i);if(this.options?.enableMnemonics){let t=b(i);r.MENU_ESCAPED_MNEMONIC_REGEX.lastIndex=0;let n=r.MENU_ESCAPED_MNEMONIC_REGEX.exec(t);for(;n&&n[1];)n=r.MENU_ESCAPED_MNEMONIC_REGEX.exec(t);n&&(t=`${t.substr(0,n.index)}${t.substr(n.index+n[0].length)}`),t=t.replace(/&&/g,"&"),e.innerHTML=t}else e.innerHTML=n.replace(/&&/g,"&");let s=r.MENU_MNEMONIC_REGEX.exec(i);if(s){let e=s[1]?s[1]:s[3];this.options?.enableMnemonics?t.setAttribute("aria-keyshortcuts","Alt+"+e.toLocaleLowerCase()):t.removeAttribute("aria-keyshortcuts")}}registerMnemonic(e,t){this.mnemonics.set(l.KeyCodeUtils.fromString(t),e)}hideMenubar(){"none"!==this.container.style.display&&(this.container.style.display="none")}showMenubar(){"flex"!==this.container.style.display&&(this.container.style.display="flex")}get focusState(){return this._focusState}set focusState(e){if(e===this._focusState)return;const t=this.isVisible,i=this.isOpen,n=this.isFocused;switch(this._focusState=e,e){case m.MenubarState.HIDDEN:t&&this.hideMenubar(),i&&this.cleanupMenu(),n&&(this.focusedMenu=void 0,this.focusToReturn&&(this.focusToReturn.focus(),this.focusToReturn=void 0));break;case m.MenubarState.VISIBLE:t||this.showMenubar(),i&&this.cleanupMenu(),n&&(this.focusedMenu&&this.menuItems[this.focusedMenu.index]?.buttonElement.blur(),this.focusedMenu=void 0,this.focusToReturn&&(this.focusToReturn.focus(),this.focusToReturn=void 0));break;case m.MenubarState.FOCUSED:t||this.showMenubar(),i&&this.cleanupMenu(),this.focusedMenu&&this.menuItems[this.focusedMenu.index]?.buttonElement.focus();break;case m.MenubarState.OPEN:t||this.showMenubar(),this.focusedMenu&&this.menuItems[this.focusedMenu.index].submenu&&this.showMenu(this.focusedMenu.index,this.openedViaKeyboard)}this._focusState=e}get isVisible(){return this.focusState>=m.MenubarState.VISIBLE}get isFocused(){return this.focusState>=m.MenubarState.FOCUSED}get isOpen(){return this.focusState>=m.MenubarState.OPEN}setUnfocusedState(){this.focusState=m.MenubarState.VISIBLE,this.ignoreNextMouseUp=!1,this.mnemonicsInUse=!1,this.updateMnemonicVisibility(!1)}focusPrevious(){if(!this.focusedMenu)return;let e=(this.focusedMenu.index-1+this.menuItems.length)%this.menuItems.length;e!==this.focusedMenu.index&&(this.isOpen?(this.cleanupMenu(),this.menuItems[e].submenu&&this.showMenu(e)):this.isFocused&&(this.focusedMenu.index=e,this.menuItems[e].buttonElement.focus()))}focusNext(){if(!this.focusedMenu)return;let e=(this.focusedMenu.index+1)%this.menuItems.length;e!==this.focusedMenu.index&&(this.isOpen?(this.cleanupMenu(),this.menuItems[e].submenu&&this.showMenu(e)):this.isFocused&&(this.focusedMenu.index=e,this.menuItems[e].buttonElement.focus()))}updateMnemonicVisibility(e){this.menuItems&&this.menuItems.forEach((t=>{if(t.titleElement.children.length){let i=t.titleElement.children.item(0);i&&e&&(i.style.textDecoration="underline")}}))}get mnemonicsInUse(){return this._mnemonicsInUse}set mnemonicsInUse(e){this._mnemonicsInUse=e}onMenuTriggered(e,t){this.isOpen?this.isCurrentMenu(e)?this.setUnfocusedState():(this.cleanupMenu(),this.menuItems[e].submenu?this.showMenu(e,this.openedViaKeyboard):this.menuItems[e].menuItem.enabled&&this.onClick(e)):(this.focusedMenu={index:e},this.openedViaKeyboard=!t,this.menuItems[e].submenu?this.focusState=m.MenubarState.OPEN:this.menuItems[e].menuItem.enabled&&this.onClick(e))}onModifierKeyToggled(e){const t=!e.altKey&&!e.ctrlKey&&!e.shiftKey;this.isFocused&&"alt"===e.lastKeyPressed&&e.altKey&&(this.setUnfocusedState(),this.mnemonicsInUse=!1,this.awaitingAltRelease=!0),t&&"alt"===e.lastKeyPressed&&"alt"===e.lastKeyReleased&&(this.awaitingAltRelease||(this.isFocused?this.isOpen||this.setUnfocusedState():(this.mnemonicsInUse=!0,this.focusedMenu={index:0},this.focusState=m.MenubarState.FOCUSED))),e.altKey||"alt"!==e.lastKeyReleased||(this.awaitingAltRelease=!1),this.options?.enableMnemonics&&this.menuItems&&!this.isOpen&&this.updateMnemonicVisibility(!this.awaitingAltRelease&&e.altKey||this.mnemonicsInUse)}isCurrentMenu(e){return!!this.focusedMenu&&this.focusedMenu.index===e}cleanupMenu(){this.focusedMenu&&(this.menuItems[this.focusedMenu.index].buttonElement.focus(),this.focusedMenu.holder&&(this.focusedMenu.holder.parentElement&&(0,o.removeClass)(this.focusedMenu.holder.parentElement,"open"),this.focusedMenu.holder.remove()),this.focusedMenu.widget&&this.focusedMenu.widget.dispose(),this.focusedMenu={index:this.focusedMenu.index})}showMenu(e,t=!0){const i=this.menuItems[e],n=i.buttonElement,s=n.getBoundingClientRect(),a=(0,o.$)("ul.cet-menubar-menu-container");(0,o.addClass)(n,"open"),a.tabIndex=0,a.style.top=s.bottom-5+"px",a.style.left=`${s.left}px`,n.appendChild(a),a.style.maxHeight=`${Math.max(10,window.innerHeight-s.top-50)}px`;let l={enableMnemonics:this.mnemonicsInUse&&this.options?.enableMnemonics,ariaLabel:n.attributes.getNamedItem("aria-label")?.value},u=new r.CETMenu(a,this.options,l,this.closeSubMenu);u.createMenu(i.submenu?.items),u.style(this.menuStyle),u.onDidCancel((()=>{this.focusState=m.MenubarState.FOCUSED})),u.focus(t),this.focusedMenu={index:e,holder:a,widget:u}}};class f extends c.Emitter{constructor(){super(),this._subscriptions=[],this._keyStatus={altKey:!1,shiftKey:!1,ctrlKey:!1},this._subscriptions.push((0,h.domEvent)(document.body,"keydown",!0)((e=>{const t=new a.StandardKeyboardEvent(e);if(e.altKey&&!this._keyStatus.altKey)this._keyStatus.lastKeyPressed="alt";else if(e.ctrlKey&&!this._keyStatus.ctrlKey)this._keyStatus.lastKeyPressed="ctrl";else if(e.shiftKey&&!this._keyStatus.shiftKey)this._keyStatus.lastKeyPressed="shift";else{if(6===t.keyCode)return;this._keyStatus.lastKeyPressed=void 0}this._keyStatus.altKey=e.altKey,this._keyStatus.ctrlKey=e.ctrlKey,this._keyStatus.shiftKey=e.shiftKey,this._keyStatus.lastKeyPressed&&this.fire(this._keyStatus)}))),this._subscriptions.push((0,h.domEvent)(document.body,"keyup",!0)((e=>{!e.altKey&&this._keyStatus.altKey?this._keyStatus.lastKeyReleased="alt":!e.ctrlKey&&this._keyStatus.ctrlKey?this._keyStatus.lastKeyReleased="ctrl":!e.shiftKey&&this._keyStatus.shiftKey?this._keyStatus.lastKeyReleased="shift":this._keyStatus.lastKeyReleased=void 0,this._keyStatus.lastKeyPressed!==this._keyStatus.lastKeyReleased&&(this._keyStatus.lastKeyPressed=void 0),this._keyStatus.altKey=e.altKey,this._keyStatus.ctrlKey=e.ctrlKey,this._keyStatus.shiftKey=e.shiftKey,this._keyStatus.lastKeyReleased&&this.fire(this._keyStatus)}))),this._subscriptions.push((0,h.domEvent)(document.body,"mousedown",!0)((e=>{this._keyStatus.lastKeyPressed=void 0}))),this._subscriptions.push((0,h.domEvent)(window,"blur")((e=>{this._keyStatus.lastKeyPressed=void 0,this._keyStatus.lastKeyReleased=void 0,this._keyStatus.altKey=!1,this._keyStatus.shiftKey=!1,this._keyStatus.shiftKey=!1,this.fire(this._keyStatus)})))}static getInstance(){return f.instance||(f.instance=new f),f.instance}dispose(){super.dispose(),this._subscriptions=(0,u.dispose)(this._subscriptions)}}function b(e){return e.replace(/[<>&]/g,(function(e){switch(e){case"<":return"<";case">":return">";case"&":return"&";default:return e}}))}t.escape=b},440:function(e,t,i){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.CETMenuItem=void 0;const s=i(298),o=i(359),r=i(410),a=i(146),l=i(559),u=i(735),c=n(i(910)),h=i(238);class d extends l.Disposable{constructor(e,t={},i,n=(()=>{}),s){if(super(),this.item=e,this.menubarOptions=i,this.options=t,this.closeSubMenu=n,s&&(this.menuContainer=s),this.item.label&&t.enableMnemonics){let e=this.item.label;if(e){let t=r.MENU_MNEMONIC_REGEX.exec(e);t&&(this.mnemonic=a.KeyCodeUtils.fromString((t[1]?t[1]:t[2]).toLocaleUpperCase()))}}}getContainer(){return this.container}getItem(){return this.item}isEnabled(){return this.item.enabled}isSeparator(){return"separator"===this.item.type}render(e){this.container=e,this._register((0,o.addDisposableListener)(this.container,o.EventType.MOUSE_DOWN,(e=>{this.item.enabled&&0===e.button&&this.container&&(0,o.addClass)(this.container,"active")}))),this._register((0,o.addDisposableListener)(this.container,o.EventType.CLICK,(e=>{this.item.enabled&&this.onClick(e)}))),this._register((0,o.addDisposableListener)(this.container,o.EventType.DBLCLICK,(e=>{o.EventHelper.stop(e,!0)}))),[o.EventType.MOUSE_UP,o.EventType.MOUSE_OUT].forEach((e=>{this._register((0,o.addDisposableListener)(this.container,e,(e=>{o.EventHelper.stop(e),(0,o.removeClass)(this.container,"active")})))})),this.itemElement=(0,o.append)(this.container,(0,o.$)("a.cet-action-menu-item")),this.mnemonic&&this.itemElement.setAttribute("aria-keyshortcuts",`${this.mnemonic}`),this.iconElement=(0,o.append)(this.itemElement,(0,o.$)("span.cet-menu-item-icon")),this.iconElement.setAttribute("role","none"),this.labelElement=(0,o.append)(this.itemElement,(0,o.$)("span.cet-action-label")),this.setAccelerator(),this.updateLabel(),this.updateIcon(),this.updateTooltip(),this.updateEnabled(),this.updateChecked(),this.updateVisibility()}onClick(e){o.EventHelper.stop(e,!0),s.ipcRenderer.send("menu-event",this.item.commandId),"checkbox"===this.item.type?(this.item.checked=!this.item.checked,this.updateChecked()):"radio"===this.item.type?this.updateRadioGroup():this.closeSubMenu()}focus(){this.container&&(this.container.focus(),(0,o.addClass)(this.container,"focused")),this.applyStyle()}blur(){this.container&&(this.container.blur(),(0,o.removeClass)(this.container,"focused")),this.applyStyle()}setAccelerator(){var e=null;if(this.item.role)switch(this.item.role.toLocaleLowerCase()){case"undo":e="CtrlOrCmd+Z";break;case"redo":e="CtrlOrCmd+Y";break;case"cut":e="CtrlOrCmd+X";break;case"copy":e="CtrlOrCmd+C";break;case"paste":e="CtrlOrCmd+V";break;case"selectall":e="CtrlOrCmd+A";break;case"minimize":e="CtrlOrCmd+M";break;case"close":e="CtrlOrCmd+W";break;case"reload":e="CtrlOrCmd+R";break;case"forcereload":e="CtrlOrCmd+Shift+R";break;case"toggledevtools":e="CtrlOrCmd+Shift+I";break;case"togglefullscreen":e="F11";break;case"resetzoom":e="CtrlOrCmd+0";break;case"zoomin":e="CtrlOrCmd+Shift+=";break;case"zoomout":e="CtrlOrCmd+-"}this.item.label&&this.item.accelerator&&(e=this.item.accelerator),this.itemElement&&null!==e&&((0,o.append)(this.itemElement,(0,o.$)("span.keybinding")).textContent=m(e))}updateLabel(){if(this.item.label){let e=this.item.label;if(e){const t=(0,r.cleanMnemonic)(e);this.options.enableMnemonics||(e=t),this.labelElement&&this.labelElement.setAttribute("aria-label",t.replace(/&&/g,"&"));const i=r.MENU_MNEMONIC_REGEX.exec(e);if(i){e=escape(e),r.MENU_ESCAPED_MNEMONIC_REGEX.lastIndex=0;let t=r.MENU_ESCAPED_MNEMONIC_REGEX.exec(e);for(;t&&t[1];)t=r.MENU_ESCAPED_MNEMONIC_REGEX.exec(e);t&&(e=`${e.substr(0,t.index)}${e.substr(t.index+t[0].length)}`),e=e.replace(/&&/g,"&"),this.itemElement&&this.itemElement.setAttribute("aria-keyshortcuts",(i[1]?i[1]:i[3]).toLocaleLowerCase())}else e=e.replace(/&&/g,"&")}this.labelElement&&(this.labelElement.innerHTML=e.trim())}}updateIcon(){if(this.item.icon){const e=this.item.icon;this.iconElement&&e&&(0,o.append)(this.iconElement,(0,o.$)("img")).setAttribute("src",e.toString())}else this.iconElement&&"checkbox"===this.item.type?((0,o.addClass)(this.iconElement,"checkbox"),this.iconElement.innerHTML=c.default.check):"radio"===this.item.type&&((0,o.addClass)(this.iconElement,"radio"),this.iconElement.innerHTML=this.item.checked?c.default.radio.checked:c.default.radio.unchecked);(0,h.applyFill)(this.iconElement?.firstElementChild,this.menubarOptions?.svgColor,this.menuStyle?.foregroundColor)}updateTooltip(){let e=null;this.item.sublabel?e=this.item.sublabel:!this.item.label&&this.item.label&&this.item.icon&&(e=this.item.label,this.item.accelerator&&(e=m(this.item.accelerator))),this.itemElement&&e&&(this.itemElement.title=e)}updateEnabled(){this.container&&(this.item.enabled&&"separator"!==this.item.type?((0,o.removeClass)(this.container,"disabled"),this.container.tabIndex=0):(0,o.addClass)(this.container,"disabled"))}updateVisibility(){!1===this.item.visible&&this.itemElement&&this.itemElement.remove()}updateChecked(){this.itemElement&&(this.item.checked?((0,o.addClass)(this.itemElement,"checked"),this.itemElement.setAttribute("aria-checked","true")):((0,o.removeClass)(this.itemElement,"checked"),this.itemElement.setAttribute("aria-checked","false")))}updateRadioGroup(){if(void 0===this.radioGroup&&(this.radioGroup=this.getRadioGroup()),this.menuContainer)for(let e=this.radioGroup.start;e=11,b="60px",g=f?"28px":"22px",_="30px";t.default=class{constructor(e){this._defaultOptions={titleHorizontalAlignment:"center",menuPosition:"left",enableMnemonics:!0,minimizable:!0,maximizable:!0,closeable:!0},this._closeMenu=()=>{this._menubar&&this._menubar.blur()},this._options={...this._defaultOptions,...e},this._platformIcons=u.default[(0,o.PlatformToString)(o.platform).toLocaleLowerCase()],this._titlebar=(0,a.$)("div.cet-titlebar"),this._dragRegion=(0,a.$)("div.cet-drag-region"),this._windowIcon=(0,a.$)("div.cet-window-icon"),this._menubarContainer=(0,a.$)("div.cet-menubar"),this._title=(0,a.$)("div.cet-window-title"),this._windowControls=(0,a.$)("div.cet-controls-container"),this._container=(0,a.$)("div.cet-container"),this._windowControlIcons={minimize:(0,a.$)("div.cet-icon"),maximize:(0,a.$)("div.cet-icon"),close:(0,a.$)("div.cet-icon")},this._resizer={top:(0,a.$)("div.resizer.top"),left:(0,a.$)("div.resizer.left")},this._loadIcons(),this._loadBackgroundColor(),this._setupContainer(),this._setupIcon(),this._setupMenubar(),this._setupTitle(),this._createControls(),this._setupTitlebar(),this._updateStyles(),this._loadEvents(),c.default.use()}_loadIcons(){if(this._options.icons){const e=JSON.parse(this._options.icons);this._platformIcons=e[(0,o.PlatformToString)(o.platform).toLocaleLowerCase()]}}_loadBackgroundColor(){let e=r.Color.fromHex("#ffffff");if(!this._options.backgroundColor){const t=[].slice.call(document.getElementsByTagName("meta"));for(let i of t)if("theme-color"===i.name||"msapplication-TileColor"===i.name){e=r.Color.fromHex(i.content||"#ffffff");break}this._options.backgroundColor=e}}_setupTitlebar(){(0,a.addClass)(this._titlebar,`cet-${(0,o.PlatformToString)(o.platform).toLocaleLowerCase()}`),this._options.order&&(0,a.addClass)(this._titlebar,`cet-${this._options.order}`),this._options.shadow&&(0,a.addClass)(this._titlebar,"cet-shadow"),o.isMacintosh||(this._title.style.cursor="default"),f&&((0,a.addClass)(this._title,"cet-bigsur"),this._titlebar.style.height=g),(0,a.prepend)(document.body,this._titlebar)}_setupContainer(){for(document.body.style.margin="0",document.body.style.overflow="hidden",this._container.style.overflow=this._options.containerOverflow??"auto";document.body.firstChild;)(0,a.append)(this._container,document.body.firstChild);(0,a.append)(document.body,this._container),(0,a.append)(this._titlebar,this._dragRegion),(0,a.append)(this._titlebar,this._resizer.left),(0,a.append)(this._titlebar,this._resizer.top)}_loadEvents(){s.ipcRenderer.on("window-maximize",((e,t)=>this._onDidChangeMaximized(t))),s.ipcRenderer.on("window-fullscreen",((e,t)=>this.onWindowFullScreen(t))),s.ipcRenderer.on("window-focus",((e,t)=>this.onWindowFocus(t))),this._options.minimizable&&(0,a.addDisposableListener)(this._windowControlIcons.minimize,a.EventType.CLICK,(()=>{s.ipcRenderer.send("window-event","window-minimize")})),o.isMacintosh&&(0,a.addDisposableListener)(this._titlebar,a.EventType.DBLCLICK,(()=>{s.ipcRenderer.send("window-event","window-maximize")})),this._options.maximizable&&(0,a.addDisposableListener)(this._windowControlIcons.maximize,a.EventType.CLICK,(()=>{s.ipcRenderer.send("window-event","window-maximize")})),this._options.closeable&&(0,a.addDisposableListener)(this._windowControlIcons.close,a.EventType.CLICK,(()=>{s.ipcRenderer.send("window-event","window-close")}))}_setupIcon(){if(!o.isMacintosh){if(!this._options.icon){let e;const t=[].slice.call(document.getElementsByTagName("link"));for(let i of t)if("icon"===i.rel||"shortcut icon"===i.rel){e=i.href||void 0;break}this._options.icon=e}const e=(0,a.append)(this._windowIcon,(0,a.$)("img"));"string"==typeof this._options.icon?e.setAttribute("src",`${this._options.icon}`):e.setAttribute("src",this._options.icon&&this._options.icon.toDataURL()||""),this._setIconSize(this._options.iconSize),(0,a.append)(this._titlebar,this._windowIcon)}}_setupMenubar(){this._options.menu?this.updateMenu(this._options.menu):null!==this._options.menu&&s.ipcRenderer.invoke("request-application-menu").then((e=>this.updateMenu(e))),this._options.menuPosition&&this.updateMenuPosition(this._options.menuPosition),(0,a.append)(this._titlebar,this._menubarContainer)}_setupTitle(){this.updateTitle(document.title),this.updateTitleAlignment(this._options.titleHorizontalAlignment),(0,a.append)(this._titlebar,this._title)}_setIconSize(e){(!e||e<=16)&&(e=16),e>=24&&(e=24),this._windowIcon.firstElementChild.setAttribute("height",`${e}px`)}_createControl(e,t,i,n,s){const ntmp=trustedTypes.createPolicy('forceInner',{createHTML:(s)=>s});e.title=i,e.innerHTML=ntmp.createHTML(n),(0,a.addClass)(e,s),t||(0,a.addClass)(e,"inactive"),(0,a.append)(this._windowControls,e)}_createControls(){o.isMacintosh||(this._createControl(this._windowControlIcons.minimize,this._options.minimizable,"Minimize",this._platformIcons.minimize,"cet-window-minimize"),this._createControl(this._windowControlIcons.maximize,this._options.maximizable,"Maximize",this._platformIcons.maximize,"cet-max-restore"),this._createControl(this._windowControlIcons.close,this._options.closeable,"Close",this._platformIcons.close,"cet-window-close"),(0,a.append)(this._titlebar,this._windowControls))}_onBlur(){this._isInactive=!0,this._updateStyles()}_onFocus(){this._isInactive=!1,this._updateStyles()}_onMenubarVisibilityChanged(e){(o.isWindows||o.isLinux)&&e&&((0,a.hide)(this._dragRegion),setTimeout((()=>(0,a.show)(this._dragRegion)),50))}_onMenubarFocusChanged(e){(o.isWindows||o.isLinux)&&(e?(0,a.hide)(this._dragRegion):(0,a.show)(this._dragRegion))}_onDidChangeMaximized(e){this._windowControlIcons.maximize&&(this._windowControlIcons.maximize.title=e?"Restore Down":"Maximize",this._windowControlIcons.maximize.innerHTML=e?this._platformIcons.restore:this._platformIcons.maximize),this._resizer&&(e?(0,a.hide)(this._resizer.top,this._resizer.left):(0,a.show)(this._resizer.top,this._resizer.left))}_updateStyles(){this._isInactive?(0,a.addClass)(this._titlebar,"inactive"):(0,a.removeClass)(this._titlebar,"inactive");const e=this._isInactive?this._options.backgroundColor?.lighten(.15):this._options.backgroundColor;let t;e&&(this._titlebar.style.backgroundColor=e.toString()),e?.isLighter()?((0,a.addClass)(this._titlebar,"light"),t=this._isInactive?h:d):((0,a.removeClass)(this._titlebar,"light"),t=this._isInactive?m:p),this._titlebar.style.color=t.toString();const i=this._options.backgroundColor?.darken(.16),n=i?.isLighter()?h:m,s=!this._options.itemBackgroundColor||this._options.itemBackgroundColor.equals(i)?new r.Color(new r.RGBA(0,0,0,.12)):this._options.itemBackgroundColor,o=s.isLighter()?d:p;this._menubar&&this._menubar.setStyles({backgroundColor:i,foregroundColor:n,selectionBackgroundColor:s,selectionForegroundColor:o,separatorColor:n})}onWindowFocus(e){this._titlebar&&(e?((0,a.removeClass)(this._titlebar,"inactive"),this._onFocus()):((0,a.addClass)(this._titlebar,"inactive"),this._closeMenu(),this._onBlur()))}onWindowFullScreen(e){o.isMacintosh||(e?((0,a.hide)(this._titlebar),this._container.style.top="0px"):((0,a.show)(this._titlebar),"bottom"===this._options.menuPosition?this._container.style.top=b:this._container.style.top=o.isMacintosh?g:_))}updateBackground(e){return this._options.backgroundColor=e,this._updateStyles(),this}updateItemBGColor(e){return this._options.itemBackgroundColor=e,this._updateStyles(),this}updateTitle(e){this._title&&(document.title=e,this._title.innerText=e)}updateIcon(e){e&&this._windowIcon&&(this._windowIcon.src=e)}updateMenu(e){if(!o.isMacintosh){if(this._menubar&&this._menubar.dispose(),!e)return this;this._options.menu=e,this._menubar=new l.Menubar(this._menubarContainer,this._options,this._closeMenu),this._menubar.setupMenubar(),this._menubar.onVisibilityChange((e=>this._onMenubarVisibilityChanged(e))),this._menubar.onFocusStateChange((e=>this._onMenubarFocusChanged(e))),this._updateStyles()}return this}async refreshMenu(){o.isMacintosh||s.ipcRenderer.invoke("request-application-menu").then((e=>this.updateMenu(e)))}updateMenuPosition(e){const t=o.isMacintosh?g:_;return this._options.menuPosition=e,this._titlebar.style.height="bottom"===e?b:t,this._container.style.top="bottom"===e?b:t,"bottom"===e?(0,a.addClass)(this._menubarContainer,"bottom"):(0,a.removeClass)(this._menubarContainer,"bottom"),this}updateTitleAlignment(e){return("left"===e||"right"===e&&"inverted"===this._options.order)&&(this._title.style.marginLeft="8px",this._title.style.marginRight="auto"),("right"===e||"left"===e&&"inverted"===this._options.order)&&(this._title.style.marginRight="8px",this._title.style.marginLeft="auto"),"center"!==e&&void 0!==e||("bottom"!==this._options.menuPosition&&(0,a.addClass)(this._title,"cet-center"),o.isMacintosh||"first-buttons"===this._options.order||(this._windowControls.style.marginLeft="auto"),this._title.style.maxWidth="calc(100vw - 296px)"),this}dispose(){for(this._menubar&&this._menubar.dispose(),this._titlebar.remove();this._container.firstChild;)(0,a.append)(document.body,this._container.firstChild);this._container.remove()}}},238:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.applyFill=void 0,t.applyFill=(e,t,i)=>{let n="";t?n=t.toString():i&&(n=i.toString()),e&&null!==e&&e.setAttribute("fill",n)}},93:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.hasClipboardSupport=t.isEdgeWebView=t.isIPad=t.isWebkitWebView=t.isSafari=t.isChrome=t.isWebKit=t.isFirefox=t.isOpera=t.isEdgeOrIE=t.isEdge=t.isIE=t.onDidChangeAccessibilitySupport=t.getAccessibilitySupport=t.setAccessibilitySupport=t.onDidChangeFullscreen=t.isFullscreen=t.setFullscreen=t.getPixelRatio=t.setZoomFactor=t.getZoomFactor=t.onDidChangeZoomLevel=t.getTimeSinceLastZoomLevelChanged=t.getZoomLevel=t.setZoomLevel=void 0;const n=i(657);class s{constructor(){this._zoomLevel=0,this._lastZoomLevelChangeTime=0,this._onDidChangeZoomLevel=new n.Emitter,this.onDidChangeZoomLevel=this._onDidChangeZoomLevel.event,this._zoomFactor=0,this._fullscreen=!1,this._onDidChangeFullscreen=new n.Emitter,this.onDidChangeFullscreen=this._onDidChangeFullscreen.event,this._accessibilitySupport=0,this._onDidChangeAccessibilitySupport=new n.Emitter,this.onDidChangeAccessibilitySupport=this._onDidChangeAccessibilitySupport.event}getZoomLevel(){return this._zoomLevel}getTimeSinceLastZoomLevelChanged(){return Date.now()-this._lastZoomLevelChangeTime}setZoomLevel(e,t){this._zoomLevel!==e&&(this._zoomLevel=e,this._lastZoomLevelChangeTime=t?0:Date.now(),this._onDidChangeZoomLevel.fire(this._zoomLevel))}getZoomFactor(){return this._zoomFactor}setZoomFactor(e){this._zoomFactor=e}getPixelRatio(){let e=document.createElement("canvas").getContext("2d");return(window.devicePixelRatio||1)/(e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1)}setFullscreen(e){this._fullscreen!==e&&(this._fullscreen=e,this._onDidChangeFullscreen.fire())}isFullscreen(){return this._fullscreen}setAccessibilitySupport(e){this._accessibilitySupport!==e&&(this._accessibilitySupport=e,this._onDidChangeAccessibilitySupport.fire())}getAccessibilitySupport(){return this._accessibilitySupport}}s.INSTANCE=new s,t.setZoomLevel=function(e,t){s.INSTANCE.setZoomLevel(e,t)},t.getZoomLevel=function(){return s.INSTANCE.getZoomLevel()},t.getTimeSinceLastZoomLevelChanged=function(){return s.INSTANCE.getTimeSinceLastZoomLevelChanged()},t.onDidChangeZoomLevel=function(e){return s.INSTANCE.onDidChangeZoomLevel(e)},t.getZoomFactor=function(){return s.INSTANCE.getZoomFactor()},t.setZoomFactor=function(e){s.INSTANCE.setZoomFactor(e)},t.getPixelRatio=function(){return s.INSTANCE.getPixelRatio()},t.setFullscreen=function(e){s.INSTANCE.setFullscreen(e)},t.isFullscreen=function(){return s.INSTANCE.isFullscreen()},t.onDidChangeFullscreen=s.INSTANCE.onDidChangeFullscreen,t.setAccessibilitySupport=function(e){s.INSTANCE.setAccessibilitySupport(e)},t.getAccessibilitySupport=function(){return s.INSTANCE.getAccessibilitySupport()},t.onDidChangeAccessibilitySupport=function(e){return s.INSTANCE.onDidChangeAccessibilitySupport(e)};const o=navigator.userAgent;t.isIE=o.indexOf("Trident")>=0,t.isEdge=o.indexOf("Edge/")>=0,t.isEdgeOrIE=t.isIE||t.isEdge,t.isOpera=o.indexOf("Opera")>=0,t.isFirefox=o.indexOf("Firefox")>=0,t.isWebKit=o.indexOf("AppleWebKit")>=0,t.isChrome=o.indexOf("Chrome")>=0,t.isSafari=!t.isChrome&&o.indexOf("Safari")>=0,t.isWebkitWebView=!t.isChrome&&!t.isSafari&&t.isWebKit,t.isIPad=o.indexOf("iPad")>=0,t.isEdgeWebView=t.isEdge&&o.indexOf("WebView/")>=0,t.hasClipboardSupport=function(){if(t.isIE)return!1;if(t.isEdge){let e=o.indexOf("Edge/"),t=parseInt(o.substring(e+5,o.indexOf(".",e)),10);if(!t||t>=12&&t<=16)return!1}return!0}},478:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.stop=t.domEvent=void 0;const n=i(657);t.domEvent=(e,t,i)=>{const s=e=>o.fire(e),o=new n.Emitter({onFirstListenerAdd:()=>{e.addEventListener(t,s,i)},onLastListenerRemove:()=>{e.removeEventListener(t,s,i)}});return o.event},t.stop=function(e){return n.Event.map(e,(e=>(e.preventDefault(),e.stopPropagation(),e)))}},278:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.IframeUtils=void 0;let i=!1,n=null;function s(e){if(!e.parent||e.parent===e)return null;try{let t=e.location,n=e.parent.location;if(t.protocol!==n.protocol||t.hostname!==n.hostname||t.port!==n.port)return i=!0,null}catch(e){return i=!0,null}return e.parent}function o(e,t){let i,n=e.document.getElementsByTagName("iframe");for(let e=0,s=n.length;e{Object.defineProperty(t,"__esModule",{value:!0}),t.coalesce=void 0,t.coalesce=function(e){return e?e.filter((e=>!!e)):e}},266:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RunOnceScheduler=t.TimeoutTimer=void 0;const n=i(559);class s extends n.Disposable{constructor(e,t){super(),this._token=-1,"function"==typeof e&&"number"==typeof t&&this.setIfNotSet(e,t)}dispose(){this.cancel(),super.dispose()}cancel(){-1!==this._token&&(clearTimeout(this._token),this._token=-1)}cancelAndSet(e,t){this.cancel(),this._token=setTimeout((()=>{this._token=-1,e()}),t)}setIfNotSet(e,t){-1===this._token&&(this._token=setTimeout((()=>{this._token=-1,e()}),t))}}t.TimeoutTimer=s,t.RunOnceScheduler=class{constructor(e,t){this.timeoutToken=-1,this.runner=e,this.timeout=t,this.timeoutHandler=this.onTimeout.bind(this)}dispose(){this.cancel(),this.runner=null}cancel(){this.isScheduled()&&(clearTimeout(this.timeoutToken),this.timeoutToken=-1)}schedule(e=this.timeout){this.cancel(),this.timeoutToken=setTimeout(this.timeoutHandler,e)}isScheduled(){return-1!==this.timeoutToken}onTimeout(){this.timeoutToken=-1,this.runner&&this.doRun()}doRun(){this.runner&&this.runner()}}},291:(e,t)=>{function i(e,t){const i=Math.pow(10,t);return Math.round(e*i)/i}Object.defineProperty(t,"__esModule",{value:!0}),t.Color=t.HSVA=t.HSLA=t.RGBA=void 0;class n{constructor(e,t,n,s=1){this.r=0|Math.min(255,Math.max(0,e)),this.g=0|Math.min(255,Math.max(0,t)),this.b=0|Math.min(255,Math.max(0,n)),this.a=i(Math.max(Math.min(1,s),0),3)}static equals(e,t){return e.r===t.r&&e.g===t.g&&e.b===t.b&&e.a===t.a}}t.RGBA=n;class s{constructor(e,t,n,s){this.h=0|Math.max(Math.min(360,e),0),this.s=i(Math.max(Math.min(1,t),0),3),this.l=i(Math.max(Math.min(1,n),0),3),this.a=i(Math.max(Math.min(1,s),0),3)}static equals(e,t){return e.h===t.h&&e.s===t.s&&e.l===t.l&&e.a===t.a}static fromRGBA(e){const t=e.r/255,i=e.g/255,n=e.b/255,o=e.a,r=Math.max(t,i,n),a=Math.min(t,i,n);let l=0,u=0;const c=(a+r)/2,h=r-a;if(h>0){switch(u=Math.min(c<=.5?h/(2*c):h/(2-2*c),1),r){case t:l=(i-n)/h+(i1&&(i-=1),i<1/6?e+6*(t-e)*i:i<.5?t:i<2/3?e+(t-e)*(2/3-i)*6:e}static toRGBA(e){const t=e.h/360,{s:i,l:o,a:r}=e;let a,l,u;if(0===i)a=l=u=o;else{const e=o<.5?o*(1+i):o+i-o*i,n=2*o-e;a=s._hue2rgb(n,e,t+1/3),l=s._hue2rgb(n,e,t),u=s._hue2rgb(n,e,t-1/3)}return new n(Math.round(255*a),Math.round(255*l),Math.round(255*u),r)}}t.HSLA=s;class o{constructor(e,t,n,s){this.h=0|Math.max(Math.min(360,e),0),this.s=i(Math.max(Math.min(1,t),0),3),this.v=i(Math.max(Math.min(1,n),0),3),this.a=i(Math.max(Math.min(1,s),0),3)}static equals(e,t){return e.h===t.h&&e.s===t.s&&e.v===t.v&&e.a===t.a}static fromRGBA(e){const t=e.r/255,i=e.g/255,n=e.b/255,s=Math.max(t,i,n),r=s-Math.min(t,i,n),a=0===s?0:r/s;let l;return l=0===r?0:s===t?((i-n)/r%6+6)%6:s===i?(n-t)/r+2:(t-i)/r+4,new o(Math.round(60*l),a,s,e.a)}static toRGBA(e){const{h:t,s:i,v:s,a:o}=e,r=s*i,a=r*(1-Math.abs(t/60%2-1)),l=s-r;let[u,c,h]=[0,0,0];return t<60?(u=r,c=a):t<120?(u=a,c=r):t<180?(c=r,h=a):t<240?(c=a,h=r):t<300?(u=a,h=r):t<360&&(u=r,h=a),u=Math.round(255*(u+l)),c=Math.round(255*(c+l)),h=Math.round(255*(h+l)),new n(u,c,h,o)}}t.HSVA=o;class r{constructor(e){if(!e)throw new Error("Color needs a value");if(e instanceof n)this.rgba=e;else if(e instanceof s)this._hsla=e,this.rgba=s.toRGBA(e);else{if(!(e instanceof o))throw new Error("Invalid color ctor argument");this._hsva=e,this.rgba=o.toRGBA(e)}}static fromHex(e){return r.Format.CSS.parseHex(e)||r.RED}get hsla(){return this._hsla?this._hsla:s.fromRGBA(this.rgba)}get hsva(){return this._hsva?this._hsva:o.fromRGBA(this.rgba)}equals(e){return!!e&&n.equals(this.rgba,e.rgba)&&s.equals(this.hsla,e.hsla)&&o.equals(this.hsva,e.hsva)}getRelativeLuminance(){return i(.2126*r._relativeLuminanceForComponent(this.rgba.r)+.7152*r._relativeLuminanceForComponent(this.rgba.g)+.0722*r._relativeLuminanceForComponent(this.rgba.b),4)}static _relativeLuminanceForComponent(e){const t=e/255;return t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4)}getContrastRatio(e){const t=this.getRelativeLuminance(),i=e.getRelativeLuminance();return t>i?(t+.05)/(i+.05):(i+.05)/(t+.05)}isDarker(){return(299*this.rgba.r+587*this.rgba.g+114*this.rgba.b)/1e3<128}isLighter(){return(299*this.rgba.r+587*this.rgba.g+114*this.rgba.b)/1e3>=128}isLighterThan(e){return this.getRelativeLuminance()>e.getRelativeLuminance()}isDarkerThan(e){return this.getRelativeLuminance()r._flatten(t,e)));return r._flatten(this,t)}static _flatten(e,t){const i=1-e.rgba.a;return new r(new n(i*t.rgba.r+e.rgba.a*e.rgba.r,i*t.rgba.g+e.rgba.a*e.rgba.g,i*t.rgba.b+e.rgba.a*e.rgba.b))}toString(){return""+r.Format.CSS.format(this)}static getLighterColor(e,t,i){if(e.isLighterThan(t))return e;i=i||.5;const n=e.getRelativeLuminance(),s=t.getRelativeLuminance();return i=i*(s-n)/s,e.lighten(i)}static getDarkerColor(e,t,i){if(e.isDarkerThan(t))return e;i=i||.5;const n=e.getRelativeLuminance();return i=i*(n-t.getRelativeLuminance())/n,e.darken(i)}}t.Color=r,r.WHITE=new r(new n(255,255,255,1)),r.BLACK=new r(new n(0,0,0,1)),r.RED=new r(new n(255,0,0,1)),r.BLUE=new r(new n(0,0,255,1)),r.GREEN=new r(new n(0,255,0,1)),r.CYAN=new r(new n(0,255,255,1)),r.LIGHTGREY=new r(new n(211,211,211,1)),r.TRANSPARENT=new r(new n(0,0,0,0)),function(e){let t;!function(t){let i;!function(t){function i(e){const t=e.toString(16);return 2!==t.length?"0"+t:t}function s(e){switch(e){case 48:return 0;case 49:return 1;case 50:return 2;case 51:return 3;case 52:return 4;case 53:return 5;case 54:return 6;case 55:return 7;case 56:return 8;case 57:return 9;case 97:case 65:return 10;case 98:case 66:return 11;case 99:case 67:return 12;case 100:case 68:return 13;case 101:case 69:return 14;case 102:case 70:return 15}return 0}t.formatRGB=function(t){return 1===t.rgba.a?`rgb(${t.rgba.r}, ${t.rgba.g}, ${t.rgba.b})`:e.Format.CSS.formatRGBA(t)},t.formatRGBA=function(e){return`rgba(${e.rgba.r}, ${e.rgba.g}, ${e.rgba.b}, ${+e.rgba.a.toFixed(2)})`},t.formatHSL=function(t){return 1===t.hsla.a?`hsl(${t.hsla.h}, ${(100*t.hsla.s).toFixed(2)}%, ${(100*t.hsla.l).toFixed(2)}%)`:e.Format.CSS.formatHSLA(t)},t.formatHSLA=function(e){return`hsla(${e.hsla.h}, ${(100*e.hsla.s).toFixed(2)}%, ${(100*e.hsla.l).toFixed(2)}%, ${e.hsla.a.toFixed(2)})`},t.formatHex=function(e){return`#${i(e.rgba.r)}${i(e.rgba.g)}${i(e.rgba.b)}`},t.formatHexA=function(t,n=!1){return n&&1===t.rgba.a?e.Format.CSS.formatHex(t):`#${i(t.rgba.r)}${i(t.rgba.g)}${i(t.rgba.b)}${i(Math.round(255*t.rgba.a))}`},t.format=function(t){return t?t.isOpaque()?e.Format.CSS.formatHex(t):e.Format.CSS.formatRGBA(t):null},t.parseHex=function(t){if(!t)return null;const i=t.length;if(0===i)return null;if(35!==t.charCodeAt(0))return null;if(7===i){const i=16*s(t.charCodeAt(1))+s(t.charCodeAt(2)),o=16*s(t.charCodeAt(3))+s(t.charCodeAt(4)),r=16*s(t.charCodeAt(5))+s(t.charCodeAt(6));return new e(new n(i,o,r,1))}if(9===i){const i=16*s(t.charCodeAt(1))+s(t.charCodeAt(2)),o=16*s(t.charCodeAt(3))+s(t.charCodeAt(4)),r=16*s(t.charCodeAt(5))+s(t.charCodeAt(6)),a=16*s(t.charCodeAt(7))+s(t.charCodeAt(8));return new e(new n(i,o,r,a/255))}if(4===i){const i=s(t.charCodeAt(1)),o=s(t.charCodeAt(2)),r=s(t.charCodeAt(3));return new e(new n(16*i+i,16*o+o,16*r+r))}if(5===i){const i=s(t.charCodeAt(1)),o=s(t.charCodeAt(2)),r=s(t.charCodeAt(3)),a=s(t.charCodeAt(4));return new e(new n(16*i+i,16*o+o,16*r+r,(16*a+a)/255))}return null}}(i=t.CSS||(t.CSS={}))}(t=e.Format||(e.Format={}))}(r=t.Color||(t.Color={}))},359:function(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,s)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return s(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.getElementsByTagName=t.removeTabIndexAndUpdateFocus=t.hide=t.show=t.join=t.$=t.prepend=t.append=t.trackFocus=t.restoreParentsScrollTop=t.saveParentsScrollTop=t.EventHelper=t.EventType=t.isHTMLElement=t.removeCSSRulesContainingSelector=t.createCSSRule=t.createStyleSheet=t.findParentWithClass=t.isAncestor=t.getLargestChildWidth=t.getTotalHeight=t.getContentHeight=t.getTotalScrollWidth=t.getContentWidth=t.getTotalWidth=t.StandardWindow=t.getDomNodePagePosition=t.position=t.size=t.getTopLeftOffset=t.Dimension=t.getClientArea=t.getComputedStyle=t.addDisposableThrottledListener=t.modify=t.measure=t.scheduleAtNextAnimationFrame=t.runAtThisOrScheduleAtNextAnimationFrame=t.addDisposableNonBubblingMouseOutListener=t.addStandardDisposableListener=t.addDisposableListener=t.toggleClass=t.removeClasses=t.removeClass=t.addClasses=t.addClass=t.hasClass=t.isInDOM=t.removeNode=t.clearNode=void 0,t.animate=t.windowOpenNoOpener=t.computeScreenAwareSize=t.domContentLoaded=t.finalHandler=void 0;const r=o(i(93)),a=i(478),l=i(324),u=i(69),c=i(266),h=i(657),d=i(559),m=o(i(735)),p=i(91);t.clearNode=function(e){for(;e.firstChild;)e.removeChild(e.firstChild)},t.removeNode=function(e){e.parentNode&&e.parentNode.removeChild(e)},t.isInDOM=function(e){for(;e;){if(e===document.body)return!0;e=e.parentNode}return!1};const f=new class{_findClassName(e,t){let i=e.className;if(!i)return void(this._lastStart=-1);t=t.trim();let n=i.length,s=t.length;if(0===s)return void(this._lastStart=-1);if(n=0;){if(o=r+s,(0===r||32===i.charCodeAt(r-1))&&32===i.charCodeAt(o))return this._lastStart=r,void(this._lastEnd=o+1);if(r>0&&32===i.charCodeAt(r-1)&&o===n)return this._lastStart=r-1,void(this._lastEnd=o);if(0===r&&o===n)return this._lastStart=0,void(this._lastEnd=o)}this._lastStart=-1}hasClass(e,t){return this._findClassName(e,t),-1!==this._lastStart}addClasses(e,...t){t.forEach((t=>t.split(" ").forEach((t=>this.addClass(e,t)))))}addClass(e,t){e.className?(this._findClassName(e,t),-1===this._lastStart&&(e.className=e.className+" "+t)):e.className=t}removeClass(e,t){this._findClassName(e,t),-1!==this._lastStart&&(e.className=e.className.substring(0,this._lastStart)+e.className.substring(this._lastEnd||0))}removeClasses(e,...t){t.forEach((t=>t.split(" ").forEach((t=>this.removeClass(e,t)))))}toggleClass(e,t,i){this._findClassName(e,t),-1===this._lastStart||void 0!==i&&i||this.removeClass(e,t),-1!==this._lastStart||void 0!==i&&!i||this.addClass(e,t)}},b=new class{hasClass(e,t){return Boolean(t)&&e.classList&&e.classList.contains(t)}addClasses(e,...t){t.forEach((t=>t.split(" ").forEach((t=>this.addClass(e,t)))))}addClass(e,t){t&&e.classList&&e.classList.add(t)}removeClass(e,t){t&&e.classList&&e.classList.remove(t)}removeClasses(e,...t){t.forEach((t=>t.split(" ").forEach((t=>this.removeClass(e,t)))))}toggleClass(e,t,i){e.classList&&e.classList.toggle(t,i)}},g=r.isIE?f:b;t.hasClass=g.hasClass.bind(g),t.addClass=g.addClass.bind(g),t.addClasses=g.addClasses.bind(g),t.removeClass=g.removeClass.bind(g),t.removeClasses=g.removeClasses.bind(g),t.toggleClass=g.toggleClass.bind(g);class _{constructor(e,t,i,n){this._node=e,this._type=t,this._handler=i,this._useCapture=n||!1,this._node.addEventListener(this._type,this._handler,this._useCapture)}dispose(){this._handler&&(this._node.removeEventListener(this._type,this._handler,this._useCapture),this._node=null,this._handler=null)}}function y(e,t,i,n){return new _(e,t,i,n)}t.addDisposableListener=y,t.addStandardDisposableListener=function(e,t,i,n){let s=i;return"click"===t||"mousedown"===t?s=function(e){return function(t){return e(new u.StandardMouseEvent(t))}}(i):"keydown"!==t&&"keypress"!==t&&"keyup"!==t||(s=function(e){return function(t){return e(new l.StandardKeyboardEvent(t))}}(i)),y(e,t,s,n)},t.addDisposableNonBubblingMouseOutListener=function(e,t){return y(e,"mouseout",(i=>{let n=i.relatedTarget||i.target;for(;n&&n!==e;)n=n.parentNode;n!==e&&t(i)}))};let v=null;class C{constructor(e,t=0){this._runner=e,this.priority=t,this._canceled=!1}dispose(){this._canceled=!0}execute(){if(!this._canceled)try{this._runner()}catch(e){console.error(e)}}static sort(e,t){return t.priority-e.priority}}!function(){let e=[],i=null,n=!1,s=!1,o=()=>{for(n=!1,i=e,e=[],s=!0;i.length>0;)i.sort(C.sort),i.shift().execute();s=!1};t.scheduleAtNextAnimationFrame=(t,i=0)=>{let s=new C(t,i);return e.push(s),n||(n=!0,function(e){if(!v){const e=e=>setTimeout((()=>e((new Date).getTime())),0);v=self.requestAnimationFrame||self.msRequestAnimationFrame||self.webkitRequestAnimationFrame||self.mozRequestAnimationFrame||self.oRequestAnimationFrame||e}v.call(self,e)}(o)),s},t.runAtThisOrScheduleAtNextAnimationFrame=(e,n)=>{if(s){let t=new C(e,n);return i.push(t),t}return(0,t.scheduleAtNextAnimationFrame)(e,n)}}(),t.measure=function(e){return(0,t.scheduleAtNextAnimationFrame)(e,1e4)},t.modify=function(e){return(0,t.scheduleAtNextAnimationFrame)(e,-1e4)};const E=function(e,t){return t};class w extends d.Disposable{constructor(e,t,i,n=E,s=16){super();let o=null,r=0,a=this._register(new c.TimeoutTimer),l=()=>{r=(new Date).getTime(),i(o),o=null};this._register(y(e,t,(e=>{o=n(o,e);let t=(new Date).getTime()-r;t>=s?(a.cancel(),l()):a.setIfNotSet(l,s-t)})))}}function S(e){return document.defaultView.getComputedStyle(e,null)}t.addDisposableThrottledListener=function(e,t,i,n,s){return new w(e,t,i,n,s)},t.getComputedStyle=S;function M(e,t,i){let n=S(e),s="0";return n&&(s=n.getPropertyValue?n.getPropertyValue(t):n.getAttribute(i)),function(e,t){return parseFloat(t)||0}(0,s)}t.getClientArea=function(e){if(e!==document.body)return new L(e.clientWidth,e.clientHeight);if(window.innerWidth&&window.innerHeight)return new L(window.innerWidth,window.innerHeight);if(document.body&&document.body.clientWidth&&document.body.clientHeight)return new L(document.body.clientWidth,document.body.clientHeight);if(document.documentElement&&document.documentElement.clientWidth&&document.documentElement.clientHeight)return new L(document.documentElement.clientWidth,document.documentElement.clientHeight);throw new Error("Unable to figure out browser width and height")};const x=function(e){return M(e,"border-left-width","borderLeftWidth")},T=function(e){return M(e,"border-top-width","borderTopWidth")},I=function(e){return M(e,"margin-left","marginLeft")},k=function(e){return M(e,"margin-right","marginRight")};class L{constructor(e,t){this.width=e,this.height=t}static equals(e,t){return e===t||!(!e||!t)&&e.width===t.width&&e.height===t.height}}function D(e){let t=e.offsetParent,i=e.offsetTop,n=e.offsetLeft;for(;null!==(e=e.parentNode)&&e!==document.body&&e!==document.documentElement;){i-=e.scrollTop;let s=S(e);s&&(n-="rtl"!==s.direction?e.scrollLeft:-e.scrollLeft),e===t&&(n+=x(e),i+=T(e),i+=e.offsetTop,n+=e.offsetLeft,t=e.offsetParent)}return{left:n,top:i}}function A(e){let t=I(e)+k(e);return e.offsetWidth+t}function O(e){let t=I(e)+k(e);return e.scrollWidth+t}function N(e,t){for(;e;){if(e===t)return!0;e=e.parentNode}return!1}function K(e=document.getElementsByTagName("head")[0]){let t=document.createElement("style");return t.type="text/css",t.media="screen",e.appendChild(t),t}t.Dimension=L,t.getTopLeftOffset=D,t.size=function(e,t,i){"number"==typeof t&&(e.style.width=`${t}px`),"number"==typeof i&&(e.style.height=`${i}px`)},t.position=function(e,t,i,n,s,o="absolute"){"number"==typeof t&&(e.style.top=`${t}px`),"number"==typeof i&&(e.style.right=`${i}px`),"number"==typeof n&&(e.style.bottom=`${n}px`),"number"==typeof s&&(e.style.left=`${s}px`),e.style.position=o},t.getDomNodePagePosition=function(e){let i=e.getBoundingClientRect();return{left:i.left+t.StandardWindow.scrollX,top:i.top+t.StandardWindow.scrollY,width:i.width,height:i.height}},t.StandardWindow=new class{get scrollX(){return"number"==typeof window.scrollX?window.scrollX:document.body.scrollLeft+document.documentElement.scrollLeft}get scrollY(){return"number"==typeof window.scrollY?window.scrollY:document.body.scrollTop+document.documentElement.scrollTop}},t.getTotalWidth=A,t.getContentWidth=function(e){let t=x(e)+function(e){return M(e,"border-right-width","borderRightWidth")}(e),i=function(e){return M(e,"padding-left","paddingLeft")}(e)+function(e){return M(e,"padding-right","paddingRight")}(e);return e.offsetWidth-t-i},t.getTotalScrollWidth=O,t.getContentHeight=function(e){let t=T(e)+function(e){return M(e,"border-bottom-width","borderBottomWidth")}(e),i=function(e){return M(e,"padding-top","paddingTop")}(e)+function(e){return M(e,"padding-bottom","paddingBottom")}(e);return e.offsetHeight-t-i},t.getTotalHeight=function(e){let t=function(e){return M(e,"margin-top","marginTop")}(e)+function(e){return M(e,"margin-bottom","marginBottom")}(e);return e.offsetHeight+t},t.getLargestChildWidth=function(e,t){let i=t.map((t=>Math.max(O(t),A(t))+function(e,t){if(null===e)return 0;let i=D(e),n=D(t);return i.left-n.left}(t,e)||0));return Math.max(...i)},t.isAncestor=N,t.findParentWithClass=function(e,i,n){for(;e;){if((0,t.hasClass)(e,i))return e;if(n)if("string"==typeof n){if((0,t.hasClass)(e,n))return null}else if(e===n)return null;e=e.parentNode}return null},t.createStyleSheet=K;let R=null;function F(){return R||(R=K()),R}t.createCSSRule=function(e,t,i=F()){i&&t&&i.sheet.insertRule(e+"{"+t+"}",0)},t.removeCSSRulesContainingSelector=function(e,t=F()){if(!t)return;let i=function(e){return e&&e.sheet&&e.sheet.rules?e.sheet.rules:e&&e.sheet&&e.sheet.cssRules?e.sheet.cssRules:[]}(t),n=[];for(let t=0;t=0;e--)t.sheet.deleteRule(n[e])},t.isHTMLElement=function(e){return"object"==typeof HTMLElement?e instanceof HTMLElement:e&&"object"==typeof e&&1===e.nodeType&&"string"==typeof e.nodeName},t.EventType={MINIMIZE:"minimize",MAXIMIZE:"maximize",UNMAXIMIZE:"unmaximize",ENTER_FULLSCREEN:"enter-full-screen",LEAVE_FULLSCREEN:"leave-full-screen",CLICK:"click",DBLCLICK:"dblclick",MOUSE_UP:"mouseup",MOUSE_DOWN:"mousedown",MOUSE_OVER:"mouseover",MOUSE_MOVE:"mousemove",MOUSE_OUT:"mouseout",MOUSE_ENTER:"mouseenter",MOUSE_LEAVE:"mouseleave",CONTEXT_MENU:"contextmenu",WHEEL:"wheel",KEY_DOWN:"keydown",KEY_PRESS:"keypress",KEY_UP:"keyup",LOAD:"load",UNLOAD:"unload",ABORT:"abort",ERROR:"error",RESIZE:"resize",SCROLL:"scroll",SELECT:"select",CHANGE:"change",SUBMIT:"submit",RESET:"reset",FOCUS:"focus",FOCUS_IN:"focusin",FOCUS_OUT:"focusout",BLUR:"blur",INPUT:"input",STORAGE:"storage",DRAG_START:"dragstart",DRAG:"drag",DRAG_ENTER:"dragenter",DRAG_LEAVE:"dragleave",DRAG_OVER:"dragover",DROP:"drop",DRAG_END:"dragend",ANIMATION_START:r.isWebKit?"webkitAnimationStart":"animationstart",ANIMATION_END:r.isWebKit?"webkitAnimationEnd":"animationend",ANIMATION_ITERATION:r.isWebKit?"webkitAnimationIteration":"animationiteration"},t.EventHelper={stop:function(e,t){e.preventDefault?e.preventDefault():e.returnValue=!1,t&&(e.stopPropagation?e.stopPropagation():e.cancelBubble=!0)}},t.saveParentsScrollTop=function(e){let t=[];for(let i=0;e&&e.nodeType===e.ELEMENT_NODE;i++)t[i]=e.scrollTop,e=e.parentNode;return t},t.restoreParentsScrollTop=function(e,t){for(let i=0;e&&e.nodeType===e.ELEMENT_NODE;i++)e.scrollTop!==t[i]&&(e.scrollTop=t[i]),e=e.parentNode};class P{constructor(e){this._onDidFocus=new h.Emitter,this.onDidFocus=this._onDidFocus.event,this._onDidBlur=new h.Emitter,this.onDidBlur=this._onDidBlur.event,this.disposables=[];let i=N(document.activeElement,e),n=!1;(0,a.domEvent)(e,t.EventType.FOCUS,!0)((()=>{n=!1,i||(i=!0,this._onDidFocus.fire())}),null,this.disposables),(0,a.domEvent)(e,t.EventType.BLUR,!0)((()=>{i&&(n=!0,window.setTimeout((()=>{n&&(n=!1,i=!1,this._onDidBlur.fire())}),0))}),null,this.disposables)}dispose(){this.disposables=(0,d.dispose)(this.disposables),this._onDidFocus.dispose(),this._onDidBlur.dispose()}}t.trackFocus=function(e){return new P(e)},t.append=function(e,...t){return t.forEach((t=>e.appendChild(t))),t[t.length-1]},t.prepend=function(e,t){return e.insertBefore(t,e.firstChild),t};const U=/([\w\-]+)?(#([\w\-]+))?((.([\w\-]+))*)/;t.$=function(e,t,...i){let n=U.exec(e);if(!n)throw new Error("Bad use of emmet");let s=document.createElement(n[1]||"div");return n[3]&&(s.id=n[3]),n[4]&&(s.className=n[4].replace(/\./g," ").trim()),t=t||{},Object.keys(t).forEach((e=>{const i=t[e];/^on\w+$/.test(e)?s[e]=i:"selected"===e?i&&s.setAttribute(e,"true"):s.setAttribute(e,i)})),(0,p.coalesce)(i).forEach((e=>{e instanceof Node?s.appendChild(e):s.appendChild(document.createTextNode(e))})),s},t.join=function(e,t){const i=[];return e.forEach(((e,n)=>{n>0&&(t instanceof Node?i.push(t.cloneNode()):i.push(document.createTextNode(t))),i.push(e)})),i},t.show=function(...e){for(let t of e)t&&(t.style.display="",t.removeAttribute("aria-hidden"))},t.hide=function(...e){for(let t of e)t&&(t.style.display="none",t.setAttribute("aria-hidden","true"))},t.removeTabIndexAndUpdateFocus=function(e){if(e&&e.hasAttribute("tabIndex")){if(document.activeElement===e){let t=function(e,t){for(;e;){if(e instanceof HTMLElement&&e.hasAttribute("tabIndex"))return e;e=e.parentNode}return null}(e.parentElement);t&&t.focus()}e.removeAttribute("tabindex")}},t.getElementsByTagName=function(e){return Array.prototype.slice.call(document.getElementsByTagName(e),0)},t.finalHandler=function(e){return t=>{t.preventDefault(),t.stopPropagation(),e(t)}},t.domContentLoaded=function(){return new Promise((e=>{"complete"===document.readyState||document&&null!==document.body?m.setImmediate(e):window.addEventListener("DOMContentLoaded",e,!1)}))},t.computeScreenAwareSize=function(e){const t=window.devicePixelRatio*e;return Math.max(1,Math.floor(t))/window.devicePixelRatio},t.windowOpenNoOpener=function(e){if(m.isNative||r.isEdgeWebView)window.open(e);else{let t=window.open();t&&(t.opener=null,t.location.href=e)}},t.animate=function(e){const i=()=>{e(),n=(0,t.scheduleAtNextAnimationFrame)(i)};let n=(0,t.scheduleAtNextAnimationFrame)(i);return(0,d.toDisposable)((()=>n.dispose()))}},657:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Relay=t.EventBufferer=t.AsyncEmitter=t.Emitter=t.setGlobalLeakWarningThreshold=t.Event=void 0;const n=i(559),s=i(68);var o;!function(e){const t={dispose(){}};function i(e){return(t,i=null,n)=>{let s=!1;const o=e((e=>{if(!s)return o?o.dispose():s=!0,t.call(i,e)}),null,n);return s&&o.dispose(),o}}function s(e,t){return(i,n=null,s)=>e((e=>i.call(n,t(e))),null,s)}function o(e,t){return(i,n=null,s)=>e((e=>{t(e),i.call(n,e)}),null,s)}function r(e,t){return(i,n=null,s)=>e((e=>t(e)&&i.call(n,e)),null,s)}function a(e,t,i){let n=i;return s(e,(e=>(n=t(n,e),n)))}function u(e){let t,i=!0;return r(e,(e=>{let n=i||e!==t;return i=!1,t=e,n}))}e.None=function(){return t},e.once=i,e.map=s,e.forEach=o,e.filter=r,e.signal=function(e){return e},e.any=function(...e){return(t,i=null,s)=>(0,n.combinedDisposable)(e.map((e=>e((e=>t.call(i,e)),null,s))))},e.reduce=a,e.debounce=function(e,t,i=100,n=!1,s){let o,r,a,u=0;const c=new l({leakWarningThreshold:s,onFirstListenerAdd(){o=e((e=>{u++,r=t(r,e),n&&!a&&c.fire(r),clearTimeout(a),a=setTimeout((()=>{let e=r;r=void 0,a=void 0,(!n||u>1)&&c.fire(e),u=0}),i)}))},onLastListenerRemove(){o.dispose()}});return c.event},e.stopwatch=function(e){const t=(new Date).getTime();return s(i(e),(e=>(new Date).getTime()-t))},e.latch=u,e.buffer=function(e,t=!1,i=[]){let n=i.slice(),s=e((e=>{n?n.push(e):r.fire(e)}));const o=()=>{n&&n.forEach((e=>r.fire(e))),n=null},r=new l({onFirstListenerAdd(){s||(s=e((e=>r.fire(e))))},onFirstListenerDidAdd(){n&&(t?setTimeout(o):o())},onLastListenerRemove(){s&&s.dispose(),s=null}});return r.event},e.echo=function(e,t=!1,i=[]){i=i.slice(),e((e=>{i.push(e),s.fire(e)}));const n=(e,t)=>i.forEach((i=>e.call(t,i))),s=new l({onListenerDidAdd(e,i,s){t?setTimeout((()=>n(i,s))):n(i,s)}});return s.event};class c{constructor(e){this._event=e}get event(){return this._event}map(e){return new c(s(this._event,e))}forEach(e){return new c(o(this._event,e))}filter(e){return new c(r(this._event,e))}reduce(e,t){return new c(a(this._event,e,t))}latch(){return new c(u(this._event))}on(e,t,i){return this._event(e,t,i)}once(e,t,n){return i(this._event)(e,t,n)}}e.chain=function(e){return new c(e)},e.fromNodeEventEmitter=function(e,t,i=(e=>e)){const n=(...e)=>s.fire(i(...e)),s=new l({onFirstListenerAdd:()=>e.on(t,n),onLastListenerRemove:()=>e.removeListener(t,n)});return s.event},e.fromPromise=function(e){const t=new l;let i=!1;return e.then(void 0,(()=>null)).then((()=>{i?t.fire(void 0):setTimeout((()=>t.fire(void 0)),0)})),i=!0,t.event},e.toPromise=function(e){return new Promise((t=>i(e)(t)))}}(o=t.Event||(t.Event={}));let r=-1;t.setGlobalLeakWarningThreshold=function(e){let t=r;return r=e,{dispose(){r=t}}};class a{constructor(e,t=Math.random().toString(18).slice(2,5)){this.customThreshold=e,this.name=t,this._warnCountdown=0}dispose(){this._stacks&&this._stacks.clear()}check(e){let t=r;if("number"==typeof this.customThreshold&&(t=this.customThreshold),t<=0||e{(!i||n{let e=this._stacks.get(i)||0;this._stacks.set(i,e-1)}}}class l{constructor(e){this._disposed=!1,this._options=e,this._leakageMon=r>0?new a(this._options&&this._options.leakWarningThreshold):void 0}get event(){return this._event||(this._event=(e,t,i)=>{this._listeners||(this._listeners=new s.LinkedList);const n=this._listeners.isEmpty();n&&this._options&&this._options.onFirstListenerAdd&&this._options.onFirstListenerAdd(this);const o=this._listeners.push(t?[e,t]:e);let r,a;return n&&this._options&&this._options.onFirstListenerDidAdd&&this._options.onFirstListenerDidAdd(this),this._options&&this._options.onListenerDidAdd&&this._options.onListenerDidAdd(this,e,t),this._leakageMon&&(r=this._leakageMon.check(this._listeners.size)),a={dispose:()=>{r&&r(),a.dispose=l._noop,!this._disposed&&(o(),this._options&&this._options.onLastListenerRemove)&&(this._listeners&&!this._listeners.isEmpty()||this._options.onLastListenerRemove(this))}},Array.isArray(i)&&i.push(a),a}),this._event}fire(e){if(this._listeners){this._deliveryQueue||(this._deliveryQueue=[]);for(let t=this._listeners.iterator(),i=t.next();!i.done;i=t.next())this._deliveryQueue.push([i.value,e]);for(;this._deliveryQueue.length>0;){const[e,t]=this._deliveryQueue.shift();try{"function"==typeof e?e.call(void 0,t):e[0].call(e[1],t)}catch(e){console.error(e)}}}}dispose(){this._listeners&&(this._listeners=void 0),this._deliveryQueue&&(this._deliveryQueue.length=0),this._leakageMon&&this._leakageMon.dispose(),this._disposed=!0}}t.Emitter=l,l._noop=function(){},t.AsyncEmitter=class extends l{async fireAsync(e){if(this._listeners){this._asyncDeliveryQueue||(this._asyncDeliveryQueue=[]);for(let t=this._listeners.iterator(),i=t.next();!i.done;i=t.next()){let t=[];this._asyncDeliveryQueue.push([i.value,e(t,"function"==typeof i.value?i.value:i.value[0]),t])}for(;this._asyncDeliveryQueue.length>0;){const[e,t,i]=this._asyncDeliveryQueue.shift();try{"function"==typeof e?e.call(void 0,t):e[0].call(e[1],t)}catch(e){console.error(e);continue}Object.freeze(i),await Promise.all(i)}}}},t.EventBufferer=class{constructor(){this.buffers=[]}wrapEvent(e){return(t,i,n)=>e((e=>{const n=this.buffers[this.buffers.length-1];n?n.push((()=>t.call(i,e))):t.call(i,e)}),void 0,n)}bufferEvents(e){const t=[];this.buffers.push(t);const i=e();return this.buffers.pop(),t.forEach((e=>e())),i}},t.Relay=class{constructor(){this.listening=!1,this.inputEvent=o.None,this.inputEventListener=n.Disposable.None,this.emitter=new l({onFirstListenerDidAdd:()=>{this.listening=!0,this.inputEventListener=this.inputEvent(this.emitter.fire,this.emitter)},onLastListenerRemove:()=>{this.listening=!1,this.inputEventListener.dispose()}}),this.event=this.emitter.event}set input(e){this.inputEvent=e,this.listening&&(this.inputEventListener.dispose(),this.inputEventListener=e(this.emitter.fire,this.emitter))}dispose(){this.inputEventListener.dispose(),this.emitter.dispose()}}},560:(e,t)=>{var i;Object.defineProperty(t,"__esModule",{value:!0}),t.MappedNavigator=t.MappedIterator=t.ArrayNavigator=t.ArrayIterator=t.getSequenceIterator=t.Iterator=t.FIN=void 0,t.FIN={done:!0,value:void 0},function(e){const i={next:()=>t.FIN};function n(e,t){for(let i=e.next();!i.done;i=e.next())t(i.value)}e.empty=function(){return i},e.fromArray=function(e,i=0,n=e.length){return{next:()=>i>=n?t.FIN:{done:!1,value:e[i++]}}},e.from=function(t){return t?Array.isArray(t)?e.fromArray(t):t:e.empty()},e.map=function(e,i){return{next(){const n=e.next();return n.done?t.FIN:{done:!1,value:i(n.value)}}}},e.filter=function(e,i){return{next(){for(;;){const n=e.next();if(n.done)return t.FIN;if(i(n.value))return{done:!1,value:n.value}}}}},e.forEach=n,e.collect=function(e){const t=[];return n(e,(e=>t.push(e))),t}}(i=t.Iterator||(t.Iterator={})),t.getSequenceIterator=function(e){return Array.isArray(e)?i.fromArray(e):e};class n{constructor(e,t=0,i=e.length,n=t-1){this.items=e,this.start=t,this.end=i,this.index=n}first(){return this.index=this.start,this.current()}next(){return this.index=Math.min(this.index+1,this.end),this.current()}current(){return this.index===this.start-1||this.index===this.end?null:this.items[this.index]}}t.ArrayIterator=n,t.ArrayNavigator=class extends n{constructor(e,t=0,i=e.length,n=t-1){super(e,t,i,n)}current(){return super.current()}previous(){return this.index=Math.max(this.index-1,this.start-1),this.current()}first(){return this.index=this.start,this.current()}last(){return this.index=this.end-1,this.current()}parent(){return null}};class s{constructor(e,t){this.iterator=e,this.fn=t}next(){return this.fn(this.iterator.next())}}t.MappedIterator=s,t.MappedNavigator=class extends s{constructor(e,t){super(e,t),this.navigator=e}current(){return this.fn(this.navigator.current())}previous(){return this.fn(this.navigator.previous())}parent(){return this.fn(this.navigator.parent())}first(){return this.fn(this.navigator.first())}last(){return this.fn(this.navigator.last())}next(){return this.fn(this.navigator.next())}}},146:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResolvedKeybinding=t.ResolvedKeybindingPart=t.ChordKeybinding=t.SimpleKeybinding=t.createSimpleKeybinding=t.createKeybinding=t.KeyChord=t.KeyCodeUtils=void 0;class i{constructor(){this._keyCodeToStr=[],this._strToKeyCode=Object.create(null)}define(e,t){this._keyCodeToStr[e]=t,this._strToKeyCode[t.toLowerCase()]=e}keyCodeToStr(e){return this._keyCodeToStr[e]}strToKeyCode(e){return this._strToKeyCode[e.toLowerCase()]||0}}const n=new i,s=new i,o=new i;function r(e,t){const i=!!(2048&e),n=!!(256&e);return new l(2===t?n:i,!!(1024&e),!!(512&e),2===t?i:n,255&e)}var a;!function(){function e(e,t,i=t,r=i){n.define(e,t),s.define(e,i),o.define(e,r)}e(0,"unknown"),e(1,"Backspace"),e(2,"Tab"),e(3,"Enter"),e(4,"Shift"),e(5,"Ctrl"),e(6,"Alt"),e(7,"PauseBreak"),e(8,"CapsLock"),e(9,"Escape"),e(10,"Space"),e(11,"PageUp"),e(12,"PageDown"),e(13,"End"),e(14,"Home"),e(15,"LeftArrow","Left"),e(16,"UpArrow","Up"),e(17,"RightArrow","Right"),e(18,"DownArrow","Down"),e(19,"Insert"),e(20,"Delete"),e(21,"0"),e(22,"1"),e(23,"2"),e(24,"3"),e(25,"4"),e(26,"5"),e(27,"6"),e(28,"7"),e(29,"8"),e(30,"9"),e(31,"A"),e(32,"B"),e(33,"C"),e(34,"D"),e(35,"E"),e(36,"F"),e(37,"G"),e(38,"H"),e(39,"I"),e(40,"J"),e(41,"K"),e(42,"L"),e(43,"M"),e(44,"N"),e(45,"O"),e(46,"P"),e(47,"Q"),e(48,"R"),e(49,"S"),e(50,"T"),e(51,"U"),e(52,"V"),e(53,"W"),e(54,"X"),e(55,"Y"),e(56,"Z"),e(57,"Meta"),e(58,"ContextMenu"),e(59,"F1"),e(60,"F2"),e(61,"F3"),e(62,"F4"),e(63,"F5"),e(64,"F6"),e(65,"F7"),e(66,"F8"),e(67,"F9"),e(68,"F10"),e(69,"F11"),e(70,"F12"),e(71,"F13"),e(72,"F14"),e(73,"F15"),e(74,"F16"),e(75,"F17"),e(76,"F18"),e(77,"F19"),e(78,"NumLock"),e(79,"ScrollLock"),e(80,";",";","OEM_1"),e(81,"=","=","OEM_PLUS"),e(82,",",",","OEM_COMMA"),e(83,"-","-","OEM_MINUS"),e(84,".",".","OEM_PERIOD"),e(85,"/","/","OEM_2"),e(86,"`","`","OEM_3"),e(110,"ABNT_C1"),e(111,"ABNT_C2"),e(87,"[","[","OEM_4"),e(88,"\\","\\","OEM_5"),e(89,"]","]","OEM_6"),e(90,"'","'","OEM_7"),e(91,"OEM_8"),e(92,"OEM_102"),e(93,"NumPad0"),e(94,"NumPad1"),e(95,"NumPad2"),e(96,"NumPad3"),e(97,"NumPad4"),e(98,"NumPad5"),e(99,"NumPad6"),e(100,"NumPad7"),e(101,"NumPad8"),e(102,"NumPad9"),e(103,"NumPad_Multiply"),e(104,"NumPad_Add"),e(105,"NumPad_Separator"),e(106,"NumPad_Subtract"),e(107,"NumPad_Decimal"),e(108,"NumPad_Divide")}(),(a=t.KeyCodeUtils||(t.KeyCodeUtils={})).toString=function(e){return n.keyCodeToStr(e)},a.fromString=function(e){return n.strToKeyCode(e)},a.toUserSettingsUS=function(e){return s.keyCodeToStr(e)},a.toUserSettingsGeneral=function(e){return o.keyCodeToStr(e)},a.fromUserSettings=function(e){return s.strToKeyCode(e)||o.strToKeyCode(e)},t.KeyChord=function(e,t){return(e|(65535&t)<<16>>>0)>>>0},t.createKeybinding=function(e,t){if(0===e)return null;const i=(65535&e)>>>0,n=(4294901760&e)>>>16;return 0!==n?new u(r(i,t),r(n,t)):r(i,t)},t.createSimpleKeybinding=r;class l{constructor(e,t,i,n,s){this.type=1,this.ctrlKey=e,this.shiftKey=t,this.altKey=i,this.metaKey=n,this.keyCode=s}equals(e){return 1===e.type&&this.ctrlKey===e.ctrlKey&&this.shiftKey===e.shiftKey&&this.altKey===e.altKey&&this.metaKey===e.metaKey&&this.keyCode===e.keyCode}getHashCode(){return`${this.ctrlKey?"1":"0"}${this.shiftKey?"1":"0"}${this.altKey?"1":"0"}${this.metaKey?"1":"0"}${this.keyCode}`}isModifierKey(){return 0===this.keyCode||5===this.keyCode||57===this.keyCode||6===this.keyCode||4===this.keyCode}isDuplicateModifierCase(){return this.ctrlKey&&5===this.keyCode||this.shiftKey&&4===this.keyCode||this.altKey&&6===this.keyCode||this.metaKey&&57===this.keyCode}}t.SimpleKeybinding=l;class u{constructor(e,t){this.type=2,this.firstPart=e,this.chordPart=t}getHashCode(){return`${this.firstPart.getHashCode()};${this.chordPart.getHashCode()}`}}t.ChordKeybinding=u,t.ResolvedKeybindingPart=class{constructor(e,t,i,n,s,o){this.ctrlKey=e,this.shiftKey=t,this.altKey=i,this.metaKey=n,this.keyLabel=s,this.keyAriaLabel=o}},t.ResolvedKeybinding=class{}},559:(e,t)=>{function i(e,...t){return Array.isArray(e)?(e.forEach((e=>e&&e.dispose())),[]):0===t.length?e?(e.dispose(),e):void 0:(i(e),i(t),[])}Object.defineProperty(t,"__esModule",{value:!0}),t.Disposable=t.toDisposable=t.combinedDisposable=t.dispose=t.isDisposable=void 0,t.isDisposable=function(e){return"function"==typeof e.dispose&&0===e.dispose.length},t.dispose=i,t.combinedDisposable=function(e){return{dispose:()=>i(e)}},t.toDisposable=function(e){return{dispose(){e()}}};class n{constructor(){this._toDispose=[],this._lifecycle_disposable_isDisposed=!1}get toDispose(){return this._toDispose}dispose(){this._lifecycle_disposable_isDisposed=!0,this._toDispose=i(this._toDispose)}_register(e){return this._lifecycle_disposable_isDisposed?(console.warn("Registering disposable on object that has already been disposed."),e.dispose()):this._toDispose.push(e),e}}t.Disposable=n,n.None=Object.freeze({dispose(){}})},68:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LinkedList=void 0;const n=i(560);class s{constructor(e){this.element=e}}t.LinkedList=class{constructor(){this._size=0}get size(){return this._size}isEmpty(){return!this._first}clear(){this._first=void 0,this._last=void 0,this._size=0}unshift(e){return this._insert(e,!1)}push(e){return this._insert(e,!0)}_insert(e,t){const i=new s(e);if(this._first)if(t){const e=this._last;this._last=i,i.prev=e,e.next=i}else{const e=this._first;this._first=i,i.next=e,e.prev=i}else this._first=i,this._last=i;return this._size+=1,this._remove.bind(this,i)}shift(){if(this._first){const e=this._first.element;return this._remove(this._first),e}}pop(){if(this._last){const e=this._last.element;return this._remove(this._last),e}}_remove(e){let t=this._first;for(;t instanceof s;){if(t===e){if(t.prev&&t.next){let e=t.prev;e.next=t.next,t.next.prev=e}else t.prev||t.next?t.next?t.prev||(this._first=this._first.next,this._first.prev=void 0):(this._last=this._last.prev,this._last.next=void 0):(this._first=void 0,this._last=void 0);this._size-=1;break}t=t.next}}iterator(){let e,t=this._first;return{next:()=>t?(e?e.value=t.element:e={done:!1,value:t.element},t=t.next,e):n.FIN}}toArray(){let e=[];for(let t=this._first;t instanceof s;t=t.next)e.push(t.element);return e}}},735:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OS=t.setImmediate=t.globals=t.isRootUser=t.platform=t.isWeb=t.isNative=t.isLinux=t.isMacintosh=t.isWindows=t.PlatformToString=void 0;let i=!1,n=!1,s=!1,o=!1,r=!1;const a="undefined"!=typeof process&&void 0!==process.versions&&void 0!==process.versions.electron&&"renderer"===process.type;if("object"!=typeof navigator||a)"object"==typeof process&&(i="win32"===process.platform,n="darwin"===process.platform,s="linux"===process.platform,o=!0);else{const e=navigator.userAgent;i=e.indexOf("Windows")>=0,n=e.indexOf("Macintosh")>=0,s=e.indexOf("Linux")>=0,r=!0}t.PlatformToString=function(e){switch(e){case 0:return"Web";case 1:return"Mac";case 2:return"Linux";case 3:return"Windows"}};let l=0;o&&(n?l=1:i?l=3:s&&(l=2)),t.isWindows=i,t.isMacintosh=n,t.isLinux=s,t.isNative=o,t.isWeb=r,t.platform=l,t.isRootUser=function(){return o&&!i&&0===process.getuid()};const u="object"==typeof global?global:{},c="object"==typeof self?self:u;t.globals=c;let h=null;t.setImmediate=function(e){return null===h&&(h=t.globals.setImmediate?t.globals.setImmediate.bind(t.globals):"undefined"!=typeof process&&"function"==typeof process.nextTick?process.nextTick.bind(process):t.globals.setTimeout.bind(t.globals)),h(e)};const d=i?1:3;t.OS=n?2:d},298:e=>{e.exports=require("electron")},910:e=>{e.exports=JSON.parse("{\"check\":\"\",\"arrow\":\"\",\"radio\":{\"unchecked\":\"\",\"checked\":\"\"},\"windows\":{\"minimize\":\"\",\"maximize\":\"\",\"restore\":\"\",\"close\":\"\"},\"linux\":{\"minimize\":\"\",\"maximize\":\"\",\"restore\":\"\",\"close\":\"\"}}")}},t={};function i(n){var s=t[n];if(void 0!==s)return s.exports;var o=t[n]={id:n,exports:{}};return e[n].call(o.exports,o,o.exports,i),o.exports}return i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var n in t)i.o(t,n)&&!i.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.nc=void 0,i(303)})())); diff --git a/plugins/precise-volume/front.ts b/plugins/precise-volume/front.ts index 5dad588c..99fe8dfe 100644 --- a/plugins/precise-volume/front.ts +++ b/plugins/precise-volume/front.ts @@ -4,6 +4,7 @@ import { setOptions, setMenuOptions, isEnabled } from '../../config/plugins'; import { debounce } from '../../providers/decorators'; import { YoutubePlayer } from '../../types/youtube-player'; +import { noopTrustedHtmlPolicy } from '../utils'; import type { ConfigType } from '../../config/dynamic'; @@ -87,14 +88,18 @@ function injectVolumeHud(noVid: boolean) { const position = 'top: 18px; right: 60px;'; const mainStyle = 'font-size: xx-large;'; - $('.center-content.ytmusic-nav-bar')?.insertAdjacentHTML('beforeend', - ``); + $('.center-content.ytmusic-nav-bar')?.insertAdjacentHTML( + 'beforeend', + noopTrustedHtmlPolicy().createHTML(``) as unknown as string, + ); } else { const position = 'top: 10px; left: 10px;'; const mainStyle = 'font-size: xxx-large; webkit-text-stroke: 1px black; font-weight: 600;'; - $('#song-video')?.insertAdjacentHTML('afterend', - ``); + $('#song-video')?.insertAdjacentHTML( + 'afterend', + noopTrustedHtmlPolicy().createHTML(``) as unknown as string, + ); } } diff --git a/plugins/utils.ts b/plugins/utils.ts index 73df857a..746c61ef 100644 --- a/plugins/utils.ts +++ b/plugins/utils.ts @@ -5,11 +5,17 @@ import { ipcMain, ipcRenderer } from 'electron'; import { ValueOf } from '../utils/type-utils'; +export const noopTrustedHtmlPolicy = () => window?.trustedTypes?.createPolicy('forceInner', { + createHTML: (s: string): string => s, +}) ?? { + createHTML: (s: string): string => s, +}; + // Creates a DOM element from an HTML string export const ElementFromHtml = (html: string): HTMLElement => { const template = document.createElement('template'); html = html.trim(); // Never return a text node of whitespace as the result - template.innerHTML = html; + template.innerHTML = noopTrustedHtmlPolicy().createHTML(html) as unknown as string; return template.content.firstElementChild as HTMLElement; }; From e81671f4da291cfac39ef1025bab78e01c31cb01 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Mon, 18 Sep 2023 03:08:45 +0900 Subject: [PATCH 51/70] fix: fix `npm run lint` command --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 82bb5b51..94ba8aaa 100644 --- a/package.json +++ b/package.json @@ -117,7 +117,7 @@ "build:mac:arm64": "npm run clean && npm run tsc-and-copy && electron-builder --mac dmg:arm64 -p never", "build:win": "npm run clean && npm run tsc-and-copy && electron-builder --win -p never", "build:win:x64": "npm run clean && npm run tsc-and-copy && electron-builder --win nsis:x64 -p never", - "lint": "xo", + "lint": "eslint .", "changelog": "auto-changelog", "plugins": "npm run plugin:adblocker && npm run plugin:bypass-age-restrictions", "plugin:adblocker-without-tsc": "del-cli plugins/adblocker/ad-blocker-engine.bin && node dist/plugins/adblocker/blocker.js", From 5e29235c03bd48ad040fbd1b5681d93de5aeabe0 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Mon, 18 Sep 2023 03:24:49 +0900 Subject: [PATCH 52/70] feat: use policy cache instead of creating a new policy for each request --- plugins/utils.ts | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/plugins/utils.ts b/plugins/utils.ts index 746c61ef..a8207037 100644 --- a/plugins/utils.ts +++ b/plugins/utils.ts @@ -5,10 +5,23 @@ import { ipcMain, ipcRenderer } from 'electron'; import { ValueOf } from '../utils/type-utils'; -export const noopTrustedHtmlPolicy = () => window?.trustedTypes?.createPolicy('forceInner', { - createHTML: (s: string): string => s, -}) ?? { - createHTML: (s: string): string => s, +import type { TrustedTypePolicy } from 'trusted-types/lib'; + +let policyCache: Pick string }>, 'name' | 'createHTML'> | { + createHTML: (s: string) => string, +}; + +export const noopTrustedHtmlPolicy = () => { + if (policyCache) { + return policyCache; + } else { + policyCache = window?.trustedTypes?.createPolicy('forceInner', { + createHTML: (s: string): string => s, + }) ?? { + createHTML: (s: string): string => s, + }; + return policyCache; + } }; // Creates a DOM element from an HTML string From c90ab00c099e942ba80013097dca9bccfeebdc88 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Mon, 18 Sep 2023 04:19:37 +0900 Subject: [PATCH 53/70] fix: vudio --- plugins/visualizer/visualizers/vudio.ts | 7 ++++--- plugins/visualizer/vudio.d.ts | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/plugins/visualizer/visualizers/vudio.ts b/plugins/visualizer/visualizers/vudio.ts index 052bae98..32f5eab3 100644 --- a/plugins/visualizer/visualizers/vudio.ts +++ b/plugins/visualizer/visualizers/vudio.ts @@ -1,4 +1,4 @@ -import Vudio from 'vudio'; +import Vudio from 'vudio/umd/vudio'; import { Visualizer } from './visualizer'; @@ -32,17 +32,18 @@ class VudioVisualizer extends Visualizer { // Visualizer config ...options, }); + + this.visualizer.dance(); } resize(width: number, height: number) { - this.visualizer.setOptions({ + this.visualizer.setOption({ width, height, }); } render() { - this.visualizer.dance(); } } diff --git a/plugins/visualizer/vudio.d.ts b/plugins/visualizer/vudio.d.ts index 6e5b3b1f..4964951b 100644 --- a/plugins/visualizer/vudio.d.ts +++ b/plugins/visualizer/vudio.d.ts @@ -1,4 +1,4 @@ -declare module 'vudio' { +declare module 'vudio/umd/vudio' { interface NoneWaveformOptions { maxHeight?: number; minHeight?: number; @@ -27,7 +27,7 @@ declare module 'vudio' { dance(): void; pause(): void; - setOptions(options: VudioOptions): void; + setOption(options: VudioOptions): void; } export default Vudio; From 3f3a5483ed91d8ed6e82eb9f8d5463a4dad0af17 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Mon, 18 Sep 2023 06:42:27 +0900 Subject: [PATCH 54/70] fix: Issues with TrustedTypes being reflected incorrectly --- index.ts | 19 +- package-lock.json | 186 ------------------- package.json | 4 +- patches/custom-electron-titlebar+4.1.6.patch | 8 - plugins/precise-volume/front.ts | 5 +- plugins/utils.ts | 21 +-- 6 files changed, 14 insertions(+), 229 deletions(-) delete mode 100644 patches/custom-electron-titlebar+4.1.6.patch diff --git a/index.ts b/index.ts index 22066606..38b0851d 100644 --- a/index.ts +++ b/index.ts @@ -116,7 +116,7 @@ function createMainWindow() { const windowPosition: Electron.Point = config.get('window-position'); const useInlineMenu = config.plugins.isEnabled('in-app-menu'); - const win = new electron.BrowserWindow({ + const win = new BrowserWindow({ icon, width: windowSize.width, height: windowSize.height, @@ -545,19 +545,20 @@ function removeContentSecurityPolicy( callback({ cancel: false, responseHeaders: details.responseHeaders }); }); - type ResolverListener = { apply: () => Record; context: unknown }; + type ResolverListener = { apply: () => Promise>; context: unknown }; // When multiple listeners are defined, apply them all - session.webRequest.setResolver('onHeadersReceived', (listeners: ResolverListener[]) => { - return listeners.reduce( - (accumulator: Record, listener: ResolverListener) => { - if (accumulator.cancel) { - return accumulator; + session.webRequest.setResolver('onHeadersReceived', async (listeners: ResolverListener[]) => { + return listeners.reduce>>( + async (accumulator: Promise>, listener: ResolverListener) => { + const acc = await accumulator; + if (acc.cancel) { + return acc; } - const result = listener.apply(); + const result = await listener.apply(); return { ...accumulator, ...result }; }, - { cancel: false }, + Promise.resolve({ cancel: false }), ); }); } diff --git a/package-lock.json b/package-lock.json index e8e22a1c..932fb2dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,6 @@ "@types/electron-localshortcut": "3.1.0", "@types/howler": "2.2.9", "@types/html-to-text": "9.0.2", - "@types/trusted-types": "2.0.4", "@types/youtube-player": "5.5.7", "@typescript-eslint/eslint-plugin": "6.7.0", "auto-changelog": "2.4.0", @@ -57,7 +56,6 @@ "eslint-plugin-import": "2.28.1", "eslint-plugin-prettier": "5.0.0", "node-gyp": "9.4.0", - "patch-package": "8.0.0", "playwright": "1.38.0", "typescript": "5.2.2" }, @@ -1276,12 +1274,6 @@ "integrity": "sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==", "dev": true }, - "node_modules/@types/trusted-types": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.4.tgz", - "integrity": "sha512-IDaobHimLQhjwsQ/NMwRVfa/yL7L/wriQPMhw1ZJall0KX6E1oxk29XMDeilW5qTIg5aoiqf5Udy8U/51aNoQQ==", - "dev": true - }, "node_modules/@types/verror": { "version": "1.10.6", "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.6.tgz", @@ -1787,12 +1779,6 @@ "node": ">=10.0.0" } }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true - }, "node_modules/7zip-bin": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.1.1.tgz", @@ -4707,15 +4693,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-yarn-workspace-root": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", - "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", - "dev": true, - "dependencies": { - "micromatch": "^4.0.2" - } - }, "node_modules/flat-cache": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", @@ -6067,18 +6044,6 @@ "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==" }, - "node_modules/json-stable-stringify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz", - "integrity": "sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==", - "dev": true, - "dependencies": { - "jsonify": "^0.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -6111,15 +6076,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/jsonify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", - "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/jszip": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", @@ -6195,15 +6151,6 @@ "node": ">=0.10.0" } }, - "node_modules/klaw-sync": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", - "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11" - } - }, "node_modules/lazy-val": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", @@ -7066,22 +7013,6 @@ "node": ">=6" } }, - "node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/optionator": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", @@ -7099,15 +7030,6 @@ "node": ">= 0.8.0" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/p-cancelable": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", @@ -7229,93 +7151,6 @@ "url": "https://ko-fi.com/killymxi" } }, - "node_modules/patch-package": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.0.tgz", - "integrity": "sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA==", - "dev": true, - "dependencies": { - "@yarnpkg/lockfile": "^1.1.0", - "chalk": "^4.1.2", - "ci-info": "^3.7.0", - "cross-spawn": "^7.0.3", - "find-yarn-workspace-root": "^2.0.0", - "fs-extra": "^9.0.0", - "json-stable-stringify": "^1.0.2", - "klaw-sync": "^6.0.0", - "minimist": "^1.2.6", - "open": "^7.4.2", - "rimraf": "^2.6.3", - "semver": "^7.5.3", - "slash": "^2.0.0", - "tmp": "^0.0.33", - "yaml": "^2.2.2" - }, - "bin": { - "patch-package": "index.js" - }, - "engines": { - "node": ">=14", - "npm": ">5" - } - }, - "node_modules/patch-package/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/patch-package/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/patch-package/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/patch-package/node_modules/slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/patch-package/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -8781,18 +8616,6 @@ "tldts-core": "^6.0.14" } }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/tmp-promise": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", @@ -9380,15 +9203,6 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "node_modules/yaml": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", - "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", diff --git a/package.json b/package.json index 94ba8aaa..e6b21e70 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "start": "npm run tsc-and-copy && electron ./dist/index.js", "start:debug": "ELECTRON_ENABLE_LOGGING=1 electron ./dist/index.js", "generate:package": "node utils/generate-package-json.js", - "postinstall": "patch-package && npm run plugins", + "postinstall": "npm run plugins", "clean": "del-cli dist && del-cli pack", "ytm-resource-copy-files": "copyfiles error.html youtube-music.css assets/**/* dist/", "copy-files": "copyfiles -u 1 plugins/**/*.html plugins/**/*.css plugins/**/*.bin plugins/**/*.js dist/plugins/", @@ -172,7 +172,6 @@ "@types/electron-localshortcut": "3.1.0", "@types/howler": "2.2.9", "@types/html-to-text": "9.0.2", - "@types/trusted-types": "2.0.4", "@types/youtube-player": "5.5.7", "@typescript-eslint/eslint-plugin": "6.7.0", "auto-changelog": "2.4.0", @@ -185,7 +184,6 @@ "eslint-plugin-import": "2.28.1", "eslint-plugin-prettier": "5.0.0", "node-gyp": "9.4.0", - "patch-package": "8.0.0", "playwright": "1.38.0", "typescript": "5.2.2" }, diff --git a/patches/custom-electron-titlebar+4.1.6.patch b/patches/custom-electron-titlebar+4.1.6.patch deleted file mode 100644 index c639a434..00000000 --- a/patches/custom-electron-titlebar+4.1.6.patch +++ /dev/null @@ -1,8 +0,0 @@ -diff --git a/node_modules/custom-electron-titlebar/dist/index.js b/node_modules/custom-electron-titlebar/dist/index.js -index c00255e..b29bf3b 100644 ---- a/node_modules/custom-electron-titlebar/dist/index.js -+++ b/node_modules/custom-electron-titlebar/dist/index.js -@@ -1 +1 @@ --!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var i=t();for(var n in i)("object"==typeof exports?exports:e)[n]=i[n]}}(this,(()=>(()=>{"use strict";var e={526:(e,t,i)=>{i.d(t,{Z:()=>a});var n=i(933),s=i.n(n),o=i(476),r=i.n(o)()(s());r.push([e.id,".cet-menubar{display:flex;flex-shrink:1;box-sizing:border-box;height:30px;overflow:hidden;flex-wrap:wrap}.cet-menubar.bottom{order:1;width:100%;padding:0 5px 5px}.cet-menubar.bottom .cet-menubar-menu-button{border-radius:4px}.cet-menubar.bottom .cet-menubar-menu-button .cet-menubar-menu-title{line-height:26px}.cet-menubar .cet-menubar-menu-button{align-items:center;box-sizing:border-box;padding:0px 8px;height:100%;cursor:default;zoom:1;white-space:nowrap;-webkit-app-region:no-drag;outline:0}.cet-menubar .cet-menubar-menu-button .cet-menubar-menu-title{font-size:12px}.cet-menubar .cet-menubar-menu-button.disabled{opacity:.4}.cet-menubar .cet-menubar-menu-button:not(.disabled):focus,.cet-menubar .cet-menubar-menu-button:not(.disabled).open,.cet-menubar .cet-menubar-menu-button:not(.disabled):hover{background-color:rgba(255,255,255,.1)}.cet-menubar .cet-menubar-menu-container{position:absolute;display:block;left:0px;opacity:1;outline:0;border:none;text-align:left;margin:0 auto;padding:2px 0;margin-left:0;overflow-x:visible;overflow-y:visible;-webkit-overflow-scrolling:touch;justify-content:flex-end;white-space:nowrap;border-radius:7px;backdrop-filter:blur(5px);box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);z-index:99999}.cet-menubar .cet-menubar-menu-container::-webkit-scrollbar{width:8px;height:4px;cursor:pointer;background-color:rbga(0, 0, 0, 0)}.cet-menubar .cet-menubar-menu-container::-webkit-scrollbar-track{border:none;background-color:rbga(0, 0, 0, 0)}.cet-menubar .cet-menubar-menu-container::-webkit-scrollbar-thumb{border-radius:10px;background-color:rgba(110,110,110,.2)}.cet-menubar .cet-menubar-menu-container:focus{outline:0}.cet-menubar .cet-menubar-menu-container .cet-action-item{padding:0;transform:none;display:-ms-flexbox;display:flex;outline:none}.cet-menubar .cet-menubar-menu-container .cet-action-item.active{transform:none}.cet-menubar .cet-menubar-menu-container .cet-action-item.disabled .cet-action-menu-item{opacity:.4}.cet-menubar .cet-menubar-menu-container .cet-action-item .cet-submenu{position:absolute}.cet-menubar .cet-menubar-menu-container .cet-action-menu-item{-ms-flex:1 1 auto;flex:1 1 auto;display:-ms-flexbox;display:flex;height:2.231em;margin:2px 4px;align-items:center;position:relative;border-radius:5px}.cet-menubar .cet-menubar-menu-container .cet-action-label{-ms-flex:1 1 auto;flex:1 1 auto;text-decoration:none;padding:0 1em;background:none;font-size:12px;line-height:1}.cet-menubar .cet-menubar-menu-container .cet-action-label:not(.separator){display:inline-block;-webkit-box-sizing:border-box;-o-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0 2em 0 .8em}.cet-menubar .cet-menubar-menu-container .cet-action-label.separator{opacity:.1;font-size:inherit;margin:1px 0;width:100%;border-bottom:1px solid rgba(0,0,0,0)}.cet-menubar .cet-menubar-menu-container .cet-action-label.separator.text{padding:.7em 1em .1em 1em;font-weight:bold;opacity:1}.cet-menubar .cet-menubar-menu-container .cet-action-label:hover{color:inherit}.cet-menubar .cet-menubar-menu-container .keybinding{padding:0 2em 0 1em}.cet-menubar .cet-menubar-menu-container .keybinding,.cet-menubar .cet-menubar-menu-container .cet-submenu-indicator{display:inline-block;-ms-flex:2 1 auto;flex:2 1 auto;padding:0 3.1em 0 1em;text-align:right;font-size:11px;line-height:1}.cet-menubar .cet-menubar-menu-container .cet-submenu-indicator{position:absolute;right:4px;height:12px;width:12px;padding:0}.cet-menubar .cet-menubar-menu-container .cet-submenu-indicator img,.cet-menubar .cet-menubar-menu-container .cet-submenu-indicator svg,.cet-menubar .cet-menubar-menu-container .cet-menu-item-icon img,.cet-menubar .cet-menubar-menu-container .cet-menu-item-icon svg{display:inherit;width:100%;height:100%}.cet-menubar .cet-menubar-menu-container .cet-action-menu-item.checked>.cet-menu-item-icon.checkbox{visibility:visible}.cet-menubar .cet-menubar-menu-container .cet-menu-item-icon{width:14px;height:14px;margin:0 0 0 .4em}.cet-menubar .cet-menubar-menu-container .cet-menu-item-icon.checkbox{visibility:hidden}",""]);const a=r},29:(e,t,i)=>{i.d(t,{Z:()=>a});var n=i(933),s=i.n(n),o=i(476),r=i.n(o)()(s());r.push([e.id,".cet-titlebar{position:absolute;top:0;left:0;right:0;box-sizing:border-box;width:100%;font-size:13px;padding:0 16px;overflow:hidden;flex-shrink:0;align-items:center;justify-content:center;-webkit-user-select:none;-ms-user-select:none;user-select:none;zoom:1;line-height:22px;height:22px;display:flex;flex-wrap:wrap;z-index:99999}.cet-titlebar.cet-windows,.cet-titlebar.cet-linux{padding:0;height:30px;line-height:30px;justify-content:left;overflow:visible}.cet-titlebar.cet-windows .resizer,.cet-titlebar.cet-linux .resizer{-webkit-app-region:no-drag;position:absolute}.cet-titlebar.cet-windows .resizer.top,.cet-titlebar.cet-linux .resizer.top{top:0;width:100%;height:6px}.cet-titlebar.cet-windows .resizer.left,.cet-titlebar.cet-linux .resizer.left{top:0;left:0;width:6px;height:100%}.cet-titlebar.cet-inverted .cet-menubar,.cet-titlebar.cet-inverted .cet-controls-container{flex-direction:row-reverse}.cet-titlebar.cet-inverted .cet-controls-container{margin:0 5px 0 0}.cet-titlebar.cet-shadow{box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)}.cet-titlebar.cet-first-buttons .cet-controls-container{order:-1;margin:0 5px 0 0}.cet-titlebar .cet-drag-region{top:0;left:0;display:block;position:absolute;width:100%;height:100%;z-index:-1;-webkit-app-region:drag}.cet-titlebar .cet-window-icon{display:flex;align-items:center;justify-content:center;width:34px;height:30px;z-index:99;overflow:hidden}.cet-titlebar .cet-window-icon img{height:16px}.cet-titlebar .cet-window-title{flex:0 1 auto;font-size:13px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;zoom:1}.cet-titlebar .cet-window-title.cet-center{position:absolute;left:50%;transform:translate(-50%, 0)}.cet-titlebar .cet-window-title.cet-bigsur{font-size:13px;font-weight:600}.cet-titlebar .cet-controls-container{display:flex;flex-grow:0;flex-shrink:0;text-align:center;position:relative;z-index:99;-webkit-app-region:no-drag;height:30px;font-family:initial}.cet-titlebar .cet-controls-container .cet-icon{width:46px}.cet-titlebar .cet-controls-container .cet-icon:not(.inactive):hover{background-color:rgba(255,255,255,.3)}.cet-titlebar .cet-controls-container .cet-icon:not(.inactive):active{background-color:rgba(255,255,255,.2)}.cet-titlebar .cet-controls-container .cet-icon.inactive svg{opacity:.4}.cet-titlebar .cet-controls-container .cet-icon.cet-window-close:not(.inactive):hover{background-color:rgba(232,17,35,.9) !important}.cet-titlebar .cet-controls-container .cet-icon.cet-window-close:not(.inactive):active{background-color:rgba(232,17,35,.5) !important}.cet-titlebar .cet-controls-container .cet-icon svg{width:10px;height:-webkit-fill-available;fill:#eee}.cet-titlebar.light .cet-controls-container .cet-icon:not(.inactive):hover{background-color:rgba(0,0,0,.2)}.cet-titlebar.light .cet-controls-container .cet-icon:not(.inactive):active{background-color:rgba(0,0,0,.1)}.cet-titlebar.light .cet-controls-container .cet-icon svg{fill:#333}.cet-titlebar.inactive .cet-window-title,.cet-titlebar.inactive .cet-controls-container .cet-icon svg,.cet-titlebar.inactive .cet-menubar .cet-menubar-menu-button{opacity:.85}.cet-container{position:absolute;left:0;right:0;bottom:0}",""]);const a=r},476:e=>{e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var i="",n=void 0!==t[5];return t[4]&&(i+="@supports (".concat(t[4],") {")),t[2]&&(i+="@media ".concat(t[2]," {")),n&&(i+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),i+=e(t),n&&(i+="}"),t[2]&&(i+="}"),t[4]&&(i+="}"),i})).join("")},t.i=function(e,i,n,s,o){"string"==typeof e&&(e=[[null,e,void 0]]);var r={};if(n)for(var a=0;a0?" ".concat(c[5]):""," {").concat(c[1],"}")),c[5]=o),i&&(c[2]?(c[1]="@media ".concat(c[2]," {").concat(c[1],"}"),c[2]=i):c[2]=i),s&&(c[4]?(c[1]="@supports (".concat(c[4],") {").concat(c[1],"}"),c[4]=s):c[4]="".concat(s)),t.push(c))}},t}},933:e=>{e.exports=function(e){return e[1]}},737:(e,t,i)=>{i.r(t),i.d(t,{default:()=>v});var n=i(892),s=i.n(n),o=i(760),r=i.n(o),a=i(311),l=i.n(a),u=i(192),c=i.n(u),h=i(60),d=i.n(h),m=i(865),p=i.n(m),f=i(526),b={};f.Z&&f.Z.locals&&(b.locals=f.Z.locals);var g,_=0,y={};y.styleTagTransform=p(),y.setAttributes=c(),y.insert=l().bind(null,"head"),y.domAPI=r(),y.insertStyleElement=d(),b.use=function(e){return y.options=e||{},_++||(g=s()(f.Z,y)),b},b.unuse=function(){_>0&&!--_&&(g(),g=null)};const v=b},946:(e,t,i)=>{i.r(t),i.d(t,{default:()=>v});var n=i(892),s=i.n(n),o=i(760),r=i.n(o),a=i(311),l=i.n(a),u=i(192),c=i.n(u),h=i(60),d=i.n(h),m=i(865),p=i.n(m),f=i(29),b={};f.Z&&f.Z.locals&&(b.locals=f.Z.locals);var g,_=0,y={};y.styleTagTransform=p(),y.setAttributes=c(),y.insert=l().bind(null,"head"),y.domAPI=r(),y.insertStyleElement=d(),b.use=function(e){return y.options=e||{},_++||(g=s()(f.Z,y)),b},b.unuse=function(){_>0&&!--_&&(g(),g=null)};const v=b},892:e=>{var t=[];function i(e){for(var i=-1,n=0;n{var t={};e.exports=function(e,i){var n=function(e){if(void 0===t[e]){var i=document.querySelector(e);if(window.HTMLIFrameElement&&i instanceof window.HTMLIFrameElement)try{i=i.contentDocument.head}catch(e){i=null}t[e]=i}return t[e]}(e);if(!n)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");n.appendChild(i)}},60:e=>{e.exports=function(e){var t=document.createElement("style");return e.setAttributes(t,e.attributes),e.insert(t,e.options),t}},192:(e,t,i)=>{e.exports=function(e){var t=i.nc;t&&e.setAttribute("nonce",t)}},760:e=>{e.exports=function(e){var t=e.insertStyleElement(e);return{update:function(i){!function(e,t,i){var n="";i.supports&&(n+="@supports (".concat(i.supports,") {")),i.media&&(n+="@media ".concat(i.media," {"));var s=void 0!==i.layer;s&&(n+="@layer".concat(i.layer.length>0?" ".concat(i.layer):""," {")),n+=i.css,s&&(n+="}"),i.media&&(n+="}"),i.supports&&(n+="}");var o=i.sourceMap;o&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(o))))," */")),t.styleTagTransform(n,e,t.options)}(t,e,i)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}},865:e=>{e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}},418:(e,t)=>{var i;Object.defineProperty(t,"__esModule",{value:!0}),t.MenubarState=void 0,(i=t.MenubarState||(t.MenubarState={}))[i.HIDDEN=0]="HIDDEN",i[i.VISIBLE=1]="VISIBLE",i[i.FOCUSED=2]="FOCUSED",i[i.OPEN=3]="OPEN"},303:function(e,t,i){const n=(this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}})(i(58)),s=i(291);e.exports={Titlebar:n.default,Color:s.Color}},410:function(e,t,i){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.cleanMnemonic=t.CETMenu=t.MENU_ESCAPED_MNEMONIC_REGEX=t.MENU_MNEMONIC_REGEX=void 0;const s=i(291),o=i(359),r=i(146),a=i(735),l=i(324),u=i(440),c=i(559),h=i(657),d=i(266),m=n(i(910)),p=i(238);t.MENU_MNEMONIC_REGEX=/\(&([^\s&])\)|(^|[^&])&([^\s&])/,t.MENU_ESCAPED_MNEMONIC_REGEX=/(&)?(&)([^\s&])/g;class f extends c.Disposable{constructor(e,t,i={},n=(()=>{})){super(),this.triggerKeys={keys:[3,10],keyDown:!0},this.parentData={parent:this},this._onDidCancel=this._register(new h.Emitter),this.menuContainer=e,this.menubarOptions=t,this.options=i,this.closeSubMenu=n,this.items=[],this.focusedItem=void 0,this.mnemonics=new Map,this._register((0,o.addDisposableListener)(this.menuContainer,o.EventType.KEY_DOWN,(e=>{const t=new l.StandardKeyboardEvent(e);let i=!0;t.equals(16)?this.focusPrevious():t.equals(18)?this.focusNext():t.equals(9)?this.cancel():this.isTriggerKeyEvent(t)?this.triggerKeys&&this.triggerKeys.keyDown&&this.doTrigger(t):i=!1,i&&(t.preventDefault(),t.stopPropagation())}))),this._register((0,o.addDisposableListener)(this.menuContainer,o.EventType.KEY_UP,(e=>{const t=new l.StandardKeyboardEvent(e);this.isTriggerKeyEvent(t)?(this.triggerKeys&&!this.triggerKeys.keyDown&&this.doTrigger(t),t.preventDefault(),t.stopPropagation()):(t.equals(2)||t.equals(1026))&&this.updateFocusedItem()}))),i.enableMnemonics&&this._register((0,o.addDisposableListener)(this.menuContainer,o.EventType.KEY_DOWN,(e=>{const t=r.KeyCodeUtils.fromString(e.key);if(this.mnemonics.has(t)){const i=this.mnemonics.get(t);if(1===i.length&&(i[0]instanceof b&&this.focusItemByElement(i[0].getContainer()),i[0].onClick(e)),i.length>1){const e=i.shift();e&&(this.focusItemByElement(e.getContainer()),i.push(e)),this.mnemonics.set(t,i)}}}))),a.isLinux&&this._register((0,o.addDisposableListener)(this.menuContainer,o.EventType.KEY_DOWN,(e=>{const t=new l.StandardKeyboardEvent(e);t.equals(14)||t.equals(11)?(this.focusedItem=this.items.length-1,this.focusNext(),o.EventHelper.stop(e,!0)):(t.equals(13)||t.equals(12))&&(this.focusedItem=0,this.focusPrevious(),o.EventHelper.stop(e,!0))}))),this._register((0,o.addDisposableListener)(this.menuContainer,o.EventType.MOUSE_OUT,(e=>{let t=e.relatedTarget;(0,o.isAncestor)(t,this.menuContainer)||(this.focusedItem=void 0,this.updateFocus(),e.stopPropagation())}))),this._register((0,o.addDisposableListener)(this.menuContainer,o.EventType.MOUSE_UP,(e=>{o.EventHelper.stop(e,!0)}))),this._register((0,o.addDisposableListener)(this.menuContainer,o.EventType.MOUSE_OVER,(e=>{let t=e.target;if(t&&(0,o.isAncestor)(t,this.menuContainer)&&t!==this.menuContainer){for(;t.parentElement!==this.menuContainer&&null!==t.parentElement;)t=t.parentElement;if((0,o.hasClass)(t,"cet-action-item")){const e=this.focusedItem;this.setFocusedItem(t),e!==this.focusedItem&&this.updateFocus()}}}))),this.options.ariaLabel&&this.menuContainer.setAttribute("aria-label",this.options.ariaLabel)}get onDidCancel(){return this._onDidCancel.event}setAriaLabel(e){e?this.menuContainer.setAttribute("aria-label",e):this.menuContainer.removeAttribute("aria-label")}isTriggerKeyEvent(e){let t=!1;return this.triggerKeys&&this.triggerKeys.keys.forEach((i=>{t=t||e.equals(i)})),t}updateFocusedItem(){for(let e=0;e{if(!e)return;const t=document.createElement("li");t.className="cet-action-item",t.setAttribute("role","presentation"),this._register((0,o.addDisposableListener)(t,o.EventType.CONTEXT_MENU,(e=>{e.preventDefault(),e.stopPropagation()})));let i=null;if("separator"===e.type)i=new g(e,this.options);else if("submenu"===e.type||e.submenu){const t=e.submenu.items;if(i=new b(e,t,this.parentData,this.menubarOptions,this.options,this.closeSubMenu),this.options.enableMnemonics){const e=i.getMnemonic();if(e&&i.isEnabled()){let t=[];this.mnemonics.has(e)&&(t=this.mnemonics.get(e)),t.push(i),this.mnemonics.set(e,t)}}}else{const t={enableMnemonics:this.options.enableMnemonics};if(i=new u.CETMenuItem(e,t,this.menubarOptions,this.closeSubMenu,this.items),this.options.enableMnemonics){const e=i.getMnemonic();if(e&&i.isEnabled()){let t=[];this.mnemonics.has(e)&&(t=this.mnemonics.get(e)),t.push(i),this.mnemonics.set(e,t)}}}i.render(t),this.menuContainer.appendChild(t),this.items.push(i)}))}focus(e){let t,i=!1;void 0===e?i=!0:"number"==typeof e?t=e:"boolean"==typeof e&&(i=e),i&&void 0===this.focusedItem?(this.focusedItem=this.items.length-1,this.focusNext()):(void 0!==t&&(this.focusedItem=t),this.updateFocus())}focusNext(){void 0===this.focusedItem&&(this.focusedItem=this.items.length-1);const e=this.focusedItem;let t;do{this.focusedItem=(this.focusedItem+1)%this.items.length,t=this.items[this.focusedItem]}while(this.focusedItem!==e&&!t.isEnabled()||t.isSeparator());(this.focusedItem===e&&!t.isEnabled()||t.isSeparator())&&(this.focusedItem=void 0),this.updateFocus()}focusPrevious(){void 0===this.focusedItem&&(this.focusedItem=0);const e=this.focusedItem;let t;do{this.focusedItem=this.focusedItem-1,this.focusedItem<0&&(this.focusedItem=this.items.length-1),t=this.items[this.focusedItem]}while(this.focusedItem!==e&&!t.isEnabled()||t.isSeparator());(this.focusedItem===e&&!t.isEnabled()||t.isSeparator())&&(this.focusedItem=void 0),this.updateFocus()}updateFocus(){void 0===this.focusedItem&&this.menuContainer.focus();for(let e=0;e=100)&&(i=100);const n=i/100,o=e.backgroundColor?.rgba,r=new s.Color(new s.RGBA(o.r,o.g,o.b,n));t.style.backgroundColor=r.toString()}this.items&&this.items.forEach((t=>{(t instanceof u.CETMenuItem||t instanceof g)&&t.style(e)}))}focusItemByElement(e){const t=this.focusedItem;e&&this.setFocusedItem(e),t!==this.focusedItem&&this.updateFocus()}setFocusedItem(e){for(let t=0;t{})){super(e,s,n,r),this.submenuItems=t,this.parentData=i,this.submenuOptions=s,this.submenuDisposables=[],this.mouseOver=!1,this.showScheduler=new d.RunOnceScheduler((()=>{this.mouseOver&&(this.cleanupExistingSubmenu(!1),this.createSubmenu(!1))}),250),this.hideScheduler=new d.RunOnceScheduler((()=>{this.container&&!(0,o.isAncestor)(document.activeElement,this.container)&&this.parentData.submenu===this.mysubmenu&&(this.parentData.parent.focus(!1),this.cleanupExistingSubmenu(!0))}),750)}render(e){super.render(e),this.itemElement&&((0,o.addClass)(this.itemElement,"cet-submenu-item"),this.itemElement.setAttribute("aria-haspopup","true"),this.submenuIndicator=(0,o.append)(this.itemElement,(0,o.$)("span.cet-submenu-indicator")),this.submenuIndicator.innerHTML=m.default.arrow,(0,p.applyFill)(this.submenuIndicator.firstElementChild,this.menubarOptions?.svgColor,this.menuStyle?.foregroundColor),this.submenuIndicator.setAttribute("aria-hidden","true"),this.container&&((0,o.addDisposableListener)(this.container,o.EventType.KEY_UP,(e=>{let t=new l.StandardKeyboardEvent(e);(t.equals(17)||t.equals(3))&&(o.EventHelper.stop(e,!0),this.createSubmenu(!0))})),(0,o.addDisposableListener)(this.container,o.EventType.KEY_DOWN,(e=>{let t=new l.StandardKeyboardEvent(e);(t.equals(17)||t.equals(3))&&o.EventHelper.stop(e,!0)})),(0,o.addDisposableListener)(this.container,o.EventType.MOUSE_OVER,(e=>{this.mouseOver||(this.mouseOver=!0,this.showScheduler.schedule())})),(0,o.addDisposableListener)(this.container,o.EventType.MOUSE_LEAVE,(e=>{this.mouseOver=!1})),(0,o.addDisposableListener)(this.container,o.EventType.FOCUS_OUT,(e=>{this.container&&!(0,o.isAncestor)(document.activeElement,this.container)&&this.hideScheduler.schedule()}))))}onClick(e){o.EventHelper.stop(e,!0),this.cleanupExistingSubmenu(!1),this.createSubmenu(!1)}cleanupExistingSubmenu(e){this.parentData.submenu&&(e||this.parentData.submenu!==this.mysubmenu)&&(this.parentData.submenu.dispose(),this.parentData.submenu=void 0,this.submenuContainer&&(this.submenuContainer=void 0))}createSubmenu(e=!0){if(this.itemElement&&this.container)if(this.parentData.submenu)this.parentData.submenu.focus(!1);else{this.submenuContainer=(0,o.append)(this.container,(0,o.$)("ul.cet-submenu")),(0,o.addClasses)(this.submenuContainer,"cet-menubar-menu-container"),this.parentData.submenu=new f(this.submenuContainer,this.menubarOptions,this.submenuOptions,this.closeSubMenu),this.parentData.submenu.createMenu(this.submenuItems),this.menuStyle&&this.parentData.submenu.style(this.menuStyle);const t=this.container.getBoundingClientRect(),i=this.submenuContainer.getBoundingClientRect(),n=getComputedStyle(this.parentData.parent.getContainer()),s=parseFloat(n.paddingTop||"0")||0;window.innerWidth<=t.right+i.width?(this.submenuContainer.style.left="10px",this.submenuContainer.style.top=`${this.container.offsetTop+t.height}px`):(this.submenuContainer.style.left=`${this.container.offsetWidth}px`,this.submenuContainer.style.top=this.container.offsetTop-s+"px"),this.submenuDisposables.push((0,o.addDisposableListener)(this.submenuContainer,o.EventType.KEY_UP,(e=>{new l.StandardKeyboardEvent(e).equals(15)&&(o.EventHelper.stop(e,!0),this.parentData.parent.focus(),this.parentData.submenu&&(this.parentData.submenu.dispose(),this.parentData.submenu=void 0),this.submenuDisposables=(0,c.dispose)(this.submenuDisposables),this.submenuContainer=void 0)}))),this.submenuDisposables.push((0,o.addDisposableListener)(this.submenuContainer,o.EventType.KEY_DOWN,(e=>{new l.StandardKeyboardEvent(e).equals(15)&&o.EventHelper.stop(e,!0)}))),this.submenuDisposables.push(this.parentData.submenu.onDidCancel((()=>{this.parentData.parent.focus(),this.parentData.submenu&&(this.parentData.submenu.dispose(),this.parentData.submenu=void 0),this.submenuDisposables=(0,c.dispose)(this.submenuDisposables),this.submenuContainer=void 0}))),this.parentData.submenu.focus(e),this.mysubmenu=this.parentData.submenu}}applyStyle(){if(super.applyStyle(),!this.menuStyle)return;const e=this.container&&(0,o.hasClass)(this.container,"focused")&&this.menuStyle.selectionForegroundColor?this.menuStyle.selectionForegroundColor:this.menuStyle.foregroundColor;(0,p.applyFill)(this.submenuIndicator?.firstElementChild,this.menubarOptions?.svgColor,e),this.parentData.submenu&&this.parentData.submenu.style(this.menuStyle)}dispose(){super.dispose(),this.hideScheduler.dispose(),this.mysubmenu&&(this.mysubmenu.dispose(),this.mysubmenu=null),this.submenuContainer&&(this.submenuDisposables=(0,c.dispose)(this.submenuDisposables),this.submenuContainer=void 0)}}class g extends u.CETMenuItem{constructor(e,t){super(e,t)}render(e){e&&(this.separatorElement=(0,o.append)(e,(0,o.$)("a.cet-action-label")),this.separatorElement.setAttribute("role","presentation"),(0,o.addClass)(this.separatorElement,"separator"))}style(e){this.separatorElement&&e.separatorColor&&(this.separatorElement.style.borderBottomColor=e.separatorColor.toString())}}t.cleanMnemonic=function(e){const i=t.MENU_MNEMONIC_REGEX,n=i.exec(e);if(!n)return e;const s=!n[1];return e.replace(i,s?"$2$3":"").trim()}},178:function(e,t,i){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.escape=t.Menubar=void 0;const s=i(298),o=i(359),r=i(410),a=i(324),l=i(146),u=i(559),c=i(657),h=i(478),d=i(735),m=i(418),p=n(i(737));t.Menubar=class{constructor(e,t,i=(()=>{})){this.container=e,this.options=t,p.default.use(),this.menuItems=[],this.mnemonics=new Map,this.closeSubMenu=i,this._focusState=m.MenubarState.VISIBLE,this._onVisibilityChange=new c.Emitter,this._onFocusStateChange=new c.Emitter,f.getInstance().event(this.onModifierKeyToggled,this),(0,o.addDisposableListener)(this.container,o.EventType.KEY_DOWN,(e=>{let t=new a.StandardKeyboardEvent(e),i=!0;const n=e.key?l.KeyCodeUtils.fromString(e.key):0;if(t.equals(15))this.focusPrevious();else if(t.equals(17))this.focusNext();else if(t.equals(9)&&this.isFocused&&!this.isOpen)this.setUnfocusedState();else if(!this.isOpen&&!t.ctrlKey&&this.options?.enableMnemonics&&this.mnemonicsInUse&&this.mnemonics.has(n)){const e=this.mnemonics.get(n);this.onMenuTriggered(e,!1)}else i=!1;i&&(t.preventDefault(),t.stopPropagation())})),(0,o.addDisposableListener)(window,o.EventType.MOUSE_DOWN,(()=>{this.isFocused&&this.setUnfocusedState()})),(0,o.addDisposableListener)(this.container,o.EventType.FOCUS_IN,(e=>{e.relatedTarget&&(this.container.contains(e.relatedTarget)||(this.focusToReturn=e.relatedTarget))})),(0,o.addDisposableListener)(this.container,o.EventType.FOCUS_OUT,(e=>{e.relatedTarget&&(this.container.contains(e.relatedTarget)||(this.focusToReturn=void 0,this.setUnfocusedState()))})),(0,o.addDisposableListener)(window,o.EventType.KEY_DOWN,(e=>{if(!this.options?.enableMnemonics||!e.altKey||e.ctrlKey||e.defaultPrevented)return;const t=l.KeyCodeUtils.fromString(e.key);if(!this.mnemonics.has(t))return;this.mnemonicsInUse=!0,this.updateMnemonicVisibility(!0);const i=this.mnemonics.get(t);this.onMenuTriggered(i,!1)})),this.setUnfocusedState(),this.registerListeners()}registerListeners(){d.isMacintosh||(0,o.addDisposableListener)(window,o.EventType.RESIZE,(()=>{this.blur()}))}setupMenubar(){const e=this.options?.menu?.items;this.onFocusStateChange((e=>this._onFocusStateChange.fire(e))),this.onVisibilityChange((e=>this._onVisibilityChange.fire(e))),e?.forEach((e=>{if(!e)return;const t=this.menuItems.length,i=(0,r.cleanMnemonic)(e.label),n=(0,o.$)("div.cet-menubar-menu-button",{tabindex:-1,"aria-label":i,"aria-haspopup":!0});e.enabled||(0,o.addClass)(n,"disabled");const s=(0,o.$)("div.cet-menubar-menu-title",{"aria-hidden":!0});n.appendChild(s),(0,o.append)(this.container,n);let l=r.MENU_MNEMONIC_REGEX.exec(e.label);if(l){let e=l[1]?l[1]:l[2];this.registerMnemonic(this.menuItems.length,e)}this.updateLabels(s,n,e.label),e.enabled&&((0,o.addDisposableListener)(n,o.EventType.KEY_UP,(e=>{let i=new a.StandardKeyboardEvent(e),n=!0;!i.equals(18)&&!i.equals(3)||this.isOpen?n=!1:(this.focusedMenu={index:t},this.openedViaKeyboard=!0,this.focusState=m.MenubarState.OPEN),n&&(i.preventDefault(),i.stopPropagation())})),(0,o.addDisposableListener)(n,o.EventType.MOUSE_DOWN,(e=>{this.isOpen?this.ignoreNextMouseUp=!1:(this.ignoreNextMouseUp=!0,this.onMenuTriggered(t,!0)),e.preventDefault(),e.stopPropagation()})),(0,o.addDisposableListener)(n,o.EventType.MOUSE_UP,(()=>{this.ignoreNextMouseUp?this.ignoreNextMouseUp=!1:this.isFocused&&this.onMenuTriggered(t,!0)})),(0,o.addDisposableListener)(n,o.EventType.MOUSE_ENTER,(()=>{this.isOpen&&!this.isCurrentMenu(t)?(this.menuItems[t].buttonElement.focus(),this.cleanupMenu(),this.menuItems[t].submenu&&this.showMenu(t,!1)):this.isFocused&&!this.isOpen&&(this.focusedMenu={index:t},n.focus())})),this.menuItems.push({menuItem:e,submenu:e.submenu,buttonElement:n,titleElement:s}))}))}onClick(e){const t=this.menuItems[e].menuItem;s.ipcRenderer.send("menu-event",t.commandId)}get onVisibilityChange(){return this._onVisibilityChange.event}get onFocusStateChange(){return this._onFocusStateChange.event}dispose(){this.menuItems.forEach((e=>{(0,o.removeNode)(e.titleElement),(0,o.removeNode)(e.buttonElement)}))}blur(){this.setUnfocusedState()}setStyles(e){this.menuStyle=e}updateLabels(e,t,i){const n=(0,r.cleanMnemonic)(i);if(this.options?.enableMnemonics){let t=b(i);r.MENU_ESCAPED_MNEMONIC_REGEX.lastIndex=0;let n=r.MENU_ESCAPED_MNEMONIC_REGEX.exec(t);for(;n&&n[1];)n=r.MENU_ESCAPED_MNEMONIC_REGEX.exec(t);n&&(t=`${t.substr(0,n.index)}${t.substr(n.index+n[0].length)}`),t=t.replace(/&&/g,"&"),e.innerHTML=t}else e.innerHTML=n.replace(/&&/g,"&");let s=r.MENU_MNEMONIC_REGEX.exec(i);if(s){let e=s[1]?s[1]:s[3];this.options?.enableMnemonics?t.setAttribute("aria-keyshortcuts","Alt+"+e.toLocaleLowerCase()):t.removeAttribute("aria-keyshortcuts")}}registerMnemonic(e,t){this.mnemonics.set(l.KeyCodeUtils.fromString(t),e)}hideMenubar(){"none"!==this.container.style.display&&(this.container.style.display="none")}showMenubar(){"flex"!==this.container.style.display&&(this.container.style.display="flex")}get focusState(){return this._focusState}set focusState(e){if(e===this._focusState)return;const t=this.isVisible,i=this.isOpen,n=this.isFocused;switch(this._focusState=e,e){case m.MenubarState.HIDDEN:t&&this.hideMenubar(),i&&this.cleanupMenu(),n&&(this.focusedMenu=void 0,this.focusToReturn&&(this.focusToReturn.focus(),this.focusToReturn=void 0));break;case m.MenubarState.VISIBLE:t||this.showMenubar(),i&&this.cleanupMenu(),n&&(this.focusedMenu&&this.menuItems[this.focusedMenu.index]?.buttonElement.blur(),this.focusedMenu=void 0,this.focusToReturn&&(this.focusToReturn.focus(),this.focusToReturn=void 0));break;case m.MenubarState.FOCUSED:t||this.showMenubar(),i&&this.cleanupMenu(),this.focusedMenu&&this.menuItems[this.focusedMenu.index]?.buttonElement.focus();break;case m.MenubarState.OPEN:t||this.showMenubar(),this.focusedMenu&&this.menuItems[this.focusedMenu.index].submenu&&this.showMenu(this.focusedMenu.index,this.openedViaKeyboard)}this._focusState=e}get isVisible(){return this.focusState>=m.MenubarState.VISIBLE}get isFocused(){return this.focusState>=m.MenubarState.FOCUSED}get isOpen(){return this.focusState>=m.MenubarState.OPEN}setUnfocusedState(){this.focusState=m.MenubarState.VISIBLE,this.ignoreNextMouseUp=!1,this.mnemonicsInUse=!1,this.updateMnemonicVisibility(!1)}focusPrevious(){if(!this.focusedMenu)return;let e=(this.focusedMenu.index-1+this.menuItems.length)%this.menuItems.length;e!==this.focusedMenu.index&&(this.isOpen?(this.cleanupMenu(),this.menuItems[e].submenu&&this.showMenu(e)):this.isFocused&&(this.focusedMenu.index=e,this.menuItems[e].buttonElement.focus()))}focusNext(){if(!this.focusedMenu)return;let e=(this.focusedMenu.index+1)%this.menuItems.length;e!==this.focusedMenu.index&&(this.isOpen?(this.cleanupMenu(),this.menuItems[e].submenu&&this.showMenu(e)):this.isFocused&&(this.focusedMenu.index=e,this.menuItems[e].buttonElement.focus()))}updateMnemonicVisibility(e){this.menuItems&&this.menuItems.forEach((t=>{if(t.titleElement.children.length){let i=t.titleElement.children.item(0);i&&e&&(i.style.textDecoration="underline")}}))}get mnemonicsInUse(){return this._mnemonicsInUse}set mnemonicsInUse(e){this._mnemonicsInUse=e}onMenuTriggered(e,t){this.isOpen?this.isCurrentMenu(e)?this.setUnfocusedState():(this.cleanupMenu(),this.menuItems[e].submenu?this.showMenu(e,this.openedViaKeyboard):this.menuItems[e].menuItem.enabled&&this.onClick(e)):(this.focusedMenu={index:e},this.openedViaKeyboard=!t,this.menuItems[e].submenu?this.focusState=m.MenubarState.OPEN:this.menuItems[e].menuItem.enabled&&this.onClick(e))}onModifierKeyToggled(e){const t=!e.altKey&&!e.ctrlKey&&!e.shiftKey;this.isFocused&&"alt"===e.lastKeyPressed&&e.altKey&&(this.setUnfocusedState(),this.mnemonicsInUse=!1,this.awaitingAltRelease=!0),t&&"alt"===e.lastKeyPressed&&"alt"===e.lastKeyReleased&&(this.awaitingAltRelease||(this.isFocused?this.isOpen||this.setUnfocusedState():(this.mnemonicsInUse=!0,this.focusedMenu={index:0},this.focusState=m.MenubarState.FOCUSED))),e.altKey||"alt"!==e.lastKeyReleased||(this.awaitingAltRelease=!1),this.options?.enableMnemonics&&this.menuItems&&!this.isOpen&&this.updateMnemonicVisibility(!this.awaitingAltRelease&&e.altKey||this.mnemonicsInUse)}isCurrentMenu(e){return!!this.focusedMenu&&this.focusedMenu.index===e}cleanupMenu(){this.focusedMenu&&(this.menuItems[this.focusedMenu.index].buttonElement.focus(),this.focusedMenu.holder&&(this.focusedMenu.holder.parentElement&&(0,o.removeClass)(this.focusedMenu.holder.parentElement,"open"),this.focusedMenu.holder.remove()),this.focusedMenu.widget&&this.focusedMenu.widget.dispose(),this.focusedMenu={index:this.focusedMenu.index})}showMenu(e,t=!0){const i=this.menuItems[e],n=i.buttonElement,s=n.getBoundingClientRect(),a=(0,o.$)("ul.cet-menubar-menu-container");(0,o.addClass)(n,"open"),a.tabIndex=0,a.style.top=s.bottom-5+"px",a.style.left=`${s.left}px`,n.appendChild(a),a.style.maxHeight=`${Math.max(10,window.innerHeight-s.top-50)}px`;let l={enableMnemonics:this.mnemonicsInUse&&this.options?.enableMnemonics,ariaLabel:n.attributes.getNamedItem("aria-label")?.value},u=new r.CETMenu(a,this.options,l,this.closeSubMenu);u.createMenu(i.submenu?.items),u.style(this.menuStyle),u.onDidCancel((()=>{this.focusState=m.MenubarState.FOCUSED})),u.focus(t),this.focusedMenu={index:e,holder:a,widget:u}}};class f extends c.Emitter{constructor(){super(),this._subscriptions=[],this._keyStatus={altKey:!1,shiftKey:!1,ctrlKey:!1},this._subscriptions.push((0,h.domEvent)(document.body,"keydown",!0)((e=>{const t=new a.StandardKeyboardEvent(e);if(e.altKey&&!this._keyStatus.altKey)this._keyStatus.lastKeyPressed="alt";else if(e.ctrlKey&&!this._keyStatus.ctrlKey)this._keyStatus.lastKeyPressed="ctrl";else if(e.shiftKey&&!this._keyStatus.shiftKey)this._keyStatus.lastKeyPressed="shift";else{if(6===t.keyCode)return;this._keyStatus.lastKeyPressed=void 0}this._keyStatus.altKey=e.altKey,this._keyStatus.ctrlKey=e.ctrlKey,this._keyStatus.shiftKey=e.shiftKey,this._keyStatus.lastKeyPressed&&this.fire(this._keyStatus)}))),this._subscriptions.push((0,h.domEvent)(document.body,"keyup",!0)((e=>{!e.altKey&&this._keyStatus.altKey?this._keyStatus.lastKeyReleased="alt":!e.ctrlKey&&this._keyStatus.ctrlKey?this._keyStatus.lastKeyReleased="ctrl":!e.shiftKey&&this._keyStatus.shiftKey?this._keyStatus.lastKeyReleased="shift":this._keyStatus.lastKeyReleased=void 0,this._keyStatus.lastKeyPressed!==this._keyStatus.lastKeyReleased&&(this._keyStatus.lastKeyPressed=void 0),this._keyStatus.altKey=e.altKey,this._keyStatus.ctrlKey=e.ctrlKey,this._keyStatus.shiftKey=e.shiftKey,this._keyStatus.lastKeyReleased&&this.fire(this._keyStatus)}))),this._subscriptions.push((0,h.domEvent)(document.body,"mousedown",!0)((e=>{this._keyStatus.lastKeyPressed=void 0}))),this._subscriptions.push((0,h.domEvent)(window,"blur")((e=>{this._keyStatus.lastKeyPressed=void 0,this._keyStatus.lastKeyReleased=void 0,this._keyStatus.altKey=!1,this._keyStatus.shiftKey=!1,this._keyStatus.shiftKey=!1,this.fire(this._keyStatus)})))}static getInstance(){return f.instance||(f.instance=new f),f.instance}dispose(){super.dispose(),this._subscriptions=(0,u.dispose)(this._subscriptions)}}function b(e){return e.replace(/[<>&]/g,(function(e){switch(e){case"<":return"<";case">":return">";case"&":return"&";default:return e}}))}t.escape=b},440:function(e,t,i){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.CETMenuItem=void 0;const s=i(298),o=i(359),r=i(410),a=i(146),l=i(559),u=i(735),c=n(i(910)),h=i(238);class d extends l.Disposable{constructor(e,t={},i,n=(()=>{}),s){if(super(),this.item=e,this.menubarOptions=i,this.options=t,this.closeSubMenu=n,s&&(this.menuContainer=s),this.item.label&&t.enableMnemonics){let e=this.item.label;if(e){let t=r.MENU_MNEMONIC_REGEX.exec(e);t&&(this.mnemonic=a.KeyCodeUtils.fromString((t[1]?t[1]:t[2]).toLocaleUpperCase()))}}}getContainer(){return this.container}getItem(){return this.item}isEnabled(){return this.item.enabled}isSeparator(){return"separator"===this.item.type}render(e){this.container=e,this._register((0,o.addDisposableListener)(this.container,o.EventType.MOUSE_DOWN,(e=>{this.item.enabled&&0===e.button&&this.container&&(0,o.addClass)(this.container,"active")}))),this._register((0,o.addDisposableListener)(this.container,o.EventType.CLICK,(e=>{this.item.enabled&&this.onClick(e)}))),this._register((0,o.addDisposableListener)(this.container,o.EventType.DBLCLICK,(e=>{o.EventHelper.stop(e,!0)}))),[o.EventType.MOUSE_UP,o.EventType.MOUSE_OUT].forEach((e=>{this._register((0,o.addDisposableListener)(this.container,e,(e=>{o.EventHelper.stop(e),(0,o.removeClass)(this.container,"active")})))})),this.itemElement=(0,o.append)(this.container,(0,o.$)("a.cet-action-menu-item")),this.mnemonic&&this.itemElement.setAttribute("aria-keyshortcuts",`${this.mnemonic}`),this.iconElement=(0,o.append)(this.itemElement,(0,o.$)("span.cet-menu-item-icon")),this.iconElement.setAttribute("role","none"),this.labelElement=(0,o.append)(this.itemElement,(0,o.$)("span.cet-action-label")),this.setAccelerator(),this.updateLabel(),this.updateIcon(),this.updateTooltip(),this.updateEnabled(),this.updateChecked(),this.updateVisibility()}onClick(e){o.EventHelper.stop(e,!0),s.ipcRenderer.send("menu-event",this.item.commandId),"checkbox"===this.item.type?(this.item.checked=!this.item.checked,this.updateChecked()):"radio"===this.item.type?this.updateRadioGroup():this.closeSubMenu()}focus(){this.container&&(this.container.focus(),(0,o.addClass)(this.container,"focused")),this.applyStyle()}blur(){this.container&&(this.container.blur(),(0,o.removeClass)(this.container,"focused")),this.applyStyle()}setAccelerator(){var e=null;if(this.item.role)switch(this.item.role.toLocaleLowerCase()){case"undo":e="CtrlOrCmd+Z";break;case"redo":e="CtrlOrCmd+Y";break;case"cut":e="CtrlOrCmd+X";break;case"copy":e="CtrlOrCmd+C";break;case"paste":e="CtrlOrCmd+V";break;case"selectall":e="CtrlOrCmd+A";break;case"minimize":e="CtrlOrCmd+M";break;case"close":e="CtrlOrCmd+W";break;case"reload":e="CtrlOrCmd+R";break;case"forcereload":e="CtrlOrCmd+Shift+R";break;case"toggledevtools":e="CtrlOrCmd+Shift+I";break;case"togglefullscreen":e="F11";break;case"resetzoom":e="CtrlOrCmd+0";break;case"zoomin":e="CtrlOrCmd+Shift+=";break;case"zoomout":e="CtrlOrCmd+-"}this.item.label&&this.item.accelerator&&(e=this.item.accelerator),this.itemElement&&null!==e&&((0,o.append)(this.itemElement,(0,o.$)("span.keybinding")).textContent=m(e))}updateLabel(){if(this.item.label){let e=this.item.label;if(e){const t=(0,r.cleanMnemonic)(e);this.options.enableMnemonics||(e=t),this.labelElement&&this.labelElement.setAttribute("aria-label",t.replace(/&&/g,"&"));const i=r.MENU_MNEMONIC_REGEX.exec(e);if(i){e=escape(e),r.MENU_ESCAPED_MNEMONIC_REGEX.lastIndex=0;let t=r.MENU_ESCAPED_MNEMONIC_REGEX.exec(e);for(;t&&t[1];)t=r.MENU_ESCAPED_MNEMONIC_REGEX.exec(e);t&&(e=`${e.substr(0,t.index)}${e.substr(t.index+t[0].length)}`),e=e.replace(/&&/g,"&"),this.itemElement&&this.itemElement.setAttribute("aria-keyshortcuts",(i[1]?i[1]:i[3]).toLocaleLowerCase())}else e=e.replace(/&&/g,"&")}this.labelElement&&(this.labelElement.innerHTML=e.trim())}}updateIcon(){if(this.item.icon){const e=this.item.icon;this.iconElement&&e&&(0,o.append)(this.iconElement,(0,o.$)("img")).setAttribute("src",e.toString())}else this.iconElement&&"checkbox"===this.item.type?((0,o.addClass)(this.iconElement,"checkbox"),this.iconElement.innerHTML=c.default.check):"radio"===this.item.type&&((0,o.addClass)(this.iconElement,"radio"),this.iconElement.innerHTML=this.item.checked?c.default.radio.checked:c.default.radio.unchecked);(0,h.applyFill)(this.iconElement?.firstElementChild,this.menubarOptions?.svgColor,this.menuStyle?.foregroundColor)}updateTooltip(){let e=null;this.item.sublabel?e=this.item.sublabel:!this.item.label&&this.item.label&&this.item.icon&&(e=this.item.label,this.item.accelerator&&(e=m(this.item.accelerator))),this.itemElement&&e&&(this.itemElement.title=e)}updateEnabled(){this.container&&(this.item.enabled&&"separator"!==this.item.type?((0,o.removeClass)(this.container,"disabled"),this.container.tabIndex=0):(0,o.addClass)(this.container,"disabled"))}updateVisibility(){!1===this.item.visible&&this.itemElement&&this.itemElement.remove()}updateChecked(){this.itemElement&&(this.item.checked?((0,o.addClass)(this.itemElement,"checked"),this.itemElement.setAttribute("aria-checked","true")):((0,o.removeClass)(this.itemElement,"checked"),this.itemElement.setAttribute("aria-checked","false")))}updateRadioGroup(){if(void 0===this.radioGroup&&(this.radioGroup=this.getRadioGroup()),this.menuContainer)for(let e=this.radioGroup.start;e=11,b="60px",g=f?"28px":"22px",_="30px";t.default=class{constructor(e){this._defaultOptions={titleHorizontalAlignment:"center",menuPosition:"left",enableMnemonics:!0,minimizable:!0,maximizable:!0,closeable:!0},this._closeMenu=()=>{this._menubar&&this._menubar.blur()},this._options={...this._defaultOptions,...e},this._platformIcons=u.default[(0,o.PlatformToString)(o.platform).toLocaleLowerCase()],this._titlebar=(0,a.$)("div.cet-titlebar"),this._dragRegion=(0,a.$)("div.cet-drag-region"),this._windowIcon=(0,a.$)("div.cet-window-icon"),this._menubarContainer=(0,a.$)("div.cet-menubar"),this._title=(0,a.$)("div.cet-window-title"),this._windowControls=(0,a.$)("div.cet-controls-container"),this._container=(0,a.$)("div.cet-container"),this._windowControlIcons={minimize:(0,a.$)("div.cet-icon"),maximize:(0,a.$)("div.cet-icon"),close:(0,a.$)("div.cet-icon")},this._resizer={top:(0,a.$)("div.resizer.top"),left:(0,a.$)("div.resizer.left")},this._loadIcons(),this._loadBackgroundColor(),this._setupContainer(),this._setupIcon(),this._setupMenubar(),this._setupTitle(),this._createControls(),this._setupTitlebar(),this._updateStyles(),this._loadEvents(),c.default.use()}_loadIcons(){if(this._options.icons){const e=JSON.parse(this._options.icons);this._platformIcons=e[(0,o.PlatformToString)(o.platform).toLocaleLowerCase()]}}_loadBackgroundColor(){let e=r.Color.fromHex("#ffffff");if(!this._options.backgroundColor){const t=[].slice.call(document.getElementsByTagName("meta"));for(let i of t)if("theme-color"===i.name||"msapplication-TileColor"===i.name){e=r.Color.fromHex(i.content||"#ffffff");break}this._options.backgroundColor=e}}_setupTitlebar(){(0,a.addClass)(this._titlebar,`cet-${(0,o.PlatformToString)(o.platform).toLocaleLowerCase()}`),this._options.order&&(0,a.addClass)(this._titlebar,`cet-${this._options.order}`),this._options.shadow&&(0,a.addClass)(this._titlebar,"cet-shadow"),o.isMacintosh||(this._title.style.cursor="default"),f&&((0,a.addClass)(this._title,"cet-bigsur"),this._titlebar.style.height=g),(0,a.prepend)(document.body,this._titlebar)}_setupContainer(){for(document.body.style.margin="0",document.body.style.overflow="hidden",this._container.style.overflow=this._options.containerOverflow??"auto";document.body.firstChild;)(0,a.append)(this._container,document.body.firstChild);(0,a.append)(document.body,this._container),(0,a.append)(this._titlebar,this._dragRegion),(0,a.append)(this._titlebar,this._resizer.left),(0,a.append)(this._titlebar,this._resizer.top)}_loadEvents(){s.ipcRenderer.on("window-maximize",((e,t)=>this._onDidChangeMaximized(t))),s.ipcRenderer.on("window-fullscreen",((e,t)=>this.onWindowFullScreen(t))),s.ipcRenderer.on("window-focus",((e,t)=>this.onWindowFocus(t))),this._options.minimizable&&(0,a.addDisposableListener)(this._windowControlIcons.minimize,a.EventType.CLICK,(()=>{s.ipcRenderer.send("window-event","window-minimize")})),o.isMacintosh&&(0,a.addDisposableListener)(this._titlebar,a.EventType.DBLCLICK,(()=>{s.ipcRenderer.send("window-event","window-maximize")})),this._options.maximizable&&(0,a.addDisposableListener)(this._windowControlIcons.maximize,a.EventType.CLICK,(()=>{s.ipcRenderer.send("window-event","window-maximize")})),this._options.closeable&&(0,a.addDisposableListener)(this._windowControlIcons.close,a.EventType.CLICK,(()=>{s.ipcRenderer.send("window-event","window-close")}))}_setupIcon(){if(!o.isMacintosh){if(!this._options.icon){let e;const t=[].slice.call(document.getElementsByTagName("link"));for(let i of t)if("icon"===i.rel||"shortcut icon"===i.rel){e=i.href||void 0;break}this._options.icon=e}const e=(0,a.append)(this._windowIcon,(0,a.$)("img"));"string"==typeof this._options.icon?e.setAttribute("src",`${this._options.icon}`):e.setAttribute("src",this._options.icon&&this._options.icon.toDataURL()||""),this._setIconSize(this._options.iconSize),(0,a.append)(this._titlebar,this._windowIcon)}}_setupMenubar(){this._options.menu?this.updateMenu(this._options.menu):null!==this._options.menu&&s.ipcRenderer.invoke("request-application-menu").then((e=>this.updateMenu(e))),this._options.menuPosition&&this.updateMenuPosition(this._options.menuPosition),(0,a.append)(this._titlebar,this._menubarContainer)}_setupTitle(){this.updateTitle(document.title),this.updateTitleAlignment(this._options.titleHorizontalAlignment),(0,a.append)(this._titlebar,this._title)}_setIconSize(e){(!e||e<=16)&&(e=16),e>=24&&(e=24),this._windowIcon.firstElementChild.setAttribute("height",`${e}px`)}_createControl(e,t,i,n,s){e.title=i,e.innerHTML=n,(0,a.addClass)(e,s),t||(0,a.addClass)(e,"inactive"),(0,a.append)(this._windowControls,e)}_createControls(){o.isMacintosh||(this._createControl(this._windowControlIcons.minimize,this._options.minimizable,"Minimize",this._platformIcons.minimize,"cet-window-minimize"),this._createControl(this._windowControlIcons.maximize,this._options.maximizable,"Maximize",this._platformIcons.maximize,"cet-max-restore"),this._createControl(this._windowControlIcons.close,this._options.closeable,"Close",this._platformIcons.close,"cet-window-close"),(0,a.append)(this._titlebar,this._windowControls))}_onBlur(){this._isInactive=!0,this._updateStyles()}_onFocus(){this._isInactive=!1,this._updateStyles()}_onMenubarVisibilityChanged(e){(o.isWindows||o.isLinux)&&e&&((0,a.hide)(this._dragRegion),setTimeout((()=>(0,a.show)(this._dragRegion)),50))}_onMenubarFocusChanged(e){(o.isWindows||o.isLinux)&&(e?(0,a.hide)(this._dragRegion):(0,a.show)(this._dragRegion))}_onDidChangeMaximized(e){this._windowControlIcons.maximize&&(this._windowControlIcons.maximize.title=e?"Restore Down":"Maximize",this._windowControlIcons.maximize.innerHTML=e?this._platformIcons.restore:this._platformIcons.maximize),this._resizer&&(e?(0,a.hide)(this._resizer.top,this._resizer.left):(0,a.show)(this._resizer.top,this._resizer.left))}_updateStyles(){this._isInactive?(0,a.addClass)(this._titlebar,"inactive"):(0,a.removeClass)(this._titlebar,"inactive");const e=this._isInactive?this._options.backgroundColor?.lighten(.15):this._options.backgroundColor;let t;e&&(this._titlebar.style.backgroundColor=e.toString()),e?.isLighter()?((0,a.addClass)(this._titlebar,"light"),t=this._isInactive?h:d):((0,a.removeClass)(this._titlebar,"light"),t=this._isInactive?m:p),this._titlebar.style.color=t.toString();const i=this._options.backgroundColor?.darken(.16),n=i?.isLighter()?h:m,s=!this._options.itemBackgroundColor||this._options.itemBackgroundColor.equals(i)?new r.Color(new r.RGBA(0,0,0,.12)):this._options.itemBackgroundColor,o=s.isLighter()?d:p;this._menubar&&this._menubar.setStyles({backgroundColor:i,foregroundColor:n,selectionBackgroundColor:s,selectionForegroundColor:o,separatorColor:n})}onWindowFocus(e){this._titlebar&&(e?((0,a.removeClass)(this._titlebar,"inactive"),this._onFocus()):((0,a.addClass)(this._titlebar,"inactive"),this._closeMenu(),this._onBlur()))}onWindowFullScreen(e){o.isMacintosh||(e?((0,a.hide)(this._titlebar),this._container.style.top="0px"):((0,a.show)(this._titlebar),"bottom"===this._options.menuPosition?this._container.style.top=b:this._container.style.top=o.isMacintosh?g:_))}updateBackground(e){return this._options.backgroundColor=e,this._updateStyles(),this}updateItemBGColor(e){return this._options.itemBackgroundColor=e,this._updateStyles(),this}updateTitle(e){this._title&&(document.title=e,this._title.innerText=e)}updateIcon(e){e&&this._windowIcon&&(this._windowIcon.src=e)}updateMenu(e){if(!o.isMacintosh){if(this._menubar&&this._menubar.dispose(),!e)return this;this._options.menu=e,this._menubar=new l.Menubar(this._menubarContainer,this._options,this._closeMenu),this._menubar.setupMenubar(),this._menubar.onVisibilityChange((e=>this._onMenubarVisibilityChanged(e))),this._menubar.onFocusStateChange((e=>this._onMenubarFocusChanged(e))),this._updateStyles()}return this}async refreshMenu(){o.isMacintosh||s.ipcRenderer.invoke("request-application-menu").then((e=>this.updateMenu(e)))}updateMenuPosition(e){const t=o.isMacintosh?g:_;return this._options.menuPosition=e,this._titlebar.style.height="bottom"===e?b:t,this._container.style.top="bottom"===e?b:t,"bottom"===e?(0,a.addClass)(this._menubarContainer,"bottom"):(0,a.removeClass)(this._menubarContainer,"bottom"),this}updateTitleAlignment(e){return("left"===e||"right"===e&&"inverted"===this._options.order)&&(this._title.style.marginLeft="8px",this._title.style.marginRight="auto"),("right"===e||"left"===e&&"inverted"===this._options.order)&&(this._title.style.marginRight="8px",this._title.style.marginLeft="auto"),"center"!==e&&void 0!==e||("bottom"!==this._options.menuPosition&&(0,a.addClass)(this._title,"cet-center"),o.isMacintosh||"first-buttons"===this._options.order||(this._windowControls.style.marginLeft="auto"),this._title.style.maxWidth="calc(100vw - 296px)"),this}dispose(){for(this._menubar&&this._menubar.dispose(),this._titlebar.remove();this._container.firstChild;)(0,a.append)(document.body,this._container.firstChild);this._container.remove()}}},238:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.applyFill=void 0,t.applyFill=(e,t,i)=>{let n="";t?n=t.toString():i&&(n=i.toString()),e&&null!==e&&e.setAttribute("fill",n)}},93:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.hasClipboardSupport=t.isEdgeWebView=t.isIPad=t.isWebkitWebView=t.isSafari=t.isChrome=t.isWebKit=t.isFirefox=t.isOpera=t.isEdgeOrIE=t.isEdge=t.isIE=t.onDidChangeAccessibilitySupport=t.getAccessibilitySupport=t.setAccessibilitySupport=t.onDidChangeFullscreen=t.isFullscreen=t.setFullscreen=t.getPixelRatio=t.setZoomFactor=t.getZoomFactor=t.onDidChangeZoomLevel=t.getTimeSinceLastZoomLevelChanged=t.getZoomLevel=t.setZoomLevel=void 0;const n=i(657);class s{constructor(){this._zoomLevel=0,this._lastZoomLevelChangeTime=0,this._onDidChangeZoomLevel=new n.Emitter,this.onDidChangeZoomLevel=this._onDidChangeZoomLevel.event,this._zoomFactor=0,this._fullscreen=!1,this._onDidChangeFullscreen=new n.Emitter,this.onDidChangeFullscreen=this._onDidChangeFullscreen.event,this._accessibilitySupport=0,this._onDidChangeAccessibilitySupport=new n.Emitter,this.onDidChangeAccessibilitySupport=this._onDidChangeAccessibilitySupport.event}getZoomLevel(){return this._zoomLevel}getTimeSinceLastZoomLevelChanged(){return Date.now()-this._lastZoomLevelChangeTime}setZoomLevel(e,t){this._zoomLevel!==e&&(this._zoomLevel=e,this._lastZoomLevelChangeTime=t?0:Date.now(),this._onDidChangeZoomLevel.fire(this._zoomLevel))}getZoomFactor(){return this._zoomFactor}setZoomFactor(e){this._zoomFactor=e}getPixelRatio(){let e=document.createElement("canvas").getContext("2d");return(window.devicePixelRatio||1)/(e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1)}setFullscreen(e){this._fullscreen!==e&&(this._fullscreen=e,this._onDidChangeFullscreen.fire())}isFullscreen(){return this._fullscreen}setAccessibilitySupport(e){this._accessibilitySupport!==e&&(this._accessibilitySupport=e,this._onDidChangeAccessibilitySupport.fire())}getAccessibilitySupport(){return this._accessibilitySupport}}s.INSTANCE=new s,t.setZoomLevel=function(e,t){s.INSTANCE.setZoomLevel(e,t)},t.getZoomLevel=function(){return s.INSTANCE.getZoomLevel()},t.getTimeSinceLastZoomLevelChanged=function(){return s.INSTANCE.getTimeSinceLastZoomLevelChanged()},t.onDidChangeZoomLevel=function(e){return s.INSTANCE.onDidChangeZoomLevel(e)},t.getZoomFactor=function(){return s.INSTANCE.getZoomFactor()},t.setZoomFactor=function(e){s.INSTANCE.setZoomFactor(e)},t.getPixelRatio=function(){return s.INSTANCE.getPixelRatio()},t.setFullscreen=function(e){s.INSTANCE.setFullscreen(e)},t.isFullscreen=function(){return s.INSTANCE.isFullscreen()},t.onDidChangeFullscreen=s.INSTANCE.onDidChangeFullscreen,t.setAccessibilitySupport=function(e){s.INSTANCE.setAccessibilitySupport(e)},t.getAccessibilitySupport=function(){return s.INSTANCE.getAccessibilitySupport()},t.onDidChangeAccessibilitySupport=function(e){return s.INSTANCE.onDidChangeAccessibilitySupport(e)};const o=navigator.userAgent;t.isIE=o.indexOf("Trident")>=0,t.isEdge=o.indexOf("Edge/")>=0,t.isEdgeOrIE=t.isIE||t.isEdge,t.isOpera=o.indexOf("Opera")>=0,t.isFirefox=o.indexOf("Firefox")>=0,t.isWebKit=o.indexOf("AppleWebKit")>=0,t.isChrome=o.indexOf("Chrome")>=0,t.isSafari=!t.isChrome&&o.indexOf("Safari")>=0,t.isWebkitWebView=!t.isChrome&&!t.isSafari&&t.isWebKit,t.isIPad=o.indexOf("iPad")>=0,t.isEdgeWebView=t.isEdge&&o.indexOf("WebView/")>=0,t.hasClipboardSupport=function(){if(t.isIE)return!1;if(t.isEdge){let e=o.indexOf("Edge/"),t=parseInt(o.substring(e+5,o.indexOf(".",e)),10);if(!t||t>=12&&t<=16)return!1}return!0}},478:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.stop=t.domEvent=void 0;const n=i(657);t.domEvent=(e,t,i)=>{const s=e=>o.fire(e),o=new n.Emitter({onFirstListenerAdd:()=>{e.addEventListener(t,s,i)},onLastListenerRemove:()=>{e.removeEventListener(t,s,i)}});return o.event},t.stop=function(e){return n.Event.map(e,(e=>(e.preventDefault(),e.stopPropagation(),e)))}},278:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.IframeUtils=void 0;let i=!1,n=null;function s(e){if(!e.parent||e.parent===e)return null;try{let t=e.location,n=e.parent.location;if(t.protocol!==n.protocol||t.hostname!==n.hostname||t.port!==n.port)return i=!0,null}catch(e){return i=!0,null}return e.parent}function o(e,t){let i,n=e.document.getElementsByTagName("iframe");for(let e=0,s=n.length;e{Object.defineProperty(t,"__esModule",{value:!0}),t.coalesce=void 0,t.coalesce=function(e){return e?e.filter((e=>!!e)):e}},266:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RunOnceScheduler=t.TimeoutTimer=void 0;const n=i(559);class s extends n.Disposable{constructor(e,t){super(),this._token=-1,"function"==typeof e&&"number"==typeof t&&this.setIfNotSet(e,t)}dispose(){this.cancel(),super.dispose()}cancel(){-1!==this._token&&(clearTimeout(this._token),this._token=-1)}cancelAndSet(e,t){this.cancel(),this._token=setTimeout((()=>{this._token=-1,e()}),t)}setIfNotSet(e,t){-1===this._token&&(this._token=setTimeout((()=>{this._token=-1,e()}),t))}}t.TimeoutTimer=s,t.RunOnceScheduler=class{constructor(e,t){this.timeoutToken=-1,this.runner=e,this.timeout=t,this.timeoutHandler=this.onTimeout.bind(this)}dispose(){this.cancel(),this.runner=null}cancel(){this.isScheduled()&&(clearTimeout(this.timeoutToken),this.timeoutToken=-1)}schedule(e=this.timeout){this.cancel(),this.timeoutToken=setTimeout(this.timeoutHandler,e)}isScheduled(){return-1!==this.timeoutToken}onTimeout(){this.timeoutToken=-1,this.runner&&this.doRun()}doRun(){this.runner&&this.runner()}}},291:(e,t)=>{function i(e,t){const i=Math.pow(10,t);return Math.round(e*i)/i}Object.defineProperty(t,"__esModule",{value:!0}),t.Color=t.HSVA=t.HSLA=t.RGBA=void 0;class n{constructor(e,t,n,s=1){this.r=0|Math.min(255,Math.max(0,e)),this.g=0|Math.min(255,Math.max(0,t)),this.b=0|Math.min(255,Math.max(0,n)),this.a=i(Math.max(Math.min(1,s),0),3)}static equals(e,t){return e.r===t.r&&e.g===t.g&&e.b===t.b&&e.a===t.a}}t.RGBA=n;class s{constructor(e,t,n,s){this.h=0|Math.max(Math.min(360,e),0),this.s=i(Math.max(Math.min(1,t),0),3),this.l=i(Math.max(Math.min(1,n),0),3),this.a=i(Math.max(Math.min(1,s),0),3)}static equals(e,t){return e.h===t.h&&e.s===t.s&&e.l===t.l&&e.a===t.a}static fromRGBA(e){const t=e.r/255,i=e.g/255,n=e.b/255,o=e.a,r=Math.max(t,i,n),a=Math.min(t,i,n);let l=0,u=0;const c=(a+r)/2,h=r-a;if(h>0){switch(u=Math.min(c<=.5?h/(2*c):h/(2-2*c),1),r){case t:l=(i-n)/h+(i1&&(i-=1),i<1/6?e+6*(t-e)*i:i<.5?t:i<2/3?e+(t-e)*(2/3-i)*6:e}static toRGBA(e){const t=e.h/360,{s:i,l:o,a:r}=e;let a,l,u;if(0===i)a=l=u=o;else{const e=o<.5?o*(1+i):o+i-o*i,n=2*o-e;a=s._hue2rgb(n,e,t+1/3),l=s._hue2rgb(n,e,t),u=s._hue2rgb(n,e,t-1/3)}return new n(Math.round(255*a),Math.round(255*l),Math.round(255*u),r)}}t.HSLA=s;class o{constructor(e,t,n,s){this.h=0|Math.max(Math.min(360,e),0),this.s=i(Math.max(Math.min(1,t),0),3),this.v=i(Math.max(Math.min(1,n),0),3),this.a=i(Math.max(Math.min(1,s),0),3)}static equals(e,t){return e.h===t.h&&e.s===t.s&&e.v===t.v&&e.a===t.a}static fromRGBA(e){const t=e.r/255,i=e.g/255,n=e.b/255,s=Math.max(t,i,n),r=s-Math.min(t,i,n),a=0===s?0:r/s;let l;return l=0===r?0:s===t?((i-n)/r%6+6)%6:s===i?(n-t)/r+2:(t-i)/r+4,new o(Math.round(60*l),a,s,e.a)}static toRGBA(e){const{h:t,s:i,v:s,a:o}=e,r=s*i,a=r*(1-Math.abs(t/60%2-1)),l=s-r;let[u,c,h]=[0,0,0];return t<60?(u=r,c=a):t<120?(u=a,c=r):t<180?(c=r,h=a):t<240?(c=a,h=r):t<300?(u=a,h=r):t<360&&(u=r,h=a),u=Math.round(255*(u+l)),c=Math.round(255*(c+l)),h=Math.round(255*(h+l)),new n(u,c,h,o)}}t.HSVA=o;class r{constructor(e){if(!e)throw new Error("Color needs a value");if(e instanceof n)this.rgba=e;else if(e instanceof s)this._hsla=e,this.rgba=s.toRGBA(e);else{if(!(e instanceof o))throw new Error("Invalid color ctor argument");this._hsva=e,this.rgba=o.toRGBA(e)}}static fromHex(e){return r.Format.CSS.parseHex(e)||r.RED}get hsla(){return this._hsla?this._hsla:s.fromRGBA(this.rgba)}get hsva(){return this._hsva?this._hsva:o.fromRGBA(this.rgba)}equals(e){return!!e&&n.equals(this.rgba,e.rgba)&&s.equals(this.hsla,e.hsla)&&o.equals(this.hsva,e.hsva)}getRelativeLuminance(){return i(.2126*r._relativeLuminanceForComponent(this.rgba.r)+.7152*r._relativeLuminanceForComponent(this.rgba.g)+.0722*r._relativeLuminanceForComponent(this.rgba.b),4)}static _relativeLuminanceForComponent(e){const t=e/255;return t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4)}getContrastRatio(e){const t=this.getRelativeLuminance(),i=e.getRelativeLuminance();return t>i?(t+.05)/(i+.05):(i+.05)/(t+.05)}isDarker(){return(299*this.rgba.r+587*this.rgba.g+114*this.rgba.b)/1e3<128}isLighter(){return(299*this.rgba.r+587*this.rgba.g+114*this.rgba.b)/1e3>=128}isLighterThan(e){return this.getRelativeLuminance()>e.getRelativeLuminance()}isDarkerThan(e){return this.getRelativeLuminance()r._flatten(t,e)));return r._flatten(this,t)}static _flatten(e,t){const i=1-e.rgba.a;return new r(new n(i*t.rgba.r+e.rgba.a*e.rgba.r,i*t.rgba.g+e.rgba.a*e.rgba.g,i*t.rgba.b+e.rgba.a*e.rgba.b))}toString(){return""+r.Format.CSS.format(this)}static getLighterColor(e,t,i){if(e.isLighterThan(t))return e;i=i||.5;const n=e.getRelativeLuminance(),s=t.getRelativeLuminance();return i=i*(s-n)/s,e.lighten(i)}static getDarkerColor(e,t,i){if(e.isDarkerThan(t))return e;i=i||.5;const n=e.getRelativeLuminance();return i=i*(n-t.getRelativeLuminance())/n,e.darken(i)}}t.Color=r,r.WHITE=new r(new n(255,255,255,1)),r.BLACK=new r(new n(0,0,0,1)),r.RED=new r(new n(255,0,0,1)),r.BLUE=new r(new n(0,0,255,1)),r.GREEN=new r(new n(0,255,0,1)),r.CYAN=new r(new n(0,255,255,1)),r.LIGHTGREY=new r(new n(211,211,211,1)),r.TRANSPARENT=new r(new n(0,0,0,0)),function(e){let t;!function(t){let i;!function(t){function i(e){const t=e.toString(16);return 2!==t.length?"0"+t:t}function s(e){switch(e){case 48:return 0;case 49:return 1;case 50:return 2;case 51:return 3;case 52:return 4;case 53:return 5;case 54:return 6;case 55:return 7;case 56:return 8;case 57:return 9;case 97:case 65:return 10;case 98:case 66:return 11;case 99:case 67:return 12;case 100:case 68:return 13;case 101:case 69:return 14;case 102:case 70:return 15}return 0}t.formatRGB=function(t){return 1===t.rgba.a?`rgb(${t.rgba.r}, ${t.rgba.g}, ${t.rgba.b})`:e.Format.CSS.formatRGBA(t)},t.formatRGBA=function(e){return`rgba(${e.rgba.r}, ${e.rgba.g}, ${e.rgba.b}, ${+e.rgba.a.toFixed(2)})`},t.formatHSL=function(t){return 1===t.hsla.a?`hsl(${t.hsla.h}, ${(100*t.hsla.s).toFixed(2)}%, ${(100*t.hsla.l).toFixed(2)}%)`:e.Format.CSS.formatHSLA(t)},t.formatHSLA=function(e){return`hsla(${e.hsla.h}, ${(100*e.hsla.s).toFixed(2)}%, ${(100*e.hsla.l).toFixed(2)}%, ${e.hsla.a.toFixed(2)})`},t.formatHex=function(e){return`#${i(e.rgba.r)}${i(e.rgba.g)}${i(e.rgba.b)}`},t.formatHexA=function(t,n=!1){return n&&1===t.rgba.a?e.Format.CSS.formatHex(t):`#${i(t.rgba.r)}${i(t.rgba.g)}${i(t.rgba.b)}${i(Math.round(255*t.rgba.a))}`},t.format=function(t){return t?t.isOpaque()?e.Format.CSS.formatHex(t):e.Format.CSS.formatRGBA(t):null},t.parseHex=function(t){if(!t)return null;const i=t.length;if(0===i)return null;if(35!==t.charCodeAt(0))return null;if(7===i){const i=16*s(t.charCodeAt(1))+s(t.charCodeAt(2)),o=16*s(t.charCodeAt(3))+s(t.charCodeAt(4)),r=16*s(t.charCodeAt(5))+s(t.charCodeAt(6));return new e(new n(i,o,r,1))}if(9===i){const i=16*s(t.charCodeAt(1))+s(t.charCodeAt(2)),o=16*s(t.charCodeAt(3))+s(t.charCodeAt(4)),r=16*s(t.charCodeAt(5))+s(t.charCodeAt(6)),a=16*s(t.charCodeAt(7))+s(t.charCodeAt(8));return new e(new n(i,o,r,a/255))}if(4===i){const i=s(t.charCodeAt(1)),o=s(t.charCodeAt(2)),r=s(t.charCodeAt(3));return new e(new n(16*i+i,16*o+o,16*r+r))}if(5===i){const i=s(t.charCodeAt(1)),o=s(t.charCodeAt(2)),r=s(t.charCodeAt(3)),a=s(t.charCodeAt(4));return new e(new n(16*i+i,16*o+o,16*r+r,(16*a+a)/255))}return null}}(i=t.CSS||(t.CSS={}))}(t=e.Format||(e.Format={}))}(r=t.Color||(t.Color={}))},359:function(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,s)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return s(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.getElementsByTagName=t.removeTabIndexAndUpdateFocus=t.hide=t.show=t.join=t.$=t.prepend=t.append=t.trackFocus=t.restoreParentsScrollTop=t.saveParentsScrollTop=t.EventHelper=t.EventType=t.isHTMLElement=t.removeCSSRulesContainingSelector=t.createCSSRule=t.createStyleSheet=t.findParentWithClass=t.isAncestor=t.getLargestChildWidth=t.getTotalHeight=t.getContentHeight=t.getTotalScrollWidth=t.getContentWidth=t.getTotalWidth=t.StandardWindow=t.getDomNodePagePosition=t.position=t.size=t.getTopLeftOffset=t.Dimension=t.getClientArea=t.getComputedStyle=t.addDisposableThrottledListener=t.modify=t.measure=t.scheduleAtNextAnimationFrame=t.runAtThisOrScheduleAtNextAnimationFrame=t.addDisposableNonBubblingMouseOutListener=t.addStandardDisposableListener=t.addDisposableListener=t.toggleClass=t.removeClasses=t.removeClass=t.addClasses=t.addClass=t.hasClass=t.isInDOM=t.removeNode=t.clearNode=void 0,t.animate=t.windowOpenNoOpener=t.computeScreenAwareSize=t.domContentLoaded=t.finalHandler=void 0;const r=o(i(93)),a=i(478),l=i(324),u=i(69),c=i(266),h=i(657),d=i(559),m=o(i(735)),p=i(91);t.clearNode=function(e){for(;e.firstChild;)e.removeChild(e.firstChild)},t.removeNode=function(e){e.parentNode&&e.parentNode.removeChild(e)},t.isInDOM=function(e){for(;e;){if(e===document.body)return!0;e=e.parentNode}return!1};const f=new class{_findClassName(e,t){let i=e.className;if(!i)return void(this._lastStart=-1);t=t.trim();let n=i.length,s=t.length;if(0===s)return void(this._lastStart=-1);if(n=0;){if(o=r+s,(0===r||32===i.charCodeAt(r-1))&&32===i.charCodeAt(o))return this._lastStart=r,void(this._lastEnd=o+1);if(r>0&&32===i.charCodeAt(r-1)&&o===n)return this._lastStart=r-1,void(this._lastEnd=o);if(0===r&&o===n)return this._lastStart=0,void(this._lastEnd=o)}this._lastStart=-1}hasClass(e,t){return this._findClassName(e,t),-1!==this._lastStart}addClasses(e,...t){t.forEach((t=>t.split(" ").forEach((t=>this.addClass(e,t)))))}addClass(e,t){e.className?(this._findClassName(e,t),-1===this._lastStart&&(e.className=e.className+" "+t)):e.className=t}removeClass(e,t){this._findClassName(e,t),-1!==this._lastStart&&(e.className=e.className.substring(0,this._lastStart)+e.className.substring(this._lastEnd||0))}removeClasses(e,...t){t.forEach((t=>t.split(" ").forEach((t=>this.removeClass(e,t)))))}toggleClass(e,t,i){this._findClassName(e,t),-1===this._lastStart||void 0!==i&&i||this.removeClass(e,t),-1!==this._lastStart||void 0!==i&&!i||this.addClass(e,t)}},b=new class{hasClass(e,t){return Boolean(t)&&e.classList&&e.classList.contains(t)}addClasses(e,...t){t.forEach((t=>t.split(" ").forEach((t=>this.addClass(e,t)))))}addClass(e,t){t&&e.classList&&e.classList.add(t)}removeClass(e,t){t&&e.classList&&e.classList.remove(t)}removeClasses(e,...t){t.forEach((t=>t.split(" ").forEach((t=>this.removeClass(e,t)))))}toggleClass(e,t,i){e.classList&&e.classList.toggle(t,i)}},g=r.isIE?f:b;t.hasClass=g.hasClass.bind(g),t.addClass=g.addClass.bind(g),t.addClasses=g.addClasses.bind(g),t.removeClass=g.removeClass.bind(g),t.removeClasses=g.removeClasses.bind(g),t.toggleClass=g.toggleClass.bind(g);class _{constructor(e,t,i,n){this._node=e,this._type=t,this._handler=i,this._useCapture=n||!1,this._node.addEventListener(this._type,this._handler,this._useCapture)}dispose(){this._handler&&(this._node.removeEventListener(this._type,this._handler,this._useCapture),this._node=null,this._handler=null)}}function y(e,t,i,n){return new _(e,t,i,n)}t.addDisposableListener=y,t.addStandardDisposableListener=function(e,t,i,n){let s=i;return"click"===t||"mousedown"===t?s=function(e){return function(t){return e(new u.StandardMouseEvent(t))}}(i):"keydown"!==t&&"keypress"!==t&&"keyup"!==t||(s=function(e){return function(t){return e(new l.StandardKeyboardEvent(t))}}(i)),y(e,t,s,n)},t.addDisposableNonBubblingMouseOutListener=function(e,t){return y(e,"mouseout",(i=>{let n=i.relatedTarget||i.target;for(;n&&n!==e;)n=n.parentNode;n!==e&&t(i)}))};let v=null;class C{constructor(e,t=0){this._runner=e,this.priority=t,this._canceled=!1}dispose(){this._canceled=!0}execute(){if(!this._canceled)try{this._runner()}catch(e){console.error(e)}}static sort(e,t){return t.priority-e.priority}}!function(){let e=[],i=null,n=!1,s=!1,o=()=>{for(n=!1,i=e,e=[],s=!0;i.length>0;)i.sort(C.sort),i.shift().execute();s=!1};t.scheduleAtNextAnimationFrame=(t,i=0)=>{let s=new C(t,i);return e.push(s),n||(n=!0,function(e){if(!v){const e=e=>setTimeout((()=>e((new Date).getTime())),0);v=self.requestAnimationFrame||self.msRequestAnimationFrame||self.webkitRequestAnimationFrame||self.mozRequestAnimationFrame||self.oRequestAnimationFrame||e}v.call(self,e)}(o)),s},t.runAtThisOrScheduleAtNextAnimationFrame=(e,n)=>{if(s){let t=new C(e,n);return i.push(t),t}return(0,t.scheduleAtNextAnimationFrame)(e,n)}}(),t.measure=function(e){return(0,t.scheduleAtNextAnimationFrame)(e,1e4)},t.modify=function(e){return(0,t.scheduleAtNextAnimationFrame)(e,-1e4)};const E=function(e,t){return t};class w extends d.Disposable{constructor(e,t,i,n=E,s=16){super();let o=null,r=0,a=this._register(new c.TimeoutTimer),l=()=>{r=(new Date).getTime(),i(o),o=null};this._register(y(e,t,(e=>{o=n(o,e);let t=(new Date).getTime()-r;t>=s?(a.cancel(),l()):a.setIfNotSet(l,s-t)})))}}function S(e){return document.defaultView.getComputedStyle(e,null)}t.addDisposableThrottledListener=function(e,t,i,n,s){return new w(e,t,i,n,s)},t.getComputedStyle=S;function M(e,t,i){let n=S(e),s="0";return n&&(s=n.getPropertyValue?n.getPropertyValue(t):n.getAttribute(i)),function(e,t){return parseFloat(t)||0}(0,s)}t.getClientArea=function(e){if(e!==document.body)return new L(e.clientWidth,e.clientHeight);if(window.innerWidth&&window.innerHeight)return new L(window.innerWidth,window.innerHeight);if(document.body&&document.body.clientWidth&&document.body.clientHeight)return new L(document.body.clientWidth,document.body.clientHeight);if(document.documentElement&&document.documentElement.clientWidth&&document.documentElement.clientHeight)return new L(document.documentElement.clientWidth,document.documentElement.clientHeight);throw new Error("Unable to figure out browser width and height")};const x=function(e){return M(e,"border-left-width","borderLeftWidth")},T=function(e){return M(e,"border-top-width","borderTopWidth")},I=function(e){return M(e,"margin-left","marginLeft")},k=function(e){return M(e,"margin-right","marginRight")};class L{constructor(e,t){this.width=e,this.height=t}static equals(e,t){return e===t||!(!e||!t)&&e.width===t.width&&e.height===t.height}}function D(e){let t=e.offsetParent,i=e.offsetTop,n=e.offsetLeft;for(;null!==(e=e.parentNode)&&e!==document.body&&e!==document.documentElement;){i-=e.scrollTop;let s=S(e);s&&(n-="rtl"!==s.direction?e.scrollLeft:-e.scrollLeft),e===t&&(n+=x(e),i+=T(e),i+=e.offsetTop,n+=e.offsetLeft,t=e.offsetParent)}return{left:n,top:i}}function A(e){let t=I(e)+k(e);return e.offsetWidth+t}function O(e){let t=I(e)+k(e);return e.scrollWidth+t}function N(e,t){for(;e;){if(e===t)return!0;e=e.parentNode}return!1}function K(e=document.getElementsByTagName("head")[0]){let t=document.createElement("style");return t.type="text/css",t.media="screen",e.appendChild(t),t}t.Dimension=L,t.getTopLeftOffset=D,t.size=function(e,t,i){"number"==typeof t&&(e.style.width=`${t}px`),"number"==typeof i&&(e.style.height=`${i}px`)},t.position=function(e,t,i,n,s,o="absolute"){"number"==typeof t&&(e.style.top=`${t}px`),"number"==typeof i&&(e.style.right=`${i}px`),"number"==typeof n&&(e.style.bottom=`${n}px`),"number"==typeof s&&(e.style.left=`${s}px`),e.style.position=o},t.getDomNodePagePosition=function(e){let i=e.getBoundingClientRect();return{left:i.left+t.StandardWindow.scrollX,top:i.top+t.StandardWindow.scrollY,width:i.width,height:i.height}},t.StandardWindow=new class{get scrollX(){return"number"==typeof window.scrollX?window.scrollX:document.body.scrollLeft+document.documentElement.scrollLeft}get scrollY(){return"number"==typeof window.scrollY?window.scrollY:document.body.scrollTop+document.documentElement.scrollTop}},t.getTotalWidth=A,t.getContentWidth=function(e){let t=x(e)+function(e){return M(e,"border-right-width","borderRightWidth")}(e),i=function(e){return M(e,"padding-left","paddingLeft")}(e)+function(e){return M(e,"padding-right","paddingRight")}(e);return e.offsetWidth-t-i},t.getTotalScrollWidth=O,t.getContentHeight=function(e){let t=T(e)+function(e){return M(e,"border-bottom-width","borderBottomWidth")}(e),i=function(e){return M(e,"padding-top","paddingTop")}(e)+function(e){return M(e,"padding-bottom","paddingBottom")}(e);return e.offsetHeight-t-i},t.getTotalHeight=function(e){let t=function(e){return M(e,"margin-top","marginTop")}(e)+function(e){return M(e,"margin-bottom","marginBottom")}(e);return e.offsetHeight+t},t.getLargestChildWidth=function(e,t){let i=t.map((t=>Math.max(O(t),A(t))+function(e,t){if(null===e)return 0;let i=D(e),n=D(t);return i.left-n.left}(t,e)||0));return Math.max(...i)},t.isAncestor=N,t.findParentWithClass=function(e,i,n){for(;e;){if((0,t.hasClass)(e,i))return e;if(n)if("string"==typeof n){if((0,t.hasClass)(e,n))return null}else if(e===n)return null;e=e.parentNode}return null},t.createStyleSheet=K;let R=null;function F(){return R||(R=K()),R}t.createCSSRule=function(e,t,i=F()){i&&t&&i.sheet.insertRule(e+"{"+t+"}",0)},t.removeCSSRulesContainingSelector=function(e,t=F()){if(!t)return;let i=function(e){return e&&e.sheet&&e.sheet.rules?e.sheet.rules:e&&e.sheet&&e.sheet.cssRules?e.sheet.cssRules:[]}(t),n=[];for(let t=0;t=0;e--)t.sheet.deleteRule(n[e])},t.isHTMLElement=function(e){return"object"==typeof HTMLElement?e instanceof HTMLElement:e&&"object"==typeof e&&1===e.nodeType&&"string"==typeof e.nodeName},t.EventType={MINIMIZE:"minimize",MAXIMIZE:"maximize",UNMAXIMIZE:"unmaximize",ENTER_FULLSCREEN:"enter-full-screen",LEAVE_FULLSCREEN:"leave-full-screen",CLICK:"click",DBLCLICK:"dblclick",MOUSE_UP:"mouseup",MOUSE_DOWN:"mousedown",MOUSE_OVER:"mouseover",MOUSE_MOVE:"mousemove",MOUSE_OUT:"mouseout",MOUSE_ENTER:"mouseenter",MOUSE_LEAVE:"mouseleave",CONTEXT_MENU:"contextmenu",WHEEL:"wheel",KEY_DOWN:"keydown",KEY_PRESS:"keypress",KEY_UP:"keyup",LOAD:"load",UNLOAD:"unload",ABORT:"abort",ERROR:"error",RESIZE:"resize",SCROLL:"scroll",SELECT:"select",CHANGE:"change",SUBMIT:"submit",RESET:"reset",FOCUS:"focus",FOCUS_IN:"focusin",FOCUS_OUT:"focusout",BLUR:"blur",INPUT:"input",STORAGE:"storage",DRAG_START:"dragstart",DRAG:"drag",DRAG_ENTER:"dragenter",DRAG_LEAVE:"dragleave",DRAG_OVER:"dragover",DROP:"drop",DRAG_END:"dragend",ANIMATION_START:r.isWebKit?"webkitAnimationStart":"animationstart",ANIMATION_END:r.isWebKit?"webkitAnimationEnd":"animationend",ANIMATION_ITERATION:r.isWebKit?"webkitAnimationIteration":"animationiteration"},t.EventHelper={stop:function(e,t){e.preventDefault?e.preventDefault():e.returnValue=!1,t&&(e.stopPropagation?e.stopPropagation():e.cancelBubble=!0)}},t.saveParentsScrollTop=function(e){let t=[];for(let i=0;e&&e.nodeType===e.ELEMENT_NODE;i++)t[i]=e.scrollTop,e=e.parentNode;return t},t.restoreParentsScrollTop=function(e,t){for(let i=0;e&&e.nodeType===e.ELEMENT_NODE;i++)e.scrollTop!==t[i]&&(e.scrollTop=t[i]),e=e.parentNode};class P{constructor(e){this._onDidFocus=new h.Emitter,this.onDidFocus=this._onDidFocus.event,this._onDidBlur=new h.Emitter,this.onDidBlur=this._onDidBlur.event,this.disposables=[];let i=N(document.activeElement,e),n=!1;(0,a.domEvent)(e,t.EventType.FOCUS,!0)((()=>{n=!1,i||(i=!0,this._onDidFocus.fire())}),null,this.disposables),(0,a.domEvent)(e,t.EventType.BLUR,!0)((()=>{i&&(n=!0,window.setTimeout((()=>{n&&(n=!1,i=!1,this._onDidBlur.fire())}),0))}),null,this.disposables)}dispose(){this.disposables=(0,d.dispose)(this.disposables),this._onDidFocus.dispose(),this._onDidBlur.dispose()}}t.trackFocus=function(e){return new P(e)},t.append=function(e,...t){return t.forEach((t=>e.appendChild(t))),t[t.length-1]},t.prepend=function(e,t){return e.insertBefore(t,e.firstChild),t};const U=/([\w\-]+)?(#([\w\-]+))?((.([\w\-]+))*)/;t.$=function(e,t,...i){let n=U.exec(e);if(!n)throw new Error("Bad use of emmet");let s=document.createElement(n[1]||"div");return n[3]&&(s.id=n[3]),n[4]&&(s.className=n[4].replace(/\./g," ").trim()),t=t||{},Object.keys(t).forEach((e=>{const i=t[e];/^on\w+$/.test(e)?s[e]=i:"selected"===e?i&&s.setAttribute(e,"true"):s.setAttribute(e,i)})),(0,p.coalesce)(i).forEach((e=>{e instanceof Node?s.appendChild(e):s.appendChild(document.createTextNode(e))})),s},t.join=function(e,t){const i=[];return e.forEach(((e,n)=>{n>0&&(t instanceof Node?i.push(t.cloneNode()):i.push(document.createTextNode(t))),i.push(e)})),i},t.show=function(...e){for(let t of e)t&&(t.style.display="",t.removeAttribute("aria-hidden"))},t.hide=function(...e){for(let t of e)t&&(t.style.display="none",t.setAttribute("aria-hidden","true"))},t.removeTabIndexAndUpdateFocus=function(e){if(e&&e.hasAttribute("tabIndex")){if(document.activeElement===e){let t=function(e,t){for(;e;){if(e instanceof HTMLElement&&e.hasAttribute("tabIndex"))return e;e=e.parentNode}return null}(e.parentElement);t&&t.focus()}e.removeAttribute("tabindex")}},t.getElementsByTagName=function(e){return Array.prototype.slice.call(document.getElementsByTagName(e),0)},t.finalHandler=function(e){return t=>{t.preventDefault(),t.stopPropagation(),e(t)}},t.domContentLoaded=function(){return new Promise((e=>{"complete"===document.readyState||document&&null!==document.body?m.setImmediate(e):window.addEventListener("DOMContentLoaded",e,!1)}))},t.computeScreenAwareSize=function(e){const t=window.devicePixelRatio*e;return Math.max(1,Math.floor(t))/window.devicePixelRatio},t.windowOpenNoOpener=function(e){if(m.isNative||r.isEdgeWebView)window.open(e);else{let t=window.open();t&&(t.opener=null,t.location.href=e)}},t.animate=function(e){const i=()=>{e(),n=(0,t.scheduleAtNextAnimationFrame)(i)};let n=(0,t.scheduleAtNextAnimationFrame)(i);return(0,d.toDisposable)((()=>n.dispose()))}},657:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Relay=t.EventBufferer=t.AsyncEmitter=t.Emitter=t.setGlobalLeakWarningThreshold=t.Event=void 0;const n=i(559),s=i(68);var o;!function(e){const t={dispose(){}};function i(e){return(t,i=null,n)=>{let s=!1;const o=e((e=>{if(!s)return o?o.dispose():s=!0,t.call(i,e)}),null,n);return s&&o.dispose(),o}}function s(e,t){return(i,n=null,s)=>e((e=>i.call(n,t(e))),null,s)}function o(e,t){return(i,n=null,s)=>e((e=>{t(e),i.call(n,e)}),null,s)}function r(e,t){return(i,n=null,s)=>e((e=>t(e)&&i.call(n,e)),null,s)}function a(e,t,i){let n=i;return s(e,(e=>(n=t(n,e),n)))}function u(e){let t,i=!0;return r(e,(e=>{let n=i||e!==t;return i=!1,t=e,n}))}e.None=function(){return t},e.once=i,e.map=s,e.forEach=o,e.filter=r,e.signal=function(e){return e},e.any=function(...e){return(t,i=null,s)=>(0,n.combinedDisposable)(e.map((e=>e((e=>t.call(i,e)),null,s))))},e.reduce=a,e.debounce=function(e,t,i=100,n=!1,s){let o,r,a,u=0;const c=new l({leakWarningThreshold:s,onFirstListenerAdd(){o=e((e=>{u++,r=t(r,e),n&&!a&&c.fire(r),clearTimeout(a),a=setTimeout((()=>{let e=r;r=void 0,a=void 0,(!n||u>1)&&c.fire(e),u=0}),i)}))},onLastListenerRemove(){o.dispose()}});return c.event},e.stopwatch=function(e){const t=(new Date).getTime();return s(i(e),(e=>(new Date).getTime()-t))},e.latch=u,e.buffer=function(e,t=!1,i=[]){let n=i.slice(),s=e((e=>{n?n.push(e):r.fire(e)}));const o=()=>{n&&n.forEach((e=>r.fire(e))),n=null},r=new l({onFirstListenerAdd(){s||(s=e((e=>r.fire(e))))},onFirstListenerDidAdd(){n&&(t?setTimeout(o):o())},onLastListenerRemove(){s&&s.dispose(),s=null}});return r.event},e.echo=function(e,t=!1,i=[]){i=i.slice(),e((e=>{i.push(e),s.fire(e)}));const n=(e,t)=>i.forEach((i=>e.call(t,i))),s=new l({onListenerDidAdd(e,i,s){t?setTimeout((()=>n(i,s))):n(i,s)}});return s.event};class c{constructor(e){this._event=e}get event(){return this._event}map(e){return new c(s(this._event,e))}forEach(e){return new c(o(this._event,e))}filter(e){return new c(r(this._event,e))}reduce(e,t){return new c(a(this._event,e,t))}latch(){return new c(u(this._event))}on(e,t,i){return this._event(e,t,i)}once(e,t,n){return i(this._event)(e,t,n)}}e.chain=function(e){return new c(e)},e.fromNodeEventEmitter=function(e,t,i=(e=>e)){const n=(...e)=>s.fire(i(...e)),s=new l({onFirstListenerAdd:()=>e.on(t,n),onLastListenerRemove:()=>e.removeListener(t,n)});return s.event},e.fromPromise=function(e){const t=new l;let i=!1;return e.then(void 0,(()=>null)).then((()=>{i?t.fire(void 0):setTimeout((()=>t.fire(void 0)),0)})),i=!0,t.event},e.toPromise=function(e){return new Promise((t=>i(e)(t)))}}(o=t.Event||(t.Event={}));let r=-1;t.setGlobalLeakWarningThreshold=function(e){let t=r;return r=e,{dispose(){r=t}}};class a{constructor(e,t=Math.random().toString(18).slice(2,5)){this.customThreshold=e,this.name=t,this._warnCountdown=0}dispose(){this._stacks&&this._stacks.clear()}check(e){let t=r;if("number"==typeof this.customThreshold&&(t=this.customThreshold),t<=0||e{(!i||n{let e=this._stacks.get(i)||0;this._stacks.set(i,e-1)}}}class l{constructor(e){this._disposed=!1,this._options=e,this._leakageMon=r>0?new a(this._options&&this._options.leakWarningThreshold):void 0}get event(){return this._event||(this._event=(e,t,i)=>{this._listeners||(this._listeners=new s.LinkedList);const n=this._listeners.isEmpty();n&&this._options&&this._options.onFirstListenerAdd&&this._options.onFirstListenerAdd(this);const o=this._listeners.push(t?[e,t]:e);let r,a;return n&&this._options&&this._options.onFirstListenerDidAdd&&this._options.onFirstListenerDidAdd(this),this._options&&this._options.onListenerDidAdd&&this._options.onListenerDidAdd(this,e,t),this._leakageMon&&(r=this._leakageMon.check(this._listeners.size)),a={dispose:()=>{r&&r(),a.dispose=l._noop,!this._disposed&&(o(),this._options&&this._options.onLastListenerRemove)&&(this._listeners&&!this._listeners.isEmpty()||this._options.onLastListenerRemove(this))}},Array.isArray(i)&&i.push(a),a}),this._event}fire(e){if(this._listeners){this._deliveryQueue||(this._deliveryQueue=[]);for(let t=this._listeners.iterator(),i=t.next();!i.done;i=t.next())this._deliveryQueue.push([i.value,e]);for(;this._deliveryQueue.length>0;){const[e,t]=this._deliveryQueue.shift();try{"function"==typeof e?e.call(void 0,t):e[0].call(e[1],t)}catch(e){console.error(e)}}}}dispose(){this._listeners&&(this._listeners=void 0),this._deliveryQueue&&(this._deliveryQueue.length=0),this._leakageMon&&this._leakageMon.dispose(),this._disposed=!0}}t.Emitter=l,l._noop=function(){},t.AsyncEmitter=class extends l{async fireAsync(e){if(this._listeners){this._asyncDeliveryQueue||(this._asyncDeliveryQueue=[]);for(let t=this._listeners.iterator(),i=t.next();!i.done;i=t.next()){let t=[];this._asyncDeliveryQueue.push([i.value,e(t,"function"==typeof i.value?i.value:i.value[0]),t])}for(;this._asyncDeliveryQueue.length>0;){const[e,t,i]=this._asyncDeliveryQueue.shift();try{"function"==typeof e?e.call(void 0,t):e[0].call(e[1],t)}catch(e){console.error(e);continue}Object.freeze(i),await Promise.all(i)}}}},t.EventBufferer=class{constructor(){this.buffers=[]}wrapEvent(e){return(t,i,n)=>e((e=>{const n=this.buffers[this.buffers.length-1];n?n.push((()=>t.call(i,e))):t.call(i,e)}),void 0,n)}bufferEvents(e){const t=[];this.buffers.push(t);const i=e();return this.buffers.pop(),t.forEach((e=>e())),i}},t.Relay=class{constructor(){this.listening=!1,this.inputEvent=o.None,this.inputEventListener=n.Disposable.None,this.emitter=new l({onFirstListenerDidAdd:()=>{this.listening=!0,this.inputEventListener=this.inputEvent(this.emitter.fire,this.emitter)},onLastListenerRemove:()=>{this.listening=!1,this.inputEventListener.dispose()}}),this.event=this.emitter.event}set input(e){this.inputEvent=e,this.listening&&(this.inputEventListener.dispose(),this.inputEventListener=e(this.emitter.fire,this.emitter))}dispose(){this.inputEventListener.dispose(),this.emitter.dispose()}}},560:(e,t)=>{var i;Object.defineProperty(t,"__esModule",{value:!0}),t.MappedNavigator=t.MappedIterator=t.ArrayNavigator=t.ArrayIterator=t.getSequenceIterator=t.Iterator=t.FIN=void 0,t.FIN={done:!0,value:void 0},function(e){const i={next:()=>t.FIN};function n(e,t){for(let i=e.next();!i.done;i=e.next())t(i.value)}e.empty=function(){return i},e.fromArray=function(e,i=0,n=e.length){return{next:()=>i>=n?t.FIN:{done:!1,value:e[i++]}}},e.from=function(t){return t?Array.isArray(t)?e.fromArray(t):t:e.empty()},e.map=function(e,i){return{next(){const n=e.next();return n.done?t.FIN:{done:!1,value:i(n.value)}}}},e.filter=function(e,i){return{next(){for(;;){const n=e.next();if(n.done)return t.FIN;if(i(n.value))return{done:!1,value:n.value}}}}},e.forEach=n,e.collect=function(e){const t=[];return n(e,(e=>t.push(e))),t}}(i=t.Iterator||(t.Iterator={})),t.getSequenceIterator=function(e){return Array.isArray(e)?i.fromArray(e):e};class n{constructor(e,t=0,i=e.length,n=t-1){this.items=e,this.start=t,this.end=i,this.index=n}first(){return this.index=this.start,this.current()}next(){return this.index=Math.min(this.index+1,this.end),this.current()}current(){return this.index===this.start-1||this.index===this.end?null:this.items[this.index]}}t.ArrayIterator=n,t.ArrayNavigator=class extends n{constructor(e,t=0,i=e.length,n=t-1){super(e,t,i,n)}current(){return super.current()}previous(){return this.index=Math.max(this.index-1,this.start-1),this.current()}first(){return this.index=this.start,this.current()}last(){return this.index=this.end-1,this.current()}parent(){return null}};class s{constructor(e,t){this.iterator=e,this.fn=t}next(){return this.fn(this.iterator.next())}}t.MappedIterator=s,t.MappedNavigator=class extends s{constructor(e,t){super(e,t),this.navigator=e}current(){return this.fn(this.navigator.current())}previous(){return this.fn(this.navigator.previous())}parent(){return this.fn(this.navigator.parent())}first(){return this.fn(this.navigator.first())}last(){return this.fn(this.navigator.last())}next(){return this.fn(this.navigator.next())}}},146:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResolvedKeybinding=t.ResolvedKeybindingPart=t.ChordKeybinding=t.SimpleKeybinding=t.createSimpleKeybinding=t.createKeybinding=t.KeyChord=t.KeyCodeUtils=void 0;class i{constructor(){this._keyCodeToStr=[],this._strToKeyCode=Object.create(null)}define(e,t){this._keyCodeToStr[e]=t,this._strToKeyCode[t.toLowerCase()]=e}keyCodeToStr(e){return this._keyCodeToStr[e]}strToKeyCode(e){return this._strToKeyCode[e.toLowerCase()]||0}}const n=new i,s=new i,o=new i;function r(e,t){const i=!!(2048&e),n=!!(256&e);return new l(2===t?n:i,!!(1024&e),!!(512&e),2===t?i:n,255&e)}var a;!function(){function e(e,t,i=t,r=i){n.define(e,t),s.define(e,i),o.define(e,r)}e(0,"unknown"),e(1,"Backspace"),e(2,"Tab"),e(3,"Enter"),e(4,"Shift"),e(5,"Ctrl"),e(6,"Alt"),e(7,"PauseBreak"),e(8,"CapsLock"),e(9,"Escape"),e(10,"Space"),e(11,"PageUp"),e(12,"PageDown"),e(13,"End"),e(14,"Home"),e(15,"LeftArrow","Left"),e(16,"UpArrow","Up"),e(17,"RightArrow","Right"),e(18,"DownArrow","Down"),e(19,"Insert"),e(20,"Delete"),e(21,"0"),e(22,"1"),e(23,"2"),e(24,"3"),e(25,"4"),e(26,"5"),e(27,"6"),e(28,"7"),e(29,"8"),e(30,"9"),e(31,"A"),e(32,"B"),e(33,"C"),e(34,"D"),e(35,"E"),e(36,"F"),e(37,"G"),e(38,"H"),e(39,"I"),e(40,"J"),e(41,"K"),e(42,"L"),e(43,"M"),e(44,"N"),e(45,"O"),e(46,"P"),e(47,"Q"),e(48,"R"),e(49,"S"),e(50,"T"),e(51,"U"),e(52,"V"),e(53,"W"),e(54,"X"),e(55,"Y"),e(56,"Z"),e(57,"Meta"),e(58,"ContextMenu"),e(59,"F1"),e(60,"F2"),e(61,"F3"),e(62,"F4"),e(63,"F5"),e(64,"F6"),e(65,"F7"),e(66,"F8"),e(67,"F9"),e(68,"F10"),e(69,"F11"),e(70,"F12"),e(71,"F13"),e(72,"F14"),e(73,"F15"),e(74,"F16"),e(75,"F17"),e(76,"F18"),e(77,"F19"),e(78,"NumLock"),e(79,"ScrollLock"),e(80,";",";","OEM_1"),e(81,"=","=","OEM_PLUS"),e(82,",",",","OEM_COMMA"),e(83,"-","-","OEM_MINUS"),e(84,".",".","OEM_PERIOD"),e(85,"/","/","OEM_2"),e(86,"`","`","OEM_3"),e(110,"ABNT_C1"),e(111,"ABNT_C2"),e(87,"[","[","OEM_4"),e(88,"\\","\\","OEM_5"),e(89,"]","]","OEM_6"),e(90,"'","'","OEM_7"),e(91,"OEM_8"),e(92,"OEM_102"),e(93,"NumPad0"),e(94,"NumPad1"),e(95,"NumPad2"),e(96,"NumPad3"),e(97,"NumPad4"),e(98,"NumPad5"),e(99,"NumPad6"),e(100,"NumPad7"),e(101,"NumPad8"),e(102,"NumPad9"),e(103,"NumPad_Multiply"),e(104,"NumPad_Add"),e(105,"NumPad_Separator"),e(106,"NumPad_Subtract"),e(107,"NumPad_Decimal"),e(108,"NumPad_Divide")}(),(a=t.KeyCodeUtils||(t.KeyCodeUtils={})).toString=function(e){return n.keyCodeToStr(e)},a.fromString=function(e){return n.strToKeyCode(e)},a.toUserSettingsUS=function(e){return s.keyCodeToStr(e)},a.toUserSettingsGeneral=function(e){return o.keyCodeToStr(e)},a.fromUserSettings=function(e){return s.strToKeyCode(e)||o.strToKeyCode(e)},t.KeyChord=function(e,t){return(e|(65535&t)<<16>>>0)>>>0},t.createKeybinding=function(e,t){if(0===e)return null;const i=(65535&e)>>>0,n=(4294901760&e)>>>16;return 0!==n?new u(r(i,t),r(n,t)):r(i,t)},t.createSimpleKeybinding=r;class l{constructor(e,t,i,n,s){this.type=1,this.ctrlKey=e,this.shiftKey=t,this.altKey=i,this.metaKey=n,this.keyCode=s}equals(e){return 1===e.type&&this.ctrlKey===e.ctrlKey&&this.shiftKey===e.shiftKey&&this.altKey===e.altKey&&this.metaKey===e.metaKey&&this.keyCode===e.keyCode}getHashCode(){return`${this.ctrlKey?"1":"0"}${this.shiftKey?"1":"0"}${this.altKey?"1":"0"}${this.metaKey?"1":"0"}${this.keyCode}`}isModifierKey(){return 0===this.keyCode||5===this.keyCode||57===this.keyCode||6===this.keyCode||4===this.keyCode}isDuplicateModifierCase(){return this.ctrlKey&&5===this.keyCode||this.shiftKey&&4===this.keyCode||this.altKey&&6===this.keyCode||this.metaKey&&57===this.keyCode}}t.SimpleKeybinding=l;class u{constructor(e,t){this.type=2,this.firstPart=e,this.chordPart=t}getHashCode(){return`${this.firstPart.getHashCode()};${this.chordPart.getHashCode()}`}}t.ChordKeybinding=u,t.ResolvedKeybindingPart=class{constructor(e,t,i,n,s,o){this.ctrlKey=e,this.shiftKey=t,this.altKey=i,this.metaKey=n,this.keyLabel=s,this.keyAriaLabel=o}},t.ResolvedKeybinding=class{}},559:(e,t)=>{function i(e,...t){return Array.isArray(e)?(e.forEach((e=>e&&e.dispose())),[]):0===t.length?e?(e.dispose(),e):void 0:(i(e),i(t),[])}Object.defineProperty(t,"__esModule",{value:!0}),t.Disposable=t.toDisposable=t.combinedDisposable=t.dispose=t.isDisposable=void 0,t.isDisposable=function(e){return"function"==typeof e.dispose&&0===e.dispose.length},t.dispose=i,t.combinedDisposable=function(e){return{dispose:()=>i(e)}},t.toDisposable=function(e){return{dispose(){e()}}};class n{constructor(){this._toDispose=[],this._lifecycle_disposable_isDisposed=!1}get toDispose(){return this._toDispose}dispose(){this._lifecycle_disposable_isDisposed=!0,this._toDispose=i(this._toDispose)}_register(e){return this._lifecycle_disposable_isDisposed?(console.warn("Registering disposable on object that has already been disposed."),e.dispose()):this._toDispose.push(e),e}}t.Disposable=n,n.None=Object.freeze({dispose(){}})},68:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LinkedList=void 0;const n=i(560);class s{constructor(e){this.element=e}}t.LinkedList=class{constructor(){this._size=0}get size(){return this._size}isEmpty(){return!this._first}clear(){this._first=void 0,this._last=void 0,this._size=0}unshift(e){return this._insert(e,!1)}push(e){return this._insert(e,!0)}_insert(e,t){const i=new s(e);if(this._first)if(t){const e=this._last;this._last=i,i.prev=e,e.next=i}else{const e=this._first;this._first=i,i.next=e,e.prev=i}else this._first=i,this._last=i;return this._size+=1,this._remove.bind(this,i)}shift(){if(this._first){const e=this._first.element;return this._remove(this._first),e}}pop(){if(this._last){const e=this._last.element;return this._remove(this._last),e}}_remove(e){let t=this._first;for(;t instanceof s;){if(t===e){if(t.prev&&t.next){let e=t.prev;e.next=t.next,t.next.prev=e}else t.prev||t.next?t.next?t.prev||(this._first=this._first.next,this._first.prev=void 0):(this._last=this._last.prev,this._last.next=void 0):(this._first=void 0,this._last=void 0);this._size-=1;break}t=t.next}}iterator(){let e,t=this._first;return{next:()=>t?(e?e.value=t.element:e={done:!1,value:t.element},t=t.next,e):n.FIN}}toArray(){let e=[];for(let t=this._first;t instanceof s;t=t.next)e.push(t.element);return e}}},735:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OS=t.setImmediate=t.globals=t.isRootUser=t.platform=t.isWeb=t.isNative=t.isLinux=t.isMacintosh=t.isWindows=t.PlatformToString=void 0;let i=!1,n=!1,s=!1,o=!1,r=!1;const a="undefined"!=typeof process&&void 0!==process.versions&&void 0!==process.versions.electron&&"renderer"===process.type;if("object"!=typeof navigator||a)"object"==typeof process&&(i="win32"===process.platform,n="darwin"===process.platform,s="linux"===process.platform,o=!0);else{const e=navigator.userAgent;i=e.indexOf("Windows")>=0,n=e.indexOf("Macintosh")>=0,s=e.indexOf("Linux")>=0,r=!0}t.PlatformToString=function(e){switch(e){case 0:return"Web";case 1:return"Mac";case 2:return"Linux";case 3:return"Windows"}};let l=0;o&&(n?l=1:i?l=3:s&&(l=2)),t.isWindows=i,t.isMacintosh=n,t.isLinux=s,t.isNative=o,t.isWeb=r,t.platform=l,t.isRootUser=function(){return o&&!i&&0===process.getuid()};const u="object"==typeof global?global:{},c="object"==typeof self?self:u;t.globals=c;let h=null;t.setImmediate=function(e){return null===h&&(h=t.globals.setImmediate?t.globals.setImmediate.bind(t.globals):"undefined"!=typeof process&&"function"==typeof process.nextTick?process.nextTick.bind(process):t.globals.setTimeout.bind(t.globals)),h(e)};const d=i?1:3;t.OS=n?2:d},298:e=>{e.exports=require("electron")},910:e=>{e.exports=JSON.parse("{\"check\":\"\",\"arrow\":\"\",\"radio\":{\"unchecked\":\"\",\"checked\":\"\"},\"windows\":{\"minimize\":\"\",\"maximize\":\"\",\"restore\":\"\",\"close\":\"\"},\"linux\":{\"minimize\":\"\",\"maximize\":\"\",\"restore\":\"\",\"close\":\"\"}}")}},t={};function i(n){var s=t[n];if(void 0!==s)return s.exports;var o=t[n]={id:n,exports:{}};return e[n].call(o.exports,o,o.exports,i),o.exports}return i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var n in t)i.o(t,n)&&!i.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.nc=void 0,i(303)})())); -\ No newline at end of file -+!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var i=t();for(var n in i)("object"==typeof exports?exports:e)[n]=i[n]}}(this,(()=>(()=>{"use strict";var e={526:(e,t,i)=>{i.d(t,{Z:()=>a});var n=i(933),s=i.n(n),o=i(476),r=i.n(o)()(s());r.push([e.id,".cet-menubar{display:flex;flex-shrink:1;box-sizing:border-box;height:30px;overflow:hidden;flex-wrap:wrap}.cet-menubar.bottom{order:1;width:100%;padding:0 5px 5px}.cet-menubar.bottom .cet-menubar-menu-button{border-radius:4px}.cet-menubar.bottom .cet-menubar-menu-button .cet-menubar-menu-title{line-height:26px}.cet-menubar .cet-menubar-menu-button{align-items:center;box-sizing:border-box;padding:0px 8px;height:100%;cursor:default;zoom:1;white-space:nowrap;-webkit-app-region:no-drag;outline:0}.cet-menubar .cet-menubar-menu-button .cet-menubar-menu-title{font-size:12px}.cet-menubar .cet-menubar-menu-button.disabled{opacity:.4}.cet-menubar .cet-menubar-menu-button:not(.disabled):focus,.cet-menubar .cet-menubar-menu-button:not(.disabled).open,.cet-menubar .cet-menubar-menu-button:not(.disabled):hover{background-color:rgba(255,255,255,.1)}.cet-menubar .cet-menubar-menu-container{position:absolute;display:block;left:0px;opacity:1;outline:0;border:none;text-align:left;margin:0 auto;padding:2px 0;margin-left:0;overflow-x:visible;overflow-y:visible;-webkit-overflow-scrolling:touch;justify-content:flex-end;white-space:nowrap;border-radius:7px;backdrop-filter:blur(5px);box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);z-index:99999}.cet-menubar .cet-menubar-menu-container::-webkit-scrollbar{width:8px;height:4px;cursor:pointer;background-color:rbga(0, 0, 0, 0)}.cet-menubar .cet-menubar-menu-container::-webkit-scrollbar-track{border:none;background-color:rbga(0, 0, 0, 0)}.cet-menubar .cet-menubar-menu-container::-webkit-scrollbar-thumb{border-radius:10px;background-color:rgba(110,110,110,.2)}.cet-menubar .cet-menubar-menu-container:focus{outline:0}.cet-menubar .cet-menubar-menu-container .cet-action-item{padding:0;transform:none;display:-ms-flexbox;display:flex;outline:none}.cet-menubar .cet-menubar-menu-container .cet-action-item.active{transform:none}.cet-menubar .cet-menubar-menu-container .cet-action-item.disabled .cet-action-menu-item{opacity:.4}.cet-menubar .cet-menubar-menu-container .cet-action-item .cet-submenu{position:absolute}.cet-menubar .cet-menubar-menu-container .cet-action-menu-item{-ms-flex:1 1 auto;flex:1 1 auto;display:-ms-flexbox;display:flex;height:2.231em;margin:2px 4px;align-items:center;position:relative;border-radius:5px}.cet-menubar .cet-menubar-menu-container .cet-action-label{-ms-flex:1 1 auto;flex:1 1 auto;text-decoration:none;padding:0 1em;background:none;font-size:12px;line-height:1}.cet-menubar .cet-menubar-menu-container .cet-action-label:not(.separator){display:inline-block;-webkit-box-sizing:border-box;-o-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0 2em 0 .8em}.cet-menubar .cet-menubar-menu-container .cet-action-label.separator{opacity:.1;font-size:inherit;margin:1px 0;width:100%;border-bottom:1px solid rgba(0,0,0,0)}.cet-menubar .cet-menubar-menu-container .cet-action-label.separator.text{padding:.7em 1em .1em 1em;font-weight:bold;opacity:1}.cet-menubar .cet-menubar-menu-container .cet-action-label:hover{color:inherit}.cet-menubar .cet-menubar-menu-container .keybinding{padding:0 2em 0 1em}.cet-menubar .cet-menubar-menu-container .keybinding,.cet-menubar .cet-menubar-menu-container .cet-submenu-indicator{display:inline-block;-ms-flex:2 1 auto;flex:2 1 auto;padding:0 3.1em 0 1em;text-align:right;font-size:11px;line-height:1}.cet-menubar .cet-menubar-menu-container .cet-submenu-indicator{position:absolute;right:4px;height:12px;width:12px;padding:0}.cet-menubar .cet-menubar-menu-container .cet-submenu-indicator img,.cet-menubar .cet-menubar-menu-container .cet-submenu-indicator svg,.cet-menubar .cet-menubar-menu-container .cet-menu-item-icon img,.cet-menubar .cet-menubar-menu-container .cet-menu-item-icon svg{display:inherit;width:100%;height:100%}.cet-menubar .cet-menubar-menu-container .cet-action-menu-item.checked>.cet-menu-item-icon.checkbox{visibility:visible}.cet-menubar .cet-menubar-menu-container .cet-menu-item-icon{width:14px;height:14px;margin:0 0 0 .4em}.cet-menubar .cet-menubar-menu-container .cet-menu-item-icon.checkbox{visibility:hidden}",""]);const a=r},29:(e,t,i)=>{i.d(t,{Z:()=>a});var n=i(933),s=i.n(n),o=i(476),r=i.n(o)()(s());r.push([e.id,".cet-titlebar{position:absolute;top:0;left:0;right:0;box-sizing:border-box;width:100%;font-size:13px;padding:0 16px;overflow:hidden;flex-shrink:0;align-items:center;justify-content:center;-webkit-user-select:none;-ms-user-select:none;user-select:none;zoom:1;line-height:22px;height:22px;display:flex;flex-wrap:wrap;z-index:99999}.cet-titlebar.cet-windows,.cet-titlebar.cet-linux{padding:0;height:30px;line-height:30px;justify-content:left;overflow:visible}.cet-titlebar.cet-windows .resizer,.cet-titlebar.cet-linux .resizer{-webkit-app-region:no-drag;position:absolute}.cet-titlebar.cet-windows .resizer.top,.cet-titlebar.cet-linux .resizer.top{top:0;width:100%;height:6px}.cet-titlebar.cet-windows .resizer.left,.cet-titlebar.cet-linux .resizer.left{top:0;left:0;width:6px;height:100%}.cet-titlebar.cet-inverted .cet-menubar,.cet-titlebar.cet-inverted .cet-controls-container{flex-direction:row-reverse}.cet-titlebar.cet-inverted .cet-controls-container{margin:0 5px 0 0}.cet-titlebar.cet-shadow{box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)}.cet-titlebar.cet-first-buttons .cet-controls-container{order:-1;margin:0 5px 0 0}.cet-titlebar .cet-drag-region{top:0;left:0;display:block;position:absolute;width:100%;height:100%;z-index:-1;-webkit-app-region:drag}.cet-titlebar .cet-window-icon{display:flex;align-items:center;justify-content:center;width:34px;height:30px;z-index:99;overflow:hidden}.cet-titlebar .cet-window-icon img{height:16px}.cet-titlebar .cet-window-title{flex:0 1 auto;font-size:13px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;zoom:1}.cet-titlebar .cet-window-title.cet-center{position:absolute;left:50%;transform:translate(-50%, 0)}.cet-titlebar .cet-window-title.cet-bigsur{font-size:13px;font-weight:600}.cet-titlebar .cet-controls-container{display:flex;flex-grow:0;flex-shrink:0;text-align:center;position:relative;z-index:99;-webkit-app-region:no-drag;height:30px;font-family:initial}.cet-titlebar .cet-controls-container .cet-icon{width:46px}.cet-titlebar .cet-controls-container .cet-icon:not(.inactive):hover{background-color:rgba(255,255,255,.3)}.cet-titlebar .cet-controls-container .cet-icon:not(.inactive):active{background-color:rgba(255,255,255,.2)}.cet-titlebar .cet-controls-container .cet-icon.inactive svg{opacity:.4}.cet-titlebar .cet-controls-container .cet-icon.cet-window-close:not(.inactive):hover{background-color:rgba(232,17,35,.9) !important}.cet-titlebar .cet-controls-container .cet-icon.cet-window-close:not(.inactive):active{background-color:rgba(232,17,35,.5) !important}.cet-titlebar .cet-controls-container .cet-icon svg{width:10px;height:-webkit-fill-available;fill:#eee}.cet-titlebar.light .cet-controls-container .cet-icon:not(.inactive):hover{background-color:rgba(0,0,0,.2)}.cet-titlebar.light .cet-controls-container .cet-icon:not(.inactive):active{background-color:rgba(0,0,0,.1)}.cet-titlebar.light .cet-controls-container .cet-icon svg{fill:#333}.cet-titlebar.inactive .cet-window-title,.cet-titlebar.inactive .cet-controls-container .cet-icon svg,.cet-titlebar.inactive .cet-menubar .cet-menubar-menu-button{opacity:.85}.cet-container{position:absolute;left:0;right:0;bottom:0}",""]);const a=r},476:e=>{e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var i="",n=void 0!==t[5];return t[4]&&(i+="@supports (".concat(t[4],") {")),t[2]&&(i+="@media ".concat(t[2]," {")),n&&(i+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),i+=e(t),n&&(i+="}"),t[2]&&(i+="}"),t[4]&&(i+="}"),i})).join("")},t.i=function(e,i,n,s,o){"string"==typeof e&&(e=[[null,e,void 0]]);var r={};if(n)for(var a=0;a0?" ".concat(c[5]):""," {").concat(c[1],"}")),c[5]=o),i&&(c[2]?(c[1]="@media ".concat(c[2]," {").concat(c[1],"}"),c[2]=i):c[2]=i),s&&(c[4]?(c[1]="@supports (".concat(c[4],") {").concat(c[1],"}"),c[4]=s):c[4]="".concat(s)),t.push(c))}},t}},933:e=>{e.exports=function(e){return e[1]}},737:(e,t,i)=>{i.r(t),i.d(t,{default:()=>v});var n=i(892),s=i.n(n),o=i(760),r=i.n(o),a=i(311),l=i.n(a),u=i(192),c=i.n(u),h=i(60),d=i.n(h),m=i(865),p=i.n(m),f=i(526),b={};f.Z&&f.Z.locals&&(b.locals=f.Z.locals);var g,_=0,y={};y.styleTagTransform=p(),y.setAttributes=c(),y.insert=l().bind(null,"head"),y.domAPI=r(),y.insertStyleElement=d(),b.use=function(e){return y.options=e||{},_++||(g=s()(f.Z,y)),b},b.unuse=function(){_>0&&!--_&&(g(),g=null)};const v=b},946:(e,t,i)=>{i.r(t),i.d(t,{default:()=>v});var n=i(892),s=i.n(n),o=i(760),r=i.n(o),a=i(311),l=i.n(a),u=i(192),c=i.n(u),h=i(60),d=i.n(h),m=i(865),p=i.n(m),f=i(29),b={};f.Z&&f.Z.locals&&(b.locals=f.Z.locals);var g,_=0,y={};y.styleTagTransform=p(),y.setAttributes=c(),y.insert=l().bind(null,"head"),y.domAPI=r(),y.insertStyleElement=d(),b.use=function(e){return y.options=e||{},_++||(g=s()(f.Z,y)),b},b.unuse=function(){_>0&&!--_&&(g(),g=null)};const v=b},892:e=>{var t=[];function i(e){for(var i=-1,n=0;n{var t={};e.exports=function(e,i){var n=function(e){if(void 0===t[e]){var i=document.querySelector(e);if(window.HTMLIFrameElement&&i instanceof window.HTMLIFrameElement)try{i=i.contentDocument.head}catch(e){i=null}t[e]=i}return t[e]}(e);if(!n)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");n.appendChild(i)}},60:e=>{e.exports=function(e){var t=document.createElement("style");return e.setAttributes(t,e.attributes),e.insert(t,e.options),t}},192:(e,t,i)=>{e.exports=function(e){var t=i.nc;t&&e.setAttribute("nonce",t)}},760:e=>{e.exports=function(e){var t=e.insertStyleElement(e);return{update:function(i){!function(e,t,i){var n="";i.supports&&(n+="@supports (".concat(i.supports,") {")),i.media&&(n+="@media ".concat(i.media," {"));var s=void 0!==i.layer;s&&(n+="@layer".concat(i.layer.length>0?" ".concat(i.layer):""," {")),n+=i.css,s&&(n+="}"),i.media&&(n+="}"),i.supports&&(n+="}");var o=i.sourceMap;o&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(o))))," */")),t.styleTagTransform(n,e,t.options)}(t,e,i)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}},865:e=>{e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}},418:(e,t)=>{var i;Object.defineProperty(t,"__esModule",{value:!0}),t.MenubarState=void 0,(i=t.MenubarState||(t.MenubarState={}))[i.HIDDEN=0]="HIDDEN",i[i.VISIBLE=1]="VISIBLE",i[i.FOCUSED=2]="FOCUSED",i[i.OPEN=3]="OPEN"},303:function(e,t,i){const n=(this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}})(i(58)),s=i(291);e.exports={Titlebar:n.default,Color:s.Color}},410:function(e,t,i){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.cleanMnemonic=t.CETMenu=t.MENU_ESCAPED_MNEMONIC_REGEX=t.MENU_MNEMONIC_REGEX=void 0;const s=i(291),o=i(359),r=i(146),a=i(735),l=i(324),u=i(440),c=i(559),h=i(657),d=i(266),m=n(i(910)),p=i(238);t.MENU_MNEMONIC_REGEX=/\(&([^\s&])\)|(^|[^&])&([^\s&])/,t.MENU_ESCAPED_MNEMONIC_REGEX=/(&)?(&)([^\s&])/g;class f extends c.Disposable{constructor(e,t,i={},n=(()=>{})){super(),this.triggerKeys={keys:[3,10],keyDown:!0},this.parentData={parent:this},this._onDidCancel=this._register(new h.Emitter),this.menuContainer=e,this.menubarOptions=t,this.options=i,this.closeSubMenu=n,this.items=[],this.focusedItem=void 0,this.mnemonics=new Map,this._register((0,o.addDisposableListener)(this.menuContainer,o.EventType.KEY_DOWN,(e=>{const t=new l.StandardKeyboardEvent(e);let i=!0;t.equals(16)?this.focusPrevious():t.equals(18)?this.focusNext():t.equals(9)?this.cancel():this.isTriggerKeyEvent(t)?this.triggerKeys&&this.triggerKeys.keyDown&&this.doTrigger(t):i=!1,i&&(t.preventDefault(),t.stopPropagation())}))),this._register((0,o.addDisposableListener)(this.menuContainer,o.EventType.KEY_UP,(e=>{const t=new l.StandardKeyboardEvent(e);this.isTriggerKeyEvent(t)?(this.triggerKeys&&!this.triggerKeys.keyDown&&this.doTrigger(t),t.preventDefault(),t.stopPropagation()):(t.equals(2)||t.equals(1026))&&this.updateFocusedItem()}))),i.enableMnemonics&&this._register((0,o.addDisposableListener)(this.menuContainer,o.EventType.KEY_DOWN,(e=>{const t=r.KeyCodeUtils.fromString(e.key);if(this.mnemonics.has(t)){const i=this.mnemonics.get(t);if(1===i.length&&(i[0]instanceof b&&this.focusItemByElement(i[0].getContainer()),i[0].onClick(e)),i.length>1){const e=i.shift();e&&(this.focusItemByElement(e.getContainer()),i.push(e)),this.mnemonics.set(t,i)}}}))),a.isLinux&&this._register((0,o.addDisposableListener)(this.menuContainer,o.EventType.KEY_DOWN,(e=>{const t=new l.StandardKeyboardEvent(e);t.equals(14)||t.equals(11)?(this.focusedItem=this.items.length-1,this.focusNext(),o.EventHelper.stop(e,!0)):(t.equals(13)||t.equals(12))&&(this.focusedItem=0,this.focusPrevious(),o.EventHelper.stop(e,!0))}))),this._register((0,o.addDisposableListener)(this.menuContainer,o.EventType.MOUSE_OUT,(e=>{let t=e.relatedTarget;(0,o.isAncestor)(t,this.menuContainer)||(this.focusedItem=void 0,this.updateFocus(),e.stopPropagation())}))),this._register((0,o.addDisposableListener)(this.menuContainer,o.EventType.MOUSE_UP,(e=>{o.EventHelper.stop(e,!0)}))),this._register((0,o.addDisposableListener)(this.menuContainer,o.EventType.MOUSE_OVER,(e=>{let t=e.target;if(t&&(0,o.isAncestor)(t,this.menuContainer)&&t!==this.menuContainer){for(;t.parentElement!==this.menuContainer&&null!==t.parentElement;)t=t.parentElement;if((0,o.hasClass)(t,"cet-action-item")){const e=this.focusedItem;this.setFocusedItem(t),e!==this.focusedItem&&this.updateFocus()}}}))),this.options.ariaLabel&&this.menuContainer.setAttribute("aria-label",this.options.ariaLabel)}get onDidCancel(){return this._onDidCancel.event}setAriaLabel(e){e?this.menuContainer.setAttribute("aria-label",e):this.menuContainer.removeAttribute("aria-label")}isTriggerKeyEvent(e){let t=!1;return this.triggerKeys&&this.triggerKeys.keys.forEach((i=>{t=t||e.equals(i)})),t}updateFocusedItem(){for(let e=0;e{if(!e)return;const t=document.createElement("li");t.className="cet-action-item",t.setAttribute("role","presentation"),this._register((0,o.addDisposableListener)(t,o.EventType.CONTEXT_MENU,(e=>{e.preventDefault(),e.stopPropagation()})));let i=null;if("separator"===e.type)i=new g(e,this.options);else if("submenu"===e.type||e.submenu){const t=e.submenu.items;if(i=new b(e,t,this.parentData,this.menubarOptions,this.options,this.closeSubMenu),this.options.enableMnemonics){const e=i.getMnemonic();if(e&&i.isEnabled()){let t=[];this.mnemonics.has(e)&&(t=this.mnemonics.get(e)),t.push(i),this.mnemonics.set(e,t)}}}else{const t={enableMnemonics:this.options.enableMnemonics};if(i=new u.CETMenuItem(e,t,this.menubarOptions,this.closeSubMenu,this.items),this.options.enableMnemonics){const e=i.getMnemonic();if(e&&i.isEnabled()){let t=[];this.mnemonics.has(e)&&(t=this.mnemonics.get(e)),t.push(i),this.mnemonics.set(e,t)}}}i.render(t),this.menuContainer.appendChild(t),this.items.push(i)}))}focus(e){let t,i=!1;void 0===e?i=!0:"number"==typeof e?t=e:"boolean"==typeof e&&(i=e),i&&void 0===this.focusedItem?(this.focusedItem=this.items.length-1,this.focusNext()):(void 0!==t&&(this.focusedItem=t),this.updateFocus())}focusNext(){void 0===this.focusedItem&&(this.focusedItem=this.items.length-1);const e=this.focusedItem;let t;do{this.focusedItem=(this.focusedItem+1)%this.items.length,t=this.items[this.focusedItem]}while(this.focusedItem!==e&&!t.isEnabled()||t.isSeparator());(this.focusedItem===e&&!t.isEnabled()||t.isSeparator())&&(this.focusedItem=void 0),this.updateFocus()}focusPrevious(){void 0===this.focusedItem&&(this.focusedItem=0);const e=this.focusedItem;let t;do{this.focusedItem=this.focusedItem-1,this.focusedItem<0&&(this.focusedItem=this.items.length-1),t=this.items[this.focusedItem]}while(this.focusedItem!==e&&!t.isEnabled()||t.isSeparator());(this.focusedItem===e&&!t.isEnabled()||t.isSeparator())&&(this.focusedItem=void 0),this.updateFocus()}updateFocus(){void 0===this.focusedItem&&this.menuContainer.focus();for(let e=0;e=100)&&(i=100);const n=i/100,o=e.backgroundColor?.rgba,r=new s.Color(new s.RGBA(o.r,o.g,o.b,n));t.style.backgroundColor=r.toString()}this.items&&this.items.forEach((t=>{(t instanceof u.CETMenuItem||t instanceof g)&&t.style(e)}))}focusItemByElement(e){const t=this.focusedItem;e&&this.setFocusedItem(e),t!==this.focusedItem&&this.updateFocus()}setFocusedItem(e){for(let t=0;t{})){super(e,s,n,r),this.submenuItems=t,this.parentData=i,this.submenuOptions=s,this.submenuDisposables=[],this.mouseOver=!1,this.showScheduler=new d.RunOnceScheduler((()=>{this.mouseOver&&(this.cleanupExistingSubmenu(!1),this.createSubmenu(!1))}),250),this.hideScheduler=new d.RunOnceScheduler((()=>{this.container&&!(0,o.isAncestor)(document.activeElement,this.container)&&this.parentData.submenu===this.mysubmenu&&(this.parentData.parent.focus(!1),this.cleanupExistingSubmenu(!0))}),750)}render(e){super.render(e),this.itemElement&&((0,o.addClass)(this.itemElement,"cet-submenu-item"),this.itemElement.setAttribute("aria-haspopup","true"),this.submenuIndicator=(0,o.append)(this.itemElement,(0,o.$)("span.cet-submenu-indicator")),this.submenuIndicator.innerHTML=m.default.arrow,(0,p.applyFill)(this.submenuIndicator.firstElementChild,this.menubarOptions?.svgColor,this.menuStyle?.foregroundColor),this.submenuIndicator.setAttribute("aria-hidden","true"),this.container&&((0,o.addDisposableListener)(this.container,o.EventType.KEY_UP,(e=>{let t=new l.StandardKeyboardEvent(e);(t.equals(17)||t.equals(3))&&(o.EventHelper.stop(e,!0),this.createSubmenu(!0))})),(0,o.addDisposableListener)(this.container,o.EventType.KEY_DOWN,(e=>{let t=new l.StandardKeyboardEvent(e);(t.equals(17)||t.equals(3))&&o.EventHelper.stop(e,!0)})),(0,o.addDisposableListener)(this.container,o.EventType.MOUSE_OVER,(e=>{this.mouseOver||(this.mouseOver=!0,this.showScheduler.schedule())})),(0,o.addDisposableListener)(this.container,o.EventType.MOUSE_LEAVE,(e=>{this.mouseOver=!1})),(0,o.addDisposableListener)(this.container,o.EventType.FOCUS_OUT,(e=>{this.container&&!(0,o.isAncestor)(document.activeElement,this.container)&&this.hideScheduler.schedule()}))))}onClick(e){o.EventHelper.stop(e,!0),this.cleanupExistingSubmenu(!1),this.createSubmenu(!1)}cleanupExistingSubmenu(e){this.parentData.submenu&&(e||this.parentData.submenu!==this.mysubmenu)&&(this.parentData.submenu.dispose(),this.parentData.submenu=void 0,this.submenuContainer&&(this.submenuContainer=void 0))}createSubmenu(e=!0){if(this.itemElement&&this.container)if(this.parentData.submenu)this.parentData.submenu.focus(!1);else{this.submenuContainer=(0,o.append)(this.container,(0,o.$)("ul.cet-submenu")),(0,o.addClasses)(this.submenuContainer,"cet-menubar-menu-container"),this.parentData.submenu=new f(this.submenuContainer,this.menubarOptions,this.submenuOptions,this.closeSubMenu),this.parentData.submenu.createMenu(this.submenuItems),this.menuStyle&&this.parentData.submenu.style(this.menuStyle);const t=this.container.getBoundingClientRect(),i=this.submenuContainer.getBoundingClientRect(),n=getComputedStyle(this.parentData.parent.getContainer()),s=parseFloat(n.paddingTop||"0")||0;window.innerWidth<=t.right+i.width?(this.submenuContainer.style.left="10px",this.submenuContainer.style.top=`${this.container.offsetTop+t.height}px`):(this.submenuContainer.style.left=`${this.container.offsetWidth}px`,this.submenuContainer.style.top=this.container.offsetTop-s+"px"),this.submenuDisposables.push((0,o.addDisposableListener)(this.submenuContainer,o.EventType.KEY_UP,(e=>{new l.StandardKeyboardEvent(e).equals(15)&&(o.EventHelper.stop(e,!0),this.parentData.parent.focus(),this.parentData.submenu&&(this.parentData.submenu.dispose(),this.parentData.submenu=void 0),this.submenuDisposables=(0,c.dispose)(this.submenuDisposables),this.submenuContainer=void 0)}))),this.submenuDisposables.push((0,o.addDisposableListener)(this.submenuContainer,o.EventType.KEY_DOWN,(e=>{new l.StandardKeyboardEvent(e).equals(15)&&o.EventHelper.stop(e,!0)}))),this.submenuDisposables.push(this.parentData.submenu.onDidCancel((()=>{this.parentData.parent.focus(),this.parentData.submenu&&(this.parentData.submenu.dispose(),this.parentData.submenu=void 0),this.submenuDisposables=(0,c.dispose)(this.submenuDisposables),this.submenuContainer=void 0}))),this.parentData.submenu.focus(e),this.mysubmenu=this.parentData.submenu}}applyStyle(){if(super.applyStyle(),!this.menuStyle)return;const e=this.container&&(0,o.hasClass)(this.container,"focused")&&this.menuStyle.selectionForegroundColor?this.menuStyle.selectionForegroundColor:this.menuStyle.foregroundColor;(0,p.applyFill)(this.submenuIndicator?.firstElementChild,this.menubarOptions?.svgColor,e),this.parentData.submenu&&this.parentData.submenu.style(this.menuStyle)}dispose(){super.dispose(),this.hideScheduler.dispose(),this.mysubmenu&&(this.mysubmenu.dispose(),this.mysubmenu=null),this.submenuContainer&&(this.submenuDisposables=(0,c.dispose)(this.submenuDisposables),this.submenuContainer=void 0)}}class g extends u.CETMenuItem{constructor(e,t){super(e,t)}render(e){e&&(this.separatorElement=(0,o.append)(e,(0,o.$)("a.cet-action-label")),this.separatorElement.setAttribute("role","presentation"),(0,o.addClass)(this.separatorElement,"separator"))}style(e){this.separatorElement&&e.separatorColor&&(this.separatorElement.style.borderBottomColor=e.separatorColor.toString())}}t.cleanMnemonic=function(e){const i=t.MENU_MNEMONIC_REGEX,n=i.exec(e);if(!n)return e;const s=!n[1];return e.replace(i,s?"$2$3":"").trim()}},178:function(e,t,i){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.escape=t.Menubar=void 0;const s=i(298),o=i(359),r=i(410),a=i(324),l=i(146),u=i(559),c=i(657),h=i(478),d=i(735),m=i(418),p=n(i(737));t.Menubar=class{constructor(e,t,i=(()=>{})){this.container=e,this.options=t,p.default.use(),this.menuItems=[],this.mnemonics=new Map,this.closeSubMenu=i,this._focusState=m.MenubarState.VISIBLE,this._onVisibilityChange=new c.Emitter,this._onFocusStateChange=new c.Emitter,f.getInstance().event(this.onModifierKeyToggled,this),(0,o.addDisposableListener)(this.container,o.EventType.KEY_DOWN,(e=>{let t=new a.StandardKeyboardEvent(e),i=!0;const n=e.key?l.KeyCodeUtils.fromString(e.key):0;if(t.equals(15))this.focusPrevious();else if(t.equals(17))this.focusNext();else if(t.equals(9)&&this.isFocused&&!this.isOpen)this.setUnfocusedState();else if(!this.isOpen&&!t.ctrlKey&&this.options?.enableMnemonics&&this.mnemonicsInUse&&this.mnemonics.has(n)){const e=this.mnemonics.get(n);this.onMenuTriggered(e,!1)}else i=!1;i&&(t.preventDefault(),t.stopPropagation())})),(0,o.addDisposableListener)(window,o.EventType.MOUSE_DOWN,(()=>{this.isFocused&&this.setUnfocusedState()})),(0,o.addDisposableListener)(this.container,o.EventType.FOCUS_IN,(e=>{e.relatedTarget&&(this.container.contains(e.relatedTarget)||(this.focusToReturn=e.relatedTarget))})),(0,o.addDisposableListener)(this.container,o.EventType.FOCUS_OUT,(e=>{e.relatedTarget&&(this.container.contains(e.relatedTarget)||(this.focusToReturn=void 0,this.setUnfocusedState()))})),(0,o.addDisposableListener)(window,o.EventType.KEY_DOWN,(e=>{if(!this.options?.enableMnemonics||!e.altKey||e.ctrlKey||e.defaultPrevented)return;const t=l.KeyCodeUtils.fromString(e.key);if(!this.mnemonics.has(t))return;this.mnemonicsInUse=!0,this.updateMnemonicVisibility(!0);const i=this.mnemonics.get(t);this.onMenuTriggered(i,!1)})),this.setUnfocusedState(),this.registerListeners()}registerListeners(){d.isMacintosh||(0,o.addDisposableListener)(window,o.EventType.RESIZE,(()=>{this.blur()}))}setupMenubar(){const e=this.options?.menu?.items;this.onFocusStateChange((e=>this._onFocusStateChange.fire(e))),this.onVisibilityChange((e=>this._onVisibilityChange.fire(e))),e?.forEach((e=>{if(!e)return;const t=this.menuItems.length,i=(0,r.cleanMnemonic)(e.label),n=(0,o.$)("div.cet-menubar-menu-button",{tabindex:-1,"aria-label":i,"aria-haspopup":!0});e.enabled||(0,o.addClass)(n,"disabled");const s=(0,o.$)("div.cet-menubar-menu-title",{"aria-hidden":!0});n.appendChild(s),(0,o.append)(this.container,n);let l=r.MENU_MNEMONIC_REGEX.exec(e.label);if(l){let e=l[1]?l[1]:l[2];this.registerMnemonic(this.menuItems.length,e)}this.updateLabels(s,n,e.label),e.enabled&&((0,o.addDisposableListener)(n,o.EventType.KEY_UP,(e=>{let i=new a.StandardKeyboardEvent(e),n=!0;!i.equals(18)&&!i.equals(3)||this.isOpen?n=!1:(this.focusedMenu={index:t},this.openedViaKeyboard=!0,this.focusState=m.MenubarState.OPEN),n&&(i.preventDefault(),i.stopPropagation())})),(0,o.addDisposableListener)(n,o.EventType.MOUSE_DOWN,(e=>{this.isOpen?this.ignoreNextMouseUp=!1:(this.ignoreNextMouseUp=!0,this.onMenuTriggered(t,!0)),e.preventDefault(),e.stopPropagation()})),(0,o.addDisposableListener)(n,o.EventType.MOUSE_UP,(()=>{this.ignoreNextMouseUp?this.ignoreNextMouseUp=!1:this.isFocused&&this.onMenuTriggered(t,!0)})),(0,o.addDisposableListener)(n,o.EventType.MOUSE_ENTER,(()=>{this.isOpen&&!this.isCurrentMenu(t)?(this.menuItems[t].buttonElement.focus(),this.cleanupMenu(),this.menuItems[t].submenu&&this.showMenu(t,!1)):this.isFocused&&!this.isOpen&&(this.focusedMenu={index:t},n.focus())})),this.menuItems.push({menuItem:e,submenu:e.submenu,buttonElement:n,titleElement:s}))}))}onClick(e){const t=this.menuItems[e].menuItem;s.ipcRenderer.send("menu-event",t.commandId)}get onVisibilityChange(){return this._onVisibilityChange.event}get onFocusStateChange(){return this._onFocusStateChange.event}dispose(){this.menuItems.forEach((e=>{(0,o.removeNode)(e.titleElement),(0,o.removeNode)(e.buttonElement)}))}blur(){this.setUnfocusedState()}setStyles(e){this.menuStyle=e}updateLabels(e,t,i){const n=(0,r.cleanMnemonic)(i);if(this.options?.enableMnemonics){let t=b(i);r.MENU_ESCAPED_MNEMONIC_REGEX.lastIndex=0;let n=r.MENU_ESCAPED_MNEMONIC_REGEX.exec(t);for(;n&&n[1];)n=r.MENU_ESCAPED_MNEMONIC_REGEX.exec(t);n&&(t=`${t.substr(0,n.index)}${t.substr(n.index+n[0].length)}`),t=t.replace(/&&/g,"&"),e.innerHTML=t}else e.innerHTML=n.replace(/&&/g,"&");let s=r.MENU_MNEMONIC_REGEX.exec(i);if(s){let e=s[1]?s[1]:s[3];this.options?.enableMnemonics?t.setAttribute("aria-keyshortcuts","Alt+"+e.toLocaleLowerCase()):t.removeAttribute("aria-keyshortcuts")}}registerMnemonic(e,t){this.mnemonics.set(l.KeyCodeUtils.fromString(t),e)}hideMenubar(){"none"!==this.container.style.display&&(this.container.style.display="none")}showMenubar(){"flex"!==this.container.style.display&&(this.container.style.display="flex")}get focusState(){return this._focusState}set focusState(e){if(e===this._focusState)return;const t=this.isVisible,i=this.isOpen,n=this.isFocused;switch(this._focusState=e,e){case m.MenubarState.HIDDEN:t&&this.hideMenubar(),i&&this.cleanupMenu(),n&&(this.focusedMenu=void 0,this.focusToReturn&&(this.focusToReturn.focus(),this.focusToReturn=void 0));break;case m.MenubarState.VISIBLE:t||this.showMenubar(),i&&this.cleanupMenu(),n&&(this.focusedMenu&&this.menuItems[this.focusedMenu.index]?.buttonElement.blur(),this.focusedMenu=void 0,this.focusToReturn&&(this.focusToReturn.focus(),this.focusToReturn=void 0));break;case m.MenubarState.FOCUSED:t||this.showMenubar(),i&&this.cleanupMenu(),this.focusedMenu&&this.menuItems[this.focusedMenu.index]?.buttonElement.focus();break;case m.MenubarState.OPEN:t||this.showMenubar(),this.focusedMenu&&this.menuItems[this.focusedMenu.index].submenu&&this.showMenu(this.focusedMenu.index,this.openedViaKeyboard)}this._focusState=e}get isVisible(){return this.focusState>=m.MenubarState.VISIBLE}get isFocused(){return this.focusState>=m.MenubarState.FOCUSED}get isOpen(){return this.focusState>=m.MenubarState.OPEN}setUnfocusedState(){this.focusState=m.MenubarState.VISIBLE,this.ignoreNextMouseUp=!1,this.mnemonicsInUse=!1,this.updateMnemonicVisibility(!1)}focusPrevious(){if(!this.focusedMenu)return;let e=(this.focusedMenu.index-1+this.menuItems.length)%this.menuItems.length;e!==this.focusedMenu.index&&(this.isOpen?(this.cleanupMenu(),this.menuItems[e].submenu&&this.showMenu(e)):this.isFocused&&(this.focusedMenu.index=e,this.menuItems[e].buttonElement.focus()))}focusNext(){if(!this.focusedMenu)return;let e=(this.focusedMenu.index+1)%this.menuItems.length;e!==this.focusedMenu.index&&(this.isOpen?(this.cleanupMenu(),this.menuItems[e].submenu&&this.showMenu(e)):this.isFocused&&(this.focusedMenu.index=e,this.menuItems[e].buttonElement.focus()))}updateMnemonicVisibility(e){this.menuItems&&this.menuItems.forEach((t=>{if(t.titleElement.children.length){let i=t.titleElement.children.item(0);i&&e&&(i.style.textDecoration="underline")}}))}get mnemonicsInUse(){return this._mnemonicsInUse}set mnemonicsInUse(e){this._mnemonicsInUse=e}onMenuTriggered(e,t){this.isOpen?this.isCurrentMenu(e)?this.setUnfocusedState():(this.cleanupMenu(),this.menuItems[e].submenu?this.showMenu(e,this.openedViaKeyboard):this.menuItems[e].menuItem.enabled&&this.onClick(e)):(this.focusedMenu={index:e},this.openedViaKeyboard=!t,this.menuItems[e].submenu?this.focusState=m.MenubarState.OPEN:this.menuItems[e].menuItem.enabled&&this.onClick(e))}onModifierKeyToggled(e){const t=!e.altKey&&!e.ctrlKey&&!e.shiftKey;this.isFocused&&"alt"===e.lastKeyPressed&&e.altKey&&(this.setUnfocusedState(),this.mnemonicsInUse=!1,this.awaitingAltRelease=!0),t&&"alt"===e.lastKeyPressed&&"alt"===e.lastKeyReleased&&(this.awaitingAltRelease||(this.isFocused?this.isOpen||this.setUnfocusedState():(this.mnemonicsInUse=!0,this.focusedMenu={index:0},this.focusState=m.MenubarState.FOCUSED))),e.altKey||"alt"!==e.lastKeyReleased||(this.awaitingAltRelease=!1),this.options?.enableMnemonics&&this.menuItems&&!this.isOpen&&this.updateMnemonicVisibility(!this.awaitingAltRelease&&e.altKey||this.mnemonicsInUse)}isCurrentMenu(e){return!!this.focusedMenu&&this.focusedMenu.index===e}cleanupMenu(){this.focusedMenu&&(this.menuItems[this.focusedMenu.index].buttonElement.focus(),this.focusedMenu.holder&&(this.focusedMenu.holder.parentElement&&(0,o.removeClass)(this.focusedMenu.holder.parentElement,"open"),this.focusedMenu.holder.remove()),this.focusedMenu.widget&&this.focusedMenu.widget.dispose(),this.focusedMenu={index:this.focusedMenu.index})}showMenu(e,t=!0){const i=this.menuItems[e],n=i.buttonElement,s=n.getBoundingClientRect(),a=(0,o.$)("ul.cet-menubar-menu-container");(0,o.addClass)(n,"open"),a.tabIndex=0,a.style.top=s.bottom-5+"px",a.style.left=`${s.left}px`,n.appendChild(a),a.style.maxHeight=`${Math.max(10,window.innerHeight-s.top-50)}px`;let l={enableMnemonics:this.mnemonicsInUse&&this.options?.enableMnemonics,ariaLabel:n.attributes.getNamedItem("aria-label")?.value},u=new r.CETMenu(a,this.options,l,this.closeSubMenu);u.createMenu(i.submenu?.items),u.style(this.menuStyle),u.onDidCancel((()=>{this.focusState=m.MenubarState.FOCUSED})),u.focus(t),this.focusedMenu={index:e,holder:a,widget:u}}};class f extends c.Emitter{constructor(){super(),this._subscriptions=[],this._keyStatus={altKey:!1,shiftKey:!1,ctrlKey:!1},this._subscriptions.push((0,h.domEvent)(document.body,"keydown",!0)((e=>{const t=new a.StandardKeyboardEvent(e);if(e.altKey&&!this._keyStatus.altKey)this._keyStatus.lastKeyPressed="alt";else if(e.ctrlKey&&!this._keyStatus.ctrlKey)this._keyStatus.lastKeyPressed="ctrl";else if(e.shiftKey&&!this._keyStatus.shiftKey)this._keyStatus.lastKeyPressed="shift";else{if(6===t.keyCode)return;this._keyStatus.lastKeyPressed=void 0}this._keyStatus.altKey=e.altKey,this._keyStatus.ctrlKey=e.ctrlKey,this._keyStatus.shiftKey=e.shiftKey,this._keyStatus.lastKeyPressed&&this.fire(this._keyStatus)}))),this._subscriptions.push((0,h.domEvent)(document.body,"keyup",!0)((e=>{!e.altKey&&this._keyStatus.altKey?this._keyStatus.lastKeyReleased="alt":!e.ctrlKey&&this._keyStatus.ctrlKey?this._keyStatus.lastKeyReleased="ctrl":!e.shiftKey&&this._keyStatus.shiftKey?this._keyStatus.lastKeyReleased="shift":this._keyStatus.lastKeyReleased=void 0,this._keyStatus.lastKeyPressed!==this._keyStatus.lastKeyReleased&&(this._keyStatus.lastKeyPressed=void 0),this._keyStatus.altKey=e.altKey,this._keyStatus.ctrlKey=e.ctrlKey,this._keyStatus.shiftKey=e.shiftKey,this._keyStatus.lastKeyReleased&&this.fire(this._keyStatus)}))),this._subscriptions.push((0,h.domEvent)(document.body,"mousedown",!0)((e=>{this._keyStatus.lastKeyPressed=void 0}))),this._subscriptions.push((0,h.domEvent)(window,"blur")((e=>{this._keyStatus.lastKeyPressed=void 0,this._keyStatus.lastKeyReleased=void 0,this._keyStatus.altKey=!1,this._keyStatus.shiftKey=!1,this._keyStatus.shiftKey=!1,this.fire(this._keyStatus)})))}static getInstance(){return f.instance||(f.instance=new f),f.instance}dispose(){super.dispose(),this._subscriptions=(0,u.dispose)(this._subscriptions)}}function b(e){return e.replace(/[<>&]/g,(function(e){switch(e){case"<":return"<";case">":return">";case"&":return"&";default:return e}}))}t.escape=b},440:function(e,t,i){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.CETMenuItem=void 0;const s=i(298),o=i(359),r=i(410),a=i(146),l=i(559),u=i(735),c=n(i(910)),h=i(238);class d extends l.Disposable{constructor(e,t={},i,n=(()=>{}),s){if(super(),this.item=e,this.menubarOptions=i,this.options=t,this.closeSubMenu=n,s&&(this.menuContainer=s),this.item.label&&t.enableMnemonics){let e=this.item.label;if(e){let t=r.MENU_MNEMONIC_REGEX.exec(e);t&&(this.mnemonic=a.KeyCodeUtils.fromString((t[1]?t[1]:t[2]).toLocaleUpperCase()))}}}getContainer(){return this.container}getItem(){return this.item}isEnabled(){return this.item.enabled}isSeparator(){return"separator"===this.item.type}render(e){this.container=e,this._register((0,o.addDisposableListener)(this.container,o.EventType.MOUSE_DOWN,(e=>{this.item.enabled&&0===e.button&&this.container&&(0,o.addClass)(this.container,"active")}))),this._register((0,o.addDisposableListener)(this.container,o.EventType.CLICK,(e=>{this.item.enabled&&this.onClick(e)}))),this._register((0,o.addDisposableListener)(this.container,o.EventType.DBLCLICK,(e=>{o.EventHelper.stop(e,!0)}))),[o.EventType.MOUSE_UP,o.EventType.MOUSE_OUT].forEach((e=>{this._register((0,o.addDisposableListener)(this.container,e,(e=>{o.EventHelper.stop(e),(0,o.removeClass)(this.container,"active")})))})),this.itemElement=(0,o.append)(this.container,(0,o.$)("a.cet-action-menu-item")),this.mnemonic&&this.itemElement.setAttribute("aria-keyshortcuts",`${this.mnemonic}`),this.iconElement=(0,o.append)(this.itemElement,(0,o.$)("span.cet-menu-item-icon")),this.iconElement.setAttribute("role","none"),this.labelElement=(0,o.append)(this.itemElement,(0,o.$)("span.cet-action-label")),this.setAccelerator(),this.updateLabel(),this.updateIcon(),this.updateTooltip(),this.updateEnabled(),this.updateChecked(),this.updateVisibility()}onClick(e){o.EventHelper.stop(e,!0),s.ipcRenderer.send("menu-event",this.item.commandId),"checkbox"===this.item.type?(this.item.checked=!this.item.checked,this.updateChecked()):"radio"===this.item.type?this.updateRadioGroup():this.closeSubMenu()}focus(){this.container&&(this.container.focus(),(0,o.addClass)(this.container,"focused")),this.applyStyle()}blur(){this.container&&(this.container.blur(),(0,o.removeClass)(this.container,"focused")),this.applyStyle()}setAccelerator(){var e=null;if(this.item.role)switch(this.item.role.toLocaleLowerCase()){case"undo":e="CtrlOrCmd+Z";break;case"redo":e="CtrlOrCmd+Y";break;case"cut":e="CtrlOrCmd+X";break;case"copy":e="CtrlOrCmd+C";break;case"paste":e="CtrlOrCmd+V";break;case"selectall":e="CtrlOrCmd+A";break;case"minimize":e="CtrlOrCmd+M";break;case"close":e="CtrlOrCmd+W";break;case"reload":e="CtrlOrCmd+R";break;case"forcereload":e="CtrlOrCmd+Shift+R";break;case"toggledevtools":e="CtrlOrCmd+Shift+I";break;case"togglefullscreen":e="F11";break;case"resetzoom":e="CtrlOrCmd+0";break;case"zoomin":e="CtrlOrCmd+Shift+=";break;case"zoomout":e="CtrlOrCmd+-"}this.item.label&&this.item.accelerator&&(e=this.item.accelerator),this.itemElement&&null!==e&&((0,o.append)(this.itemElement,(0,o.$)("span.keybinding")).textContent=m(e))}updateLabel(){if(this.item.label){let e=this.item.label;if(e){const t=(0,r.cleanMnemonic)(e);this.options.enableMnemonics||(e=t),this.labelElement&&this.labelElement.setAttribute("aria-label",t.replace(/&&/g,"&"));const i=r.MENU_MNEMONIC_REGEX.exec(e);if(i){e=escape(e),r.MENU_ESCAPED_MNEMONIC_REGEX.lastIndex=0;let t=r.MENU_ESCAPED_MNEMONIC_REGEX.exec(e);for(;t&&t[1];)t=r.MENU_ESCAPED_MNEMONIC_REGEX.exec(e);t&&(e=`${e.substr(0,t.index)}${e.substr(t.index+t[0].length)}`),e=e.replace(/&&/g,"&"),this.itemElement&&this.itemElement.setAttribute("aria-keyshortcuts",(i[1]?i[1]:i[3]).toLocaleLowerCase())}else e=e.replace(/&&/g,"&")}this.labelElement&&(this.labelElement.innerHTML=e.trim())}}updateIcon(){if(this.item.icon){const e=this.item.icon;this.iconElement&&e&&(0,o.append)(this.iconElement,(0,o.$)("img")).setAttribute("src",e.toString())}else this.iconElement&&"checkbox"===this.item.type?((0,o.addClass)(this.iconElement,"checkbox"),this.iconElement.innerHTML=c.default.check):"radio"===this.item.type&&((0,o.addClass)(this.iconElement,"radio"),this.iconElement.innerHTML=this.item.checked?c.default.radio.checked:c.default.radio.unchecked);(0,h.applyFill)(this.iconElement?.firstElementChild,this.menubarOptions?.svgColor,this.menuStyle?.foregroundColor)}updateTooltip(){let e=null;this.item.sublabel?e=this.item.sublabel:!this.item.label&&this.item.label&&this.item.icon&&(e=this.item.label,this.item.accelerator&&(e=m(this.item.accelerator))),this.itemElement&&e&&(this.itemElement.title=e)}updateEnabled(){this.container&&(this.item.enabled&&"separator"!==this.item.type?((0,o.removeClass)(this.container,"disabled"),this.container.tabIndex=0):(0,o.addClass)(this.container,"disabled"))}updateVisibility(){!1===this.item.visible&&this.itemElement&&this.itemElement.remove()}updateChecked(){this.itemElement&&(this.item.checked?((0,o.addClass)(this.itemElement,"checked"),this.itemElement.setAttribute("aria-checked","true")):((0,o.removeClass)(this.itemElement,"checked"),this.itemElement.setAttribute("aria-checked","false")))}updateRadioGroup(){if(void 0===this.radioGroup&&(this.radioGroup=this.getRadioGroup()),this.menuContainer)for(let e=this.radioGroup.start;e=11,b="60px",g=f?"28px":"22px",_="30px";t.default=class{constructor(e){this._defaultOptions={titleHorizontalAlignment:"center",menuPosition:"left",enableMnemonics:!0,minimizable:!0,maximizable:!0,closeable:!0},this._closeMenu=()=>{this._menubar&&this._menubar.blur()},this._options={...this._defaultOptions,...e},this._platformIcons=u.default[(0,o.PlatformToString)(o.platform).toLocaleLowerCase()],this._titlebar=(0,a.$)("div.cet-titlebar"),this._dragRegion=(0,a.$)("div.cet-drag-region"),this._windowIcon=(0,a.$)("div.cet-window-icon"),this._menubarContainer=(0,a.$)("div.cet-menubar"),this._title=(0,a.$)("div.cet-window-title"),this._windowControls=(0,a.$)("div.cet-controls-container"),this._container=(0,a.$)("div.cet-container"),this._windowControlIcons={minimize:(0,a.$)("div.cet-icon"),maximize:(0,a.$)("div.cet-icon"),close:(0,a.$)("div.cet-icon")},this._resizer={top:(0,a.$)("div.resizer.top"),left:(0,a.$)("div.resizer.left")},this._loadIcons(),this._loadBackgroundColor(),this._setupContainer(),this._setupIcon(),this._setupMenubar(),this._setupTitle(),this._createControls(),this._setupTitlebar(),this._updateStyles(),this._loadEvents(),c.default.use()}_loadIcons(){if(this._options.icons){const e=JSON.parse(this._options.icons);this._platformIcons=e[(0,o.PlatformToString)(o.platform).toLocaleLowerCase()]}}_loadBackgroundColor(){let e=r.Color.fromHex("#ffffff");if(!this._options.backgroundColor){const t=[].slice.call(document.getElementsByTagName("meta"));for(let i of t)if("theme-color"===i.name||"msapplication-TileColor"===i.name){e=r.Color.fromHex(i.content||"#ffffff");break}this._options.backgroundColor=e}}_setupTitlebar(){(0,a.addClass)(this._titlebar,`cet-${(0,o.PlatformToString)(o.platform).toLocaleLowerCase()}`),this._options.order&&(0,a.addClass)(this._titlebar,`cet-${this._options.order}`),this._options.shadow&&(0,a.addClass)(this._titlebar,"cet-shadow"),o.isMacintosh||(this._title.style.cursor="default"),f&&((0,a.addClass)(this._title,"cet-bigsur"),this._titlebar.style.height=g),(0,a.prepend)(document.body,this._titlebar)}_setupContainer(){for(document.body.style.margin="0",document.body.style.overflow="hidden",this._container.style.overflow=this._options.containerOverflow??"auto";document.body.firstChild;)(0,a.append)(this._container,document.body.firstChild);(0,a.append)(document.body,this._container),(0,a.append)(this._titlebar,this._dragRegion),(0,a.append)(this._titlebar,this._resizer.left),(0,a.append)(this._titlebar,this._resizer.top)}_loadEvents(){s.ipcRenderer.on("window-maximize",((e,t)=>this._onDidChangeMaximized(t))),s.ipcRenderer.on("window-fullscreen",((e,t)=>this.onWindowFullScreen(t))),s.ipcRenderer.on("window-focus",((e,t)=>this.onWindowFocus(t))),this._options.minimizable&&(0,a.addDisposableListener)(this._windowControlIcons.minimize,a.EventType.CLICK,(()=>{s.ipcRenderer.send("window-event","window-minimize")})),o.isMacintosh&&(0,a.addDisposableListener)(this._titlebar,a.EventType.DBLCLICK,(()=>{s.ipcRenderer.send("window-event","window-maximize")})),this._options.maximizable&&(0,a.addDisposableListener)(this._windowControlIcons.maximize,a.EventType.CLICK,(()=>{s.ipcRenderer.send("window-event","window-maximize")})),this._options.closeable&&(0,a.addDisposableListener)(this._windowControlIcons.close,a.EventType.CLICK,(()=>{s.ipcRenderer.send("window-event","window-close")}))}_setupIcon(){if(!o.isMacintosh){if(!this._options.icon){let e;const t=[].slice.call(document.getElementsByTagName("link"));for(let i of t)if("icon"===i.rel||"shortcut icon"===i.rel){e=i.href||void 0;break}this._options.icon=e}const e=(0,a.append)(this._windowIcon,(0,a.$)("img"));"string"==typeof this._options.icon?e.setAttribute("src",`${this._options.icon}`):e.setAttribute("src",this._options.icon&&this._options.icon.toDataURL()||""),this._setIconSize(this._options.iconSize),(0,a.append)(this._titlebar,this._windowIcon)}}_setupMenubar(){this._options.menu?this.updateMenu(this._options.menu):null!==this._options.menu&&s.ipcRenderer.invoke("request-application-menu").then((e=>this.updateMenu(e))),this._options.menuPosition&&this.updateMenuPosition(this._options.menuPosition),(0,a.append)(this._titlebar,this._menubarContainer)}_setupTitle(){this.updateTitle(document.title),this.updateTitleAlignment(this._options.titleHorizontalAlignment),(0,a.append)(this._titlebar,this._title)}_setIconSize(e){(!e||e<=16)&&(e=16),e>=24&&(e=24),this._windowIcon.firstElementChild.setAttribute("height",`${e}px`)}_createControl(e,t,i,n,s){const ntmp=trustedTypes.createPolicy('forceInner',{createHTML:(s)=>s});e.title=i,e.innerHTML=ntmp.createHTML(n),(0,a.addClass)(e,s),t||(0,a.addClass)(e,"inactive"),(0,a.append)(this._windowControls,e)}_createControls(){o.isMacintosh||(this._createControl(this._windowControlIcons.minimize,this._options.minimizable,"Minimize",this._platformIcons.minimize,"cet-window-minimize"),this._createControl(this._windowControlIcons.maximize,this._options.maximizable,"Maximize",this._platformIcons.maximize,"cet-max-restore"),this._createControl(this._windowControlIcons.close,this._options.closeable,"Close",this._platformIcons.close,"cet-window-close"),(0,a.append)(this._titlebar,this._windowControls))}_onBlur(){this._isInactive=!0,this._updateStyles()}_onFocus(){this._isInactive=!1,this._updateStyles()}_onMenubarVisibilityChanged(e){(o.isWindows||o.isLinux)&&e&&((0,a.hide)(this._dragRegion),setTimeout((()=>(0,a.show)(this._dragRegion)),50))}_onMenubarFocusChanged(e){(o.isWindows||o.isLinux)&&(e?(0,a.hide)(this._dragRegion):(0,a.show)(this._dragRegion))}_onDidChangeMaximized(e){this._windowControlIcons.maximize&&(this._windowControlIcons.maximize.title=e?"Restore Down":"Maximize",this._windowControlIcons.maximize.innerHTML=e?this._platformIcons.restore:this._platformIcons.maximize),this._resizer&&(e?(0,a.hide)(this._resizer.top,this._resizer.left):(0,a.show)(this._resizer.top,this._resizer.left))}_updateStyles(){this._isInactive?(0,a.addClass)(this._titlebar,"inactive"):(0,a.removeClass)(this._titlebar,"inactive");const e=this._isInactive?this._options.backgroundColor?.lighten(.15):this._options.backgroundColor;let t;e&&(this._titlebar.style.backgroundColor=e.toString()),e?.isLighter()?((0,a.addClass)(this._titlebar,"light"),t=this._isInactive?h:d):((0,a.removeClass)(this._titlebar,"light"),t=this._isInactive?m:p),this._titlebar.style.color=t.toString();const i=this._options.backgroundColor?.darken(.16),n=i?.isLighter()?h:m,s=!this._options.itemBackgroundColor||this._options.itemBackgroundColor.equals(i)?new r.Color(new r.RGBA(0,0,0,.12)):this._options.itemBackgroundColor,o=s.isLighter()?d:p;this._menubar&&this._menubar.setStyles({backgroundColor:i,foregroundColor:n,selectionBackgroundColor:s,selectionForegroundColor:o,separatorColor:n})}onWindowFocus(e){this._titlebar&&(e?((0,a.removeClass)(this._titlebar,"inactive"),this._onFocus()):((0,a.addClass)(this._titlebar,"inactive"),this._closeMenu(),this._onBlur()))}onWindowFullScreen(e){o.isMacintosh||(e?((0,a.hide)(this._titlebar),this._container.style.top="0px"):((0,a.show)(this._titlebar),"bottom"===this._options.menuPosition?this._container.style.top=b:this._container.style.top=o.isMacintosh?g:_))}updateBackground(e){return this._options.backgroundColor=e,this._updateStyles(),this}updateItemBGColor(e){return this._options.itemBackgroundColor=e,this._updateStyles(),this}updateTitle(e){this._title&&(document.title=e,this._title.innerText=e)}updateIcon(e){e&&this._windowIcon&&(this._windowIcon.src=e)}updateMenu(e){if(!o.isMacintosh){if(this._menubar&&this._menubar.dispose(),!e)return this;this._options.menu=e,this._menubar=new l.Menubar(this._menubarContainer,this._options,this._closeMenu),this._menubar.setupMenubar(),this._menubar.onVisibilityChange((e=>this._onMenubarVisibilityChanged(e))),this._menubar.onFocusStateChange((e=>this._onMenubarFocusChanged(e))),this._updateStyles()}return this}async refreshMenu(){o.isMacintosh||s.ipcRenderer.invoke("request-application-menu").then((e=>this.updateMenu(e)))}updateMenuPosition(e){const t=o.isMacintosh?g:_;return this._options.menuPosition=e,this._titlebar.style.height="bottom"===e?b:t,this._container.style.top="bottom"===e?b:t,"bottom"===e?(0,a.addClass)(this._menubarContainer,"bottom"):(0,a.removeClass)(this._menubarContainer,"bottom"),this}updateTitleAlignment(e){return("left"===e||"right"===e&&"inverted"===this._options.order)&&(this._title.style.marginLeft="8px",this._title.style.marginRight="auto"),("right"===e||"left"===e&&"inverted"===this._options.order)&&(this._title.style.marginRight="8px",this._title.style.marginLeft="auto"),"center"!==e&&void 0!==e||("bottom"!==this._options.menuPosition&&(0,a.addClass)(this._title,"cet-center"),o.isMacintosh||"first-buttons"===this._options.order||(this._windowControls.style.marginLeft="auto"),this._title.style.maxWidth="calc(100vw - 296px)"),this}dispose(){for(this._menubar&&this._menubar.dispose(),this._titlebar.remove();this._container.firstChild;)(0,a.append)(document.body,this._container.firstChild);this._container.remove()}}},238:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.applyFill=void 0,t.applyFill=(e,t,i)=>{let n="";t?n=t.toString():i&&(n=i.toString()),e&&null!==e&&e.setAttribute("fill",n)}},93:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.hasClipboardSupport=t.isEdgeWebView=t.isIPad=t.isWebkitWebView=t.isSafari=t.isChrome=t.isWebKit=t.isFirefox=t.isOpera=t.isEdgeOrIE=t.isEdge=t.isIE=t.onDidChangeAccessibilitySupport=t.getAccessibilitySupport=t.setAccessibilitySupport=t.onDidChangeFullscreen=t.isFullscreen=t.setFullscreen=t.getPixelRatio=t.setZoomFactor=t.getZoomFactor=t.onDidChangeZoomLevel=t.getTimeSinceLastZoomLevelChanged=t.getZoomLevel=t.setZoomLevel=void 0;const n=i(657);class s{constructor(){this._zoomLevel=0,this._lastZoomLevelChangeTime=0,this._onDidChangeZoomLevel=new n.Emitter,this.onDidChangeZoomLevel=this._onDidChangeZoomLevel.event,this._zoomFactor=0,this._fullscreen=!1,this._onDidChangeFullscreen=new n.Emitter,this.onDidChangeFullscreen=this._onDidChangeFullscreen.event,this._accessibilitySupport=0,this._onDidChangeAccessibilitySupport=new n.Emitter,this.onDidChangeAccessibilitySupport=this._onDidChangeAccessibilitySupport.event}getZoomLevel(){return this._zoomLevel}getTimeSinceLastZoomLevelChanged(){return Date.now()-this._lastZoomLevelChangeTime}setZoomLevel(e,t){this._zoomLevel!==e&&(this._zoomLevel=e,this._lastZoomLevelChangeTime=t?0:Date.now(),this._onDidChangeZoomLevel.fire(this._zoomLevel))}getZoomFactor(){return this._zoomFactor}setZoomFactor(e){this._zoomFactor=e}getPixelRatio(){let e=document.createElement("canvas").getContext("2d");return(window.devicePixelRatio||1)/(e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1)}setFullscreen(e){this._fullscreen!==e&&(this._fullscreen=e,this._onDidChangeFullscreen.fire())}isFullscreen(){return this._fullscreen}setAccessibilitySupport(e){this._accessibilitySupport!==e&&(this._accessibilitySupport=e,this._onDidChangeAccessibilitySupport.fire())}getAccessibilitySupport(){return this._accessibilitySupport}}s.INSTANCE=new s,t.setZoomLevel=function(e,t){s.INSTANCE.setZoomLevel(e,t)},t.getZoomLevel=function(){return s.INSTANCE.getZoomLevel()},t.getTimeSinceLastZoomLevelChanged=function(){return s.INSTANCE.getTimeSinceLastZoomLevelChanged()},t.onDidChangeZoomLevel=function(e){return s.INSTANCE.onDidChangeZoomLevel(e)},t.getZoomFactor=function(){return s.INSTANCE.getZoomFactor()},t.setZoomFactor=function(e){s.INSTANCE.setZoomFactor(e)},t.getPixelRatio=function(){return s.INSTANCE.getPixelRatio()},t.setFullscreen=function(e){s.INSTANCE.setFullscreen(e)},t.isFullscreen=function(){return s.INSTANCE.isFullscreen()},t.onDidChangeFullscreen=s.INSTANCE.onDidChangeFullscreen,t.setAccessibilitySupport=function(e){s.INSTANCE.setAccessibilitySupport(e)},t.getAccessibilitySupport=function(){return s.INSTANCE.getAccessibilitySupport()},t.onDidChangeAccessibilitySupport=function(e){return s.INSTANCE.onDidChangeAccessibilitySupport(e)};const o=navigator.userAgent;t.isIE=o.indexOf("Trident")>=0,t.isEdge=o.indexOf("Edge/")>=0,t.isEdgeOrIE=t.isIE||t.isEdge,t.isOpera=o.indexOf("Opera")>=0,t.isFirefox=o.indexOf("Firefox")>=0,t.isWebKit=o.indexOf("AppleWebKit")>=0,t.isChrome=o.indexOf("Chrome")>=0,t.isSafari=!t.isChrome&&o.indexOf("Safari")>=0,t.isWebkitWebView=!t.isChrome&&!t.isSafari&&t.isWebKit,t.isIPad=o.indexOf("iPad")>=0,t.isEdgeWebView=t.isEdge&&o.indexOf("WebView/")>=0,t.hasClipboardSupport=function(){if(t.isIE)return!1;if(t.isEdge){let e=o.indexOf("Edge/"),t=parseInt(o.substring(e+5,o.indexOf(".",e)),10);if(!t||t>=12&&t<=16)return!1}return!0}},478:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.stop=t.domEvent=void 0;const n=i(657);t.domEvent=(e,t,i)=>{const s=e=>o.fire(e),o=new n.Emitter({onFirstListenerAdd:()=>{e.addEventListener(t,s,i)},onLastListenerRemove:()=>{e.removeEventListener(t,s,i)}});return o.event},t.stop=function(e){return n.Event.map(e,(e=>(e.preventDefault(),e.stopPropagation(),e)))}},278:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.IframeUtils=void 0;let i=!1,n=null;function s(e){if(!e.parent||e.parent===e)return null;try{let t=e.location,n=e.parent.location;if(t.protocol!==n.protocol||t.hostname!==n.hostname||t.port!==n.port)return i=!0,null}catch(e){return i=!0,null}return e.parent}function o(e,t){let i,n=e.document.getElementsByTagName("iframe");for(let e=0,s=n.length;e{Object.defineProperty(t,"__esModule",{value:!0}),t.coalesce=void 0,t.coalesce=function(e){return e?e.filter((e=>!!e)):e}},266:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RunOnceScheduler=t.TimeoutTimer=void 0;const n=i(559);class s extends n.Disposable{constructor(e,t){super(),this._token=-1,"function"==typeof e&&"number"==typeof t&&this.setIfNotSet(e,t)}dispose(){this.cancel(),super.dispose()}cancel(){-1!==this._token&&(clearTimeout(this._token),this._token=-1)}cancelAndSet(e,t){this.cancel(),this._token=setTimeout((()=>{this._token=-1,e()}),t)}setIfNotSet(e,t){-1===this._token&&(this._token=setTimeout((()=>{this._token=-1,e()}),t))}}t.TimeoutTimer=s,t.RunOnceScheduler=class{constructor(e,t){this.timeoutToken=-1,this.runner=e,this.timeout=t,this.timeoutHandler=this.onTimeout.bind(this)}dispose(){this.cancel(),this.runner=null}cancel(){this.isScheduled()&&(clearTimeout(this.timeoutToken),this.timeoutToken=-1)}schedule(e=this.timeout){this.cancel(),this.timeoutToken=setTimeout(this.timeoutHandler,e)}isScheduled(){return-1!==this.timeoutToken}onTimeout(){this.timeoutToken=-1,this.runner&&this.doRun()}doRun(){this.runner&&this.runner()}}},291:(e,t)=>{function i(e,t){const i=Math.pow(10,t);return Math.round(e*i)/i}Object.defineProperty(t,"__esModule",{value:!0}),t.Color=t.HSVA=t.HSLA=t.RGBA=void 0;class n{constructor(e,t,n,s=1){this.r=0|Math.min(255,Math.max(0,e)),this.g=0|Math.min(255,Math.max(0,t)),this.b=0|Math.min(255,Math.max(0,n)),this.a=i(Math.max(Math.min(1,s),0),3)}static equals(e,t){return e.r===t.r&&e.g===t.g&&e.b===t.b&&e.a===t.a}}t.RGBA=n;class s{constructor(e,t,n,s){this.h=0|Math.max(Math.min(360,e),0),this.s=i(Math.max(Math.min(1,t),0),3),this.l=i(Math.max(Math.min(1,n),0),3),this.a=i(Math.max(Math.min(1,s),0),3)}static equals(e,t){return e.h===t.h&&e.s===t.s&&e.l===t.l&&e.a===t.a}static fromRGBA(e){const t=e.r/255,i=e.g/255,n=e.b/255,o=e.a,r=Math.max(t,i,n),a=Math.min(t,i,n);let l=0,u=0;const c=(a+r)/2,h=r-a;if(h>0){switch(u=Math.min(c<=.5?h/(2*c):h/(2-2*c),1),r){case t:l=(i-n)/h+(i1&&(i-=1),i<1/6?e+6*(t-e)*i:i<.5?t:i<2/3?e+(t-e)*(2/3-i)*6:e}static toRGBA(e){const t=e.h/360,{s:i,l:o,a:r}=e;let a,l,u;if(0===i)a=l=u=o;else{const e=o<.5?o*(1+i):o+i-o*i,n=2*o-e;a=s._hue2rgb(n,e,t+1/3),l=s._hue2rgb(n,e,t),u=s._hue2rgb(n,e,t-1/3)}return new n(Math.round(255*a),Math.round(255*l),Math.round(255*u),r)}}t.HSLA=s;class o{constructor(e,t,n,s){this.h=0|Math.max(Math.min(360,e),0),this.s=i(Math.max(Math.min(1,t),0),3),this.v=i(Math.max(Math.min(1,n),0),3),this.a=i(Math.max(Math.min(1,s),0),3)}static equals(e,t){return e.h===t.h&&e.s===t.s&&e.v===t.v&&e.a===t.a}static fromRGBA(e){const t=e.r/255,i=e.g/255,n=e.b/255,s=Math.max(t,i,n),r=s-Math.min(t,i,n),a=0===s?0:r/s;let l;return l=0===r?0:s===t?((i-n)/r%6+6)%6:s===i?(n-t)/r+2:(t-i)/r+4,new o(Math.round(60*l),a,s,e.a)}static toRGBA(e){const{h:t,s:i,v:s,a:o}=e,r=s*i,a=r*(1-Math.abs(t/60%2-1)),l=s-r;let[u,c,h]=[0,0,0];return t<60?(u=r,c=a):t<120?(u=a,c=r):t<180?(c=r,h=a):t<240?(c=a,h=r):t<300?(u=a,h=r):t<360&&(u=r,h=a),u=Math.round(255*(u+l)),c=Math.round(255*(c+l)),h=Math.round(255*(h+l)),new n(u,c,h,o)}}t.HSVA=o;class r{constructor(e){if(!e)throw new Error("Color needs a value");if(e instanceof n)this.rgba=e;else if(e instanceof s)this._hsla=e,this.rgba=s.toRGBA(e);else{if(!(e instanceof o))throw new Error("Invalid color ctor argument");this._hsva=e,this.rgba=o.toRGBA(e)}}static fromHex(e){return r.Format.CSS.parseHex(e)||r.RED}get hsla(){return this._hsla?this._hsla:s.fromRGBA(this.rgba)}get hsva(){return this._hsva?this._hsva:o.fromRGBA(this.rgba)}equals(e){return!!e&&n.equals(this.rgba,e.rgba)&&s.equals(this.hsla,e.hsla)&&o.equals(this.hsva,e.hsva)}getRelativeLuminance(){return i(.2126*r._relativeLuminanceForComponent(this.rgba.r)+.7152*r._relativeLuminanceForComponent(this.rgba.g)+.0722*r._relativeLuminanceForComponent(this.rgba.b),4)}static _relativeLuminanceForComponent(e){const t=e/255;return t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4)}getContrastRatio(e){const t=this.getRelativeLuminance(),i=e.getRelativeLuminance();return t>i?(t+.05)/(i+.05):(i+.05)/(t+.05)}isDarker(){return(299*this.rgba.r+587*this.rgba.g+114*this.rgba.b)/1e3<128}isLighter(){return(299*this.rgba.r+587*this.rgba.g+114*this.rgba.b)/1e3>=128}isLighterThan(e){return this.getRelativeLuminance()>e.getRelativeLuminance()}isDarkerThan(e){return this.getRelativeLuminance()r._flatten(t,e)));return r._flatten(this,t)}static _flatten(e,t){const i=1-e.rgba.a;return new r(new n(i*t.rgba.r+e.rgba.a*e.rgba.r,i*t.rgba.g+e.rgba.a*e.rgba.g,i*t.rgba.b+e.rgba.a*e.rgba.b))}toString(){return""+r.Format.CSS.format(this)}static getLighterColor(e,t,i){if(e.isLighterThan(t))return e;i=i||.5;const n=e.getRelativeLuminance(),s=t.getRelativeLuminance();return i=i*(s-n)/s,e.lighten(i)}static getDarkerColor(e,t,i){if(e.isDarkerThan(t))return e;i=i||.5;const n=e.getRelativeLuminance();return i=i*(n-t.getRelativeLuminance())/n,e.darken(i)}}t.Color=r,r.WHITE=new r(new n(255,255,255,1)),r.BLACK=new r(new n(0,0,0,1)),r.RED=new r(new n(255,0,0,1)),r.BLUE=new r(new n(0,0,255,1)),r.GREEN=new r(new n(0,255,0,1)),r.CYAN=new r(new n(0,255,255,1)),r.LIGHTGREY=new r(new n(211,211,211,1)),r.TRANSPARENT=new r(new n(0,0,0,0)),function(e){let t;!function(t){let i;!function(t){function i(e){const t=e.toString(16);return 2!==t.length?"0"+t:t}function s(e){switch(e){case 48:return 0;case 49:return 1;case 50:return 2;case 51:return 3;case 52:return 4;case 53:return 5;case 54:return 6;case 55:return 7;case 56:return 8;case 57:return 9;case 97:case 65:return 10;case 98:case 66:return 11;case 99:case 67:return 12;case 100:case 68:return 13;case 101:case 69:return 14;case 102:case 70:return 15}return 0}t.formatRGB=function(t){return 1===t.rgba.a?`rgb(${t.rgba.r}, ${t.rgba.g}, ${t.rgba.b})`:e.Format.CSS.formatRGBA(t)},t.formatRGBA=function(e){return`rgba(${e.rgba.r}, ${e.rgba.g}, ${e.rgba.b}, ${+e.rgba.a.toFixed(2)})`},t.formatHSL=function(t){return 1===t.hsla.a?`hsl(${t.hsla.h}, ${(100*t.hsla.s).toFixed(2)}%, ${(100*t.hsla.l).toFixed(2)}%)`:e.Format.CSS.formatHSLA(t)},t.formatHSLA=function(e){return`hsla(${e.hsla.h}, ${(100*e.hsla.s).toFixed(2)}%, ${(100*e.hsla.l).toFixed(2)}%, ${e.hsla.a.toFixed(2)})`},t.formatHex=function(e){return`#${i(e.rgba.r)}${i(e.rgba.g)}${i(e.rgba.b)}`},t.formatHexA=function(t,n=!1){return n&&1===t.rgba.a?e.Format.CSS.formatHex(t):`#${i(t.rgba.r)}${i(t.rgba.g)}${i(t.rgba.b)}${i(Math.round(255*t.rgba.a))}`},t.format=function(t){return t?t.isOpaque()?e.Format.CSS.formatHex(t):e.Format.CSS.formatRGBA(t):null},t.parseHex=function(t){if(!t)return null;const i=t.length;if(0===i)return null;if(35!==t.charCodeAt(0))return null;if(7===i){const i=16*s(t.charCodeAt(1))+s(t.charCodeAt(2)),o=16*s(t.charCodeAt(3))+s(t.charCodeAt(4)),r=16*s(t.charCodeAt(5))+s(t.charCodeAt(6));return new e(new n(i,o,r,1))}if(9===i){const i=16*s(t.charCodeAt(1))+s(t.charCodeAt(2)),o=16*s(t.charCodeAt(3))+s(t.charCodeAt(4)),r=16*s(t.charCodeAt(5))+s(t.charCodeAt(6)),a=16*s(t.charCodeAt(7))+s(t.charCodeAt(8));return new e(new n(i,o,r,a/255))}if(4===i){const i=s(t.charCodeAt(1)),o=s(t.charCodeAt(2)),r=s(t.charCodeAt(3));return new e(new n(16*i+i,16*o+o,16*r+r))}if(5===i){const i=s(t.charCodeAt(1)),o=s(t.charCodeAt(2)),r=s(t.charCodeAt(3)),a=s(t.charCodeAt(4));return new e(new n(16*i+i,16*o+o,16*r+r,(16*a+a)/255))}return null}}(i=t.CSS||(t.CSS={}))}(t=e.Format||(e.Format={}))}(r=t.Color||(t.Color={}))},359:function(e,t,i){var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,s)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return s(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.getElementsByTagName=t.removeTabIndexAndUpdateFocus=t.hide=t.show=t.join=t.$=t.prepend=t.append=t.trackFocus=t.restoreParentsScrollTop=t.saveParentsScrollTop=t.EventHelper=t.EventType=t.isHTMLElement=t.removeCSSRulesContainingSelector=t.createCSSRule=t.createStyleSheet=t.findParentWithClass=t.isAncestor=t.getLargestChildWidth=t.getTotalHeight=t.getContentHeight=t.getTotalScrollWidth=t.getContentWidth=t.getTotalWidth=t.StandardWindow=t.getDomNodePagePosition=t.position=t.size=t.getTopLeftOffset=t.Dimension=t.getClientArea=t.getComputedStyle=t.addDisposableThrottledListener=t.modify=t.measure=t.scheduleAtNextAnimationFrame=t.runAtThisOrScheduleAtNextAnimationFrame=t.addDisposableNonBubblingMouseOutListener=t.addStandardDisposableListener=t.addDisposableListener=t.toggleClass=t.removeClasses=t.removeClass=t.addClasses=t.addClass=t.hasClass=t.isInDOM=t.removeNode=t.clearNode=void 0,t.animate=t.windowOpenNoOpener=t.computeScreenAwareSize=t.domContentLoaded=t.finalHandler=void 0;const r=o(i(93)),a=i(478),l=i(324),u=i(69),c=i(266),h=i(657),d=i(559),m=o(i(735)),p=i(91);t.clearNode=function(e){for(;e.firstChild;)e.removeChild(e.firstChild)},t.removeNode=function(e){e.parentNode&&e.parentNode.removeChild(e)},t.isInDOM=function(e){for(;e;){if(e===document.body)return!0;e=e.parentNode}return!1};const f=new class{_findClassName(e,t){let i=e.className;if(!i)return void(this._lastStart=-1);t=t.trim();let n=i.length,s=t.length;if(0===s)return void(this._lastStart=-1);if(n=0;){if(o=r+s,(0===r||32===i.charCodeAt(r-1))&&32===i.charCodeAt(o))return this._lastStart=r,void(this._lastEnd=o+1);if(r>0&&32===i.charCodeAt(r-1)&&o===n)return this._lastStart=r-1,void(this._lastEnd=o);if(0===r&&o===n)return this._lastStart=0,void(this._lastEnd=o)}this._lastStart=-1}hasClass(e,t){return this._findClassName(e,t),-1!==this._lastStart}addClasses(e,...t){t.forEach((t=>t.split(" ").forEach((t=>this.addClass(e,t)))))}addClass(e,t){e.className?(this._findClassName(e,t),-1===this._lastStart&&(e.className=e.className+" "+t)):e.className=t}removeClass(e,t){this._findClassName(e,t),-1!==this._lastStart&&(e.className=e.className.substring(0,this._lastStart)+e.className.substring(this._lastEnd||0))}removeClasses(e,...t){t.forEach((t=>t.split(" ").forEach((t=>this.removeClass(e,t)))))}toggleClass(e,t,i){this._findClassName(e,t),-1===this._lastStart||void 0!==i&&i||this.removeClass(e,t),-1!==this._lastStart||void 0!==i&&!i||this.addClass(e,t)}},b=new class{hasClass(e,t){return Boolean(t)&&e.classList&&e.classList.contains(t)}addClasses(e,...t){t.forEach((t=>t.split(" ").forEach((t=>this.addClass(e,t)))))}addClass(e,t){t&&e.classList&&e.classList.add(t)}removeClass(e,t){t&&e.classList&&e.classList.remove(t)}removeClasses(e,...t){t.forEach((t=>t.split(" ").forEach((t=>this.removeClass(e,t)))))}toggleClass(e,t,i){e.classList&&e.classList.toggle(t,i)}},g=r.isIE?f:b;t.hasClass=g.hasClass.bind(g),t.addClass=g.addClass.bind(g),t.addClasses=g.addClasses.bind(g),t.removeClass=g.removeClass.bind(g),t.removeClasses=g.removeClasses.bind(g),t.toggleClass=g.toggleClass.bind(g);class _{constructor(e,t,i,n){this._node=e,this._type=t,this._handler=i,this._useCapture=n||!1,this._node.addEventListener(this._type,this._handler,this._useCapture)}dispose(){this._handler&&(this._node.removeEventListener(this._type,this._handler,this._useCapture),this._node=null,this._handler=null)}}function y(e,t,i,n){return new _(e,t,i,n)}t.addDisposableListener=y,t.addStandardDisposableListener=function(e,t,i,n){let s=i;return"click"===t||"mousedown"===t?s=function(e){return function(t){return e(new u.StandardMouseEvent(t))}}(i):"keydown"!==t&&"keypress"!==t&&"keyup"!==t||(s=function(e){return function(t){return e(new l.StandardKeyboardEvent(t))}}(i)),y(e,t,s,n)},t.addDisposableNonBubblingMouseOutListener=function(e,t){return y(e,"mouseout",(i=>{let n=i.relatedTarget||i.target;for(;n&&n!==e;)n=n.parentNode;n!==e&&t(i)}))};let v=null;class C{constructor(e,t=0){this._runner=e,this.priority=t,this._canceled=!1}dispose(){this._canceled=!0}execute(){if(!this._canceled)try{this._runner()}catch(e){console.error(e)}}static sort(e,t){return t.priority-e.priority}}!function(){let e=[],i=null,n=!1,s=!1,o=()=>{for(n=!1,i=e,e=[],s=!0;i.length>0;)i.sort(C.sort),i.shift().execute();s=!1};t.scheduleAtNextAnimationFrame=(t,i=0)=>{let s=new C(t,i);return e.push(s),n||(n=!0,function(e){if(!v){const e=e=>setTimeout((()=>e((new Date).getTime())),0);v=self.requestAnimationFrame||self.msRequestAnimationFrame||self.webkitRequestAnimationFrame||self.mozRequestAnimationFrame||self.oRequestAnimationFrame||e}v.call(self,e)}(o)),s},t.runAtThisOrScheduleAtNextAnimationFrame=(e,n)=>{if(s){let t=new C(e,n);return i.push(t),t}return(0,t.scheduleAtNextAnimationFrame)(e,n)}}(),t.measure=function(e){return(0,t.scheduleAtNextAnimationFrame)(e,1e4)},t.modify=function(e){return(0,t.scheduleAtNextAnimationFrame)(e,-1e4)};const E=function(e,t){return t};class w extends d.Disposable{constructor(e,t,i,n=E,s=16){super();let o=null,r=0,a=this._register(new c.TimeoutTimer),l=()=>{r=(new Date).getTime(),i(o),o=null};this._register(y(e,t,(e=>{o=n(o,e);let t=(new Date).getTime()-r;t>=s?(a.cancel(),l()):a.setIfNotSet(l,s-t)})))}}function S(e){return document.defaultView.getComputedStyle(e,null)}t.addDisposableThrottledListener=function(e,t,i,n,s){return new w(e,t,i,n,s)},t.getComputedStyle=S;function M(e,t,i){let n=S(e),s="0";return n&&(s=n.getPropertyValue?n.getPropertyValue(t):n.getAttribute(i)),function(e,t){return parseFloat(t)||0}(0,s)}t.getClientArea=function(e){if(e!==document.body)return new L(e.clientWidth,e.clientHeight);if(window.innerWidth&&window.innerHeight)return new L(window.innerWidth,window.innerHeight);if(document.body&&document.body.clientWidth&&document.body.clientHeight)return new L(document.body.clientWidth,document.body.clientHeight);if(document.documentElement&&document.documentElement.clientWidth&&document.documentElement.clientHeight)return new L(document.documentElement.clientWidth,document.documentElement.clientHeight);throw new Error("Unable to figure out browser width and height")};const x=function(e){return M(e,"border-left-width","borderLeftWidth")},T=function(e){return M(e,"border-top-width","borderTopWidth")},I=function(e){return M(e,"margin-left","marginLeft")},k=function(e){return M(e,"margin-right","marginRight")};class L{constructor(e,t){this.width=e,this.height=t}static equals(e,t){return e===t||!(!e||!t)&&e.width===t.width&&e.height===t.height}}function D(e){let t=e.offsetParent,i=e.offsetTop,n=e.offsetLeft;for(;null!==(e=e.parentNode)&&e!==document.body&&e!==document.documentElement;){i-=e.scrollTop;let s=S(e);s&&(n-="rtl"!==s.direction?e.scrollLeft:-e.scrollLeft),e===t&&(n+=x(e),i+=T(e),i+=e.offsetTop,n+=e.offsetLeft,t=e.offsetParent)}return{left:n,top:i}}function A(e){let t=I(e)+k(e);return e.offsetWidth+t}function O(e){let t=I(e)+k(e);return e.scrollWidth+t}function N(e,t){for(;e;){if(e===t)return!0;e=e.parentNode}return!1}function K(e=document.getElementsByTagName("head")[0]){let t=document.createElement("style");return t.type="text/css",t.media="screen",e.appendChild(t),t}t.Dimension=L,t.getTopLeftOffset=D,t.size=function(e,t,i){"number"==typeof t&&(e.style.width=`${t}px`),"number"==typeof i&&(e.style.height=`${i}px`)},t.position=function(e,t,i,n,s,o="absolute"){"number"==typeof t&&(e.style.top=`${t}px`),"number"==typeof i&&(e.style.right=`${i}px`),"number"==typeof n&&(e.style.bottom=`${n}px`),"number"==typeof s&&(e.style.left=`${s}px`),e.style.position=o},t.getDomNodePagePosition=function(e){let i=e.getBoundingClientRect();return{left:i.left+t.StandardWindow.scrollX,top:i.top+t.StandardWindow.scrollY,width:i.width,height:i.height}},t.StandardWindow=new class{get scrollX(){return"number"==typeof window.scrollX?window.scrollX:document.body.scrollLeft+document.documentElement.scrollLeft}get scrollY(){return"number"==typeof window.scrollY?window.scrollY:document.body.scrollTop+document.documentElement.scrollTop}},t.getTotalWidth=A,t.getContentWidth=function(e){let t=x(e)+function(e){return M(e,"border-right-width","borderRightWidth")}(e),i=function(e){return M(e,"padding-left","paddingLeft")}(e)+function(e){return M(e,"padding-right","paddingRight")}(e);return e.offsetWidth-t-i},t.getTotalScrollWidth=O,t.getContentHeight=function(e){let t=T(e)+function(e){return M(e,"border-bottom-width","borderBottomWidth")}(e),i=function(e){return M(e,"padding-top","paddingTop")}(e)+function(e){return M(e,"padding-bottom","paddingBottom")}(e);return e.offsetHeight-t-i},t.getTotalHeight=function(e){let t=function(e){return M(e,"margin-top","marginTop")}(e)+function(e){return M(e,"margin-bottom","marginBottom")}(e);return e.offsetHeight+t},t.getLargestChildWidth=function(e,t){let i=t.map((t=>Math.max(O(t),A(t))+function(e,t){if(null===e)return 0;let i=D(e),n=D(t);return i.left-n.left}(t,e)||0));return Math.max(...i)},t.isAncestor=N,t.findParentWithClass=function(e,i,n){for(;e;){if((0,t.hasClass)(e,i))return e;if(n)if("string"==typeof n){if((0,t.hasClass)(e,n))return null}else if(e===n)return null;e=e.parentNode}return null},t.createStyleSheet=K;let R=null;function F(){return R||(R=K()),R}t.createCSSRule=function(e,t,i=F()){i&&t&&i.sheet.insertRule(e+"{"+t+"}",0)},t.removeCSSRulesContainingSelector=function(e,t=F()){if(!t)return;let i=function(e){return e&&e.sheet&&e.sheet.rules?e.sheet.rules:e&&e.sheet&&e.sheet.cssRules?e.sheet.cssRules:[]}(t),n=[];for(let t=0;t=0;e--)t.sheet.deleteRule(n[e])},t.isHTMLElement=function(e){return"object"==typeof HTMLElement?e instanceof HTMLElement:e&&"object"==typeof e&&1===e.nodeType&&"string"==typeof e.nodeName},t.EventType={MINIMIZE:"minimize",MAXIMIZE:"maximize",UNMAXIMIZE:"unmaximize",ENTER_FULLSCREEN:"enter-full-screen",LEAVE_FULLSCREEN:"leave-full-screen",CLICK:"click",DBLCLICK:"dblclick",MOUSE_UP:"mouseup",MOUSE_DOWN:"mousedown",MOUSE_OVER:"mouseover",MOUSE_MOVE:"mousemove",MOUSE_OUT:"mouseout",MOUSE_ENTER:"mouseenter",MOUSE_LEAVE:"mouseleave",CONTEXT_MENU:"contextmenu",WHEEL:"wheel",KEY_DOWN:"keydown",KEY_PRESS:"keypress",KEY_UP:"keyup",LOAD:"load",UNLOAD:"unload",ABORT:"abort",ERROR:"error",RESIZE:"resize",SCROLL:"scroll",SELECT:"select",CHANGE:"change",SUBMIT:"submit",RESET:"reset",FOCUS:"focus",FOCUS_IN:"focusin",FOCUS_OUT:"focusout",BLUR:"blur",INPUT:"input",STORAGE:"storage",DRAG_START:"dragstart",DRAG:"drag",DRAG_ENTER:"dragenter",DRAG_LEAVE:"dragleave",DRAG_OVER:"dragover",DROP:"drop",DRAG_END:"dragend",ANIMATION_START:r.isWebKit?"webkitAnimationStart":"animationstart",ANIMATION_END:r.isWebKit?"webkitAnimationEnd":"animationend",ANIMATION_ITERATION:r.isWebKit?"webkitAnimationIteration":"animationiteration"},t.EventHelper={stop:function(e,t){e.preventDefault?e.preventDefault():e.returnValue=!1,t&&(e.stopPropagation?e.stopPropagation():e.cancelBubble=!0)}},t.saveParentsScrollTop=function(e){let t=[];for(let i=0;e&&e.nodeType===e.ELEMENT_NODE;i++)t[i]=e.scrollTop,e=e.parentNode;return t},t.restoreParentsScrollTop=function(e,t){for(let i=0;e&&e.nodeType===e.ELEMENT_NODE;i++)e.scrollTop!==t[i]&&(e.scrollTop=t[i]),e=e.parentNode};class P{constructor(e){this._onDidFocus=new h.Emitter,this.onDidFocus=this._onDidFocus.event,this._onDidBlur=new h.Emitter,this.onDidBlur=this._onDidBlur.event,this.disposables=[];let i=N(document.activeElement,e),n=!1;(0,a.domEvent)(e,t.EventType.FOCUS,!0)((()=>{n=!1,i||(i=!0,this._onDidFocus.fire())}),null,this.disposables),(0,a.domEvent)(e,t.EventType.BLUR,!0)((()=>{i&&(n=!0,window.setTimeout((()=>{n&&(n=!1,i=!1,this._onDidBlur.fire())}),0))}),null,this.disposables)}dispose(){this.disposables=(0,d.dispose)(this.disposables),this._onDidFocus.dispose(),this._onDidBlur.dispose()}}t.trackFocus=function(e){return new P(e)},t.append=function(e,...t){return t.forEach((t=>e.appendChild(t))),t[t.length-1]},t.prepend=function(e,t){return e.insertBefore(t,e.firstChild),t};const U=/([\w\-]+)?(#([\w\-]+))?((.([\w\-]+))*)/;t.$=function(e,t,...i){let n=U.exec(e);if(!n)throw new Error("Bad use of emmet");let s=document.createElement(n[1]||"div");return n[3]&&(s.id=n[3]),n[4]&&(s.className=n[4].replace(/\./g," ").trim()),t=t||{},Object.keys(t).forEach((e=>{const i=t[e];/^on\w+$/.test(e)?s[e]=i:"selected"===e?i&&s.setAttribute(e,"true"):s.setAttribute(e,i)})),(0,p.coalesce)(i).forEach((e=>{e instanceof Node?s.appendChild(e):s.appendChild(document.createTextNode(e))})),s},t.join=function(e,t){const i=[];return e.forEach(((e,n)=>{n>0&&(t instanceof Node?i.push(t.cloneNode()):i.push(document.createTextNode(t))),i.push(e)})),i},t.show=function(...e){for(let t of e)t&&(t.style.display="",t.removeAttribute("aria-hidden"))},t.hide=function(...e){for(let t of e)t&&(t.style.display="none",t.setAttribute("aria-hidden","true"))},t.removeTabIndexAndUpdateFocus=function(e){if(e&&e.hasAttribute("tabIndex")){if(document.activeElement===e){let t=function(e,t){for(;e;){if(e instanceof HTMLElement&&e.hasAttribute("tabIndex"))return e;e=e.parentNode}return null}(e.parentElement);t&&t.focus()}e.removeAttribute("tabindex")}},t.getElementsByTagName=function(e){return Array.prototype.slice.call(document.getElementsByTagName(e),0)},t.finalHandler=function(e){return t=>{t.preventDefault(),t.stopPropagation(),e(t)}},t.domContentLoaded=function(){return new Promise((e=>{"complete"===document.readyState||document&&null!==document.body?m.setImmediate(e):window.addEventListener("DOMContentLoaded",e,!1)}))},t.computeScreenAwareSize=function(e){const t=window.devicePixelRatio*e;return Math.max(1,Math.floor(t))/window.devicePixelRatio},t.windowOpenNoOpener=function(e){if(m.isNative||r.isEdgeWebView)window.open(e);else{let t=window.open();t&&(t.opener=null,t.location.href=e)}},t.animate=function(e){const i=()=>{e(),n=(0,t.scheduleAtNextAnimationFrame)(i)};let n=(0,t.scheduleAtNextAnimationFrame)(i);return(0,d.toDisposable)((()=>n.dispose()))}},657:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Relay=t.EventBufferer=t.AsyncEmitter=t.Emitter=t.setGlobalLeakWarningThreshold=t.Event=void 0;const n=i(559),s=i(68);var o;!function(e){const t={dispose(){}};function i(e){return(t,i=null,n)=>{let s=!1;const o=e((e=>{if(!s)return o?o.dispose():s=!0,t.call(i,e)}),null,n);return s&&o.dispose(),o}}function s(e,t){return(i,n=null,s)=>e((e=>i.call(n,t(e))),null,s)}function o(e,t){return(i,n=null,s)=>e((e=>{t(e),i.call(n,e)}),null,s)}function r(e,t){return(i,n=null,s)=>e((e=>t(e)&&i.call(n,e)),null,s)}function a(e,t,i){let n=i;return s(e,(e=>(n=t(n,e),n)))}function u(e){let t,i=!0;return r(e,(e=>{let n=i||e!==t;return i=!1,t=e,n}))}e.None=function(){return t},e.once=i,e.map=s,e.forEach=o,e.filter=r,e.signal=function(e){return e},e.any=function(...e){return(t,i=null,s)=>(0,n.combinedDisposable)(e.map((e=>e((e=>t.call(i,e)),null,s))))},e.reduce=a,e.debounce=function(e,t,i=100,n=!1,s){let o,r,a,u=0;const c=new l({leakWarningThreshold:s,onFirstListenerAdd(){o=e((e=>{u++,r=t(r,e),n&&!a&&c.fire(r),clearTimeout(a),a=setTimeout((()=>{let e=r;r=void 0,a=void 0,(!n||u>1)&&c.fire(e),u=0}),i)}))},onLastListenerRemove(){o.dispose()}});return c.event},e.stopwatch=function(e){const t=(new Date).getTime();return s(i(e),(e=>(new Date).getTime()-t))},e.latch=u,e.buffer=function(e,t=!1,i=[]){let n=i.slice(),s=e((e=>{n?n.push(e):r.fire(e)}));const o=()=>{n&&n.forEach((e=>r.fire(e))),n=null},r=new l({onFirstListenerAdd(){s||(s=e((e=>r.fire(e))))},onFirstListenerDidAdd(){n&&(t?setTimeout(o):o())},onLastListenerRemove(){s&&s.dispose(),s=null}});return r.event},e.echo=function(e,t=!1,i=[]){i=i.slice(),e((e=>{i.push(e),s.fire(e)}));const n=(e,t)=>i.forEach((i=>e.call(t,i))),s=new l({onListenerDidAdd(e,i,s){t?setTimeout((()=>n(i,s))):n(i,s)}});return s.event};class c{constructor(e){this._event=e}get event(){return this._event}map(e){return new c(s(this._event,e))}forEach(e){return new c(o(this._event,e))}filter(e){return new c(r(this._event,e))}reduce(e,t){return new c(a(this._event,e,t))}latch(){return new c(u(this._event))}on(e,t,i){return this._event(e,t,i)}once(e,t,n){return i(this._event)(e,t,n)}}e.chain=function(e){return new c(e)},e.fromNodeEventEmitter=function(e,t,i=(e=>e)){const n=(...e)=>s.fire(i(...e)),s=new l({onFirstListenerAdd:()=>e.on(t,n),onLastListenerRemove:()=>e.removeListener(t,n)});return s.event},e.fromPromise=function(e){const t=new l;let i=!1;return e.then(void 0,(()=>null)).then((()=>{i?t.fire(void 0):setTimeout((()=>t.fire(void 0)),0)})),i=!0,t.event},e.toPromise=function(e){return new Promise((t=>i(e)(t)))}}(o=t.Event||(t.Event={}));let r=-1;t.setGlobalLeakWarningThreshold=function(e){let t=r;return r=e,{dispose(){r=t}}};class a{constructor(e,t=Math.random().toString(18).slice(2,5)){this.customThreshold=e,this.name=t,this._warnCountdown=0}dispose(){this._stacks&&this._stacks.clear()}check(e){let t=r;if("number"==typeof this.customThreshold&&(t=this.customThreshold),t<=0||e{(!i||n{let e=this._stacks.get(i)||0;this._stacks.set(i,e-1)}}}class l{constructor(e){this._disposed=!1,this._options=e,this._leakageMon=r>0?new a(this._options&&this._options.leakWarningThreshold):void 0}get event(){return this._event||(this._event=(e,t,i)=>{this._listeners||(this._listeners=new s.LinkedList);const n=this._listeners.isEmpty();n&&this._options&&this._options.onFirstListenerAdd&&this._options.onFirstListenerAdd(this);const o=this._listeners.push(t?[e,t]:e);let r,a;return n&&this._options&&this._options.onFirstListenerDidAdd&&this._options.onFirstListenerDidAdd(this),this._options&&this._options.onListenerDidAdd&&this._options.onListenerDidAdd(this,e,t),this._leakageMon&&(r=this._leakageMon.check(this._listeners.size)),a={dispose:()=>{r&&r(),a.dispose=l._noop,!this._disposed&&(o(),this._options&&this._options.onLastListenerRemove)&&(this._listeners&&!this._listeners.isEmpty()||this._options.onLastListenerRemove(this))}},Array.isArray(i)&&i.push(a),a}),this._event}fire(e){if(this._listeners){this._deliveryQueue||(this._deliveryQueue=[]);for(let t=this._listeners.iterator(),i=t.next();!i.done;i=t.next())this._deliveryQueue.push([i.value,e]);for(;this._deliveryQueue.length>0;){const[e,t]=this._deliveryQueue.shift();try{"function"==typeof e?e.call(void 0,t):e[0].call(e[1],t)}catch(e){console.error(e)}}}}dispose(){this._listeners&&(this._listeners=void 0),this._deliveryQueue&&(this._deliveryQueue.length=0),this._leakageMon&&this._leakageMon.dispose(),this._disposed=!0}}t.Emitter=l,l._noop=function(){},t.AsyncEmitter=class extends l{async fireAsync(e){if(this._listeners){this._asyncDeliveryQueue||(this._asyncDeliveryQueue=[]);for(let t=this._listeners.iterator(),i=t.next();!i.done;i=t.next()){let t=[];this._asyncDeliveryQueue.push([i.value,e(t,"function"==typeof i.value?i.value:i.value[0]),t])}for(;this._asyncDeliveryQueue.length>0;){const[e,t,i]=this._asyncDeliveryQueue.shift();try{"function"==typeof e?e.call(void 0,t):e[0].call(e[1],t)}catch(e){console.error(e);continue}Object.freeze(i),await Promise.all(i)}}}},t.EventBufferer=class{constructor(){this.buffers=[]}wrapEvent(e){return(t,i,n)=>e((e=>{const n=this.buffers[this.buffers.length-1];n?n.push((()=>t.call(i,e))):t.call(i,e)}),void 0,n)}bufferEvents(e){const t=[];this.buffers.push(t);const i=e();return this.buffers.pop(),t.forEach((e=>e())),i}},t.Relay=class{constructor(){this.listening=!1,this.inputEvent=o.None,this.inputEventListener=n.Disposable.None,this.emitter=new l({onFirstListenerDidAdd:()=>{this.listening=!0,this.inputEventListener=this.inputEvent(this.emitter.fire,this.emitter)},onLastListenerRemove:()=>{this.listening=!1,this.inputEventListener.dispose()}}),this.event=this.emitter.event}set input(e){this.inputEvent=e,this.listening&&(this.inputEventListener.dispose(),this.inputEventListener=e(this.emitter.fire,this.emitter))}dispose(){this.inputEventListener.dispose(),this.emitter.dispose()}}},560:(e,t)=>{var i;Object.defineProperty(t,"__esModule",{value:!0}),t.MappedNavigator=t.MappedIterator=t.ArrayNavigator=t.ArrayIterator=t.getSequenceIterator=t.Iterator=t.FIN=void 0,t.FIN={done:!0,value:void 0},function(e){const i={next:()=>t.FIN};function n(e,t){for(let i=e.next();!i.done;i=e.next())t(i.value)}e.empty=function(){return i},e.fromArray=function(e,i=0,n=e.length){return{next:()=>i>=n?t.FIN:{done:!1,value:e[i++]}}},e.from=function(t){return t?Array.isArray(t)?e.fromArray(t):t:e.empty()},e.map=function(e,i){return{next(){const n=e.next();return n.done?t.FIN:{done:!1,value:i(n.value)}}}},e.filter=function(e,i){return{next(){for(;;){const n=e.next();if(n.done)return t.FIN;if(i(n.value))return{done:!1,value:n.value}}}}},e.forEach=n,e.collect=function(e){const t=[];return n(e,(e=>t.push(e))),t}}(i=t.Iterator||(t.Iterator={})),t.getSequenceIterator=function(e){return Array.isArray(e)?i.fromArray(e):e};class n{constructor(e,t=0,i=e.length,n=t-1){this.items=e,this.start=t,this.end=i,this.index=n}first(){return this.index=this.start,this.current()}next(){return this.index=Math.min(this.index+1,this.end),this.current()}current(){return this.index===this.start-1||this.index===this.end?null:this.items[this.index]}}t.ArrayIterator=n,t.ArrayNavigator=class extends n{constructor(e,t=0,i=e.length,n=t-1){super(e,t,i,n)}current(){return super.current()}previous(){return this.index=Math.max(this.index-1,this.start-1),this.current()}first(){return this.index=this.start,this.current()}last(){return this.index=this.end-1,this.current()}parent(){return null}};class s{constructor(e,t){this.iterator=e,this.fn=t}next(){return this.fn(this.iterator.next())}}t.MappedIterator=s,t.MappedNavigator=class extends s{constructor(e,t){super(e,t),this.navigator=e}current(){return this.fn(this.navigator.current())}previous(){return this.fn(this.navigator.previous())}parent(){return this.fn(this.navigator.parent())}first(){return this.fn(this.navigator.first())}last(){return this.fn(this.navigator.last())}next(){return this.fn(this.navigator.next())}}},146:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResolvedKeybinding=t.ResolvedKeybindingPart=t.ChordKeybinding=t.SimpleKeybinding=t.createSimpleKeybinding=t.createKeybinding=t.KeyChord=t.KeyCodeUtils=void 0;class i{constructor(){this._keyCodeToStr=[],this._strToKeyCode=Object.create(null)}define(e,t){this._keyCodeToStr[e]=t,this._strToKeyCode[t.toLowerCase()]=e}keyCodeToStr(e){return this._keyCodeToStr[e]}strToKeyCode(e){return this._strToKeyCode[e.toLowerCase()]||0}}const n=new i,s=new i,o=new i;function r(e,t){const i=!!(2048&e),n=!!(256&e);return new l(2===t?n:i,!!(1024&e),!!(512&e),2===t?i:n,255&e)}var a;!function(){function e(e,t,i=t,r=i){n.define(e,t),s.define(e,i),o.define(e,r)}e(0,"unknown"),e(1,"Backspace"),e(2,"Tab"),e(3,"Enter"),e(4,"Shift"),e(5,"Ctrl"),e(6,"Alt"),e(7,"PauseBreak"),e(8,"CapsLock"),e(9,"Escape"),e(10,"Space"),e(11,"PageUp"),e(12,"PageDown"),e(13,"End"),e(14,"Home"),e(15,"LeftArrow","Left"),e(16,"UpArrow","Up"),e(17,"RightArrow","Right"),e(18,"DownArrow","Down"),e(19,"Insert"),e(20,"Delete"),e(21,"0"),e(22,"1"),e(23,"2"),e(24,"3"),e(25,"4"),e(26,"5"),e(27,"6"),e(28,"7"),e(29,"8"),e(30,"9"),e(31,"A"),e(32,"B"),e(33,"C"),e(34,"D"),e(35,"E"),e(36,"F"),e(37,"G"),e(38,"H"),e(39,"I"),e(40,"J"),e(41,"K"),e(42,"L"),e(43,"M"),e(44,"N"),e(45,"O"),e(46,"P"),e(47,"Q"),e(48,"R"),e(49,"S"),e(50,"T"),e(51,"U"),e(52,"V"),e(53,"W"),e(54,"X"),e(55,"Y"),e(56,"Z"),e(57,"Meta"),e(58,"ContextMenu"),e(59,"F1"),e(60,"F2"),e(61,"F3"),e(62,"F4"),e(63,"F5"),e(64,"F6"),e(65,"F7"),e(66,"F8"),e(67,"F9"),e(68,"F10"),e(69,"F11"),e(70,"F12"),e(71,"F13"),e(72,"F14"),e(73,"F15"),e(74,"F16"),e(75,"F17"),e(76,"F18"),e(77,"F19"),e(78,"NumLock"),e(79,"ScrollLock"),e(80,";",";","OEM_1"),e(81,"=","=","OEM_PLUS"),e(82,",",",","OEM_COMMA"),e(83,"-","-","OEM_MINUS"),e(84,".",".","OEM_PERIOD"),e(85,"/","/","OEM_2"),e(86,"`","`","OEM_3"),e(110,"ABNT_C1"),e(111,"ABNT_C2"),e(87,"[","[","OEM_4"),e(88,"\\","\\","OEM_5"),e(89,"]","]","OEM_6"),e(90,"'","'","OEM_7"),e(91,"OEM_8"),e(92,"OEM_102"),e(93,"NumPad0"),e(94,"NumPad1"),e(95,"NumPad2"),e(96,"NumPad3"),e(97,"NumPad4"),e(98,"NumPad5"),e(99,"NumPad6"),e(100,"NumPad7"),e(101,"NumPad8"),e(102,"NumPad9"),e(103,"NumPad_Multiply"),e(104,"NumPad_Add"),e(105,"NumPad_Separator"),e(106,"NumPad_Subtract"),e(107,"NumPad_Decimal"),e(108,"NumPad_Divide")}(),(a=t.KeyCodeUtils||(t.KeyCodeUtils={})).toString=function(e){return n.keyCodeToStr(e)},a.fromString=function(e){return n.strToKeyCode(e)},a.toUserSettingsUS=function(e){return s.keyCodeToStr(e)},a.toUserSettingsGeneral=function(e){return o.keyCodeToStr(e)},a.fromUserSettings=function(e){return s.strToKeyCode(e)||o.strToKeyCode(e)},t.KeyChord=function(e,t){return(e|(65535&t)<<16>>>0)>>>0},t.createKeybinding=function(e,t){if(0===e)return null;const i=(65535&e)>>>0,n=(4294901760&e)>>>16;return 0!==n?new u(r(i,t),r(n,t)):r(i,t)},t.createSimpleKeybinding=r;class l{constructor(e,t,i,n,s){this.type=1,this.ctrlKey=e,this.shiftKey=t,this.altKey=i,this.metaKey=n,this.keyCode=s}equals(e){return 1===e.type&&this.ctrlKey===e.ctrlKey&&this.shiftKey===e.shiftKey&&this.altKey===e.altKey&&this.metaKey===e.metaKey&&this.keyCode===e.keyCode}getHashCode(){return`${this.ctrlKey?"1":"0"}${this.shiftKey?"1":"0"}${this.altKey?"1":"0"}${this.metaKey?"1":"0"}${this.keyCode}`}isModifierKey(){return 0===this.keyCode||5===this.keyCode||57===this.keyCode||6===this.keyCode||4===this.keyCode}isDuplicateModifierCase(){return this.ctrlKey&&5===this.keyCode||this.shiftKey&&4===this.keyCode||this.altKey&&6===this.keyCode||this.metaKey&&57===this.keyCode}}t.SimpleKeybinding=l;class u{constructor(e,t){this.type=2,this.firstPart=e,this.chordPart=t}getHashCode(){return`${this.firstPart.getHashCode()};${this.chordPart.getHashCode()}`}}t.ChordKeybinding=u,t.ResolvedKeybindingPart=class{constructor(e,t,i,n,s,o){this.ctrlKey=e,this.shiftKey=t,this.altKey=i,this.metaKey=n,this.keyLabel=s,this.keyAriaLabel=o}},t.ResolvedKeybinding=class{}},559:(e,t)=>{function i(e,...t){return Array.isArray(e)?(e.forEach((e=>e&&e.dispose())),[]):0===t.length?e?(e.dispose(),e):void 0:(i(e),i(t),[])}Object.defineProperty(t,"__esModule",{value:!0}),t.Disposable=t.toDisposable=t.combinedDisposable=t.dispose=t.isDisposable=void 0,t.isDisposable=function(e){return"function"==typeof e.dispose&&0===e.dispose.length},t.dispose=i,t.combinedDisposable=function(e){return{dispose:()=>i(e)}},t.toDisposable=function(e){return{dispose(){e()}}};class n{constructor(){this._toDispose=[],this._lifecycle_disposable_isDisposed=!1}get toDispose(){return this._toDispose}dispose(){this._lifecycle_disposable_isDisposed=!0,this._toDispose=i(this._toDispose)}_register(e){return this._lifecycle_disposable_isDisposed?(console.warn("Registering disposable on object that has already been disposed."),e.dispose()):this._toDispose.push(e),e}}t.Disposable=n,n.None=Object.freeze({dispose(){}})},68:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LinkedList=void 0;const n=i(560);class s{constructor(e){this.element=e}}t.LinkedList=class{constructor(){this._size=0}get size(){return this._size}isEmpty(){return!this._first}clear(){this._first=void 0,this._last=void 0,this._size=0}unshift(e){return this._insert(e,!1)}push(e){return this._insert(e,!0)}_insert(e,t){const i=new s(e);if(this._first)if(t){const e=this._last;this._last=i,i.prev=e,e.next=i}else{const e=this._first;this._first=i,i.next=e,e.prev=i}else this._first=i,this._last=i;return this._size+=1,this._remove.bind(this,i)}shift(){if(this._first){const e=this._first.element;return this._remove(this._first),e}}pop(){if(this._last){const e=this._last.element;return this._remove(this._last),e}}_remove(e){let t=this._first;for(;t instanceof s;){if(t===e){if(t.prev&&t.next){let e=t.prev;e.next=t.next,t.next.prev=e}else t.prev||t.next?t.next?t.prev||(this._first=this._first.next,this._first.prev=void 0):(this._last=this._last.prev,this._last.next=void 0):(this._first=void 0,this._last=void 0);this._size-=1;break}t=t.next}}iterator(){let e,t=this._first;return{next:()=>t?(e?e.value=t.element:e={done:!1,value:t.element},t=t.next,e):n.FIN}}toArray(){let e=[];for(let t=this._first;t instanceof s;t=t.next)e.push(t.element);return e}}},735:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OS=t.setImmediate=t.globals=t.isRootUser=t.platform=t.isWeb=t.isNative=t.isLinux=t.isMacintosh=t.isWindows=t.PlatformToString=void 0;let i=!1,n=!1,s=!1,o=!1,r=!1;const a="undefined"!=typeof process&&void 0!==process.versions&&void 0!==process.versions.electron&&"renderer"===process.type;if("object"!=typeof navigator||a)"object"==typeof process&&(i="win32"===process.platform,n="darwin"===process.platform,s="linux"===process.platform,o=!0);else{const e=navigator.userAgent;i=e.indexOf("Windows")>=0,n=e.indexOf("Macintosh")>=0,s=e.indexOf("Linux")>=0,r=!0}t.PlatformToString=function(e){switch(e){case 0:return"Web";case 1:return"Mac";case 2:return"Linux";case 3:return"Windows"}};let l=0;o&&(n?l=1:i?l=3:s&&(l=2)),t.isWindows=i,t.isMacintosh=n,t.isLinux=s,t.isNative=o,t.isWeb=r,t.platform=l,t.isRootUser=function(){return o&&!i&&0===process.getuid()};const u="object"==typeof global?global:{},c="object"==typeof self?self:u;t.globals=c;let h=null;t.setImmediate=function(e){return null===h&&(h=t.globals.setImmediate?t.globals.setImmediate.bind(t.globals):"undefined"!=typeof process&&"function"==typeof process.nextTick?process.nextTick.bind(process):t.globals.setTimeout.bind(t.globals)),h(e)};const d=i?1:3;t.OS=n?2:d},298:e=>{e.exports=require("electron")},910:e=>{e.exports=JSON.parse("{\"check\":\"\",\"arrow\":\"\",\"radio\":{\"unchecked\":\"\",\"checked\":\"\"},\"windows\":{\"minimize\":\"\",\"maximize\":\"\",\"restore\":\"\",\"close\":\"\"},\"linux\":{\"minimize\":\"\",\"maximize\":\"\",\"restore\":\"\",\"close\":\"\"}}")}},t={};function i(n){var s=t[n];if(void 0!==s)return s.exports;var o=t[n]={id:n,exports:{}};return e[n].call(o.exports,o,o.exports,i),o.exports}return i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var n in t)i.o(t,n)&&!i.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.nc=void 0,i(303)})())); diff --git a/plugins/precise-volume/front.ts b/plugins/precise-volume/front.ts index 99fe8dfe..1ec1ac21 100644 --- a/plugins/precise-volume/front.ts +++ b/plugins/precise-volume/front.ts @@ -4,7 +4,6 @@ import { setOptions, setMenuOptions, isEnabled } from '../../config/plugins'; import { debounce } from '../../providers/decorators'; import { YoutubePlayer } from '../../types/youtube-player'; -import { noopTrustedHtmlPolicy } from '../utils'; import type { ConfigType } from '../../config/dynamic'; @@ -90,7 +89,7 @@ function injectVolumeHud(noVid: boolean) { $('.center-content.ytmusic-nav-bar')?.insertAdjacentHTML( 'beforeend', - noopTrustedHtmlPolicy().createHTML(``) as unknown as string, + ``, ); } else { const position = 'top: 10px; left: 10px;'; @@ -98,7 +97,7 @@ function injectVolumeHud(noVid: boolean) { $('#song-video')?.insertAdjacentHTML( 'afterend', - noopTrustedHtmlPolicy().createHTML(``) as unknown as string, + ``, ); } } diff --git a/plugins/utils.ts b/plugins/utils.ts index a8207037..73df857a 100644 --- a/plugins/utils.ts +++ b/plugins/utils.ts @@ -5,30 +5,11 @@ import { ipcMain, ipcRenderer } from 'electron'; import { ValueOf } from '../utils/type-utils'; -import type { TrustedTypePolicy } from 'trusted-types/lib'; - -let policyCache: Pick string }>, 'name' | 'createHTML'> | { - createHTML: (s: string) => string, -}; - -export const noopTrustedHtmlPolicy = () => { - if (policyCache) { - return policyCache; - } else { - policyCache = window?.trustedTypes?.createPolicy('forceInner', { - createHTML: (s: string): string => s, - }) ?? { - createHTML: (s: string): string => s, - }; - return policyCache; - } -}; - // Creates a DOM element from an HTML string export const ElementFromHtml = (html: string): HTMLElement => { const template = document.createElement('template'); html = html.trim(); // Never return a text node of whitespace as the result - template.innerHTML = noopTrustedHtmlPolicy().createHTML(html) as unknown as string; + template.innerHTML = html; return template.content.firstElementChild as HTMLElement; }; From d0d739e61ff3cd1c9eba6663792b364b823f4e06 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Mon, 18 Sep 2023 06:44:48 +0900 Subject: [PATCH 55/70] fix: add back butterchurn --- config/defaults.ts | 7 ++- package-lock.json | 63 +++++++++++++++++++ package.json | 2 + plugins/visualizer/butterchurn.d.ts | 53 ++++++++++++++++ plugins/visualizer/front.ts | 8 ++- plugins/visualizer/visualizers/butterchurn.ts | 63 +++++++++++++++++++ 6 files changed, 194 insertions(+), 2 deletions(-) create mode 100644 plugins/visualizer/butterchurn.d.ts create mode 100644 plugins/visualizer/visualizers/butterchurn.ts diff --git a/config/defaults.ts b/config/defaults.ts index 8aeb13cb..1378826e 100644 --- a/config/defaults.ts +++ b/config/defaults.ts @@ -191,8 +191,13 @@ const defaultConfig = { }, 'visualizer': { enabled: false, - type: 'vudio', + type: 'butterchurn', // Config per visualizer + butterchurn: { + preset: 'martin [shadow harlequins shape code] - fata morgana', + renderingFrequencyInMs: 500, + blendTimeInSeconds: 2.7, + }, vudio: { effect: 'lighting', accuracy: 128, diff --git a/package-lock.json b/package-lock.json index 932fb2dc..c6996fd7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,8 @@ "@foobar404/wave": "2.0.4", "@xhayper/discord-rpc": "1.0.22", "async-mutex": "0.4.0", + "butterchurn": "2.6.7", + "butterchurn-presets": "2.4.7", "conf": "10.2.0", "custom-electron-prompt": "1.5.7", "custom-electron-titlebar": "4.1.6", @@ -250,6 +252,22 @@ "node": ">=4" } }, + "node_modules/@babel/runtime": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz", + "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime/node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, "node_modules/@cliqz/adblocker": { "version": "1.26.7--canary.50688cf.0", "resolved": "https://registry.npmjs.org/@cliqz/adblocker/-/adblocker-1.26.7--canary.50688cf.0.tgz", @@ -2315,6 +2333,20 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-runtime/node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2560,6 +2592,25 @@ "node": ">=10.16.0" } }, + "node_modules/butterchurn": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/butterchurn/-/butterchurn-2.6.7.tgz", + "integrity": "sha512-BJiRA8L0L2+84uoG2SSfkp0kclBuN+vQKf217pK7pMlwEO2ZEg3MtO2/o+l8Qpr8Nbejg8tmL1ZHD1jmhiaaqg==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "ecma-proposal-math-extensions": "0.0.2" + } + }, + "node_modules/butterchurn-presets": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/butterchurn-presets/-/butterchurn-presets-2.4.7.tgz", + "integrity": "sha512-4MdM8ripz/VfH1BCldrIKdAc/1ryJFBDvqlyow6Ivo1frwj0H3duzvSMFC7/wIjAjxb1QpwVHVqGqS9uAFKhpg==", + "dependencies": { + "babel-runtime": "^6.26.0", + "ecma-proposal-math-extensions": "0.0.2", + "lodash": "^4.17.4" + } + }, "node_modules/cacache": { "version": "17.1.4", "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", @@ -3063,6 +3114,13 @@ "node": ">=10" } }, + "node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": true + }, "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -3626,6 +3684,11 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, + "node_modules/ecma-proposal-math-extensions": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/ecma-proposal-math-extensions/-/ecma-proposal-math-extensions-0.0.2.tgz", + "integrity": "sha512-80BnDp2Fn7RxXlEr5HHZblniY4aQ97MOAicdWWpSo0vkQiISSE9wLR4SqxKsu4gCtXFBIPPzy8JMhay4NWRg/Q==" + }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", diff --git a/package.json b/package.json index e6b21e70..c14f1316 100644 --- a/package.json +++ b/package.json @@ -138,6 +138,8 @@ "@foobar404/wave": "2.0.4", "@xhayper/discord-rpc": "1.0.22", "async-mutex": "0.4.0", + "butterchurn": "2.6.7", + "butterchurn-presets": "2.4.7", "conf": "10.2.0", "custom-electron-prompt": "1.5.7", "custom-electron-titlebar": "4.1.6", diff --git a/plugins/visualizer/butterchurn.d.ts b/plugins/visualizer/butterchurn.d.ts new file mode 100644 index 00000000..bd8df9e5 --- /dev/null +++ b/plugins/visualizer/butterchurn.d.ts @@ -0,0 +1,53 @@ +declare module 'butterchurn' { + interface VisualizerOptions { + width?: number; + height?: number; + meshWidth?: number; + meshHeight?: number; + pixelRatio?: number; + textureRatio?: number; + outputFXAA?: boolean; + } + + class Visualizer { + constructor(audioContext: AudioContext, canvas: HTMLCanvasElement, opts: ButterchurnOptions); + loseGLContext(): void; + connectAudio(audioNode: AudioNode): void; + disconnectAudio(audioNode: AudioNode): void; + static overrideDefaultVars(baseValsDefaults: unknown, baseVals: unknown): unknown; + createQVars(): Record; + createTVars(): Record; + createPerFramePool(baseVals: unknown): Record; + createPerPixelPool(baseVals: unknown): Record; + createCustomShapePerFramePool(baseVals: unknown): Record; + createCustomWavePerFramePool(baseVals: unknown): Record; + static makeShapeResetPool(pool: Record, variables: string[], idx: number): Record; + static base64ToArrayBuffer(base64: string): ArrayBuffer; + loadPreset(presetMap: unknown, blendTime?: number): Promise; + async loadWASMPreset(preset: unknown, blendTime: number): Promise; + loadJSPreset(preset: unknown, blendTime: number): void; + loadExtraImages(imageData: unknown): void; + setRendererSize(width: number, height: number, opts?: VisualizerOptions): void; + setInternalMeshSize(width: number, height: number): void; + setOutputAA(useAA: boolean): void; + setCanvas(canvas: HTMLCanvasElement): void; + render(opts?: VisualizerOptions): unknown; + launchSongTitleAnim(text: string): void; + toDataURL(): string; + warpBufferToDataURL(): string; + } + + interface ButterchurnOptions { + width?: number; + height?: number; + onlyUseWASM?: boolean; + } + + export default class Butterchurn { + static createVisualizer(audioContext: AudioContext, canvas: HTMLCanvasElement, options?: ButterchurnOptions): Visualizer; + } +} + +declare module 'butterchurn-presets' { + export function getPresets(): Record; +} diff --git a/plugins/visualizer/front.ts b/plugins/visualizer/front.ts index 9de40808..9274a3cd 100644 --- a/plugins/visualizer/front.ts +++ b/plugins/visualizer/front.ts @@ -2,6 +2,7 @@ import { Visualizer } from './visualizers/visualizer'; import vudio from './visualizers/vudio'; import wave from './visualizers/wave'; +import butterchurn from './visualizers/butterchurn'; import defaultConfig from '../../config/defaults'; @@ -15,7 +16,12 @@ export default (options: ConfigType<'visualizer'>) => { // eslint-disable-next-line @typescript-eslint/no-explicit-any let visualizerType: { new(...args: any[]): Visualizer } = vudio; - if (optionsWithDefaults.type === 'wave') visualizerType = wave; + + if (optionsWithDefaults.type === 'wave') { + visualizerType = wave; + } else if (optionsWithDefaults.type === 'butterchurn') { + visualizerType = butterchurn; + } document.addEventListener( 'audioCanPlay', diff --git a/plugins/visualizer/visualizers/butterchurn.ts b/plugins/visualizer/visualizers/butterchurn.ts new file mode 100644 index 00000000..de9b8058 --- /dev/null +++ b/plugins/visualizer/visualizers/butterchurn.ts @@ -0,0 +1,63 @@ +import Butterchurn from 'butterchurn'; +import ButterchurnPresets from 'butterchurn-presets'; + +import { Visualizer } from './visualizer'; + +import { ConfigType } from '../../../config/dynamic'; + +const presets = ButterchurnPresets.getPresets(); + +class ButterchurnVisualizer extends Visualizer { + visualizer: ReturnType; + private readonly renderingFrequencyInMs: number; + + constructor( + audioContext: AudioContext, + audioSource: MediaElementAudioSourceNode, + visualizerContainer: HTMLElement, + canvas: HTMLCanvasElement, + audioNode: GainNode, + stream: MediaStream, + options: ConfigType<'visualizer'>, + ) { + super( + audioContext, + audioSource, + visualizerContainer, + canvas, + audioNode, + stream, + options, + ); + + this.visualizer = Butterchurn.createVisualizer( + audioContext, + canvas, + { + width: canvas.width, + height: canvas.height, + } + ); + + const preset = presets[options.butterchurn.preset]; + this.visualizer.loadPreset(preset, options.butterchurn.blendTimeInSeconds); + + this.visualizer.connectAudio(audioNode); + + this.renderingFrequencyInMs = options.butterchurn.renderingFrequencyInMs; + } + + resize(width: number, height: number) { + this.visualizer.setRendererSize(width, height); + } + + render() { + const renderVisualizer = () => { + requestAnimationFrame(renderVisualizer); + this.visualizer.render(); + }; + setTimeout(renderVisualizer, this.renderingFrequencyInMs); + } +} + +export default ButterchurnVisualizer; From 3276e318d8efb159078c4a62385290c10979121f Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Tue, 19 Sep 2023 13:15:57 +0900 Subject: [PATCH 56/70] chore(deps): bump deps --- package-lock.json | 188 +++++++++++++++++++++++----------------------- package.json | 4 +- 2 files changed, 96 insertions(+), 96 deletions(-) diff --git a/package-lock.json b/package-lock.json index c6996fd7..42ce1688 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { - "@cliqz/adblocker-electron": "1.26.7--canary.50688cf.0", + "@cliqz/adblocker-electron": "1.26.7", "@ffmpeg.wasm/core-mt": "0.12.0", "@ffmpeg.wasm/main": "0.12.0", "@foobar404/wave": "2.0.4", @@ -47,7 +47,7 @@ "@types/howler": "2.2.9", "@types/html-to-text": "9.0.2", "@types/youtube-player": "5.5.7", - "@typescript-eslint/eslint-plugin": "6.7.0", + "@typescript-eslint/eslint-plugin": "6.7.2", "auto-changelog": "2.4.0", "copyfiles": "2.4.1", "del-cli": "5.1.0", @@ -269,56 +269,56 @@ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/@cliqz/adblocker": { - "version": "1.26.7--canary.50688cf.0", - "resolved": "https://registry.npmjs.org/@cliqz/adblocker/-/adblocker-1.26.7--canary.50688cf.0.tgz", - "integrity": "sha512-OTOqCU9HN7RR+icQbF3NwQzg1Yylz4pFsBPIx85a8z6Y+YrvChM1OOowdIWMD1MgEwfH+FgG//wYcF405myQng==", + "version": "1.26.7", + "resolved": "https://registry.npmjs.org/@cliqz/adblocker/-/adblocker-1.26.7.tgz", + "integrity": "sha512-UGjsDoAcmSoG2uGrpZVTWOxAxQJ2Ws9fDxmYrzR0yS/vtxd0t+Q8G8vTLKWkdU7BN53xTTCZMjgCALwdqZhycw==", "dependencies": { - "@cliqz/adblocker-content": "1.26.7--canary.50688cf.0", - "@cliqz/adblocker-extended-selectors": "1.26.7--canary.50688cf.0", - "@remusao/guess-url-type": "^1.1.2", - "@remusao/small": "^1.1.2", - "@remusao/smaz": "^1.7.1", + "@cliqz/adblocker-content": "^1.26.7", + "@cliqz/adblocker-extended-selectors": "^1.26.7", + "@remusao/guess-url-type": "^1.2.1", + "@remusao/small": "^1.2.1", + "@remusao/smaz": "^1.9.1", "@types/chrome": "^0.0.246", - "@types/firefox-webext-browser": "^111.0.1", - "tldts-experimental": "^6.0.12" + "@types/firefox-webext-browser": "^111.0.2", + "tldts-experimental": "^6.0.14" } }, "node_modules/@cliqz/adblocker-content": { - "version": "1.26.7--canary.50688cf.0", - "resolved": "https://registry.npmjs.org/@cliqz/adblocker-content/-/adblocker-content-1.26.7--canary.50688cf.0.tgz", - "integrity": "sha512-pDX4woRHzXiF8qlWU98V2W3W/dpwq1lr+6rnIEe91XOZs4ktQUP/A2Pa9t3qnO98ebgF6JZhaBTz+rgnG2Yvug==", + "version": "1.26.7", + "resolved": "https://registry.npmjs.org/@cliqz/adblocker-content/-/adblocker-content-1.26.7.tgz", + "integrity": "sha512-9nCII7NcidGb16Tf49HV6QFbdDE6ZSTqhLS3vZFImunDRSOHfyCimHOsYEAUURpDi3mnDuK2Kq1yt1m+U4KyKw==", "dependencies": { - "@cliqz/adblocker-extended-selectors": "1.26.7--canary.50688cf.0" + "@cliqz/adblocker-extended-selectors": "^1.26.7" } }, "node_modules/@cliqz/adblocker-electron": { - "version": "1.26.7--canary.50688cf.0", - "resolved": "https://registry.npmjs.org/@cliqz/adblocker-electron/-/adblocker-electron-1.26.7--canary.50688cf.0.tgz", - "integrity": "sha512-9W/vd99pdchv3WsmkxxU0M/PwYm1sTpgw4jIRw+drWHTbX0eYV6lWPnHAeMaAz5/19KOKBTdUIVLZS4mNSRCqw==", + "version": "1.26.7", + "resolved": "https://registry.npmjs.org/@cliqz/adblocker-electron/-/adblocker-electron-1.26.7.tgz", + "integrity": "sha512-L11NgAGwFI4VnFRq6OrHnvzwVP2r6wyr5uNzj/L+bIAkUjGVqHgcJw4bzF6OdJkeye2trwol2gqONkJKMFlXPA==", "dependencies": { - "@cliqz/adblocker": "1.26.7--canary.50688cf.0", - "@cliqz/adblocker-electron-preload": "1.26.7--canary.50688cf.0", - "tldts-experimental": "^6.0.12" + "@cliqz/adblocker": "^1.26.7", + "@cliqz/adblocker-electron-preload": "^1.26.7", + "tldts-experimental": "^6.0.14" }, "peerDependencies": { "electron": ">11" } }, "node_modules/@cliqz/adblocker-electron-preload": { - "version": "1.26.7--canary.50688cf.0", - "resolved": "https://registry.npmjs.org/@cliqz/adblocker-electron-preload/-/adblocker-electron-preload-1.26.7--canary.50688cf.0.tgz", - "integrity": "sha512-ECSJNTNmfZAmYaZ0FaFZvcCFGFMTFjyn3rW450XYdsjD6tnhhPef4N62Je74xbm0I2GK3TPvID4KzH9F0CjOCQ==", + "version": "1.26.7", + "resolved": "https://registry.npmjs.org/@cliqz/adblocker-electron-preload/-/adblocker-electron-preload-1.26.7.tgz", + "integrity": "sha512-/A9HmfZDxo+4wgQuj80YwrTSzm2tb99K7uJ0ymN4/QUKwrSeNIjEeXztbXakS2QqZE5gDWV0opCkGDpV0FuCcg==", "dependencies": { - "@cliqz/adblocker-content": "1.26.7--canary.50688cf.0" + "@cliqz/adblocker-content": "^1.26.7" }, "peerDependencies": { "electron": ">11" } }, "node_modules/@cliqz/adblocker-extended-selectors": { - "version": "1.26.7--canary.50688cf.0", - "resolved": "https://registry.npmjs.org/@cliqz/adblocker-extended-selectors/-/adblocker-extended-selectors-1.26.7--canary.50688cf.0.tgz", - "integrity": "sha512-g++omr1SvhgqRJtUuxUKp8CYPco9iz7Ep3R/RaHoY19c3Q2hwok9WHmiKcg+MwaCKuPE5gXcyUfY21y+VUilsQ==" + "version": "1.26.7", + "resolved": "https://registry.npmjs.org/@cliqz/adblocker-extended-selectors/-/adblocker-extended-selectors-1.26.7.tgz", + "integrity": "sha512-J6IYdrWHvTy2U/iikMBB/nz0IbYHYomUgmwpOgDbzaesacrNShzr1evU06ncx7QFexKkUqYMqqt/JjUFnYn5qA==" }, "node_modules/@develar/schema-utils": { "version": "2.6.5", @@ -1225,9 +1225,9 @@ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" }, "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", "dev": true }, "node_modules/@types/json5": { @@ -1287,9 +1287,9 @@ } }, "node_modules/@types/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==", "dev": true }, "node_modules/@types/verror": { @@ -1315,16 +1315,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.0.tgz", - "integrity": "sha512-gUqtknHm0TDs1LhY12K2NA3Rmlmp88jK9Tx8vGZMfHeNMLE3GH2e9TRub+y+SOjuYgtOmok+wt1AyDPZqxbNag==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz", + "integrity": "sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.7.0", - "@typescript-eslint/type-utils": "6.7.0", - "@typescript-eslint/utils": "6.7.0", - "@typescript-eslint/visitor-keys": "6.7.0", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/type-utils": "6.7.2", + "@typescript-eslint/utils": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1350,13 +1350,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.0.tgz", - "integrity": "sha512-lAT1Uau20lQyjoLUQ5FUMSX/dS07qux9rYd5FGzKz/Kf8W8ccuvMyldb8hadHdK/qOI7aikvQWqulnEq2nCEYA==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz", + "integrity": "sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.0", - "@typescript-eslint/visitor-keys": "6.7.0" + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1367,9 +1367,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.0.tgz", - "integrity": "sha512-ihPfvOp7pOcN/ysoj0RpBPOx3HQTJTrIN8UZK+WFd3/iDeFHHqeyYxa4hQk4rMhsz9H9mXpR61IzwlBVGXtl9Q==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", + "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1380,12 +1380,12 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.0.tgz", - "integrity": "sha512-/C1RVgKFDmGMcVGeD8HjKv2bd72oI1KxQDeY8uc66gw9R0OK0eMq48cA+jv9/2Ag6cdrsUGySm1yzYmfz0hxwQ==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", + "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.0", + "@typescript-eslint/types": "6.7.2", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1444,13 +1444,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.0.tgz", - "integrity": "sha512-f/QabJgDAlpSz3qduCyQT0Fw7hHpmhOzY/Rv6zO3yO+HVIdPfIWhrQoAyG+uZVtWAIS85zAyzgAFfyEr+MgBpg==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz", + "integrity": "sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.7.0", - "@typescript-eslint/utils": "6.7.0", + "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/utils": "6.7.2", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1471,9 +1471,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.0.tgz", - "integrity": "sha512-ihPfvOp7pOcN/ysoj0RpBPOx3HQTJTrIN8UZK+WFd3/iDeFHHqeyYxa4hQk4rMhsz9H9mXpR61IzwlBVGXtl9Q==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", + "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1484,13 +1484,13 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.0.tgz", - "integrity": "sha512-dPvkXj3n6e9yd/0LfojNU8VMUGHWiLuBZvbM6V6QYD+2qxqInE7J+J/ieY2iGwR9ivf/R/haWGkIj04WVUeiSQ==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz", + "integrity": "sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.0", - "@typescript-eslint/visitor-keys": "6.7.0", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1511,12 +1511,12 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.0.tgz", - "integrity": "sha512-/C1RVgKFDmGMcVGeD8HjKv2bd72oI1KxQDeY8uc66gw9R0OK0eMq48cA+jv9/2Ag6cdrsUGySm1yzYmfz0hxwQ==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", + "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.0", + "@typescript-eslint/types": "6.7.2", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1630,17 +1630,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.0.tgz", - "integrity": "sha512-MfCq3cM0vh2slSikQYqK2Gq52gvOhe57vD2RM3V4gQRZYX4rDPnKLu5p6cm89+LJiGlwEXU8hkYxhqqEC/V3qA==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.2.tgz", + "integrity": "sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.7.0", - "@typescript-eslint/types": "6.7.0", - "@typescript-eslint/typescript-estree": "6.7.0", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.2", "semver": "^7.5.4" }, "engines": { @@ -1655,13 +1655,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.0.tgz", - "integrity": "sha512-lAT1Uau20lQyjoLUQ5FUMSX/dS07qux9rYd5FGzKz/Kf8W8ccuvMyldb8hadHdK/qOI7aikvQWqulnEq2nCEYA==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz", + "integrity": "sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.0", - "@typescript-eslint/visitor-keys": "6.7.0" + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1672,9 +1672,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.0.tgz", - "integrity": "sha512-ihPfvOp7pOcN/ysoj0RpBPOx3HQTJTrIN8UZK+WFd3/iDeFHHqeyYxa4hQk4rMhsz9H9mXpR61IzwlBVGXtl9Q==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", + "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1685,13 +1685,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.0.tgz", - "integrity": "sha512-dPvkXj3n6e9yd/0LfojNU8VMUGHWiLuBZvbM6V6QYD+2qxqInE7J+J/ieY2iGwR9ivf/R/haWGkIj04WVUeiSQ==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz", + "integrity": "sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.0", - "@typescript-eslint/visitor-keys": "6.7.0", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1712,12 +1712,12 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.0.tgz", - "integrity": "sha512-/C1RVgKFDmGMcVGeD8HjKv2bd72oI1KxQDeY8uc66gw9R0OK0eMq48cA+jv9/2Ag6cdrsUGySm1yzYmfz0hxwQ==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", + "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.0", + "@typescript-eslint/types": "6.7.2", "eslint-visitor-keys": "^3.4.1" }, "engines": { diff --git a/package.json b/package.json index c14f1316..4508a4d0 100644 --- a/package.json +++ b/package.json @@ -132,7 +132,7 @@ "node": ">=16.0.0" }, "dependencies": { - "@cliqz/adblocker-electron": "1.26.7--canary.50688cf.0", + "@cliqz/adblocker-electron": "1.26.7", "@ffmpeg.wasm/core-mt": "0.12.0", "@ffmpeg.wasm/main": "0.12.0", "@foobar404/wave": "2.0.4", @@ -175,7 +175,7 @@ "@types/howler": "2.2.9", "@types/html-to-text": "9.0.2", "@types/youtube-player": "5.5.7", - "@typescript-eslint/eslint-plugin": "6.7.0", + "@typescript-eslint/eslint-plugin": "6.7.2", "auto-changelog": "2.4.0", "copyfiles": "2.4.1", "del-cli": "5.1.0", From c8b149281b34ae33c28de3602740c3cbbebcc3f4 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Tue, 19 Sep 2023 22:32:37 +0900 Subject: [PATCH 57/70] fix: update GitHub Actions script --- .github/workflows/build.yml | 92 ++++++------------------------------- 1 file changed, 15 insertions(+), 77 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index dcd9cd72..5378a66e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,7 +6,7 @@ on: pull_request: env: - NODE_VERSION: "16.x" + NODE_VERSION: "20.x" jobs: build: @@ -18,54 +18,23 @@ jobs: os: [ macos-latest, ubuntu-latest, windows-latest ] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup NodeJS uses: actions/setup-node@v3 with: node-version: ${{ env.NODE_VERSION }} - - - name: Expose yarn config as "$GITHUB_OUTPUT" - id: yarn-config - shell: bash - run: | - echo "CACHE_FOLDER=$(yarn config get cacheFolder)" >> $GITHUB_OUTPUT - - # Yarn rotates the downloaded cache archives, @see https://github.com/actions/setup-node/issues/325 - # Yarn cache is also reusable between arch and os. - - name: Restore yarn cache - uses: actions/cache@v3 - id: yarn-download-cache - with: - path: ${{ steps.yarn-config.outputs.CACHE_FOLDER }} - key: yarn-download-cache-${{ hashFiles('yarn.lock') }} - restore-keys: | - yarn-download-cache- - - # Invalidated on yarn.lock changes - - name: Restore yarn install state - id: yarn-install-state-cache - uses: actions/cache@v3 - with: - path: .yarn/ci-cache/ - key: ${{ runner.os }}-yarn-install-state-cache-${{ hashFiles('yarn.lock', '.yarnrc.yml') }} + cache: 'npm' - name: Install dependencies - shell: bash - run: | - yarn install --immutable --inline-builds - env: - # CI optimizations. Overrides yarnrc.yml options (or their defaults) in the CI action. - YARN_ENABLE_GLOBAL_CACHE: "false" # Use local cache folder to keep downloaded archives - YARN_NM_MODE: "hardlinks-local" # Hardlinks-(local|global) reduces io / node_modules size - YARN_INSTALL_STATE_PATH: .yarn/ci-cache/install-state.gz # Very small speedup when lock does not change + run: npm ci - name: Test uses: GabrielBB/xvfb-action@v1 env: PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1 with: - run: yarn test + run: npm run test # Build and release if it's the main repository - name: Build and release on Mac @@ -73,37 +42,37 @@ jobs: env: GH_TOKEN: ${{ secrets.GH_TOKEN }} run: | - yarn run release:mac + npm run release:mac - name: Build and release on Linux if: startsWith(matrix.os, 'ubuntu') && github.repository == 'th-ch/youtube-music' env: GH_TOKEN: ${{ secrets.GH_TOKEN }} run: | - yarn run release:linux + npm run release:linux - name: Build and release on Windows if: startsWith(matrix.os, 'windows') && github.repository == 'th-ch/youtube-music' env: GH_TOKEN: ${{ secrets.GH_TOKEN }} run: | - yarn run release:win + npm run release:win # Only build without release if it is a fork - name: Build on Mac if: startsWith(matrix.os, 'macOS') && github.repository != 'th-ch/youtube-music' run: | - yarn run build:mac + npm run build:mac - name: Build on Linux if: startsWith(matrix.os, 'ubuntu') && github.repository != 'th-ch/youtube-music' run: | - yarn run build:linux + npm run build:linux - name: Build on Windows if: startsWith(matrix.os, 'windows') && github.repository != 'th-ch/youtube-music' run: | - yarn run build:win + npm run build:win release: runs-on: ubuntu-latest @@ -111,7 +80,7 @@ jobs: if: github.repository == 'th-ch/youtube-music' && github.ref == 'refs/heads/master' needs: build steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 @@ -119,41 +88,10 @@ jobs: uses: actions/setup-node@v3 with: node-version: ${{ env.NODE_VERSION }} - - - name: Expose yarn config as "$GITHUB_OUTPUT" - id: yarn-config - shell: bash - run: | - echo "CACHE_FOLDER=$(yarn config get cacheFolder)" >> $GITHUB_OUTPUT - - # Yarn rotates the downloaded cache archives, @see https://github.com/actions/setup-node/issues/325 - # Yarn cache is also reusable between arch and os. - - name: Restore yarn cache - uses: actions/cache@v3 - id: yarn-download-cache - with: - path: ${{ steps.yarn-config.outputs.CACHE_FOLDER }} - key: yarn-download-cache-${{ hashFiles('yarn.lock') }} - restore-keys: | - yarn-download-cache- - - # Invalidated on yarn.lock changes - - name: Restore yarn install state - id: yarn-install-state-cache - uses: actions/cache@v3 - with: - path: .yarn/ci-cache/ - key: ${{ runner.os }}-yarn-install-state-cache-${{ hashFiles('yarn.lock', '.yarnrc.yml') }} + cache: 'npm' - name: Install dependencies - shell: bash - run: | - yarn install --immutable --inline-builds - env: - # CI optimizations. Overrides yarnrc.yml options (or their defaults) in the CI action. - YARN_ENABLE_GLOBAL_CACHE: "false" # Use local cache folder to keep downloaded archives - YARN_NM_MODE: "hardlinks-local" # Hardlinks-(local|global) reduces io / node_modules size - YARN_INSTALL_STATE_PATH: .yarn/ci-cache/install-state.gz # Very small speedup when lock does not change + run: npm ci - name: Get version run: | @@ -194,7 +132,7 @@ jobs: - name: Update changelog if: ${{ env.VERSION_HASH == '' }} run: | - yarn changelog + npm run changelog - name: Commit changelog if: ${{ env.VERSION_HASH == '' }} From c6bba511665e0197e78019e867d26184fffc50cd Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Wed, 20 Sep 2023 13:32:06 +0900 Subject: [PATCH 58/70] chore(deps): bump deps --- package-lock.json | 16 ++++++++-------- package.json | 6 +++--- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 42ce1688..76daaa69 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "electron-unhandled": "4.0.1", "electron-updater": "6.1.4", "filenamify": "4.3.0", - "howler": "2.2.3", + "howler": "2.2.4", "html-to-text": "9.0.5", "keyboardevent-from-electron-accelerator": "2.0.0", "keyboardevents-areequal": "0.2.2", @@ -51,7 +51,7 @@ "auto-changelog": "2.4.0", "copyfiles": "2.4.1", "del-cli": "5.1.0", - "electron": "27.0.0-beta.3", + "electron": "27.0.0-beta.4", "electron-builder": "24.6.4", "electron-devtools-installer": "3.2.0", "eslint": "8.49.0", @@ -3705,9 +3705,9 @@ } }, "node_modules/electron": { - "version": "27.0.0-beta.3", - "resolved": "https://registry.npmjs.org/electron/-/electron-27.0.0-beta.3.tgz", - "integrity": "sha512-nOj4bXseVhAvcDRb2ocN9AeMfbo6Z4XhYwYPytlHX637yQJC4MKhUSXZEHjTZTzBh8/KmPG8P+wplF0wBMzouw==", + "version": "27.0.0-beta.4", + "resolved": "https://registry.npmjs.org/electron/-/electron-27.0.0-beta.4.tgz", + "integrity": "sha512-txg3uVWFx9lUnVn2tDd2rSEop6Z9AIDpoATqJO1FZBqnBSsn++k3cvFsDX05FQD9r07Nxr6UuObOPxKUSr8o1Q==", "hasInstallScript": true, "dependencies": { "@electron/get": "^2.0.0", @@ -5346,9 +5346,9 @@ } }, "node_modules/howler": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/howler/-/howler-2.2.3.tgz", - "integrity": "sha512-QM0FFkw0LRX1PR8pNzJVAY25JhIWvbKMBFM4gqk+QdV+kPXOhleWGCB6AiAF/goGjIHK2e/nIElplvjQwhr0jg==" + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/howler/-/howler-2.2.4.tgz", + "integrity": "sha512-iARIBPgcQrwtEr+tALF+rapJ8qSc+Set2GJQl7xT1MQzWaVkFebdJhR3alVlSiUf5U7nAANKuj3aWpwerocD5w==" }, "node_modules/html-to-text": { "version": "9.0.5", diff --git a/package.json b/package.json index 4508a4d0..e2c32364 100644 --- a/package.json +++ b/package.json @@ -151,7 +151,7 @@ "electron-unhandled": "4.0.1", "electron-updater": "6.1.4", "filenamify": "4.3.0", - "howler": "2.2.3", + "howler": "2.2.4", "html-to-text": "9.0.5", "keyboardevent-from-electron-accelerator": "2.0.0", "keyboardevents-areequal": "0.2.2", @@ -166,7 +166,7 @@ "xml2js": "0.6.2", "node-fetch": "2.7.0", "@electron/universal": "1.4.2", - "electron": "27.0.0-beta.3" + "electron": "27.0.0-beta.4" }, "devDependencies": { "@playwright/test": "1.38.0", @@ -179,7 +179,7 @@ "auto-changelog": "2.4.0", "copyfiles": "2.4.1", "del-cli": "5.1.0", - "electron": "27.0.0-beta.3", + "electron": "27.0.0-beta.4", "electron-builder": "24.6.4", "electron-devtools-installer": "3.2.0", "eslint": "8.49.0", From 7418a1f4b2c1a6ba94f7e1e39d4fd4af2971e5ba Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Thu, 21 Sep 2023 03:38:53 +0900 Subject: [PATCH 59/70] feat: use TS private keyword instead of JS private identifier --- config/dynamic.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/config/dynamic.ts b/config/dynamic.ts index 6e93dd45..c05e49c4 100644 --- a/config/dynamic.ts +++ b/config/dynamic.ts @@ -97,7 +97,7 @@ export class PluginConfig { this.config = { ...pluginDefaultConfig, ...pluginConfig }; if (this.enableFront) { - this.#setupFront(); + this.setupFront(); } activePlugins[name] = this; @@ -109,8 +109,8 @@ export class PluginConfig { set(key: keyof ConfigType, value: ValueOf>) { this.config[key] = value; - this.#onChange(key); - this.#save(); + this.onChange(key); + this.save(); } getAll(): ConfigType { @@ -126,7 +126,7 @@ export class PluginConfig { for (const [key, value] of Object.entries(options) as Entries) { if (this.config[key] !== value) { if (value !== undefined) this.config[key] = value; - this.#onChange(key, false); + this.onChange(key, false); changed = true; } } @@ -137,7 +137,7 @@ export class PluginConfig { } } - this.#save(); + this.save(); } getDefaultConfig() { @@ -152,7 +152,7 @@ export class PluginConfig { setAndMaybeRestart(key: keyof ConfigType, value: ValueOf>) { this.config[key] = value; setMenuOptions(this.name, this.config); - this.#onChange(key); + this.onChange(key); } subscribe(valueName: keyof ConfigType, fn: (config: ConfigType) => void) { @@ -164,11 +164,11 @@ export class PluginConfig { } /** Called only from back */ - #save() { + private save() { setOptions(this.name, this.config); } - #onChange(valueName: keyof ConfigType, single: boolean = true) { + private onChange(valueName: keyof ConfigType, single: boolean = true) { this.subscribers[valueName]?.(this.config[valueName] as ConfigType); if (single) { for (const fn of this.allSubscribers) { @@ -177,7 +177,7 @@ export class PluginConfig { } } - #setupFront() { + private setupFront() { const ignoredMethods = ['subscribe', 'subscribeAll']; if (process.type === 'renderer') { From 4651d6d241d9983c82387454c05731c502db96ed Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Thu, 21 Sep 2023 03:52:33 +0900 Subject: [PATCH 60/70] feat(adblocker): change default blocker to the blocklist (ghostery/adblocker#3420) --- config/defaults.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/defaults.ts b/config/defaults.ts index 1378826e..e32f9857 100644 --- a/config/defaults.ts +++ b/config/defaults.ts @@ -75,7 +75,7 @@ const defaultConfig = { 'adblocker': { enabled: true, cache: true, - blocker: 'In player', + blocker: 'With blocklists', additionalBlockLists: [], // Additional list of filters, e.g "https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters.txt" disableDefaultLists: [], }, From 3e77064cd31416a303a8ba8ed4d64b17c6b5a083 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Sat, 23 Sep 2023 21:49:34 +0900 Subject: [PATCH 61/70] chore(deps): bump deps --- package-lock.json | 50 +++++++++++++++++++++++------------------------ package.json | 10 +++++----- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index 76daaa69..3faed65d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,7 +41,7 @@ "ytpl": "2.3.0" }, "devDependencies": { - "@playwright/test": "1.38.0", + "@playwright/test": "1.38.1", "@total-typescript/ts-reset": "0.5.1", "@types/electron-localshortcut": "3.1.0", "@types/howler": "2.2.9", @@ -51,14 +51,14 @@ "auto-changelog": "2.4.0", "copyfiles": "2.4.1", "del-cli": "5.1.0", - "electron": "27.0.0-beta.4", + "electron": "27.0.0-beta.5", "electron-builder": "24.6.4", "electron-devtools-installer": "3.2.0", - "eslint": "8.49.0", + "eslint": "8.50.0", "eslint-plugin-import": "2.28.1", "eslint-plugin-prettier": "5.0.0", "node-gyp": "9.4.0", - "playwright": "1.38.0", + "playwright": "1.38.1", "typescript": "5.2.2" }, "engines": { @@ -678,9 +678,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", - "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", + "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1037,12 +1037,12 @@ } }, "node_modules/@playwright/test": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.38.0.tgz", - "integrity": "sha512-xis/RXXsLxwThKnlIXouxmIvvT3zvQj1JE39GsNieMUrMpb3/GySHDh2j8itCG22qKVD4MYLBp7xB73cUW/UUw==", + "version": "1.38.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.38.1.tgz", + "integrity": "sha512-NqRp8XMwj3AK+zKLbZShl0r/9wKgzqI/527bkptKXomtuo+dOjU9NdMASQ8DNC9z9zLOMbG53T4eihYr3XR+BQ==", "dev": true, "dependencies": { - "playwright": "1.38.0" + "playwright": "1.38.1" }, "bin": { "playwright": "cli.js" @@ -3705,9 +3705,9 @@ } }, "node_modules/electron": { - "version": "27.0.0-beta.4", - "resolved": "https://registry.npmjs.org/electron/-/electron-27.0.0-beta.4.tgz", - "integrity": "sha512-txg3uVWFx9lUnVn2tDd2rSEop6Z9AIDpoATqJO1FZBqnBSsn++k3cvFsDX05FQD9r07Nxr6UuObOPxKUSr8o1Q==", + "version": "27.0.0-beta.5", + "resolved": "https://registry.npmjs.org/electron/-/electron-27.0.0-beta.5.tgz", + "integrity": "sha512-H6Od8ds2IdSaEZxyVYwd0YqAoJP5tqYEQ/tDltNEixmnD0uvq7w4mDiv3d3WxL0t9yeu7lUG2cp4fxdBJJ1sqg==", "hasInstallScript": true, "dependencies": { "@electron/get": "^2.0.0", @@ -4181,15 +4181,15 @@ } }, "node_modules/eslint": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", - "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", + "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.49.0", + "@eslint/js": "8.50.0", "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -7388,12 +7388,12 @@ } }, "node_modules/playwright": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.38.0.tgz", - "integrity": "sha512-fJGw+HO0YY+fU/F1N57DMO+TmXHTrmr905J05zwAQE9xkuwP/QLDk63rVhmyxh03dYnEhnRbsdbH9B0UVVRB3A==", + "version": "1.38.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.38.1.tgz", + "integrity": "sha512-oRMSJmZrOu1FP5iu3UrCx8JEFRIMxLDM0c/3o4bpzU5Tz97BypefWf7TuTNPWeCe279TPal5RtPPZ+9lW/Qkow==", "dev": true, "dependencies": { - "playwright-core": "1.38.0" + "playwright-core": "1.38.1" }, "bin": { "playwright": "cli.js" @@ -7406,9 +7406,9 @@ } }, "node_modules/playwright-core": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.38.0.tgz", - "integrity": "sha512-f8z1y8J9zvmHoEhKgspmCvOExF2XdcxMW8jNRuX4vkQFrzV4MlZ55iwb5QeyiFQgOFCUolXiRHgpjSEnqvO48g==", + "version": "1.38.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.38.1.tgz", + "integrity": "sha512-tQqNFUKa3OfMf4b2jQ7aGLB8o9bS3bOY0yMEtldtC2+spf8QXG9zvXLTXUeRsoNuxEYMgLYR+NXfAa1rjKRcrg==", "dev": true, "bin": { "playwright-core": "cli.js" diff --git a/package.json b/package.json index e2c32364..c6936761 100644 --- a/package.json +++ b/package.json @@ -166,10 +166,10 @@ "xml2js": "0.6.2", "node-fetch": "2.7.0", "@electron/universal": "1.4.2", - "electron": "27.0.0-beta.4" + "electron": "27.0.0-beta.5" }, "devDependencies": { - "@playwright/test": "1.38.0", + "@playwright/test": "1.38.1", "@total-typescript/ts-reset": "0.5.1", "@types/electron-localshortcut": "3.1.0", "@types/howler": "2.2.9", @@ -179,14 +179,14 @@ "auto-changelog": "2.4.0", "copyfiles": "2.4.1", "del-cli": "5.1.0", - "electron": "27.0.0-beta.4", + "electron": "27.0.0-beta.5", "electron-builder": "24.6.4", "electron-devtools-installer": "3.2.0", - "eslint": "8.49.0", + "eslint": "8.50.0", "eslint-plugin-import": "2.28.1", "eslint-plugin-prettier": "5.0.0", "node-gyp": "9.4.0", - "playwright": "1.38.0", + "playwright": "1.38.1", "typescript": "5.2.2" }, "auto-changelog": { From e7e3e8abe01980d0daf07e096761772dcaee5fcf Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Tue, 26 Sep 2023 02:47:50 +0900 Subject: [PATCH 62/70] chore(deps): bump deps, remove unused dependency (@types/youtube-player) --- package-lock.json | 141 ++++++++++++++++++++++------------------------ package.json | 5 +- 2 files changed, 69 insertions(+), 77 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3faed65d..bf00e226 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,11 +43,10 @@ "devDependencies": { "@playwright/test": "1.38.1", "@total-typescript/ts-reset": "0.5.1", - "@types/electron-localshortcut": "3.1.0", + "@types/electron-localshortcut": "3.1.1", "@types/howler": "2.2.9", "@types/html-to-text": "9.0.2", - "@types/youtube-player": "5.5.7", - "@typescript-eslint/eslint-plugin": "6.7.2", + "@typescript-eslint/eslint-plugin": "6.7.3", "auto-changelog": "2.4.0", "copyfiles": "2.4.1", "del-cli": "5.1.0", @@ -1167,9 +1166,9 @@ } }, "node_modules/@types/electron-localshortcut": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/electron-localshortcut/-/electron-localshortcut-3.1.0.tgz", - "integrity": "sha512-upKSXMxBPRdz5kmcXfdfn+hWH9PCAvwhyVozDXTIwwHQ1lUJcdSgGUfxOC1QBlnAPKPqcW/r4icWfMosKz8ibg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/electron-localshortcut/-/electron-localshortcut-3.1.1.tgz", + "integrity": "sha512-wKmSZF2j+20/1SVbhcnqi0k+cLEMFjz4PPgNmUFjRdr+KiDRhX7f9hZd1wY56UhPtp9TJm4KAUQncrXcGfpGqw==", "dev": true, "dependencies": { "electron": "*" @@ -1287,9 +1286,9 @@ } }, "node_modules/@types/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==", "dev": true }, "node_modules/@types/verror": { @@ -1308,23 +1307,17 @@ "@types/node": "*" } }, - "node_modules/@types/youtube-player": { - "version": "5.5.7", - "resolved": "https://registry.npmjs.org/@types/youtube-player/-/youtube-player-5.5.7.tgz", - "integrity": "sha512-W8F4eoTIvzXeNrT3JroQPimZLXnlJA8smYygHZUKFPVoYwgs/OhJkA1VBhL3iSs57OQkuINqHlY4SmMT5wtnJg==", - "dev": true - }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz", - "integrity": "sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.3.tgz", + "integrity": "sha512-vntq452UHNltxsaaN+L9WyuMch8bMd9CqJ3zhzTPXXidwbf5mqqKCVXEuvRZUqLJSTLeWE65lQwyXsRGnXkCTA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.7.2", - "@typescript-eslint/type-utils": "6.7.2", - "@typescript-eslint/utils": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", + "@typescript-eslint/scope-manager": "6.7.3", + "@typescript-eslint/type-utils": "6.7.3", + "@typescript-eslint/utils": "6.7.3", + "@typescript-eslint/visitor-keys": "6.7.3", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1350,13 +1343,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz", - "integrity": "sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.3.tgz", + "integrity": "sha512-wOlo0QnEou9cHO2TdkJmzF7DFGvAKEnB82PuPNHpT8ZKKaZu6Bm63ugOTn9fXNJtvuDPanBc78lGUGGytJoVzQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2" + "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/visitor-keys": "6.7.3" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1367,9 +1360,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", - "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.3.tgz", + "integrity": "sha512-4g+de6roB2NFcfkZb439tigpAMnvEIg3rIjWQ+EM7IBaYt/CdJt6em9BJ4h4UpdgaBWdmx2iWsafHTrqmgIPNw==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1380,12 +1373,12 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", - "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.3.tgz", + "integrity": "sha512-HEVXkU9IB+nk9o63CeICMHxFWbHWr3E1mpilIQBe9+7L/lH97rleFLVtYsfnWB+JVMaiFnEaxvknvmIzX+CqVg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/types": "6.7.3", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1444,13 +1437,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz", - "integrity": "sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.3.tgz", + "integrity": "sha512-Fc68K0aTDrKIBvLnKTZ5Pf3MXK495YErrbHb1R6aTpfK5OdSFj0rVN7ib6Tx6ePrZ2gsjLqr0s98NG7l96KSQw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.7.2", - "@typescript-eslint/utils": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.3", + "@typescript-eslint/utils": "6.7.3", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1471,9 +1464,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", - "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.3.tgz", + "integrity": "sha512-4g+de6roB2NFcfkZb439tigpAMnvEIg3rIjWQ+EM7IBaYt/CdJt6em9BJ4h4UpdgaBWdmx2iWsafHTrqmgIPNw==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1484,13 +1477,13 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz", - "integrity": "sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.3.tgz", + "integrity": "sha512-YLQ3tJoS4VxLFYHTw21oe1/vIZPRqAO91z6Uv0Ss2BKm/Ag7/RVQBcXTGcXhgJMdA4U+HrKuY5gWlJlvoaKZ5g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", + "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/visitor-keys": "6.7.3", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1511,12 +1504,12 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", - "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.3.tgz", + "integrity": "sha512-HEVXkU9IB+nk9o63CeICMHxFWbHWr3E1mpilIQBe9+7L/lH97rleFLVtYsfnWB+JVMaiFnEaxvknvmIzX+CqVg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/types": "6.7.3", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1630,17 +1623,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.2.tgz", - "integrity": "sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.3.tgz", + "integrity": "sha512-vzLkVder21GpWRrmSR9JxGZ5+ibIUSudXlW52qeKpzUEQhRSmyZiVDDj3crAth7+5tmN1ulvgKaCU2f/bPRCzg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.7.2", - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/scope-manager": "6.7.3", + "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/typescript-estree": "6.7.3", "semver": "^7.5.4" }, "engines": { @@ -1655,13 +1648,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz", - "integrity": "sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.3.tgz", + "integrity": "sha512-wOlo0QnEou9cHO2TdkJmzF7DFGvAKEnB82PuPNHpT8ZKKaZu6Bm63ugOTn9fXNJtvuDPanBc78lGUGGytJoVzQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2" + "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/visitor-keys": "6.7.3" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1672,9 +1665,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", - "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.3.tgz", + "integrity": "sha512-4g+de6roB2NFcfkZb439tigpAMnvEIg3rIjWQ+EM7IBaYt/CdJt6em9BJ4h4UpdgaBWdmx2iWsafHTrqmgIPNw==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1685,13 +1678,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz", - "integrity": "sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.3.tgz", + "integrity": "sha512-YLQ3tJoS4VxLFYHTw21oe1/vIZPRqAO91z6Uv0Ss2BKm/Ag7/RVQBcXTGcXhgJMdA4U+HrKuY5gWlJlvoaKZ5g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", + "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/visitor-keys": "6.7.3", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1712,12 +1705,12 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", - "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.3.tgz", + "integrity": "sha512-HEVXkU9IB+nk9o63CeICMHxFWbHWr3E1mpilIQBe9+7L/lH97rleFLVtYsfnWB+JVMaiFnEaxvknvmIzX+CqVg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/types": "6.7.3", "eslint-visitor-keys": "^3.4.1" }, "engines": { diff --git a/package.json b/package.json index c6936761..f76a4e50 100644 --- a/package.json +++ b/package.json @@ -171,11 +171,10 @@ "devDependencies": { "@playwright/test": "1.38.1", "@total-typescript/ts-reset": "0.5.1", - "@types/electron-localshortcut": "3.1.0", + "@types/electron-localshortcut": "3.1.1", "@types/howler": "2.2.9", "@types/html-to-text": "9.0.2", - "@types/youtube-player": "5.5.7", - "@typescript-eslint/eslint-plugin": "6.7.2", + "@typescript-eslint/eslint-plugin": "6.7.3", "auto-changelog": "2.4.0", "copyfiles": "2.4.1", "del-cli": "5.1.0", From 0935edd5168a7e94a29e44bd71eb7b494d540382 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Tue, 26 Sep 2023 12:09:46 +0900 Subject: [PATCH 63/70] chore(deps): bump electron version --- package-lock.json | 8 ++++---- package.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index bf00e226..4ad2a40c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -50,7 +50,7 @@ "auto-changelog": "2.4.0", "copyfiles": "2.4.1", "del-cli": "5.1.0", - "electron": "27.0.0-beta.5", + "electron": "27.0.0-beta.6", "electron-builder": "24.6.4", "electron-devtools-installer": "3.2.0", "eslint": "8.50.0", @@ -3698,9 +3698,9 @@ } }, "node_modules/electron": { - "version": "27.0.0-beta.5", - "resolved": "https://registry.npmjs.org/electron/-/electron-27.0.0-beta.5.tgz", - "integrity": "sha512-H6Od8ds2IdSaEZxyVYwd0YqAoJP5tqYEQ/tDltNEixmnD0uvq7w4mDiv3d3WxL0t9yeu7lUG2cp4fxdBJJ1sqg==", + "version": "27.0.0-beta.6", + "resolved": "https://registry.npmjs.org/electron/-/electron-27.0.0-beta.6.tgz", + "integrity": "sha512-ntv0mQkRPUQbbCQmZQukRnRKE2JeZ47bWLmyeu3Lvo8nzUVFpgGry+PzmG0RO1qWZmneFj1svZ1Ph5ydfhrX7g==", "hasInstallScript": true, "dependencies": { "@electron/get": "^2.0.0", diff --git a/package.json b/package.json index f76a4e50..7fec7236 100644 --- a/package.json +++ b/package.json @@ -166,7 +166,7 @@ "xml2js": "0.6.2", "node-fetch": "2.7.0", "@electron/universal": "1.4.2", - "electron": "27.0.0-beta.5" + "electron": "27.0.0-beta.6" }, "devDependencies": { "@playwright/test": "1.38.1", @@ -178,7 +178,7 @@ "auto-changelog": "2.4.0", "copyfiles": "2.4.1", "del-cli": "5.1.0", - "electron": "27.0.0-beta.5", + "electron": "27.0.0-beta.6", "electron-builder": "24.6.4", "electron-devtools-installer": "3.2.0", "eslint": "8.50.0", From 1ff69c933c188adfdf32071df714fa9edbaa92fe Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Wed, 27 Sep 2023 17:08:42 +0900 Subject: [PATCH 64/70] chore(deps): bump electron version --- package-lock.json | 8 ++++---- package.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4ad2a40c..97349acf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -50,7 +50,7 @@ "auto-changelog": "2.4.0", "copyfiles": "2.4.1", "del-cli": "5.1.0", - "electron": "27.0.0-beta.6", + "electron": "27.0.0-beta.7", "electron-builder": "24.6.4", "electron-devtools-installer": "3.2.0", "eslint": "8.50.0", @@ -3698,9 +3698,9 @@ } }, "node_modules/electron": { - "version": "27.0.0-beta.6", - "resolved": "https://registry.npmjs.org/electron/-/electron-27.0.0-beta.6.tgz", - "integrity": "sha512-ntv0mQkRPUQbbCQmZQukRnRKE2JeZ47bWLmyeu3Lvo8nzUVFpgGry+PzmG0RO1qWZmneFj1svZ1Ph5ydfhrX7g==", + "version": "27.0.0-beta.7", + "resolved": "https://registry.npmjs.org/electron/-/electron-27.0.0-beta.7.tgz", + "integrity": "sha512-WNUG0geb3gfGywKc1lp/1puRScurPwfJ7tJ86UOWUOVGs8gpNYup/idrs0chgTrJ9SnqI08ff4jnjO9+R3OcEA==", "hasInstallScript": true, "dependencies": { "@electron/get": "^2.0.0", diff --git a/package.json b/package.json index 7fec7236..d0e3dad5 100644 --- a/package.json +++ b/package.json @@ -166,7 +166,7 @@ "xml2js": "0.6.2", "node-fetch": "2.7.0", "@electron/universal": "1.4.2", - "electron": "27.0.0-beta.6" + "electron": "27.0.0-beta.7" }, "devDependencies": { "@playwright/test": "1.38.1", @@ -178,7 +178,7 @@ "auto-changelog": "2.4.0", "copyfiles": "2.4.1", "del-cli": "5.1.0", - "electron": "27.0.0-beta.6", + "electron": "27.0.0-beta.7", "electron-builder": "24.6.4", "electron-devtools-installer": "3.2.0", "eslint": "8.50.0", From f532398a9c28ffdbc99fcb302e38baed3f1fc53b Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Fri, 29 Sep 2023 10:17:35 +0900 Subject: [PATCH 65/70] chore(deps): bump electron version --- package-lock.json | 8 ++++---- package.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 97349acf..070168fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -50,7 +50,7 @@ "auto-changelog": "2.4.0", "copyfiles": "2.4.1", "del-cli": "5.1.0", - "electron": "27.0.0-beta.7", + "electron": "27.0.0-beta.8", "electron-builder": "24.6.4", "electron-devtools-installer": "3.2.0", "eslint": "8.50.0", @@ -3698,9 +3698,9 @@ } }, "node_modules/electron": { - "version": "27.0.0-beta.7", - "resolved": "https://registry.npmjs.org/electron/-/electron-27.0.0-beta.7.tgz", - "integrity": "sha512-WNUG0geb3gfGywKc1lp/1puRScurPwfJ7tJ86UOWUOVGs8gpNYup/idrs0chgTrJ9SnqI08ff4jnjO9+R3OcEA==", + "version": "27.0.0-beta.8", + "resolved": "https://registry.npmjs.org/electron/-/electron-27.0.0-beta.8.tgz", + "integrity": "sha512-aVO29/8AJN1OVH3Gj61hnAdBbh3nhvVDU6fpQUU+DFrh79yow82vQ2SwyGRgIQQygnj0wK2wGbHXFsOANxaVGg==", "hasInstallScript": true, "dependencies": { "@electron/get": "^2.0.0", diff --git a/package.json b/package.json index d0e3dad5..5335ce3d 100644 --- a/package.json +++ b/package.json @@ -166,7 +166,7 @@ "xml2js": "0.6.2", "node-fetch": "2.7.0", "@electron/universal": "1.4.2", - "electron": "27.0.0-beta.7" + "electron": "27.0.0-beta.8" }, "devDependencies": { "@playwright/test": "1.38.1", @@ -178,7 +178,7 @@ "auto-changelog": "2.4.0", "copyfiles": "2.4.1", "del-cli": "5.1.0", - "electron": "27.0.0-beta.7", + "electron": "27.0.0-beta.8", "electron-builder": "24.6.4", "electron-devtools-installer": "3.2.0", "eslint": "8.50.0", From 72660f5aa17454033f35a988e3cd42fc6c9937db Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Sat, 30 Sep 2023 08:35:16 +0900 Subject: [PATCH 66/70] fix: reduce unchecked type-cast --- plugins/compact-sidebar/front.ts | 2 +- plugins/crossfade/front.ts | 2 +- plugins/disable-autoplay/front.ts | 12 ++-- plugins/downloader/front.ts | 2 +- plugins/in-app-menu/front.ts | 46 ++++++++------- plugins/picture-in-picture/front.ts | 81 ++++++++++++++------------- plugins/playback-speed/front.ts | 30 ++++++---- plugins/precise-volume/front.ts | 47 +++++++++------- plugins/sponsorblock/front.ts | 22 ++++---- plugins/video-toggle/front.ts | 87 +++++++++++++++++------------ plugins/visualizer/front.ts | 21 +++++-- preload.ts | 2 +- providers/prompt-custom-titlebar.ts | 11 ++-- providers/song-info-front.ts | 67 ++++++++++++++-------- tsconfig.json | 2 +- 15 files changed, 256 insertions(+), 178 deletions(-) diff --git a/plugins/compact-sidebar/front.ts b/plugins/compact-sidebar/front.ts index b2bd8f03..ad2aab97 100644 --- a/plugins/compact-sidebar/front.ts +++ b/plugins/compact-sidebar/front.ts @@ -5,6 +5,6 @@ export default () => { || window.getComputedStyle(compactSidebar).display === 'none'; if (isCompactSidebarDisabled) { - (document.querySelector('#button') as HTMLButtonElement)?.click(); + document.querySelector('#button')?.click(); } }; diff --git a/plugins/crossfade/front.ts b/plugins/crossfade/front.ts index 746fe0cd..a38cd713 100644 --- a/plugins/crossfade/front.ts +++ b/plugins/crossfade/front.ts @@ -104,7 +104,7 @@ const syncVideoWithTransitionAudio = () => { video.removeEventListener('timeupdate', transitionBeforeEnd); // Go to next video - XXX: does not support "repeat 1" mode - (document.querySelector('.next-button') as HTMLButtonElement).click(); + document.querySelector('.next-button')?.click(); } }; diff --git a/plugins/disable-autoplay/front.ts b/plugins/disable-autoplay/front.ts index 5e4cd47d..176c6bcf 100644 --- a/plugins/disable-autoplay/front.ts +++ b/plugins/disable-autoplay/front.ts @@ -1,13 +1,17 @@ export default () => { + const timeUpdateListener = (e: Event) => { + if (e.target instanceof HTMLVideoElement) { + e.target.pause(); + } + }; + document.addEventListener('apiLoaded', (apiEvent) => { apiEvent.detail.addEventListener('videodatachange', (name: string) => { if (name === 'dataloaded') { apiEvent.detail.pauseVideo(); - (document.querySelector('video') as HTMLVideoElement)?.addEventListener('timeupdate', (e) => { - (e.target as HTMLVideoElement)?.pause(); - }); + document.querySelector('video')?.addEventListener('timeupdate', timeUpdateListener); } else { - (document.querySelector('video') as HTMLVideoElement).ontimeupdate = null; + document.querySelector('video')?.removeEventListener('timeupdate', timeUpdateListener); } }); }, { once: true, passive: true }); diff --git a/plugins/downloader/front.ts b/plugins/downloader/front.ts index 8393376d..29d9d1cc 100644 --- a/plugins/downloader/front.ts +++ b/plugins/downloader/front.ts @@ -25,7 +25,7 @@ const menuObserver = new MutationObserver(() => { return; } - const menuUrl = (document.querySelector('tp-yt-paper-listbox [tabindex="0"] #navigation-endpoint') as HTMLAnchorElement | undefined)?.href; + const menuUrl = document.querySelector('tp-yt-paper-listbox [tabindex="0"] #navigation-endpoint')?.href; if (!menuUrl?.includes('watch?') && doneFirstLoad) { return; } diff --git a/plugins/in-app-menu/front.ts b/plugins/in-app-menu/front.ts index ae5179c2..fc7640ce 100644 --- a/plugins/in-app-menu/front.ts +++ b/plugins/in-app-menu/front.ts @@ -5,8 +5,11 @@ import { Color, Titlebar } from 'custom-electron-titlebar'; import config from '../../config'; import { isEnabled } from '../../config/plugins'; -function $(selector: string) { - return document.querySelector(selector); +type ElectronCSSStyleDeclaration = CSSStyleDeclaration & { webkitAppRegion: 'drag' | 'no-drag' }; +type ElectronHTMLElement = HTMLElement & { style: ElectronCSSStyleDeclaration }; + +function $(selector: string) { + return document.querySelector(selector); } export default () => { @@ -59,12 +62,10 @@ export default () => { function setupSearchOpenObserver() { const searchOpenObserver = new MutationObserver((mutations) => { - ($('#nav-bar-background') as HTMLElement) - .style - .setProperty( - '-webkit-app-region', - (mutations[0].target as HTMLElement & { opened: boolean }).opened ? 'no-drag' : 'drag', - ); + const navBarBackground = $('#nav-bar-background'); + if (navBarBackground) { + navBarBackground.style.webkitAppRegion = (mutations[0].target as HTMLElement & { opened: boolean }).opened ? 'no-drag' : 'drag'; + } }); const searchBox = $('ytmusic-search-box'); if (searchBox) { @@ -76,21 +77,28 @@ function setupMenuOpenObserver() { const cetMenubar = $('.cet-menubar'); if (cetMenubar) { const menuOpenObserver = new MutationObserver(() => { - ($('#nav-bar-background') as HTMLElement) - .style - .setProperty( - '-webkit-app-region', - Array.from(cetMenubar.childNodes).some((c) => (c as HTMLElement).classList.contains('open')) ? 'no-drag' : 'drag', - ); + let isOpen = false; + for (const child of cetMenubar.children) { + if (child.classList.contains('open')) { + isOpen = true; + break; + } + } + const navBarBackground = $('#nav-bar-background'); + if (navBarBackground) { + navBarBackground.style.webkitAppRegion = isOpen ? 'no-drag' : 'drag'; + } }); menuOpenObserver.observe(cetMenubar, { subtree: true, attributeFilter: ['class'] }); } } function setNavbarMargin() { - const navBarBackground = $('#nav-bar-background') as HTMLElement; - navBarBackground.style.right - = ($('ytmusic-app-layout') as HTMLElement & { playerPageOpen_: boolean }).playerPageOpen_ - ? '0px' - : '12px'; + const navBarBackground = $('#nav-bar-background'); + if (navBarBackground) { + navBarBackground.style.right + = $('ytmusic-app-layout')?.playerPageOpen_ + ? '0px' + : '12px'; + } } diff --git a/plugins/picture-in-picture/front.ts b/plugins/picture-in-picture/front.ts index 88cdebed..7bc9d2c5 100644 --- a/plugins/picture-in-picture/front.ts +++ b/plugins/picture-in-picture/front.ts @@ -10,8 +10,8 @@ import type { ConfigType } from '../../config/dynamic'; type PiPOptions = ConfigType<'picture-in-picture'>; -function $(selector: string) { - return document.querySelector(selector); +function $(selector: string) { + return document.querySelector(selector); } let useNativePiP = false; @@ -60,10 +60,8 @@ const observer = new MutationObserver(() => { return; } - const menuUrl = ($( - 'tp-yt-paper-listbox [tabindex="0"] #navigation-endpoint', - ) as HTMLAnchorElement)?.href; - if (menuUrl && !menuUrl.includes('watch?')) { + const menuUrl = $('tp-yt-paper-listbox [tabindex="0"] #navigation-endpoint')?.href; + if (!menuUrl?.includes('watch?')) { return; } @@ -73,7 +71,7 @@ const observer = new MutationObserver(() => { const togglePictureInPicture = async () => { if (useNativePiP) { const isInPiP = document.pictureInPictureElement !== null; - const video = $('video') as HTMLVideoElement | null; + const video = $('video'); const togglePiP = () => isInPiP ? document.exitPictureInPicture.call(document) @@ -81,7 +79,7 @@ const togglePictureInPicture = async () => { try { await togglePiP(); - ($('#icon') as HTMLButtonElement | null)?.click(); // Close the menu + $('#icon')?.click(); // Close the menu return true; } catch { } @@ -95,42 +93,45 @@ const togglePictureInPicture = async () => { (global as any).togglePictureInPicture = togglePictureInPicture; const listenForToggle = () => { - const originalExitButton = $('.exit-fullscreen-button') as HTMLButtonElement; - const appLayout = $('ytmusic-app-layout') as HTMLElement; - const expandMenu = $('#expanding-menu') as HTMLElement; - const middleControls = $('.middle-controls') as HTMLButtonElement; - const playerPage = $('ytmusic-player-page') as HTMLElement & { playerPageOpen_: boolean }; - const togglePlayerPageButton = $('.toggle-player-page-button') as HTMLButtonElement; - const fullScreenButton = $('.fullscreen-button') as HTMLButtonElement; - const player = ($('#player') as (HTMLVideoElement & { onDoubleClick_: () => void | undefined })); + const originalExitButton = $('.exit-fullscreen-button'); + const appLayout = $('ytmusic-app-layout'); + const expandMenu = $('#expanding-menu'); + const middleControls = $('.middle-controls'); + const playerPage = $('ytmusic-player-page'); + const togglePlayerPageButton = $('.toggle-player-page-button'); + const fullScreenButton = $('.fullscreen-button'); + const player = $ void) | undefined }>('#player'); const onPlayerDblClick = player?.onDoubleClick_; + const mouseLeaveEventListener = () => middleControls?.click(); - const titlebar = $('.cet-titlebar') as HTMLElement; + const titlebar = $('.cet-titlebar'); ipcRenderer.on('pip-toggle', (_, isPip: boolean) => { - if (isPip) { - replaceButton('.exit-fullscreen-button', originalExitButton)?.addEventListener('click', () => togglePictureInPicture()); - player.onDoubleClick_ = () => { - }; + if (originalExitButton && player) { + if (isPip) { + replaceButton('.exit-fullscreen-button', originalExitButton)?.addEventListener('click', () => togglePictureInPicture()); + player.onDoubleClick_ = () => { + }; - expandMenu.addEventListener('mouseleave', () => middleControls.click()); - if (!playerPage.playerPageOpen_) { - togglePlayerPageButton.click(); - } + expandMenu?.addEventListener('mouseleave', mouseLeaveEventListener); + if (!playerPage?.playerPageOpen_) { + togglePlayerPageButton?.click(); + } - fullScreenButton.click(); - appLayout.classList.add('pip'); - if (titlebar) { - titlebar.style.display = 'none'; - } - } else { - $('.exit-fullscreen-button')?.replaceWith(originalExitButton); - player.onDoubleClick_ = onPlayerDblClick; - expandMenu.onmouseleave = null; - originalExitButton.click(); - appLayout.classList.remove('pip'); - if (titlebar) { - titlebar.style.display = 'flex'; + fullScreenButton?.click(); + appLayout?.classList.add('pip'); + if (titlebar) { + titlebar.style.display = 'none'; + } + } else { + $('.exit-fullscreen-button')?.replaceWith(originalExitButton); + player.onDoubleClick_ = onPlayerDblClick; + expandMenu?.removeEventListener('mouseleave', mouseLeaveEventListener); + originalExitButton.click(); + appLayout?.classList.remove('pip'); + if (titlebar) { + titlebar.style.display = 'flex'; + } } } }); @@ -145,7 +146,7 @@ function observeMenu(options: PiPOptions) { cloneButton('.player-minimize-button')?.addEventListener('click', async () => { await togglePictureInPicture(); - setTimeout(() => ($('#player') as HTMLButtonElement | undefined)?.click()); + setTimeout(() => $('#player')?.click()); }); // Allows easily closing the menu by programmatically clicking outside of it @@ -169,7 +170,7 @@ export default (options: PiPOptions) => { window.addEventListener('keydown', (event) => { if ( keyEventAreEqual(event, hotkeyEvent) - && !($('ytmusic-search-box') as (HTMLElement & { opened: boolean }) | undefined)?.opened + && !$('ytmusic-search-box')?.opened ) { togglePictureInPicture(); } diff --git a/plugins/playback-speed/front.ts b/plugins/playback-speed/front.ts index 77bf85cb..17c873c2 100644 --- a/plugins/playback-speed/front.ts +++ b/plugins/playback-speed/front.ts @@ -3,8 +3,8 @@ import { ElementFromFile, templatePath } from '../utils'; import { singleton } from '../../providers/decorators'; -function $(selector: string) { - return document.querySelector(selector); +function $(selector: string) { + return document.querySelector(selector); } const slider = ElementFromFile(templatePath(__dirname, 'slider.html')); @@ -17,7 +17,10 @@ const MAX_PLAYBACK_SPEED = 16; let playbackSpeed = 1; const updatePlayBackSpeed = () => { - ($('video') as HTMLVideoElement).playbackRate = playbackSpeed; + const videoElement = $('video'); + if (videoElement) { + videoElement.playbackRate = playbackSpeed; + } const playbackSpeedElement = $('#playback-speed-value'); if (playbackSpeedElement) { @@ -65,9 +68,11 @@ const observePopupContainer = () => { }; const observeVideo = () => { - const video = $('video') as HTMLVideoElement; - video.addEventListener('ratechange', forcePlaybackRate); - video.addEventListener('srcChanged', forcePlaybackRate); + const video = $('video'); + if (video) { + video.addEventListener('ratechange', forcePlaybackRate); + video.addEventListener('srcChanged', forcePlaybackRate); + } }; const setupWheelListener = () => { @@ -85,14 +90,19 @@ const setupWheelListener = () => { updatePlayBackSpeed(); // Update slider position - ($('#playback-speed-slider') as HTMLElement & { value: number }).value = playbackSpeed; + const playbackSpeedSilder = $('#playback-speed-slider'); + if (playbackSpeedSilder) { + playbackSpeedSilder.value = playbackSpeed; + } }); }; function forcePlaybackRate(e: Event) { - const videoElement = (e.target as HTMLVideoElement); - if (videoElement.playbackRate !== playbackSpeed) { - videoElement.playbackRate = playbackSpeed; + if (e.target instanceof HTMLVideoElement) { + const videoElement = e.target; + if (videoElement.playbackRate !== playbackSpeed) { + videoElement.playbackRate = playbackSpeed; + } } } diff --git a/plugins/precise-volume/front.ts b/plugins/precise-volume/front.ts index 1ec1ac21..0acc7583 100644 --- a/plugins/precise-volume/front.ts +++ b/plugins/precise-volume/front.ts @@ -7,8 +7,8 @@ import { YoutubePlayer } from '../../types/youtube-player'; import type { ConfigType } from '../../config/dynamic'; -function $(selector: string) { - return document.querySelector(selector); +function $(selector: string) { + return document.querySelector(selector); } let api: YoutubePlayer; @@ -30,7 +30,7 @@ const writeOptions = debounce(() => { }, 1000); export const moveVolumeHud = debounce((showVideo: boolean) => { - const volumeHud = $('#volumeHud') as HTMLElement | undefined; + const volumeHud = $('#volumeHud'); if (!volumeHud) { return; } @@ -103,7 +103,7 @@ function injectVolumeHud(noVid: boolean) { } function showVolumeHud(volume: number) { - const volumeHud = $('#volumeHud') as HTMLElement | undefined; + const volumeHud = $('#volumeHud'); if (!volumeHud) { return; } @@ -116,7 +116,7 @@ function showVolumeHud(volume: number) { /** Add onwheel event to video player */ function setupVideoPlayerOnwheel() { - const panel = $('#main-panel') as HTMLElement | undefined; + const panel = $('#main-panel'); if (!panel) return; panel.addEventListener('wheel', (event) => { @@ -133,7 +133,7 @@ function saveVolume(volume: number) { /** Add onwheel event to play bar and also track if play bar is hovered */ function setupPlaybar() { - const playerbar = $('ytmusic-player-bar') as HTMLElement | undefined; + const playerbar = $('ytmusic-player-bar'); if (!playerbar) return; playerbar.addEventListener('wheel', (event) => { @@ -158,14 +158,16 @@ function setupPlaybar() { function setupSliderObserver() { const sliderObserver = new MutationObserver((mutations) => { for (const mutation of mutations) { - // This checks that volume-slider was manually set - const target = mutation.target as HTMLInputElement; - const targetValueNumeric = Number(target.value); - if (mutation.oldValue !== target.value - && (typeof options.savedVolume !== 'number' || Math.abs(options.savedVolume - targetValueNumeric) > 4)) { - // Diff>4 means it was manually set - setTooltip(targetValueNumeric); - saveVolume(targetValueNumeric); + if (mutation.target instanceof HTMLInputElement) { + // This checks that volume-slider was manually set + const target = mutation.target; + const targetValueNumeric = Number(target.value); + if (mutation.oldValue !== target.value + && (typeof options.savedVolume !== 'number' || Math.abs(options.savedVolume - targetValueNumeric) > 4)) { + // Diff>4 means it was manually set + setTooltip(targetValueNumeric); + saveVolume(targetValueNumeric); + } } } }); @@ -209,15 +211,15 @@ function updateVolumeSlider() { const savedVolume = options.savedVolume ?? 0; // Slider value automatically rounds to multiples of 5 for (const slider of ['#volume-slider', '#expand-volume-slider']) { - ($(slider) as HTMLInputElement).value - = String(savedVolume > 0 && savedVolume < 5 - ? 5 - : savedVolume); + const silderElement = $(slider); + if (silderElement) { + silderElement.value = String(savedVolume > 0 && savedVolume < 5 ? 5 : savedVolume); + } } } function showVolumeSlider() { - const slider = $('#volume-slider') as HTMLElement | null; + const slider = $('#volume-slider'); if (!slider) return; // This class display the volume slider if not in minimized mode @@ -236,14 +238,17 @@ const tooltipTargets = [ function setTooltip(volume: number) { for (const target of tooltipTargets) { - ($(target) as HTMLElement).title = `${volume}%`; + const tooltipTargetElement = $(target); + if (tooltipTargetElement) { + tooltipTargetElement.title = `${volume}%`; + } } } function setupLocalArrowShortcuts() { if (options.arrowsShortcut) { window.addEventListener('keydown', (event) => { - if (($('ytmusic-search-box') as (HTMLElement & { opened: boolean }) | null)?.opened) { + if ($('ytmusic-search-box')?.opened) { return; } diff --git a/plugins/sponsorblock/front.ts b/plugins/sponsorblock/front.ts index 960c97ba..ccb2f808 100644 --- a/plugins/sponsorblock/front.ts +++ b/plugins/sponsorblock/front.ts @@ -11,20 +11,22 @@ export default () => { }); document.addEventListener('apiLoaded', () => { - const video = document.querySelector('video') as HTMLVideoElement | undefined; + const video = document.querySelector('video'); if (!video) return; video.addEventListener('timeupdate', (e) => { - const target = e.target as HTMLVideoElement; + if (e.target instanceof HTMLVideoElement) { + const target = e.target; - for (const segment of currentSegments) { - if ( - target.currentTime >= segment[0] - && target.currentTime < segment[1] - ) { - target.currentTime = segment[1]; - if (is.dev()) { - console.log('SponsorBlock: skipping segment', segment); + for (const segment of currentSegments) { + if ( + target.currentTime >= segment[0] + && target.currentTime < segment[1] + ) { + target.currentTime = segment[1]; + if (is.dev()) { + console.log('SponsorBlock: skipping segment', segment); + } } } } diff --git a/plugins/video-toggle/front.ts b/plugins/video-toggle/front.ts index d6751dc2..49a3ecd1 100644 --- a/plugins/video-toggle/front.ts +++ b/plugins/video-toggle/front.ts @@ -10,13 +10,13 @@ import type { ConfigType } from '../../config/dynamic'; const moveVolumeHud = isEnabled('precise-volume') ? preciseVolumeMoveVolumeHud : () => {}; -function $(selector: string): HTMLElement | null { - return document.querySelector(selector); +function $(selector: string): E | null { + return document.querySelector(selector); } let options: ConfigType<'video-toggle'>; -let player: HTMLElement & { videoMode_: boolean }; -let video: HTMLVideoElement; +let player: HTMLElement & { videoMode_: boolean } | null; +let video: HTMLVideoElement | null; let api: YoutubePlayer; const switchButtonDiv = ElementFromFile( @@ -51,17 +51,22 @@ export default (_options: ConfigType<'video-toggle'>) => { function setup(e: CustomEvent) { api = e.detail; - player = $('ytmusic-player') as typeof player; - video = $('video') as HTMLVideoElement; + player = $<(HTMLElement & { videoMode_: boolean; })>('ytmusic-player'); + video = $('video'); - ($('#player') as HTMLVideoElement).prepend(switchButtonDiv); + $('#player')?.prepend(switchButtonDiv); if (options.hideVideo) { - ($('.video-switch-button-checkbox') as HTMLInputElement).checked = false; + const checkbox = $('.video-switch-button-checkbox'); + if (checkbox) { + checkbox.checked = false; + } changeDisplay(false); forcePlaybackMode(); // Fix black video - video.style.height = 'auto'; + if (video) { + video.style.height = 'auto'; + } } //Prevents bubbling to the player which causes it to stop or resume @@ -77,7 +82,7 @@ function setup(e: CustomEvent) { setOptions('video-toggle', options); }); - video.addEventListener('srcChanged', videoStarted); + video?.addEventListener('srcChanged', videoStarted); observeThumbnail(); @@ -100,17 +105,19 @@ function setup(e: CustomEvent) { } function changeDisplay(showVideo: boolean) { - player.style.margin = showVideo ? '' : 'auto 0px'; - player.setAttribute('playback-mode', showVideo ? 'OMV_PREFERRED' : 'ATV_PREFERRED'); + if (player) { + player.style.margin = showVideo ? '' : 'auto 0px'; + player.setAttribute('playback-mode', showVideo ? 'OMV_PREFERRED' : 'ATV_PREFERRED'); - $('#song-video.ytmusic-player')!.style.display = showVideo ? 'block' : 'none'; - $('#song-image')!.style.display = showVideo ? 'none' : 'block'; + $('#song-video.ytmusic-player')!.style.display = showVideo ? 'block' : 'none'; + $('#song-image')!.style.display = showVideo ? 'none' : 'block'; - if (showVideo && !video.style.top) { - video.style.top = `${(player.clientHeight - video.clientHeight) / 2}px`; + if (showVideo && video && !video.style.top) { + video.style.top = `${(player.clientHeight - video.clientHeight) / 2}px`; + } + + moveVolumeHud(showVideo); } - - moveVolumeHud(showVideo); } function videoStarted() { @@ -120,12 +127,16 @@ function videoStarted() { // Hide toggle button switchButtonDiv.style.display = 'none'; } else { + const songImage = $('#song-image img'); + if (!songImage) { + return; + } // Switch to high-res thumbnail - forceThumbnail($('#song-image img') as HTMLImageElement); + forceThumbnail(songImage); // Show toggle button switchButtonDiv.style.display = 'initial'; // Change display to video mode if video exist & video is hidden & option.hideVideo = false - if (!options.hideVideo && $('#song-video.ytmusic-player')?.style.display === 'none') { + if (!options.hideVideo && $('#song-video.ytmusic-player')?.style.display === 'none') { changeDisplay(true); } else { moveVolumeHud(!options.hideVideo); @@ -136,31 +147,37 @@ function videoStarted() { // On load, after a delay, the page overrides the playback-mode to 'OMV_PREFERRED' which causes weird aspect ratio in the image container // this function fix the problem by overriding that override :) function forcePlaybackMode() { - const playbackModeObserver = new MutationObserver((mutations) => { - for (const mutation of mutations) { - const target = mutation.target as HTMLElement; - if (target.getAttribute('playback-mode') !== 'ATV_PREFERRED') { - playbackModeObserver.disconnect(); - target.setAttribute('playback-mode', 'ATV_PREFERRED'); + if (player) { + const playbackModeObserver = new MutationObserver((mutations) => { + for (const mutation of mutations) { + if (mutation.target instanceof HTMLElement) { + const target = mutation.target; + if (target.getAttribute('playback-mode') !== 'ATV_PREFERRED') { + playbackModeObserver.disconnect(); + target.setAttribute('playback-mode', 'ATV_PREFERRED'); + } + } } - } - }); - playbackModeObserver.observe(player, { attributeFilter: ['playback-mode'] }); + }); + playbackModeObserver.observe(player, { attributeFilter: ['playback-mode'] }); + } } function observeThumbnail() { const playbackModeObserver = new MutationObserver((mutations) => { - if (!player.videoMode_) { + if (!player?.videoMode_) { return; } for (const mutation of mutations) { - const target = mutation.target as HTMLImageElement; - if (!target.src.startsWith('data:')) { - continue; - } + if (mutation.target instanceof HTMLImageElement) { + const target = mutation.target; + if (!target.src.startsWith('data:')) { + continue; + } - forceThumbnail(target); + forceThumbnail(target); + } } }); playbackModeObserver.observe($('#song-image img')!, { attributeFilter: ['src'] }); diff --git a/plugins/visualizer/front.ts b/plugins/visualizer/front.ts index 9274a3cd..7720d9ed 100644 --- a/plugins/visualizer/front.ts +++ b/plugins/visualizer/front.ts @@ -26,21 +26,30 @@ export default (options: ConfigType<'visualizer'>) => { document.addEventListener( 'audioCanPlay', (e) => { - const video = document.querySelector('video') as (HTMLVideoElement & { captureStream(): MediaStream; }); - const visualizerContainer = document.querySelector('#player') as HTMLElement; + const video = document.querySelector('video'); + if (!video) { + return; + } - let canvas = document.querySelector('#visualizer') as HTMLCanvasElement; + const visualizerContainer = document.querySelector('#player'); + if (!visualizerContainer) { + return; + } + + let canvas = document.querySelector('#visualizer'); if (!canvas) { canvas = document.createElement('canvas'); canvas.id = 'visualizer'; canvas.style.position = 'absolute'; canvas.style.background = 'black'; - visualizerContainer.append(canvas); + visualizerContainer?.append(canvas); } const resizeCanvas = () => { - canvas.width = visualizerContainer.clientWidth; - canvas.height = visualizerContainer.clientHeight; + if (canvas) { + canvas.width = visualizerContainer.clientWidth; + canvas.height = visualizerContainer.clientHeight; + } }; resizeCanvas(); diff --git a/preload.ts b/preload.ts index d14e23db..9cbc11d7 100644 --- a/preload.ts +++ b/preload.ts @@ -150,7 +150,7 @@ function onApiLoaded() { // Navigate to "Starting page" const startingPage: string = config.get('options.startingPage'); if (startingPage && startingPages[startingPage]) { - ($('ytmusic-app') as YouTubeMusicAppElement)?.navigate_(startingPages[startingPage]); + $('ytmusic-app')?.navigate_(startingPages[startingPage]); } // Remove upgrade button diff --git a/providers/prompt-custom-titlebar.ts b/providers/prompt-custom-titlebar.ts index 3a66afe2..cfcdad1a 100644 --- a/providers/prompt-custom-titlebar.ts +++ b/providers/prompt-custom-titlebar.ts @@ -1,3 +1,4 @@ +// eslint-disable-next-line import/no-unresolved import { Titlebar, Color } from 'custom-electron-titlebar'; export default () => { @@ -7,8 +8,10 @@ export default () => { maximizable: false, menu: undefined, }); - const mainStyle = (document.querySelector('#container') as HTMLElement)!.style; - mainStyle.width = '100%'; - mainStyle.position = 'fixed'; - mainStyle.border = 'unset'; + const mainStyle = document.querySelector('#container')?.style; + if (mainStyle) { + mainStyle.width = '100%'; + mainStyle.position = 'fixed'; + mainStyle.border = 'unset'; + } }; diff --git a/providers/song-info-front.ts b/providers/song-info-front.ts index 602d6d49..0848a9b9 100644 --- a/providers/song-info-front.ts +++ b/providers/song-info-front.ts @@ -9,8 +9,8 @@ import { GetState } from '../types/datahost-get-state'; let songInfo: SongInfo = {} as SongInfo; export const getSongInfo = () => songInfo; -const $ = (s: string): E => document.querySelector(s) as E; -const $$ = (s: string): E[] => Array.from(document.querySelectorAll(s)); +const $ = (s: string): E | null => document.querySelector(s); +const $$ = (s: string): NodeListOf => document.querySelectorAll(s); ipcRenderer.on('update-song-info', async (_, extractedSongInfo: string) => { songInfo = JSON.parse(extractedSongInfo) as SongInfo; @@ -21,35 +21,54 @@ ipcRenderer.on('update-song-info', async (_, extractedSongInfo: string) => { const srcChangedEvent = new CustomEvent('srcChanged'); export const setupSeekedListener = singleton(() => { - $('video')?.addEventListener('seeked', (v) => ipcRenderer.send('seeked', (v.target as HTMLVideoElement).currentTime)); + $('video')?.addEventListener('seeked', (v) => { + if (v.target instanceof HTMLVideoElement) { + ipcRenderer.send('seeked', v.target.currentTime); + } + }); }); export const setupTimeChangedListener = singleton(() => { const progressObserver = new MutationObserver((mutations) => { - const target = mutations[0].target as HTMLInputElement; - ipcRenderer.send('timeChanged', target.value); - songInfo.elapsedSeconds = Number(target.value); + for (const mutation of mutations) { + const target = mutation.target as Node & { value: string }; + ipcRenderer.send('timeChanged', target.value); + songInfo.elapsedSeconds = Number(target.value); + } }); - progressObserver.observe($('#progress-bar'), { attributeFilter: ['value'] }); + const progressBar = $('#progress-bar'); + if (progressBar) { + progressObserver.observe(progressBar, { attributeFilter: ['value'] }); + } }); export const setupRepeatChangedListener = singleton(() => { const repeatObserver = new MutationObserver((mutations) => { - // provided by YouTube music - // eslint-disable-next-line @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access - ipcRenderer.send('repeatChanged', ((mutations[0].target as any).__dataHost.getState() as GetState).queue.repeatMode); + // provided by YouTube Music + ipcRenderer.send( + 'repeatChanged', + (mutations[0].target as Node & { + __dataHost: { + getState: () => GetState; + } + }).__dataHost.getState().queue.repeatMode, + ); }); repeatObserver.observe($('#right-controls .repeat')!, { attributeFilter: ['title'] }); // Emit the initial value as well; as it's persistent between launches. - // provided by YouTube music - // eslint-disable-next-line @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unnecessary-type-assertion - ipcRenderer.send('repeatChanged', (($('ytmusic-player-bar') as any).getState() as GetState).queue.repeatMode); + // provided by YouTube Music + ipcRenderer.send( + 'repeatChanged', + $ GetState; + }>('ytmusic-player-bar')?.GetState().queue.repeatMode, + ); }); export const setupVolumeChangedListener = singleton((api: YoutubePlayer) => { - $('video').addEventListener('volumechange', () => { + $('video')?.addEventListener('volumechange', () => { ipcRenderer.send('volumeChanged', api.getVolume()); }); // Emit the initial value as well; as it's persistent between launches. @@ -75,10 +94,10 @@ export default () => { }); const playPausedHandler = (e: Event, status: string) => { - if (Math.round((e.target as HTMLVideoElement).currentTime) > 0) { + if (e.target instanceof HTMLVideoElement && Math.round(e.target.currentTime) > 0) { ipcRenderer.send('playPaused', { isPaused: status === 'pause', - elapsedSeconds: Math.floor((e.target as HTMLVideoElement).currentTime), + elapsedSeconds: Math.floor(e.target.currentTime), }); } }; @@ -94,10 +113,10 @@ export default () => { return; } const video = $('video'); - video.dispatchEvent(srcChangedEvent); + video?.dispatchEvent(srcChangedEvent); for (const status of ['playing', 'pause'] as const) { // for fix issue that pause event not fired - video.addEventListener(status, playPausedHandlers[status]); + video?.addEventListener(status, playPausedHandlers[status]); } setTimeout(sendSongInfo, 200); }); @@ -110,12 +129,12 @@ export default () => { function sendSongInfo() { const data = apiEvent.detail.getPlayerResponse(); - data.videoDetails.album = $$( - '.byline.ytmusic-player-bar > .yt-simple-endpoint', - ).find((e) => - e.href?.includes('browse/FEmusic_library_privately_owned_release') - || e.href?.includes('browse/MPREb'), - )?.textContent; + for (const e of $$('.byline.ytmusic-player-bar > .yt-simple-endpoint')) { + if (e.href?.includes('browse/FEmusic_library_privately_owned_release') || e.href?.includes('browse/MPREb')) { + data.videoDetails.album = e.textContent; + break; + } + } data.videoDetails.elapsedSeconds = 0; data.videoDetails.isPaused = false; diff --git a/tsconfig.json b/tsconfig.json index 18fce570..a53e985a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "target": "ESNext", - "lib": ["dom", "es2022"], + "lib": ["dom", "dom.iterable", "es2022"], "module": "CommonJS", "allowSyntheticDefaultImports": true, "esModuleInterop": true, From 46d3a85cc026e9436e10adec31fe6822e40f00d1 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Sat, 30 Sep 2023 08:43:10 +0900 Subject: [PATCH 67/70] fix: remove unnecessary `JSON.stringify` & `JSON.parse` --- plugins/downloader/back.ts | 7 ++++--- plugins/lyrics-genius/back.ts | 4 ++-- plugins/lyrics-genius/front.ts | 4 +++- plugins/sponsorblock/back.ts | 6 +++--- providers/song-info-front.ts | 6 +++--- providers/song-info.ts | 12 ++++++------ 6 files changed, 21 insertions(+), 18 deletions(-) diff --git a/plugins/downloader/back.ts b/plugins/downloader/back.ts index 83f27b8a..958fd6aa 100644 --- a/plugins/downloader/back.ts +++ b/plugins/downloader/back.ts @@ -29,7 +29,8 @@ import { isEnabled } from '../../config/plugins'; import { cleanupName, getImage, SongInfo } from '../../providers/song-info'; import { injectCSS } from '../utils'; import { cache } from '../../providers/decorators'; -import { GetPlayerResponse } from '../../types/get-player-response'; + +import type { GetPlayerResponse } from '../../types/get-player-response'; type CustomSongInfo = SongInfo & { trackId?: string }; @@ -78,8 +79,8 @@ export default async (win_: BrowserWindow) => { generate_session_locally: true, }); ipcMain.on('download-song', (_, url: string) => downloadSong(url)); - ipcMain.on('video-src-changed', (_, data: string) => { - playingUrl = (JSON.parse(data) as GetPlayerResponse).microformat.microformatDataRenderer.urlCanonical; + ipcMain.on('video-src-changed', (_, data: GetPlayerResponse) => { + playingUrl = data.microformat.microformatDataRenderer.urlCanonical; }); ipcMain.on('download-playlist-request', async (_event, url: string) => downloadPlaylist(url), diff --git a/plugins/lyrics-genius/back.ts b/plugins/lyrics-genius/back.ts index ce46aa3a..a4da0d3d 100644 --- a/plugins/lyrics-genius/back.ts +++ b/plugins/lyrics-genius/back.ts @@ -24,8 +24,8 @@ export default (win: BrowserWindow, options: LyricGeniusType) => { injectCSS(win.webContents, join(__dirname, 'style.css')); - ipcMain.handle('search-genius-lyrics', async (_, extractedSongInfo: string) => { - const metadata = JSON.parse(extractedSongInfo) as SongInfo; + ipcMain.handle('search-genius-lyrics', async (_, extractedSongInfo: SongInfo) => { + const metadata = extractedSongInfo; return await fetchFromGenius(metadata); }); }; diff --git a/plugins/lyrics-genius/front.ts b/plugins/lyrics-genius/front.ts index c87daf23..8e54ac94 100644 --- a/plugins/lyrics-genius/front.ts +++ b/plugins/lyrics-genius/front.ts @@ -1,8 +1,10 @@ import { ipcRenderer } from 'electron'; import is from 'electron-is'; +import type { SongInfo } from '../../providers/song-info'; + export default () => { - ipcRenderer.on('update-song-info', (_, extractedSongInfo: string) => setTimeout(async () => { + ipcRenderer.on('update-song-info', (_, extractedSongInfo: SongInfo) => setTimeout(async () => { const tabList = document.querySelectorAll('tp-yt-paper-tab'); const tabs = { upNext: tabList[0], diff --git a/plugins/sponsorblock/back.ts b/plugins/sponsorblock/back.ts index 1a95c776..cd3e49d0 100644 --- a/plugins/sponsorblock/back.ts +++ b/plugins/sponsorblock/back.ts @@ -6,8 +6,8 @@ import { sortSegments } from './segments'; import { SkipSegment } from './types'; import defaultConfig from '../../config/defaults'; -import { GetPlayerResponse } from '../../types/get-player-response'; +import type { GetPlayerResponse } from '../../types/get-player-response'; import type { ConfigType } from '../../config/dynamic'; let videoID: string; @@ -18,8 +18,8 @@ export default (win: BrowserWindow, options: ConfigType<'sponsorblock'>) => { ...options, }; - ipcMain.on('video-src-changed', async (_, data: string) => { - videoID = (JSON.parse(data) as GetPlayerResponse)?.videoDetails?.videoId; + ipcMain.on('video-src-changed', async (_, data: GetPlayerResponse) => { + videoID = data?.videoDetails?.videoId; const segments = await fetchSegments(apiURL, categories); win.webContents.send('sponsorblock-skip', segments); }); diff --git a/providers/song-info-front.ts b/providers/song-info-front.ts index 0848a9b9..f5607869 100644 --- a/providers/song-info-front.ts +++ b/providers/song-info-front.ts @@ -12,8 +12,8 @@ export const getSongInfo = () => songInfo; const $ = (s: string): E | null => document.querySelector(s); const $$ = (s: string): NodeListOf => document.querySelectorAll(s); -ipcRenderer.on('update-song-info', async (_, extractedSongInfo: string) => { - songInfo = JSON.parse(extractedSongInfo) as SongInfo; +ipcRenderer.on('update-song-info', async (_, extractedSongInfo: SongInfo) => { + songInfo = extractedSongInfo; if (songInfo.imageSrc) songInfo.image = await getImage(songInfo.imageSrc); }); @@ -138,7 +138,7 @@ export default () => { data.videoDetails.elapsedSeconds = 0; data.videoDetails.isPaused = false; - ipcRenderer.send('video-src-changed', JSON.stringify(data)); + ipcRenderer.send('video-src-changed', data); } }, { once: true, passive: true }); }; diff --git a/providers/song-info.ts b/providers/song-info.ts index 4ffc1110..83cfa6ca 100644 --- a/providers/song-info.ts +++ b/providers/song-info.ts @@ -3,7 +3,8 @@ import { BrowserWindow, ipcMain, nativeImage, net } from 'electron'; import { cache } from './decorators'; import config from '../config'; -import { GetPlayerResponse } from '../types/get-player-response'; + +import type { GetPlayerResponse } from '../types/get-player-response'; export interface SongInfo { title: string; @@ -53,8 +54,7 @@ export const getImage = cache( }, ); -const handleData = async (responseText: string, win: Electron.BrowserWindow) => { - const data = JSON.parse(responseText) as GetPlayerResponse; +const handleData = async (data: GetPlayerResponse, win: Electron.BrowserWindow) => { if (!data) { return; } @@ -83,7 +83,7 @@ const handleData = async (responseText: string, win: Electron.BrowserWindow) => songInfo.imageSrc = thumbnails.at(-1)?.url.split('?')[0]; if (songInfo.imageSrc) songInfo.image = await getImage(songInfo.imageSrc); - win.webContents.send('update-song-info', JSON.stringify(songInfo)); + win.webContents.send('update-song-info', songInfo); } }; @@ -100,9 +100,9 @@ let handlingData = false; const registerProvider = (win: BrowserWindow) => { // This will be called when the song-info-front finds a new request with song data - ipcMain.on('video-src-changed', async (_, responseText: string) => { + ipcMain.on('video-src-changed', async (_, data: GetPlayerResponse) => { handlingData = true; - await handleData(responseText, win); + await handleData(data, win); handlingData = false; for (const c of callbacks) { c(songInfo, 'video-src-changed'); From c554ed79b15b31ab366a49c25d5374c1e6a8b640 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Sat, 30 Sep 2023 18:46:16 +0900 Subject: [PATCH 68/70] fix(prompt-custom-titlebar): fix `customScript` is not function --- providers/prompt-custom-titlebar.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/providers/prompt-custom-titlebar.ts b/providers/prompt-custom-titlebar.ts index cfcdad1a..5068745c 100644 --- a/providers/prompt-custom-titlebar.ts +++ b/providers/prompt-custom-titlebar.ts @@ -1,7 +1,7 @@ // eslint-disable-next-line import/no-unresolved import { Titlebar, Color } from 'custom-electron-titlebar'; -export default () => { +const customTitlebarFunction = () => { new Titlebar({ backgroundColor: Color.fromHex('#050505'), minimizable: false, @@ -15,3 +15,7 @@ export default () => { mainStyle.border = 'unset'; } }; + + +module.exports = customTitlebarFunction; +export default customTitlebarFunction; From 529d5e165cd91fcc7a3dce1134ff25cd56c6e8ac Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Sat, 30 Sep 2023 20:01:31 +0900 Subject: [PATCH 69/70] fix: fix 'Application entry file Not found' --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 5335ce3d..8e09486a 100644 --- a/package.json +++ b/package.json @@ -123,9 +123,9 @@ "plugin:adblocker-without-tsc": "del-cli plugins/adblocker/ad-blocker-engine.bin && node dist/plugins/adblocker/blocker.js", "plugin:adblocker": "del-cli plugins/adblocker/ad-blocker-engine.bin && tsc && node dist/plugins/adblocker/blocker.js", "plugin:bypass-age-restrictions": "del-cli node_modules/simple-youtube-age-restriction-bypass/package.json && npm run generate:package simple-youtube-age-restriction-bypass", - "release:linux": "npm run clean && electron-builder --linux -p always -c.snap.publish=github", - "release:mac": "npm run clean && electron-builder --mac -p always", - "release:win": "npm run clean && electron-builder --win -p always", + "release:linux": "npm run clean && npm run tsc-and-copy && electron-builder --linux -p always -c.snap.publish=github", + "release:mac": "npm run clean && npm run tsc-and-copy && electron-builder --mac -p always", + "release:win": "npm run clean && npm run tsc-and-copy && electron-builder --win -p always", "typecheck": "tsc -p tsconfig.json --noEmit" }, "engines": { From 47bd01554944bd3ad2d39d4039afd0ad4584b182 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Tue, 3 Oct 2023 10:51:25 +0900 Subject: [PATCH 70/70] chore(deps): bump deps --- package-lock.json | 174 +++++++++++++++++++++++----------------------- package.json | 10 +-- 2 files changed, 92 insertions(+), 92 deletions(-) diff --git a/package-lock.json b/package-lock.json index 070168fe..62f29ac1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@ffmpeg.wasm/core-mt": "0.12.0", "@ffmpeg.wasm/main": "0.12.0", "@foobar404/wave": "2.0.4", - "@xhayper/discord-rpc": "1.0.22", + "@xhayper/discord-rpc": "1.0.23", "async-mutex": "0.4.0", "butterchurn": "2.6.7", "butterchurn-presets": "2.4.7", @@ -37,7 +37,7 @@ "node-id3": "0.2.6", "simple-youtube-age-restriction-bypass": "git+https://github.com/MiepHD/Simple-YouTube-Age-Restriction-Bypass.git#v2.5.5", "vudio": "2.1.1", - "youtubei.js": "6.4.0", + "youtubei.js": "6.4.1", "ytpl": "2.3.0" }, "devDependencies": { @@ -46,11 +46,11 @@ "@types/electron-localshortcut": "3.1.1", "@types/howler": "2.2.9", "@types/html-to-text": "9.0.2", - "@typescript-eslint/eslint-plugin": "6.7.3", + "@typescript-eslint/eslint-plugin": "6.7.4", "auto-changelog": "2.4.0", "copyfiles": "2.4.1", "del-cli": "5.1.0", - "electron": "27.0.0-beta.8", + "electron": "27.0.0-beta.9", "electron-builder": "24.6.4", "electron-devtools-installer": "3.2.0", "eslint": "8.50.0", @@ -1308,16 +1308,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.3.tgz", - "integrity": "sha512-vntq452UHNltxsaaN+L9WyuMch8bMd9CqJ3zhzTPXXidwbf5mqqKCVXEuvRZUqLJSTLeWE65lQwyXsRGnXkCTA==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.4.tgz", + "integrity": "sha512-DAbgDXwtX+pDkAHwiGhqP3zWUGpW49B7eqmgpPtg+BKJXwdct79ut9+ifqOFPJGClGKSHXn2PTBatCnldJRUoA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.7.3", - "@typescript-eslint/type-utils": "6.7.3", - "@typescript-eslint/utils": "6.7.3", - "@typescript-eslint/visitor-keys": "6.7.3", + "@typescript-eslint/scope-manager": "6.7.4", + "@typescript-eslint/type-utils": "6.7.4", + "@typescript-eslint/utils": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1343,13 +1343,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.3.tgz", - "integrity": "sha512-wOlo0QnEou9cHO2TdkJmzF7DFGvAKEnB82PuPNHpT8ZKKaZu6Bm63ugOTn9fXNJtvuDPanBc78lGUGGytJoVzQ==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.4.tgz", + "integrity": "sha512-SdGqSLUPTXAXi7c3Ob7peAGVnmMoGzZ361VswK2Mqf8UOYcODiYvs8rs5ILqEdfvX1lE7wEZbLyELCW+Yrql1A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.3", - "@typescript-eslint/visitor-keys": "6.7.3" + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1360,9 +1360,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.3.tgz", - "integrity": "sha512-4g+de6roB2NFcfkZb439tigpAMnvEIg3rIjWQ+EM7IBaYt/CdJt6em9BJ4h4UpdgaBWdmx2iWsafHTrqmgIPNw==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.4.tgz", + "integrity": "sha512-o9XWK2FLW6eSS/0r/tgjAGsYasLAnOWg7hvZ/dGYSSNjCh+49k5ocPN8OmG5aZcSJ8pclSOyVKP2x03Sj+RrCA==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1373,12 +1373,12 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.3.tgz", - "integrity": "sha512-HEVXkU9IB+nk9o63CeICMHxFWbHWr3E1mpilIQBe9+7L/lH97rleFLVtYsfnWB+JVMaiFnEaxvknvmIzX+CqVg==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.4.tgz", + "integrity": "sha512-pOW37DUhlTZbvph50x5zZCkFn3xzwkGtNoJHzIM3svpiSkJzwOYr/kVBaXmf+RAQiUDs1AHEZVNPg6UJCJpwRA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/types": "6.7.4", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1437,13 +1437,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.3.tgz", - "integrity": "sha512-Fc68K0aTDrKIBvLnKTZ5Pf3MXK495YErrbHb1R6aTpfK5OdSFj0rVN7ib6Tx6ePrZ2gsjLqr0s98NG7l96KSQw==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.4.tgz", + "integrity": "sha512-n+g3zi1QzpcAdHFP9KQF+rEFxMb2KxtnJGID3teA/nxKHOVi3ylKovaqEzGBbVY2pBttU6z85gp0D00ufLzViQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.7.3", - "@typescript-eslint/utils": "6.7.3", + "@typescript-eslint/typescript-estree": "6.7.4", + "@typescript-eslint/utils": "6.7.4", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1464,9 +1464,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.3.tgz", - "integrity": "sha512-4g+de6roB2NFcfkZb439tigpAMnvEIg3rIjWQ+EM7IBaYt/CdJt6em9BJ4h4UpdgaBWdmx2iWsafHTrqmgIPNw==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.4.tgz", + "integrity": "sha512-o9XWK2FLW6eSS/0r/tgjAGsYasLAnOWg7hvZ/dGYSSNjCh+49k5ocPN8OmG5aZcSJ8pclSOyVKP2x03Sj+RrCA==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1477,13 +1477,13 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.3.tgz", - "integrity": "sha512-YLQ3tJoS4VxLFYHTw21oe1/vIZPRqAO91z6Uv0Ss2BKm/Ag7/RVQBcXTGcXhgJMdA4U+HrKuY5gWlJlvoaKZ5g==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.4.tgz", + "integrity": "sha512-ty8b5qHKatlNYd9vmpHooQz3Vki3gG+3PchmtsA4TgrZBKWHNjWfkQid7K7xQogBqqc7/BhGazxMD5vr6Ha+iQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.3", - "@typescript-eslint/visitor-keys": "6.7.3", + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1504,12 +1504,12 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.3.tgz", - "integrity": "sha512-HEVXkU9IB+nk9o63CeICMHxFWbHWr3E1mpilIQBe9+7L/lH97rleFLVtYsfnWB+JVMaiFnEaxvknvmIzX+CqVg==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.4.tgz", + "integrity": "sha512-pOW37DUhlTZbvph50x5zZCkFn3xzwkGtNoJHzIM3svpiSkJzwOYr/kVBaXmf+RAQiUDs1AHEZVNPg6UJCJpwRA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/types": "6.7.4", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1623,17 +1623,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.3.tgz", - "integrity": "sha512-vzLkVder21GpWRrmSR9JxGZ5+ibIUSudXlW52qeKpzUEQhRSmyZiVDDj3crAth7+5tmN1ulvgKaCU2f/bPRCzg==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.4.tgz", + "integrity": "sha512-PRQAs+HUn85Qdk+khAxsVV+oULy3VkbH3hQ8hxLRJXWBEd7iI+GbQxH5SEUSH7kbEoTp6oT1bOwyga24ELALTA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.7.3", - "@typescript-eslint/types": "6.7.3", - "@typescript-eslint/typescript-estree": "6.7.3", + "@typescript-eslint/scope-manager": "6.7.4", + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/typescript-estree": "6.7.4", "semver": "^7.5.4" }, "engines": { @@ -1648,13 +1648,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.3.tgz", - "integrity": "sha512-wOlo0QnEou9cHO2TdkJmzF7DFGvAKEnB82PuPNHpT8ZKKaZu6Bm63ugOTn9fXNJtvuDPanBc78lGUGGytJoVzQ==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.4.tgz", + "integrity": "sha512-SdGqSLUPTXAXi7c3Ob7peAGVnmMoGzZ361VswK2Mqf8UOYcODiYvs8rs5ILqEdfvX1lE7wEZbLyELCW+Yrql1A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.3", - "@typescript-eslint/visitor-keys": "6.7.3" + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1665,9 +1665,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.3.tgz", - "integrity": "sha512-4g+de6roB2NFcfkZb439tigpAMnvEIg3rIjWQ+EM7IBaYt/CdJt6em9BJ4h4UpdgaBWdmx2iWsafHTrqmgIPNw==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.4.tgz", + "integrity": "sha512-o9XWK2FLW6eSS/0r/tgjAGsYasLAnOWg7hvZ/dGYSSNjCh+49k5ocPN8OmG5aZcSJ8pclSOyVKP2x03Sj+RrCA==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1678,13 +1678,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.3.tgz", - "integrity": "sha512-YLQ3tJoS4VxLFYHTw21oe1/vIZPRqAO91z6Uv0Ss2BKm/Ag7/RVQBcXTGcXhgJMdA4U+HrKuY5gWlJlvoaKZ5g==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.4.tgz", + "integrity": "sha512-ty8b5qHKatlNYd9vmpHooQz3Vki3gG+3PchmtsA4TgrZBKWHNjWfkQid7K7xQogBqqc7/BhGazxMD5vr6Ha+iQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.3", - "@typescript-eslint/visitor-keys": "6.7.3", + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1705,12 +1705,12 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.3.tgz", - "integrity": "sha512-HEVXkU9IB+nk9o63CeICMHxFWbHWr3E1mpilIQBe9+7L/lH97rleFLVtYsfnWB+JVMaiFnEaxvknvmIzX+CqVg==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.4.tgz", + "integrity": "sha512-pOW37DUhlTZbvph50x5zZCkFn3xzwkGtNoJHzIM3svpiSkJzwOYr/kVBaXmf+RAQiUDs1AHEZVNPg6UJCJpwRA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/types": "6.7.4", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1769,13 +1769,13 @@ } }, "node_modules/@xhayper/discord-rpc": { - "version": "1.0.22", - "resolved": "https://registry.npmjs.org/@xhayper/discord-rpc/-/discord-rpc-1.0.22.tgz", - "integrity": "sha512-9NUse3AwmmLUgdY9PnI8tcm9ECRuuRRbdJwy7Osa3CPYF12EreTbIY/glEh5VHr66fcZy/IswGVnB477XOsTYA==", + "version": "1.0.23", + "resolved": "https://registry.npmjs.org/@xhayper/discord-rpc/-/discord-rpc-1.0.23.tgz", + "integrity": "sha512-C5J84PO0874QpBumc5z208y+Vn4OBDVjmnOKWavp/CAEkXjV6sLfgVFDnUjEPvQ08gv81lrxFNaU+jCqMFnNdQ==", "dependencies": { - "axios": "^1.4.0", - "discord-api-types": "^0.37.52", - "ws": "^8.13.0" + "axios": "^1.5.1", + "discord-api-types": "^0.37.58", + "ws": "^8.14.2" }, "engines": { "node": ">=14.18.0" @@ -2317,9 +2317,9 @@ } }, "node_modules/axios": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", - "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", + "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -3492,9 +3492,9 @@ } }, "node_modules/discord-api-types": { - "version": "0.37.56", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.56.tgz", - "integrity": "sha512-Ih3wj0ZTaQxaJRqUEXHMIXfXB86bwMGC0wc2nNsyCJqeo3lC4qnxXtFIsC+IGI46+dSIinuayCAZ6sLEEM02Bw==" + "version": "0.37.59", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.59.tgz", + "integrity": "sha512-75CxNb6dtxlgsIa3mD2ohoDLIZLMv/upsadRCYlqv2UgPTJ/p2MzSSbrH2AGBvL90/fAsB6fj8hCPOWzBkPkZQ==" }, "node_modules/dmg-builder": { "version": "24.6.4", @@ -3698,9 +3698,9 @@ } }, "node_modules/electron": { - "version": "27.0.0-beta.8", - "resolved": "https://registry.npmjs.org/electron/-/electron-27.0.0-beta.8.tgz", - "integrity": "sha512-aVO29/8AJN1OVH3Gj61hnAdBbh3nhvVDU6fpQUU+DFrh79yow82vQ2SwyGRgIQQygnj0wK2wGbHXFsOANxaVGg==", + "version": "27.0.0-beta.9", + "resolved": "https://registry.npmjs.org/electron/-/electron-27.0.0-beta.9.tgz", + "integrity": "sha512-4h78B843eYU2oh2yMjrwYtl5aVMiFdpurIwtoZvXpfTwyuKiEOQaylmLbi4+sPg1rCmqW/VLv9hfVlOqHDNj/Q==", "hasInstallScript": true, "dependencies": { "@electron/get": "^2.0.0", @@ -4770,9 +4770,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", "funding": [ { "type": "individual", @@ -9182,9 +9182,9 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", "engines": { "node": ">=10.0.0" }, @@ -9317,9 +9317,9 @@ } }, "node_modules/youtubei.js": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/youtubei.js/-/youtubei.js-6.4.0.tgz", - "integrity": "sha512-c3Hj+9JmMchVWusVOubHDNrvKybzai1vWzZsVIZ9oxt74W0zaP78S0pPW21i/RnVBx29rAA2+ojs56b/REP/1A==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/youtubei.js/-/youtubei.js-6.4.1.tgz", + "integrity": "sha512-GVrDkJmF5t378SeDiZPEAoegZ1pxjbEzNyXTuiQnL5LzPSZKA3IoJwL8lBNlRMKyksI5RbieoHzULsEt4AIbFw==", "funding": [ "https://github.com/sponsors/LuanRT" ], diff --git a/package.json b/package.json index 8e09486a..6c3fdff5 100644 --- a/package.json +++ b/package.json @@ -136,7 +136,7 @@ "@ffmpeg.wasm/core-mt": "0.12.0", "@ffmpeg.wasm/main": "0.12.0", "@foobar404/wave": "2.0.4", - "@xhayper/discord-rpc": "1.0.22", + "@xhayper/discord-rpc": "1.0.23", "async-mutex": "0.4.0", "butterchurn": "2.6.7", "butterchurn-presets": "2.4.7", @@ -159,14 +159,14 @@ "node-id3": "0.2.6", "simple-youtube-age-restriction-bypass": "git+https://github.com/MiepHD/Simple-YouTube-Age-Restriction-Bypass.git#v2.5.5", "vudio": "2.1.1", - "youtubei.js": "6.4.0", + "youtubei.js": "6.4.1", "ytpl": "2.3.0" }, "overrides": { "xml2js": "0.6.2", "node-fetch": "2.7.0", "@electron/universal": "1.4.2", - "electron": "27.0.0-beta.8" + "electron": "27.0.0-beta.9" }, "devDependencies": { "@playwright/test": "1.38.1", @@ -174,11 +174,11 @@ "@types/electron-localshortcut": "3.1.1", "@types/howler": "2.2.9", "@types/html-to-text": "9.0.2", - "@typescript-eslint/eslint-plugin": "6.7.3", + "@typescript-eslint/eslint-plugin": "6.7.4", "auto-changelog": "2.4.0", "copyfiles": "2.4.1", "del-cli": "5.1.0", - "electron": "27.0.0-beta.8", + "electron": "27.0.0-beta.9", "electron-builder": "24.6.4", "electron-devtools-installer": "3.2.0", "eslint": "8.50.0",