diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4166a704..377dc1c7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,18 +13,18 @@ jobs: os: [macos-latest, ubuntu-latest, windows-latest] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Setup NodeJS - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: - node-version: "14.x" + node-version: "16.x" - name: Get yarn cache directory path id: yarn-cache-dir-path run: echo "::set-output name=dir::$(yarn cache dir)" - - uses: actions/cache@v2 + - uses: actions/cache@v3 id: yarn-cache with: path: ${{ steps.yarn-cache-dir-path.outputs.dir }} diff --git a/assets/youtube-music-tray.png b/assets/youtube-music-tray.png index 5e947ca1..bd53e7dc 100644 Binary files a/assets/youtube-music-tray.png and b/assets/youtube-music-tray.png differ diff --git a/config/defaults.js b/config/defaults.js index 0a920895..b4d52923 100644 --- a/config/defaults.js +++ b/config/defaults.js @@ -80,6 +80,7 @@ const defaultConfig = { }, "video-toggle": { enabled: false, + mode: "custom", forceHide: false, }, }, diff --git a/config/store.js b/config/store.js index 0b20693e..7ccd9f9f 100644 --- a/config/store.js +++ b/config/store.js @@ -3,6 +3,11 @@ const Store = require("electron-store"); const defaults = require("./defaults"); const migrations = { + ">=1.17.0": (store) => { + if (store.get("plugins.video-toggle.mode") === undefined) { + store.set("plugins.video-toggle.mode", "custom"); + } + }, ">=1.14.0": (store) => { if ( typeof store.get("plugins.precise-volume.globalShortcuts") !== "object" diff --git a/index.js b/index.js index b7d5e99f..8e1e14d8 100644 --- a/index.js +++ b/index.js @@ -175,7 +175,12 @@ function createMainWindow() { win.on("move", () => { if (win.isMaximized()) return; let position = win.getPosition(); - lateSave("window-position", { x: position[0], y: position[1] }); + 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] }); + } }); let winWasMaximized; @@ -188,7 +193,10 @@ function createMainWindow() { winWasMaximized = isMaximized; config.set("window-maximized", isMaximized); } - if (!isMaximized) { + const isPiPEnabled = + config.plugins.isEnabled("picture-in-picture") && + config.plugins.getOptions("picture-in-picture")["isInPiP"]; + if (!isMaximized && !isPiPEnabled) { lateSave("window-size", { width: windowSize[0], height: windowSize[1], diff --git a/menu.js b/menu.js index 5f6a112c..ad0e12f8 100644 --- a/menu.js +++ b/menu.js @@ -52,6 +52,7 @@ const mainMenuTemplate = (win) => { label: plugin, submenu: [ pluginEnabledMenu(plugin, "Enabled", true, refreshMenu), + { type: "separator" }, ...getPluginMenu(win, config.plugins.getOptions(plugin), refreshMenu), ], }; diff --git a/package.json b/package.json index ee90968b..7d4f37aa 100644 --- a/package.json +++ b/package.json @@ -92,13 +92,14 @@ "npm": "Please use yarn and not npm" }, "dependencies": { - "@cliqz/adblocker-electron": "^1.23.5", + "@cliqz/adblocker-electron": "^1.23.7", "@ffmpeg/core": "^0.10.0", "@ffmpeg/ffmpeg": "^0.10.1", + "Simple-YouTube-Age-Restriction-Bypass": "https://gitpkg.now.sh/zerodytrash/Simple-YouTube-Age-Restriction-Bypass/dist?v2.4.6", "async-mutex": "^0.3.2", "browser-id3-writer": "^4.4.0", "chokidar": "^3.5.3", - "custom-electron-prompt": "^1.4.1", + "custom-electron-prompt": "^1.4.2", "custom-electron-titlebar": "^4.1.0", "discord-rpc": "^4.0.1", "electron-better-web-request": "^1.0.1", @@ -110,6 +111,7 @@ "electron-updater": "^4.6.3", "filenamify": "^4.3.0", "hark": "^1.2.3", + "html-to-text": "^8.2.0", "md5": "^2.3.0", "mpris-service": "^2.1.2", "node-fetch": "^2.6.7", @@ -120,7 +122,7 @@ "devDependencies": { "auto-changelog": "^2.4.0", "electron": "^18.2.0", - "electron-builder": "^22.14.5", + "electron-builder": "^23.0.3", "electron-devtools-installer": "^3.1.1", "electron-icon-maker": "0.0.5", "jest": "^27.3.1", @@ -130,7 +132,7 @@ }, "resolutions": { "glob-parent": "5.1.2", - "minimist": "1.2.5", + "minimist": "1.2.6", "yargs-parser": "18.1.3" }, "auto-changelog": { diff --git a/plugins/bypass-age-restrictions/front.js b/plugins/bypass-age-restrictions/front.js new file mode 100644 index 00000000..381fa656 --- /dev/null +++ b/plugins/bypass-age-restrictions/front.js @@ -0,0 +1,4 @@ +module.exports = () => { + // See https://github.com/zerodytrash/Simple-YouTube-Age-Restriction-Bypass#userscript + require("simple-youtube-age-restriction-bypass/Simple-YouTube-Age-Restriction-Bypass.user.js"); +}; diff --git a/plugins/downloader/back.js b/plugins/downloader/back.js index 060245ed..daea62b2 100644 --- a/plugins/downloader/back.js +++ b/plugins/downloader/back.js @@ -8,7 +8,9 @@ const registerCallback = require("../../providers/song-info"); const { injectCSS, listenAction } = require("../utils"); const { cropMaxWidth } = require("./utils"); const { ACTIONS, CHANNEL } = require("./actions.js"); +const { isEnabled } = require("../../config/plugins"); const { getImage } = require("../../providers/song-info"); +const { fetchFromGenius } = require("../lyrics-genius/back"); const sendError = (win, error) => { win.setProgressBar(-1); // close progress bar @@ -71,6 +73,15 @@ function handle(win) { description: "" }); } + if (isEnabled("lyrics-genius")) { + const lyrics = await fetchFromGenius(songMetadata); + if (lyrics) { + writer.setFrame("USLT", { + description: lyrics, + lyrics: lyrics, + }); + } + } writer.addTag(); fileBuffer = Buffer.from(writer.arrayBuffer); } catch (error) { diff --git a/plugins/in-app-menu/front.js b/plugins/in-app-menu/front.js index aa025f3d..bef60632 100644 --- a/plugins/in-app-menu/front.js +++ b/plugins/in-app-menu/front.js @@ -3,7 +3,7 @@ const config = require("../../config"); const { Titlebar, Color } = require("custom-electron-titlebar"); function $(selector) { return document.querySelector(selector); } -module.exports = () => { +module.exports = (options) => { let visible = !config.get("options.hideMenu"); const bar = new Titlebar({ backgroundColor: Color.fromHex("#050505"), @@ -14,6 +14,10 @@ module.exports = () => { bar.updateTitle(" "); document.title = "Youtube Music"; + const hideIcon = hide => $('.cet-window-icon').style.display = hide ? 'none' : 'flex'; + + if (options.hideIcon) hideIcon(true); + ipcRenderer.on("refreshMenu", (_, showMenu) => { if (showMenu === undefined && !visible) return; if (showMenu === false) { @@ -25,6 +29,8 @@ module.exports = () => { } }); + ipcRenderer.on("hideIcon", (_, hide) => hideIcon(hide)); + // 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(); diff --git a/plugins/in-app-menu/menu.js b/plugins/in-app-menu/menu.js new file mode 100644 index 00000000..dbfd88a3 --- /dev/null +++ b/plugins/in-app-menu/menu.js @@ -0,0 +1,14 @@ +const { setOptions } = require("../../config/plugins"); + +module.exports = (win, options) => [ + { + label: "Hide Icon", + type: "checkbox", + checked: options.hideIcon, + click: (item) => { + win.webContents.send("hideIcon", item.checked); + options.hideIcon = item.checked; + setOptions("in-app-menu", options); + }, + } +]; diff --git a/plugins/in-app-menu/style.css b/plugins/in-app-menu/style.css index 8c13c62b..fd0e8a84 100644 --- a/plugins/in-app-menu/style.css +++ b/plugins/in-app-menu/style.css @@ -57,10 +57,10 @@ yt-page-navigation-progress, /* The scrollbar 'thumb' ...that marque oval shape in a scrollbar */ ::-webkit-scrollbar-thumb:vertical { - background-clip: padding-box; 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; @@ -71,3 +71,7 @@ yt-page-navigation-progress, -moz-border-radius: 100px; -webkit-border-radius: 100px; } + +.cet-menubar-menu-container .cet-action-item { + background-color: inherit +} diff --git a/plugins/last-fm/back.js b/plugins/last-fm/back.js index 567dccc0..a0533d17 100644 --- a/plugins/last-fm/back.js +++ b/plugins/last-fm/back.js @@ -89,6 +89,7 @@ const postSongDataToAPI = async (songInfo, config, data) => { 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', @@ -157,4 +158,4 @@ const lastfm = async (_win, config) => { }); } -module.exports = lastfm; \ No newline at end of file +module.exports = lastfm; diff --git a/plugins/lyrics-genius/back.js b/plugins/lyrics-genius/back.js index 9991ab78..05548648 100644 --- a/plugins/lyrics-genius/back.js +++ b/plugins/lyrics-genius/back.js @@ -2,6 +2,7 @@ const { join } = require("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"); @@ -12,15 +13,14 @@ module.exports = async (win) => { ipcMain.on("search-genius-lyrics", async (event, extractedSongInfo) => { const metadata = JSON.parse(extractedSongInfo); - const queryString = `${cleanupName(metadata.artist)} ${cleanupName( - metadata.title - )}`; - - event.returnValue = await fetchFromGenius(queryString); + event.returnValue = await fetchFromGenius(metadata); }); }; -const fetchFromGenius = async (queryString) => { +const fetchFromGenius = async (metadata) => { + const queryString = `${cleanupName(metadata.artist)} ${cleanupName( + metadata.title + )}`; let response = await fetch( `https://genius.com/api/search/multi?per_page=5&q=${encodeURI(queryString)}` ); @@ -46,5 +46,26 @@ const fetchFromGenius = async (queryString) => { return null; } - return await response.text(); + 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; }; + +module.exports.fetchFromGenius = fetchFromGenius; diff --git a/plugins/lyrics-genius/front.js b/plugins/lyrics-genius/front.js index d000a13c..c62bfb0c 100644 --- a/plugins/lyrics-genius/front.js +++ b/plugins/lyrics-genius/front.js @@ -17,11 +17,11 @@ module.exports = () => { let hasLyrics = true; - const html = ipcRenderer.sendSync( + const lyrics = ipcRenderer.sendSync( "search-genius-lyrics", extractedSongInfo ); - if (!html) { + if (!lyrics) { // Delete previous lyrics if tab is open and couldn't get new lyrics checkLyricsContainer(() => { hasLyrics = false; @@ -34,16 +34,6 @@ module.exports = () => { console.log("Fetched lyrics from Genius"); } - const wrapper = document.createElement("div"); - wrapper.innerHTML = html; - - const lyrics = [...wrapper.querySelectorAll('[class^="Lyrics__Container"]')].map(d => d.innerHTML).join('
') - || wrapper.querySelector(".lyrics")?.innerHTML; - - if (!lyrics) { - return; - } - enableLyricsTab(); setTabsOnclick(enableLyricsTab); @@ -73,9 +63,12 @@ module.exports = () => { } function setLyrics(lyricsContainer) { - lyricsContainer.innerHTML = - `
- ${hasLyrics ? lyrics : 'Could not retrieve lyrics from genius'} + lyricsContainer.innerHTML = `
+ ${ + hasLyrics + ? lyrics.replace(/(?:\r\n|\r|\n)/g, "
") + : "Could not retrieve lyrics from genius" + }
`; diff --git a/plugins/navigation/style.css b/plugins/navigation/style.css index 28693ba8..5c4b4b5d 100644 --- a/plugins/navigation/style.css +++ b/plugins/navigation/style.css @@ -3,7 +3,6 @@ font-size: 20px; line-height: var(--ytmusic-title-1_-_line-height); font-weight: 500; - color: #fff; --yt-endpoint-color: #fff; --yt-endpoint-hover-color: #fff; --yt-endpoint-visited-color: #fff; diff --git a/plugins/picture-in-picture/back.js b/plugins/picture-in-picture/back.js new file mode 100644 index 00000000..7cda241f --- /dev/null +++ b/plugins/picture-in-picture/back.js @@ -0,0 +1,79 @@ +const path = require("path"); + +const { app, ipcMain } = require("electron"); + +const { setOptions } = require("../../config/plugins"); +const { injectCSS } = require("../utils"); + +let isInPiPMode = false; +let originalPosition; +let originalSize; + +const pipPosition = [10, 10]; +const pipSize = [450, 275]; + +const togglePiP = async (win) => { + isInPiPMode = !isInPiPMode; + setOptions("picture-in-picture", { isInPiP: isInPiPMode }); + + if (isInPiPMode) { + originalPosition = win.getPosition(); + originalSize = win.getSize(); + + win.webContents.on("before-input-event", blockShortcutsInPiP); + + win.setFullScreenable(false); + await win.webContents.executeJavaScript( + // Go fullscreen + ` + if (!document.querySelector("ytmusic-player-page").playerPageOpen_) { + document.querySelector(".toggle-player-page-button").click(); + } + document.querySelector(".fullscreen-button").click(); + document.querySelector("ytmusic-player-bar").classList.add("pip"); + ` + ); + win.setFullScreenable(true); + + app.dock?.hide(); + win.setVisibleOnAllWorkspaces(true, { + visibleOnFullScreen: true, + }); + app.dock?.show(); + win.setAlwaysOnTop(true, "screen-saver", 1); + } else { + win.webContents.removeListener("before-input-event", blockShortcutsInPiP); + + await win.webContents.executeJavaScript( + // Exit fullscreen + ` + document.querySelector(".exit-fullscreen-button").click(); + document.querySelector("ytmusic-player-bar").classList.remove("pip"); + ` + ); + + win.setVisibleOnAllWorkspaces(false); + win.setAlwaysOnTop(false); + } + + const [x, y] = isInPiPMode ? pipPosition : originalPosition; + const [w, h] = isInPiPMode ? pipSize : originalSize; + win.setPosition(x, y); + win.setSize(w, h); + + win.setWindowButtonVisibility?.(!isInPiPMode); +}; + +module.exports = (win) => { + injectCSS(win.webContents, path.join(__dirname, "style.css")); + ipcMain.on("picture-in-picture", async () => { + await togglePiP(win); + }); +}; + +const blockShortcutsInPiP = (event, input) => { + const blockedShortcuts = ["f", "escape"]; + if (blockedShortcuts.includes(input.key.toLowerCase())) { + event.preventDefault(); + } +}; diff --git a/plugins/picture-in-picture/front.js b/plugins/picture-in-picture/front.js new file mode 100644 index 00000000..637c7fb6 --- /dev/null +++ b/plugins/picture-in-picture/front.js @@ -0,0 +1,42 @@ +const { ipcRenderer } = require("electron"); + +const { getSongMenu } = require("../../providers/dom-elements"); +const { ElementFromFile, templatePath } = require("../utils"); + +let menu = null; +const pipButton = ElementFromFile( + templatePath(__dirname, "picture-in-picture.html") +); + +const observer = new MutationObserver(() => { + if (!menu) { + menu = getSongMenu(); + if (!menu) return; + } + if (menu.contains(pipButton)) return; + const menuUrl = document.querySelector( + 'tp-yt-paper-listbox [tabindex="0"] #navigation-endpoint' + )?.href; + if (menuUrl && !menuUrl.includes("watch?")) return; + + menu.prepend(pipButton); +}); + +global.togglePictureInPicture = () => { + ipcRenderer.send("picture-in-picture"); +}; + +function observeMenu(options) { + document.addEventListener( + "apiLoaded", + () => { + observer.observe(document.querySelector("ytmusic-popup-container"), { + childList: true, + subtree: true, + }); + }, + { once: true, passive: true } + ); +} + +module.exports = observeMenu; diff --git a/plugins/picture-in-picture/style.css b/plugins/picture-in-picture/style.css new file mode 100644 index 00000000..adb962d8 --- /dev/null +++ b/plugins/picture-in-picture/style.css @@ -0,0 +1,11 @@ +ytmusic-player-bar.pip svg, +ytmusic-player-bar.pip yt-formatted-string { + filter: drop-shadow(2px 4px 6px black); + color: white; +} + +ytmusic-player-bar.pip ytmusic-player-expanding-menu { + border-radius: 30px; + background-color: rgba(0, 0, 0, 0.3); + backdrop-filter: blur(5px) brightness(20%); +} diff --git a/plugins/picture-in-picture/templates/picture-in-picture.html b/plugins/picture-in-picture/templates/picture-in-picture.html new file mode 100644 index 00000000..6dd0440c --- /dev/null +++ b/plugins/picture-in-picture/templates/picture-in-picture.html @@ -0,0 +1,51 @@ + diff --git a/plugins/playback-speed/front.js b/plugins/playback-speed/front.js index 5755ad19..6f972d14 100644 --- a/plugins/playback-speed/front.js +++ b/plugins/playback-speed/front.js @@ -85,7 +85,7 @@ function forcePlaybackRate(e) { } module.exports = () => { - document.addEventListener('apiLoaded', e => { + document.addEventListener('apiLoaded', () => { observePopupContainer(); observeVideo(); setupWheelListener(); diff --git a/plugins/precise-volume/preload.js b/plugins/precise-volume/preload.js index 6a0fd482..31ae2f84 100644 --- a/plugins/precise-volume/preload.js +++ b/plugins/precise-volume/preload.js @@ -1,4 +1,3 @@ -const { ipcRenderer } = require("electron"); const is = require("electron-is"); let ignored = { diff --git a/plugins/skip-silences/front.js b/plugins/skip-silences/front.js index d7a8514c..77414eb9 100644 --- a/plugins/skip-silences/front.js +++ b/plugins/skip-silences/front.js @@ -3,7 +3,7 @@ const hark = require("hark/hark.bundle.js"); module.exports = () => { let isSilent = false; - document.addEventListener("apiLoaded", (apiEvent) => { + document.addEventListener("apiLoaded", () => { const video = document.querySelector("video"); const speechEvents = hark(video, { threshold: -100, // dB (-100 = absolute silence, 0 = loudest) diff --git a/plugins/utils.js b/plugins/utils.js index b265692f..735af3b9 100644 --- a/plugins/utils.js +++ b/plugins/utils.js @@ -42,15 +42,22 @@ module.exports.fileExists = (path, callbackIfExists) => { }); }; +const cssToInject = new Map(); module.exports.injectCSS = (webContents, filepath, cb = undefined) => { - webContents.on("did-finish-load", async () => { - await webContents.insertCSS(fs.readFileSync(filepath, "utf8")); - if (cb) { - cb(); - } - }); + if (!cssToInject.size) 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 diff --git a/plugins/video-toggle/back.js b/plugins/video-toggle/back.js index a56e61cf..b57f0722 100644 --- a/plugins/video-toggle/back.js +++ b/plugins/video-toggle/back.js @@ -4,7 +4,7 @@ const path = require("path"); module.exports = (win, options) => { if (options.forceHide) { injectCSS(win.webContents, path.join(__dirname, "force-hide.css")); - } else { + } 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 0029f921..626d3bd1 100644 --- a/plugins/video-toggle/button-switcher.css +++ b/plugins/video-toggle/button-switcher.css @@ -75,3 +75,8 @@ transform: translateX(0); transition: transform 300ms; } + +/* disable the native toggler */ +#av-id { + display: none; +} diff --git a/plugins/video-toggle/front.js b/plugins/video-toggle/front.js index 1226f640..ab82aef1 100644 --- a/plugins/video-toggle/front.js +++ b/plugins/video-toggle/front.js @@ -14,9 +14,24 @@ const switchButtonDiv = ElementFromFile( module.exports = (_options) => { if (_options.forceHide) return; - options = _options; - document.addEventListener('apiLoaded', setup, { once: true, passive: true }); -} + 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; @@ -25,8 +40,6 @@ function setup(e) { $('ytmusic-player-page').prepend(switchButtonDiv); - $('#song-image.ytmusic-player').style.display = "block"; - if (options.hideVideo) { $('.video-switch-button-checkbox').checked = false; changeDisplay(false); @@ -50,7 +63,10 @@ function setup(e) { function changeDisplay(showVideo) { player.style.margin = showVideo ? '' : 'auto 0px'; player.setAttribute('playback-mode', showVideo ? 'OMV_PREFERRED' : 'ATV_PREFERRED'); - $('#song-video.ytmusic-player').style.display = showVideo ? 'unset' : 'none'; + + $('#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`; } diff --git a/plugins/video-toggle/menu.js b/plugins/video-toggle/menu.js index fb539405..2cf4be0a 100644 --- a/plugins/video-toggle/menu.js +++ b/plugins/video-toggle/menu.js @@ -1,6 +1,38 @@ 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: "Force Remove Video Tab", type: "checkbox", diff --git a/readme.md b/readme.md index 2700d9f8..9dd37bfb 100644 --- a/readme.md +++ b/readme.md @@ -41,6 +41,8 @@ Install the `youtube-music-bin` package from the AUR. For AUR installation instr - **Blur Nav Bar**: makes navigation bar transparent and blurry +- **Bypass age restrictions**: bypass YouTube's age verification + - **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) @@ -63,6 +65,8 @@ Install the `youtube-music-bin` package from the AUR. For AUR installation instr - **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) - **Precise Volume**: Control the volume precisely using mousewheel/hotkeys, with a custom hud and customizable volume steps diff --git a/web/screenshot.jpg b/web/screenshot.jpg index 80bdb47a..55ec5860 100644 Binary files a/web/screenshot.jpg and b/web/screenshot.jpg differ diff --git a/yarn.lock b/yarn.lock index 588a0d6d..d7b96ea8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -650,45 +650,45 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@cliqz/adblocker-content@^1.23.6": - version "1.23.6" - resolved "https://registry.yarnpkg.com/@cliqz/adblocker-content/-/adblocker-content-1.23.6.tgz#649c32143b3338d1d2206540bb0ea307aa073d90" - integrity sha512-rzFAtp8nGc6bbQoSjN6Xo0l1OHzqS9Z86nlyFD3yLsd9g2d/CLnx0WFDVsk6iE+N9yu2UpHbgWT+siShF0rHqw== +"@cliqz/adblocker-content@^1.23.7": + version "1.23.7" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker-content/-/adblocker-content-1.23.7.tgz#21a1035e479d8f4dc4e7ecc2500cf8a4149eaace" + integrity sha512-tgCFcWhBty+WI3ObYBLDk56i1G7nScd5TBAOXlQf2EIbVJ+DC+G0YE91YHhQpzfy4ySI/wRGyEHrKzTRgmkuKQ== dependencies: - "@cliqz/adblocker-extended-selectors" "^1.23.6" + "@cliqz/adblocker-extended-selectors" "^1.23.7" -"@cliqz/adblocker-electron-preload@^1.23.6": - version "1.23.6" - resolved "https://registry.yarnpkg.com/@cliqz/adblocker-electron-preload/-/adblocker-electron-preload-1.23.6.tgz#7f8db3df95afb385917df00ec5300847448437d1" - integrity sha512-xVBrIqfvcuh2Y07ZkEogzgkyqJuZvOqhRoFnuTyW2q97AmWAGLT6IjEGjl/vX7vMP0Y1b8wubdjI3VHnKvNKDg== +"@cliqz/adblocker-electron-preload@^1.23.7": + version "1.23.7" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker-electron-preload/-/adblocker-electron-preload-1.23.7.tgz#6aff5198c518c2d35f67a34bd213664a2a86e3ae" + integrity sha512-bGWf4r5q4savAGs3Kl4aR7XBH4J9AmrErDmcYu+tJk9V3rhTGXUi29kMl0D5x2JimhRmnKOeJ/Q2GJSUjvnmsg== dependencies: - "@cliqz/adblocker-content" "^1.23.6" + "@cliqz/adblocker-content" "^1.23.7" -"@cliqz/adblocker-electron@^1.23.5": - version "1.23.6" - resolved "https://registry.yarnpkg.com/@cliqz/adblocker-electron/-/adblocker-electron-1.23.6.tgz#e550f2ffa2b5d0404d0090c3870d0a849d3cd5d8" - integrity sha512-wzkCfBCo5RvRanzsVOu65xHW9GAUDqsg+tP8GYld6/hgMMb96KJZJVpvrvwvsneAm9T55QE4ef1utZbIIwltqA== +"@cliqz/adblocker-electron@^1.23.7": + version "1.23.7" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker-electron/-/adblocker-electron-1.23.7.tgz#8a16c8ad1ee656dc341d0dba5716b38a9f429db2" + integrity sha512-dZKxuHwouzscKFEQwqHCeQOkgeBjmWcXMWUipcfcd+JUquxn3klxRF6aMWiaNcIA8YTIqEPpyiNPPmY/YOyyRg== dependencies: - "@cliqz/adblocker" "^1.23.6" - "@cliqz/adblocker-electron-preload" "^1.23.6" + "@cliqz/adblocker" "^1.23.7" + "@cliqz/adblocker-electron-preload" "^1.23.7" tldts-experimental "^5.6.21" -"@cliqz/adblocker-extended-selectors@^1.23.6": - version "1.23.6" - resolved "https://registry.yarnpkg.com/@cliqz/adblocker-extended-selectors/-/adblocker-extended-selectors-1.23.6.tgz#fed9c3973553751f1ecae2397ceff60d364a6e11" - integrity sha512-qnn2LrE/0YswjL4399M1ldKityLxDT9r/b9MUOPboz+4EiE/ew6hTl35yNg2g8nZU3tXSzrnvAYcqLw607kSYg== +"@cliqz/adblocker-extended-selectors@^1.23.7": + version "1.23.7" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker-extended-selectors/-/adblocker-extended-selectors-1.23.7.tgz#4782829c97b7ed229789a14d4e39b2339825077d" + integrity sha512-3y1eeHHZS3qvvv3dDZDjVVr6g03GeUBbDExCW/GOiHdo+qKYmM2K40EaLN+Upzc2ppuum9UKvzsHxG8Hs9R/kQ== -"@cliqz/adblocker@^1.23.6": - version "1.23.6" - resolved "https://registry.yarnpkg.com/@cliqz/adblocker/-/adblocker-1.23.6.tgz#741ee9a1fde2e75920204c120200704252932e02" - integrity sha512-+Ojm25XwIkiD0THvf+WHZ3+zq65DuES7B6XlsMpbYC0JD8J9crpswLHsAmj97o0KVN+vmK2fYrqa2DgOUnFzYg== +"@cliqz/adblocker@^1.23.7": + version "1.23.7" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker/-/adblocker-1.23.7.tgz#d439fe8b62d2789c274b5e124cddb930de25f59a" + integrity sha512-HUvC7CcmNbcIftcRhFeuQhHSpyNdOVdXazXDL0+avvWR0cxlI9zcC8yHMRKjxeY6nsiOXdyEFby+V5KgJvfwaQ== dependencies: - "@cliqz/adblocker-content" "^1.23.6" - "@cliqz/adblocker-extended-selectors" "^1.23.6" + "@cliqz/adblocker-content" "^1.23.7" + "@cliqz/adblocker-extended-selectors" "^1.23.7" "@remusao/guess-url-type" "^1.1.2" "@remusao/small" "^1.1.2" "@remusao/smaz" "^1.7.1" - "@types/chrome" "^0.0.178" + "@types/chrome" "^0.0.180" "@types/firefox-webext-browser" "^94.0.0" tldts-experimental "^5.6.21" @@ -716,16 +716,18 @@ global-agent "^3.0.0" global-tunnel-ng "^2.7.1" -"@electron/universal@1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.0.5.tgz#b812340e4ef21da2b3ee77b2b4d35c9b86defe37" - integrity sha512-zX9O6+jr2NMyAdSkwEUlyltiI4/EBLu2Ls/VD3pUQdi3cAYeYfdQnT2AJJ38HE4QxLccbU13LSpccw1IWlkyag== +"@electron/universal@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.2.0.tgz#518cac72bccd79c00bf41345119e6fdbabdb871d" + integrity sha512-eu20BwNsrMPKoe2bZ3/l9c78LclDvxg3PlVXrQf3L50NaUuW5M59gbPytI+V4z7/QMrohUHetQaU0ou+p1UG9Q== dependencies: "@malept/cross-spawn-promise" "^1.1.0" - asar "^3.0.3" + asar "^3.1.0" debug "^4.3.1" dir-compare "^2.4.0" fs-extra "^9.0.1" + minimatch "^3.0.4" + plist "^3.0.4" "@eslint/eslintrc@^0.4.3": version "0.4.3" @@ -1339,6 +1341,14 @@ resolved "https://registry.yarnpkg.com/@remusao/trie/-/trie-1.4.1.tgz#755d09f8a007476334e611f42719b2d581f00720" integrity sha512-yvwa+aCyYI/UjeD39BnpMypG8N06l86wIDW1/PAc6ihBRnodIfZDwccxQN3n1t74wduzaz74m4ZMHZnB06567Q== +"@selderee/plugin-htmlparser2@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.6.0.tgz#27e994afd1c2cb647ceb5406a185a5574188069d" + integrity sha512-J3jpy002TyBjd4N/p6s+s90eX42H2eRhK3SbsZuvTDv977/E8p2U3zikdiehyJja66do7FlxLomZLPlvl2/xaA== + dependencies: + domhandler "^4.2.0" + selderee "^0.6.0" + "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" @@ -1370,6 +1380,11 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + "@types/babel__core@^7.0.0": version "7.1.12" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.12.tgz#4d8e9e51eb265552a7e4f1ff2219ab6133bdfb2d" @@ -1414,10 +1429,10 @@ dependencies: "@babel/types" "^7.3.0" -"@types/chrome@^0.0.178": - version "0.0.178" - resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.178.tgz#fba7969208cef79ae752dc1138ff05de39f5ffde" - integrity sha512-U+G5YG2pH0qvLrYVJ9aT5VbPXYR3fAFyCuRBRAA14Pv7GrkFzDJuXPspgdeLYaKzGEp4rymUkuqUOuFz18LI1g== +"@types/chrome@^0.0.180": + version "0.0.180" + resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.180.tgz#b7fb831848f6b6c49abffd85410b73037c02381e" + integrity sha512-A/CuuKAaHq2CHEpYBAtl0lp2ib7TTXK7VjJI4q+c+1U/HDvZLJ8IlsdEDzzHdvkNdh36bGONxrMnO9YZrKqbAw== dependencies: "@types/filesystem" "*" "@types/har-format" "*" @@ -1679,6 +1694,10 @@ "@typescript-eslint/types" "4.33.0" eslint-visitor-keys "^2.0.0" +"Simple-YouTube-Age-Restriction-Bypass@https://gitpkg.now.sh/zerodytrash/Simple-YouTube-Age-Restriction-Bypass/dist?v2.4.6": + version "0.0.0" + resolved "https://gitpkg.now.sh/zerodytrash/Simple-YouTube-Age-Restriction-Bypass/dist?v2.4.6#ac26ebb688667ce4ec6566ffbd3a75dbe2ac9a55" + abab@^2.0.3, abab@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" @@ -1858,29 +1877,29 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -app-builder-bin@3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-3.7.1.tgz#cb0825c5e12efc85b196ac3ed9c89f076c61040e" - integrity sha512-ql93vEUq6WsstGXD+SBLSIQw6SNnhbDEM0swzgugytMxLp3rT24Ag/jcC80ZHxiPRTdew1niuR7P3/FCrDqIjw== +app-builder-bin@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-4.0.0.tgz#1df8e654bd1395e4a319d82545c98667d7eed2f0" + integrity sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA== -app-builder-lib@22.14.5: - version "22.14.5" - resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-22.14.5.tgz#a61a50b132b858e98fdc70b6b88994ae99b4f96d" - integrity sha512-k3VwKP4kpsnUaXoUkm1s4zaSHPHIMFnN4kPMU9yXaKmE1LfHHqBaEah5bXeTAX5V/BC41wFdg8CF5vOjvgy8Rg== +app-builder-lib@23.0.3: + version "23.0.3" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-23.0.3.tgz#44c90237abdc4ad9b34a24658bee022828ad6205" + integrity sha512-1qrtXYHXJfXhzJnMtVGjIva3067F1qYQubl2oBjI61gCBoCHvhghdYJ57XxXTQQ0VxnUhg1/Iaez87uXp8mD8w== dependencies: "7zip-bin" "~5.1.1" "@develar/schema-utils" "~2.6.5" - "@electron/universal" "1.0.5" + "@electron/universal" "1.2.0" "@malept/flatpak-bundler" "^0.4.0" async-exit-hook "^2.0.1" bluebird-lst "^1.0.9" - builder-util "22.14.5" - builder-util-runtime "8.9.1" + builder-util "23.0.2" + builder-util-runtime "9.0.0" chromium-pickle-js "^0.2.0" debug "^4.3.2" ejs "^3.1.6" - electron-osx-sign "^0.5.0" - electron-publish "22.14.5" + electron-osx-sign "^0.6.0" + electron-publish "23.0.2" form-data "^4.0.0" fs-extra "^10.0.0" hosted-git-info "^4.0.2" @@ -1974,10 +1993,10 @@ arrify@^3.0.0: resolved "https://registry.yarnpkg.com/arrify/-/arrify-3.0.0.tgz#ccdefb8eaf2a1d2ab0da1ca2ce53118759fd46bc" integrity sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw== -asar@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/asar/-/asar-3.0.3.tgz#1fef03c2d6d2de0cbad138788e4f7ae03b129c7b" - integrity sha512-k7zd+KoR+n8pl71PvgElcoKHrVNiSXtw7odKbyNpmgKe7EGRF9Pnu3uLOukD37EvavKwVFxOUpqXTIZC5B5Pmw== +asar@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/asar/-/asar-3.1.0.tgz#70b0509449fe3daccc63beb4d3c7d2e24d3c6473" + integrity sha512-vyxPxP5arcAqN4F/ebHd/HhwnAiZtwhglvdmc7BR2f0ywbVNTOpSeyhLDbGXtE/y58hv1oC75TaNIXutnsOZsQ== dependencies: chromium-pickle-js "^0.2.0" commander "^5.0.0" @@ -2015,10 +2034,10 @@ async-mutex@^0.3.2: dependencies: tslib "^2.3.1" -async@0.9.x: - version "0.9.2" - resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" - integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= +async@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9" + integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g== asynckit@^0.4.0: version "0.4.0" @@ -2118,9 +2137,9 @@ babel-preset-jest@^27.2.0: babel-preset-current-node-syntax "^1.0.0" balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" @@ -2190,6 +2209,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^3.0.1, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -2282,14 +2308,6 @@ buffer@^5.1.0, buffer@^5.2.0: base64-js "^1.3.1" ieee754 "^1.1.13" -builder-util-runtime@8.9.1: - version "8.9.1" - resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.9.1.tgz#25f066b3fbc20b3e6236a9b956b1ebb0e33ff66a" - integrity sha512-c8a8J3wK6BIVLW7ls+7TRK9igspTbzWmUqxFbgK0m40Ggm6efUbxtWVCGIjc+dtchyr5qAMAUL6iEGRdS/6vwg== - dependencies: - debug "^4.3.2" - sax "^1.2.4" - builder-util-runtime@8.9.2: version "8.9.2" resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.9.2.tgz#a9669ae5b5dcabfe411ded26678e7ae997246c28" @@ -2298,21 +2316,31 @@ builder-util-runtime@8.9.2: debug "^4.3.2" sax "^1.2.4" -builder-util@22.14.5: - version "22.14.5" - resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-22.14.5.tgz#42a18608d2a566c0846e91266464776c8bfb0cc9" - integrity sha512-zqIHDFJwmA7jV7SC9aI+33MWwT2mWoijH+Ol9IntNAwuuRXoS+7XeJwnhLBXOhcDBzXT4kDzHnRk4JKeaygEYA== +builder-util-runtime@9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.0.0.tgz#3a40ba7382712ccdb24471567f91d7c167e00830" + integrity sha512-SkpEtSmTkREDHRJnxKEv43aAYp8sYWY8fxYBhGLBLOBIRXeaIp6Kv3lBgSD7uR8jQtC7CA659sqJrpSV6zNvSA== + dependencies: + debug "^4.3.2" + sax "^1.2.4" + +builder-util@23.0.2: + version "23.0.2" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-23.0.2.tgz#da84a971076397e3a671726f4bb96f0c2214fea7" + integrity sha512-HaNHL3axNW/Ms8O1mDx3I07G+ZnZ/TKSWWvorOAPau128cdt9S+lNx5ocbx8deSaHHX4WFXSZVHh3mxlaKJNgg== dependencies: "7zip-bin" "~5.1.1" "@types/debug" "^4.1.6" "@types/fs-extra" "^9.0.11" - app-builder-bin "3.7.1" + app-builder-bin "4.0.0" bluebird-lst "^1.0.9" - builder-util-runtime "8.9.1" + builder-util-runtime "9.0.0" chalk "^4.1.1" cross-spawn "^7.0.3" debug "^4.3.2" fs-extra "^10.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" is-ci "^3.0.0" js-yaml "^4.1.0" source-map-support "^0.5.19" @@ -2406,7 +2434,7 @@ chalk@1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.4.2: +chalk@^2.0.0: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2423,7 +2451,7 @@ chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.1.1: +chalk@^4.0.2, chalk@^4.1.1: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2589,6 +2617,11 @@ commander@2.9.0: dependencies: graceful-readlink ">= 1.0.0" +commander@^2.19.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + commander@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" @@ -2736,10 +2769,10 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" -custom-electron-prompt@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/custom-electron-prompt/-/custom-electron-prompt-1.4.1.tgz#79adc3d5cd9a372e5dfe43b21de70f0fe7d1c2f7" - integrity sha512-bR6JhEusBxKnooXfFFlIIUhDbF23eaDhaYwvqcw3ZTcdEzzJew63+ilwhIwD7flRAO+sCroaLwP495VBexHg/A== +custom-electron-prompt@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/custom-electron-prompt/-/custom-electron-prompt-1.4.2.tgz#54aa1dc761854bc42ead0e87e0c86b4e55f31c0e" + integrity sha512-n4CMCO2HBR2YVgJg51gkHIEcXEWcfC4kkoXQx3HFR3E5hXBcZY9tizQ+fuhRL9QC2A9Ltkn+H3Nh+qUD85cxAA== custom-electron-titlebar@^4.1.0: version "4.1.0" @@ -2940,6 +2973,11 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +discontinuous-range@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" + integrity sha1-44Mx8IRLukm5qctxx3FYWqsbxlo= + discord-rpc@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/discord-rpc/-/discord-rpc-4.0.1.tgz#a89aa04a048aa83ad4f347d53fa0162501eae0d8" @@ -2950,14 +2988,14 @@ discord-rpc@^4.0.1: optionalDependencies: register-scheme "github:devsnek/node-register-scheme" -dmg-builder@22.14.5: - version "22.14.5" - resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-22.14.5.tgz#137c0b55e639badcc0b119eb060e6fa4ed61d948" - integrity sha512-1GvFGQE332bvPamcMwZDqWqfWfJTyyDLOsHMcGi0zs+Jh7JOn6/zuBkHJIWHdsj2QJbhzLVyd2/ZqttOKv7I8w== +dmg-builder@23.0.3: + version "23.0.3" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-23.0.3.tgz#ea94bc76fcd94612641580f3c6ae42c3f07f3fee" + integrity sha512-mBYrHHnSM5PC656TDE+xTGmXIuWHAGmmRfyM+dV0kP+AxtwPof4pAXNQ8COd0/exZQ4dqf72FiPS3B9G9aB5IA== dependencies: - app-builder-lib "22.14.5" - builder-util "22.14.5" - builder-util-runtime "8.9.1" + app-builder-lib "23.0.3" + builder-util "23.0.2" + builder-util-runtime "9.0.0" fs-extra "^10.0.0" iconv-lite "^0.6.2" js-yaml "^4.1.0" @@ -2993,11 +3031,25 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dom-serializer@^1.0.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" + integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + dom-walk@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + domexception@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" @@ -3005,6 +3057,22 @@ domexception@^2.0.1: dependencies: webidl-conversions "^5.0.0" +domhandler@^4.0.0, domhandler@^4.2.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + +domutils@^2.5.2: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + dot-prop@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" @@ -3048,11 +3116,11 @@ ecc-jsbn@~0.1.1: safer-buffer "^2.1.0" ejs@^3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.6.tgz#5bfd0a0689743bb5268b3550cceeebbc1702822a" - integrity sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw== + version "3.1.7" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.7.tgz#c544d9c7f715783dd92f0bddcf73a59e6962d006" + integrity sha512-BIar7R6abbUxDA3bfXrO4DSgwo8I+fB5/1zgujl3HLLjwd6+9iOnrT+t3grn2qbk9vOgBubXOFwX2m9axoFaGw== dependencies: - jake "^10.6.1" + jake "^10.8.5" electron-better-web-request@^1.0.1: version "1.0.1" @@ -3062,17 +3130,17 @@ electron-better-web-request@^1.0.1: url-match-patterns "^0.2.0" uuid "^3.3.2" -electron-builder@^22.14.5: - version "22.14.5" - resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-22.14.5.tgz#3a25547bd4fe3728d4704da80956a794c5c31496" - integrity sha512-N73hSbXFz6Mz5Z6h6C5ly6CB+dUN6k1LuCDJjI8VF47bMXv/QE0HE+Kkb0GPKqTqM7Hsk/yIYX+kHCfSkR5FGg== +electron-builder@^23.0.3: + version "23.0.3" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-23.0.3.tgz#16264a0d8e3d40da1467bcc8ef7917538b54a3bc" + integrity sha512-0lnTsljAgcOMuIiOjPcoFf+WxOOe/O04hZPgIvvUBXIbz3kolbNu0Xdch1f5WuQ40NdeZI7oqs8Eo395PcuGHQ== dependencies: "@types/yargs" "^17.0.1" - app-builder-lib "22.14.5" - builder-util "22.14.5" - builder-util-runtime "8.9.1" + app-builder-lib "23.0.3" + builder-util "23.0.2" + builder-util-runtime "9.0.0" chalk "^4.1.1" - dmg-builder "22.14.5" + dmg-builder "23.0.3" fs-extra "^10.0.0" is-ci "^3.0.0" lazy-val "^1.0.5" @@ -3144,10 +3212,10 @@ electron-localshortcut@^3.1.0, electron-localshortcut@^3.2.1: keyboardevent-from-electron-accelerator "^2.0.0" keyboardevents-areequal "^0.2.1" -electron-osx-sign@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.5.0.tgz#fc258c5e896859904bbe3d01da06902c04b51c3a" - integrity sha512-icoRLHzFz/qxzDh/N4Pi2z4yVHurlsCAYQvsCSG7fCedJ4UJXBS6PoQyGH71IfcqKupcKeK7HX/NkyfG+v6vlQ== +electron-osx-sign@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.6.0.tgz#9b69c191d471d9458ef5b1e4fdd52baa059f1bb8" + integrity sha512-+hiIEb2Xxk6eDKJ2FFlpofCnemCbjbT5jz+BKGpVBrRNT3kWTGs4DfNX6IzGwgi33hUcXF+kFs9JW+r6Wc1LRg== dependencies: bluebird "^3.5.0" compare-version "^0.1.2" @@ -3156,14 +3224,14 @@ electron-osx-sign@^0.5.0: minimist "^1.2.0" plist "^3.0.1" -electron-publish@22.14.5: - version "22.14.5" - resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-22.14.5.tgz#34bcdce671f0e651330db20040d6919c77c94bd6" - integrity sha512-h+NANRdaA0PqGF15GKvorseWPzh1PXa/zx4I37//PIokW8eKIov8ky23foUSb55ZFWUHGpxQJux7y2NCfBtQeg== +electron-publish@23.0.2: + version "23.0.2" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-23.0.2.tgz#aa11419ae57b847df4beb63b95e2b2a43161957c" + integrity sha512-8gMYgWqv96lc83FCm85wd+tEyxNTJQK7WKyPkNkO8GxModZqt1GO8S+/vAnFGxilS/7vsrVRXFfqiCDUCSuxEg== dependencies: "@types/fs-extra" "^9.0.11" - builder-util "22.14.5" - builder-util-runtime "8.9.1" + builder-util "23.0.2" + builder-util-runtime "9.0.0" chalk "^4.1.1" fs-extra "^10.0.0" lazy-val "^1.0.5" @@ -3276,6 +3344,11 @@ ensure-error@^2.0.0: resolved "https://registry.yarnpkg.com/ensure-error/-/ensure-error-2.1.0.tgz#f11fbe383c0cf4a54850ac77acceb7bc06e0f99d" integrity sha512-+BMSJHw9gxiJAAp2ZR1E0TNcL09dD3lOvkl7WVm4+Y6xnes/pMetP/TzCHiDduh8ihNDjbGfuYxl7l4PA1xZ8A== +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + env-editor@^0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/env-editor/-/env-editor-0.4.2.tgz#4e76568d0bd8f5c2b6d314a9412c8fe9aa3ae861" @@ -3877,11 +3950,11 @@ file-url@^2.0.0: integrity sha1-6VF4TXkJUSfTcTApqwY/QIGMoq4= filelist@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.2.tgz#80202f21462d4d1c2e214119b1807c1bc0380e5b" - integrity sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ== + version "1.0.3" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.3.tgz#448607750376484932f67ef1b9ff07386b036c83" + integrity sha512-LwjCsruLWQULGYKy7TX0OPtrL9kLpojOFKc5VCTxdFTV7w5zbsgqVKfnkKG7Qgjtq50gKfO56hJv88OfcGb70Q== dependencies: - minimatch "^3.0.4" + minimatch "^5.0.1" filename-reserved-regex@^2.0.0: version "2.0.0" @@ -4402,6 +4475,11 @@ hasha@^2.2.0: is-stream "^1.0.1" pinkie-promise "^2.0.0" +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + hexy@^0.2.10: version "0.2.11" resolved "https://registry.yarnpkg.com/hexy/-/hexy-0.2.11.tgz#9939c25cb6f86a91302f22b8a8a72573518e25b4" @@ -4431,6 +4509,28 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== +html-to-text@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/html-to-text/-/html-to-text-8.2.0.tgz#8b35e280ba7fc27710b7aa76d4500aab30731924" + integrity sha512-CLXExYn1b++Lgri+ZyVvbUEFwzkLZppjjZOwB7X1qv2jIi8MrMEvxWX5KQ7zATAzTvcqgmtO00M2kCRMtEdOKQ== + dependencies: + "@selderee/plugin-htmlparser2" "^0.6.0" + deepmerge "^4.2.2" + he "^1.2.0" + htmlparser2 "^6.1.0" + minimist "^1.2.6" + selderee "^0.6.0" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + http-cache-semantics@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" @@ -4445,6 +4545,15 @@ http-proxy-agent@^4.0.1: agent-base "6" debug "4" +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -5037,13 +5146,13 @@ istanbul-reports@^3.0.2: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jake@^10.6.1: - version "10.8.2" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.2.tgz#ebc9de8558160a66d82d0eadc6a2e58fbc500a7b" - integrity sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A== +jake@^10.8.5: + version "10.8.5" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" + integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw== dependencies: - async "0.9.x" - chalk "^2.4.2" + async "^3.2.3" + chalk "^4.0.2" filelist "^1.0.1" minimatch "^3.0.4" @@ -6048,13 +6157,27 @@ miniget@^4.2.2: resolved "https://registry.yarnpkg.com/miniget/-/miniget-4.2.2.tgz#db20320f265efdc4c1826a0be431d56753074475" integrity sha512-a7voNL1N5lDMxvTMExOkg+Fq89jM2vY8pAi9ZEWzZtfNmdfP6RXkvUtFnCAXoCv2T9k1v/fUJVaAEuepGcvLYA== -minimatch@3.0.4, minimatch@^3.0.4: +minimatch@3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" +minimatch@^3.0.4: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== + dependencies: + brace-expansion "^2.0.1" + minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" @@ -6064,10 +6187,10 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@1.2.0, minimist@1.2.5, minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== +minimist@1.2.0, minimist@1.2.6, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== mkdirp@^0.5.1, mkdirp@^0.5.4: version "0.5.5" @@ -6076,6 +6199,11 @@ mkdirp@^0.5.1, mkdirp@^0.5.4: dependencies: minimist "^1.2.5" +moo@^0.5.0, moo@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.1.tgz#7aae7f384b9b09f620b6abf6f74ebbcd1b65dbc4" + integrity sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w== + mpris-service@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/mpris-service/-/mpris-service-2.1.2.tgz#ed6db2574f48e1fc356413fd3fc8e857d93d2e7b" @@ -6115,6 +6243,16 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= +nearley@^2.20.1: + version "2.20.1" + resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.20.1.tgz#246cd33eff0d012faf197ff6774d7ac78acdd474" + integrity sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ== + dependencies: + commander "^2.19.0" + moo "^0.5.0" + railroad-diagrams "^1.0.0" + randexp "0.4.6" + neo-async@^2.6.0: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" @@ -6504,6 +6642,14 @@ parse5@6.0.1: resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== +parseley@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/parseley/-/parseley-0.7.0.tgz#9949e3a0ed05c5072adb04f013c2810cf49171a8" + integrity sha512-xyOytsdDu077M3/46Am+2cGXEKM9U9QclBDv7fimY7e+BBlxh2JcBp2mgNsmkyA9uvgyTjVzDi7cP1v4hcFxbw== + dependencies: + moo "^0.5.1" + nearley "^2.20.1" + path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" @@ -6710,7 +6856,7 @@ playwright@^1.17.1: dependencies: playwright-core "=1.17.1" -plist@^3.0.1: +plist@^3.0.1, plist@^3.0.4: version "3.0.5" resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.5.tgz#2cbeb52d10e3cdccccf0c11a63a85d830970a987" integrity sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA== @@ -6874,6 +7020,19 @@ quick-lru@^5.1.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== +railroad-diagrams@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e" + integrity sha1-635iZ1SN3t+4mcG5Dlc3RVnN234= + +randexp@0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3" + integrity sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ== + dependencies: + discontinuous-range "1.0.0" + ret "~0.1.10" + rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -7125,6 +7284,11 @@ responselike@^1.0.2: dependencies: lowercase-keys "^1.0.0" +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" @@ -7207,6 +7371,13 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" +selderee@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/selderee/-/selderee-0.6.0.tgz#f3bee66cfebcb6f33df98e4a1df77388b42a96f7" + integrity sha512-ibqWGV5aChDvfVdqNYuaJP/HnVBhlRGSRrlbttmlMpHcLuTqqbMH36QkSs9GEgj5M88JDYLI8eyP94JaQ8xRlg== + dependencies: + parseley "^0.7.0" + semver-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"