From cd62595518b9f45ed553f9e7d6c95290ca1bf207 Mon Sep 17 00:00:00 2001 From: AnidlSupport Date: Mon, 27 Feb 2023 21:20:06 +0100 Subject: [PATCH] New GUI --- @types/messageHandler.d.ts | 4 +- @types/ws.d.ts | 36 + build/Icon.ico | Bin 7376 -> 0 bytes build/Icon.png | Bin 16876 -> 0 bytes build/credits.md | 1 - config/gui.yml | 2 + crunchy.ts | 12 +- funi.ts | 8 +- gui.ts | 1 + gui/electron/src/.env | 2 - gui/electron/src/images/Logo_Inverted.ico | Bin 7732 -> 0 bytes gui/electron/src/images/Logo_Inverted.png | Bin 23245 -> 0 bytes gui/electron/src/index.ts | 143 -- gui/electron/src/menu.ts | 120 -- gui/electron/src/messageHandler.ts | 36 - gui/electron/src/preload.ts | 14 - gui/electron/src/serviceHandler/base.ts | 73 - gui/react/.env | 1 + gui/react/package.json | 8 +- gui/react/pnpm-lock.yaml | 17 + gui/react/src/Layout.tsx | 6 +- gui/react/src/Style.tsx | 2 +- gui/react/src/components/LogoutButton.tsx | 6 +- .../DownloadManager/DownloadManager.tsx | 14 +- gui/react/src/components/MenuBar/MenuBar.tsx | 85 + gui/react/src/components/StartQueue.tsx | 4 +- gui/react/src/index.tsx | 42 +- gui/react/src/provider/MessageChannel.tsx | 102 +- gui/server/index.ts | 29 + gui/server/serviceHandler.ts | 100 + gui/server/services/base.ts | 77 + .../services}/crunchyroll.ts | 218 +-- .../services}/funimation.ts | 228 +-- gui/server/websocket.ts | 74 + modules/build-docs.ts | 2 +- modules/build.ts | 60 +- modules/module.app-args.ts | 4 +- modules/module.args.ts | 21 +- modules/module.cfg-loader.ts | 11 +- modules/module.fontsData.ts | 2 +- modules/module.langsData.ts | 2 +- modules/module.merger.ts | 8 +- modules/module.req.ts | 2 +- modules/module.vttconvert.ts | 4 +- package.json | 48 +- pnpm-lock.yaml | 1638 ++--------------- tsc.ts | 13 +- 47 files changed, 997 insertions(+), 2283 deletions(-) create mode 100644 @types/ws.d.ts delete mode 100644 build/Icon.ico delete mode 100644 build/Icon.png delete mode 100644 build/credits.md create mode 100644 config/gui.yml create mode 100644 gui.ts delete mode 100644 gui/electron/src/.env delete mode 100644 gui/electron/src/images/Logo_Inverted.ico delete mode 100644 gui/electron/src/images/Logo_Inverted.png delete mode 100644 gui/electron/src/index.ts delete mode 100644 gui/electron/src/menu.ts delete mode 100644 gui/electron/src/messageHandler.ts delete mode 100644 gui/electron/src/preload.ts delete mode 100644 gui/electron/src/serviceHandler/base.ts create mode 100644 gui/react/.env create mode 100644 gui/react/src/components/MenuBar/MenuBar.tsx create mode 100644 gui/server/index.ts create mode 100644 gui/server/serviceHandler.ts create mode 100644 gui/server/services/base.ts rename gui/{electron/src/serviceHandler => server/services}/crunchyroll.ts (85%) rename gui/{electron/src/serviceHandler => server/services}/funimation.ts (85%) create mode 100644 gui/server/websocket.ts diff --git a/@types/messageHandler.d.ts b/@types/messageHandler.d.ts index 23dddf5..41c1e78 100644 --- a/@types/messageHandler.d.ts +++ b/@types/messageHandler.d.ts @@ -13,9 +13,11 @@ export interface MessageHandler { resolveItems: (data: ResolveItemsData) => Promise>, listEpisodes: (id: string) => Promise, downloadItem: (data) => void, - isDownloading: () => boolean, + isDownloading: () => Promise, writeToClipboard: (text: string) => void, openFolder: (path: FolderTypes) => void, + openFile: (data: [FolderTypes, string]) => void, + openURL: (data: string) => void; } export type FolderTypes = 'content' | 'config'; diff --git a/@types/ws.d.ts b/@types/ws.d.ts new file mode 100644 index 0000000..193145a --- /dev/null +++ b/@types/ws.d.ts @@ -0,0 +1,36 @@ +import { AuthResponse, CheckTokenResponse, EpisodeListResponse, FolderTypes, QueueItem, ResolveItemsData, ResponseBase, SearchData, SearchResponse } from "./messageHandler" + +export type WSMessage = { + name: T, + data: MessageTypes[T][P] +} + +export type WSMessageWithID = WSMessage & { + id: string +} + +export type UnknownWSMessage = { + name: keyof MessageTypes, + data: MessageTypes[keyof MessageTypes][0], + id: string +} + +export type MessageTypes = { + 'auth': [AuthData, AuthResponse], + 'checkToken': [undefined, CheckTokenResponse], + 'search': [SearchData, SearchResponse], + 'default': [string, unknown], + 'availableDubCodes': [undefined, string[]], + 'availableSubCodes': [undefined, string[]], + 'resolveItems': [ResolveItemsData, ResponseBase], + 'listEpisodes': [string, EpisodeListResponse], + 'downloadItem': [unknown, undefined], + 'isDownloading': [undefined, boolean], + 'writeToClipboard': [string, undefined], + 'openFolder': [FolderTypes, undefined], + 'changeProvider': [undefined, boolean], + 'type': [undefined, 'funi'|'crunchy'|undefined], + 'setup': ['funi'|'crunchy'|undefined, undefined], + 'openFile': [[FolderTypes, string], undefined], + 'openURL': [string, undefined] +} \ No newline at end of file diff --git a/build/Icon.ico b/build/Icon.ico deleted file mode 100644 index 8db875445e8066b2b8c84987e70cc859919339b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7376 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 %({Q+v21u)!@z^#+F>%uD#5>f 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 z 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�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 diff --git a/build/credits.md b/build/credits.md deleted file mode 100644 index 016eae8..0000000 --- a/build/credits.md +++ /dev/null @@ -1 +0,0 @@ -All credits go to KX-DAREKON#0420 \ No newline at end of file diff --git a/config/gui.yml b/config/gui.yml new file mode 100644 index 0000000..cd67df3 --- /dev/null +++ b/config/gui.yml @@ -0,0 +1,2 @@ +port: 3000 +password: "default" \ No newline at end of file diff --git a/crunchy.ts b/crunchy.ts index a0f2523..9004121 100644 --- a/crunchy.ts +++ b/crunchy.ts @@ -455,13 +455,13 @@ export default class Crunchy implements ServiceClass { // check title item.title = item.title != '' ? item.title : 'NO_TITLE'; // static data - const oMetadata = [], - oBooleans = [], + const oMetadata: string[] = [], + oBooleans: string[] = [], tMetadata = item.type + '_metadata', iMetadata = (Object.prototype.hasOwnProperty.call(item, tMetadata) ? item[tMetadata as keyof ParseItem] : item) as Record, iTitle = [ item.title ]; - const audio_languages = []; + const audio_languages: string[] = []; // set object booleans if(iMetadata.duration_ms){ @@ -523,7 +523,7 @@ export default class Crunchy implements ServiceClass { const showObjectMetadata = oMetadata.length > 0 && !iMetadata.hide_metadata ? true : false; const showObjectBooleans = oBooleans.length > 0 && !iMetadata.hide_metadata ? true : false; // make obj ids - const objects_ids = []; + const objects_ids: string[] = []; objects_ids.push(oTypes[item.type as keyof typeof oTypes] + ':' + item.id); if(item.seq_id){ objects_ids.unshift(item.seq_id); @@ -870,7 +870,7 @@ export default class Crunchy implements ServiceClass { return objectInfo; } - const selectedMedia = []; + const selectedMedia: Partial[] = []; for(const item of objectInfo.data){ if(item.type != 'episode' && item.type != 'movie'){ @@ -998,7 +998,7 @@ export default class Crunchy implements ServiceClass { } as Variable; })); - let streams = []; + let streams: any[] = []; let hsLangs: string[] = []; const pbStreams = pbData.data[0]; diff --git a/funi.ts b/funi.ts index e4ac2b7..524fd6f 100644 --- a/funi.ts +++ b/funi.ts @@ -19,7 +19,7 @@ import * as yamlCfg from './modules/module.cfg-loader'; import vttConvert from './modules/module.vttconvert'; // types -import { Item } from './@types/items'; +import type { Item } from './@types/items.js'; // params @@ -266,7 +266,7 @@ export default class Funi implements ServiceClass { return showList; const eps = showList.value; const epSelList = parseSelect(data.e as string, data.but); - const fnSlug: FuniEpisodeData[] = [], epSelEpsTxt = []; let is_selected = false; + const fnSlug: FuniEpisodeData[] = [], epSelEpsTxt: string[] = []; let is_selected = false; for(const e in eps){ @@ -331,7 +331,7 @@ export default class Funi implements ServiceClass { debug: this.debug, }); if(!episodeData.ok || !episodeData.res){return { isOk: false, reason: new Error('Unable to get episodeData') }; } - const ep = JSON.parse(episodeData.res.body).items[0] as EpisodeData, streamIds = []; + const ep = JSON.parse(episodeData.res.body).items[0] as EpisodeData, streamIds: { id: number, lang: langsData.LanguageItem }[] = []; // build fn season = parseInt(ep.parent.seasonNumber); if(ep.mediaCategory != 'Episode'){ @@ -508,7 +508,7 @@ export default class Funi implements ServiceClass { plStreams: Record = {}, - plLayersStr = [], + plLayersStr: string[] = [], plLayersRes: RecordUjltOXZDSZu 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 diff --git a/gui/electron/src/images/Logo_Inverted.png b/gui/electron/src/images/Logo_Inverted.png deleted file mode 100644 index 88b9e0caae20fa0e52a89d9e2244d309628f8fd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23245 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 z 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 { - console.error(er, or); -}); - -process.on('unhandledRejection', (er, pr) => { - console.log(er, pr); -}); - -const getDataDirectory = () => { - switch (process.platform) { - case 'darwin': { - if (!process.env.HOME) { - console.error('Unknown home directory'); - process.exit(1); - } - return path.join(process.env.HOME, 'Library', 'Application Support', json.name); - } - case 'win32': { - if (!process.env.APPDATA) { - console.error('Unknown home directory'); - process.exit(1); - } - console.log('Appdata', process.env.APPDATA); - return path.join(process.env.APPDATA, json.name); - } - case 'linux': { - if (!process.env.HOME) { - console.error('Unknown home directory'); - process.exit(1); - } - return path.join(process.env.HOME, `.${json.name}`); - } - default: { - console.error('Unsupported platform!'); - process.exit(1); - } - } -}; -if (!fs.existsSync(getDataDirectory())) - fs.mkdirSync(getDataDirectory()); - -export { getDataDirectory }; -process.env.contentDirectory = getDataDirectory(); - -import './menu'; - - -if (fs.existsSync(path.join(__dirname, '.env'))) - dotenv.config({ path: path.join(__dirname, '.env'), debug: true }); - -if (require('electron-squirrel-startup')) { - app.quit(); -} - -export const isWindows = process.platform === 'win32'; - -let mainWindow: BrowserWindow|undefined = undefined; -export { mainWindow }; - -const icon = path.join(__dirname, 'images', `Logo_Inverted.${isWindows ? 'ico' : 'png'}`); - -// eslint-disable-next-line no-global-assign -console = (() => { - const logFolder = path.join(getDataDirectory(), 'logs'); - if (!fs.existsSync(logFolder)) - fs.mkdirSync(logFolder); - if (fs.existsSync(path.join(logFolder, 'latest.log'))) - fs.renameSync(path.join(logFolder, 'latest.log'), path.join(logFolder, `${Date.now()}.log`)); - return new Console(fs.createWriteStream(path.join(logFolder, 'latest.log'))); -})(); - -const createWindow = async () => { - (await import('../../../modules/module.cfg-loader')).ensureConfig(); - // Create the browser window. - mainWindow = new BrowserWindow({ - width: screen.getPrimaryDisplay().bounds.width, - height: screen.getPrimaryDisplay().bounds.height, - title: `AniDL GUI v${json.version}`, - webPreferences: { - nodeIntegration: false, - preload: path.join(__dirname, 'preload.js') - }, - icon, - }); - - mainWindow.webContents.on('crashed', (e) => console.log(e)); - - (await import('./messageHandler')).default(mainWindow); - - if (!process.env.USE_BROWSER) { - const app = express(); - - // Path.sep seems to return / on windows with electron - // \\ in Filename on Linux is possible but I don't see another way rn - const sep = isWindows ? '\\' : '/'; - - const p = __dirname.split(sep); - p.pop(); - p.push('build'); - - console.log(p.join(sep)); - - app.use(express.static(p.join(sep))); - - await new Promise((resolve) => { - app.listen(3000, () => { - console.log('Express started'); - resolve(undefined); - }); - }); - - } - - mainWindow.loadURL('http://localhost:3000'); - if (process.env.TEST) - mainWindow.webContents.openDevTools(); -}; - -app.on('ready', createWindow); - -app.on('window-all-closed', () => { - if (process.platform !== 'darwin') { - app.quit(); - } -}); - -app.on('quit', () => { - process.exit(0); -}); - -app.on('activate', () => { - if (BrowserWindow.getAllWindows().length === 0) { - createWindow(); - } -}); \ No newline at end of file diff --git a/gui/electron/src/menu.ts b/gui/electron/src/menu.ts deleted file mode 100644 index dea0c41..0000000 --- a/gui/electron/src/menu.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { Menu, MenuItem, MenuItemConstructorOptions, shell } from 'electron'; -import path from 'path'; -import { getDataDirectory } from '.'; -import json from '../../../package.json'; - -const template: (MenuItemConstructorOptions | MenuItem)[] = [ - { - label: 'Edit', - submenu: [ - { - role: 'undo' - }, - { - role: 'redo' - }, - { - type: 'separator' - }, - { - role: 'cut' - }, - { - role: 'copy' - }, - { - role: 'paste' - } - ] - }, - { - label: 'Debug', - submenu: [ - { - role: 'toggleDevTools' - }, - { - label: 'Open log folder', - click: () => { - shell.openPath(path.join(getDataDirectory(), 'logs')); - } - }, - { - role: 'forceReload' - } - ] - }, - { - label: 'Settings', - submenu: [ - { - label: 'Open settings folder', - click: () => { - shell.openPath(path.join(getDataDirectory(), 'config')); - } - }, - { - label: 'Open settings file...', - submenu: [ - { - label: 'FFmpeg/Mkvmerge path', - click: () => { - shell.openPath(path.join(getDataDirectory(), 'config', 'bin-path.yml')); - } - }, - { - label: 'Advanced options', - sublabel: 'See the documention for the options you may enter here', - click: () => { - shell.openPath(path.join(getDataDirectory(), 'config', 'cli-defaults.yml')); - } - }, - { - label: 'Output path', - click: () => { - shell.openPath(path.join(getDataDirectory(), 'config', 'dir-path.yml')); - } - } - ] - } - ] - }, - { - label: 'Help', - submenu: [ - { - label: 'Version', - sublabel: json.version - }, - { - label: 'GitHub', - click: () => { - shell.openExternal('https://github.com/anidl/multi-downloader-nx'); - } - }, - { - label: 'Report a Bug', - click: () => { - shell.openExternal(`https://github.com/anidl/multi-downloader-nx/issues/new?assignees=AnimeDL,AnidlSupport&labels=bug&template=bug.yml&title=BUG&version=${json.version}`); - } - }, - { - type: 'separator' - }, - { - label: 'Contributors', - click: () => { - shell.openExternal('https://github.com/anidl/multi-downloader-nx/graphs/contributors'); - } - }, - { - label: 'Discord', - click: () => { - shell.openExternal('https://discord.gg/qEpbWen5vq'); - } - } - ] - } -]; - -Menu.setApplicationMenu(Menu.buildFromTemplate(template)); \ No newline at end of file diff --git a/gui/electron/src/messageHandler.ts b/gui/electron/src/messageHandler.ts deleted file mode 100644 index 03c30de..0000000 --- a/gui/electron/src/messageHandler.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { BrowserWindow, ipcMain } from 'electron'; -import { MessageHandler } from '../../../@types/messageHandler'; -import Crunchy from './serviceHandler/crunchyroll'; -import Funimation from './serviceHandler/funimation'; - -export default (window: BrowserWindow) => { - let handler: MessageHandler|undefined; - ipcMain.handle('setup', (_, data) => { - if (data === 'funi') { - handler = new Funimation(window); - } else if (data === 'crunchy') { - handler = new Crunchy(window); - } - }); - - ipcMain.on('changeProvider', (ev) => { - if (handler?.isDownloading()) - return ev.returnValue = false; - handler = undefined; - ev.returnValue = true; - }); - - ipcMain.handle('type', async () => handler === undefined ? undefined : handler instanceof Funimation ? 'funi' : 'crunchy'); - ipcMain.handle('auth', async (_, data) => handler?.auth(data)); - ipcMain.handle('checkToken', async () => handler?.checkToken()); - ipcMain.handle('search', async (_, data) => handler?.search(data)); - ipcMain.handle('default', async (_, data) => handler?.handleDefault(data)); - ipcMain.handle('availableDubCodes', async () => handler?.availableDubCodes()); - ipcMain.handle('availableSubCodes', async () => handler?.availableSubCodes()); - ipcMain.handle('resolveItems', async (_, data) => handler?.resolveItems(data)); - ipcMain.handle('listEpisodes', async (_, data) => handler?.listEpisodes(data)); - ipcMain.handle('downloadItem', async (_, data) => handler?.downloadItem(data)); - ipcMain.handle('writeToClipboard', async (_, data) => handler?.writeToClipboard(data)); - ipcMain.handle('openFolder', async (_, data) => handler?.openFolder(data)); - ipcMain.on('isDownloading', (ev) => ev.returnValue = handler?.isDownloading()); -}; diff --git a/gui/electron/src/preload.ts b/gui/electron/src/preload.ts deleted file mode 100644 index e681735..0000000 --- a/gui/electron/src/preload.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { contextBridge, ipcRenderer } from 'electron'; - -contextBridge.exposeInMainWorld('Electron', { - ipcRenderer: { - ...ipcRenderer, - on: (name: string, handler: (event: Electron.IpcRendererEvent, ...args: any[]) => void) => { - ipcRenderer.on(name, handler); - return ipcRenderer; - }, - removeListener: (name: string, handler: (event: Electron.IpcRendererEvent, ...args: any[]) => void) => { - ipcRenderer.removeListener(name, handler); - } - } -}); \ No newline at end of file diff --git a/gui/electron/src/serviceHandler/base.ts b/gui/electron/src/serviceHandler/base.ts deleted file mode 100644 index 45021d6..0000000 --- a/gui/electron/src/serviceHandler/base.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { BrowserWindow, clipboard, dialog, shell } from 'electron'; -import { DownloadInfo, FolderTypes, ProgressData } from '../../../../@types/messageHandler'; -import { RandomEvent, RandomEvents } from '../../../../@types/randomEvents'; -import { loadCfg } from '../../../../modules/module.cfg-loader'; - -export default class Base { - - constructor(private window: BrowserWindow) {} - - private downloading = false; - - setDownloading(downloading: boolean) { - this.downloading = downloading; - } - - getDownloading() { - return this.downloading; - } - - alertError(error: Error) { - dialog.showMessageBoxSync(this.window, { - message: `${error.name ?? 'An error occured'}\n${error.message}`, - detail: error.stack, - title: 'Error', - type: 'error' - }); - } - - makeProgressHandler(videoInfo: DownloadInfo) { - return ((data: ProgressData) => { - const progress = (typeof data.percent === 'string' ? - parseFloat(data.percent) : data.percent) / 100; - this.window.setProgressBar(progress === 1 ? -1 : progress); - this.sendMessage({ - name: 'progress', - data: { - downloadInfo: videoInfo, - progress: data - } - }); - }).bind(this); - } - - getWindow() { - return this.window; - } - - sendMessage(data: RandomEvent) { - this.window.webContents.send('randomEvent', data); - } - - isDownloading() { - return this.downloading; - } - - async writeToClipboard(text: string) { - clipboard.writeText(text, 'clipboard'); - return true; - } - - async openFolder(folderType: FolderTypes) { - const conf = loadCfg(); - switch (folderType) { - case 'content': - shell.openPath(conf.dir.content); - break; - case 'config': - shell.openPath(conf.dir.config); - break; - } - } - -} \ No newline at end of file diff --git a/gui/react/.env b/gui/react/.env new file mode 100644 index 0000000..3c65c87 --- /dev/null +++ b/gui/react/.env @@ -0,0 +1 @@ +PORT=3002 \ No newline at end of file diff --git a/gui/react/package.json b/gui/react/package.json index 6047031..4f06f31 100644 --- a/gui/react/package.json +++ b/gui/react/package.json @@ -18,8 +18,11 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-scripts": "5.0.1", - "typescript": "^4.9.5" + "typescript": "^4.9.5", + "uuid": "^9.0.0", + "ws": "^8.12.1" }, + "proxy": "http://localhost:3000", "scripts": { "start": "react-scripts start", "build": "react-scripts build", @@ -43,5 +46,8 @@ "last 1 firefox version", "last 1 safari version" ] + }, + "devDependencies": { + "@types/uuid": "^9.0.1" } } diff --git a/gui/react/pnpm-lock.yaml b/gui/react/pnpm-lock.yaml index 6f7c75e..355094b 100644 --- a/gui/react/pnpm-lock.yaml +++ b/gui/react/pnpm-lock.yaml @@ -12,11 +12,14 @@ specifiers: '@types/node': ^18.14.0 '@types/react': ^18.0.25 '@types/react-dom': ^18.0.11 + '@types/uuid': ^9.0.1 notistack: ^2.0.8 react: ^18.2.0 react-dom: ^18.2.0 react-scripts: 5.0.1 typescript: ^4.9.5 + uuid: ^9.0.0 + ws: ^8.12.1 dependencies: '@babel/core': 7.20.12 @@ -35,6 +38,11 @@ dependencies: react-dom: 18.2.0_react@18.2.0 react-scripts: 5.0.1_pegpel5nwbugtuutvxsiaw5kjq typescript: 4.9.5 + uuid: 9.0.0 + ws: 8.12.1 + +devDependencies: + '@types/uuid': 9.0.1 packages: @@ -2753,6 +2761,10 @@ packages: resolution: {integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==} dev: false + /@types/uuid/9.0.1: + resolution: {integrity: sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==} + dev: true + /@types/ws/8.5.4: resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} dependencies: @@ -9805,6 +9817,11 @@ packages: hasBin: true dev: false + /uuid/9.0.0: + resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} + hasBin: true + dev: false + /v8-to-istanbul/8.1.1: resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} engines: {node: '>=10.12.0'} diff --git a/gui/react/src/Layout.tsx b/gui/react/src/Layout.tsx index 6b50468..aadec05 100644 --- a/gui/react/src/Layout.tsx +++ b/gui/react/src/Layout.tsx @@ -8,14 +8,16 @@ import { messageChannelContext } from './provider/MessageChannel'; import { ClearAll, Folder } from "@mui/icons-material"; import useStore from "./hooks/useStore"; import StartQueueButton from "./components/StartQueue"; +import MenuBar from "./components/MenuBar/MenuBar"; const Layout: React.FC = () => { const messageHandler = React.useContext(messageChannelContext); const [, dispatch] = useStore(); - return - + return + + diff --git a/gui/react/src/Style.tsx b/gui/react/src/Style.tsx index 5428b26..ae508bb 100644 --- a/gui/react/src/Style.tsx +++ b/gui/react/src/Style.tsx @@ -11,7 +11,7 @@ const makeTheme = (mode: 'dark'|'light') : Partial => { const Style: FCWithChildren = ({children}) => { return - + {children} diff --git a/gui/react/src/components/LogoutButton.tsx b/gui/react/src/components/LogoutButton.tsx index e70120d..5827820 100644 --- a/gui/react/src/components/LogoutButton.tsx +++ b/gui/react/src/components/LogoutButton.tsx @@ -9,10 +9,10 @@ const LogoutButton: React.FC = () => { const messageChannel = React.useContext(messageChannelContext); const [, dispatch] = useStore(); - const logout = () => { - if (messageChannel?.isDownloading()) + const logout = async () => { + if (await messageChannel?.isDownloading()) return alert('You are currently downloading. Please finish the download first.'); - if (messageChannel?.logout()) + if (await messageChannel?.logout()) dispatch({ type: 'service', payload: undefined diff --git a/gui/react/src/components/MainFrame/DownloadManager/DownloadManager.tsx b/gui/react/src/components/MainFrame/DownloadManager/DownloadManager.tsx index 6e8b9de..414db3c 100644 --- a/gui/react/src/components/MainFrame/DownloadManager/DownloadManager.tsx +++ b/gui/react/src/components/MainFrame/DownloadManager/DownloadManager.tsx @@ -33,12 +33,14 @@ const useDownloadManager = () => { }, [messageHandler, dispatch]); React.useEffect(() => { - if (!currentDownload) - return; - if (messageHandler?.isDownloading()) - return; - console.log('start download'); - messageHandler?.downloadItem(currentDownload); + (async () => { + if (!currentDownload) + return; + if (await messageHandler?.isDownloading()) + return; + console.log('start download'); + messageHandler?.downloadItem(currentDownload); + })(); }, [currentDownload, messageHandler]); diff --git a/gui/react/src/components/MenuBar/MenuBar.tsx b/gui/react/src/components/MenuBar/MenuBar.tsx new file mode 100644 index 0000000..08a0728 --- /dev/null +++ b/gui/react/src/components/MenuBar/MenuBar.tsx @@ -0,0 +1,85 @@ +import { Box, Button, Menu, MenuItem } from "@mui/material"; +import React from "react" +import { messageChannelContext } from "../../provider/MessageChannel"; + +const MenuBar: React.FC = () => { + const [ openMenu, setMenuOpen ] = React.useState<'settings'|'help'|undefined>(); + const [anchorEl, setAnchorEl] = React.useState(null); + + const msg = React.useContext(messageChannelContext); + + const handleClick = (event: React.MouseEvent, n: 'settings'|'help') => { + setAnchorEl(event.currentTarget); + setMenuOpen(n); + }; + const handleClose = () => { + setAnchorEl(null); + setMenuOpen(undefined); + }; + + if (!msg) + return <> + + return + + + + { + msg.openFolder('config'); + handleClose(); + }}> + Open settings folder + + { + msg.openFile(['config', 'bin-path.yml']); + handleClose(); + }}> + Open FFmpeg/Mkvmerge file + + { + msg.openFile(['config', 'cli-defaults.yml']); + handleClose(); + }}> + Open advanced options + + { + msg.openFolder('content'); + handleClose(); + }}> + Open output path + + + + { + msg.openURL('https://github.com/anidl/multi-downloader-nx'); + handleClose(); + }}> + GitHub + + { + msg.openURL('https://github.com/anidl/multi-downloader-nx/issues/new?assignees=AnimeDL,AnidlSupport&labels=bug&template=bug.yml&title=BUG'); + handleClose(); + }}> + Report a bug + + { + msg.openURL('https://github.com/anidl/multi-downloader-nx/graphs/contributors'); + handleClose(); + }}> + Contributors + + { + msg.openURL('https://discord.gg/qEpbWen5vq'); + handleClose(); + }}> + Discord + + + ; +} + +export default MenuBar; \ No newline at end of file diff --git a/gui/react/src/components/StartQueue.tsx b/gui/react/src/components/StartQueue.tsx index 51adde7..c997158 100644 --- a/gui/react/src/components/StartQueue.tsx +++ b/gui/react/src/components/StartQueue.tsx @@ -9,8 +9,8 @@ const StartQueueButton: React.FC = () => { const messageChannel = React.useContext(messageChannelContext); const [store, dispatch] = useStore(); - const change = () => { - if (messageChannel?.isDownloading() && store.downloadQueue) + const change = async () => { + if (await messageChannel?.isDownloading() && store.downloadQueue) alert("The current download will be finished before the queue stops") dispatch({ type: 'downloadQueue', diff --git a/gui/react/src/index.tsx b/gui/react/src/index.tsx index 65918da..af205e3 100644 --- a/gui/react/src/index.tsx +++ b/gui/react/src/index.tsx @@ -19,26 +19,24 @@ const onClickDismiss = (key: SnackbarKey | undefined) => () => { const container = document.getElementById('root'); const root = createRoot(container!); root.render( - - - - ( - - - - )} - > - - - - - + + + ( + + + + )} + > + + + + ); \ No newline at end of file diff --git a/gui/react/src/provider/MessageChannel.tsx b/gui/react/src/provider/MessageChannel.tsx index 5f84714..40be4eb 100644 --- a/gui/react/src/provider/MessageChannel.tsx +++ b/gui/react/src/provider/MessageChannel.tsx @@ -1,13 +1,13 @@ import React from 'react'; -import type { MessageHandler } from '../../../../@types/messageHandler'; -import type { IpcRenderer, IpcRendererEvent } from "electron"; +import type { AuthData, AuthResponse, EpisodeListResponse, MessageHandler, QueueItem, ResolveItemsData, ResponseBase, SearchData, SearchResponse } from '../../../../@types/messageHandler'; import useStore from '../hooks/useStore'; - +import type { MessageTypes, WSMessage, WSMessageWithID } from '../../../../@types/ws'; import type { Handler, RandomEvent, RandomEvents } from '../../../../@types/randomEvents'; import { Backdrop, Typography } from '@mui/material'; +import { v4 } from "uuid"; -export type FrontEndMessanges = (MessageHandler & { randomEvents: RandomEventHandler, logout: () => boolean }); +export type FrontEndMessanges = (MessageHandler & { randomEvents: RandomEventHandler, logout: () => Promise }); export class RandomEventHandler { private handler: { @@ -36,53 +36,93 @@ export class RandomEventHandler { export const messageChannelContext = React.createContext(undefined); +async function messageAndResponse(socket: WebSocket, msg: WSMessage): Promise> { + const id = v4(); + const ret = new Promise>((resolve) => { + const handler = function({ data }: MessageEvent) { + const parsed = JSON.parse(data.toString()) as WSMessageWithID; + if (parsed.id === id) { + socket.removeEventListener('message', handler); + resolve(parsed); + } + } + socket.addEventListener('message', handler); + }); + const toSend = msg as WSMessageWithID; + toSend.id = id; + + socket.send(JSON.stringify(toSend)); + return ret; +} + const MessageChannelProvider: FCWithChildren = ({ children }) => { const [store, dispatch] = useStore(); + const [socket, setSocket] = React.useState(); + + React.useEffect(() => { + const wws = new WebSocket(`ws://localhost:3000/ws?${new URLSearchParams({ + password: prompt('This website requires a password') ?? '' + })}`, ); + wws.addEventListener('open', () => { + console.log('[INFO] [WS] Connected'); + setSocket(wws); + }); + wws.addEventListener('error', (er) => { + console.error(`[ERROR] [WS]`, er); + setSocket(null); + }) + }, []); + - const { ipcRenderer } = (window as any).Electron as { ipcRenderer: IpcRenderer }; const randomEventHandler = React.useMemo(() => new RandomEventHandler(), []); React.useEffect(() => { (async () => { - const currentService = await ipcRenderer.invoke('type'); - if (currentService !== undefined) - return dispatch({ type: 'service', payload: currentService }); - if (store.service !== currentService) - ipcRenderer.invoke('setup', store.service) + if (!socket) + return; + const currentService = await messageAndResponse(socket, { name: 'type', data: undefined }); + if (currentService.data !== undefined) + return dispatch({ type: 'service', payload: currentService.data }); + if (store.service !== currentService.data) + messageAndResponse(socket, { name: 'setup', data: store.service }); })(); - }, [store.service, dispatch, ipcRenderer]) + }, [store.service, dispatch, socket]) React.useEffect(() => { + if (!socket) + return; /* finish is a placeholder */ - const listener = (_: IpcRendererEvent, initalData: RandomEvent<'finish'>) => { - const eventName = initalData.name as keyof RandomEvents; - const data = initalData as unknown as RandomEvent; - + const listener = (initalData: MessageEvent) => { + const data = JSON.parse(initalData.data) as RandomEvent<'finish'>; randomEventHandler.emit(data.name, data); } - ipcRenderer.on('randomEvent', listener); + socket.addEventListener('message', listener); return () => { - ipcRenderer.removeListener('randomEvent', listener); + socket.removeEventListener('message', listener); }; - }, [ ipcRenderer ]); + }, [ socket ]); + if (socket === undefined || socket === null) + return {socket === undefined ? 'Loading...' : 'WebSocket Error. Please try to reload and make sure the password ist correct.'}; const messageHandler: FrontEndMessanges = { - auth: async (data) => await ipcRenderer.invoke('auth', data), - checkToken: async () => await ipcRenderer.invoke('checkToken'), - search: async (data) => await ipcRenderer.invoke('search', data), - handleDefault: async (data) => await ipcRenderer.invoke('default', data), - availableDubCodes: async () => await ipcRenderer.invoke('availableDubCodes'), - availableSubCodes: async () => await ipcRenderer.invoke('availableSubCodes'), - resolveItems: async (data) => await ipcRenderer.invoke('resolveItems', data), - listEpisodes: async (data) => await ipcRenderer.invoke('listEpisodes', data), + auth: async (data) => (await messageAndResponse(socket, { name: 'auth', data })).data, + checkToken: async () => (await messageAndResponse(socket, { name: 'checkToken', data: undefined })).data, + search: async (data) => (await messageAndResponse(socket, { name: 'search', data })).data, + handleDefault: async (data) => (await messageAndResponse(socket, { name: 'default', data })).data, + availableDubCodes: async () => (await messageAndResponse(socket, { name: 'availableDubCodes', data: undefined})).data, + availableSubCodes: async () => (await messageAndResponse(socket, { name: 'availableSubCodes', data: undefined })).data, + resolveItems: async (data) => (await messageAndResponse(socket, { name: 'resolveItems', data })).data, + listEpisodes: async (data) => (await messageAndResponse(socket, { name: 'listEpisodes', data })).data, randomEvents: randomEventHandler, - downloadItem: (data) => ipcRenderer.invoke('downloadItem', data), - isDownloading: () => ipcRenderer.sendSync('isDownloading'), - writeToClipboard: async (data) => await ipcRenderer.invoke('writeToClipboard', data), - openFolder: async (data) => await ipcRenderer.invoke('openFolder', data), - logout: () => ipcRenderer.sendSync('changeProvider') + downloadItem: (data) => messageAndResponse(socket, { name: 'downloadItem', data }), + isDownloading: async () => (await messageAndResponse(socket, { name: 'isDownloading', data: undefined })).data, + writeToClipboard: async (data) => messageAndResponse(socket, { name: 'writeToClipboard', data }), + openFolder: async (data) => messageAndResponse(socket, { name: 'openFolder', data }), + logout: async () => (await messageAndResponse(socket, { name: 'changeProvider', data: undefined })).data, + openFile: async (data) => await messageAndResponse(socket, { name: 'openFile', data }), + openURL: async (data) => await messageAndResponse(socket, { name: 'openURL', data }) } return diff --git a/gui/server/index.ts b/gui/server/index.ts new file mode 100644 index 0000000..a286a95 --- /dev/null +++ b/gui/server/index.ts @@ -0,0 +1,29 @@ +import express from 'express'; +import { ensureConfig, loadCfg, workingDir } from '../../modules/module.cfg-loader'; +import cors from 'cors'; +import ServiceHandler from './serviceHandler'; +import open from 'open'; +import path from 'path'; + +process.title = 'AniDL'; + +ensureConfig(); + +const cfg = loadCfg(); + +const app = express(); + +export { app, cfg }; + +app.use(express.json()); +app.use(cors()); +app.use(express.static(path.join(workingDir, 'gui', 'server', 'build'), { maxAge: 1000 * 60 * 20 })) + +const server = app.listen(cfg.gui.port, () => { + console.log(`[INFO] GUI server started on port ${cfg.gui.port}`); +}); + + +new ServiceHandler(server); + +open(`http://localhost:${cfg.gui.port}`); \ No newline at end of file diff --git a/gui/server/serviceHandler.ts b/gui/server/serviceHandler.ts new file mode 100644 index 0000000..dad38b8 --- /dev/null +++ b/gui/server/serviceHandler.ts @@ -0,0 +1,100 @@ +import { ServerResponse } from 'http'; +import { Server } from 'http'; +import { IncomingMessage } from 'http'; +import { MessageHandler } from '../../@types/messageHandler'; +import Funi from '../../funi'; +import CrunchyHandler from './services/crunchyroll'; +import FunimationHandler from './services/funimation'; +import WebSocketHandler from './websocket'; + +export default class ServiceHandler { + + private service: MessageHandler|undefined = undefined; + private ws: WebSocketHandler; + + constructor(server: Server) { + this.ws = new WebSocketHandler(server); + this.handleMessanges(); + } + + private handleMessanges() { + this.ws.events.on('setup', ({ data }) => { + if (data === 'funi') { + this.service = new FunimationHandler(this.ws); + } else if (data === 'crunchy') { + this.service = new CrunchyHandler(this.ws); + } + }); + + this.ws.events.on('changeProvider', async (_, respond) => { + if (await this.service?.isDownloading()) + return respond(false); + this.service = undefined; + respond(true); + }) + + this.ws.events.on('auth', async ({ data }, respond) => { + if (this.service === undefined) + return respond({ isOk: false, reason: new Error('No service selected') }); + respond(await this.service.auth(data)); + }); + this.ws.events.on('type', async ({}, respond) => respond(this.service === undefined ? undefined : this.service instanceof Funi ? 'funi' : 'crunchy')); + this.ws.events.on('checkToken', async ({}, respond) => { + if (this.service === undefined) + return respond({ isOk: false, reason: new Error('No service selected') }); + respond(await this.service.checkToken()); + }); + this.ws.events.on('search', async ({ data }, respond) => { + if (this.service === undefined) + return respond({ isOk: false, reason: new Error('No service selected') }); + respond(await this.service.search(data)); + }); + this.ws.events.on('default', async ({ data }, respond) => { + if (this.service === undefined) + return respond({ isOk: false, reason: new Error('No service selected') }); + respond(await this.service.handleDefault(data)); + }); + this.ws.events.on('availableDubCodes', async ({}, respond) => { + if (this.service === undefined) + return respond([]); + respond(await this.service.availableDubCodes()); + }); + this.ws.events.on('availableSubCodes', async ({}, respond) => { + if (this.service === undefined) + return respond([]); + respond(await this.service.availableSubCodes()); + }); + this.ws.events.on('resolveItems', async ({ data }, respond) => { + if (this.service === undefined) + return respond({ isOk: false, reason: new Error('No service selected') }); + respond(await this.service.resolveItems(data)); + }); + this.ws.events.on('listEpisodes', async ({ data }, respond) => { + if (this.service === undefined) + return respond({ isOk: false, reason: new Error('No service selected') }); + respond(await this.service.listEpisodes(data)); + }); + this.ws.events.on('downloadItem', async ({ data }, respond) => { + this.service!.downloadItem(data); + respond(undefined); + }); + this.ws.events.on('writeToClipboard', async ({ data }, respond) => { + this.service!.writeToClipboard(data); + respond(undefined); + }); + this.ws.events.on('openFolder', async ({ data }, respond) => { + this.service!.openFolder(data); + respond(undefined); + }); + this.ws.events.on('openFile', async ({ data }, respond) => { + this.service!.openFile(data); + respond(undefined); + }); + this.ws.events.on('openURL', async ({ data }, respond) => { + this.service!.openURL(data); + respond(undefined); + }); + this.ws.events.on('isDownloading', async ({}, respond) => respond(await this.service!.isDownloading())); + } + +} \ No newline at end of file diff --git a/gui/server/services/base.ts b/gui/server/services/base.ts new file mode 100644 index 0000000..1f376c4 --- /dev/null +++ b/gui/server/services/base.ts @@ -0,0 +1,77 @@ +import { DownloadInfo, FolderTypes, ProgressData } from '../../../@types/messageHandler'; +import { RandomEvent, RandomEvents } from '../../../@types/randomEvents'; +import WebSocketHandler from '../websocket'; +import copy from "copy-to-clipboard"; +import open from 'open'; +import { cfg } from '..'; +import path from 'path'; + +export default class Base { + + constructor(private ws: WebSocketHandler) {} + + private downloading = false; + + setDownloading(downloading: boolean) { + this.downloading = downloading; + } + + getDownloading() { + return this.downloading; + } + + alertError(error: Error) { + console.log(`[ERROR] ${error}`); + } + + makeProgressHandler(videoInfo: DownloadInfo) { + return ((data: ProgressData) => { + this.sendMessage({ + name: 'progress', + data: { + downloadInfo: videoInfo, + progress: data + } + }); + }).bind(this); + } + + sendMessage(data: RandomEvent) { + this.ws.sendMessage(data); + } + + async isDownloading() { + return this.downloading; + } + + async writeToClipboard(text: string) { + copy(text); + return true; + } + + async openFolder(folderType: FolderTypes) { + switch (folderType) { + case 'content': + open(cfg.dir.content); + break; + case 'config': + open(cfg.dir.config); + break; + } + } + + async openFile(data: [FolderTypes, string]) { + switch (data[0]) { + case 'config': + open(path.join(cfg.dir.config, data[1])); + break; + case 'content': + throw new Error('No subfolders'); + } + } + + async openURL(data: string) { + open(data); + } + +} \ No newline at end of file diff --git a/gui/electron/src/serviceHandler/crunchyroll.ts b/gui/server/services/crunchyroll.ts similarity index 85% rename from gui/electron/src/serviceHandler/crunchyroll.ts rename to gui/server/services/crunchyroll.ts index ddfa3dd..cc99467 100644 --- a/gui/electron/src/serviceHandler/crunchyroll.ts +++ b/gui/server/services/crunchyroll.ts @@ -1,110 +1,110 @@ -import { BrowserWindow } from 'electron'; -import { AuthData, CheckTokenResponse, DownloadData, EpisodeListResponse, MessageHandler, QueueItem, ResolveItemsData, ResponseBase, SearchData, SearchResponse } from '../../../../@types/messageHandler'; -import Crunchy from '../../../../crunchy'; -import { ArgvType } from '../../../../modules/module.app-args'; -import { buildDefault, getDefault } from '../../../../modules/module.args'; -import { languages, subtitleLanguagesFilter } from '../../../../modules/module.langsData'; -import Base from './base'; - -class CrunchyHandler extends Base implements MessageHandler { - private crunchy: Crunchy; - constructor(window: BrowserWindow) { - super(window); - this.crunchy = new Crunchy(); - this.crunchy.refreshToken(); - } - - public async listEpisodes (id: string): Promise { - await this.crunchy.refreshToken(true); - return { isOk: true, value: (await this.crunchy.listSeriesID(id)).list }; - } - - public async handleDefault(name: string) { - return getDefault(name, this.crunchy.cfg.cli); - } - - public async availableDubCodes(): Promise { - const dubLanguageCodesArray = []; - for(const language of languages){ - if (language.cr_locale) - dubLanguageCodesArray.push(language.code); - } - return [...new Set(dubLanguageCodesArray)]; - } - - public async availableSubCodes(): Promise { - return subtitleLanguagesFilter; - } - - public async resolveItems(data: ResolveItemsData): Promise> { - await this.crunchy.refreshToken(true); - console.log(`[DEBUG] Got resolve options: ${JSON.stringify(data)}`); - const res = await this.crunchy.downloadFromSeriesID(data.id, data); - if (!res.isOk) - return res; - return { isOk: true, value: res.value.map(a => { - return { - ...data, - ids: a.data.map(a => a.mediaId), - title: a.episodeTitle, - parent: { - title: a.seasonTitle, - season: a.season.toString() - }, - e: a.e, - image: a.image, - episode: a.episodeNumber - }; - }) }; - } - - public async search(data: SearchData): Promise { - await this.crunchy.refreshToken(true); - console.log(`[DEBUG] Got search options: ${JSON.stringify(data)}`); - const crunchySearch = await this.crunchy.doSearch(data); - if (!crunchySearch.isOk) { - this.crunchy.refreshToken(); - return crunchySearch; - } - return { isOk: true, value: crunchySearch.value }; - } - - public async checkToken(): Promise { - if (await this.crunchy.getProfile()) { - return { isOk: true, value: undefined }; - } else { - return { isOk: false, reason: new Error('') }; - } - } - - public auth(data: AuthData) { - return this.crunchy.doAuth(data); - } - - public async downloadItem(data: DownloadData) { - await this.crunchy.refreshToken(true); - console.log(`[DEBUG] Got download options: ${JSON.stringify(data)}`); - this.setDownloading(true); - const _default = buildDefault() as ArgvType; - const res = await this.crunchy.downloadFromSeriesID(data.id, { - dubLang: data.dubLang, - e: data.e - }); - if (res.isOk) { - for (const select of res.value) { - if (!(await this.crunchy.downloadEpisode(select, {..._default, skipsubs: false, callbackMaker: this.makeProgressHandler.bind(this), q: data.q, fileName: data.fileName, dlsubs: data.dlsubs, dlVideoOnce: data.dlVideoOnce, force: 'y', - novids: data.novids }))) { - const er = new Error(`Unable to download episode ${data.e} from ${data.id}`); - er.name = 'Download error'; - this.alertError(er); - } - } - } else { - this.alertError(res.reason); - } - this.sendMessage({ name: 'finish', data: undefined }); - this.setDownloading(false); - } -} - +import { AuthData, CheckTokenResponse, DownloadData, EpisodeListResponse, MessageHandler, QueueItem, ResolveItemsData, ResponseBase, SearchData, SearchResponse } from '../../../@types/messageHandler'; +import Crunchy from '../../../crunchy'; +import { ArgvType } from '../../../modules/module.app-args'; +import { buildDefault, getDefault } from '../../../modules/module.args'; +import { languages, subtitleLanguagesFilter } from '../../../modules/module.langsData'; +import WebSocketHandler from '../websocket'; +import Base from './base'; + +class CrunchyHandler extends Base implements MessageHandler { + private crunchy: Crunchy; + constructor(ws: WebSocketHandler) { + super(ws); + this.crunchy = new Crunchy(); + this.crunchy.refreshToken(); + } + + public async listEpisodes (id: string): Promise { + await this.crunchy.refreshToken(true); + return { isOk: true, value: (await this.crunchy.listSeriesID(id)).list }; + } + + public async handleDefault(name: string) { + return getDefault(name, this.crunchy.cfg.cli); + } + + public async availableDubCodes(): Promise { + const dubLanguageCodesArray: string[] = []; + for(const language of languages){ + if (language.cr_locale) + dubLanguageCodesArray.push(language.code); + } + return [...new Set(dubLanguageCodesArray)]; + } + + public async availableSubCodes(): Promise { + return subtitleLanguagesFilter; + } + + public async resolveItems(data: ResolveItemsData): Promise> { + await this.crunchy.refreshToken(true); + console.log(`[DEBUG] Got resolve options: ${JSON.stringify(data)}`); + const res = await this.crunchy.downloadFromSeriesID(data.id, data); + if (!res.isOk) + return res; + return { isOk: true, value: res.value.map(a => { + return { + ...data, + ids: a.data.map(a => a.mediaId), + title: a.episodeTitle, + parent: { + title: a.seasonTitle, + season: a.season.toString() + }, + e: a.e, + image: a.image, + episode: a.episodeNumber + }; + }) }; + } + + public async search(data: SearchData): Promise { + await this.crunchy.refreshToken(true); + console.log(`[DEBUG] Got search options: ${JSON.stringify(data)}`); + const crunchySearch = await this.crunchy.doSearch(data); + if (!crunchySearch.isOk) { + this.crunchy.refreshToken(); + return crunchySearch; + } + return { isOk: true, value: crunchySearch.value }; + } + + public async checkToken(): Promise { + if (await this.crunchy.getProfile()) { + return { isOk: true, value: undefined }; + } else { + return { isOk: false, reason: new Error('') }; + } + } + + public auth(data: AuthData) { + return this.crunchy.doAuth(data); + } + + public async downloadItem(data: DownloadData) { + await this.crunchy.refreshToken(true); + console.log(`[DEBUG] Got download options: ${JSON.stringify(data)}`); + this.setDownloading(true); + const _default = buildDefault() as ArgvType; + const res = await this.crunchy.downloadFromSeriesID(data.id, { + dubLang: data.dubLang, + e: data.e + }); + if (res.isOk) { + for (const select of res.value) { + if (!(await this.crunchy.downloadEpisode(select, {..._default, skipsubs: false, callbackMaker: this.makeProgressHandler.bind(this), q: data.q, fileName: data.fileName, dlsubs: data.dlsubs, dlVideoOnce: data.dlVideoOnce, force: 'y', + novids: data.novids }))) { + const er = new Error(`Unable to download episode ${data.e} from ${data.id}`); + er.name = 'Download error'; + this.alertError(er); + } + } + } else { + this.alertError(res.reason); + } + this.sendMessage({ name: 'finish', data: undefined }); + this.setDownloading(false); + } +} + export default CrunchyHandler; \ No newline at end of file diff --git a/gui/electron/src/serviceHandler/funimation.ts b/gui/server/services/funimation.ts similarity index 85% rename from gui/electron/src/serviceHandler/funimation.ts rename to gui/server/services/funimation.ts index 18fc70e..ef7719d 100644 --- a/gui/electron/src/serviceHandler/funimation.ts +++ b/gui/server/services/funimation.ts @@ -1,115 +1,115 @@ -import { BrowserWindow } from 'electron'; -import { AuthData, CheckTokenResponse, DownloadData, EpisodeListResponse, MessageHandler, QueueItem, ResolveItemsData, ResponseBase, SearchData, SearchResponse } from '../../../../@types/messageHandler'; -import Funimation from '../../../../funi'; -import { ArgvType } from '../../../../modules/module.app-args'; -import { buildDefault, getDefault } from '../../../../modules/module.args'; -import { languages, subtitleLanguagesFilter } from '../../../../modules/module.langsData'; -import Base from './base'; - -class FunimationHandler extends Base implements MessageHandler { - private funi: Funimation; - constructor(window: BrowserWindow) { - super(window); - this.funi = new Funimation(); - } - - public async listEpisodes (id: string) : Promise { - const parse = parseInt(id); - if (isNaN(parse) || parse <= 0) - return { isOk: false, reason: new Error('The ID is invalid') }; - const request = await this.funi.listShowItems(parse); - if (!request.isOk) - return request; - return { isOk: true, value: request.value.map(item => ({ - e: item.id_split.join(''), - lang: item.audio ?? [], - name: item.title, - season: item.seasonNum ?? item.seasonTitle ?? item.item.seasonNum ?? item.item.seasonTitle, - seasonTitle: item.seasonTitle, - episode: item.episodeNum, - id: item.id, - img: item.thumb, - description: item.synopsis, - time: item.runtime ?? item.item.runtime - })) }; - } - - public async handleDefault(name: string) { - return getDefault(name, this.funi.cfg.cli); - } - - public async availableDubCodes(): Promise { - const dubLanguageCodesArray = []; - for(const language of languages){ - if (language.funi_locale) - dubLanguageCodesArray.push(language.code); - } - return [...new Set(dubLanguageCodesArray)]; - } - - public async availableSubCodes(): Promise { - return subtitleLanguagesFilter; - } - - public async resolveItems(data: ResolveItemsData): Promise> { - console.log(`[DEBUG] Got resolve options: ${JSON.stringify(data)}`); - const res = await this.funi.getShow(false, { ...data, id: parseInt(data.id) }); - if (!res.isOk) - return res; - return { isOk: true, value: res.value.map(a => { - return { - ...data, - ids: [a.episodeID], - title: a.title, - parent: { - title: a.seasonTitle, - season: a.seasonNumber - }, - image: a.image, - e: a.episodeID, - episode: a.epsiodeNumber, - }; - }) }; - } - - public async search(data: SearchData): Promise { - console.log(`[DEBUG] Got search options: ${JSON.stringify(data)}`); - const funiSearch = await this.funi.searchShow(false, data); - if (!funiSearch.isOk) - return funiSearch; - return { isOk: true, value: funiSearch.value.items.hits.map(a => ({ - image: a.image.showThumbnail, - name: a.title, - desc: a.description, - id: a.id, - lang: a.languages, - rating: a.starRating - })) }; - } - - public async checkToken(): Promise { - return this.funi.checkToken(); - } - - public auth(data: AuthData) { - return this.funi.auth(data); - } - - public async downloadItem(data: DownloadData) { - this.setDownloading(true); - console.log(`[DEBUG] Got download options: ${JSON.stringify(data)}`); - const res = await this.funi.getShow(false, { all: false, but: false, id: parseInt(data.id), e: data.e }); - const _default = buildDefault() as ArgvType; - if (!res.isOk) - return this.alertError(res.reason); - - for (const ep of res.value) { - await this.funi.getEpisode(false, { dubLang: data.dubLang, fnSlug: ep, s: data.id, subs: { dlsubs: data.dlsubs, sub: false, ccTag: _default.ccTag } }, { ..._default, callbackMaker: this.makeProgressHandler.bind(this), ass: true, fileName: data.fileName, q: data.q, force: 'y', - noaudio: data.noaudio, novids: data.novids }); - } - this.sendMessage({ name: 'finish', data: undefined }); - this.setDownloading(false); - } -} - +import { AuthData, CheckTokenResponse, DownloadData, EpisodeListResponse, MessageHandler, QueueItem, ResolveItemsData, ResponseBase, SearchData, SearchResponse } from '../../../@types/messageHandler'; +import Funimation from '../../../funi'; +import { ArgvType } from '../../../modules/module.app-args'; +import { buildDefault, getDefault } from '../../../modules/module.args'; +import { languages, subtitleLanguagesFilter } from '../../../modules/module.langsData'; +import WebSocketHandler from '../websocket'; +import Base from './base'; + +class FunimationHandler extends Base implements MessageHandler { + private funi: Funimation; + constructor(ws: WebSocketHandler) { + super(ws); + this.funi = new Funimation(); + } + + public async listEpisodes (id: string) : Promise { + const parse = parseInt(id); + if (isNaN(parse) || parse <= 0) + return { isOk: false, reason: new Error('The ID is invalid') }; + const request = await this.funi.listShowItems(parse); + if (!request.isOk) + return request; + return { isOk: true, value: request.value.map(item => ({ + e: item.id_split.join(''), + lang: item.audio ?? [], + name: item.title, + season: item.seasonNum ?? item.seasonTitle ?? item.item.seasonNum ?? item.item.seasonTitle, + seasonTitle: item.seasonTitle, + episode: item.episodeNum, + id: item.id, + img: item.thumb, + description: item.synopsis, + time: item.runtime ?? item.item.runtime + })) }; + } + + public async handleDefault(name: string) { + return getDefault(name, this.funi.cfg.cli); + } + + public async availableDubCodes(): Promise { + const dubLanguageCodesArray: string[] = []; + for(const language of languages){ + if (language.funi_locale) + dubLanguageCodesArray.push(language.code); + } + return [...new Set(dubLanguageCodesArray)]; + } + + public async availableSubCodes(): Promise { + return subtitleLanguagesFilter; + } + + public async resolveItems(data: ResolveItemsData): Promise> { + console.log(`[DEBUG] Got resolve options: ${JSON.stringify(data)}`); + const res = await this.funi.getShow(false, { ...data, id: parseInt(data.id) }); + if (!res.isOk) + return res; + return { isOk: true, value: res.value.map(a => { + return { + ...data, + ids: [a.episodeID], + title: a.title, + parent: { + title: a.seasonTitle, + season: a.seasonNumber + }, + image: a.image, + e: a.episodeID, + episode: a.epsiodeNumber, + }; + }) }; + } + + public async search(data: SearchData): Promise { + console.log(`[DEBUG] Got search options: ${JSON.stringify(data)}`); + const funiSearch = await this.funi.searchShow(false, data); + if (!funiSearch.isOk) + return funiSearch; + return { isOk: true, value: funiSearch.value.items.hits.map(a => ({ + image: a.image.showThumbnail, + name: a.title, + desc: a.description, + id: a.id, + lang: a.languages, + rating: a.starRating + })) }; + } + + public async checkToken(): Promise { + return this.funi.checkToken(); + } + + public auth(data: AuthData) { + return this.funi.auth(data); + } + + public async downloadItem(data: DownloadData) { + this.setDownloading(true); + console.log(`[DEBUG] Got download options: ${JSON.stringify(data)}`); + const res = await this.funi.getShow(false, { all: false, but: false, id: parseInt(data.id), e: data.e }); + const _default = buildDefault() as ArgvType; + if (!res.isOk) + return this.alertError(res.reason); + + for (const ep of res.value) { + await this.funi.getEpisode(false, { dubLang: data.dubLang, fnSlug: ep, s: data.id, subs: { dlsubs: data.dlsubs, sub: false, ccTag: _default.ccTag } }, { ..._default, callbackMaker: this.makeProgressHandler.bind(this), ass: true, fileName: data.fileName, q: data.q, force: 'y', + noaudio: data.noaudio, novids: data.novids }); + } + this.sendMessage({ name: 'finish', data: undefined }); + this.setDownloading(false); + } +} + export default FunimationHandler; \ No newline at end of file diff --git a/gui/server/websocket.ts b/gui/server/websocket.ts new file mode 100644 index 0000000..efa6dc2 --- /dev/null +++ b/gui/server/websocket.ts @@ -0,0 +1,74 @@ +import { IncomingMessage, Server } from "http"; +import ws, { WebSocket } from 'ws'; +import { RandomEvent, RandomEvents } from "../../@types/randomEvents"; +import { MessageTypes, UnknownWSMessage, WSMessage } from "../../@types/ws"; +import { EventEmitter } from "events"; +import { cfg } from "."; + +declare interface ExternalEvent { + on(event: T, listener: (msg: WSMessage, respond: (data: MessageTypes[T][1]) => void) => void): this; + emit(event: T, msg: WSMessage, respond: (data: MessageTypes[T][1]) => void): boolean; +} + +class ExternalEvent extends EventEmitter {} + +export default class WebSocketHandler { + + private wsServer: ws.Server; + + public events: ExternalEvent = new ExternalEvent(); + + constructor(server: Server) { + this.wsServer = new ws.WebSocketServer({ noServer: true, path: '/ws' }); + + this.wsServer.on('connection', (socket, req) => { + console.log(`[INFO] [WS] Connection from '${req.socket.remoteAddress}'`); + socket.on('error', (er) => console.log(`[ERROR] [WS] ${er}`)); + socket.on('message', (data) => { + const json = JSON.parse(data.toString()) as UnknownWSMessage; + this.events.emit(json.name, json as any, (data) => { + this.wsServer.clients.forEach(client => { + if (client.readyState !== WebSocket.OPEN) + return; + client.send(JSON.stringify({ + data, + id: json.id, + name: json.name + }), (er) => { + if (er) + console.log(`[ERROR] [WS] ${er}`) + }); + }) + }); + }); + }); + + server.on('upgrade', (request, socket, head) => { + if (!this.authenticate(request)) { + socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n'); + socket.destroy(); + return; + } + this.wsServer.handleUpgrade(request, socket, head, socket => { + this.wsServer.emit('connection', socket, request); + }); + }); + } + + public sendMessage(data: RandomEvent) { + this.wsServer.clients.forEach(client => { + if (client.readyState !== WebSocket.OPEN) + return; + client.send(JSON.stringify(data), (er) => { + if (er) + console.log(`[ERROR] [WS] ${er}`); + }); + }) + } + + private authenticate(request: IncomingMessage): boolean { + return cfg.gui.password === new URL(`http://${request.headers.host}${request.url}`).searchParams.get('password'); + } + +} + diff --git a/modules/build-docs.ts b/modules/build-docs.ts index 68a00cf..1c3de2b 100644 --- a/modules/build-docs.ts +++ b/modules/build-docs.ts @@ -45,7 +45,7 @@ Object.entries(groups).forEach(([key, value]) => { typeof argument.default === 'object' ? Array.isArray(argument.default) ? JSON.stringify(argument.default) - : argument.default.default + : (argument.default as any).default : argument.default }\`|` : ''}` + ` ${typeof argument.default === 'object' && !Array.isArray(argument.default) diff --git a/modules/build.ts b/modules/build.ts index 943d08e..05a7eb4 100644 --- a/modules/build.ts +++ b/modules/build.ts @@ -15,61 +15,11 @@ type BuildTypes = `${'ubuntu'|'windows'|'macos'|'arm'}64` const buildType = process.argv[2] as BuildTypes; const isGUI = process.argv[3] === 'true'; - if (isGUI) { - buildGUI(buildType); - } else { - buildBinary(buildType); - } + buildBinary(buildType, isGUI); })(); -async function buildGUI(buildType: BuildTypes) { - execSync(`npx electron-builder build --publish=never ${getCommand(buildType)}`, { stdio: [0,1,2] }); - execSync(`7z a -t7z "../${buildsDir}/multi-downloader-nx-${buildType}-gui.7z" ${getOutputFileName(buildType).map(a => `"${a}"`).join(' ')}`,{ - stdio:[0,1,2], - cwd: path.join('dist') - }); -} - -function getCommand(buildType: BuildTypes) { - switch (buildType) { - case 'arm64': - return '--linux --arm64'; - case 'ubuntu64': - return '--linux --x64'; - case 'windows64': - return '--win'; - case 'macos64': - return '--mac dmg'; - default: - return '--error'; - } -} - -function getOutputFileName(buildType: BuildTypes): string[] { - switch (buildType) { - case 'arm64': - return [ - `${pkg.name}_${pkg.version}_arm64.deb` - ]; - case 'ubuntu64': - return [ - `${pkg.name}_${pkg.version}_amd64.deb` - ]; - case 'windows64': - return [ - `${pkg.name} Setup ${pkg.version}.exe` - ]; - case 'macos64': - return [ - `${pkg.name}-${pkg.version}.dmg` - ]; - default: - throw new Error(`Unknown build type ${buildType}`); - } -} - // main -async function buildBinary(buildType: BuildTypes) { +async function buildBinary(buildType: BuildTypes, gui: boolean) { const buildStr = 'multi-downloader-nx'; const acceptableBuilds = ['windows64','ubuntu64','macos64']; if(!acceptableBuilds.includes(buildType)){ @@ -87,7 +37,7 @@ async function buildBinary(buildType: BuildTypes) { } fs.mkdirSync(buildDir); const buildConfig = [ - pkg.main, + gui ? 'gui.js' : 'index.js', '--target', nodeVer + getTarget(buildType), '--output', `${buildDir}/${pkg.short_name}`, ]; @@ -109,6 +59,10 @@ async function buildBinary(buildType: BuildTypes) { fs.copySync('./package.json', `${buildDir}/package.json`); fs.copySync('./docs/', `${buildDir}/docs/`); fs.copySync('./LICENSE.md', `${buildDir}/docs/LICENSE.md`); + if (gui) { + fs.copySync('./gui', `${buildDir}/gui`) + fs.copySync('./node_modules/open/xdg-open', `${buildDir}/xdg-open`) + } if(fs.existsSync(`${buildsDir}/${buildFull}.7z`)){ fs.removeSync(`${buildsDir}/${buildFull}.7z`); } diff --git a/modules/module.app-args.ts b/modules/module.app-args.ts index 140b1ba..b50c030 100644 --- a/modules/module.app-args.ts +++ b/modules/module.app-args.ts @@ -2,7 +2,7 @@ import yargs, { Choices } from 'yargs'; import { args, AvailableMuxer, groups } from './module.args'; import { LanguageItem } from './module.langsData'; -let argvC: { [x: string]: unknown; ccTag: string, defaultAudio: LanguageItem, defaultSub: LanguageItem, ffmpegOptions: string[], mkvmergeOptions: string[], force: 'Y'|'y'|'N'|'n'|'C'|'c', skipUpdate: boolean, videoTitle: string, override: string[], fsRetryTime: number, forceMuxer: AvailableMuxer|undefined; username: string|undefined, password: string|undefined, silentAuth: boolean, skipSubMux: boolean, downloadArchive: boolean, addArchive: boolean, but: boolean, auth: boolean | undefined; dlFonts: boolean | undefined; search: string | undefined; 'search-type': string; page: number | undefined; 'search-locale': string; new: boolean | undefined; 'movie-listing': string | undefined; series: string | undefined; s: string | undefined; e: string | undefined; q: number; x: number; kstream: number; partsize: number; hslang: string; dlsubs: string[]; novids: boolean | undefined; noaudio: boolean | undefined; nosubs: boolean | undefined; dubLang: string[]; all: boolean; fontSize: number; allDubs: boolean; timeout: number; simul: boolean; mp4: boolean; skipmux: boolean | undefined; fileName: string; numbers: number; nosess: string; debug: boolean | undefined; nocleanup: boolean; help: boolean | undefined; service: 'funi' | 'crunchy'; update: boolean; fontName: string | undefined; _: (string | number)[]; $0: string; dlVideoOnce: boolean; }; +let argvC: { [x: string]: unknown; port: number, ccTag: string, defaultAudio: LanguageItem, defaultSub: LanguageItem, ffmpegOptions: string[], mkvmergeOptions: string[], force: 'Y'|'y'|'N'|'n'|'C'|'c', skipUpdate: boolean, videoTitle: string, override: string[], fsRetryTime: number, forceMuxer: AvailableMuxer|undefined; username: string|undefined, password: string|undefined, silentAuth: boolean, skipSubMux: boolean, downloadArchive: boolean, addArchive: boolean, but: boolean, auth: boolean | undefined; dlFonts: boolean | undefined; search: string | undefined; 'search-type': string; page: number | undefined; 'search-locale': string; new: boolean | undefined; 'movie-listing': string | undefined; series: string | undefined; s: string | undefined; e: string | undefined; q: number; x: number; kstream: number; partsize: number; hslang: string; dlsubs: string[]; novids: boolean | undefined; noaudio: boolean | undefined; nosubs: boolean | undefined; dubLang: string[]; all: boolean; fontSize: number; allDubs: boolean; timeout: number; simul: boolean; mp4: boolean; skipmux: boolean | undefined; fileName: string; numbers: number; nosess: string; debug: boolean | undefined; nocleanup: boolean; help: boolean | undefined; service: 'funi' | 'crunchy'; update: boolean; fontName: string | undefined; _: (string | number)[]; $0: string; dlVideoOnce: boolean; }; export type ArgvType = typeof argvC; @@ -53,7 +53,7 @@ const getArgv = (cfg: { [key:string]: unknown }) => { ...a, group: groups[a.group], default: typeof a.default === 'object' && !Array.isArray(a.default) ? - parseDefault(a.default.name || a.name, a.default.default) : a.default + parseDefault((a.default as any).name || a.name, (a.default as any).default) : a.default }; }); for (const item of data) diff --git a/modules/module.args.ts b/modules/module.args.ts index 15e5db2..fb147d6 100644 --- a/modules/module.args.ts +++ b/modules/module.args.ts @@ -9,7 +9,8 @@ const groups = { 'fileName': 'Filename Template:', 'debug': 'Debug:', 'util': 'Utilities:', - 'help': 'Help:' + 'help': 'Help:', + 'gui': 'GUI:' }; export type AvailableFilenameVars = 'title' | 'episode' | 'showTitle' | 'season' | 'width' | 'height' | 'service' @@ -703,6 +704,16 @@ const args: TAppArg[] = [ default: { default: 'cc' } + }, + { + name: 'port', + describe: 'Set the port for the GUI server', + docDescribe: true, + group: 'gui', + service: 'both', + default: 3000, + type: 'number', + usage: '${port}' } ]; @@ -715,10 +726,10 @@ const getDefault = (name: string, cfg if (typeof option.default === 'object') { if (Array.isArray(option.default)) return option.default as T; - if (Object.prototype.hasOwnProperty.call(cfg, option.default.name ?? option.name)) { - return cfg[option.default.name ?? option.name]; + if (Object.prototype.hasOwnProperty.call(cfg, (option.default as any).name ?? option.name)) { + return cfg[(option.default as any).name ?? option.name]; } else { - return option.default.default as T; + return (option.default as any).default as T; } } else { return option.default as T; @@ -733,7 +744,7 @@ const buildDefault = () => { if (Array.isArray(item.default)) { data[item.name] = item.default; } else { - data[item.default.name ?? item.name] = item.default.default; + data[(item.default as any).name ?? item.name] = (item.default as any).default; } } else { data[item.name] = item.default; diff --git a/modules/module.cfg-loader.ts b/modules/module.cfg-loader.ts index 63a8088..ebe0414 100644 --- a/modules/module.cfg-loader.ts +++ b/modules/module.cfg-loader.ts @@ -12,6 +12,7 @@ export { workingDir }; const binCfgFile = path.join(workingDir, 'config', 'bin-path'); const dirCfgFile = path.join(workingDir, 'config', 'dir-path'); +const guiCfgFile = path.join(workingDir, 'config', 'gui') const cliCfgFile = path.join(workingDir, 'config', 'cli-defaults'); const sessCfgFile = path.join(workingDir, 'config', 'session'); const tokenFile = { @@ -23,7 +24,7 @@ export const ensureConfig = () => { if (!fs.existsSync(path.join(workingDir, 'config'))) fs.mkdirSync(path.join(workingDir, 'config')); if (process.env.contentDirectory) - [binCfgFile, dirCfgFile, cliCfgFile].forEach(a => { + [binCfgFile, dirCfgFile, cliCfgFile, guiCfgFile].forEach(a => { if (!fs.existsSync(`${a}.yml`)) fs.copyFileSync(path.join(__dirname, '..', 'config', `${path.basename(a)}.yml`), `${a}.yml`); }); @@ -59,6 +60,10 @@ export type ConfigObject = { }, cli: { [key: string]: any + }, + gui: { + port: number, + password: string } } @@ -75,6 +80,10 @@ const loadCfg = () : ConfigObject => { cli: loadYamlCfgFile<{ [key: string]: any }>(cliCfgFile), + gui: loadYamlCfgFile<{ + port: number, + password: string + }>(guiCfgFile) }; const defaultDirs = { fonts: '${wdir}/fonts/', diff --git a/modules/module.fontsData.ts b/modules/module.fontsData.ts index d754c5b..0a6cfae 100644 --- a/modules/module.fontsData.ts +++ b/modules/module.fontsData.ts @@ -28,7 +28,7 @@ const fontFamilies = { // collect styles from ass string function assFonts(ass: string){ const strings = ass.replace(/\r/g,'').split('\n'); - const styles = []; + const styles: string[] = []; for(const s of strings){ if(s.match(/^Style: /)){ const addStyle = s.split(','); diff --git a/modules/module.langsData.ts b/modules/module.langsData.ts index f39ae47..d722e70 100644 --- a/modules/module.langsData.ts +++ b/modules/module.langsData.ts @@ -44,7 +44,7 @@ const languages: LanguageItem[] = [ // construct dub language codes const dubLanguageCodes = (() => { - const dubLanguageCodesArray = []; + const dubLanguageCodesArray: string[] = []; for(const language of languages){ dubLanguageCodesArray.push(language.code); } diff --git a/modules/module.merger.ts b/modules/module.merger.ts index ae0121c..72e17e1 100644 --- a/modules/module.merger.ts +++ b/modules/module.merger.ts @@ -56,8 +56,8 @@ class Merger { } public FFmpeg() : string { - const args = []; - const metaData = []; + const args: string[] = []; + const metaData: string[] = []; let index = 0; let audioIndex = 0; @@ -137,7 +137,7 @@ class Merger { }; public MkvMerge = () => { - const args = []; + const args: string[] = []; let hasVideo = false; @@ -272,7 +272,7 @@ class Merger { language: LanguageItem, fonts: Font[] }[]) : ParsedFont[] { - let fontsNameList: Font[] = []; const fontsList = [], subsList = []; let isNstr = true; + let fontsNameList: Font[] = []; const fontsList: { name: string, path: string, mime: string }[] = [], subsList: string[] = []; let isNstr = true; for(const s of subs){ fontsNameList.push(...s.fonts); subsList.push(s.language.locale); diff --git a/modules/module.req.ts b/modules/module.req.ts index 05205c3..447cf3c 100644 --- a/modules/module.req.ts +++ b/modules/module.req.ts @@ -122,7 +122,7 @@ class Req { } } setNewCookie(setCookie: Record, isAuth: boolean, fileData?: string){ - const cookieUpdated = []; let lastExp = 0; + const cookieUpdated: string[] = []; let lastExp = 0; console.trace('Type of setCookie:', typeof setCookie, setCookie); const parsedCookie = fileData ? cookieFile(fileData) : shlp.cookie.parse(setCookie); for(const cookieName of Object.keys(parsedCookie)){ diff --git a/modules/module.vttconvert.ts b/modules/module.vttconvert.ts index 902b99c..4226049 100644 --- a/modules/module.vttconvert.ts +++ b/modules/module.vttconvert.ts @@ -10,7 +10,7 @@ export type NullRecord = Record | null; function loadVtt(vttStr: string) { const rx = /^([\d:.]*) --> ([\d:.]*)\s?(.*?)\s*$/; const lines = vttStr.replace(/\r?\n/g, '\n').split('\n'); - const data = []; let lineBuf = [], record: NullRecord = null; + const data: Record[] = []; let lineBuf: string[] = [], record: NullRecord = null; // check lines for (const l of lines) { const m = l.match(rx); @@ -142,7 +142,7 @@ function convertTime(time: string, srtFormat = false) { function toSubsTime(str: string, srtFormat: boolean) : string { - const n = [], x: (string|number)[] = str.split(/[:.]/).map(x => Number(x)); let sx; + const n: string[] = [], x: (string|number)[] = str.split(/[:.]/).map(x => Number(x)); let sx; const msLen = srtFormat ? 3 : 2; const hLen = srtFormat ? 2 : 1; diff --git a/package.json b/package.json index 32b2a7e..91a6014 100644 --- a/package.json +++ b/package.json @@ -35,14 +35,14 @@ "url": "https://github.com/anidl/multi-downloader-nx/issues" }, "license": "MIT", - "main": "gui/electron/src/index.js", "dependencies": { "@babel/core": "^7.20.12", "@babel/plugin-syntax-flow": "^7.18.6", "@babel/plugin-transform-react-jsx": "^7.20.13", "cheerio": "^1.0.0-rc.12", + "copy-to-clipboard": "^3.3.3", + "cors": "^2.8.5", "dotenv": "^16.0.3", - "electron-squirrel-startup": "^1.0.0", "eslint-plugin-import": "^2.27.5", "express": "^4.18.2", "form-data": "^4.0.0", @@ -52,39 +52,35 @@ "iso-639": "^0.2.2", "lookpath": "^1.2.2", "m3u8-parsed": "^1.3.0", + "open": "^8.4.2", "sei-helper": "^3.3.0", "typescript-eslint": "^0.0.1-alpha.0", - "webpack": "^5.75.0", + "ws": "^8.12.1", "yaml": "^2.2.1", "yargs": "^17.7.0" }, "devDependencies": { + "@types/cors": "^2.8.13", "@types/express": "^4.17.17", "@types/fs-extra": "^11.0.1", "@types/node": "^18.14.0", + "@types/ws": "^8.5.4", "@types/yargs": "^17.0.22", "@typescript-eslint/eslint-plugin": "^5.52.0", "@typescript-eslint/parser": "^5.52.0", "@vercel/webpack-asset-relocator-loader": "^1.7.3", - "css-loader": "^6.7.3", - "electron": "23.1.0", - "electron-builder": "^23.6.0", "eslint": "^8.34.0", "eslint-config-react-app": "^7.0.1", "eslint-plugin-import": "^2.25.4", "eslint-plugin-react": "^7.32.2", - "fork-ts-checker-webpack-plugin": "^7.3.0", - "node-loader": "^2.0.0", "pkg": "^5.8.0", "removeNPMAbsolutePaths": "^3.0.1", - "style-loader": "^3.3.1", - "ts-loader": "^9.4.2", "ts-node": "^10.9.1", - "typescript": "^4.9.5" + "typescript": "5.1.0-dev.20230227" }, "scripts": { "prestart": "pnpm run tsc test", - "start": "pnpm prestart && cd lib && npx electron .", + "start": "pnpm prestart && cd lib && node gui.js", "docs": "ts-node modules/build-docs.ts", "tsc": "ts-node tsc.ts", "prebuild-cli": "pnpm run tsc false false", @@ -101,33 +97,5 @@ "eslint-fix": "eslint *.js modules --fix", "pretest": "pnpm run tsc", "test": "pnpm run pretest && cd lib && node modules/build windows64 && node modules/build ubuntu64 && node modules/build macos64" - }, - "build": { - "appId": "github.com/anidl", - "mac": { - "category": "public.app-category.developer-tools", - "darkModeSupport": true - }, - "dmg": { - "iconSize": 160, - "contents": [ - { - "x": 180, - "y": 170 - }, - { - "x": 480, - "y": 170, - "type": "link", - "path": "/Applications" - } - ] - }, - "linux": { - "target": [ - "deb" - ], - "category": "Development" - } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f29bc70..42b9316 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,25 +4,24 @@ specifiers: '@babel/core': ^7.20.12 '@babel/plugin-syntax-flow': ^7.18.6 '@babel/plugin-transform-react-jsx': ^7.20.13 + '@types/cors': ^2.8.13 '@types/express': ^4.17.17 '@types/fs-extra': ^11.0.1 '@types/node': ^18.14.0 + '@types/ws': ^8.5.4 '@types/yargs': ^17.0.22 '@typescript-eslint/eslint-plugin': ^5.52.0 '@typescript-eslint/parser': ^5.52.0 '@vercel/webpack-asset-relocator-loader': ^1.7.3 cheerio: ^1.0.0-rc.12 - css-loader: ^6.7.3 + copy-to-clipboard: ^3.3.3 + cors: ^2.8.5 dotenv: ^16.0.3 - electron: 23.1.0 - electron-builder: ^23.6.0 - electron-squirrel-startup: ^1.0.0 eslint: ^8.34.0 eslint-config-react-app: ^7.0.1 eslint-plugin-import: ^2.27.5 eslint-plugin-react: ^7.32.2 express: ^4.18.2 - fork-ts-checker-webpack-plugin: ^7.3.0 form-data: ^4.0.0 fs-extra: ^11.1.0 got: ^11.8.6 @@ -30,16 +29,14 @@ specifiers: iso-639: ^0.2.2 lookpath: ^1.2.2 m3u8-parsed: ^1.3.0 - node-loader: ^2.0.0 + open: ^8.4.2 pkg: ^5.8.0 removeNPMAbsolutePaths: ^3.0.1 sei-helper: ^3.3.0 - style-loader: ^3.3.1 - ts-loader: ^9.4.2 ts-node: ^10.9.1 - typescript: ^4.9.5 + typescript: 5.1.0-dev.20230227 typescript-eslint: ^0.0.1-alpha.0 - webpack: ^5.75.0 + ws: ^8.12.1 yaml: ^2.2.1 yargs: ^17.7.0 @@ -48,8 +45,9 @@ dependencies: '@babel/plugin-syntax-flow': 7.18.6_@babel+core@7.20.12 '@babel/plugin-transform-react-jsx': 7.20.13_@babel+core@7.20.12 cheerio: 1.0.0-rc.12 + copy-to-clipboard: 3.3.3 + cors: 2.8.5 dotenv: 16.0.3 - electron-squirrel-startup: 1.0.0 eslint-plugin-import: 2.27.5_mcvs2y73sfmcxqzpjj5lr7a2m4 express: 4.18.2 form-data: 4.0.0 @@ -59,41 +57,33 @@ dependencies: iso-639: 0.2.2 lookpath: 1.2.2 m3u8-parsed: 1.3.0 + open: 8.4.2 sei-helper: 3.3.0 typescript-eslint: 0.0.1-alpha.0 - webpack: 5.75.0 + ws: 8.12.1 yaml: 2.2.1 yargs: 17.7.0 devDependencies: + '@types/cors': 2.8.13 '@types/express': 4.17.17 '@types/fs-extra': 11.0.1 '@types/node': 18.14.0 + '@types/ws': 8.5.4 '@types/yargs': 17.0.22 - '@typescript-eslint/eslint-plugin': 5.52.0_6cfvjsbua5ptj65675bqcn6oza - '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + '@typescript-eslint/eslint-plugin': 5.52.0_mx5xzldkgqq7ny4cexynopgt2u + '@typescript-eslint/parser': 5.52.0_epp7imp7tzws63sm7xmkgywa6u '@vercel/webpack-asset-relocator-loader': 1.7.3 - css-loader: 6.7.3_webpack@5.75.0 - electron: 23.1.0 - electron-builder: 23.6.0 eslint: 8.34.0 - eslint-config-react-app: 7.0.1_tseuwpko2uhnzn4cv7fs2adf4m + eslint-config-react-app: 7.0.1_loofw3752f66lcbt6ckkhpg3my eslint-plugin-react: 7.32.2_eslint@8.34.0 - fork-ts-checker-webpack-plugin: 7.3.0_hhrrucqyg4eysmfpujvov2ym5u - node-loader: 2.0.0_webpack@5.75.0 pkg: 5.8.0 removeNPMAbsolutePaths: 3.0.1 - style-loader: 3.3.1_webpack@5.75.0 - ts-loader: 9.4.2_hhrrucqyg4eysmfpujvov2ym5u - ts-node: 10.9.1_tncu2ai53lzgmizdedur7lbibe - typescript: 4.9.5 + ts-node: 10.9.1_t7zjf32qdusxw4ohfklq3etpl4 + typescript: 5.1.0-dev.20230227 packages: - /7zip-bin/5.1.1: - resolution: {integrity: sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==} - dev: true - /@ampproject/remapping/2.2.0: resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} engines: {node: '>=6.0.0'} @@ -1437,46 +1427,6 @@ packages: '@jridgewell/trace-mapping': 0.3.9 dev: true - /@develar/schema-utils/2.6.5: - resolution: {integrity: sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==} - engines: {node: '>= 8.9.0'} - dependencies: - ajv: 6.12.6 - ajv-keywords: 3.5.2_ajv@6.12.6 - dev: true - - /@electron/get/2.0.2: - resolution: {integrity: sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g==} - engines: {node: '>=12'} - dependencies: - debug: 4.3.4 - env-paths: 2.2.1 - fs-extra: 8.1.0 - got: 11.8.6 - progress: 2.0.3 - semver: 6.3.0 - sumchecker: 3.0.1 - optionalDependencies: - global-agent: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@electron/universal/1.2.1: - resolution: {integrity: sha512-7323HyMh7KBAl/nPDppdLsC87G6RwRU02dy5FPeGB1eS7rUePh55+WNWiDPLhFQqqVPHzh77M69uhmoT8XnwMQ==} - engines: {node: '>=8.6'} - dependencies: - '@malept/cross-spawn-promise': 1.1.1 - asar: 3.2.0 - debug: 4.3.4 - dir-compare: 2.4.0 - fs-extra: 9.1.0 - minimatch: 3.1.2 - plist: 3.0.6 - transitivePeerDependencies: - - supports-color - dev: true - /@eslint/eslintrc/1.4.1: resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1533,12 +1483,6 @@ packages: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} - /@jridgewell/source-map/0.3.2: - resolution: {integrity: sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==} - dependencies: - '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.17 - /@jridgewell/sourcemap-codec/1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} @@ -1555,25 +1499,6 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@malept/cross-spawn-promise/1.1.1: - resolution: {integrity: sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==} - engines: {node: '>= 10'} - dependencies: - cross-spawn: 7.0.3 - dev: true - - /@malept/flatpak-bundler/0.4.0: - resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} - engines: {node: '>= 10.0.0'} - dependencies: - debug: 4.3.4 - fs-extra: 9.1.0 - lodash: 4.17.21 - tmp-promise: 3.0.3 - transitivePeerDependencies: - - supports-color - dev: true - /@nicolo-ribaudo/eslint-scope-5-internals/5.1.1-v1: resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} dependencies: @@ -1605,23 +1530,20 @@ packages: /@sindresorhus/is/4.6.0: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} + dev: false /@szmarczak/http-timer/4.0.6: resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} dependencies: defer-to-connect: 2.0.1 + dev: false /@tootallnate/once/1.1.2: resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} engines: {node: '>= 6'} dev: false - /@tootallnate/once/2.0.0: - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - dev: true - /@tsconfig/node10/1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} dev: true @@ -1652,6 +1574,7 @@ packages: '@types/keyv': 3.1.4 '@types/node': 18.14.0 '@types/responselike': 1.0.0 + dev: false /@types/connect/3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} @@ -1659,27 +1582,12 @@ packages: '@types/node': 18.14.0 dev: true - /@types/debug/4.1.7: - resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} + /@types/cors/2.8.13: + resolution: {integrity: sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==} dependencies: - '@types/ms': 0.7.31 + '@types/node': 18.14.0 dev: true - /@types/eslint-scope/3.7.4: - resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} - dependencies: - '@types/eslint': 8.21.1 - '@types/estree': 0.0.51 - - /@types/eslint/8.21.1: - resolution: {integrity: sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ==} - dependencies: - '@types/estree': 0.0.51 - '@types/json-schema': 7.0.11 - - /@types/estree/0.0.51: - resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} - /@types/express-serve-static-core/4.17.33: resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} dependencies: @@ -1704,26 +1612,13 @@ packages: '@types/node': 18.14.0 dev: true - /@types/fs-extra/9.0.13: - resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} - dependencies: - '@types/node': 18.14.0 - dev: true - - /@types/glob/7.2.0: - resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} - requiresBuild: true - dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 18.14.0 - dev: true - optional: true - /@types/http-cache-semantics/4.0.1: resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} + dev: false /@types/json-schema/7.0.11: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + dev: true /@types/json5/0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} @@ -1738,24 +1633,12 @@ packages: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: '@types/node': 18.14.0 + dev: false /@types/mime/3.0.1: resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} dev: true - /@types/minimatch/5.1.2: - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - dev: true - optional: true - - /@types/ms/0.7.31: - resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} - dev: true - - /@types/node/16.18.12: - resolution: {integrity: sha512-vzLe5NaNMjIE3mcddFVGlAXN1LEWueUsMsOJWaT6wWMJGyljHAWHznqfnKUQWGzu7TLPrGvWdNAsvQYW+C0xtw==} - dev: true - /@types/node/18.14.0: resolution: {integrity: sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==} @@ -1763,15 +1646,6 @@ packages: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} dev: true - /@types/plist/3.0.2: - resolution: {integrity: sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw==} - requiresBuild: true - dependencies: - '@types/node': 18.14.0 - xmlbuilder: 15.1.1 - dev: true - optional: true - /@types/qs/6.9.7: resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} dev: true @@ -1784,6 +1658,7 @@ packages: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: '@types/node': 18.14.0 + dev: false /@types/semver/7.3.13: resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} @@ -1796,11 +1671,11 @@ packages: '@types/node': 18.14.0 dev: true - /@types/verror/1.10.6: - resolution: {integrity: sha512-NNm+gdePAX1VGvPcGZCDKQZKYSiAWigKhKaz5KF94hG6f2s8de9Ow5+7AbXoeKxL8gavZfk4UquSAygOF2duEQ==} - requiresBuild: true + /@types/ws/8.5.4: + resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} + dependencies: + '@types/node': 18.14.0 dev: true - optional: true /@types/yargs-parser/21.0.0: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} @@ -1812,15 +1687,7 @@ packages: '@types/yargs-parser': 21.0.0 dev: true - /@types/yauzl/2.10.0: - resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} - requiresBuild: true - dependencies: - '@types/node': 18.14.0 - dev: true - optional: true - - /@typescript-eslint/eslint-plugin/5.52.0_6cfvjsbua5ptj65675bqcn6oza: + /@typescript-eslint/eslint-plugin/5.52.0_mx5xzldkgqq7ny4cexynopgt2u: resolution: {integrity: sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1831,10 +1698,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + '@typescript-eslint/parser': 5.52.0_epp7imp7tzws63sm7xmkgywa6u '@typescript-eslint/scope-manager': 5.52.0 - '@typescript-eslint/type-utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm - '@typescript-eslint/utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + '@typescript-eslint/type-utils': 5.52.0_epp7imp7tzws63sm7xmkgywa6u + '@typescript-eslint/utils': 5.52.0_epp7imp7tzws63sm7xmkgywa6u debug: 4.3.4 eslint: 8.34.0 grapheme-splitter: 1.0.4 @@ -1842,26 +1709,26 @@ packages: natural-compare-lite: 1.4.0 regexpp: 3.2.0 semver: 7.3.8 - tsutils: 3.21.0_typescript@4.9.5 - typescript: 4.9.5 + tsutils: 3.21.0_vjs4wwfhdfzsrv6t7i2fdbohmm + typescript: 5.1.0-dev.20230227 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/experimental-utils/5.52.0_7kw3g6rralp5ps6mg3uyzz6azm: + /@typescript-eslint/experimental-utils/5.52.0_epp7imp7tzws63sm7xmkgywa6u: resolution: {integrity: sha512-kd8CRr04mNE3hw4et6+0T0NI5vli2H6dJCGzjX1r12s/FXUehLVadmvo2Nl3DN80YqAh1cVC6zYZAkpmGiVJ5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + '@typescript-eslint/utils': 5.52.0_epp7imp7tzws63sm7xmkgywa6u eslint: 8.34.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/parser/5.52.0_7kw3g6rralp5ps6mg3uyzz6azm: + /@typescript-eslint/parser/5.52.0_epp7imp7tzws63sm7xmkgywa6u: resolution: {integrity: sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1873,10 +1740,10 @@ packages: dependencies: '@typescript-eslint/scope-manager': 5.52.0 '@typescript-eslint/types': 5.52.0 - '@typescript-eslint/typescript-estree': 5.52.0_typescript@4.9.5 + '@typescript-eslint/typescript-estree': 5.52.0_vjs4wwfhdfzsrv6t7i2fdbohmm debug: 4.3.4 eslint: 8.34.0 - typescript: 4.9.5 + typescript: 5.1.0-dev.20230227 transitivePeerDependencies: - supports-color @@ -1887,7 +1754,7 @@ packages: '@typescript-eslint/types': 5.52.0 '@typescript-eslint/visitor-keys': 5.52.0 - /@typescript-eslint/type-utils/5.52.0_7kw3g6rralp5ps6mg3uyzz6azm: + /@typescript-eslint/type-utils/5.52.0_epp7imp7tzws63sm7xmkgywa6u: resolution: {integrity: sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1897,12 +1764,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.52.0_typescript@4.9.5 - '@typescript-eslint/utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + '@typescript-eslint/typescript-estree': 5.52.0_vjs4wwfhdfzsrv6t7i2fdbohmm + '@typescript-eslint/utils': 5.52.0_epp7imp7tzws63sm7xmkgywa6u debug: 4.3.4 eslint: 8.34.0 - tsutils: 3.21.0_typescript@4.9.5 - typescript: 4.9.5 + tsutils: 3.21.0_vjs4wwfhdfzsrv6t7i2fdbohmm + typescript: 5.1.0-dev.20230227 transitivePeerDependencies: - supports-color dev: true @@ -1911,7 +1778,7 @@ packages: resolution: {integrity: sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /@typescript-eslint/typescript-estree/5.52.0_typescript@4.9.5: + /@typescript-eslint/typescript-estree/5.52.0_vjs4wwfhdfzsrv6t7i2fdbohmm: resolution: {integrity: sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1926,12 +1793,12 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.8 - tsutils: 3.21.0_typescript@4.9.5 - typescript: 4.9.5 + tsutils: 3.21.0_vjs4wwfhdfzsrv6t7i2fdbohmm + typescript: 5.1.0-dev.20230227 transitivePeerDependencies: - supports-color - /@typescript-eslint/utils/5.52.0_7kw3g6rralp5ps6mg3uyzz6azm: + /@typescript-eslint/utils/5.52.0_epp7imp7tzws63sm7xmkgywa6u: resolution: {integrity: sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1941,7 +1808,7 @@ packages: '@types/semver': 7.3.13 '@typescript-eslint/scope-manager': 5.52.0 '@typescript-eslint/types': 5.52.0 - '@typescript-eslint/typescript-estree': 5.52.0_typescript@4.9.5 + '@typescript-eslint/typescript-estree': 5.52.0_vjs4wwfhdfzsrv6t7i2fdbohmm eslint: 8.34.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0_eslint@8.34.0 @@ -1973,103 +1840,6 @@ packages: url-toolkit: 2.2.5 dev: false - /@webassemblyjs/ast/1.11.1: - resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==} - dependencies: - '@webassemblyjs/helper-numbers': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - - /@webassemblyjs/floating-point-hex-parser/1.11.1: - resolution: {integrity: sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==} - - /@webassemblyjs/helper-api-error/1.11.1: - resolution: {integrity: sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==} - - /@webassemblyjs/helper-buffer/1.11.1: - resolution: {integrity: sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==} - - /@webassemblyjs/helper-numbers/1.11.1: - resolution: {integrity: sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==} - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.11.1 - '@webassemblyjs/helper-api-error': 1.11.1 - '@xtuc/long': 4.2.2 - - /@webassemblyjs/helper-wasm-bytecode/1.11.1: - resolution: {integrity: sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==} - - /@webassemblyjs/helper-wasm-section/1.11.1: - resolution: {integrity: sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==} - dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-buffer': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - '@webassemblyjs/wasm-gen': 1.11.1 - - /@webassemblyjs/ieee754/1.11.1: - resolution: {integrity: sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==} - dependencies: - '@xtuc/ieee754': 1.2.0 - - /@webassemblyjs/leb128/1.11.1: - resolution: {integrity: sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==} - dependencies: - '@xtuc/long': 4.2.2 - - /@webassemblyjs/utf8/1.11.1: - resolution: {integrity: sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==} - - /@webassemblyjs/wasm-edit/1.11.1: - resolution: {integrity: sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==} - dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-buffer': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - '@webassemblyjs/helper-wasm-section': 1.11.1 - '@webassemblyjs/wasm-gen': 1.11.1 - '@webassemblyjs/wasm-opt': 1.11.1 - '@webassemblyjs/wasm-parser': 1.11.1 - '@webassemblyjs/wast-printer': 1.11.1 - - /@webassemblyjs/wasm-gen/1.11.1: - resolution: {integrity: sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==} - dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - '@webassemblyjs/ieee754': 1.11.1 - '@webassemblyjs/leb128': 1.11.1 - '@webassemblyjs/utf8': 1.11.1 - - /@webassemblyjs/wasm-opt/1.11.1: - resolution: {integrity: sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==} - dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-buffer': 1.11.1 - '@webassemblyjs/wasm-gen': 1.11.1 - '@webassemblyjs/wasm-parser': 1.11.1 - - /@webassemblyjs/wasm-parser/1.11.1: - resolution: {integrity: sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==} - dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-api-error': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - '@webassemblyjs/ieee754': 1.11.1 - '@webassemblyjs/leb128': 1.11.1 - '@webassemblyjs/utf8': 1.11.1 - - /@webassemblyjs/wast-printer/1.11.1: - resolution: {integrity: sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==} - dependencies: - '@webassemblyjs/ast': 1.11.1 - '@xtuc/long': 4.2.2 - - /@xtuc/ieee754/1.2.0: - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - - /@xtuc/long/4.2.2: - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - /accepts/1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -2078,13 +1848,6 @@ packages: negotiator: 0.6.3 dev: false - /acorn-import-assertions/1.8.0_acorn@8.8.2: - resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==} - peerDependencies: - acorn: ^8 - dependencies: - acorn: 8.8.2 - /acorn-jsx/5.3.2_acorn@8.8.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -2109,13 +1872,6 @@ packages: transitivePeerDependencies: - supports-color - /ajv-keywords/3.5.2_ajv@6.12.6: - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 - dependencies: - ajv: 6.12.6 - /ajv/6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: @@ -2145,52 +1901,6 @@ packages: dependencies: color-convert: 2.0.1 - /anymatch/3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /app-builder-bin/4.0.0: - resolution: {integrity: sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==} - dev: true - - /app-builder-lib/23.6.0: - resolution: {integrity: sha512-dQYDuqm/rmy8GSCE6Xl/3ShJg6Ab4bZJMT8KaTKGzT436gl1DN4REP3FCWfXoh75qGTJ+u+WsdnnpO9Jl8nyMA==} - engines: {node: '>=14.0.0'} - dependencies: - 7zip-bin: 5.1.1 - '@develar/schema-utils': 2.6.5 - '@electron/universal': 1.2.1 - '@malept/flatpak-bundler': 0.4.0 - async-exit-hook: 2.0.1 - bluebird-lst: 1.0.9 - builder-util: 23.6.0 - builder-util-runtime: 9.1.1 - chromium-pickle-js: 0.2.0 - debug: 4.3.4 - ejs: 3.1.8 - electron-osx-sign: 0.6.0 - electron-publish: 23.6.0 - form-data: 4.0.0 - fs-extra: 10.1.0 - hosted-git-info: 4.1.0 - is-ci: 3.0.1 - isbinaryfile: 4.0.10 - js-yaml: 4.1.0 - lazy-val: 1.0.5 - minimatch: 3.1.2 - read-config-file: 6.2.0 - sanitize-filename: 1.6.3 - semver: 7.3.8 - tar: 6.1.13 - temp-file: 3.4.0 - transitivePeerDependencies: - - supports-color - dev: true - /aproba/1.2.0: resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} dev: true @@ -2261,27 +1971,6 @@ packages: get-intrinsic: 1.2.0 dev: true - /asar/3.2.0: - resolution: {integrity: sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg==} - engines: {node: '>=10.12.0'} - deprecated: Please use @electron/asar moving forward. There is no API change, just a package name change - hasBin: true - dependencies: - chromium-pickle-js: 0.2.0 - commander: 5.1.0 - glob: 7.2.3 - minimatch: 3.1.2 - optionalDependencies: - '@types/glob': 7.2.0 - dev: true - - /assert-plus/1.0.0: - resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} - engines: {node: '>=0.8'} - requiresBuild: true - dev: true - optional: true - /ast-types-flow/0.0.7: resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} dev: true @@ -2293,24 +1982,9 @@ packages: tslib: 2.5.0 dev: false - /astral-regex/2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} - requiresBuild: true - dev: true - optional: true - - /async-exit-hook/2.0.1: - resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} - engines: {node: '>=0.12.0'} - dev: true - - /async/3.2.4: - resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} - dev: true - /asynckit/0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false /at-least-node/1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} @@ -2413,15 +2087,6 @@ packages: requiresBuild: true dev: true - /big.js/5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - dev: true - - /binary-extensions/2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: true - /bl/4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} dependencies: @@ -2430,16 +2095,6 @@ packages: readable-stream: 3.6.0 dev: true - /bluebird-lst/1.0.9: - resolution: {integrity: sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==} - dependencies: - bluebird: 3.7.2 - dev: true - - /bluebird/3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - dev: true - /body-parser/1.20.1: resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -2464,23 +2119,12 @@ packages: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} dev: false - /boolean/3.2.0: - resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} - dev: true - optional: true - /brace-expansion/1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - /brace-expansion/2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 - dev: true - /braces/3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} @@ -2497,33 +2141,6 @@ packages: node-releases: 2.0.10 update-browserslist-db: 1.0.10_browserslist@4.21.5 - /buffer-alloc-unsafe/1.1.0: - resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} - dev: true - - /buffer-alloc/1.2.0: - resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} - dependencies: - buffer-alloc-unsafe: 1.1.0 - buffer-fill: 1.0.0 - dev: true - - /buffer-crc32/0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - dev: true - - /buffer-equal/1.0.0: - resolution: {integrity: sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ==} - engines: {node: '>=0.4.0'} - dev: true - - /buffer-fill/1.0.0: - resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} - dev: true - - /buffer-from/1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - /buffer/5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: @@ -2531,40 +2148,6 @@ packages: ieee754: 1.2.1 dev: true - /builder-util-runtime/9.1.1: - resolution: {integrity: sha512-azRhYLEoDvRDR8Dhis4JatELC/jUvYjm4cVSj7n9dauGTOM2eeNn9KS0z6YA6oDsjI1xphjNbY6PZZeHPzzqaw==} - engines: {node: '>=12.0.0'} - dependencies: - debug: 4.3.4 - sax: 1.2.4 - transitivePeerDependencies: - - supports-color - dev: true - - /builder-util/23.6.0: - resolution: {integrity: sha512-QiQHweYsh8o+U/KNCZFSvISRnvRctb8m/2rB2I1JdByzvNKxPeFLlHFRPQRXab6aYeXc18j9LpsDLJ3sGQmWTQ==} - dependencies: - 7zip-bin: 5.1.1 - '@types/debug': 4.1.7 - '@types/fs-extra': 9.0.13 - app-builder-bin: 4.0.0 - bluebird-lst: 1.0.9 - builder-util-runtime: 9.1.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.1 - js-yaml: 4.1.0 - source-map-support: 0.5.21 - stat-mode: 1.0.0 - temp-file: 3.4.0 - transitivePeerDependencies: - - supports-color - dev: true - /bytes/3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -2573,6 +2156,7 @@ packages: /cacheable-lookup/5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} engines: {node: '>=10.6.0'} + dev: false /cacheable-request/7.0.2: resolution: {integrity: sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==} @@ -2585,6 +2169,7 @@ packages: lowercase-keys: 2.0.0 normalize-url: 6.1.0 responselike: 2.0.1 + dev: false /call-bind/1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} @@ -2638,53 +2223,10 @@ packages: parse5-htmlparser2-tree-adapter: 7.0.0 dev: false - /chokidar/3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - dev: true - /chownr/1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} dev: true - /chownr/2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - dev: true - - /chrome-trace-event/1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} - engines: {node: '>=6.0'} - - /chromium-pickle-js/0.2.0: - resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==} - dev: true - - /ci-info/3.8.0: - resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} - engines: {node: '>=8'} - dev: true - - /cli-truncate/2.1.0: - resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} - engines: {node: '>=8'} - requiresBuild: true - dependencies: - slice-ansi: 3.0.0 - string-width: 4.2.3 - dev: true - optional: true - /cliui/7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} dependencies: @@ -2700,11 +2242,13 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + dev: false /clone-response/1.0.3: resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} dependencies: mimic-response: 1.0.1 + dev: false /code-point-at/1.1.0: resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} @@ -2728,36 +2272,12 @@ packages: /color-name/1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - /colors/1.0.3: - resolution: {integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==} - engines: {node: '>=0.1.90'} - dev: true - /combined-stream/1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 - - /commander/2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - /commander/2.9.0: - resolution: {integrity: sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==} - engines: {node: '>= 0.6.x'} - dependencies: - graceful-readlink: 1.0.1 - dev: true - - /commander/5.1.0: - resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} - engines: {node: '>= 6'} - dev: true - - /compare-version/0.1.2: - resolution: {integrity: sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==} - engines: {node: '>=0.10.0'} - dev: true + dev: false /concat-map/0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -2794,21 +2314,29 @@ packages: engines: {node: '>= 0.6'} dev: false + /copy-to-clipboard/3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + dependencies: + toggle-selection: 1.0.6 + dev: false + /core-js-compat/3.28.0: resolution: {integrity: sha512-myzPgE7QodMg4nnd3K1TDoES/nADRStM8Gpz0D6nhkwbmwEnE0ZGJgoWsvQ722FR8D7xS0n0LV556RcEicjTyg==} dependencies: browserslist: 4.21.5 dev: true - /core-util-is/1.0.2: - resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} - requiresBuild: true - dev: true - optional: true - /core-util-is/1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + /cors/2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + dev: false + /cosmiconfig/7.1.0: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} @@ -2820,14 +2348,6 @@ packages: yaml: 1.10.2 dev: true - /crc/3.8.0: - resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==} - requiresBuild: true - dependencies: - buffer: 5.7.1 - dev: true - optional: true - /create-require/1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true @@ -2840,23 +2360,6 @@ packages: shebang-command: 2.0.0 which: 2.0.2 - /css-loader/6.7.3_webpack@5.75.0: - resolution: {integrity: sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^5.0.0 - dependencies: - icss-utils: 5.1.0_postcss@8.4.21 - postcss: 8.4.21 - postcss-modules-extract-imports: 3.0.0_postcss@8.4.21 - postcss-modules-local-by-default: 4.0.0_postcss@8.4.21 - postcss-modules-scope: 3.0.0_postcss@8.4.21 - postcss-modules-values: 4.0.0_postcss@8.4.21 - postcss-value-parser: 4.2.0 - semver: 7.3.8 - webpack: 5.75.0 - dev: true - /css-select/5.1.0: resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} dependencies: @@ -2872,12 +2375,6 @@ packages: engines: {node: '>= 6'} dev: false - /cssesc/3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - dev: true - /damerau-levenshtein/1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} dev: true @@ -2896,6 +2393,7 @@ packages: optional: true dependencies: ms: 2.0.0 + dev: false /debug/3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} @@ -2930,6 +2428,7 @@ packages: engines: {node: '>=10'} dependencies: mimic-response: 3.1.0 + dev: false /deep-equal/2.2.0: resolution: {integrity: sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==} @@ -2961,14 +2460,15 @@ packages: /deep-is/0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - /deepmerge/4.3.0: - resolution: {integrity: sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==} - engines: {node: '>=0.10.0'} - dev: true - /defer-to-connect/2.0.1: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} + dev: false + + /define-lazy-prop/2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: false /define-properties/1.2.0: resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} @@ -2990,6 +2490,7 @@ packages: /delayed-stream/1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + dev: false /delegates/1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} @@ -3011,65 +2512,17 @@ packages: hasBin: true dev: true - /detect-node/2.1.0: - resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} - dev: true - optional: true - /diff/4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} dev: true - /dir-compare/2.4.0: - resolution: {integrity: sha512-l9hmu8x/rjVC9Z2zmGzkhOEowZvW7pmYws5CWHutg8u1JgvsKWMx7Q/UODeu4djLZ4FgW5besw5yvMQnBHzuCA==} - hasBin: true - dependencies: - buffer-equal: 1.0.0 - colors: 1.0.3 - commander: 2.9.0 - minimatch: 3.0.4 - dev: true - /dir-glob/3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} dependencies: path-type: 4.0.0 - /dmg-builder/23.6.0: - resolution: {integrity: sha512-jFZvY1JohyHarIAlTbfQOk+HnceGjjAdFjVn3n8xlDWKsYNqbO4muca6qXEZTfGXeQMG7TYim6CeS5XKSfSsGA==} - dependencies: - app-builder-lib: 23.6.0 - builder-util: 23.6.0 - builder-util-runtime: 9.1.1 - fs-extra: 10.1.0 - iconv-lite: 0.6.3 - js-yaml: 4.1.0 - optionalDependencies: - dmg-license: 1.0.11 - transitivePeerDependencies: - - supports-color - dev: true - - /dmg-license/1.0.11: - resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==} - engines: {node: '>=8'} - os: [darwin] - hasBin: true - requiresBuild: true - dependencies: - '@types/plist': 3.0.2 - '@types/verror': 1.10.6 - ajv: 6.12.6 - crc: 3.8.0 - iconv-corefoundation: 1.1.7 - plist: 3.0.6 - smart-buffer: 4.2.0 - verror: 1.10.1 - dev: true - optional: true - /doctrine/2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -3113,107 +2566,18 @@ packages: domhandler: 5.0.3 dev: false - /dotenv-expand/5.1.0: - resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} - dev: true - /dotenv/16.0.3: resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} engines: {node: '>=12'} dev: false - /dotenv/9.0.2: - resolution: {integrity: sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==} - engines: {node: '>=10'} - dev: true - /ee-first/1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: false - /ejs/3.1.8: - resolution: {integrity: sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==} - engines: {node: '>=0.10.0'} - hasBin: true - dependencies: - jake: 10.8.5 - dev: true - - /electron-builder/23.6.0: - resolution: {integrity: sha512-y8D4zO+HXGCNxFBV/JlyhFnoQ0Y0K7/sFH+XwIbj47pqaW8S6PGYQbjoObolKBR1ddQFPt4rwp4CnwMJrW3HAw==} - engines: {node: '>=14.0.0'} - hasBin: true - dependencies: - '@types/yargs': 17.0.22 - app-builder-lib: 23.6.0 - builder-util: 23.6.0 - builder-util-runtime: 9.1.1 - chalk: 4.1.2 - dmg-builder: 23.6.0 - fs-extra: 10.1.0 - is-ci: 3.0.1 - lazy-val: 1.0.5 - read-config-file: 6.2.0 - simple-update-notifier: 1.1.0 - yargs: 17.7.0 - transitivePeerDependencies: - - supports-color - dev: true - - /electron-osx-sign/0.6.0: - resolution: {integrity: sha512-+hiIEb2Xxk6eDKJ2FFlpofCnemCbjbT5jz+BKGpVBrRNT3kWTGs4DfNX6IzGwgi33hUcXF+kFs9JW+r6Wc1LRg==} - engines: {node: '>=4.0.0'} - deprecated: Please use @electron/osx-sign moving forward. Be aware the API is slightly different - hasBin: true - dependencies: - bluebird: 3.7.2 - compare-version: 0.1.2 - debug: 2.6.9 - isbinaryfile: 3.0.3 - minimist: 1.2.8 - plist: 3.0.6 - transitivePeerDependencies: - - supports-color - dev: true - - /electron-publish/23.6.0: - resolution: {integrity: sha512-jPj3y+eIZQJF/+t5SLvsI5eS4mazCbNYqatv5JihbqOstIM13k0d1Z3vAWntvtt13Itl61SO6seicWdioOU5dg==} - dependencies: - '@types/fs-extra': 9.0.13 - builder-util: 23.6.0 - builder-util-runtime: 9.1.1 - chalk: 4.1.2 - fs-extra: 10.1.0 - lazy-val: 1.0.5 - mime: 2.6.0 - transitivePeerDependencies: - - supports-color - dev: true - - /electron-squirrel-startup/1.0.0: - resolution: {integrity: sha512-Oce8mvgGdFmwr+DsAcXBmFK8jFfN6yaFAP9IvyhTfupM3nFkBku/7VS/mdtJteWumImkC6P+BKGsxScoDDkv9Q==} - dependencies: - debug: 2.6.9 - transitivePeerDependencies: - - supports-color - dev: false - /electron-to-chromium/1.4.302: resolution: {integrity: sha512-Uk7C+7aPBryUR1Fwvk9VmipBcN9fVsqBO57jV2ZjTm+IZ6BMNqu7EDVEg2HxCNufk6QcWlFsBkhQyQroB2VWKw==} - /electron/23.1.0: - resolution: {integrity: sha512-LRgACMpVrmjfYWPgCSyJ+TFQ/FPeniOowpO57z0xUcTchfC7EH+5rUncgYN+uMvqePiYDce+ywZeCIFaO8x/Nw==} - engines: {node: '>= 12.20.55'} - hasBin: true - requiresBuild: true - dependencies: - '@electron/get': 2.0.2 - '@types/node': 16.18.12 - extract-zip: 2.0.1 - transitivePeerDependencies: - - supports-color - dev: true - /emoji-regex/8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -3221,11 +2585,6 @@ packages: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true - /emojis-list/3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} - dev: true - /encodeurl/1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} @@ -3236,23 +2595,11 @@ packages: dependencies: once: 1.4.0 - /enhanced-resolve/5.12.0: - resolution: {integrity: sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==} - engines: {node: '>=10.13.0'} - dependencies: - graceful-fs: 4.2.10 - tapable: 2.2.1 - /entities/4.4.0: resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} engines: {node: '>=0.12'} dev: false - /env-paths/2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - dev: true - /error-ex/1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: @@ -3311,9 +2658,6 @@ packages: stop-iteration-iterator: 1.0.0 dev: true - /es-module-lexer/0.9.3: - resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} - /es-set-tostringtag/2.0.1: resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} engines: {node: '>= 0.4'} @@ -3335,11 +2679,6 @@ packages: is-date-object: 1.0.5 is-symbol: 1.0.4 - /es6-error/4.1.1: - resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} - dev: true - optional: true - /escalade/3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -3369,7 +2708,7 @@ packages: source-map: 0.6.1 dev: false - /eslint-config-react-app/7.0.1_tseuwpko2uhnzn4cv7fs2adf4m: + /eslint-config-react-app/7.0.1_loofw3752f66lcbt6ckkhpg3my: resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -3382,19 +2721,19 @@ packages: '@babel/core': 7.20.12 '@babel/eslint-parser': 7.19.1_ydmbqfus77qykiqxhcwsorsqbq '@rushstack/eslint-patch': 1.2.0 - '@typescript-eslint/eslint-plugin': 5.52.0_6cfvjsbua5ptj65675bqcn6oza - '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + '@typescript-eslint/eslint-plugin': 5.52.0_mx5xzldkgqq7ny4cexynopgt2u + '@typescript-eslint/parser': 5.52.0_epp7imp7tzws63sm7xmkgywa6u babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 eslint: 8.34.0 eslint-plugin-flowtype: 8.0.3_5khfkqgka3gftezlren2b6mcy4 eslint-plugin-import: 2.27.5_mcvs2y73sfmcxqzpjj5lr7a2m4 - eslint-plugin-jest: 25.7.0_7hfwvekd5cgjoxqyvesymwuacm + eslint-plugin-jest: 25.7.0_gerstrrtwogpdtwzbzrjvr4aku eslint-plugin-jsx-a11y: 6.7.1_eslint@8.34.0 eslint-plugin-react: 7.32.2_eslint@8.34.0 eslint-plugin-react-hooks: 4.6.0_eslint@8.34.0 - eslint-plugin-testing-library: 5.10.2_7kw3g6rralp5ps6mg3uyzz6azm - typescript: 4.9.5 + eslint-plugin-testing-library: 5.10.2_epp7imp7tzws63sm7xmkgywa6u + typescript: 5.1.0-dev.20230227 transitivePeerDependencies: - '@babel/plugin-syntax-flow' - '@babel/plugin-transform-react-jsx' @@ -3434,7 +2773,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + '@typescript-eslint/parser': 5.52.0_epp7imp7tzws63sm7xmkgywa6u debug: 3.2.7 eslint: 8.34.0 eslint-import-resolver-node: 0.3.7 @@ -3466,7 +2805,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + '@typescript-eslint/parser': 5.52.0_epp7imp7tzws63sm7xmkgywa6u array-includes: 3.1.6 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 @@ -3488,7 +2827,7 @@ packages: - eslint-import-resolver-webpack - supports-color - /eslint-plugin-jest/25.7.0_7hfwvekd5cgjoxqyvesymwuacm: + /eslint-plugin-jest/25.7.0_gerstrrtwogpdtwzbzrjvr4aku: resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} peerDependencies: @@ -3501,8 +2840,8 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.52.0_6cfvjsbua5ptj65675bqcn6oza - '@typescript-eslint/experimental-utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + '@typescript-eslint/eslint-plugin': 5.52.0_mx5xzldkgqq7ny4cexynopgt2u + '@typescript-eslint/experimental-utils': 5.52.0_epp7imp7tzws63sm7xmkgywa6u eslint: 8.34.0 transitivePeerDependencies: - supports-color @@ -3567,13 +2906,13 @@ packages: string.prototype.matchall: 4.0.8 dev: true - /eslint-plugin-testing-library/5.10.2_7kw3g6rralp5ps6mg3uyzz6azm: + /eslint-plugin-testing-library/5.10.2_epp7imp7tzws63sm7xmkgywa6u: resolution: {integrity: sha512-f1DmDWcz5SDM+IpCkEX0lbFqrrTs8HRsEElzDEqN/EBI0hpRj8Cns5+IVANXswE8/LeybIJqPAOQIFu2j5Y5sw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} peerDependencies: eslint: ^7.5.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + '@typescript-eslint/utils': 5.52.0_epp7imp7tzws63sm7xmkgywa6u eslint: 8.34.0 transitivePeerDependencies: - supports-color @@ -3586,6 +2925,7 @@ packages: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 + dev: true /eslint-scope/7.1.1: resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} @@ -3701,10 +3041,6 @@ packages: engines: {node: '>= 0.6'} dev: false - /events/3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - /expand-template/2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} @@ -3749,27 +3085,6 @@ packages: - supports-color dev: false - /extract-zip/2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} - hasBin: true - dependencies: - debug: 4.3.4 - get-stream: 5.2.0 - yauzl: 2.10.0 - optionalDependencies: - '@types/yauzl': 2.10.0 - transitivePeerDependencies: - - supports-color - dev: true - - /extsprintf/1.4.1: - resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==} - engines: {'0': node >=0.6.0} - requiresBuild: true - dev: true - optional: true - /fast-deep-equal/3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -3794,12 +3109,6 @@ packages: dependencies: reusify: 1.0.4 - /fd-slicer/1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - dependencies: - pend: 1.2.0 - dev: true - /file-entry-cache/6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -3811,12 +3120,6 @@ packages: engines: {node: '>= 6'} dev: false - /filelist/1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - dependencies: - minimatch: 5.1.6 - dev: true - /fill-range/7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} @@ -3860,33 +3163,6 @@ packages: dependencies: is-callable: 1.2.7 - /fork-ts-checker-webpack-plugin/7.3.0_hhrrucqyg4eysmfpujvov2ym5u: - resolution: {integrity: sha512-IN+XTzusCjR5VgntYFgxbxVx3WraPRnKehBFrf00cMSrtUuW9MsG9dhL6MWpY6MkjC3wVwoujfCDgZZCQwbswA==} - engines: {node: '>=12.13.0', yarn: '>=1.0.0'} - peerDependencies: - typescript: '>3.6.0' - vue-template-compiler: '*' - webpack: ^5.11.0 - peerDependenciesMeta: - vue-template-compiler: - optional: true - dependencies: - '@babel/code-frame': 7.18.6 - chalk: 4.1.2 - chokidar: 3.5.3 - cosmiconfig: 7.1.0 - deepmerge: 4.3.0 - fs-extra: 10.1.0 - memfs: 3.4.13 - minimatch: 3.1.2 - node-abort-controller: 3.1.1 - schema-utils: 3.1.1 - semver: 7.3.8 - tapable: 2.2.1 - typescript: 4.9.5 - webpack: 5.75.0 - dev: true - /form-data/4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} @@ -3894,6 +3170,7 @@ packages: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 + dev: false /forwarded/0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} @@ -3916,15 +3193,6 @@ packages: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} dev: true - /fs-extra/10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} - dependencies: - graceful-fs: 4.2.10 - jsonfile: 6.1.0 - universalify: 2.0.0 - dev: true - /fs-extra/11.1.0: resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} engines: {node: '>=14.14'} @@ -3941,6 +3209,7 @@ packages: graceful-fs: 4.2.10 jsonfile: 4.0.0 universalify: 0.1.2 + dev: false /fs-extra/9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} @@ -3952,28 +3221,9 @@ packages: universalify: 2.0.0 dev: true - /fs-minipass/2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - dev: true - - /fs-monkey/1.0.3: - resolution: {integrity: sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==} - dev: true - /fs.realpath/1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - /fsevents/2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - /ftp/0.3.10: resolution: {integrity: sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==} engines: {node: '>=0.8.0'} @@ -4030,6 +3280,7 @@ packages: engines: {node: '>=8'} dependencies: pump: 3.0.0 + dev: false /get-symbol-description/1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} @@ -4068,9 +3319,6 @@ packages: dependencies: is-glob: 4.0.3 - /glob-to-regexp/0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - /glob/7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: @@ -4081,20 +3329,6 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 - /global-agent/3.0.0: - resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} - engines: {node: '>=10.0'} - requiresBuild: true - dependencies: - boolean: 3.2.0 - es6-error: 4.1.1 - matcher: 3.0.0 - roarr: 2.15.4 - semver: 7.3.8 - serialize-error: 7.0.1 - dev: true - optional: true - /global/4.4.0: resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} dependencies: @@ -4149,14 +3383,11 @@ packages: lowercase-keys: 2.0.0 p-cancelable: 2.1.1 responselike: 2.0.1 + dev: false /graceful-fs/4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} - /graceful-readlink/1.0.1: - resolution: {integrity: sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==} - dev: true - /grapheme-splitter/1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} @@ -4210,13 +3441,6 @@ packages: - supports-color dev: false - /hosted-git-info/4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} - dependencies: - lru-cache: 6.0.0 - dev: true - /htmlparser2/8.0.1: resolution: {integrity: sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==} dependencies: @@ -4228,6 +3452,7 @@ packages: /http-cache-semantics/4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: false /http-errors/2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} @@ -4251,23 +3476,13 @@ packages: - supports-color dev: false - /http-proxy-agent/5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - /http2-wrapper/1.0.3: resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} engines: {node: '>=10.19.0'} dependencies: quick-lru: 5.1.1 resolve-alpn: 1.2.1 + dev: false /https-proxy-agent/5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} @@ -4278,17 +3493,6 @@ packages: transitivePeerDependencies: - supports-color - /iconv-corefoundation/1.1.7: - resolution: {integrity: sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==} - engines: {node: ^8.11.2 || >=10} - os: [darwin] - requiresBuild: true - dependencies: - cli-truncate: 2.1.0 - node-addon-api: 1.7.2 - dev: true - optional: true - /iconv-lite/0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -4296,22 +3500,6 @@ packages: safer-buffer: 2.1.2 dev: false - /iconv-lite/0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - dev: true - - /icss-utils/5.1.0_postcss@8.4.21: - resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - postcss: 8.4.21 - dev: true - /ieee754/1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} requiresBuild: true @@ -4398,13 +3586,6 @@ packages: dependencies: has-bigints: 1.0.2 - /is-binary-path/2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: true - /is-boolean-object/1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} @@ -4416,13 +3597,6 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - /is-ci/3.0.1: - resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} - hasBin: true - dependencies: - ci-info: 3.8.0 - dev: true - /is-core-module/2.11.0: resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} dependencies: @@ -4440,6 +3614,12 @@ packages: dependencies: has-tostringtag: 1.0.0 + /is-docker/2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: false + /is-extglob/2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -4537,6 +3717,13 @@ packages: get-intrinsic: 1.2.0 dev: true + /is-wsl/2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: false + /isarray/0.0.1: resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} dev: false @@ -4549,18 +3736,6 @@ packages: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} dev: true - /isbinaryfile/3.0.3: - resolution: {integrity: sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==} - engines: {node: '>=0.6.0'} - dependencies: - buffer-alloc: 1.2.0 - dev: true - - /isbinaryfile/4.0.10: - resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} - engines: {node: '>= 8.0.0'} - dev: true - /isexe/2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -4568,25 +3743,6 @@ packages: resolution: {integrity: sha512-t1ZNgV1kLZ4dBQGxtY4z5oysRFPANt0kqHjomasflQW0w+YdDRF+Wsl0gFftIeUiP508KhZxG3MXQ31Swd643Q==} dev: false - /jake/10.8.5: - resolution: {integrity: sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==} - engines: {node: '>=10'} - hasBin: true - dependencies: - async: 3.2.4 - chalk: 4.1.2 - filelist: 1.0.4 - minimatch: 3.1.2 - dev: true - - /jest-worker/27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} - dependencies: - '@types/node': 18.14.0 - merge-stream: 2.0.0 - supports-color: 8.1.1 - /js-sdsl/4.3.0: resolution: {integrity: sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==} @@ -4611,9 +3767,11 @@ packages: /json-buffer/3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: false /json-parse-even-better-errors/2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true /json-schema-traverse/0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -4621,11 +3779,6 @@ packages: /json-stable-stringify-without-jsonify/1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - /json-stringify-safe/5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - dev: true - optional: true - /json5/1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true @@ -4641,6 +3794,7 @@ packages: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: graceful-fs: 4.2.10 + dev: false /jsonfile/6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} @@ -4661,6 +3815,7 @@ packages: resolution: {integrity: sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==} dependencies: json-buffer: 3.0.1 + dev: false /language-subtag-registry/0.3.22: resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} @@ -4672,10 +3827,6 @@ packages: language-subtag-registry: 0.3.22 dev: true - /lazy-val/1.0.5: - resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==} - dev: true - /levn/0.3.0: resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} engines: {node: '>= 0.8.0'} @@ -4695,19 +3846,6 @@ packages: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true - /loader-runner/4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} - - /loader-utils/2.0.4: - resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} - engines: {node: '>=8.9.0'} - dependencies: - big.js: 5.2.2 - emojis-list: 3.0.0 - json5: 2.2.3 - dev: true - /locate-path/6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -4741,6 +3879,7 @@ packages: /lowercase-keys/2.0.0: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} + dev: false /lru-cache/5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -4771,33 +3910,15 @@ packages: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true - /matcher/3.0.0: - resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} - engines: {node: '>=10'} - dependencies: - escape-string-regexp: 4.0.0 - dev: true - optional: true - /media-typer/0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} dev: false - /memfs/3.4.13: - resolution: {integrity: sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==} - engines: {node: '>= 4.0.0'} - dependencies: - fs-monkey: 1.0.3 - dev: true - /merge-descriptors/1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} dev: false - /merge-stream/2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - /merge2/1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -4817,12 +3938,14 @@ packages: /mime-db/1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} + dev: false /mime-types/2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 + dev: false /mime/1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} @@ -4830,15 +3953,10 @@ packages: hasBin: true dev: false - /mime/2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true - dev: true - /mimic-response/1.0.1: resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} engines: {node: '>=4'} + dev: false /mimic-response/2.1.0: resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} @@ -4848,6 +3966,7 @@ packages: /mimic-response/3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} + dev: false /min-document/2.19.0: resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} @@ -4855,59 +3974,21 @@ packages: dom-walk: 0.1.2 dev: false - /minimatch/3.0.4: - resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} - dependencies: - brace-expansion: 1.1.11 - dev: true - /minimatch/3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 - /minimatch/5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: true - /minimist/1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - /minipass/3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - dependencies: - yallist: 4.0.0 - dev: true - - /minipass/4.0.3: - resolution: {integrity: sha512-OW2r4sQ0sI+z5ckEt5c1Tri4xTgZwYDxpE54eqWlQloQRoWtXjqt9udJ5Z4dSv7wK+nfFI7FRXyCpBSft+gpFw==} - engines: {node: '>=8'} - dev: true - - /minizlib/2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - dev: true - /mkdirp-classic/0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} dev: true - /mkdirp/1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - dev: true - /ms/2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: false /ms/2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -4922,12 +4003,6 @@ packages: readable-stream: 3.6.0 dev: true - /nanoid/3.3.4: - resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true - /napi-build-utils/1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} dev: true @@ -4944,9 +4019,6 @@ packages: engines: {node: '>= 0.6'} dev: false - /neo-async/2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - /netmask/2.0.2: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} @@ -4958,16 +4030,6 @@ packages: semver: 5.7.1 dev: true - /node-abort-controller/3.1.1: - resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} - dev: true - - /node-addon-api/1.7.2: - resolution: {integrity: sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==} - requiresBuild: true - dev: true - optional: true - /node-fetch/2.6.9: resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} engines: {node: 4.x || >=6.0.0} @@ -4980,27 +4042,13 @@ packages: whatwg-url: 5.0.0 dev: true - /node-loader/2.0.0_webpack@5.75.0: - resolution: {integrity: sha512-I5VN34NO4/5UYJaUBtkrODPWxbobrE4hgDqPrjB25yPkonFhCmZ146vTH+Zg417E9Iwoh1l/MbRs1apc5J295Q==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^5.0.0 - dependencies: - loader-utils: 2.0.4 - webpack: 5.75.0 - dev: true - /node-releases/2.0.10: resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} - /normalize-path/3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true - /normalize-url/6.1.0: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} + dev: false /npmlog/4.1.2: resolution: {integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==} @@ -5025,7 +4073,6 @@ packages: /object-assign/4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - dev: true /object-inspect/1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} @@ -5096,6 +4143,15 @@ packages: dependencies: wrappy: 1.0.2 + /open/8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: false + /optionator/0.8.3: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} @@ -5122,6 +4178,7 @@ packages: /p-cancelable/2.1.1: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} engines: {node: '>=8'} + dev: false /p-is-promise/3.0.0: resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} @@ -5223,10 +4280,6 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - /pend/1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - dev: true - /picocolors/1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} @@ -5279,76 +4332,6 @@ packages: - supports-color dev: true - /plist/3.0.6: - resolution: {integrity: sha512-WiIVYyrp8TD4w8yCvyeIr+lkmrGRd5u0VbRnU+tP/aRLxP/YadJUYOMZJ/6hIa3oUyVCsycXvtNRgd5XBJIbiA==} - engines: {node: '>=6'} - dependencies: - base64-js: 1.5.1 - xmlbuilder: 15.1.1 - dev: true - - /postcss-modules-extract-imports/3.0.0_postcss@8.4.21: - resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - postcss: 8.4.21 - dev: true - - /postcss-modules-local-by-default/4.0.0_postcss@8.4.21: - resolution: {integrity: sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - icss-utils: 5.1.0_postcss@8.4.21 - postcss: 8.4.21 - postcss-selector-parser: 6.0.11 - postcss-value-parser: 4.2.0 - dev: true - - /postcss-modules-scope/3.0.0_postcss@8.4.21: - resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - postcss: 8.4.21 - postcss-selector-parser: 6.0.11 - dev: true - - /postcss-modules-values/4.0.0_postcss@8.4.21: - resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - icss-utils: 5.1.0_postcss@8.4.21 - postcss: 8.4.21 - dev: true - - /postcss-selector-parser/6.0.11: - resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==} - engines: {node: '>=4'} - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - dev: true - - /postcss-value-parser/4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - dev: true - - /postcss/8.4.21: - resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.4 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true - /prebuild-install/6.1.4: resolution: {integrity: sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ==} engines: {node: '>=6'} @@ -5451,11 +4434,7 @@ packages: /quick-lru/5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} - - /randombytes/2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - dependencies: - safe-buffer: 5.2.1 + dev: false /range-parser/1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} @@ -5486,17 +4465,6 @@ packages: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: true - /read-config-file/6.2.0: - resolution: {integrity: sha512-gx7Pgr5I56JtYz+WuqEbQHj/xWo+5Vwua2jhb1VwM4Wid5PqYmZ4i00ZB0YEGIfkVBsCv9UrjgyqCiQfS/Oosg==} - engines: {node: '>=12.0.0'} - dependencies: - dotenv: 9.0.2 - dotenv-expand: 5.1.0 - js-yaml: 4.1.0 - json5: 2.2.3 - lazy-val: 1.0.5 - dev: true - /readable-stream/1.1.14: resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} dependencies: @@ -5527,13 +4495,6 @@ packages: util-deprecate: 1.0.2 dev: true - /readdirp/3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: true - /regenerate-unicode-properties/10.1.0: resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} engines: {node: '>=4'} @@ -5597,6 +4558,7 @@ packages: /resolve-alpn/1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + dev: false /resolve-from/4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} @@ -5623,6 +4585,7 @@ packages: resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} dependencies: lowercase-keys: 2.0.0 + dev: false /reusify/1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} @@ -5634,19 +4597,6 @@ packages: dependencies: glob: 7.2.3 - /roarr/2.15.4: - resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} - engines: {node: '>=8.0'} - dependencies: - boolean: 3.2.0 - detect-node: 2.1.0 - globalthis: 1.0.3 - json-stringify-safe: 5.0.1 - semver-compare: 1.0.0 - sprintf-js: 1.1.2 - dev: true - optional: true - /run-parallel/1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: @@ -5668,34 +4618,12 @@ packages: /safer-buffer/2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - /sanitize-filename/1.6.3: - resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} - dependencies: - truncate-utf8-bytes: 1.0.2 - dev: true - - /sax/1.2.4: - resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} - dev: true - - /schema-utils/3.1.1: - resolution: {integrity: sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==} - engines: {node: '>= 10.13.0'} - dependencies: - '@types/json-schema': 7.0.11 - ajv: 6.12.6 - ajv-keywords: 3.5.2_ajv@6.12.6 + dev: false /sei-helper/3.3.0: resolution: {integrity: sha512-tHKNxiY5H5YayQ0QkxOvDZl35bH5OW2ptjk04j887hHA/pbj8ggsIKs7tb+wI7zViHOOY4JQorpQ8Jnj4LMitQ==} dev: false - /semver-compare/1.0.0: - resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} - dev: true - optional: true - /semver/5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true @@ -5705,11 +4633,6 @@ packages: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true - /semver/7.0.0: - resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} - hasBin: true - dev: true - /semver/7.3.8: resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} engines: {node: '>=10'} @@ -5738,19 +4661,6 @@ packages: - supports-color dev: false - /serialize-error/7.0.1: - resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} - engines: {node: '>=10'} - dependencies: - type-fest: 0.13.1 - dev: true - optional: true - - /serialize-javascript/6.0.1: - resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} - dependencies: - randombytes: 2.1.0 - /serve-static/1.15.0: resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} engines: {node: '>= 0.8.0'} @@ -5804,31 +4714,14 @@ packages: simple-concat: 1.0.1 dev: true - /simple-update-notifier/1.1.0: - resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} - engines: {node: '>=8.10.0'} - dependencies: - semver: 7.0.0 - dev: true - /slash/3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - /slice-ansi/3.0.0: - resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} - engines: {node: '>=8'} - requiresBuild: true - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - dev: true - optional: true - /smart-buffer/4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + dev: false /socks-proxy-agent/5.0.1: resolution: {integrity: sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==} @@ -5849,31 +4742,12 @@ packages: smart-buffer: 4.2.0 dev: false - /source-map-js/1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - dev: true - - /source-map-support/0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - /source-map/0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - - /sprintf-js/1.1.2: - resolution: {integrity: sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==} - dev: true + dev: false optional: true - /stat-mode/1.0.0: - resolution: {integrity: sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==} - engines: {node: '>= 6'} - dev: true - /statuses/2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} @@ -5982,24 +4856,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - /style-loader/3.3.1_webpack@5.75.0: - resolution: {integrity: sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^5.0.0 - dependencies: - webpack: 5.75.0 - dev: true - - /sumchecker/3.0.1: - resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} - engines: {node: '>= 8.0'} - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - /supports-color/5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -6012,20 +4868,10 @@ packages: dependencies: has-flag: 4.0.0 - /supports-color/8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - dependencies: - has-flag: 4.0.0 - /supports-preserve-symlinks-flag/1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /tapable/2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - /tar-fs/2.1.1: resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} dependencies: @@ -6046,74 +4892,9 @@ packages: readable-stream: 3.6.0 dev: true - /tar/6.1.13: - resolution: {integrity: sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==} - engines: {node: '>=10'} - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 4.0.3 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - dev: true - - /temp-file/3.4.0: - resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==} - dependencies: - async-exit-hook: 2.0.1 - fs-extra: 10.1.0 - dev: true - - /terser-webpack-plugin/5.3.6_webpack@5.75.0: - resolution: {integrity: sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - dependencies: - '@jridgewell/trace-mapping': 0.3.17 - jest-worker: 27.5.1 - schema-utils: 3.1.1 - serialize-javascript: 6.0.1 - terser: 5.16.4 - webpack: 5.75.0 - - /terser/5.16.4: - resolution: {integrity: sha512-5yEGuZ3DZradbogeYQ1NaGz7rXVBDWujWlx1PT8efXO6Txn+eWbfKqB2bTDVmFXmePFkoLU6XI8UektMIEA0ug==} - engines: {node: '>=10'} - hasBin: true - dependencies: - '@jridgewell/source-map': 0.3.2 - acorn: 8.8.2 - commander: 2.20.3 - source-map-support: 0.5.21 - /text-table/0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - /tmp-promise/3.0.3: - resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} - dependencies: - tmp: 0.2.1 - dev: true - - /tmp/0.2.1: - resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} - engines: {node: '>=8.17.0'} - dependencies: - rimraf: 3.0.2 - dev: true - /to-fast-properties/2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} @@ -6124,6 +4905,10 @@ packages: dependencies: is-number: 7.0.0 + /toggle-selection/1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + dev: false + /toidentifier/1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} @@ -6133,28 +4918,7 @@ packages: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: true - /truncate-utf8-bytes/1.0.2: - resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} - dependencies: - utf8-byte-length: 1.0.4 - dev: true - - /ts-loader/9.4.2_hhrrucqyg4eysmfpujvov2ym5u: - resolution: {integrity: sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==} - engines: {node: '>=12.0.0'} - peerDependencies: - typescript: '*' - webpack: ^5.0.0 - dependencies: - chalk: 4.1.2 - enhanced-resolve: 5.12.0 - micromatch: 4.0.5 - semver: 7.3.8 - typescript: 4.9.5 - webpack: 5.75.0 - dev: true - - /ts-node/10.9.1_tncu2ai53lzgmizdedur7lbibe: + /ts-node/10.9.1_t7zjf32qdusxw4ohfklq3etpl4: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -6180,7 +4944,7 @@ packages: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 4.9.5 + typescript: 5.1.0-dev.20230227 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true @@ -6200,14 +4964,14 @@ packages: resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} dev: false - /tsutils/3.21.0_typescript@4.9.5: + /tsutils/3.21.0_vjs4wwfhdfzsrv6t7i2fdbohmm: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 4.9.5 + typescript: 5.1.0-dev.20230227 /tunnel-agent/0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} @@ -6228,12 +4992,6 @@ packages: dependencies: prelude-ls: 1.2.1 - /type-fest/0.13.1: - resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} - engines: {node: '>=10'} - dev: true - optional: true - /type-fest/0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} @@ -6257,8 +5015,8 @@ packages: resolution: {integrity: sha512-1hNKM37dAWML/2ltRXupOq2uqcdRQyDFphl+341NTPXFLLLiDhErXx8VtaSLh3xP7SyHZdcCgpt9boYYVb3fQg==} dev: false - /typescript/4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + /typescript/5.1.0-dev.20230227: + resolution: {integrity: sha512-nPxrgb/3C40X3eXsCPUpiVEgQltswKoAh3Zwm7tDIVE4ldDr3flXq63odqyWUuOZFc/+NCFdm80RpTB0nz2M8w==} engines: {node: '>=4.2.0'} hasBin: true @@ -6296,6 +5054,7 @@ packages: /universalify/0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} + dev: false /universalify/2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} @@ -6325,10 +5084,6 @@ packages: resolution: {integrity: sha512-mtN6xk+Nac+oyJ/PrI7tzfmomRVNFIWKUbG8jdYFt52hxbiReFAXIjYskvu64/dvuW71IcB7lV8l0HvZMac6Jg==} dev: false - /utf8-byte-length/1.0.4: - resolution: {integrity: sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==} - dev: true - /util-deprecate/1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true @@ -6347,17 +5102,6 @@ packages: engines: {node: '>= 0.8'} dev: false - /verror/1.10.1: - resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} - engines: {node: '>=0.6.0'} - requiresBuild: true - dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.4.1 - dev: true - optional: true - /vm2/3.9.14: resolution: {integrity: sha512-HgvPHYHeQy8+QhzlFryvSteA4uQLBCOub02mgqdR+0bN/akRZ48TGB1v0aCv7ksyc0HXx16AZtMHKS38alc6TA==} engines: {node: '>=6.0'} @@ -6367,60 +5111,10 @@ packages: acorn-walk: 8.2.0 dev: false - /watchpack/2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.10 - /webidl-conversions/3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} dev: true - /webpack-sources/3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - - /webpack/5.75.0: - resolution: {integrity: sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - dependencies: - '@types/eslint-scope': 3.7.4 - '@types/estree': 0.0.51 - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/wasm-edit': 1.11.1 - '@webassemblyjs/wasm-parser': 1.11.1 - acorn: 8.8.2 - acorn-import-assertions: 1.8.0_acorn@8.8.2 - browserslist: 4.21.5 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.12.0 - es-module-lexer: 0.9.3 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.10 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.1.1 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.6_webpack@5.75.0 - watchpack: 2.4.0 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - /whatwg-url/5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: @@ -6485,11 +5179,18 @@ packages: /wrappy/1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - /xmlbuilder/15.1.1: - resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} - engines: {node: '>=8.0'} - requiresBuild: true - dev: true + /ws/8.12.1: + resolution: {integrity: sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==} + 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 + dev: false /xregexp/2.0.0: resolution: {integrity: sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==} @@ -6523,6 +5224,7 @@ packages: /yargs-parser/21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + dev: false /yargs/16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} @@ -6548,13 +5250,7 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 - - /yauzl/2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 - dev: true + dev: false /yn/3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} diff --git a/tsc.ts b/tsc.ts index 7a8a15f..4f1b827 100644 --- a/tsc.ts +++ b/tsc.ts @@ -18,7 +18,8 @@ if (!isTest) if (!isGUI) buildIgnore = buildIgnore.concat([ './gui*', - './build*' + './build*', + 'gui.ts' ]); @@ -84,7 +85,7 @@ export { ignore }; process.stdout.write('✓\nCopying files... '); if (!isTest && isGUI) { - copyDir(path.join(__dirname, 'gui', 'react', 'build'), path.join(__dirname, 'lib', 'gui', 'electron', 'build')); + copyDir(path.join(__dirname, 'gui', 'react', 'build'), path.join(__dirname, 'lib', 'gui', 'server', 'build')); } const files = readDir(__dirname); @@ -99,9 +100,6 @@ export { ignore }; }); process.stdout.write('✓\nInstalling dependencies... '); - if (!isTest && !isGUI) { - alterJSON(); - } if (!isTest) { const dependencies = exec(`pnpm install ${isGUI ? '' : '-P'}`, { cwd: path.join(__dirname, 'lib') @@ -112,11 +110,6 @@ export { ignore }; process.stdout.write('✓\n'); })(); -function alterJSON() { - packageJSON.main = 'index.js'; - fs.writeFileSync(path.join('lib', 'package.json'), JSON.stringify(packageJSON, null, 4)); -} - function readDir (dir: string): { path: string, stats: fs.Stats