diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..600e365 --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +**/node_modules \ No newline at end of file diff --git a/.eslintignore b/.eslintignore index a3d93c5..dd20ec6 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,4 +1,5 @@ lib /videos/*.ts build -dev.js \ No newline at end of file +dev.js +tsc.ts \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json index 7b246c6..146345f 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -21,7 +21,18 @@ "react", "@typescript-eslint" ], + "overrides": [ + { + "files": ["gui/react/**/*"], + "rules": { + "no-console": 0 + } + } + ], "rules": { + "no-console": 2, + "react/prop-types": 0, + "react-hooks/exhaustive-deps": 0, "@typescript-eslint/no-explicit-any": "off", "indent": [ "error", diff --git a/.github/workflows/release-matrix.yml b/.github/workflows/release-matrix.yml index 70c8d25..3647a0a 100644 --- a/.github/workflows/release-matrix.yml +++ b/.github/workflows/release-matrix.yml @@ -14,20 +14,17 @@ jobs: steps: - name: Checkout uses: actions/checkout@v2 - + - uses: pnpm/action-setup@v2 + with: + version: 6.0.2 - name: Set up Node.js uses: actions/setup-node@v3 with: node-version: 16 check-latest: true - - uses: pnpm/action-setup@v2 - with: - version: 6.0.2 - - name: Install Node modules run: | pnpm install - - name: Get name and version from package.json run: | test -n $(node -p -e "require('./package.json').name") && @@ -36,7 +33,6 @@ jobs: echo PACKAGE_VERSION=$(node -p -e "require('./package.json').version") >> $GITHUB_ENV || exit 1 - name: Make build run: pnpm run build-${{ matrix.build_type }}-${{ matrix.gui }} - - name: Upload release uses: actions/upload-release-asset@v1 with: @@ -46,3 +42,25 @@ jobs: asset_content_type: application/x-7z-compressed env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + build-docker: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v1 + - name: Login to DockerHub + if: ${{ github.ref == 'refs/heads/master' }} + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push Docker images + uses: docker/build-push-action@v2.9.0 + with: + github-token: ${{ github.token }} + push: ${{ github.ref == 'refs/heads/master' }} + tags: | + "izuco/multi-downloader-nx:${{ github.event.release.tag_name }}" + - name: Image digest + run: echo ${{ steps.docker_build.outputs.digest }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2acd529..88dd7d5 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -11,28 +11,29 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - name: Use Node.js 14 - uses: actions/setup-node@v3 - with: - node-version: 16 - uses: pnpm/action-setup@v2 with: version: 6.0.2 + - name: Set up Node.js + uses: actions/setup-node@v3 + with: + node-version: 16 + check-latest: true - run: pnpm i - - run: pnpm dlx eslint . + - run: pnpx eslint . test: needs: eslint runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - name: Use Node.js 14 - uses: actions/setup-node@v2 - with: - node-version: 14 - cache: 'npm' - uses: pnpm/action-setup@v2 with: version: 6.0.2 + - name: Set up Node.js + uses: actions/setup-node@v3 + with: + node-version: 16 + check-latest: true - run: pnpm i - run: pnpm run test diff --git a/@types/hls-download.d.ts b/@types/hls-download.d.ts deleted file mode 100644 index 8d51c3f..0000000 --- a/@types/hls-download.d.ts +++ /dev/null @@ -1,32 +0,0 @@ -declare module 'hls-download' { - import type { ProgressData } from './messageHandler'; - export type HLSCallback = (data: ProgressData) => unknown; - export type HLSOptions = { - m3u8json: { - segments: Record[], - mediaSequence?: number, - }, - output?: string, - threads?: number, - retries?: number, - offset?: number, - baseurl?: string, - proxy?: string, - skipInit?: boolean, - timeout?: number, - fsRetryTime?: number, - override?: 'Y'|'y'|'N'|'n'|'C'|'c' - callback?: HLSCallback - } - export default class hlsDownload { - constructor(options: HLSOptions) - async download() : Promise<{ - ok: boolean, - parts: { - first: number, - total: number, - compleated: number - } - }> - } -} \ No newline at end of file diff --git a/@types/messageHandler.d.ts b/@types/messageHandler.d.ts index 23dddf5..1c2f8df 100644 --- a/@types/messageHandler.d.ts +++ b/@types/messageHandler.d.ts @@ -10,12 +10,19 @@ export interface MessageHandler { availableDubCodes: () => Promise, availableSubCodes: () => Promise, handleDefault: (name: string) => Promise, - resolveItems: (data: ResolveItemsData) => Promise>, + resolveItems: (data: ResolveItemsData) => Promise, listEpisodes: (id: string) => Promise, - downloadItem: (data) => void, - isDownloading: () => boolean, + downloadItem: (data: QueueItem) => void, + isDownloading: () => Promise, writeToClipboard: (text: string) => void, openFolder: (path: FolderTypes) => void, + openFile: (data: [FolderTypes, string]) => void, + openURL: (data: string) => void; + getQueue: () => Promise, + removeFromQueue: (index: number) => void, + clearQueue: () => void, + setDownloadQueue: (data: boolean) => void, + getDownloadQueue: () => Promise } export type FolderTypes = 'content' | 'config'; @@ -23,7 +30,6 @@ export type FolderTypes = 'content' | 'config'; export type QueueItem = { title: string, episode: string, - ids: string[], fileName: string, dlsubs: string[], parent: { @@ -34,13 +40,15 @@ export type QueueItem = { dlVideoOnce: boolean, dubLang: string[], image: string -} +} & ResolveItemsData export type ResolveItemsData = { id: string, dubLang: string[], all: boolean, but: boolean, + novids: boolean, + noaudio: boolean dlVideoOnce: boolean, e: string, fileName: string, diff --git a/@types/randomEvents.d.ts b/@types/randomEvents.d.ts index cfa1b51..41ea519 100644 --- a/@types/randomEvents.d.ts +++ b/@types/randomEvents.d.ts @@ -1,8 +1,10 @@ -import { ExtendedProgress } from './messageHandler'; +import { ExtendedProgress, QueueItem } from './messageHandler'; export type RandomEvents = { progress: ExtendedProgress, - finish: undefined + finish: undefined, + queueChange: QueueItem[], + current: QueueItem|undefined } export interface RandomEvent { diff --git a/@types/ws.d.ts b/@types/ws.d.ts new file mode 100644 index 0000000..1cfb292 --- /dev/null +++ b/@types/ws.d.ts @@ -0,0 +1,45 @@ +import { GUIConfig } from '../modules/module.cfg-loader'; +import { AuthResponse, CheckTokenResponse, EpisodeListResponse, FolderTypes, QueueItem, ResolveItemsData, 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, boolean], + 'listEpisodes': [string, EpisodeListResponse], + 'downloadItem': [QueueItem, 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], + 'setuped': [undefined, boolean], + 'setupServer': [GUIConfig, boolean], + 'requirePassword': [undefined, boolean], + 'getQueue': [undefined, QueueItem[]], + 'removeFromQueue': [number, undefined], + 'clearQueue': [undefined, undefined], + 'setDownloadQueue': [boolean, undefined], + 'getDownloadQueue': [undefined, boolean] +} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 63bbb23..54b108e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,13 +15,13 @@ RUN echo 'ffmpeg: "./bin/ffmpeg/ffmpeg"\nmkvmerge: "./bin/mkvtoolnix/mkvmerge"' RUN npm install -g pnpm RUN pnpm i -RUN pnpm run build-ubuntu-cli +RUN pnpm run build-ubuntu-gui # Move build to new Clean Image FROM node WORKDIR "/app" -COPY --from=builder /app/lib/_builds/multi-downloader-nx-ubuntu64-cli ./ +COPY --from=builder /app/lib/_builds/multi-downloader-nx-ubuntu64-gui ./ # Install mkvmerge and ffmpeg @@ -29,10 +29,11 @@ RUN mkdir -p /app/bin/mkvtoolnix RUN mkdir -p /app/bin/ffmpeg RUN apt-get update +RUN apt-get install xdg-utils -y RUN apt-get install mkvtoolnix -y -RUN apt-get install ffmpeg -y +#RUN apt-get install ffmpeg -y RUN mv /usr/bin/mkvmerge /app/bin/mkvtoolnix/mkvmerge -RUN mv /usr/bin/ffmpeg /app/bin/ffmpeg/ffmpeg +#RUN mv /usr/bin/ffmpeg /app/bin/ffmpeg/ffmpeg -CMD [ "/bin/bash" ] \ No newline at end of file +CMD [ "/app/aniDL" ] \ No newline at end of file diff --git a/build/Icon.ico b/build/Icon.ico deleted file mode 100644 index 8db8754..0000000 Binary files a/build/Icon.ico and /dev/null differ diff --git a/build/Icon.png b/build/Icon.png deleted file mode 100644 index df0c7bb..0000000 Binary files a/build/Icon.png and /dev/null differ 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..b11e0a7 --- /dev/null +++ b/config/gui.yml @@ -0,0 +1 @@ +port: 3000 \ No newline at end of file diff --git a/config/setup.json b/config/setup.json new file mode 100644 index 0000000..4ffe8a0 --- /dev/null +++ b/config/setup.json @@ -0,0 +1,3 @@ +{ + "setuped": true +} \ No newline at end of file diff --git a/crunchy.ts b/crunchy.ts index a0f2523..a2f59d5 100644 --- a/crunchy.ts +++ b/crunchy.ts @@ -5,9 +5,10 @@ import fs from 'fs-extra'; // package program import packageJson from './package.json'; // plugins +import { console } from './modules/log'; import shlp from 'sei-helper'; import m3u8 from 'm3u8-parsed'; -import streamdl from 'hls-download'; +import streamdl from './modules/hls-download'; // custom modules import * as fontsData from './modules/module.fontsData'; @@ -16,14 +17,6 @@ import * as yamlCfg from './modules/module.cfg-loader'; import * as yargs from './modules/module.app-args'; import Merger, { Font, MergerInput, SubtitleInput } from './modules/module.merger'; -export type sxItem = { - language: langsData.LanguageItem, - path: string, - file: string - title: string, - fonts: Font[] -} - // args // load req @@ -41,6 +34,14 @@ import { AvailableFilenameVars, getDefault } from './modules/module.args'; import { AuthData, AuthResponse, Episode, ResponseBase, SearchData, SearchResponse, SearchResponseItem } from './@types/messageHandler'; import { ServiceClass } from './@types/serviceClassInterface'; +export type sxItem = { + language: langsData.LanguageItem, + path: string, + file: string + title: string, + fonts: Font[] +} + export default class Crunchy implements ServiceClass { public cfg: yamlCfg.ConfigObject; private token: Record; @@ -60,7 +61,7 @@ export default class Crunchy implements ServiceClass { } public async cli() { - console.log(`\n=== Multi Downloader NX ${packageJson.version} ===\n`); + console.info(`\n=== Multi Downloader NX ${packageJson.version} ===\n`); const argv = yargs.appArgv(this.cfg.cli); // load binaries @@ -103,7 +104,7 @@ export default class Crunchy implements ServiceClass { if (selected.isOk) { for (const select of selected.value) { if (!(await this.downloadEpisode(select, {...argv, skipsubs: false }))) { - console.log(`[ERROR] Unable to download selected episode ${select.episodeNumber}`); + console.error(`Unable to download selected episode ${select.episodeNumber}`); return false; } } @@ -117,14 +118,14 @@ export default class Crunchy implements ServiceClass { else if(argv.s && argv.s.match(/^[0-9A-Z]{9}$/)){ await this.refreshToken(); if (argv.dubLang.length > 1) { - console.log('[INFO] One show can only be downloaded with one dub. Use --srz instead.'); + console.info('One show can only be downloaded with one dub. Use --srz instead.'); } argv.dubLang = [argv.dubLang[0]]; const selected = await this.getSeasonById(argv.s, argv.numbers, argv.e, argv.but, argv.all); if (selected.isOk) { for (const select of selected.value) { if (!(await this.downloadEpisode(select, {...argv, skipsubs: false }))) { - console.log(`[ERROR] Unable to download selected episode ${select.episodeNumber}`); + console.error(`Unable to download selected episode ${select.episodeNumber}`); return false; } } @@ -136,24 +137,24 @@ export default class Crunchy implements ServiceClass { const selected = await this.getObjectById(argv.e, false); for (const select of selected as Partial[]) { if (!(await this.downloadEpisode(select as CrunchyEpMeta, {...argv, skipsubs: false }))) { - console.log(`[ERROR] Unable to download selected episode ${select.episodeNumber}`); + console.error(`Unable to download selected episode ${select.episodeNumber}`); return false; } } return true; } else{ - console.log('[INFO] No option selected or invalid value entered. Try --help.'); + console.info('No option selected or invalid value entered. Try --help.'); } } public async getFonts() { - console.log('[INFO] Downloading fonts...'); + console.info('Downloading fonts...'); const fonts = Object.values(fontsData.fontFamilies).reduce((pre, curr) => pre.concat(curr)); for(const f of fonts) { const fontLoc = path.join(this.cfg.dir.fonts, f); if(fs.existsSync(fontLoc) && fs.statSync(fontLoc).size != 0){ - console.log(`[INFO] ${f} already downloaded!`); + console.info(`${f} already downloaded!`); } else{ const fontFolder = path.dirname(fontLoc); @@ -164,20 +165,20 @@ export default class Crunchy implements ServiceClass { fs.ensureDirSync(fontFolder); } catch(e){ - console.log(); + console.info(''); } const fontUrl = fontsData.root + f; const getFont = await this.req.getData(fontUrl, { binary: true }); if(getFont.ok && getFont.res){ fs.writeFileSync(fontLoc, getFont.res.body); - console.log(`[INFO] Downloaded: ${f}`); + console.info(`Downloaded: ${f}`); } else{ - console.log(`[WARN] Failed to download: ${f}`); + console.warn(`Failed to download: ${f}`); } } } - console.log('[INFO] All required fonts downloaded!'); + console.info('All required fonts downloaded!'); } public async doAuth(data: AuthData): Promise { @@ -194,14 +195,14 @@ export default class Crunchy implements ServiceClass { }; const authReq = await this.req.getData(api.beta_auth, authReqOpts); if(!authReq.ok || !authReq.res){ - console.log('[ERROR] Authentication failed!'); + console.error('Authentication failed!'); return { isOk: false, reason: new Error('Authentication failed') }; } this.token = JSON.parse(authReq.res.body); this.token.expires = new Date(Date.now() + this.token.expires_in); yamlCfg.saveCRToken(this.token); await this.getProfile(); - console.log('[INFO] Your Country: %s', this.token.country); + console.info('Your Country: %s', this.token.country); return { isOk: true, value: undefined }; } @@ -217,7 +218,7 @@ export default class Crunchy implements ServiceClass { }; const authReq = await this.req.getData(api.beta_auth, authReqOpts); if(!authReq.ok || !authReq.res){ - console.log('[ERROR] Authentication failed!'); + console.error('Authentication failed!'); return; } this.token = JSON.parse(authReq.res.body); @@ -227,7 +228,7 @@ export default class Crunchy implements ServiceClass { public async getProfile() : Promise { if(!this.token.access_token){ - console.log('[ERROR] No access token!'); + console.error('No access token!'); return false; } const profileReqOptions = { @@ -238,11 +239,11 @@ export default class Crunchy implements ServiceClass { }; const profileReq = await this.req.getData(api.beta_profile, profileReqOptions); if(!profileReq.ok || !profileReq.res){ - console.log('[ERROR] Get profile failed!'); + console.error('Get profile failed!'); return false; } const profile = JSON.parse(profileReq.res.body); - console.log('[INFO] USER: %s (%s)', profile.username, profile.email); + console.info('USER: %s (%s)', profile.username, profile.email); return true; } @@ -256,7 +257,7 @@ export default class Crunchy implements ServiceClass { if (!(Date.now() > new Date(this.token.expires).getTime()) && ifNeeded) { return; } else { - //console.log('[WARN] The token has expired compleatly. I will try to refresh the token anyway, but you might have to reauth.'); + //console.info('[WARN] The token has expired compleatly. I will try to refresh the token anyway, but you might have to reauth.'); } const authData = new URLSearchParams({ 'refresh_token': this.token.refresh_token, @@ -270,7 +271,7 @@ export default class Crunchy implements ServiceClass { }; const authReq = await this.req.getData(api.beta_auth, authReqOpts); if(!authReq.ok || !authReq.res){ - console.log('[ERROR] Authentication failed!'); + console.error('Authentication failed!'); return; } this.token = JSON.parse(authReq.res.body); @@ -281,14 +282,14 @@ export default class Crunchy implements ServiceClass { if (!silent) await this.getProfile(); } else { - console.log('[INFO] USER: Anonymous'); + console.info('USER: Anonymous'); } await this.getCMStoken(); } public async getCMStoken(){ if(!this.token.access_token){ - console.log('[ERROR] No access token!'); + console.error('No access token!'); return; } const cmsTokenReqOpts = { @@ -299,17 +300,17 @@ export default class Crunchy implements ServiceClass { }; const cmsTokenReq = await this.req.getData(api.beta_cmsToken, cmsTokenReqOpts); if(!cmsTokenReq.ok || !cmsTokenReq.res){ - console.log('[ERROR] Authentication CMS token failed!'); + console.error('Authentication CMS token failed!'); return; } this.cmsToken = JSON.parse(cmsTokenReq.res.body); - console.log('[INFO] Your Country: %s\n', this.cmsToken.cms?.bucket.split('/')[1]); + console.info('Your Country: %s\n', this.cmsToken.cms?.bucket.split('/')[1]); } public async getCmsData(){ // check token if(!this.cmsToken.cms){ - console.log('[ERROR] Authentication required!'); + console.error('Authentication required!'); return; } // opts @@ -325,15 +326,15 @@ export default class Crunchy implements ServiceClass { ].join(''); const indexReq = await this.req.getData(indexReqOpts); if(!indexReq.ok || ! indexReq.res){ - console.log('[ERROR] Get CMS index FAILED!'); + console.error('Get CMS index FAILED!'); return; } - console.log(JSON.parse(indexReq.res.body)); + console.info(JSON.parse(indexReq.res.body)); } public async doSearch(data: SearchData): Promise{ if(!this.token.access_token){ - console.log('[ERROR] Authentication required!'); + console.error('Authentication required!'); return { isOk: false, reason: new Error('Not authenticated') }; } const searchReqOpts = { @@ -352,12 +353,12 @@ export default class Crunchy implements ServiceClass { }).toString(); const searchReq = await this.req.getData(`${api.search}?${searchParams}`, searchReqOpts); if(!searchReq.ok || ! searchReq.res){ - console.log('[ERROR] Search FAILED!'); + console.error('Search FAILED!'); return { isOk: false, reason: new Error('Search failed. No more information provided') }; } const searchResults = JSON.parse(searchReq.res.body) as CrunchySearch; if(searchResults.total < 1){ - console.log('[INFO] Nothing Found!'); + console.info('Nothing Found!'); return { isOk: true, value: [] }; } @@ -368,23 +369,23 @@ export default class Crunchy implements ServiceClass { 'episode': 'Found episodes' }; for(const search_item of searchResults.data){ - console.log('[INFO] %s:', searchTypesInfo[search_item.type as keyof typeof searchTypesInfo]); + console.info('%s:', searchTypesInfo[search_item.type as keyof typeof searchTypesInfo]); // calculate pages const pageCur = searchStart > 0 ? Math.ceil(searchStart/5) + 1 : 1; const pageMax = Math.ceil(search_item.count/5); // pages per category if(search_item.count < 1){ - console.log(' [INFO] Nothing Found...'); + console.info(' Nothing Found...'); } if(search_item.count > 0){ if(pageCur > pageMax){ - console.log(' [INFO] Last page is %s...', pageMax); + console.info(' Last page is %s...', pageMax); continue; } for(const item of search_item.items){ await this.logObject(item); } - console.log(` [INFO] Total results: ${search_item.count} (Page: ${pageCur}/${pageMax})`); + console.info(` Total results: ${search_item.count} (Page: ${pageCur}/${pageMax})`); } } const toSend = searchResults.data.filter(a => a.type === 'series' || a.type === 'movie_listing'); @@ -404,7 +405,7 @@ export default class Crunchy implements ServiceClass { public async logObject(item: ParseItem, pad?: number, getSeries?: boolean, getMovieListing?: boolean){ if(this.debug){ - console.log(item); + console.info(item); } pad = pad ?? 2; getSeries = getSeries === undefined ? true : getSeries; @@ -455,13 +456,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 +524,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); @@ -542,7 +543,7 @@ export default class Crunchy implements ServiceClass { } // show entry - console.log( + console.info( '%s%s[%s] %s%s%s', ''.padStart(item.isSelected ? pad-1 : pad, ' '), item.isSelected ? '✓' : '', @@ -553,27 +554,27 @@ export default class Crunchy implements ServiceClass { ); if(item.last_public){ - console.log(''.padStart(pad+1, ' '), '- Last updated:', item.last_public); + console.info(''.padStart(pad+1, ' '), '- Last updated:', item.last_public); } if(item.subtitle_locales){ iMetadata.subtitle_locales = item.subtitle_locales; } if (item.versions && audio_languages.length > 0) { - console.log( + console.info( '%s- Versions: %s', ''.padStart(pad + 2, ' '), langsData.parseSubtitlesArray(audio_languages) ); } if(iMetadata.subtitle_locales && iMetadata.subtitle_locales.length > 0){ - console.log( + console.info( '%s- Subtitles: %s', ''.padStart(pad + 2, ' '), langsData.parseSubtitlesArray(iMetadata.subtitle_locales) ); } if(item.availability_notes){ - console.log( + console.info( '%s- Availability notes: %s', ''.padStart(pad + 2, ' '), item.availability_notes.replace(/\[[^\]]*\]?/gm, '') @@ -581,11 +582,11 @@ export default class Crunchy implements ServiceClass { } if(item.type == 'series' && getSeries){ await this.logSeriesById(item.id, pad, true); - console.log(); + console.info(''); } if(item.type == 'movie_listing' && getMovieListing){ await this.logMovieListingById(item.id, pad+2); - console.log(); + console.info(''); } } @@ -595,7 +596,7 @@ export default class Crunchy implements ServiceClass { hideSeriesTitle = hideSeriesTitle !== undefined ? hideSeriesTitle : false; // check token if(!this.cmsToken.cms){ - console.log('[ERROR] Authentication required!'); + console.error('Authentication required!'); return; } // opts @@ -609,7 +610,7 @@ export default class Crunchy implements ServiceClass { if(!hideSeriesTitle){ const seriesReq = await this.req.getData(`${api.cms}/series/${id}?preferred_audio_language=ja-JP`, AuthHeaders); if(!seriesReq.ok || !seriesReq.res){ - console.log('[ERROR] Series Request FAILED!'); + console.error('Series Request FAILED!'); return; } const seriesData = JSON.parse(seriesReq.res.body); @@ -618,13 +619,13 @@ export default class Crunchy implements ServiceClass { // seasons list const seriesSeasonListReq = await this.req.getData(`${api.cms}/series/${id}/seasons?preferred_audio_language=ja-JP`, AuthHeaders); if(!seriesSeasonListReq.ok || !seriesSeasonListReq.res){ - console.log('[ERROR] Series Request FAILED!'); + console.error('Series Request FAILED!'); return; } // parse data const seasonsList = JSON.parse(seriesSeasonListReq.res.body) as SeriesSearch; if(seasonsList.total < 1){ - console.log('[INFO] Series is empty!'); + console.info('Series is empty!'); return; } for(const item of seasonsList.data){ @@ -635,7 +636,7 @@ export default class Crunchy implements ServiceClass { public async logMovieListingById(id: string, pad?: number){ pad = pad || 2; if(!this.cmsToken.cms){ - console.log('[ERROR] Authentication required!'); + console.error('Authentication required!'); return; } const movieListingReqOpts = [ @@ -651,12 +652,12 @@ export default class Crunchy implements ServiceClass { ].join(''); const movieListingReq = await this.req.getData(movieListingReqOpts); if(!movieListingReq.ok || !movieListingReq.res){ - console.log('[ERROR] Movie Listing Request FAILED!'); + console.error('Movie Listing Request FAILED!'); return; } const movieListing = JSON.parse(movieListingReq.res.body); if(movieListing.total < 1){ - console.log('[INFO] Movie Listing is empty!'); + console.info('Movie Listing is empty!'); return; } for(const item of movieListing.items){ @@ -666,7 +667,7 @@ export default class Crunchy implements ServiceClass { public async getNewlyAdded(page?: number){ if(!this.token.access_token){ - console.log('[ERROR] Authentication required!'); + console.error('Authentication required!'); return; } const newlyAddedReqOpts = { @@ -682,11 +683,11 @@ export default class Crunchy implements ServiceClass { }).toString(); const newlyAddedReq = await this.req.getData(`${api.beta_browse}?${newlyAddedParams}`, newlyAddedReqOpts); if(!newlyAddedReq.ok || !newlyAddedReq.res){ - console.log('[ERROR] Get newly added FAILED!'); + console.error('Get newly added FAILED!'); return; } const newlyAddedResults = JSON.parse(newlyAddedReq.res.body); - console.log('[INFO] Newly added:'); + console.info('Newly added:'); for(const i of newlyAddedResults.items){ await this.logObject(i, 2); } @@ -694,12 +695,12 @@ export default class Crunchy implements ServiceClass { const itemPad = parseInt(new URL(newlyAddedResults.__href__, domain.api_beta).searchParams.get('start') as string); const pageCur = itemPad > 0 ? Math.ceil(itemPad/25) + 1 : 1; const pageMax = Math.ceil(newlyAddedResults.total/25); - console.log(` [INFO] Total results: ${newlyAddedResults.total} (Page: ${pageCur}/${pageMax})`); + console.info(` Total results: ${newlyAddedResults.total} (Page: ${pageCur}/${pageMax})`); } public async getSeasonById(id: string, numbers: number, e: string|undefined, but: boolean, all: boolean) : Promise> { if(!this.cmsToken.cms){ - console.log('[ERROR] Authentication required!'); + console.error('Authentication required!'); return { isOk: false, reason: new Error('Authentication required') }; } @@ -714,7 +715,7 @@ export default class Crunchy implements ServiceClass { //get show info const showInfoReq = await this.req.getData(`${api.cms}/seasons/${id}?preferred_audio_language=ja-JP`, AuthHeaders); if(!showInfoReq.ok || !showInfoReq.res){ - console.log('[ERROR] Show Request FAILED!'); + console.error('Show Request FAILED!'); return { isOk: false, reason: new Error('Show request failed. No more information provided.') }; } const showInfo = JSON.parse(showInfoReq.res.body); @@ -723,7 +724,7 @@ export default class Crunchy implements ServiceClass { //get episode info const reqEpsList = await this.req.getData(`${api.cms}/seasons/${id}/episodes?preferred_audio_language=ja-JP`, AuthHeaders); if(!reqEpsList.ok || !reqEpsList.res){ - console.log('[ERROR] Episode List Request FAILED!'); + console.error('Episode List Request FAILED!'); return { isOk: false, reason: new Error('Episode List request failed. No more information provided.') }; } const episodeList = JSON.parse(reqEpsList.res.body) as CrunchyEpisodeList; @@ -735,7 +736,7 @@ export default class Crunchy implements ServiceClass { const epNumLen = numbers; if(episodeList.total < 1){ - console.log(' [INFO] Season is empty!'); + console.info(' Season is empty!'); return { isOk: true, value: [] }; } @@ -808,10 +809,10 @@ export default class Crunchy implements ServiceClass { // display if(selectedMedia.length < 1){ - console.log('\n[INFO] Episodes not selected!\n'); + console.info('\nEpisodes not selected!\n'); } - console.log(); + console.info(''); return { isOk: true, value: selectedMedia }; } @@ -831,19 +832,19 @@ export default class Crunchy implements ServiceClass { public async getObjectById(e?: string, earlyReturn?: boolean): Promise[]|undefined> { if(!this.cmsToken.cms){ - console.log('[ERROR] Authentication required!'); + console.error('Authentication required!'); return; } const doEpsFilter = parseSelect(e as string); if(doEpsFilter.values.length < 1){ - console.log('\n[INFO] Objects not selected!\n'); + console.info('\nObjects not selected!\n'); return; } // node index.js --service crunchy -e G6497Z43Y,GRZXCMN1W,G62PEZ2E6,G25FVGDEK,GZ7UVPVX5 - console.log('[INFO] Requested object ID: %s', doEpsFilter.values.join(', ')); + console.info('Requested object ID: %s', doEpsFilter.values.join(', ')); const AuthHeaders = { headers: { @@ -855,10 +856,10 @@ export default class Crunchy implements ServiceClass { // reqs const objectReq = await this.req.getData(`${api.cms}/objects/${doEpsFilter.values.join(',')}?preferred_audio_language=ja-JP`, AuthHeaders); if(!objectReq.ok || !objectReq.res){ - console.log('[ERROR] Objects Request FAILED!'); + console.error('Objects Request FAILED!'); if(objectReq.error && objectReq.error.res && objectReq.error.res.body){ const objectInfo = JSON.parse(objectReq.error.res.body as string); - console.log('[INFO] Body:', JSON.stringify(objectInfo, null, '\t')); + console.info('Body:', JSON.stringify(objectInfo, null, '\t')); objectInfo.error = true; return objectInfo; } @@ -870,7 +871,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'){ @@ -913,7 +914,7 @@ export default class Crunchy implements ServiceClass { } await this.logObject(item, 2); } - console.log(); + console.info(''); return selectedMedia; } @@ -923,7 +924,7 @@ export default class Crunchy implements ServiceClass { error: boolean } | undefined> { if(!this.cmsToken.cms){ - console.log('[ERROR] Authentication required!'); + console.error('Authentication required!'); return; } @@ -937,7 +938,7 @@ export default class Crunchy implements ServiceClass { const files: DownloadedMedia[] = []; if(medias.data.every(a => !a.playback)){ - console.log('[WARN] Video not available!'); + console.warn('Video not available!'); return undefined; } @@ -946,7 +947,7 @@ export default class Crunchy implements ServiceClass { for (const mMeta of medias.data) { - console.log(`[INFO] Requesting: [${mMeta.mediaId}] ${mediaName}`); + console.info(`Requesting: [${mMeta.mediaId}] ${mediaName}`); //Make sure token is up to date await this.refreshToken(true, true); @@ -962,7 +963,7 @@ export default class Crunchy implements ServiceClass { if (mMeta.versions && mMeta.lang) { mediaId = mMeta.versions.find(a => a.audio_locale == mMeta.lang?.cr_locale)?.media_guid as string; if (!mediaId) { - console.log('[ERROR] Selected language not found.'); + console.error('Selected language not found.'); return undefined; } } @@ -973,10 +974,10 @@ export default class Crunchy implements ServiceClass { let playbackReq = await this.req.getData(`${api.cms}/videos/${mediaId}/streams`, AuthHeaders); if(!playbackReq.ok || !playbackReq.res){ - console.log('[ERROR] Request Stream URLs FAILED! Attempting fallback'); + console.error('Request Stream URLs FAILED! Attempting fallback'); playbackReq = await this.req.getData(`${domain.api_beta}${mMeta.playback}`, AuthHeaders); if(!playbackReq.ok || !playbackReq.res){ - console.log('[ERROR] Fallback Request Stream URLs FAILED!'); + console.error('Fallback Request Stream URLs FAILED!'); return undefined; } } @@ -998,7 +999,7 @@ export default class Crunchy implements ServiceClass { } as Variable; })); - let streams = []; + let streams: any[] = []; let hsLangs: string[] = []; const pbStreams = pbData.data[0]; @@ -1021,7 +1022,7 @@ export default class Crunchy implements ServiceClass { } if(streams.length < 1){ - console.log('[WARN] No full streams found!'); + console.warn('No full streams found!'); return undefined; } @@ -1044,7 +1045,7 @@ export default class Crunchy implements ServiceClass { if(options.hslang != 'none'){ if(hsLangs.indexOf(options.hslang) > -1){ - console.log('[INFO] Selecting stream with %s hardsubs', langsData.locale2language(options.hslang).language); + console.info('Selecting stream with %s hardsubs', langsData.locale2language(options.hslang).language); streams = streams.filter((s) => { if(s.hardsub_lang == '-'){ return false; @@ -1053,9 +1054,9 @@ export default class Crunchy implements ServiceClass { }); } else{ - console.log('[WARN] Selected stream with %s hardsubs not available', langsData.locale2language(options.hslang).language); + console.warn('Selected stream with %s hardsubs not available', langsData.locale2language(options.hslang).language); if(hsLangs.length > 0){ - console.log('[WARN] Try other hardsubs stream:', hsLangs.join(', ')); + console.warn('Try other hardsubs stream:', hsLangs.join(', ')); } dlFailed = true; } @@ -1068,13 +1069,13 @@ export default class Crunchy implements ServiceClass { return true; }); if(streams.length < 1){ - console.log('[WARN] Raw streams not available!'); + console.warn('Raw streams not available!'); if(hsLangs.length > 0){ - console.log('[WARN] Try hardsubs stream:', hsLangs.join(', ')); + console.warn('Try hardsubs stream:', hsLangs.join(', ')); } dlFailed = true; } - console.log('[INFO] Selecting raw stream'); + console.info('Selecting raw stream'); } let curStream: @@ -1086,19 +1087,19 @@ export default class Crunchy implements ServiceClass { streams.forEach((s, i) => { const isSelected = options.kstream == i + 1 ? '✓' : ' '; - console.log('[INFO] Full stream found! (%s%s: %s )', isSelected, i + 1, s.type); + console.info('Full stream found! (%s%s: %s )', isSelected, i + 1, s.type); }); - console.log('[INFO] Downloading video...'); + console.info('Downloading video...'); curStream = streams[options.kstream-1]; - console.log('[INFO] Playlists URL: %s (%s)', curStream.url, curStream.type); + console.info('Playlists URL: %s (%s)', curStream.url, curStream.type); } if(!options.novids && !dlFailed && curStream !== undefined){ const streamPlaylistsReq = await this.req.getData(curStream.url); if(!streamPlaylistsReq.ok || !streamPlaylistsReq.res){ - console.log('[ERROR] CAN\'T FETCH VIDEO PLAYLISTS!'); + console.error('CAN\'T FETCH VIDEO PLAYLISTS!'); dlFailed = true; } else{ @@ -1139,7 +1140,7 @@ export default class Crunchy implements ServiceClass { && plStreams[plServer][plResolutionText] != pl.uri && typeof plStreams[plServer][plResolutionText] != 'undefined' ){ - console.log(`[WARN] Non duplicate url for ${plServer} detected, please report to developer!`); + console.error(`Non duplicate url for ${plServer} detected, please report to developer!`); } else{ plStreams[plServer][plResolutionText] = pl.uri; @@ -1170,7 +1171,7 @@ export default class Crunchy implements ServiceClass { }); let quality = options.q === 0 ? plQuality.length : options.q; if(quality > plQuality.length) { - console.log(`[WARN] The requested quality of ${options.q} is greater than the maximun ${plQuality.length}.\n[WARN] Therefor the maximum will be capped at ${plQuality.length}.`); + console.warn(`The requested quality of ${options.q} is greater than the maximun ${plQuality.length}.\n[WARN] Therefor the maximum will be capped at ${plQuality.length}.`); quality = plQuality.length; } // When best selected video quality is already downloaded @@ -1181,8 +1182,8 @@ export default class Crunchy implements ServiceClass { } } const selPlUrl = plSelectedList[plQuality.map(a => a.dim)[quality - 1]] ? plSelectedList[plQuality.map(a => a.dim)[quality - 1]] : ''; - console.log(`[INFO] Servers available:\n\t${plServerList.join('\n\t')}`); - console.log(`[INFO] Available qualities:\n\t${plQuality.map((a, ind) => `[${ind+1}] ${a.str}`).join('\n\t')}`); + console.info(`Servers available:\n\t${plServerList.join('\n\t')}`); + console.info(`Available qualities:\n\t${plQuality.map((a, ind) => `[${ind+1}] ${a.str}`).join('\n\t')}`); if(selPlUrl != ''){ variables.push({ @@ -1196,18 +1197,18 @@ export default class Crunchy implements ServiceClass { }); const lang = langsData.languages.find(a => a.code === curStream?.audio_lang); if (!lang) { - console.log(`[ERROR] Unable to find language for code ${curStream.audio_lang}`); + console.error(`Unable to find language for code ${curStream.audio_lang}`); return; } - console.log(`[INFO] Selected quality: ${Object.keys(plSelectedList).find(a => plSelectedList[a] === selPlUrl)} @ ${plSelectedServer}`); - console.log('[INFO] Stream URL:', selPlUrl); + console.info(`Selected quality: ${Object.keys(plSelectedList).find(a => plSelectedList[a] === selPlUrl)} @ ${plSelectedServer}`); + console.info('Stream URL:', selPlUrl); // TODO check filename fileName = parseFileName(options.fileName, variables, options.numbers, options.override).join(path.sep); const outFile = parseFileName(options.fileName + '.' + (mMeta.lang?.name || lang.name), variables, options.numbers, options.override).join(path.sep); - console.log(`[INFO] Output filename: ${outFile}`); + console.info(`Output filename: ${outFile}`); const chunkPage = await this.req.getData(selPlUrl); if(!chunkPage.ok || !chunkPage.res){ - console.log('[ERROR] CAN\'T FETCH VIDEO PLAYLIST!'); + console.error('CAN\'T FETCH VIDEO PLAYLIST!'); dlFailed = true; } else{ @@ -1215,7 +1216,7 @@ export default class Crunchy implements ServiceClass { const totalParts = chunkPlaylist.segments.length; const mathParts = Math.ceil(totalParts / options.partsize); const mathMsg = `(${mathParts}*${options.partsize})`; - console.log('[INFO] Total parts in stream:', totalParts, mathMsg); + console.info('Total parts in stream:', totalParts, mathMsg); const tsFile = path.isAbsolute(outFile as string) ? outFile : path.join(this.cfg.dir.content, outFile); const split = outFile.split(path.sep).slice(0, -1); split.forEach((val, ind, arr) => { @@ -1242,7 +1243,7 @@ export default class Crunchy implements ServiceClass { }) : undefined }).download(); if(!dlStreamByPl.ok){ - console.log(`[ERROR] DL Stats: ${JSON.stringify(dlStreamByPl.parts)}\n`); + console.error(`DL Stats: ${JSON.stringify(dlStreamByPl.parts)}\n`); dlFailed = true; } files.push({ @@ -1254,14 +1255,14 @@ export default class Crunchy implements ServiceClass { } } else{ - console.log('[ERROR] Quality not selected!\n'); + console.error('Quality not selected!\n'); dlFailed = true; } } } else if(options.novids){ fileName = parseFileName(options.fileName, variables, options.numbers, options.override).join(path.sep); - console.log('[INFO] Downloading skipped!'); + console.info('Downloading skipped!'); } @@ -1270,7 +1271,7 @@ export default class Crunchy implements ServiceClass { } if(options.hslang != 'none'){ - console.log('[WARN] Subtitles downloading disabled for hardsubs streams.'); + console.warn('Subtitles downloading disabled for hardsubs streams.'); options.skipsubs = true; } @@ -1307,7 +1308,7 @@ export default class Crunchy implements ServiceClass { sxData.title = `${langItem.language} / ${sxData.title}`; sxData.fonts = fontsData.assFonts(sBody) as Font[]; fs.writeFileSync(sxData.path, sBody); - console.log(`[INFO] Subtitle downloaded: ${sxData.file}`); + console.info(`Subtitle downloaded: ${sxData.file}`); files.push({ type: 'Subtitle', ...sxData as sxItem, @@ -1315,17 +1316,17 @@ export default class Crunchy implements ServiceClass { }); } else{ - console.log(`[WARN] Failed to download subtitle: ${sxData.file}`); + console.warn(`Failed to download subtitle: ${sxData.file}`); } } } } else{ - console.log('[WARN] Can\'t find urls for subtitles!'); + console.warn('Can\'t find urls for subtitles!'); } } else{ - console.log('[INFO] Subtitles downloading skipped!'); + console.info('Subtitles downloading skipped!'); } } return { @@ -1338,7 +1339,7 @@ export default class Crunchy implements ServiceClass { public async muxStreams(data: DownloadedMedia[], options: CrunchyMuxOptions) { this.cfg.bin = await yamlCfg.loadBinCfg(); if (options.novids || data.filter(a => a.type === 'Video').length === 0) - return console.log('[INFO] Skip muxing since no vids are downloaded'); + return console.info('Skip muxing since no vids are downloaded'); const merger = new Merger({ onlyVid: [], skipSubMux: options.skipSubMux, @@ -1385,7 +1386,7 @@ export default class Crunchy implements ServiceClass { await merger.merge('ffmpeg', bin.FFmpeg); isMuxed = true; } else{ - console.log('\n[INFO] Done!\n'); + console.info('\nDone!\n'); return; } if (isMuxed && !options.nocleanup) @@ -1465,7 +1466,7 @@ export default class Crunchy implements ServiceClass { for (const key of Object.keys(episodes)) { const item = episodes[key]; - console.log(`[${key}] ${ + console.info(`[${key}] ${ item.items.find(a => !a.season_title.match(/\(\w+ Dub\)/))?.season_title ?? item.items[0].season_title.replace(/\(\w+ Dub\)/g, '').trimEnd() } - Season ${item.items[0].season_number} - ${item.items[0].title} [${ item.items.map((a, index) => { @@ -1477,7 +1478,7 @@ export default class Crunchy implements ServiceClass { //TODO: Sort episodes to have specials at the end if (!serieshasversions) { - console.log('[WARN] Couldn\'t find versions on some episodes, fell back to old method.'); + console.warn('Couldn\'t find versions on some episodes, fell back to old method.'); } return { data: episodes, list: Object.entries(episodes).map(([key, value]) => { @@ -1500,13 +1501,13 @@ export default class Crunchy implements ServiceClass { public async downloadFromSeriesID(id: string, data: CurnchyMultiDownload) : Promise> { const { data: episodes } = await this.listSeriesID(id); - console.log(); - console.log('-'.repeat(30)); - console.log(); + console.info(''); + console.info('-'.repeat(30)); + console.info(''); const selected = this.itemSelectMultiDub(episodes, data.dubLang, data.but, data.all, data.e); for (const key of Object.keys(selected)) { const item = selected[key]; - console.log(`[S${item.season}E${item.episodeNumber}] - ${item.episodeTitle} [${ + console.info(`[S${item.season}E${item.episodeNumber}] - ${item.episodeTitle} [${ item.data.map(a => { return `✓ ${a.lang?.name || 'Unknown Language'}`; }).join(', ') @@ -1611,7 +1612,7 @@ export default class Crunchy implements ServiceClass { public async parseSeriesById(id: string) { if(!this.cmsToken.cms){ - console.log('[ERROR] Authentication required!'); + console.error('Authentication required!'); return; } @@ -1625,13 +1626,13 @@ export default class Crunchy implements ServiceClass { // seasons list const seriesSeasonListReq = await this.req.getData(`${api.cms}/series/${id}/seasons?preferred_audio_language=ja-JP`, AuthHeaders); if(!seriesSeasonListReq.ok || !seriesSeasonListReq.res){ - console.log('[ERROR] Series Request FAILED!'); + console.error('Series Request FAILED!'); return; } // parse data const seasonsList = JSON.parse(seriesSeasonListReq.res.body) as SeriesSearch; if(seasonsList.total < 1){ - console.log('[INFO] Series is empty!'); + console.info('Series is empty!'); return; } return seasonsList; @@ -1639,7 +1640,7 @@ export default class Crunchy implements ServiceClass { public async getSeasonDataById(item: SeriesSearchItem, log = false){ if(!this.cmsToken.cms){ - console.log('[ERROR] Authentication required!'); + console.error('Authentication required!'); return; } @@ -1653,7 +1654,7 @@ export default class Crunchy implements ServiceClass { //get show info const showInfoReq = await this.req.getData(`${api.cms}/seasons/${item.id}?preferred_audio_language=ja-JP`, AuthHeaders); if(!showInfoReq.ok || !showInfoReq.res){ - console.log('[ERROR] Show Request FAILED!'); + console.error('Show Request FAILED!'); return; } const showInfo = JSON.parse(showInfoReq.res.body); @@ -1662,13 +1663,13 @@ export default class Crunchy implements ServiceClass { //get episode info const reqEpsList = await this.req.getData(`${api.cms}/seasons/${item.id}/episodes?preferred_audio_language=ja-JP`, AuthHeaders); if(!reqEpsList.ok || !reqEpsList.res){ - console.log('[ERROR] Episode List Request FAILED!'); + console.error('Episode List Request FAILED!'); return; } const episodeList = JSON.parse(reqEpsList.res.body) as CrunchyEpisodeList; if(episodeList.total < 1){ - console.log(' [INFO] Season is empty!'); + console.info(' Season is empty!'); return; } return episodeList; diff --git a/docs/DOCUMENTATION.md b/docs/DOCUMENTATION.md index 028ca98..37e3cce 100644 --- a/docs/DOCUMENTATION.md +++ b/docs/DOCUMENTATION.md @@ -1,4 +1,4 @@ -# multi-downloader-nx (3.3.7v) +# multi-downloader-nx (3.4.0v) If you find any bugs in this documentation or in the programm itself please report it [over on GitHub](https://github.com/anidl/multi-downloader-nx/issues). @@ -379,4 +379,5 @@ If true, the tool won't check for updates | --- | --- | --- | --- | --- | ---| | Both | `--help ` | `boolean` | `No`| `-h` | `NaN` | -Show the help output \ No newline at end of file +Show the help output +### GUI diff --git a/funi.ts b/funi.ts index e4ac2b7..6c3d314 100644 --- a/funi.ts +++ b/funi.ts @@ -3,15 +3,13 @@ import fs from 'fs'; import path from 'path'; // package json -import packageJson from './package.json'; - -// program name -const api_host = 'https://prod-api-funimationnow.dadcdigital.com/api'; +import packageJson from './package.json'; // modules extra +import { console } from './modules/log'; import * as shlp from 'sei-helper'; import m3u8 from 'm3u8-parsed'; -import hlsDownload, { HLSCallback } from 'hls-download'; +import hlsDownload, { HLSCallback } from './modules/hls-download'; // extra import * as appYargs from './modules/module.app-args'; @@ -19,7 +17,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 @@ -39,7 +37,10 @@ import { TitleElement } from './@types/episode'; import { AvailableFilenameVars } from './modules/module.args'; import { AuthData, AuthResponse, CheckTokenResponse, FuniGetEpisodeData, FuniGetEpisodeResponse, FuniGetShowData, SearchData, FuniSearchReponse, FuniShowResponse, FuniStreamData, FuniSubsData, FuniEpisodeData, ResponseBase } from './@types/messageHandler'; import { ServiceClass } from './@types/serviceClassInterface'; -import { SubtitleRequest } from './@types/funiSubtitleRequest'; +import { SubtitleRequest } from './@types/funiSubtitleRequest'; + +// program name +const api_host = 'https://prod-api-funimationnow.dadcdigital.com/api'; // check page // fn variables @@ -73,7 +74,7 @@ export default class Funi implements ServiceClass { const argv = appYargs.appArgv(this.cfg.cli); if (argv.debug) this.debug = true; - console.log(`\n=== Multi Downloader NX ${packageJson.version} ===\n`); + console.info(`\n=== Multi Downloader NX ${packageJson.version} ===\n`); if (argv.allDubs) { argv.dubLang = langsData.dubLanguageCodes; } @@ -98,7 +99,7 @@ export default class Funi implements ServiceClass { else if(argv.s && !isNaN(parseInt(argv.s)) && parseInt(argv.s) > 0){ const data = await this.getShow(true, { id: parseInt(argv.s), but: argv.but, all: argv.all, e: argv.e }); if (!data.isOk) { - console.log(`[ERROR] ${data.reason.message}`); + console.error(`${data.reason.message}`); return false; } let ok = true; @@ -112,7 +113,7 @@ export default class Funi implements ServiceClass { return ok; } else{ - console.log('[INFO] No option selected or invalid value entered. Try --help.'); + console.info('No option selected or invalid value entered. Try --help.'); } } public async auth(data: AuthData): Promise { @@ -129,14 +130,14 @@ export default class Funi implements ServiceClass { if(authData.ok && authData.res){ const resJSON = JSON.parse(authData.res.body); if(resJSON.token){ - console.log('[INFO] Authentication success, your token: %s%s\n', resJSON.token.slice(0,8),'*'.repeat(32)); + console.info('Authentication success, your token: %s%s\n', resJSON.token.slice(0,8),'*'.repeat(32)); yamlCfg.saveFuniToken({'token': resJSON.token}); this.token = resJSON.token; return { isOk: true, value: undefined }; } else { - console.log('[ERROR]%s\n', ' No token found'); + console.info('[ERROR]%s\n', ' No token found'); if (this.debug) { - console.log(resJSON); + console.info(resJSON); } return { isOk: false, reason: new Error(resJSON) }; } @@ -159,18 +160,18 @@ export default class Funi implements ServiceClass { } const searchDataJSON = JSON.parse(searchData.res.body); if(searchDataJSON.detail){ - console.log(`[ERROR] ${searchDataJSON.detail}`); + console.error(`${searchDataJSON.detail}`); return { isOk: false, reason: new Error(searchDataJSON.defail) }; } if(searchDataJSON.items && searchDataJSON.items.hits && log){ const shows = searchDataJSON.items.hits; - console.log('[INFO] Search Results:'); + console.info('Search Results:'); for(const ssn in shows){ - console.log(`[#${shows[ssn].id}] ${shows[ssn].title}` + (shows[ssn].tx_date?` (${shows[ssn].tx_date})`:'')); + console.info(`[#${shows[ssn].id}] ${shows[ssn].title}` + (shows[ssn].tx_date?` (${shows[ssn].tx_date})`:'')); } } if (log) - console.log('[INFO] Total shows found: %s\n',searchDataJSON.count); + console.info('Total shows found: %s\n',searchDataJSON.count); return { isOk: true, value: searchDataJSON }; } @@ -186,15 +187,15 @@ export default class Funi implements ServiceClass { if(!showData.ok || !showData.res){ return { isOk: false, reason: new Error('ShowData is not ok') }; } const showDataJSON = JSON.parse(showData.res.body); if(showDataJSON.status){ - console.log('[ERROR] Error #%d: %s\n', showDataJSON.status, showDataJSON.data.errors[0].detail); + console.error('Error #%d: %s\n', showDataJSON.status, showDataJSON.data.errors[0].detail); return { isOk: false, reason: new Error(showDataJSON.data.errors[0].detail) }; } else if(!showDataJSON.items || showDataJSON.items.length<1){ - console.log('[ERROR] Show not found\n'); + console.error('Show not found\n'); return { isOk: false, reason: new Error('Show not found') }; } const showDataItem = showDataJSON.items[0]; - console.log('[#%s] %s (%s)',showDataItem.id,showDataItem.title,showDataItem.releaseYear); + console.info('[#%s] %s (%s)',showDataItem.id,showDataItem.title,showDataItem.releaseYear); // show episodes const qs: { limit: number, @@ -219,7 +220,7 @@ export default class Funi implements ServiceClass { const parseEpStr = (epStr: string) => { const match = epStr.match(epNumRegex); if (!match) { - console.error('[ERROR] No match found'); + console.error('No match found'); return ['', '']; } if(match.length > 2){ @@ -241,7 +242,7 @@ export default class Funi implements ServiceClass { } else{ Funi.typeIdLen = 3 > Funi.typeIdLen? 3 : Funi.typeIdLen; - console.log('[ERROR] FAILED TO PARSE: ', e.id); + console.error('FAILED TO PARSE: ', e.id); e.id_split = [ 'ZZZ', 9999 ]; } return e; @@ -266,7 +267,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){ @@ -308,16 +309,16 @@ export default class Funi implements ServiceClass { conOut += `(${rtm_str}) [${qua_str+aud_str}]`; conOut += is_selected ? ' (selected)' : ''; conOut += eps.length-1 == parseInt(e) ? '\n' : ''; - console.log(conOut); + console.info(conOut); } if(fnSlug.length < 1){ if (log) - console.log('[INFO] Episodes not selected!\n'); + console.info('Episodes not selected!\n'); return { isOk: true, value: [] } ; } else{ if (log) - console.log('[INFO] Selected Episodes: %s\n',epSelEpsTxt.join(', ')); + console.info('Selected Episodes: %s\n',epSelEpsTxt.join(', ')); return { isOk: true, value: fnSlug }; } } @@ -331,7 +332,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'){ @@ -347,15 +348,15 @@ export default class Funi implements ServiceClass { // end if (log) { - console.log( - '[INFO] %s - S%sE%s - %s', + console.info( + '%s - S%sE%s - %s', ep.parent.title, (ep.parent.seasonNumber ? ep.parent.seasonNumber : '?'), (ep.number ? ep.number : '?'), ep.title ); - console.log('[INFO] Available streams (Non-Encrypted):'); + console.info('Available streams (Non-Encrypted):'); } // map medias const media = await Promise.all(ep.media.map(async (m) =>{ @@ -406,7 +407,7 @@ export default class Funi implements ServiceClass { if (!subsToDisplay.includes(a.lang)) subsToDisplay.push(a.lang); }); - console.log(`[#${m.id}] ${dub_type} [${m.version}]${(selected?' (selected)':'')}${ + console.info(`[#${m.id}] ${dub_type} [${m.version}]${(selected?' (selected)':'')}${ localSubs && localSubs.length > 0 && selected ? ` (using ${subsToDisplay.map(a => `'${a.name}'`).join(', ')} for subtitles)` : '' }`); } @@ -424,7 +425,7 @@ export default class Funi implements ServiceClass { }); if(streamIds.length < 1){ if (log) - console.log('[ERROR] Track not selected\n'); + console.error('Track not selected\n'); return { isOk: false, reason: new Error('Track not selected') }; } else{ @@ -442,7 +443,7 @@ export default class Funi implements ServiceClass { const streamDataRes = JSON.parse(streamData.res.body) as StreamData; if(streamDataRes.errors){ if (log) - console.log('[ERROR] Error #%s: %s\n',streamDataRes.errors[0].code,streamDataRes.errors[0].detail); + console.info('Error #%s: %s\n',streamDataRes.errors[0].code,streamDataRes.errors[0].detail); return { isOk: false, reason: new Error(streamDataRes.errors[0].detail) }; } else{ @@ -459,7 +460,7 @@ export default class Funi implements ServiceClass { } if(tsDlPath.length < 1){ if (log) - console.log('[ERROR] Unknown error\n'); + console.error('Unknown error\n'); return { isOk: false, reason: new Error('Unknown error') }; } else{ @@ -508,7 +509,7 @@ export default class Funi implements ServiceClass { plStreams: Record = {}, - plLayersStr = [], + plLayersStr: string[] = [], plLayersRes: Record a.funi_name_lagacy === audioEl[0] || ((a.funi_name ?? a.name) === audioEl[0])); if (!language) { if (log) - console.log(`[ERROR] Unable to find language for locale ${audioData.language} or name ${audioEl[0]}`); + console.error(`Unable to find language for locale ${audioData.language} or name ${audioEl[0]}`); return; } } @@ -547,7 +548,7 @@ export default class Funi implements ServiceClass { plQualityLinkList.playlists.sort((a, b) => { const aMatch = a.uri.match(vplReg), bMatch = b.uri.match(vplReg); if (!aMatch || !bMatch) { - console.log('[ERROR] Unable to match'); + console.info('Unable to match'); return 0; } const av = parseInt(aMatch[3]); @@ -584,7 +585,7 @@ export default class Funi implements ServiceClass { plStreams[plServer] = {}; } if(plStreams[plServer][plLayerId] && plStreams[plServer][plLayerId] != plUrlDl){ - console.log(`[WARN] Non duplicate url for ${plServer} detected, please report to developer!`); + console.warn(`Non duplicate url for ${plServer} detected, please report to developer!`); } else{ plStreams[plServer][plLayerId] = plUrlDl; @@ -604,7 +605,7 @@ export default class Funi implements ServiceClass { } } else { - console.log(s.uri); + console.info(s.uri); } } @@ -622,8 +623,8 @@ export default class Funi implements ServiceClass { plLayersStr.sort(); if (log) { - console.log(`[INFO] Servers available:\n\t${plServerList.join('\n\t')}`); - console.log(`[INFO] Available qualities:\n\t${plLayersStr.join('\n\t')}`); + console.info(`Servers available:\n\t${plServerList.join('\n\t')}`); + console.info(`Available qualities:\n\t${plLayersStr.join('\n\t')}`); } const selectedQuality = data.q === 0 || data.q > Object.keys(plLayersRes).length @@ -633,8 +634,8 @@ export default class Funi implements ServiceClass { if(videoUrl != ''){ if (log) { - console.log(`[INFO] Selected layer: ${selectedQuality} (${plLayersRes[selectedQuality].width}x${plLayersRes[selectedQuality].height}) @ ${plSelectedServer}`); - console.log('[INFO] Stream URL:',videoUrl); + console.info(`Selected layer: ${selectedQuality} (${plLayersRes[selectedQuality].width}x${plLayersRes[selectedQuality].height}) @ ${plSelectedServer}`); + console.info('Stream URL:',videoUrl); } fnOutput = parseFileName(data.fileName, ([ @@ -656,16 +657,16 @@ export default class Funi implements ServiceClass { if (fnOutput.length < 1) throw new Error(`Invalid path generated for input ${data.fileName}`); if (log) - console.log(`[INFO] Output filename: ${fnOutput.join(path.sep)}.ts`); + console.info(`Output filename: ${fnOutput.join(path.sep)}.ts`); } else if(data.x > plServerList.length){ if (log) - console.log('[ERROR] Server not selected!\n'); + console.error('Server not selected!\n'); return; } else{ if (log) - console.log('[ERROR] Layer not selected!\n'); + console.error('Layer not selected!\n'); return; } @@ -715,7 +716,7 @@ export default class Funi implements ServiceClass { } else{ if (log) - console.log('[INFO] Skip video downloading...\n'); + console.info('Skip video downloading...\n'); } audio: if (plAud && !data.noaudio) { // download audio @@ -756,7 +757,7 @@ export default class Funi implements ServiceClass { // download subtitles if(stDlPath.length > 0){ if (log) - console.log('[INFO] Downloading subtitles...'); + console.info('Downloading subtitles...'); for (const subObject of stDlPath) { const subsSrc = await getData({ url: subObject.url, @@ -769,24 +770,24 @@ export default class Funi implements ServiceClass { } else{ if (log) - console.log('[ERROR] Failed to download subtitles!'); + console.error('Failed to download subtitles!'); addSubs = false; break; } } if (addSubs && log) - console.log('[INFO] Subtitles downloaded!'); + console.info('Subtitles downloaded!'); } if((puraudio.length < 1 && audioAndVideo.length < 1) || (purvideo.length < 1 && audioAndVideo.length < 1)){ if (log) - console.log('\n[INFO] Unable to locate a video AND audio file\n'); + console.info('\nUnable to locate a video AND audio file\n'); return; } if(data.skipmux){ if (log) - console.log('[INFO] Skipping muxing...'); + console.info('Skipping muxing...'); return; } @@ -796,7 +797,7 @@ export default class Funi implements ServiceClass { if ( data.novids ){ if (log) - console.log('[INFO] Video not downloaded. Skip muxing video.'); + console.info('Video not downloaded. Skip muxing video.'); } const ffext = !data.mp4 ? 'mkv' : 'mp4'; @@ -835,7 +836,7 @@ export default class Funi implements ServiceClass { } else{ if (log) - console.log('\n[INFO] Done!\n'); + console.info('\nDone!\n'); return true; } if (data.nocleanup) { @@ -844,7 +845,7 @@ export default class Funi implements ServiceClass { mergeInstance.cleanUp(); if (log) - console.log('\n[INFO] Done!\n'); + console.info('\nDone!\n'); return true; } @@ -878,7 +879,7 @@ export default class Funi implements ServiceClass { querystring: { deviceType: 'web' } }); if (!subs.ok || !subs.res || !subs.res.body) { - console.log('[ERROR] Subtitle Request failed.'); + console.error('Subtitle Request failed.'); return []; } const parsed: SubtitleRequest = JSON.parse(subs.res.body); diff --git a/gui.ts b/gui.ts new file mode 100644 index 0000000..5bb963e --- /dev/null +++ b/gui.ts @@ -0,0 +1,3 @@ +process.env.isGUI = 'true'; +import './modules/log'; +import './gui/server/index'; \ No newline at end of file diff --git a/gui/electron/src/.env b/gui/electron/src/.env deleted file mode 100644 index d908dac..0000000 --- a/gui/electron/src/.env +++ /dev/null @@ -1,2 +0,0 @@ -USE_BROWSER=true -TEST=true \ No newline at end of file diff --git a/gui/electron/src/images/Logo_Inverted.ico b/gui/electron/src/images/Logo_Inverted.ico deleted file mode 100644 index 7fc8471..0000000 Binary files a/gui/electron/src/images/Logo_Inverted.ico and /dev/null differ diff --git a/gui/electron/src/images/Logo_Inverted.png b/gui/electron/src/images/Logo_Inverted.png deleted file mode 100644 index 88b9e0c..0000000 Binary files a/gui/electron/src/images/Logo_Inverted.png and /dev/null differ diff --git a/gui/electron/src/index.ts b/gui/electron/src/index.ts deleted file mode 100644 index 7b5577a..0000000 --- a/gui/electron/src/index.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { app, BrowserWindow, dialog, screen } from 'electron'; -import path from 'path/posix'; -import fs from 'fs'; -import dotenv from 'dotenv'; -import express from 'express'; -import { Console } from 'console'; -import json from '../../../package.json'; - -process.on('uncaughtException', (er, or) => { - 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..f373e87 --- /dev/null +++ b/gui/react/.env @@ -0,0 +1,2 @@ +PORT=3002 +CI=false \ 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/@types/FC.d.ts b/gui/react/src/@types/FC.d.ts index 3e3f00a..5ec3de1 100644 --- a/gui/react/src/@types/FC.d.ts +++ b/gui/react/src/@types/FC.d.ts @@ -1,3 +1,3 @@ -type FCWithChildren = React.FC<{ +type FCWithChildren = React.FC<{ children?: React.ReactNode[]|React.ReactNode -}> \ No newline at end of file +} & T> \ No newline at end of file diff --git a/gui/react/src/App.tsx b/gui/react/src/App.tsx index e868163..8f278f3 100644 --- a/gui/react/src/App.tsx +++ b/gui/react/src/App.tsx @@ -1,12 +1,10 @@ import React from 'react'; -import { Button, TextField, Box } from '@mui/material'; -import { messageChannelContext } from './provider/MessageChannel'; import Layout from './Layout'; const App: React.FC = () => { return ( ); -} +}; export default App; diff --git a/gui/react/src/Layout.tsx b/gui/react/src/Layout.tsx index 6b50468..450f00f 100644 --- a/gui/react/src/Layout.tsx +++ b/gui/react/src/Layout.tsx @@ -1,32 +1,32 @@ -import React from "react"; -import AuthButton from "./components/AuthButton"; -import { Box, Button } from "@mui/material"; -import MainFrame from "./components/MainFrame/MainFrame"; -import LogoutButton from "./components/LogoutButton"; -import AddToQueue from "./components/AddToQueue/AddToQueue"; +import React from 'react'; +import AuthButton from './components/AuthButton'; +import { Box, Button } from '@mui/material'; +import MainFrame from './components/MainFrame/MainFrame'; +import LogoutButton from './components/LogoutButton'; +import AddToQueue from './components/AddToQueue/AddToQueue'; import { messageChannelContext } from './provider/MessageChannel'; -import { ClearAll, Folder } from "@mui/icons-material"; -import useStore from "./hooks/useStore"; -import StartQueueButton from "./components/StartQueue"; +import { ClearAll, Folder } from '@mui/icons-material'; +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 + + - + ; -} +}; export default Layout; \ No newline at end of file diff --git a/gui/react/src/Style.tsx b/gui/react/src/Style.tsx index 5428b26..4f44a07 100644 --- a/gui/react/src/Style.tsx +++ b/gui/react/src/Style.tsx @@ -1,5 +1,5 @@ -import React from "react"; -import { Container, Box, ThemeProvider, createTheme, Theme } from "@mui/material"; +import React from 'react'; +import { Container, Box, ThemeProvider, createTheme, Theme } from '@mui/material'; const makeTheme = (mode: 'dark'|'light') : Partial => { return createTheme({ @@ -11,11 +11,11 @@ const makeTheme = (mode: 'dark'|'light') : Partial => { const Style: FCWithChildren = ({children}) => { return - + {children} ; -} +}; export default Style; \ No newline at end of file diff --git a/gui/react/src/components/AddToQueue/AddToQueue.tsx b/gui/react/src/components/AddToQueue/AddToQueue.tsx index f6005ff..98333aa 100644 --- a/gui/react/src/components/AddToQueue/AddToQueue.tsx +++ b/gui/react/src/components/AddToQueue/AddToQueue.tsx @@ -1,9 +1,9 @@ -import { Add } from "@mui/icons-material"; -import { Box, Button, Dialog, Divider } from "@mui/material"; -import React from "react"; -import DownloadSelector from "./DownloadSelector/DownloadSelector"; -import EpisodeListing from "./DownloadSelector/Listing/EpisodeListing"; -import SearchBox from "./SearchBox/SearchBox"; +import { Add } from '@mui/icons-material'; +import { Box, Button, Dialog, Divider } from '@mui/material'; +import React from 'react'; +import DownloadSelector from './DownloadSelector/DownloadSelector'; +import EpisodeListing from './DownloadSelector/Listing/EpisodeListing'; +import SearchBox from './SearchBox/SearchBox'; const AddToQueue: React.FC = () => { const [isOpen, setOpen] = React.useState(false); @@ -21,7 +21,7 @@ const AddToQueue: React.FC = () => { Add to Queue - -} + ; +}; export default AddToQueue; \ No newline at end of file diff --git a/gui/react/src/components/AddToQueue/DownloadSelector/DownloadSelector.tsx b/gui/react/src/components/AddToQueue/DownloadSelector/DownloadSelector.tsx index ceed00c..489b8f1 100644 --- a/gui/react/src/components/AddToQueue/DownloadSelector/DownloadSelector.tsx +++ b/gui/react/src/components/AddToQueue/DownloadSelector/DownloadSelector.tsx @@ -1,11 +1,10 @@ -import React from "react"; -import { Backdrop, Box, Button, Checkbox, Chip, FormControl, FormControlLabel, IconButton, InputLabel, MenuItem, OutlinedInput, Select, TextField } from "@mui/material"; -import useStore from "../../../hooks/useStore"; -import MultiSelect from "../../reusable/MultiSelect"; -import { messageChannelContext } from "../../../provider/MessageChannel"; +import React from 'react'; +import { Box, Button, TextField } from '@mui/material'; +import useStore from '../../../hooks/useStore'; +import MultiSelect from '../../reusable/MultiSelect'; +import { messageChannelContext } from '../../../provider/MessageChannel'; import LoadingButton from '@mui/lab/LoadingButton'; -import { useSnackbar } from "notistack"; -import { Folder } from "@mui/icons-material"; +import { useSnackbar } from 'notistack'; type DownloadSelectorProps = { onFinish?: () => unknown @@ -48,22 +47,14 @@ const DownloadSelector: React.FC = ({ onFinish }) => { const addToQueue = async () => { setLoading(true); const res = await messageHandler?.resolveItems(store.downloadOptions); - if (!res || !res.isOk) { - console.error(res); - setLoading(false); + if (!res) return enqueueSnackbar('The request failed. Please check if the ID is correct.', { variant: 'error' }); - } else { - dispatch({ - type: 'queue', - payload: res.value - }); - } setLoading(false); if (onFinish) onFinish(); - } + }; const listEpisodes = async () => { if (!store.downloadOptions.id) { @@ -85,7 +76,7 @@ const DownloadSelector: React.FC = ({ onFinish }) => { }); } setLoading(false); - } + }; return @@ -93,7 +84,7 @@ const DownloadSelector: React.FC = ({ onFinish }) => { dispatch({ type: 'downloadOptions', payload: { ...store.downloadOptions, id: e.target.value } - }) + }); }} label='Item ID' /> { const parsed = parseInt(e.target.value); @@ -102,13 +93,13 @@ const DownloadSelector: React.FC = ({ onFinish }) => { dispatch({ type: 'downloadOptions', payload: { ...store.downloadOptions, q: parsed } - }) + }); }} label='Quality Level (0 for max)' /> { dispatch({ type: 'downloadOptions', payload: { ...store.downloadOptions, e: e.target.value } - }) + }); }} label='Episode Select' /> = ({ onFinish }) => { dispatch({ type: 'downloadOptions', payload: { ...store.downloadOptions, fileName: e.target.value } - }) + }); }} sx={{ width: '50%' }} label='Filename' /> @@ -149,7 +140,7 @@ const DownloadSelector: React.FC = ({ onFinish }) => { List episodes Add to Queue - + ; }; export default DownloadSelector; \ No newline at end of file diff --git a/gui/react/src/components/AddToQueue/DownloadSelector/Listing/EpisodeListing.tsx b/gui/react/src/components/AddToQueue/DownloadSelector/Listing/EpisodeListing.tsx index 0bbeeb2..98e75a6 100644 --- a/gui/react/src/components/AddToQueue/DownloadSelector/Listing/EpisodeListing.tsx +++ b/gui/react/src/components/AddToQueue/DownloadSelector/Listing/EpisodeListing.tsx @@ -1,7 +1,7 @@ -import { Box, List, ListItem, Typography, Divider, Dialog, Select, MenuItem, FormControl, InputLabel, Checkbox } from "@mui/material"; -import { CheckBox, CheckBoxOutlineBlank } from '@mui/icons-material' -import React from "react"; -import useStore from "../../../../hooks/useStore"; +import { Box, List, ListItem, Typography, Divider, Dialog, Select, MenuItem, FormControl, InputLabel, Checkbox } from '@mui/material'; +import { CheckBox, CheckBoxOutlineBlank } from '@mui/icons-material'; +import React from 'react'; +import useStore from '../../../../hooks/useStore'; const EpisodeListing: React.FC = () => { @@ -17,13 +17,13 @@ const EpisodeListing: React.FC = () => { s.push(season); } return s; - }, [ store.episodeListing ]) + }, [ store.episodeListing ]); const [selected, setSelected] = React.useState([]); React.useEffect(() => { setSelected(parseSelect(store.downloadOptions.e)); - }, [ store.episodeListing ]) + }, [ store.episodeListing ]); const close = () => { dispatch({ @@ -36,96 +36,96 @@ const EpisodeListing: React.FC = () => { ...store.downloadOptions, e: `${([...new Set([...parseSelect(store.downloadOptions.e), ...selected])]).join(',')}` } - }) - } + }); + }; return 0} onClose={close} scroll='paper' maxWidth='xl' sx={{ p: 2 }}> - - + + Episodes - - - Season - - - - - - selected.includes(a.e)) && !store.episodeListing.every(a => selected.includes(a.e))} - checked={store.episodeListing.every(a => selected.includes(a.e))} - onChange={() => { - if (selected.length > 0) { - setSelected([]); - } else { - setSelected(store.episodeListing.map(a => a.e)); - } - }} - /> - - {store.episodeListing.filter((a) => season === 'all' ? true : a.season === season).map((item, index, { length }) => { - const e = isNaN(parseInt(item.e)) ? item.e : parseInt(item.e); - const isSelected = selected.includes(e.toString()); - return { - let arr: string[] = []; - if (isSelected) { - arr = [...selected.filter(a => a !== e.toString())]; - } else { - arr = [...selected, e.toString()]; - } - setSelected(arr.filter(a => a.length > 0)); - }}> - - { isSelected ? : } - - {e} - - - - - - {item.name} - - - {item.time.startsWith('00:') ? item.time.slice(3) : item.time} - - - - {item.description} + + + Season + + + + + + selected.includes(a.e)) && !store.episodeListing.every(a => selected.includes(a.e))} + checked={store.episodeListing.every(a => selected.includes(a.e))} + onChange={() => { + if (selected.length > 0) { + setSelected([]); + } else { + setSelected(store.episodeListing.map(a => a.e)); + } + }} + /> + + {store.episodeListing.filter((a) => season === 'all' ? true : a.season === season).map((item, index, { length }) => { + const e = isNaN(parseInt(item.e)) ? item.e : parseInt(item.e); + const isSelected = selected.includes(e.toString()); + return { + let arr: string[] = []; + if (isSelected) { + arr = [...selected.filter(a => a !== e.toString())]; + } else { + arr = [...selected, e.toString()]; + } + setSelected(arr.filter(a => a.length > 0)); + }}> + + { isSelected ? : } + + {e} + + thumbnail + + + + {item.name} + + + {item.time.startsWith('00:') ? item.time.slice(3) : item.time} - - -
- Available audio languages: {item.lang.join(', ')} -
-
-
- {index < length - 1 && } -
- })} -
-
-} + + {item.description} + + + +
+ Available audio languages: {item.lang.join(', ')} +
+
+ + + {index < length - 1 && } + ; + })} + + ; +}; const parseSelect = (s: string): string[] => { const ret: string[] = []; s.split(',').forEach(item => { if (item.includes('-')) { - let split = item.split('-'); + const split = item.split('-'); if (split.length !== 2) return; const match = split[0].match(/[A-Za-z]+/); @@ -156,8 +156,8 @@ const parseSelect = (s: string): string[] => { } else { ret.push(item); } - }) + }); return [...new Set(ret)]; -} +}; export default EpisodeListing; \ No newline at end of file diff --git a/gui/react/src/components/AddToQueue/SearchBox/SearchBox.tsx b/gui/react/src/components/AddToQueue/SearchBox/SearchBox.tsx index 4d00963..f33995b 100644 --- a/gui/react/src/components/AddToQueue/SearchBox/SearchBox.tsx +++ b/gui/react/src/components/AddToQueue/SearchBox/SearchBox.tsx @@ -1,11 +1,11 @@ -import React from "react"; -import { Box, ClickAwayListener, Divider, List, ListItem, Paper, TextField, Typography } from "@mui/material"; -import { SearchResponse } from "../../../../../../@types/messageHandler"; -import useStore from "../../../hooks/useStore"; -import { messageChannelContext } from "../../../provider/MessageChannel"; +import React from 'react'; +import { Box, ClickAwayListener, Divider, List, ListItem, Paper, TextField, Typography } from '@mui/material'; +import { SearchResponse } from '../../../../../../@types/messageHandler'; +import useStore from '../../../hooks/useStore'; +import { messageChannelContext } from '../../../provider/MessageChannel'; import './SearchBox.css'; -import ContextMenu from "../../reusable/ContextMenu"; -import { useSnackbar } from "notistack"; +import ContextMenu from '../../reusable/ContextMenu'; +import { useSnackbar } from 'notistack'; const SearchBox: React.FC = () => { const messageHandler = React.useContext(messageChannelContext); @@ -52,13 +52,13 @@ const SearchBox: React.FC = () => { searchResult.value.map((a, ind, arr) => { const imageRef = React.createRef(); return - { + { selectItem(a.id); setFocus(false); }}> - + thumbnail @@ -83,13 +83,13 @@ const SearchBox: React.FC = () => { }); }} ]} popupItem={imageRef} /> {(ind < arr.length - 1) && } - + ; }) - : <>} + : <>} } - -} + ; +}; export default SearchBox; \ No newline at end of file diff --git a/gui/react/src/components/AuthButton.tsx b/gui/react/src/components/AuthButton.tsx index 4673e94..8f5d273 100644 --- a/gui/react/src/components/AuthButton.tsx +++ b/gui/react/src/components/AuthButton.tsx @@ -1,9 +1,9 @@ -import { Button, CircularProgress, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, TextField } from "@mui/material"; -import { Check, Close } from '@mui/icons-material' -import React from "react"; -import { messageChannelContext } from "../provider/MessageChannel"; -import Require from "./Require"; -import { useSnackbar } from "notistack"; +import { Button, CircularProgress, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, TextField } from '@mui/material'; +import { Check, Close } from '@mui/icons-material'; +import React from 'react'; +import { messageChannelContext } from '../provider/MessageChannel'; +import Require from './Require'; +import { useSnackbar } from 'notistack'; const AuthButton: React.FC = () => { const snackbar = useSnackbar(); @@ -24,9 +24,9 @@ const AuthButton: React.FC = () => { const checkAuth = async () => { setAuthed((await messageChannel?.checkToken())?.isOk ?? false); - } + }; - React.useEffect(() => { checkAuth() }, []); + React.useEffect(() => { checkAuth(); }, []); const handleSubmit = async () => { if (!messageChannel) @@ -52,7 +52,7 @@ const AuthButton: React.FC = () => { } await checkAuth(); setLoading(false); - } + }; return @@ -106,7 +106,7 @@ const AuthButton: React.FC = () => { - -} + ; +}; export default AuthButton; \ No newline at end of file diff --git a/gui/react/src/components/LogoutButton.tsx b/gui/react/src/components/LogoutButton.tsx index e70120d..c324dda 100644 --- a/gui/react/src/components/LogoutButton.tsx +++ b/gui/react/src/components/LogoutButton.tsx @@ -1,25 +1,25 @@ -import { ExitToApp } from "@mui/icons-material"; -import { Button } from "@mui/material"; -import React from "react"; -import useStore from "../hooks/useStore"; -import { messageChannelContext } from "../provider/MessageChannel"; -import Require from "./Require"; +import { ExitToApp } from '@mui/icons-material'; +import { Button } from '@mui/material'; +import React from 'react'; +import useStore from '../hooks/useStore'; +import { messageChannelContext } from '../provider/MessageChannel'; +import Require from './Require'; 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 - }) + }); else alert('Unable to change service'); - } + }; return - + ; -} +}; export default LogoutButton; \ No newline at end of file diff --git a/gui/react/src/components/MainFrame/DownloadManager/DownloadManager.tsx b/gui/react/src/components/MainFrame/DownloadManager/DownloadManager.tsx index 6e8b9de..7917707 100644 --- a/gui/react/src/components/MainFrame/DownloadManager/DownloadManager.tsx +++ b/gui/react/src/components/MainFrame/DownloadManager/DownloadManager.tsx @@ -1,48 +1,40 @@ -import React from "react"; -import { ExtendedProgress } from "../../../../../../@types/messageHandler"; -import { RandomEvent } from "../../../../../../@types/randomEvents"; -import useStore from "../../../hooks/useStore"; -import { messageChannelContext } from "../../../provider/MessageChannel"; +import React from 'react'; +import { ExtendedProgress, QueueItem } from '../../../../../../@types/messageHandler'; +import { RandomEvent } from '../../../../../../@types/randomEvents'; +import { messageChannelContext } from '../../../provider/MessageChannel'; const useDownloadManager = () => { - const [ { currentDownload }, dispatch ] = useStore(); const messageHandler = React.useContext(messageChannelContext); const [progressData, setProgressData] = React.useState(); + const [current, setCurrent] = React.useState(); React.useEffect(() => { const handler = (ev: RandomEvent<'progress'>) => { console.log(ev.data); setProgressData(ev.data); - } - messageHandler?.randomEvents.on('progress', handler); + }; + const currentHandler = (ev: RandomEvent<'current'>) => { + setCurrent(ev.data); + }; + const finishHandler = () => { setProgressData(undefined); - dispatch({ - type: 'finish', - payload: undefined - }) - } + }; + messageHandler?.randomEvents.on('progress', handler); + messageHandler?.randomEvents.on('current', currentHandler); messageHandler?.randomEvents.on('finish', finishHandler); + return () => { messageHandler?.randomEvents.removeListener('progress', handler); - messageHandler?.randomEvents.removeListener('finish', finishHandler) + messageHandler?.randomEvents.removeListener('finish', finishHandler); + messageHandler?.randomEvents.removeListener('current', currentHandler); }; - }, [messageHandler, dispatch]); - - React.useEffect(() => { - if (!currentDownload) - return; - if (messageHandler?.isDownloading()) - return; - console.log('start download'); - messageHandler?.downloadItem(currentDownload); - }, [currentDownload, messageHandler]); + }, [messageHandler]); - - return progressData; -} + return { data: progressData, current}; +}; export default useDownloadManager; \ No newline at end of file diff --git a/gui/react/src/components/MainFrame/MainFrame.tsx b/gui/react/src/components/MainFrame/MainFrame.tsx index 9e72789..de4db33 100644 --- a/gui/react/src/components/MainFrame/MainFrame.tsx +++ b/gui/react/src/components/MainFrame/MainFrame.tsx @@ -1,12 +1,12 @@ -import { Box } from "@mui/material"; -import React from "react"; +import { Box } from '@mui/material'; +import React from 'react'; import './MainFrame.css'; -import Queue from "./Queue/Queue"; +import Queue from './Queue/Queue'; const MainFrame: React.FC = () => { return - -} + ; +}; export default MainFrame; \ No newline at end of file diff --git a/gui/react/src/components/MainFrame/Queue/Queue.tsx b/gui/react/src/components/MainFrame/Queue/Queue.tsx index 57d326b..5a79c9e 100644 --- a/gui/react/src/components/MainFrame/Queue/Queue.tsx +++ b/gui/react/src/components/MainFrame/Queue/Queue.tsx @@ -1,16 +1,23 @@ -import { Box, Button, Divider, LinearProgress, Skeleton, Typography } from "@mui/material"; -import React from "react"; -import useStore from "../../../hooks/useStore"; +import { Box, Button, CircularProgress, Divider, LinearProgress, Skeleton, Typography } from '@mui/material'; +import React from 'react'; +import { messageChannelContext } from '../../../provider/MessageChannel'; +import { queueContext } from '../../../provider/QueueProvider'; -import useDownloadManager from "../DownloadManager/DownloadManager"; +import useDownloadManager from '../DownloadManager/DownloadManager'; const Queue: React.FC = () => { - const data = useDownloadManager(); - const [{ queue, currentDownload }, dispatch] = useStore(); + const { data, current } = useDownloadManager(); + const queue = React.useContext(queueContext); + const msg = React.useContext(messageChannelContext); + + + if (!msg) + return <>Never; + return data || queue.length > 0 ? <> {data && <> - Thumbnail + Thumbnail @@ -36,27 +43,27 @@ const Queue: React.FC = () => { } { - !data && currentDownload && <> + current && !data && <> - Thumbnail + Thumbnail - {currentDownload.title} + {current.title} - Languages: {currentDownload.dubLang} + Language: - {currentDownload.parent.title} + {current.parent.title} - Waiting for download to start + 0 / ? parts (0% | X:XX | 0 MB/s | 0MB) @@ -67,7 +74,7 @@ const Queue: React.FC = () => { {queue.map((queueItem, index, { length }) => { return - Thumbnail + Thumbnail @@ -87,15 +94,7 @@ const Queue: React.FC = () => { Quality: {queueItem.q} @@ -115,8 +114,8 @@ const Queue: React.FC = () => { - -} + ; +}; const formatTime = (time: number) => { time = Math.floor(time / 1000); @@ -124,6 +123,6 @@ const formatTime = (time: number) => { time = time % 60; return `${minutes.toFixed(0).length < 2 ? `0${minutes}` : minutes}m${time.toFixed(0).length < 2 ? `0${time}` : time}s`; -} +}; export default Queue; \ No newline at end of file diff --git a/gui/react/src/components/MenuBar/MenuBar.tsx b/gui/react/src/components/MenuBar/MenuBar.tsx new file mode 100644 index 0000000..4675ad3 --- /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/Require.tsx b/gui/react/src/components/Require.tsx index 931b439..847541f 100644 --- a/gui/react/src/components/Require.tsx +++ b/gui/react/src/components/Require.tsx @@ -1,5 +1,5 @@ -import React from "react"; -import { Box, Backdrop, CircularProgress } from "@mui/material"; +import React from 'react'; +import { Box, Backdrop, CircularProgress } from '@mui/material'; export type RequireType = { value?: T @@ -8,7 +8,7 @@ export type RequireType = { const Require = (props: React.PropsWithChildren>) => { return props.value === undefined ? - : {props.children} -} + : {props.children}; +}; export default Require; \ No newline at end of file diff --git a/gui/react/src/components/StartQueue.tsx b/gui/react/src/components/StartQueue.tsx index 51adde7..ecab378 100644 --- a/gui/react/src/components/StartQueue.tsx +++ b/gui/react/src/components/StartQueue.tsx @@ -1,35 +1,41 @@ -import { ExitToApp, PauseCircleFilled, PlayCircleFilled } from "@mui/icons-material"; -import { Button } from "@mui/material"; -import React from "react"; -import useStore from "../hooks/useStore"; -import { messageChannelContext } from "../provider/MessageChannel"; -import Require from "./Require"; +import { PauseCircleFilled, PlayCircleFilled } from '@mui/icons-material'; +import { Button } from '@mui/material'; +import React from 'react'; +import { messageChannelContext } from '../provider/MessageChannel'; +import Require from './Require'; const StartQueueButton: React.FC = () => { const messageChannel = React.useContext(messageChannelContext); - const [store, dispatch] = useStore(); + const [start, setStart] = React.useState(false); + const msg = React.useContext(messageChannelContext); - const change = () => { - if (messageChannel?.isDownloading() && store.downloadQueue) - alert("The current download will be finished before the queue stops") - dispatch({ - type: 'downloadQueue', - payload: !store.downloadQueue - }) - } + React.useEffect(() => { + (async () => { + if (!msg) + return alert('Invalid state: msg not found'); + setStart(await msg.getDownloadQueue()); + })(); + }, []); + + const change = async () => { + if (await messageChannel?.isDownloading()) + alert('The current download will be finished before the queue stops'); + msg?.setDownloadQueue(!start); + setStart(!start); + }; return - + ; -} +}; export default StartQueueButton; \ No newline at end of file diff --git a/gui/react/src/components/reusable/ContextMenu.tsx b/gui/react/src/components/reusable/ContextMenu.tsx index d9252a5..12ebc96 100644 --- a/gui/react/src/components/reusable/ContextMenu.tsx +++ b/gui/react/src/components/reusable/ContextMenu.tsx @@ -1,6 +1,5 @@ -import { StyledOptions } from "@emotion/styled"; -import { Box, Button, Card, Divider, List, Typography, SxProps } from "@mui/material"; -import React from "react"; +import { Box, Button, Divider, List, SxProps } from '@mui/material'; +import React from 'react'; export type Option = { text: string, @@ -35,32 +34,32 @@ function ContextMenu(props: ContextMenuProps) { ev.preventDefault(); setAnchor({ x: ev.x + 10, y: ev.y + 10 }); setShow(true); - } + }; ref.current.addEventListener('contextmenu', listener); return () => { if (ref.current) - ref.current.removeEventListener('contextmenu', listener) + ref.current.removeEventListener('contextmenu', listener); }; - }, [ props.popupItem ]) + }, [ props.popupItem ]); return show ? {props.options.map((item, i) => { return item === 'divider' ? : - + ; })} - : <> + : <>; } export default ContextMenu; \ No newline at end of file diff --git a/gui/react/src/components/reusable/LinearProgressWithLabel.tsx b/gui/react/src/components/reusable/LinearProgressWithLabel.tsx index ad0d434..28ac451 100644 --- a/gui/react/src/components/reusable/LinearProgressWithLabel.tsx +++ b/gui/react/src/components/reusable/LinearProgressWithLabel.tsx @@ -19,6 +19,6 @@ const LinearProgressWithLabel: React.FC = (props) ); -} +}; export default LinearProgressWithLabel; \ No newline at end of file diff --git a/gui/react/src/components/reusable/MultiSelect.tsx b/gui/react/src/components/reusable/MultiSelect.tsx index 233aa03..2bcd527 100644 --- a/gui/react/src/components/reusable/MultiSelect.tsx +++ b/gui/react/src/components/reusable/MultiSelect.tsx @@ -1,5 +1,5 @@ -import React from "react"; -import { Box, Chip, FormControl, InputLabel, MenuItem, OutlinedInput, Select, Theme, useTheme } from "@mui/material"; +import React from 'react'; +import { FormControl, InputLabel, MenuItem, OutlinedInput, Select, Theme, useTheme } from '@mui/material'; export type MultiSelectProps = { values: string[], @@ -41,7 +41,7 @@ const MultiSelect: React.FC = (props) => { multiple value={(props.selected ?? [])} onChange={e => { - const val = typeof e.target.value === "string" ? e.target.value.split(",") : e.target.value; + const val = typeof e.target.value === 'string' ? e.target.value.split(',') : e.target.value; if (props.allOption && val.includes('all')) { if (props.values.length === val.length - 1) props.onChange([]); @@ -68,7 +68,7 @@ const MultiSelect: React.FC = (props) => { ))} - -} + ; +}; export default MultiSelect; \ No newline at end of file diff --git a/gui/react/src/hooks/useStore.tsx b/gui/react/src/hooks/useStore.tsx index 77d55bd..9d9b302 100644 --- a/gui/react/src/hooks/useStore.tsx +++ b/gui/react/src/hooks/useStore.tsx @@ -1,5 +1,5 @@ -import React from "react"; -import { StoreAction, StoreContext, StoreState } from "../provider/Store"; +import React from 'react'; +import { StoreAction, StoreContext, StoreState } from '../provider/Store'; const useStore = () => { const context = React.useContext(StoreContext as unknown as React.Context<[StoreState, React.Dispatch>]>); @@ -7,6 +7,6 @@ const useStore = () => { throw new Error('useStore must be used under Store'); } return context; -} +}; export default useStore; \ No newline at end of file diff --git a/gui/react/src/index.tsx b/gui/react/src/index.tsx index 65918da..c1e1261 100644 --- a/gui/react/src/index.tsx +++ b/gui/react/src/index.tsx @@ -4,11 +4,12 @@ import App from './App'; import ServiceProvider from './provider/ServiceProvider'; import Style from './Style'; import MessageChannel from './provider/MessageChannel'; -import { IconButton } from "@mui/material"; -import { CloseOutlined } from "@mui/icons-material"; +import { IconButton } from '@mui/material'; +import { CloseOutlined } from '@mui/icons-material'; import { SnackbarProvider, SnackbarKey } from 'notistack'; import Store from './provider/Store'; import ErrorHandler from './provider/ErrorHandler'; +import QueueProvider from './provider/QueueProvider'; const notistackRef = React.createRef(); const onClickDismiss = (key: SnackbarKey | undefined) => () => { @@ -17,28 +18,28 @@ const onClickDismiss = (key: SnackbarKey | undefined) => () => { }; const container = document.getElementById('root'); -const root = createRoot(container!); +const root = createRoot(container as HTMLElement); root.render( - - - - ( - - - - )} - > - - - - - + + + + + + + ); \ No newline at end of file diff --git a/gui/react/src/provider/ErrorHandler.tsx b/gui/react/src/provider/ErrorHandler.tsx index 02ddc68..9506b6c 100644 --- a/gui/react/src/provider/ErrorHandler.tsx +++ b/gui/react/src/provider/ErrorHandler.tsx @@ -1,5 +1,5 @@ -import { Backdrop, Box, Typography } from "@mui/material"; -import React from "react"; +import { Box, Typography } from '@mui/material'; +import React from 'react'; export default class ErrorHandler extends React.Component<{ children: React.ReactNode|React.ReactNode[] @@ -14,26 +14,26 @@ export default class ErrorHandler extends React.Component<{ children: React.ReactNode|React.ReactNode[] }) { super(props); - this.state = { error: undefined } + this.state = { error: undefined }; } componentDidCatch(er: Error, stack: React.ErrorInfo) { - this.setState({ error: { er, stack } }) + this.setState({ error: { er, stack } }); } render(): React.ReactNode { return this.state.error ? - - - {`${this.state.error.er.name}: ${this.state.error.er.message}`} -
- {this.state.error.stack.componentStack.split('\n').map(a => { - return <> - {a} -
- - })} -
-
: this.props.children; + + + {`${this.state.error.er.name}: ${this.state.error.er.message}`} +
+ {this.state.error.stack.componentStack.split('\n').map(a => { + return <> + {a} +
+ ; + })} +
+
: this.props.children; } } \ No newline at end of file diff --git a/gui/react/src/provider/MessageChannel.tsx b/gui/react/src/provider/MessageChannel.tsx index 5f84714..13447e1 100644 --- a/gui/react/src/provider/MessageChannel.tsx +++ b/gui/react/src/provider/MessageChannel.tsx @@ -1,20 +1,24 @@ import React from 'react'; -import type { MessageHandler } from '../../../../@types/messageHandler'; -import type { IpcRenderer, IpcRendererEvent } from "electron"; +import { MessageHandler } 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 { Avatar, Box, Button, TextField, Typography } from '@mui/material'; +import { v4 } from 'uuid'; +import { useSnackbar } from 'notistack'; +import { LockOutlined, PowerSettingsNew } from '@mui/icons-material'; +import { GUIConfig } from '../../../../modules/module.cfg-loader'; - -export type FrontEndMessanges = (MessageHandler & { randomEvents: RandomEventHandler, logout: () => boolean }); +export type FrontEndMessanges = (MessageHandler & { randomEvents: RandomEventHandler, logout: () => Promise }); export class RandomEventHandler { private handler: { [eventName in keyof RandomEvents]: Handler[] } = { progress: [], - finish: [] + finish: [], + queueChange: [], + current: [] }; public on(name: T, listener: Handler) { @@ -36,54 +40,200 @@ 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(); + const [publicWS, setPublicWS] = React.useState(); + const [usePassword, setUsePassword] = React.useState<'waiting'|'yes'|'no'>('waiting'); + const [isSetuped, setIsSetuped] = React.useState<'waiting'|'yes'|'no'>('waiting'); + + const { enqueueSnackbar } = useSnackbar(); + + React.useEffect(() => { + const wss = new WebSocket(`ws://${process.env.NODE_ENV === 'development' ? 'localhost:3000' : window.location.host}/public`); + wss.addEventListener('open', () => { + setPublicWS(wss); + }); + wss.addEventListener('error', () => { + enqueueSnackbar('Unable to connect to server. Please reload the page to try again.', { variant: 'error' }); + }); + }, []); + + React.useEffect(() => { + (async () => { + if (!publicWS) + return; + setUsePassword((await messageAndResponse(publicWS, { name: 'requirePassword', data: undefined })).data ? 'yes' : 'no'); + setIsSetuped((await messageAndResponse(publicWS, { name: 'setuped', data: undefined })).data ? 'yes' : 'no'); + })(); + }, [publicWS]); + + const connect = (ev?: React.FormEvent) => { + let search = new URLSearchParams(); + if (ev) { + ev.preventDefault(); + const formData = new FormData(ev.currentTarget); + const password = formData.get('password')?.toString(); + if (!password) + return enqueueSnackbar('Please provide both a username and password', { + variant: 'error' + }); + search = new URLSearchParams({ + password + }); + } + + const wws = new WebSocket(`ws://${process.env.NODE_ENV === 'development' ? 'localhost:3000' : window.location.host}/ws?${search}`, ); + wws.addEventListener('open', () => { + console.log('[INFO] [WS] Connected'); + setSocket(wws); + }); + wws.addEventListener('error', (er) => { + console.error('[ERROR] [WS]', er); + enqueueSnackbar('Unable to connect to server. Please check the password and try again.', { + variant: 'error' + }); + }); + }; + + const setup = async (ev: React.FormEvent) => { + ev.preventDefault(); + if (!socket) + return enqueueSnackbar('Invalid state: socket not found', { variant: 'error' }); + const formData = new FormData(ev.currentTarget); + const password = formData.get('password'); + const data = { + port: parseInt(formData.get('port')?.toString() ?? '') ?? 3000, + password: password ? password.toString() : undefined + } as GUIConfig; + await messageAndResponse(socket, { name: 'setupServer', data }); + enqueueSnackbar(`The following settings have been set: Port=${data.port}, Password=${data.password ?? 'noPasswordRequired'}`, { + variant: 'success', + persist: true + }); + enqueueSnackbar('Please restart the server now.', { + variant: 'info', + persist: true + }); + }; - 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); - return () => { - ipcRenderer.removeListener('randomEvent', listener); }; - }, [ ipcRenderer ]); + socket.addEventListener('message', listener); + return () => { + socket.removeEventListener('message', listener); + }; + }, [ socket ]); + if (usePassword === 'waiting') + return <>; + + if (socket === undefined) { + if (usePassword === 'no') { + connect(undefined); + return <>; + } + return + + + + + Login + + + + + + You need to login in order to use this tool. + + + ; + } + + if (isSetuped === 'no') { + return + + + + + Confirm + + + + + + + Please enter data that will be set to use this tool. +
+ Leave blank to use no password (NOT RECOMMENDED)! +
+
+
; + } 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 }), + getQueue: async () => (await messageAndResponse(socket, { name: 'getQueue', data: undefined })).data, + removeFromQueue: async (data) => await messageAndResponse(socket, { name: 'removeFromQueue', data }), + clearQueue: async () => await messageAndResponse(socket, { name: 'clearQueue', data: undefined }), + setDownloadQueue: async (data) => await messageAndResponse(socket, { name: 'setDownloadQueue', data }), + getDownloadQueue: async () => (await messageAndResponse(socket, { name: 'getDownloadQueue', data: undefined })).data, + }; return {children} diff --git a/gui/react/src/provider/QueueProvider.tsx b/gui/react/src/provider/QueueProvider.tsx new file mode 100644 index 0000000..dc31db9 --- /dev/null +++ b/gui/react/src/provider/QueueProvider.tsx @@ -0,0 +1,35 @@ +import React from 'react'; +import { QueueItem } from '../../../../@types/messageHandler'; +import { messageChannelContext } from './MessageChannel'; +import { RandomEvent } from '../../../../@types/randomEvents'; + +export const queueContext = React.createContext([]); + +const QueueProvider: FCWithChildren = ({ children }) => { + const msg = React.useContext(messageChannelContext); + + const [ready, setReady] = React.useState(false); + const [queue, setQueue] = React.useState([]); + + React.useEffect(() => { + if (msg && !ready) { + msg.getQueue().then(data => { + setQueue(data); + setReady(true); + }); + } + const listener = (ev: RandomEvent<'queueChange'>) => { + setQueue(ev.data); + }; + msg?.randomEvents.on('queueChange', listener); + return () => { + msg?.randomEvents.removeListener('queueChange', listener); + }; + }, [ msg ]); + + return + {children} + ; +}; + +export default QueueProvider; \ No newline at end of file diff --git a/gui/react/src/provider/ServiceProvider.tsx b/gui/react/src/provider/ServiceProvider.tsx index 2e7fcc8..f1af94c 100644 --- a/gui/react/src/provider/ServiceProvider.tsx +++ b/gui/react/src/provider/ServiceProvider.tsx @@ -15,7 +15,7 @@ const ServiceProvider: FCWithChildren = ({ children }) => { type: 'service', payload: s }); - } + }; return service === undefined ? diff --git a/gui/react/src/provider/Store.tsx b/gui/react/src/provider/Store.tsx index 300f651..bfe0eda 100644 --- a/gui/react/src/provider/Store.tsx +++ b/gui/react/src/provider/Store.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Episode, QueueItem } from '../../../../@types/messageHandler'; +import { Episode } from '../../../../@types/messageHandler'; import { dubLanguageCodes } from '../../../../modules/module.langsData'; export type DownloadOptions = { @@ -17,13 +17,9 @@ export type DownloadOptions = { } export type StoreState = { - downloadQueue: boolean, - queue: QueueItem[], episodeListing: Episode[]; downloadOptions: DownloadOptions, service: 'crunchy'|'funi'|undefined, - currentDownload?: QueueItem, - finish?: undefined } export type StoreAction = { @@ -34,36 +30,12 @@ export type StoreAction = { const Reducer = (state: StoreState, action: StoreAction): StoreState => { switch(action.type) { - case "queue": - state.queue = action.extraInfo?.force ? action.payload as QueueItem[] : state.queue.concat(action.payload as QueueItem[]); - if (state.currentDownload === undefined && state.queue.length > 0 && state.downloadQueue) { - state.currentDownload = state.queue[0]; - state.queue = state.queue.slice(1); - } - return { ...state }; - case "finish": - if (state.queue.length > 0 && state.downloadQueue) { - state.currentDownload = state.queue[0]; - state.queue = state.queue.slice(1); - } else { - state.currentDownload = undefined; - } - return { ...state } - case 'downloadQueue': - state.downloadQueue = action.payload as boolean; - if (state.queue.length > 0 && state.downloadQueue && state.currentDownload === undefined) { - state.currentDownload = state.queue[0]; - state.queue = state.queue.slice(1); - } - return {...state} - default: - return { ...state, [action.type]: action.payload } + default: + return { ...state, [action.type]: action.payload }; } }; const initialState: StoreState = { - downloadQueue: false, - queue: [], downloadOptions: { id: '', q: 0, @@ -110,5 +82,5 @@ const Store: FCWithChildren = ({children}) => { }; /* Importent Notice -- The 'queue' generic will be overriden */ -export const StoreContext = React.createContext<[StoreState, React.Dispatch>]>([initialState, undefined as any]); +export const StoreContext = React.createContext<[StoreState, React.Dispatch>]>([initialState, undefined as any]); export default Store; \ No newline at end of file diff --git a/gui/server/index.ts b/gui/server/index.ts new file mode 100644 index 0000000..2f29549 --- /dev/null +++ b/gui/server/index.ts @@ -0,0 +1,31 @@ +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'; +import { PublicWebSocket } from './websocket'; +import { console } from '../../modules/log'; + +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.info(`GUI server started on port ${cfg.gui.port}`); +}); + +new PublicWebSocket(server); +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..dcbd9b0 --- /dev/null +++ b/gui/server/serviceHandler.ts @@ -0,0 +1,126 @@ +import { ServerResponse } from 'http'; +import { Server } from 'http'; +import { IncomingMessage } from 'http'; +import { MessageHandler } from '../../@types/messageHandler'; +import Funi from '../../funi'; +import { setSetuped, writeYamlCfgFile } from '../../modules/module.cfg-loader'; +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('setupServer', ({ data }, respond) => { + writeYamlCfgFile('gui', data); + setSetuped(true); + respond(true); + process.exit(0); + }); + + 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(false); + 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('getQueue', async (_, respond) => { + respond(await this.service?.getQueue() ?? []); + }); + this.ws.events.on('removeFromQueue', async ({ data }, respond) => { + this.service?.removeFromQueue(data); + respond(undefined); + }); + this.ws.events.on('clearQueue', async (_, respond) => { + this.service?.clearQueue(); + respond(undefined); + }); + this.ws.events.on('setDownloadQueue', async ({ data }, respond) => { + this.service?.setDownloadQueue(data); + respond(undefined); + }); + this.ws.events.on('getDownloadQueue', async (_, respond) => { + respond(await this.service?.getDownloadQueue() ?? false); + }); + this.ws.events.on('isDownloading', async (_, respond) => respond(await this.service?.isDownloading() ?? false)); + } + +} \ 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..0623b18 --- /dev/null +++ b/gui/server/services/base.ts @@ -0,0 +1,130 @@ +import { DownloadInfo, FolderTypes, ProgressData, QueueItem } 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'; +import { console } from '../../../modules/log'; + +export default class Base { + + constructor(private ws: WebSocketHandler) {} + + private downloading = false; + + private queue: QueueItem[] = []; + private workOnQueue = false; + + setDownloading(downloading: boolean) { + this.downloading = downloading; + } + + getDownloading() { + return this.downloading; + } + + alertError(error: Error) { + console.error(`${error}`); + } + + makeProgressHandler(videoInfo: DownloadInfo) { + return ((data: ProgressData) => { + this.sendMessage({ + name: 'progress', + data: { + downloadInfo: videoInfo, + progress: data + } + }); + }); + } + + 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); + } + + public async getQueue(): Promise { + return this.queue; + } + + public async removeFromQueue(index: number) { + this.queue.splice(index, 1); + this.queueChange(); + } + + public async clearQueue() { + this.queue = []; + this.queueChange(); + } + + public addToQueue(data: QueueItem[]) { + this.queue = this.queue.concat(...data); + this.queueChange(); + } + + public setDownloadQueue(data: boolean) { + this.workOnQueue = data; + this.queueChange(); + } + + public async getDownloadQueue(): Promise { + return this.workOnQueue; + } + + private async queueChange() { + this.sendMessage({ name: 'queueChange', data: this.queue }); + if (this.workOnQueue && this.queue.length > 0 && !await this.isDownloading()) { + this.setDownloading(true); + this.sendMessage({ name: 'current', data: this.queue[0] }); + this.downloadItem(this.queue[0]); + this.queue = this.queue.slice(1); + this.queueChange(); + } + } + + public async onFinish() { + this.sendMessage({ name: 'current', data: undefined }); + this.queueChange(); + } + + //Overriten + // eslint-disable-next-line + public async downloadItem(_: QueueItem) { + throw new Error('downloadItem not overriden'); + } +} \ No newline at end of file diff --git a/gui/electron/src/serviceHandler/crunchyroll.ts b/gui/server/services/crunchyroll.ts similarity index 73% rename from gui/electron/src/serviceHandler/crunchyroll.ts rename to gui/server/services/crunchyroll.ts index ddfa3dd..7ef8bc7 100644 --- a/gui/electron/src/serviceHandler/crunchyroll.ts +++ b/gui/server/services/crunchyroll.ts @@ -1,110 +1,114 @@ -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, ResolveItemsData, 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'; +import { console } from '../../../modules/log'; + +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.debug(`Got resolve options: ${JSON.stringify(data)}`); + const res = await this.crunchy.downloadFromSeriesID(data.id, data); + if (!res.isOk) + return res.isOk; + this.addToQueue(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 + }; + })); + return true; + } + + public async search(data: SearchData): Promise { + await this.crunchy.refreshToken(true); + console.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.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); + this.onFinish(); + } +} + 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 72% rename from gui/electron/src/serviceHandler/funimation.ts rename to gui/server/services/funimation.ts index 18fc70e..38023c5 100644 --- a/gui/electron/src/serviceHandler/funimation.ts +++ b/gui/server/services/funimation.ts @@ -1,115 +1,118 @@ -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, EpisodeListResponse, MessageHandler, QueueItem, ResolveItemsData, 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'; +import { console } from '../../../modules/log'; + +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.debug(`Got resolve options: ${JSON.stringify(data)}`); + const res = await this.funi.getShow(false, { ...data, id: parseInt(data.id) }); + if (!res.isOk) + return res.isOk; + this.addToQueue(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, + }; + })); + return true; + } + + public async search(data: SearchData): Promise { + console.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: QueueItem) { + this.setDownloading(true); + console.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); + this.onFinish(); + } +} + 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..061c5d3 --- /dev/null +++ b/gui/server/websocket.ts @@ -0,0 +1,122 @@ +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 '.'; +import { isSetuped } from '../../modules/module.cfg-loader'; +import { console } from '../../modules/log'; + +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.info(`[WS] Connection from '${req.socket.remoteAddress}'`); + socket.on('error', (er) => console.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.error(`[WS] ${er}`); + }); + }); + }); + }); + }); + + server.on('upgrade', (request, socket, head) => { + if (!this.wsServer.shouldHandle(request)) + return; + if (!this.authenticate(request)) { + socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n'); + socket.destroy(); + console.info(`[WS] ${request.socket.remoteAddress} tried to connect but used a wrong password.`); + 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.error(`[WS] ${er}`); + }); + }); + } + + private authenticate(request: IncomingMessage): boolean { + const search = new URL(`http://${request.headers.host}${request.url}`).searchParams; + return cfg.gui.password === (search.get('password') ?? undefined); + } + +} + +export class PublicWebSocket { + private wsServer: ws.Server; + + constructor(server: Server) { + this.wsServer = new ws.WebSocketServer({ noServer: true, path: '/public' }); + + this.wsServer.on('connection', (socket, req) => { + console.info(`[WS] Connection to public ws from '${req.socket.remoteAddress}'`); + socket.on('error', (er) => console.error(`[WS] ${er}`)); + socket.on('message', (msg) => { + const data = JSON.parse(msg.toString()) as UnknownWSMessage; + switch (data.name) { + case 'setuped': + this.send(socket, data.id, data.name, isSetuped()); + break; + case 'requirePassword': + this.send(socket, data.id, data.name, cfg.gui.password !== undefined); + break; + } + }); + }); + + server.on('upgrade', (request, socket, head) => { + if (!this.wsServer.shouldHandle(request)) + return; + this.wsServer.handleUpgrade(request, socket, head, socket => { + this.wsServer.emit('connection', socket, request); + }); + }); + } + + private send(client: ws.WebSocket, id: string, name: string, data: any) { + client.send(JSON.stringify({ + data, + id, + name + }), (er) => { + if (er) + console.error(`[WS] ${er}`); + }); + } +} \ No newline at end of file diff --git a/index.ts b/index.ts index ce58672..61e89e7 100644 --- a/index.ts +++ b/index.ts @@ -1,3 +1,4 @@ +import { console } from './modules/log'; import { ServiceClass } from './@types/serviceClassInterface'; import { appArgv, overrideArguments } from './modules/module.app-args'; import * as yamlCfg from './modules/module.cfg-loader'; @@ -12,29 +13,29 @@ import update from './modules/module.updater'; await update(argv.update); if (argv.all && argv.but) { - console.log('[ERROR] --all and --but exclude each other!'); + console.error('--all and --but exclude each other!'); return; } if (argv.addArchive) { if (argv.service === 'funi') { if (argv.s === undefined) - return console.log('[ERROR] `-s` not found'); + return console.error('`-s` not found'); addToArchive({ service: 'funi', type: 's' }, argv.s); - console.log('[INFO] Added %s to the downloadArchive list', argv.s); + console.info('Added %s to the downloadArchive list', argv.s); } else if (argv.service === 'crunchy') { if (argv.s === undefined && argv.series === undefined) - return console.log('[ERROR] `-s` or `--srz` not found'); + return console.error('`-s` or `--srz` not found'); if (argv.s && argv.series) - return console.log('[ERROR] Both `-s` and `--srz` found'); + return console.error('Both `-s` and `--srz` found'); addToArchive({ service: 'crunchy', type: argv.s === undefined ? 'srz' : 's' }, (argv.s === undefined ? argv.series : argv.s) as string); - console.log('[INFO] Added %s to the downloadArchive list', (argv.s === undefined ? argv.series : argv.s)); + console.info('Added %s to the downloadArchive list', (argv.s === undefined ? argv.series : argv.s)); } } else if (argv.downloadArchive) { const ids = makeCommand(argv.service); @@ -45,7 +46,7 @@ import update from './modules/module.updater'; if (key.endsWith('crunchy.js') || key.endsWith('funi.js')) delete require.cache[key]; }); - const service = new (argv.service === 'funi' ? (await import('./funi')).default : (await import('./crunchy')).default) as ServiceClass; + const service = new (argv.service === 'funi' ? (await import('./funi')).default : (await import('./crunchy')).default)() as ServiceClass; await service.cli(); } } else { 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..f7288b9 100644 --- a/modules/build.ts +++ b/modules/build.ts @@ -4,7 +4,7 @@ import pkg from '../package.json'; import modulesCleanup from 'removeNPMAbsolutePaths'; import { exec } from 'pkg'; import { execSync } from 'child_process'; -import path from 'path'; +import { console } from './log'; const buildsDir = './_builds'; const nodeVer = 'node16-'; @@ -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)){ @@ -80,23 +30,23 @@ async function buildBinary(buildType: BuildTypes) { if(!fs.existsSync(buildsDir)){ fs.mkdirSync(buildsDir); } - const buildFull = `${buildStr}-${buildType}-cli`; + const buildFull = `${buildStr}-${buildType}-${gui ? 'gui' : 'cli'}`; const buildDir = `${buildsDir}/${buildFull}`; if(fs.existsSync(buildDir)){ fs.removeSync(buildDir); } fs.mkdirSync(buildDir); const buildConfig = [ - pkg.main, + gui ? 'gui.js' : 'index.js', '--target', nodeVer + getTarget(buildType), '--output', `${buildDir}/${pkg.short_name}`, ]; - console.log(`[Build] Build configuration: ${buildFull}`); + console.info(`[Build] Build configuration: ${buildFull}`); try { await exec(buildConfig); } catch(e){ - console.log(e); + console.info(e); process.exit(1); } fs.mkdirSync(`${buildDir}/config`); @@ -104,11 +54,16 @@ async function buildBinary(buildType: BuildTypes) { fs.copySync('./config/bin-path.yml', `${buildDir}/config/bin-path.yml`); fs.copySync('./config/cli-defaults.yml', `${buildDir}/config/cli-defaults.yml`); fs.copySync('./config/dir-path.yml', `${buildDir}/config/dir-path.yml`); + fs.copySync('./config/gui.yml', `${buildDir}/config/gui.yml`); fs.copySync('./modules/cmd-here.bat', `${buildDir}/cmd-here.bat`); fs.copySync('./modules/NotoSans-Regular.ttf', `${buildDir}/NotoSans-Regular.ttf`); 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/hls-download.ts b/modules/hls-download.ts new file mode 100644 index 0000000..790e397 --- /dev/null +++ b/modules/hls-download.ts @@ -0,0 +1,442 @@ +// build-in +import crypto from 'crypto'; +import fs from 'fs'; +import url from 'url'; + +// extra +import shlp from 'sei-helper'; +import got, { Response } from 'got'; + +import { console } from './log'; +import { ProgressData } from '../@types/messageHandler'; + +// The following function should fix an issue with downloading. For more information see https://github.com/sindresorhus/got/issues/1489 +const fixMiddleWare = (res: Response) => { + const isResponseOk = (response: Response) => { + const {statusCode} = response; + const limitStatusCode = response.request.options.followRedirect ? 299 : 399; + + return (statusCode >= 200 && statusCode <= limitStatusCode) || statusCode === 304; + }; + if (isResponseOk(res)) { + res.request.destroy(); + } + return res; +}; + +export type HLSCallback = (data: ProgressData) => unknown; + +type M3U8Json = { + segments: Record[], + mediaSequence?: number, +} + +type Segment = { + uri: string + key: Key, + byterange?: { + offset: number, + length: number + } +} + +type Key = { + uri: string, + iv: number[] +} + +export type HLSOptions = { + m3u8json: M3U8Json, + output?: string, + threads?: number, + retries?: number, + offset?: number, + baseurl?: string, + skipInit?: boolean, + timeout?: number, + fsRetryTime?: number, + override?: 'Y'|'y'|'N'|'n'|'C'|'c' + callback?: HLSCallback +} + +type Data = { + parts: { + first: number, + total: number, + completed: number + }, + m3u8json: M3U8Json, + outputFile: string, + threads: number, + retries: number, + offset: number, + baseurl?: string + skipInit?: boolean, + keys: { + [uri: string]: Buffer|string + }, + timeout: number, + checkPartLength: boolean, + isResume: boolean, + bytesDownloaded: number, + waitTime: number, + callback?: HLSCallback, + override?: string, + dateStart: number +} + +// hls class +class hlsDownload { + private data: Data; + constructor(options: HLSOptions){ + // check playlist + if( + !options + || !options.m3u8json + || !options.m3u8json.segments + || options.m3u8json.segments.length === 0 + ){ + throw new Error('Playlist is empty!'); + } + // init options + this.data = { + parts: { + first: options.m3u8json.mediaSequence || 0, + total: options.m3u8json.segments.length, + completed: 0, + }, + m3u8json: options.m3u8json, + outputFile: options.output || 'stream.ts', + threads: options.threads || 5, + retries: options.retries || 4, + offset: options.offset || 0, + baseurl: options.baseurl, + skipInit: options.skipInit, + keys: {}, + timeout: options.timeout ? options.timeout : 60 * 1000, + checkPartLength: true, + isResume: options.offset ? options.offset > 0 : false, + bytesDownloaded: 0, + waitTime: options.fsRetryTime ?? 1000 * 5, + callback: options.callback, + override: options.override, + dateStart: 0 + }; + } + async download(){ + // set output + const fn = this.data.outputFile; + // try load resume file + if(fs.existsSync(fn) && fs.existsSync(`${fn}.resume`) && this.data.offset < 1){ + try{ + console.info('Resume data found! Trying to resume...'); + const resumeData = JSON.parse(fs.readFileSync(`${fn}.resume`, 'utf-8')); + if( + resumeData.total == this.data.m3u8json.segments.length + && resumeData.completed != resumeData.total + && !isNaN(resumeData.completed) + ){ + console.info('Resume data is ok!'); + this.data.offset = resumeData.completed; + this.data.isResume = true; + } + else{ + console.warn(' Resume data is wrong!'); + console.warn({ + resume: { total: resumeData.total, dled: resumeData.completed }, + current: { total: this.data.m3u8json.segments.length }, + }); + } + } + catch(e){ + console.error('Resume failed, downloading will be not resumed!'); + console.error(e); + } + } + // ask before rewrite file + if (fs.existsSync(`${fn}`) && !this.data.isResume) { + let rwts = this.data.override ?? await shlp.question(`[Q] File «${fn}» already exists! Rewrite? ([y]es/[N]o/[c]ontinue)`); + rwts = rwts || 'N'; + if (['Y', 'y'].includes(rwts[0])) { + console.info(`Deleting «${fn}»...`); + fs.unlinkSync(fn); + } + else if (['C', 'c'].includes(rwts[0])) { + return { ok: true, parts: this.data.parts }; + } + else { + return { ok: false, parts: this.data.parts }; + } + } + // show output filename + if (fs.existsSync(fn) && this.data.isResume) { + console.info(`Adding content to «${fn}»...`); + } + else{ + console.info(`Saving stream to «${fn}»...`); + } + // start time + this.data.dateStart = Date.now(); + let segments = this.data.m3u8json.segments; + // download init part + if (segments[0].map && this.data.offset === 0 && !this.data.skipInit) { + console.info('Download and save init part...'); + const initSeg = segments[0].map as Segment; + if(segments[0].key){ + initSeg.key = segments[0].key as Key; + } + try{ + const initDl = await this.downloadPart(initSeg, 0, 0); + fs.writeFileSync(fn, initDl.dec, { flag: 'a' }); + fs.writeFileSync(`${fn}.resume`, JSON.stringify({ + completed: 0, + total: this.data.m3u8json.segments.length + })); + console.info('Init part downloaded.'); + } + catch(e: any){ + console.error(`Part init download error:\n\t${e.message}`); + return { ok: false, parts: this.data.parts }; + } + } + else if(segments[0].map && this.data.offset === 0 && this.data.skipInit){ + console.warn('Skipping init part can lead to broken video!'); + } + // resuming ... + if(this.data.offset > 0){ + segments = segments.slice(this.data.offset); + console.info(`Resuming download from part ${this.data.offset+1}...`); + this.data.parts.completed = this.data.offset; + } + // dl process + for (let p = 0; p < segments.length / this.data.threads; p++) { + // set offsets + const offset = p * this.data.threads; + const dlOffset = offset + this.data.threads; + // map download threads + const krq = new Map(), prq = new Map(); + const res = []; + let errcnt = 0; + for (let px = offset; px < dlOffset && px < segments.length; px++){ + const curp = segments[px]; + const key = curp.key as Key; + if(key && !krq.has(key.uri) && !this.data.keys[key.uri as string]){ + krq.set(key.uri, this.downloadKey(key, px, this.data.offset)); + } + } + try { + await Promise.all(krq.values()); + } catch (er: any) { + console.error(`Key ${er.p + 1} download error:\n\t${er.message}`); + return { ok: false, parts: this.data.parts }; + } + for (let px = offset; px < dlOffset && px < segments.length; px++){ + const curp = segments[px] as Segment; + prq.set(px, this.downloadPart(curp, px, this.data.offset)); + } + for (let i = prq.size; i--;) { + try { + const r = await Promise.race(prq.values()); + prq.delete(r.p); + res[r.p - offset] = r.dec; + } + catch (error: any) { + console.error('Part %s download error:\n\t%s', + error.p + 1 + this.data.offset, error.message); + prq.delete(error.p); + errcnt++; + } + } + // catch error + if (errcnt > 0) { + console.error(`${errcnt} parts not downloaded`); + return { ok: false, parts: this.data.parts }; + } + // write downloaded + for (const r of res) { + let error = 0; + while (error < 3) { + try { + fs.writeFileSync(fn, r, { flag: 'a' }); + break; + } catch (err) { + console.error(err); + console.error(`Unable to write to file '${fn}' (Attempt ${error+1}/3)`); + console.info(`Waiting ${Math.round(this.data.waitTime / 1000)}s before retrying`); + await new Promise((resolve) => setTimeout(() => resolve(), this.data.waitTime)); + } + error++; + } + if (error === 3) { + console.error(`Unable to write content to '${fn}'.`); + return { ok: false, parts: this.data.parts }; + } + } + // log downloaded + const totalSeg = segments.length + this.data.offset; // Add the sliced lenght back so the resume data will be correct even if an resumed download fails + const downloadedSeg = dlOffset < totalSeg ? dlOffset : totalSeg; + this.data.parts.completed = downloadedSeg + this.data.offset; + const data = extFn.getDownloadInfo( + this.data.dateStart, downloadedSeg, totalSeg, + this.data.bytesDownloaded + ); + fs.writeFileSync(`${fn}.resume`, JSON.stringify({ + completed: this.data.parts.completed, + total: totalSeg + })); + console.info(`${downloadedSeg} of ${totalSeg} parts downloaded [${data.percent}%] (${shlp.formatTime(parseInt((data.time / 1000).toFixed(0)))} | ${(data.downloadSpeed / 1000000).toPrecision(2)}Mb/s)`); + if (this.data.callback) + this.data.callback({ total: this.data.parts.total, cur: this.data.parts.completed, bytes: this.data.bytesDownloaded, percent: data.percent, time: data.time, downloadSpeed: data.downloadSpeed }); + } + // return result + fs.unlinkSync(`${fn}.resume`); + return { ok: true, parts: this.data.parts }; + } + async downloadPart(seg: Segment, segIndex: number, segOffset: number){ + const sURI = extFn.getURI(seg.uri, this.data.baseurl); + let decipher, part, dec; + const p = segIndex; + try { + if (seg.key != undefined) { + decipher = await this.getKey(seg.key, p, segOffset); + } + part = await extFn.getData(p, sURI, { + ...(seg.byterange ? { + Range: `bytes=${seg.byterange.offset}-${seg.byterange.offset+seg.byterange.length-1}` + } : {}) + }, segOffset, false, this.data.timeout, this.data.retries, [ + (res, retryWithMergedOptions) => { + if(this.data.checkPartLength && res.headers['content-length']){ + if(!res.body || (res.body as any).length != res.headers['content-length']){ + // 'Part not fully downloaded' + return retryWithMergedOptions(); + } + } + return res; + } + ]); + if(this.data.checkPartLength && !(part as any).headers['content-length']){ + this.data.checkPartLength = false; + console.warn(`Part ${segIndex+segOffset+1}: can't check parts size!`); + } + if (decipher == undefined) { + this.data.bytesDownloaded += (part.body as Buffer).byteLength; + return { dec: part.body, p }; + } + dec = decipher.update(part.body as Buffer); + dec = Buffer.concat([dec, decipher.final()]); + this.data.bytesDownloaded += dec.byteLength; + } + catch (error: any) { + error.p = p; + throw error; + } + return { dec, p }; + } + async downloadKey(key: Key, segIndex: number, segOffset: number){ + const kURI = extFn.getURI(key.uri, this.data.baseurl); + if (!this.data.keys[kURI]) { + try { + const rkey = await extFn.getData(segIndex, kURI, {}, segOffset, true, this.data.timeout, this.data.retries, [ + (res, retryWithMergedOptions) => { + if (!res || !res.body) { + // 'Key get error' + return retryWithMergedOptions(); + } + if((res.body as any).length != 16){ + // 'Key not fully downloaded' + return retryWithMergedOptions(); + } + return res; + } + ]); + return rkey; + } + catch (error: any) { + error.p = segIndex; + throw error; + } + } + } + async getKey(key: Key, segIndex: number, segOffset: number){ + const kURI = extFn.getURI(key.uri, this.data.baseurl); + const p = segIndex; + if (!this.data.keys[kURI]) { + try{ + const rkey = await this.downloadKey(key, segIndex, segOffset); + if (!rkey) + throw new Error(); + this.data.keys[kURI] = rkey.body; + } + catch (error: any) { + error.p = p; + throw error; + } + } + // get ivs + const iv = Buffer.alloc(16); + const ivs = key.iv ? key.iv : [0, 0, 0, p + 1]; + for (let i = 0; i < ivs.length; i++) { + iv.writeUInt32BE(ivs[i], i * 4); + } + return crypto.createDecipheriv('aes-128-cbc', this.data.keys[kURI], iv); + } +} + +const extFn = { + getURI: (uri: string, baseurl?: string) => { + const httpURI = /^https{0,1}:/.test(uri); + if (!baseurl && !httpURI) { + throw new Error('No base and not http(s) uri'); + } + else if (httpURI) { + return uri; + } + return baseurl + uri; + }, + getDownloadInfo: (dateStart: number, partsDL: number, partsTotal: number, downloadedBytes: number) => { + const dateElapsed = Date.now() - dateStart; + const percentFxd = parseInt((partsDL / partsTotal * 100).toFixed()); + const percent = percentFxd < 100 ? percentFxd : (partsTotal == partsDL ? 100 : 99); + const revParts = dateElapsed * (partsTotal / partsDL - 1); + const downloadSpeed = downloadedBytes / (dateElapsed / 1000); //Bytes per second + return { percent, time: revParts, downloadSpeed }; + }, + getData: (partIndex: number, uri: string, headers: Record, segOffset: number, isKey: boolean, timeout: number, retry: number, afterResponse: ((res: Response, retryWithMergedOptions: () => Response) => Response)[]) => { + // get file if uri is local + if (uri.startsWith('file://')) { + return { + body: fs.readFileSync(url.fileURLToPath(uri)), + }; + } + // base options + headers = headers && typeof headers == 'object' ? headers : {}; + const options = { headers, retry, responseType: 'buffer', hooks: { + beforeRequest: [ + (options: Record>) => { + if(!options.headers['user-agent']){ + options.headers['user-agent'] = 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:70.0) Gecko/20100101 Firefox/70.0'; + } + // console.log(' - Req:', options.url.pathname); + } + ], + afterResponse: [(fixMiddleWare as (r: Response, s: () => Response) => Response)].concat(afterResponse || []), + beforeRetry: [ + (_: any, error: Error, retryCount: number) => { + if(error){ + const partType = isKey ? 'Key': 'Part'; + const partIndx = partIndex + 1 + segOffset; + console.warn('%s %s: %d attempt to retrieve data', partType, partIndx, retryCount + 1); + console.error(`\t${error.message}`); + } + } + ] + }} as Record; + // proxy + options.timeout = timeout; + // do request + return got(uri, options); + } +}; + +export default hlsDownload; \ No newline at end of file diff --git a/modules/log.ts b/modules/log.ts new file mode 100644 index 0000000..50f37b7 --- /dev/null +++ b/modules/log.ts @@ -0,0 +1,66 @@ +import fs from 'fs'; +import path from 'path'; +import { workingDir } from './module.cfg-loader'; +import log4js from 'log4js'; + +const logFolder = path.join(workingDir, 'logs'); +const latest = path.join(logFolder, 'latest.log'); + +const makeLogFolder = () => { + if (!fs.existsSync(logFolder)) + fs.mkdirSync(logFolder); + if (fs.existsSync(latest)) { + const stats = fs.statSync(latest); + fs.renameSync(latest, path.join(logFolder, `${stats.mtimeMs}.log`)); + } +}; + +const makeLogger = () => { + const oldLog = global.console.log; + global.console.log = (data) => { + oldLog(`Unexpected use of console.log. Use the log4js logger instead. ${data}`); + }; + makeLogFolder(); + log4js.configure({ + appenders: { + console: { + type: 'console', layout: { + type: 'pattern', + pattern: process.env.isGUI === 'true' ? '%[%x{info}%m%]' : '%x{info}%m', + tokens: { + info: (ev) => { + return ev.level.levelStr === 'INFO' ? '' : `[${ev.level.levelStr}] `; + } + } + } + }, + file: { + type: 'file', + filename: latest, + layout: { + type: 'pattern', + pattern: '%x{info}%m', + tokens: { + info: (ev) => { + return ev.level.levelStr === 'INFO' ? '' : `[${ev.level.levelStr}] `; + } + } + } + } + }, + categories: { + default: { + appenders: ['console', 'file'], + level: 'all', + } + } + }); +}; + +const getLogger = () => { + if (!log4js.isConfigured()) + makeLogger(); + return log4js.getLogger(); +}; + +export const console = getLogger(); \ No newline at end of file diff --git a/modules/module.app-args.ts b/modules/module.app-args.ts index 140b1ba..dc9315f 100644 --- a/modules/module.app-args.ts +++ b/modules/module.app-args.ts @@ -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..e343d38 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' @@ -715,10 +716,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 +734,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..dc54bf6 100644 --- a/modules/module.cfg-loader.ts +++ b/modules/module.cfg-loader.ts @@ -2,6 +2,7 @@ import path from 'path'; import yaml from 'yaml'; import fs from 'fs-extra'; import { lookpath } from 'lookpath'; +import { console } from './log'; // new-cfg const workingDir = (process as NodeJS.Process & { @@ -12,8 +13,10 @@ 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 setupFile = path.join(workingDir, 'config', 'setup'); const tokenFile = { funi: path.join(workingDir, 'config', 'funi_token'), cr: path.join(workingDir, 'config', 'cr_token') @@ -23,7 +26,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`); }); @@ -39,13 +42,29 @@ const loadYamlCfgFile = >(file: string, isSess?: b return yaml.parse(fs.readFileSync(file, 'utf8')); } catch(e){ - console.log('[ERROR]', e); + console.error('[ERROR]', e); return {} as T; } } return {} as T; }; +export type WriteObjects = { + gui: GUIConfig +} + +const writeYamlCfgFile = (file: T, data: WriteObjects[T]) => { + const fn = path.join(workingDir, 'config', `${file}.yml`); + if (fs.existsSync(fn)) + fs.removeSync(fn); + fs.writeFileSync(fn, yaml.stringify(data)); +}; + +export type GUIConfig = { + port: number, + password?: string +}; + export type ConfigObject = { dir: { content: string, @@ -59,7 +78,8 @@ export type ConfigObject = { }, cli: { [key: string]: any - } + }, + gui: GUIConfig } const loadCfg = () : ConfigObject => { @@ -75,6 +95,7 @@ const loadCfg = () : ConfigObject => { cli: loadYamlCfgFile<{ [key: string]: any }>(cliCfgFile), + gui: loadYamlCfgFile(guiCfgFile) }; const defaultDirs = { fonts: '${wdir}/fonts/', @@ -100,7 +121,7 @@ const loadCfg = () : ConfigObject => { fs.ensureDirSync(defaultCfg.dir.content); } catch(e){ - console.log('[ERROR] Content directory not accessible!'); + console.error('Content directory not accessible!'); return defaultCfg; } } @@ -160,7 +181,7 @@ const saveCRSession = (data: Record) => { fs.writeFileSync(`${sessCfgFile}.yml`, yaml.stringify(data)); } catch(e){ - console.log('[ERROR] Can\'t save session file to disk!'); + console.error('Can\'t save session file to disk!'); } }; @@ -179,7 +200,7 @@ const saveCRToken = (data: Record) => { fs.writeFileSync(`${tokenFile.cr}.yml`, yaml.stringify(data)); } catch(e){ - console.log('[ERROR] Can\'t save token file to disk!'); + console.error('Can\'t save token file to disk!'); } }; @@ -192,7 +213,7 @@ const loadFuniToken = () => { token = loadedToken.token; // info if token not set if(!token){ - console.log('[INFO] Token not set!\n'); + console.info('[INFO] Token not set!\n'); } return token; }; @@ -206,12 +227,33 @@ const saveFuniToken = (data: { fs.writeFileSync(`${tokenFile.funi}.yml`, yaml.stringify(data)); } catch(e){ - console.log('[ERROR] Can\'t save token file to disk!'); + console.error('Can\'t save token file to disk!'); } }; const cfgDir = path.join(workingDir, 'config'); +const isSetuped = (): boolean => { + const fn = `${setupFile}.json`; + if (!fs.existsSync(fn)) + return false; + return JSON.parse(fs.readFileSync(fn).toString()).setuped; +}; + +const setSetuped = (bool: boolean) => { + const fn = `${setupFile}.json`; + if (bool) { + fs.writeFileSync(fn, JSON.stringify({ + setuped: true + }, null, 2)); + } else { + if (fs.existsSync(fn)) { + fs.removeSync(fn); + } + } +}; + + export { loadBinCfg, loadCfg, @@ -221,6 +263,9 @@ export { saveCRToken, loadCRToken, loadCRSession, + isSetuped, + setSetuped, + writeYamlCfgFile, sessCfgFile, cfgDir }; \ No newline at end of file diff --git a/modules/module.curl-req.ts b/modules/module.curl-req.ts index 832215c..7ea8e27 100644 --- a/modules/module.curl-req.ts +++ b/modules/module.curl-req.ts @@ -3,6 +3,7 @@ import child_process from 'child_process'; import fs from 'fs-extra'; import { Headers } from 'got'; import path from 'path'; +import { console } from './log'; export type CurlOptions = { headers?: Headers, @@ -73,7 +74,7 @@ const curlReq = async (curlBin: string, url: string, options: CurlOptions, cache try{ if(options.curlDebug){ - console.log(curlComm, '\n'); + console.info(curlComm, '\n'); } child_process.execSync(curlComm, { stdio: 'inherit', windowsHide: true }); } diff --git a/modules/module.filename.ts b/modules/module.filename.ts index 7502ad7..03db35e 100644 --- a/modules/module.filename.ts +++ b/modules/module.filename.ts @@ -1,7 +1,7 @@ import * as shlp from 'sei-helper'; import path from 'path'; import { AvailableFilenameVars } from './module.args'; - +import { console } from './log'; export type Variable = ({ type: 'number', @@ -25,7 +25,7 @@ const parseFileName = (input: string, variables: Variable[], numbers: number, ov const varName = type.slice(2, -1); const use = overridenVars.find(a => a.name === varName); if (use === undefined) { - console.log(`[ERROR] Found variable '${type}' in fileName but no values was internally found!`); + console.info(`[ERROR] Found variable '${type}' in fileName but no values was internally found!`); continue; } 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.getdata.ts b/modules/module.getdata.ts index d1a1667..def6854 100644 --- a/modules/module.getdata.ts +++ b/modules/module.getdata.ts @@ -1,4 +1,5 @@ import got, { OptionsOfUnknownResponseBody, ReadError, Response, ResponseType } from 'got'; +import { console } from './log'; // Used for future updates // const argv = require('../funi').argv; @@ -83,8 +84,8 @@ const getData = async (options: Options) => { beforeRequest: [ (gotOpts) => { if(options.debug){ - console.log('[DEBUG] GOT OPTIONS:'); - console.log(gotOpts); + console.debug('GOT OPTIONS:'); + console.debug(gotOpts); } } ] @@ -109,17 +110,17 @@ const getData = async (options: Options) => { res: Response }; if(options.debug){ - console.log(error); + console.debug(error); } if(error.response && error.response.statusCode && error.response.statusMessage){ - console.log(`[ERROR] ${error.name} ${error.response.statusCode}: ${error.response.statusMessage}`); + console.error(`${error.name} ${error.response.statusCode}: ${error.response.statusMessage}`); } else if(error.name && error.name == 'HTMLError' && error.res && error.res.body){ - console.log(`[ERROR] ${error.name}:`); - console.log(error.res.body); + console.error(`${error.name}:`); + console.error(error.res.body); } else{ - console.log(`[ERROR] ${error.name}: ${error.code||error.message}`); + console.error(`${error.name}: ${error.code||error.message}`); } return { ok: false, 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..7d016a6 100644 --- a/modules/module.merger.ts +++ b/modules/module.merger.ts @@ -5,6 +5,7 @@ import fs from 'fs'; import { LanguageItem } from './module.langsData'; import { AvailableMuxer } from './module.args'; import { exec } from './sei-helper-fixes'; +import { console } from './log'; export type MergerInput = { path: string, @@ -56,8 +57,8 @@ class Merger { } public FFmpeg() : string { - const args = []; - const metaData = []; + const args: string[] = []; + const metaData: string[] = []; let index = 0; let audioIndex = 0; @@ -137,7 +138,7 @@ class Merger { }; public MkvMerge = () => { - const args = []; + const args: string[] = []; let hasVideo = false; @@ -224,7 +225,6 @@ class Merger { } if (this.options.fonts && this.options.fonts.length > 0) { for (const f of this.options.fonts) { - console.log(f.path); args.push('--attachment-name', f.name); args.push('--attachment-mime-type', f.mime); args.push('--attach-file', `"${f.path}"`); @@ -261,9 +261,9 @@ class Merger { FFmpeg: bin.ffmpeg }; } else if (useMP4format) { - console.log('[WARN] FFmpeg not found, skip muxing...'); + console.warn('FFmpeg not found, skip muxing...'); } else if (!bin.mkvmerge) { - console.log('[WARN] MKVMerge not found, skip muxing...'); + console.warn('MKVMerge not found, skip muxing...'); } return {}; } @@ -272,18 +272,18 @@ 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); } fontsNameList = [...new Set(fontsNameList)]; if(subsList.length > 0){ - console.log('\n[INFO] Subtitles: %s (Total: %s)', subsList.join(', '), subsList.length); + console.info('\nSubtitles: %s (Total: %s)', subsList.join(', '), subsList.length); isNstr = false; } if(fontsNameList.length > 0){ - console.log((isNstr ? '\n' : '') + '[INFO] Required fonts: %s (Total: %s)', fontsNameList.join(', '), fontsNameList.length); + console.info((isNstr ? '\n' : '') + 'Required fonts: %s (Total: %s)', fontsNameList.join(', '), fontsNameList.length); } for(const f of fontsNameList){ const fontFiles = fontFamilies[f]; @@ -315,18 +315,18 @@ class Merger { break; } if (command === undefined) { - console.log('[WARN] Unable to merge files.'); + console.warn('Unable to merge files.'); return; } - console.log(`[INFO][${type}] Started merging`); + console.info(`[${type}] Started merging`); const res = exec(type, `"${bin}"`, command); if (!res.isOk && type === 'mkvmerge' && res.err.code === 1) { - console.log(`[INFO][${type}] Mkvmerge finished with at least one warning`); + console.info(`[${type}] Mkvmerge finished with at least one warning`); } else if (!res.isOk) { - console.log(res.err); - console.log(`[ERROR][${type}] Merging failed with exit code ${res.err.code}`); + console.error(res.err); + console.error(`[${type}] Merging failed with exit code ${res.err.code}`); } else { - console.log(`[INFO][${type} Done]`); + console.info(`[${type} Done]`); } } diff --git a/modules/module.parseSelect.ts b/modules/module.parseSelect.ts index 9e052f1..63e08a6 100644 --- a/modules/module.parseSelect.ts +++ b/modules/module.parseSelect.ts @@ -1,3 +1,5 @@ +import { console } from './log'; + const parseSelect = (selectString: string, but = false) : { isSelected: (val: string|string[]) => boolean, values: string[] @@ -14,7 +16,7 @@ const parseSelect = (selectString: string, but = false) : { if (part.includes('-')) { const splits = part.split('-'); if (splits.length !== 2) { - console.log(`[WARN] Unable to parse input "${part}"`); + console.warn(`[WARN] Unable to parse input "${part}"`); return; } @@ -22,14 +24,14 @@ const parseSelect = (selectString: string, but = false) : { const match = firstPart.match(/[A-Za-z]+/); if (match && match.length > 0) { if (match.index && match.index !== 0) { - console.log(`[WARN] Unable to parse input "${part}"`); + console.warn(`[WARN] Unable to parse input "${part}"`); return; } const letters = firstPart.substring(0, match[0].length); const number = parseInt(firstPart.substring(match[0].length)); const b = parseInt(splits[1]); if (isNaN(number) || isNaN(b)) { - console.log(`[WARN] Unable to parse input "${part}"`); + console.warn(`[WARN] Unable to parse input "${part}"`); return; } for (let i = number; i <= b; i++) { @@ -40,7 +42,7 @@ const parseSelect = (selectString: string, but = false) : { const a = parseInt(firstPart); const b = parseInt(splits[1]); if (isNaN(a) || isNaN(b)) { - console.log(`[WARN] Unable to parse input "${part}"`); + console.warn(`[WARN] Unable to parse input "${part}"`); return; } for (let i = a; i <= b; i++) { @@ -56,13 +58,13 @@ const parseSelect = (selectString: string, but = false) : { const match = part.match(/[A-Za-z]+/); if (match && match.length > 0) { if (match.index && match.index !== 0) { - console.log(`[WARN] Unable to parse input "${part}"`); + console.warn(`[WARN] Unable to parse input "${part}"`); return; } const letters = part.substring(0, match[0].length); const number = parseInt(part.substring(match[0].length)); if (isNaN(number)) { - console.log(`[WARN] Unable to parse input "${part}"`); + console.warn(`[WARN] Unable to parse input "${part}"`); return; } select.push(`${letters}${number}`); diff --git a/modules/module.req.ts b/modules/module.req.ts index 05205c3..7043976 100644 --- a/modules/module.req.ts +++ b/modules/module.req.ts @@ -2,6 +2,7 @@ import shlp from 'sei-helper'; import got, { Headers, Method, Options, ReadError, Response } from 'got'; import cookieFile from './module.cookieFile'; import * as yamlCfg from './module.cfg-loader'; +import { console } from './log'; //import curlReq from './module.curl-req'; export type Params = { @@ -68,15 +69,15 @@ class Req { options.followRedirect = params.followRedirect; } // if auth - const loc = new URL(durl); + //const loc = new URL(durl); // avoid cloudflare protection // debug options.hooks = { beforeRequest: [ (options) => { if(this.debug){ - console.log('[DEBUG] GOT OPTIONS:'); - console.log(options); + console.debug('[DEBUG] GOT OPTIONS:'); + console.debug(options); } } ] @@ -99,21 +100,21 @@ class Req { res: Response }; if(error.response && error.response.statusCode && error.response.statusMessage){ - console.log(`[ERROR] ${error.name} ${error.response.statusCode}: ${error.response.statusMessage}`); + console.error(`${error.name} ${error.response.statusCode}: ${error.response.statusMessage}`); } else{ - console.log(`[ERROR] ${error.name}: ${error.code || error.message}`); + console.error(`${error.name}: ${error.code || error.message}`); } if(error.response && !error.res){ error.res = error.response; const docTitle = (error.res.body as string).match(/(.*)<\/title>/); if(error.res.body && docTitle){ - console.log('[ERROR]', docTitle[1]); + console.error(docTitle[1]); } } if(error.res && error.res.body && error.response.statusCode && error.response.statusCode != 404 && error.response.statusCode != 403){ - console.log('[ERROR] Body:', error.res.body); + console.error('Body:', error.res.body); } return { ok: false, @@ -122,7 +123,7 @@ class Req { } } setNewCookie(setCookie: Record<string, string>, 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)){ @@ -165,10 +166,10 @@ class Req { } if(cookieUpdated.length > 0){ if(this.debug){ - console.log('[SAVING FILE]',`${this.sessCfg}.yml`); + console.info('[SAVING FILE]',`${this.sessCfg}.yml`); } yamlCfg.saveCRSession(this.session); - console.log(`[INFO] Cookies were updated! (${cookieUpdated.join(', ')})\n`); + console.info(`Cookies were updated! (${cookieUpdated.join(', ')})\n`); } } checkCookieVal(chcookie: Record<string, string>){ diff --git a/modules/module.updater.ts b/modules/module.updater.ts index 7bf3f4b..ce80fb7 100644 --- a/modules/module.updater.ts +++ b/modules/module.updater.ts @@ -9,6 +9,7 @@ import tsConfig from '../tsconfig.json'; import fsextra from 'fs-extra'; import seiHelper from 'sei-helper'; import { workingDir } from './module.cfg-loader'; +import { console } from './log'; const updateFilePlace = path.join(workingDir, 'config', 'updates.json'); const updateIgnore = [ @@ -53,7 +54,7 @@ export default (async (force = false) => { return; } } - console.log('Checking for updates...'); + console.info('Checking for updates...'); const tagRequest = await got('https://api.github.com/repos/anidl/multi-downloader-nx/tags'); const tags = JSON.parse(tagRequest.body) as GithubTag[]; @@ -61,10 +62,10 @@ export default (async (force = false) => { const newer = tags.filter(a => { return isNewer(packageJson.version, a.name); }); - console.log(`Found ${tags.length} release tags and ${newer.length} that are new.`); + console.info(`Found ${tags.length} release tags and ${newer.length} that are new.`); if (newer.length < 1) { - console.log('[INFO] No new tags found'); + console.info('No new tags found'); return done(); } const newest = newer.sort((a, b) => a.name < b.name ? 1 : a.name > b.name ? -1 : 0)[0]; @@ -72,7 +73,7 @@ export default (async (force = false) => { const compareJSON = JSON.parse(compareRequest.body) as TagCompare; - console.log(`You are behind by ${compareJSON.ahead_by} releases!`); + console.info(`You are behind by ${compareJSON.ahead_by} releases!`); const changedFiles = compareJSON.files.map(a => ({ ...a, filename: path.join(...a.filename.split('/')) @@ -80,10 +81,10 @@ export default (async (force = false) => { return !updateIgnore.some(_filter => matchString(_filter, a.filename)); }); if (changedFiles.length < 1) { - console.log('[INFO] No file changes found... updating package.json. If you think this is an error please get the newst version yourself.'); + console.info('No file changes found... updating package.json. If you think this is an error please get the newst version yourself.'); return done(newest.name); } - console.log(`Found file changes: \n${changedFiles.map(a => ` [${ + console.info(`Found file changes: \n${changedFiles.map(a => ` [${ a.status === 'modified' ? '*' : a.status === 'added' ? '+' : '-' }] ${a.filename}`).join('\n')}`); @@ -107,7 +108,7 @@ export default (async (force = false) => { }).outputText, type: a.status === 'modified' ? ApplyType.UPDATE : a.status === 'added' ? ApplyType.ADD : ApplyType.DELETE }; - console.log('✓ Transpiled %s', ret.path); + console.info('✓ Transpiled %s', ret.path); return ret; } else { const ret = { @@ -115,7 +116,7 @@ export default (async (force = false) => { content: (await got(a.raw_url)).body, type: a.status === 'modified' ? ApplyType.UPDATE : a.status === 'added' ? ApplyType.ADD : ApplyType.DELETE }; - console.log('✓ Got %s', ret.path); + console.info('✓ Got %s', ret.path); return ret; } })); @@ -124,13 +125,13 @@ export default (async (force = false) => { try { fsextra.ensureDirSync(path.dirname(a.path)); fs.writeFileSync(path.join(__dirname, '..', a.path), a.content); - console.log('✓ Written %s', a.path); + console.info('✓ Written %s', a.path); } catch (er) { - console.log('✗ Error while writing %s', a.path); + console.info('✗ Error while writing %s', a.path); } }); - console.log('[INFO] Done'); + console.info('Done'); return done(); } }); @@ -147,7 +148,7 @@ function done(newVersion?: string) { version: newVersion }, null, 4)); } - console.log('[INFO] Searching for update finished. Next time running on the ' + next.toLocaleDateString() + ' at ' + next.toLocaleTimeString() + '.'); + console.info('[INFO] Searching for update finished. Next time running on the ' + next.toLocaleDateString() + ' at ' + next.toLocaleTimeString() + '.'); } function isNewer(curr: string, compare: string) : boolean { 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/modules/sei-helper-fixes.ts b/modules/sei-helper-fixes.ts index 112f0e8..4a6d6eb 100644 --- a/modules/sei-helper-fixes.ts +++ b/modules/sei-helper-fixes.ts @@ -1,4 +1,5 @@ import childProcess from 'child_process'; +import { console } from './log'; const exec = (pname: string, fpath: string, pargs: string, spc = false): { isOk: true @@ -7,7 +8,7 @@ const exec = (pname: string, fpath: string, pargs: string, spc = false): { err: Error & { code: number } } => { pargs = pargs ? ' ' + pargs : ''; - console.log(`\n> "${pname}"${pargs}${spc ? '\n' : ''}`); + console.info(`\n> "${pname}"${pargs}${spc ? '\n' : ''}`); try { childProcess.execSync((fpath + pargs), { stdio: 'inherit' }); return { diff --git a/package.json b/package.json index 32b2a7e..c1746bd 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "multi-downloader-nx", "short_name": "aniDL", - "version": "3.3.7", + "version": "3.4.0", "description": "Download videos from Funimation or Crunchyroll via cli", "keywords": [ "download", @@ -35,56 +35,52 @@ "url": "https://github.com/anidl/multi-downloader-nx/issues" }, "license": "MIT", - "main": "gui/electron/src/index.js", "dependencies": { - "@babel/core": "^7.20.12", + "@babel/core": "^7.21.0", "@babel/plugin-syntax-flow": "^7.18.6", - "@babel/plugin-transform-react-jsx": "^7.20.13", - "cheerio": "^1.0.0-rc.12", + "@babel/plugin-transform-react-jsx": "^7.21.0", + "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", "fs-extra": "^11.1.0", "got": "^11.8.6", - "hls-download": "^2.6.10", "iso-639": "^0.2.2", + "log4js": "^6.8.0", "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", + "typescript-eslint": "0.0.1-alpha.0", + "ws": "^8.12.1", "yaml": "^2.2.1", - "yargs": "^17.7.0" + "yargs": "^17.7.1" }, "devDependencies": { + "@types/cors": "^2.8.13", "@types/express": "^4.17.17", "@types/fs-extra": "^11.0.1", - "@types/node": "^18.14.0", + "@types/node": "^18.14.6", + "@types/ws": "^8.5.4", "@types/yargs": "^17.0.22", - "@typescript-eslint/eslint-plugin": "^5.52.0", - "@typescript-eslint/parser": "^5.52.0", + "@typescript-eslint/eslint-plugin": "^5.54.0", + "@typescript-eslint/parser": "^5.54.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": "^8.35.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", + "eslint-plugin-react": "7.32.2", "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..8f05cc8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,99 +1,89 @@ lockfileVersion: 5.4 specifiers: - '@babel/core': ^7.20.12 + '@babel/core': ^7.21.0 '@babel/plugin-syntax-flow': ^7.18.6 - '@babel/plugin-transform-react-jsx': ^7.20.13 + '@babel/plugin-transform-react-jsx': ^7.21.0 + '@types/cors': ^2.8.13 '@types/express': ^4.17.17 '@types/fs-extra': ^11.0.1 - '@types/node': ^18.14.0 + '@types/node': ^18.14.6 + '@types/ws': ^8.5.4 '@types/yargs': ^17.0.22 - '@typescript-eslint/eslint-plugin': ^5.52.0 - '@typescript-eslint/parser': ^5.52.0 + '@typescript-eslint/eslint-plugin': ^5.54.0 + '@typescript-eslint/parser': ^5.54.0 '@vercel/webpack-asset-relocator-loader': ^1.7.3 - cheerio: ^1.0.0-rc.12 - css-loader: ^6.7.3 + cheerio: 1.0.0-rc.12 + 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: ^8.35.0 eslint-config-react-app: ^7.0.1 eslint-plugin-import: ^2.27.5 - eslint-plugin-react: ^7.32.2 + 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 - hls-download: ^2.6.10 iso-639: ^0.2.2 + log4js: ^6.8.0 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-eslint: ^0.0.1-alpha.0 - webpack: ^5.75.0 + typescript: 5.1.0-dev.20230227 + typescript-eslint: 0.0.1-alpha.0 + ws: ^8.12.1 yaml: ^2.2.1 - yargs: ^17.7.0 + yargs: ^17.7.1 dependencies: - '@babel/core': 7.20.12 - '@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 + '@babel/core': 7.21.0 + '@babel/plugin-syntax-flow': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-react-jsx': 7.21.0_@babel+core@7.21.0 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 + eslint-plugin-import: 2.27.5_ajyizmi44oc3hrc35l6ndh7p4e express: 4.18.2 form-data: 4.0.0 fs-extra: 11.1.0 got: 11.8.6 - hls-download: 2.6.10 iso-639: 0.2.2 + log4js: 6.8.0 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 + yargs: 17.7.1 devDependencies: + '@types/cors': 2.8.13 '@types/express': 4.17.17 '@types/fs-extra': 11.0.1 - '@types/node': 18.14.0 + '@types/node': 18.14.6 + '@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.54.0_mqamyc64mm623sdqp2cuitl6x4 + '@typescript-eslint/parser': 5.54.0_4lxevysaf7jvymq7c4erfx4ieu '@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-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 + eslint: 8.35.0 + eslint-config-react-app: 7.0.1_y4rmfs3vf24zj7wehzed4qgo74 + eslint-plugin-react: 7.32.2_eslint@8.35.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_xvqu66keneofebty6bzlkwfjuy + 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'} @@ -107,24 +97,24 @@ packages: dependencies: '@babel/highlight': 7.18.6 - /@babel/compat-data/7.20.14: - resolution: {integrity: sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==} + /@babel/compat-data/7.21.0: + resolution: {integrity: sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==} engines: {node: '>=6.9.0'} - /@babel/core/7.20.12: - resolution: {integrity: sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==} + /@babel/core/7.21.0: + resolution: {integrity: sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.0 '@babel/code-frame': 7.18.6 - '@babel/generator': 7.20.14 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 - '@babel/helper-module-transforms': 7.20.11 - '@babel/helpers': 7.20.13 - '@babel/parser': 7.20.15 + '@babel/generator': 7.21.1 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.0 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helpers': 7.21.0 + '@babel/parser': 7.21.2 '@babel/template': 7.20.7 - '@babel/traverse': 7.20.13 - '@babel/types': 7.20.7 + '@babel/traverse': 7.21.2 + '@babel/types': 7.21.2 convert-source-map: 1.9.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -133,16 +123,16 @@ packages: transitivePeerDependencies: - supports-color - /@babel/eslint-parser/7.19.1_ydmbqfus77qykiqxhcwsorsqbq: + /@babel/eslint-parser/7.19.1_zt6cfucldurvbyn2isj445jria: resolution: {integrity: sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: '@babel/core': '>=7.11.0' eslint: ^7.5.0 || ^8.0.0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 8.34.0 + eslint: 8.35.0 eslint-visitor-keys: 2.1.0 semver: 6.3.0 dev: true @@ -156,52 +146,53 @@ packages: jsesc: 2.5.2 dev: true - /@babel/generator/7.20.14: - resolution: {integrity: sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==} + /@babel/generator/7.21.1: + resolution: {integrity: sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.7 + '@babel/types': 7.21.2 '@jridgewell/gen-mapping': 0.3.2 + '@jridgewell/trace-mapping': 0.3.17 jsesc: 2.5.2 /@babel/helper-annotate-as-pure/7.18.6: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.7 + '@babel/types': 7.21.2 /@babel/helper-builder-binary-assignment-operator-visitor/7.18.9: resolution: {integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-explode-assignable-expression': 7.18.6 - '@babel/types': 7.20.7 + '@babel/types': 7.21.2 dev: true - /@babel/helper-compilation-targets/7.20.7_@babel+core@7.20.12: + /@babel/helper-compilation-targets/7.20.7_@babel+core@7.21.0: resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.20.14 - '@babel/core': 7.20.12 - '@babel/helper-validator-option': 7.18.6 + '@babel/compat-data': 7.21.0 + '@babel/core': 7.21.0 + '@babel/helper-validator-option': 7.21.0 browserslist: 4.21.5 lru-cache: 5.1.1 semver: 6.3.0 - /@babel/helper-create-class-features-plugin/7.20.12_@babel+core@7.20.12: - resolution: {integrity: sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==} + /@babel/helper-create-class-features-plugin/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-member-expression-to-functions': 7.20.7 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-member-expression-to-functions': 7.21.0 '@babel/helper-optimise-call-expression': 7.18.6 '@babel/helper-replace-supers': 7.20.7 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 @@ -210,24 +201,24 @@ packages: - supports-color dev: true - /@babel/helper-create-regexp-features-plugin/7.20.5_@babel+core@7.20.12: - resolution: {integrity: sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==} + /@babel/helper-create-regexp-features-plugin/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-annotate-as-pure': 7.18.6 regexpu-core: 5.3.1 dev: true - /@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.20.12: + /@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.21.0: resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} peerDependencies: '@babel/core': ^7.4.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 + '@babel/core': 7.21.0 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.0 '@babel/helper-plugin-utils': 7.20.2 debug: 4.3.4 lodash.debounce: 4.0.8 @@ -245,37 +236,37 @@ packages: resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.7 + '@babel/types': 7.21.2 dev: true - /@babel/helper-function-name/7.19.0: - resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==} + /@babel/helper-function-name/7.21.0: + resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.20.7 - '@babel/types': 7.20.7 + '@babel/types': 7.21.2 /@babel/helper-hoist-variables/7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.7 + '@babel/types': 7.21.2 - /@babel/helper-member-expression-to-functions/7.20.7: - resolution: {integrity: sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==} + /@babel/helper-member-expression-to-functions/7.21.0: + resolution: {integrity: sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.7 + '@babel/types': 7.21.2 dev: true /@babel/helper-module-imports/7.18.6: resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.7 + '@babel/types': 7.21.2 - /@babel/helper-module-transforms/7.20.11: - resolution: {integrity: sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==} + /@babel/helper-module-transforms/7.21.2: + resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-environment-visitor': 7.18.9 @@ -284,8 +275,8 @@ packages: '@babel/helper-split-export-declaration': 7.18.6 '@babel/helper-validator-identifier': 7.19.1 '@babel/template': 7.20.7 - '@babel/traverse': 7.20.13 - '@babel/types': 7.20.7 + '@babel/traverse': 7.21.2 + '@babel/types': 7.21.2 transitivePeerDependencies: - supports-color @@ -293,24 +284,24 @@ packages: resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.7 + '@babel/types': 7.21.2 dev: true /@babel/helper-plugin-utils/7.20.2: resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} engines: {node: '>=6.9.0'} - /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.20.12: + /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.21.0: resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-wrap-function': 7.20.5 - '@babel/types': 7.20.7 + '@babel/types': 7.21.2 transitivePeerDependencies: - supports-color dev: true @@ -320,11 +311,11 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-member-expression-to-functions': 7.20.7 + '@babel/helper-member-expression-to-functions': 7.21.0 '@babel/helper-optimise-call-expression': 7.18.6 '@babel/template': 7.20.7 - '@babel/traverse': 7.20.13 - '@babel/types': 7.20.7 + '@babel/traverse': 7.21.2 + '@babel/types': 7.21.2 transitivePeerDependencies: - supports-color dev: true @@ -333,20 +324,20 @@ packages: resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.7 + '@babel/types': 7.21.2 /@babel/helper-skip-transparent-expression-wrappers/7.20.0: resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.7 + '@babel/types': 7.21.2 dev: true /@babel/helper-split-export-declaration/7.18.6: resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.7 + '@babel/types': 7.21.2 /@babel/helper-string-parser/7.19.4: resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} @@ -356,29 +347,29 @@ packages: resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option/7.18.6: - resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} + /@babel/helper-validator-option/7.21.0: + resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} engines: {node: '>=6.9.0'} /@babel/helper-wrap-function/7.20.5: resolution: {integrity: sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-function-name': 7.19.0 + '@babel/helper-function-name': 7.21.0 '@babel/template': 7.20.7 - '@babel/traverse': 7.20.13 - '@babel/types': 7.20.7 + '@babel/traverse': 7.21.2 + '@babel/types': 7.21.2 transitivePeerDependencies: - supports-color dev: true - /@babel/helpers/7.20.13: - resolution: {integrity: sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==} + /@babel/helpers/7.21.0: + resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.20.7 - '@babel/traverse': 7.20.13 - '@babel/types': 7.20.7 + '@babel/traverse': 7.21.2 + '@babel/types': 7.21.2 transitivePeerDependencies: - supports-color @@ -398,467 +389,467 @@ packages: '@babel/types': 7.18.4 dev: true - /@babel/parser/7.20.15: - resolution: {integrity: sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==} + /@babel/parser/7.21.2: + resolution: {integrity: sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.20.7 + '@babel/types': 7.21.2 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.20.12: + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.20.7_@babel+core@7.20.12: + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.20.7_@babel+core@7.21.0: resolution: {integrity: sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-proposal-optional-chaining': 7.20.7_@babel+core@7.20.12 + '@babel/plugin-proposal-optional-chaining': 7.21.0_@babel+core@7.21.0 dev: true - /@babel/plugin-proposal-async-generator-functions/7.20.7_@babel+core@7.20.12: + /@babel/plugin-proposal-async-generator-functions/7.20.7_@babel+core@7.21.0: resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.20.12 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.12 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.21.0 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.0 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-create-class-features-plugin': 7.20.12_@babel+core@7.20.12 + '@babel/core': 7.21.0 + '@babel/helper-create-class-features-plugin': 7.21.0_@babel+core@7.21.0 '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-class-static-block/7.20.7_@babel+core@7.20.12: - resolution: {integrity: sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ==} + /@babel/plugin-proposal-class-static-block/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-create-class-features-plugin': 7.20.12_@babel+core@7.20.12 + '@babel/core': 7.21.0 + '@babel/helper-create-class-features-plugin': 7.21.0_@babel+core@7.21.0 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.12 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.21.0 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-decorators/7.20.13_@babel+core@7.20.12: - resolution: {integrity: sha512-7T6BKHa9Cpd7lCueHBBzP0nkXNina+h5giOZw+a8ZpMfPFY19VjJAjIxyFHuWkhCWgL6QMqRiY/wB1fLXzm6Mw==} + /@babel/plugin-proposal-decorators/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-MfgX49uRrFUTL/HvWtmx3zmpyzMMr4MTj3d527MLlr/4RTT9G/ytFFP7qet2uM2Ve03b+BkpWUpK+lRXnQ+v9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-create-class-features-plugin': 7.20.12_@babel+core@7.20.12 + '@babel/core': 7.21.0 + '@babel/helper-create-class-features-plugin': 7.21.0_@babel+core@7.21.0 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-replace-supers': 7.20.7 '@babel/helper-split-export-declaration': 7.18.6 - '@babel/plugin-syntax-decorators': 7.19.0_@babel+core@7.20.12 + '@babel/plugin-syntax-decorators': 7.21.0_@babel+core@7.21.0 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.0 dev: true - /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.20.12: + /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.21.0: resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.21.0 dev: true - /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.0 dev: true - /@babel/plugin-proposal-logical-assignment-operators/7.20.7_@babel+core@7.20.12: + /@babel/plugin-proposal-logical-assignment-operators/7.20.7_@babel+core@7.21.0: resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.12 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.0 dev: true - /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.0 dev: true - /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.12 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.0 dev: true - /@babel/plugin-proposal-object-rest-spread/7.20.7_@babel+core@7.20.12: + /@babel/plugin-proposal-object-rest-spread/7.20.7_@babel+core@7.21.0: resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.20.14 - '@babel/core': 7.20.12 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 + '@babel/compat-data': 7.21.0 + '@babel/core': 7.21.0 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.0 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-transform-parameters': 7.20.7_@babel+core@7.20.12 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.0 + '@babel/plugin-transform-parameters': 7.20.7_@babel+core@7.21.0 dev: true - /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.0 dev: true - /@babel/plugin-proposal-optional-chaining/7.20.7_@babel+core@7.20.12: - resolution: {integrity: sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==} + /@babel/plugin-proposal-optional-chaining/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.0 dev: true - /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-create-class-features-plugin': 7.20.12_@babel+core@7.20.12 + '@babel/core': 7.21.0 + '@babel/helper-create-class-features-plugin': 7.21.0_@babel+core@7.21.0 '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-private-property-in-object/7.20.5_@babel+core@7.20.12: - resolution: {integrity: sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==} + /@babel/plugin-proposal-private-property-in-object/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.20.12_@babel+core@7.20.12 + '@babel/helper-create-class-features-plugin': 7.21.0_@babel+core@7.21.0 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.12 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.21.0 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} engines: {node: '>=4'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-create-regexp-features-plugin': 7.20.5_@babel+core@7.20.12 + '@babel/core': 7.21.0 + '@babel/helper-create-regexp-features-plugin': 7.21.0_@babel+core@7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.20.12: + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.21.0: resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.20.12: + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.21.0: resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.20.12: + /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.21.0: resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-decorators/7.19.0_@babel+core@7.20.12: - resolution: {integrity: sha512-xaBZUEDntt4faL1yN8oIFlhfXeQAWJW7CLKYsHTUqriCUbj8xOra8bfxxKGi/UwExPFBuPdH4XfHc9rGQhrVkQ==} + /@babel/plugin-syntax-decorators/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-tIoPpGBR8UuM4++ccWN3gifhVvQu7ZizuR1fklhRJrd5ewgbkUS+0KVFeWWxELtn18NTLoW32XV7zyOgIAiz+w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.21.0: resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.21.0: resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-flow/7.18.6_@babel+core@7.20.12: + /@babel/plugin-syntax-flow/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-import-assertions/7.20.0_@babel+core@7.20.12: + /@babel/plugin-syntax-import-assertions/7.20.0_@babel+core@7.21.0: resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.21.0: resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.12: + /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.20.12: + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.21.0: resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.21.0: resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.20.12: + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.21.0: resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.21.0: resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.21.0: resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.21.0: resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.20.12: + /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.21.0: resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.20.12: + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.21.0: resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.20.12: + /@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.21.0: resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-arrow-functions/7.20.7_@babel+core@7.20.12: + /@babel/plugin-transform-arrow-functions/7.20.7_@babel+core@7.21.0: resolution: {integrity: sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-async-to-generator/7.20.7_@babel+core@7.20.12: + /@babel/plugin-transform-async-to-generator/7.20.7_@babel+core@7.21.0: resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-module-imports': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.20.12 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.21.0 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-block-scoping/7.20.15_@babel+core@7.20.12: - resolution: {integrity: sha512-Vv4DMZ6MiNOhu/LdaZsT/bsLRxgL94d269Mv4R/9sp6+Mp++X/JqypZYypJXLlM4mlL352/Egzbzr98iABH1CA==} + /@babel/plugin-transform-block-scoping/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-classes/7.20.7_@babel+core@7.20.12: - resolution: {integrity: sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==} + /@babel/plugin-transform-classes/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.0 '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 + '@babel/helper-function-name': 7.21.0 '@babel/helper-optimise-call-expression': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-replace-supers': 7.20.7 @@ -868,513 +859,513 @@ packages: - supports-color dev: true - /@babel/plugin-transform-computed-properties/7.20.7_@babel+core@7.20.12: + /@babel/plugin-transform-computed-properties/7.20.7_@babel+core@7.21.0: resolution: {integrity: sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 '@babel/template': 7.20.7 dev: true - /@babel/plugin-transform-destructuring/7.20.7_@babel+core@7.20.12: + /@babel/plugin-transform-destructuring/7.20.7_@babel+core@7.21.0: resolution: {integrity: sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-create-regexp-features-plugin': 7.20.5_@babel+core@7.20.12 + '@babel/core': 7.21.0 + '@babel/helper-create-regexp-features-plugin': 7.21.0_@babel+core@7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.20.12: + /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.21.0: resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-flow-strip-types/7.19.0_@babel+core@7.20.12: - resolution: {integrity: sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg==} + /@babel/plugin-transform-flow-strip-types/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-FlFA2Mj87a6sDkW4gfGrQQqwY/dLlBAyJa2dJEZ+FHXUVHBflO2wyKvg+OOEzXfrKYIa4HWl0mgmbCzt0cMb7w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-flow': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-syntax-flow': 7.18.6_@babel+core@7.21.0 dev: true - /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.20.12: - resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} + /@babel/plugin-transform-for-of/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.20.12: + /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.21.0: resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 - '@babel/helper-function-name': 7.19.0 + '@babel/core': 7.21.0 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.0 + '@babel/helper-function-name': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-literals/7.18.9_@babel+core@7.20.12: + /@babel/plugin-transform-literals/7.18.9_@babel+core@7.21.0: resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-modules-amd/7.20.11_@babel+core@7.20.12: + /@babel/plugin-transform-modules-amd/7.20.11_@babel+core@7.21.0: resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-module-transforms': 7.20.11 + '@babel/core': 7.21.0 + '@babel/helper-module-transforms': 7.21.2 '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-modules-commonjs/7.20.11_@babel+core@7.20.12: - resolution: {integrity: sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==} + /@babel/plugin-transform-modules-commonjs/7.21.2_@babel+core@7.21.0: + resolution: {integrity: sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-module-transforms': 7.20.11 + '@babel/core': 7.21.0 + '@babel/helper-module-transforms': 7.21.2 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-simple-access': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-modules-systemjs/7.20.11_@babel+core@7.20.12: + /@babel/plugin-transform-modules-systemjs/7.20.11_@babel+core@7.21.0: resolution: {integrity: sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-module-transforms': 7.20.11 + '@babel/helper-module-transforms': 7.21.2 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-validator-identifier': 7.19.1 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-module-transforms': 7.20.11 + '@babel/core': 7.21.0 + '@babel/helper-module-transforms': 7.21.2 '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-named-capturing-groups-regex/7.20.5_@babel+core@7.20.12: + /@babel/plugin-transform-named-capturing-groups-regex/7.20.5_@babel+core@7.21.0: resolution: {integrity: sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-create-regexp-features-plugin': 7.20.5_@babel+core@7.20.12 + '@babel/core': 7.21.0 + '@babel/helper-create-regexp-features-plugin': 7.21.0_@babel+core@7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-replace-supers': 7.20.7 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-parameters/7.20.7_@babel+core@7.20.12: + /@babel/plugin-transform-parameters/7.20.7_@babel+core@7.21.0: resolution: {integrity: sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-react-display-name/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-react-display-name/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-react-jsx-development/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-react-jsx-development/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/plugin-transform-react-jsx': 7.20.13_@babel+core@7.20.12 + '@babel/core': 7.21.0 + '@babel/plugin-transform-react-jsx': 7.21.0_@babel+core@7.21.0 dev: true - /@babel/plugin-transform-react-jsx/7.20.13_@babel+core@7.20.12: - resolution: {integrity: sha512-MmTZx/bkUrfJhhYAYt3Urjm+h8DQGrPrnKQ94jLo7NLuOU+T89a7IByhKmrb8SKhrIYIQ0FN0CHMbnFRen4qNw==} + /@babel/plugin-transform-react-jsx/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-module-imports': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.12 - '@babel/types': 7.20.7 + '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.21.0 + '@babel/types': 7.21.2 - /@babel/plugin-transform-react-pure-annotations/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-react-pure-annotations/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-regenerator/7.20.5_@babel+core@7.20.12: + /@babel/plugin-transform-regenerator/7.20.5_@babel+core@7.21.0: resolution: {integrity: sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 regenerator-transform: 0.15.1 dev: true - /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-runtime/7.19.6_@babel+core@7.20.12: - resolution: {integrity: sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==} + /@babel/plugin-transform-runtime/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-ReY6pxwSzEU0b3r2/T/VhqMKg/AkceBT19X0UptA3/tYi5Pe2eXgEUH+NNMC5nok6c6XQz5tyVTUpuezRfSMSg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-module-imports': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.20.12 - babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.20.12 - babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.20.12 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.21.0 + babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.21.0 + babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.21.0 semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-spread/7.20.7_@babel+core@7.20.12: + /@babel/plugin-transform-spread/7.20.7_@babel+core@7.21.0: resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 dev: true - /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.20.12: + /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.21.0: resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.20.12: + /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.21.0: resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-typescript/7.20.13_@babel+core@7.20.12: - resolution: {integrity: sha512-O7I/THxarGcDZxkgWKMUrk7NK1/WbHAg3Xx86gqS6x9MTrNL6AwIluuZ96ms4xeDe6AVx6rjHbWHP7x26EPQBA==} + /@babel/plugin-transform-typescript/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-xo///XTPp3mDzTtrqXoBlK9eiAYW3wv9JXglcn/u1bi60RW11dEUxIgA8cbnDhutS1zacjMRmAwxE0gMklLnZg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-create-class-features-plugin': 7.20.12_@babel+core@7.20.12 + '@babel/core': 7.21.0 + '@babel/helper-create-class-features-plugin': 7.21.0_@babel+core@7.21.0 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.20.12 + '@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.21.0 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.20.12: + /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.21.0: resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-create-regexp-features-plugin': 7.20.5_@babel+core@7.20.12 + '@babel/core': 7.21.0 + '@babel/helper-create-regexp-features-plugin': 7.21.0_@babel+core@7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/preset-env/7.20.2_@babel+core@7.20.12: + /@babel/preset-env/7.20.2_@babel+core@7.21.0: resolution: {integrity: sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.20.14 - '@babel/core': 7.20.12 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 + '@babel/compat-data': 7.21.0 + '@babel/core': 7.21.0 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.0 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-proposal-async-generator-functions': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-class-static-block': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.20.12 - '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-logical-assignment-operators': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-object-rest-spread': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-optional-chaining': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-private-property-in-object': 7.20.5_@babel+core@7.20.12 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.12 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.20.12 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.12 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-import-assertions': 7.20.0_@babel+core@7.20.12 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.12 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.12 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.12 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.12 - '@babel/plugin-transform-arrow-functions': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-transform-async-to-generator': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-block-scoping': 7.20.15_@babel+core@7.20.12 - '@babel/plugin-transform-classes': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-transform-computed-properties': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-transform-destructuring': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.20.12 - '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.20.12 - '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.20.12 - '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.20.12 - '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-modules-amd': 7.20.11_@babel+core@7.20.12 - '@babel/plugin-transform-modules-commonjs': 7.20.11_@babel+core@7.20.12 - '@babel/plugin-transform-modules-systemjs': 7.20.11_@babel+core@7.20.12 - '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5_@babel+core@7.20.12 - '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-parameters': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-regenerator': 7.20.5_@babel+core@7.20.12 - '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-spread': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.20.12 - '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.20.12 - '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.20.12 - '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.20.12 - '@babel/preset-modules': 0.1.5_@babel+core@7.20.12 - '@babel/types': 7.20.7 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.20.12 - babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.20.12 - babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.20.12 - core-js-compat: 3.28.0 + '@babel/helper-validator-option': 7.21.0 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7_@babel+core@7.21.0 + '@babel/plugin-proposal-async-generator-functions': 7.20.7_@babel+core@7.21.0 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-proposal-class-static-block': 7.21.0_@babel+core@7.21.0 + '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.21.0 + '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-proposal-logical-assignment-operators': 7.20.7_@babel+core@7.21.0 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-proposal-object-rest-spread': 7.20.7_@babel+core@7.21.0 + '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-proposal-optional-chaining': 7.21.0_@babel+core@7.21.0 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-proposal-private-property-in-object': 7.21.0_@babel+core@7.21.0 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.0 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.21.0 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.21.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.0 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.21.0 + '@babel/plugin-syntax-import-assertions': 7.20.0_@babel+core@7.21.0 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.0 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.0 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.0 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.0 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.0 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.0 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.0 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.21.0 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.21.0 + '@babel/plugin-transform-arrow-functions': 7.20.7_@babel+core@7.21.0 + '@babel/plugin-transform-async-to-generator': 7.20.7_@babel+core@7.21.0 + '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-block-scoping': 7.21.0_@babel+core@7.21.0 + '@babel/plugin-transform-classes': 7.21.0_@babel+core@7.21.0 + '@babel/plugin-transform-computed-properties': 7.20.7_@babel+core@7.21.0 + '@babel/plugin-transform-destructuring': 7.20.7_@babel+core@7.21.0 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.21.0 + '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-for-of': 7.21.0_@babel+core@7.21.0 + '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.21.0 + '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.21.0 + '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-modules-amd': 7.20.11_@babel+core@7.21.0 + '@babel/plugin-transform-modules-commonjs': 7.21.2_@babel+core@7.21.0 + '@babel/plugin-transform-modules-systemjs': 7.20.11_@babel+core@7.21.0 + '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5_@babel+core@7.21.0 + '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-parameters': 7.20.7_@babel+core@7.21.0 + '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-regenerator': 7.20.5_@babel+core@7.21.0 + '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-spread': 7.20.7_@babel+core@7.21.0 + '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.21.0 + '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.21.0 + '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.21.0 + '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.21.0 + '@babel/preset-modules': 0.1.5_@babel+core@7.21.0 + '@babel/types': 7.21.2 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.21.0 + babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.21.0 + babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.21.0 + core-js-compat: 3.29.0 semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true - /@babel/preset-modules/0.1.5_@babel+core@7.20.12: + /@babel/preset-modules/0.1.5_@babel+core@7.21.0: resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.20.12 - '@babel/types': 7.20.7 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.21.0 + '@babel/types': 7.21.2 esutils: 2.0.3 dev: true - /@babel/preset-react/7.18.6_@babel+core@7.20.12: + /@babel/preset-react/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-transform-react-display-name': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-react-jsx': 7.20.13_@babel+core@7.20.12 - '@babel/plugin-transform-react-jsx-development': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-react-pure-annotations': 7.18.6_@babel+core@7.20.12 + '@babel/helper-validator-option': 7.21.0 + '@babel/plugin-transform-react-display-name': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-react-jsx': 7.21.0_@babel+core@7.21.0 + '@babel/plugin-transform-react-jsx-development': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-react-pure-annotations': 7.18.6_@babel+core@7.21.0 dev: true - /@babel/preset-typescript/7.18.6_@babel+core@7.20.12: - resolution: {integrity: sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==} + /@babel/preset-typescript/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-myc9mpoVA5m1rF8K8DgLEatOYFDpwC+RkMkjZ0Du6uI62YvDe8uxIEYVs/VCdSJ097nlALiU/yBC7//3nI+hNg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-transform-typescript': 7.20.13_@babel+core@7.20.12 + '@babel/helper-validator-option': 7.21.0 + '@babel/plugin-transform-typescript': 7.21.0_@babel+core@7.21.0 transitivePeerDependencies: - supports-color dev: true @@ -1383,8 +1374,8 @@ packages: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} dev: true - /@babel/runtime/7.20.13: - resolution: {integrity: sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==} + /@babel/runtime/7.21.0: + resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 @@ -1394,21 +1385,21 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.18.6 - '@babel/parser': 7.20.15 - '@babel/types': 7.20.7 + '@babel/parser': 7.21.2 + '@babel/types': 7.21.2 - /@babel/traverse/7.20.13: - resolution: {integrity: sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==} + /@babel/traverse/7.21.2: + resolution: {integrity: sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.18.6 - '@babel/generator': 7.20.14 + '@babel/generator': 7.21.1 '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 + '@babel/helper-function-name': 7.21.0 '@babel/helper-hoist-variables': 7.18.6 '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.20.15 - '@babel/types': 7.20.7 + '@babel/parser': 7.21.2 + '@babel/types': 7.21.2 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: @@ -1422,8 +1413,8 @@ packages: to-fast-properties: 2.0.0 dev: true - /@babel/types/7.20.7: - resolution: {integrity: sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==} + /@babel/types/7.21.2: + resolution: {integrity: sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.19.4 @@ -1437,48 +1428,8 @@ 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==} + /@eslint/eslintrc/2.0.0: + resolution: {integrity: sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 @@ -1493,6 +1444,10 @@ packages: transitivePeerDependencies: - supports-color + /@eslint/js/8.35.0: + resolution: {integrity: sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@humanwhocodes/config-array/0.11.8: resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} engines: {node: '>=10.10.0'} @@ -1533,12 +1488,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 +1504,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 +1535,15 @@ 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 - - /@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 @@ -1642,7 +1564,7 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 18.14.0 + '@types/node': 18.14.6 dev: true /@types/cacheable-request/6.0.3: @@ -1650,40 +1572,26 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 18.14.0 + '@types/node': 18.14.6 '@types/responselike': 1.0.0 + dev: false /@types/connect/3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 18.14.0 + '@types/node': 18.14.6 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.6 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: - '@types/node': 18.14.0 + '@types/node': 18.14.6 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 dev: true @@ -1694,36 +1602,23 @@ packages: '@types/body-parser': 1.19.2 '@types/express-serve-static-core': 4.17.33 '@types/qs': 6.9.7 - '@types/serve-static': 1.15.0 + '@types/serve-static': 1.15.1 dev: true /@types/fs-extra/11.0.1: resolution: {integrity: sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==} dependencies: '@types/jsonfile': 6.1.1 - '@types/node': 18.14.0 + '@types/node': 18.14.6 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==} @@ -1731,47 +1626,26 @@ packages: /@types/jsonfile/6.1.1: resolution: {integrity: sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==} dependencies: - '@types/node': 18.14.0 + '@types/node': 18.14.6 dev: true /@types/keyv/3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 18.14.0 + '@types/node': 18.14.6 + 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==} + /@types/node/18.14.6: + resolution: {integrity: sha512-93+VvleD3mXwlLI/xASjw0FzKcwzl3OdTCzm1LaRfqgS21gfFtK3zDXM5Op9TeeMsJVOaJ2VRDpT9q4Y3d0AvA==} /@types/parse-json/4.0.0: 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 @@ -1783,24 +1657,25 @@ packages: /@types/responselike/1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 18.14.0 + '@types/node': 18.14.6 + dev: false /@types/semver/7.3.13: resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} dev: true - /@types/serve-static/1.15.0: - resolution: {integrity: sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==} + /@types/serve-static/1.15.1: + resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} dependencies: '@types/mime': 3.0.1 - '@types/node': 18.14.0 + '@types/node': 18.14.6 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.6 dev: true - optional: true /@types/yargs-parser/21.0.0: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} @@ -1812,16 +1687,8 @@ 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: - resolution: {integrity: sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==} + /@typescript-eslint/eslint-plugin/5.54.0_mqamyc64mm623sdqp2cuitl6x4: + resolution: {integrity: sha512-+hSN9BdSr629RF02d7mMtXhAJvDTyCbprNYJKrXETlul/Aml6YZwd90XioVbjejQeHbb3R8Dg0CkRgoJDxo8aw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -1831,38 +1698,38 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm - '@typescript-eslint/scope-manager': 5.52.0 - '@typescript-eslint/type-utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm - '@typescript-eslint/utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + '@typescript-eslint/parser': 5.54.0_4lxevysaf7jvymq7c4erfx4ieu + '@typescript-eslint/scope-manager': 5.54.0 + '@typescript-eslint/type-utils': 5.54.0_4lxevysaf7jvymq7c4erfx4ieu + '@typescript-eslint/utils': 5.54.0_4lxevysaf7jvymq7c4erfx4ieu debug: 4.3.4 - eslint: 8.34.0 + eslint: 8.35.0 grapheme-splitter: 1.0.4 ignore: 5.2.4 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: - resolution: {integrity: sha512-kd8CRr04mNE3hw4et6+0T0NI5vli2H6dJCGzjX1r12s/FXUehLVadmvo2Nl3DN80YqAh1cVC6zYZAkpmGiVJ5g==} + /@typescript-eslint/experimental-utils/5.54.0_4lxevysaf7jvymq7c4erfx4ieu: + resolution: {integrity: sha512-rRYECOTh5V3iWsrOzXi7h1jp3Bi9OkJHrb3wECi3DVqMGTilo9wAYmCbT+6cGdrzUY3MWcAa2mESM6FMik6tVw==} 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 - eslint: 8.34.0 + '@typescript-eslint/utils': 5.54.0_4lxevysaf7jvymq7c4erfx4ieu + eslint: 8.35.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/parser/5.52.0_7kw3g6rralp5ps6mg3uyzz6azm: - resolution: {integrity: sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA==} + /@typescript-eslint/parser/5.54.0_4lxevysaf7jvymq7c4erfx4ieu: + resolution: {integrity: sha512-aAVL3Mu2qTi+h/r04WI/5PfNWvO6pdhpeMRWk9R7rEV4mwJNzoWf5CCU5vDKBsPIFQFjEq1xg7XBI2rjiMXQbQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1871,24 +1738,24 @@ packages: typescript: optional: true 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/scope-manager': 5.54.0 + '@typescript-eslint/types': 5.54.0 + '@typescript-eslint/typescript-estree': 5.54.0_vjs4wwfhdfzsrv6t7i2fdbohmm debug: 4.3.4 - eslint: 8.34.0 - typescript: 4.9.5 + eslint: 8.35.0 + typescript: 5.1.0-dev.20230227 transitivePeerDependencies: - supports-color - /@typescript-eslint/scope-manager/5.52.0: - resolution: {integrity: sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==} + /@typescript-eslint/scope-manager/5.54.0: + resolution: {integrity: sha512-VTPYNZ7vaWtYna9M4oD42zENOBrb+ZYyCNdFs949GcN8Miwn37b8b7eMj+EZaq7VK9fx0Jd+JhmkhjFhvnovhg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.52.0 - '@typescript-eslint/visitor-keys': 5.52.0 + '@typescript-eslint/types': 5.54.0 + '@typescript-eslint/visitor-keys': 5.54.0 - /@typescript-eslint/type-utils/5.52.0_7kw3g6rralp5ps6mg3uyzz6azm: - resolution: {integrity: sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==} + /@typescript-eslint/type-utils/5.54.0_4lxevysaf7jvymq7c4erfx4ieu: + resolution: {integrity: sha512-WI+WMJ8+oS+LyflqsD4nlXMsVdzTMYTxl16myXPaCXnSgc7LWwMsjxQFZCK/rVmTZ3FN71Ct78ehO9bRC7erYQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -1897,22 +1764,22 @@ 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.54.0_vjs4wwfhdfzsrv6t7i2fdbohmm + '@typescript-eslint/utils': 5.54.0_4lxevysaf7jvymq7c4erfx4ieu debug: 4.3.4 - eslint: 8.34.0 - tsutils: 3.21.0_typescript@4.9.5 - typescript: 4.9.5 + eslint: 8.35.0 + tsutils: 3.21.0_vjs4wwfhdfzsrv6t7i2fdbohmm + typescript: 5.1.0-dev.20230227 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types/5.52.0: - resolution: {integrity: sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==} + /@typescript-eslint/types/5.54.0: + resolution: {integrity: sha512-nExy+fDCBEgqblasfeE3aQ3NuafBUxZxgxXcYfzYRZFHdVvk5q60KhCSkG0noHgHRo/xQ/BOzURLZAafFpTkmQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /@typescript-eslint/typescript-estree/5.52.0_typescript@4.9.5: - resolution: {integrity: sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==} + /@typescript-eslint/typescript-estree/5.54.0_vjs4wwfhdfzsrv6t7i2fdbohmm: + resolution: {integrity: sha512-X2rJG97Wj/VRo5YxJ8Qx26Zqf0RRKsVHd4sav8NElhbZzhpBI8jU54i6hfo9eheumj4oO4dcRN1B/zIVEqR/MQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -1920,42 +1787,42 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.52.0 - '@typescript-eslint/visitor-keys': 5.52.0 + '@typescript-eslint/types': 5.54.0 + '@typescript-eslint/visitor-keys': 5.54.0 debug: 4.3.4 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: - resolution: {integrity: sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==} + /@typescript-eslint/utils/5.54.0_4lxevysaf7jvymq7c4erfx4ieu: + resolution: {integrity: sha512-cuwm8D/Z/7AuyAeJ+T0r4WZmlnlxQ8wt7C7fLpFlKMR+dY6QO79Cq1WpJhvZbMA4ZeZGHiRWnht7ZJ8qkdAunw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: '@types/json-schema': 7.0.11 '@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 - eslint: 8.34.0 + '@typescript-eslint/scope-manager': 5.54.0 + '@typescript-eslint/types': 5.54.0 + '@typescript-eslint/typescript-estree': 5.54.0_vjs4wwfhdfzsrv6t7i2fdbohmm + eslint: 8.35.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.34.0 + eslint-utils: 3.0.0_eslint@8.35.0 semver: 7.3.8 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys/5.52.0: - resolution: {integrity: sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==} + /@typescript-eslint/visitor-keys/5.54.0: + resolution: {integrity: sha512-xu4wT7aRCakGINTLGeyGqDn+78BwFlggwBjnHa1ar/KaGagnmwLYmlrXIrgAaQ3AE1Vd6nLfKASm7LrFHNbKGA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.52.0 + '@typescript-eslint/types': 5.54.0 eslint-visitor-keys: 3.3.0 /@vercel/webpack-asset-relocator-loader/1.7.3: @@ -1968,108 +1835,11 @@ packages: resolution: {integrity: sha512-PKVgdo8/GReqdx512F+ombhS+Bzogiofy1LgAj4tN8PfdBx3HSS7V5WfJotKTqtOWGwVfSWsrYN/t09/DSryrw==} engines: {node: '>=8', npm: '>=5'} dependencies: - '@babel/runtime': 7.20.13 + '@babel/runtime': 7.21.0 global: 4.4.0 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: @@ -2095,6 +1858,7 @@ packages: /acorn-walk/8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} + dev: true /acorn/8.8.2: resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} @@ -2108,13 +1872,7 @@ packages: debug: 4.3.4 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 + dev: true /ajv/6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -2145,52 +1903,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 @@ -2199,7 +1911,7 @@ packages: resolution: {integrity: sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==} dependencies: delegates: 1.0.0 - readable-stream: 2.3.7 + readable-stream: 2.3.8 dev: true /arg/4.1.3: @@ -2261,56 +1973,13 @@ 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 - /ast-types/0.13.4: - resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} - engines: {node: '>=4'} - dependencies: - 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==} @@ -2336,43 +2005,43 @@ packages: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} dependencies: - '@babel/runtime': 7.20.13 + '@babel/runtime': 7.21.0 cosmiconfig: 7.1.0 resolve: 1.22.1 dev: true - /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.20.12: + /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.21.0: resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.20.14 - '@babel/core': 7.20.12 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.12 + '@babel/compat-data': 7.21.0 + '@babel/core': 7.21.0 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.0 semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs3/0.6.0_@babel+core@7.20.12: + /babel-plugin-polyfill-corejs3/0.6.0_@babel+core@7.21.0: resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.12 - core-js-compat: 3.28.0 + '@babel/core': 7.21.0 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.0 + core-js-compat: 3.29.0 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-regenerator/0.4.1_@babel+core@7.20.12: + /babel-plugin-polyfill-regenerator/0.4.1_@babel+core@7.21.0: resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.12 + '@babel/core': 7.21.0 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.0 transitivePeerDependencies: - supports-color dev: true @@ -2384,21 +2053,21 @@ packages: /babel-preset-react-app/10.0.1: resolution: {integrity: sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==} dependencies: - '@babel/core': 7.20.12 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-decorators': 7.20.13_@babel+core@7.20.12 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-optional-chaining': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-private-property-in-object': 7.20.5_@babel+core@7.20.12 - '@babel/plugin-transform-flow-strip-types': 7.19.0_@babel+core@7.20.12 - '@babel/plugin-transform-react-display-name': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-runtime': 7.19.6_@babel+core@7.20.12 - '@babel/preset-env': 7.20.2_@babel+core@7.20.12 - '@babel/preset-react': 7.18.6_@babel+core@7.20.12 - '@babel/preset-typescript': 7.18.6_@babel+core@7.20.12 - '@babel/runtime': 7.20.13 + '@babel/core': 7.21.0 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-proposal-decorators': 7.21.0_@babel+core@7.21.0 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-proposal-optional-chaining': 7.21.0_@babel+core@7.21.0 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-proposal-private-property-in-object': 7.21.0_@babel+core@7.21.0 + '@babel/plugin-transform-flow-strip-types': 7.21.0_@babel+core@7.21.0 + '@babel/plugin-transform-react-display-name': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-runtime': 7.21.0_@babel+core@7.21.0 + '@babel/preset-env': 7.20.2_@babel+core@7.21.0 + '@babel/preset-react': 7.18.6_@babel+core@7.21.0 + '@babel/preset-typescript': 7.21.0_@babel+core@7.21.0 + '@babel/runtime': 7.21.0 babel-plugin-macros: 3.1.0 babel-plugin-transform-react-remove-prop-types: 0.4.24 transitivePeerDependencies: @@ -2413,31 +2082,12 @@ 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: buffer: 5.7.1 inherits: 2.0.4 - 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==} + readable-stream: 3.6.1 dev: true /body-parser/1.20.1: @@ -2464,23 +2114,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'} @@ -2492,38 +2131,11 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001456 - electron-to-chromium: 1.4.302 + caniuse-lite: 1.0.30001460 + electron-to-chromium: 1.4.320 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 +2143,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 +2151,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 +2164,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==} @@ -2596,8 +2176,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - /caniuse-lite/1.0.30001456: - resolution: {integrity: sha512-XFHJY5dUgmpMV25UqaD4kVq2LsiaU5rS8fb0f17pCoXQiQslzmFgnfOxfvo1bTpTqf7dwG/N/05CnLCnOEKmzA==} + /caniuse-lite/1.0.30001460: + resolution: {integrity: sha512-Bud7abqjvEjipUkpLs4D7gR0l8hBYBHoa+tGtKJHvT2AYzLp1z7EmVkUT4ERpVUfca8S2HGIVs883D8pUH1ZzQ==} /chalk/2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -2638,53 +2218,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 +2237,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 +2267,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,20 +2309,29 @@ packages: engines: {node: '>= 0.6'} dev: false - /core-js-compat/3.28.0: - resolution: {integrity: sha512-myzPgE7QodMg4nnd3K1TDoES/nADRStM8Gpz0D6nhkwbmwEnE0ZGJgoWsvQ722FR8D7xS0n0LV556RcEicjTyg==} + /copy-to-clipboard/3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + dependencies: + toggle-selection: 1.0.6 + dev: false + + /core-js-compat/3.29.0: + resolution: {integrity: sha512-ScMn3uZNAFhK2DGoEfErguoiAHhV2Ju+oJo/jK08p7B3f3UhocUrCCkTvnZaiS+edl5nlIoiBXKcwMc6elv4KQ==} 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==} + dev: true + + /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==} @@ -2820,14 +2344,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 +2356,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,19 +2371,13 @@ 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 - /data-uri-to-buffer/3.0.1: - resolution: {integrity: sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==} - engines: {node: '>= 6'} + /date-format/4.0.14: + resolution: {integrity: sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==} + engines: {node: '>=4.0'} dev: false /debug/2.6.9: @@ -2896,6 +2389,7 @@ packages: optional: true dependencies: ms: 2.0.0 + dev: false /debug/3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} @@ -2930,6 +2424,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==} @@ -2938,7 +2433,7 @@ packages: es-get-iterator: 1.1.3 get-intrinsic: 1.2.0 is-arguments: 1.1.1 - is-array-buffer: 3.0.1 + is-array-buffer: 3.0.2 is-date-object: 1.0.5 is-regex: 1.1.4 is-shared-array-buffer: 1.0.2 @@ -2961,14 +2456,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==} @@ -2977,19 +2473,10 @@ packages: has-property-descriptors: 1.0.0 object-keys: 1.1.1 - /degenerator/3.0.2: - resolution: {integrity: sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==} - engines: {node: '>= 6'} - dependencies: - ast-types: 0.13.4 - escodegen: 1.14.3 - esprima: 4.0.1 - vm2: 3.9.14 - dev: false - /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 +2498,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,106 +2552,17 @@ 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 + /electron-to-chromium/1.4.320: + resolution: {integrity: sha512-h70iRscrNluMZPVICXYl5SSB+rBKo22XfuIS1ER0OQxQZpKTnFpuS6coj7wY9M/3trv7OR88rRMOlKmRvDty7Q==} /emoji-regex/8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -3221,11 +2571,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 +2581,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: @@ -3278,7 +2611,7 @@ packages: has-proto: 1.0.1 has-symbols: 1.0.3 internal-slot: 1.0.5 - is-array-buffer: 3.0.1 + is-array-buffer: 3.0.2 is-callable: 1.2.7 is-negative-zero: 2.0.2 is-regex: 1.1.4 @@ -3311,9 +2644,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 +2665,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'} @@ -3356,20 +2681,7 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - /escodegen/1.14.3: - resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} - engines: {node: '>=4.0'} - hasBin: true - dependencies: - esprima: 4.0.1 - estraverse: 4.3.0 - esutils: 2.0.3 - optionator: 0.8.3 - optionalDependencies: - source-map: 0.6.1 - dev: false - - /eslint-config-react-app/7.0.1_tseuwpko2uhnzn4cv7fs2adf4m: + /eslint-config-react-app/7.0.1_y4rmfs3vf24zj7wehzed4qgo74: resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -3379,22 +2691,22 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.20.12 - '@babel/eslint-parser': 7.19.1_ydmbqfus77qykiqxhcwsorsqbq + '@babel/core': 7.21.0 + '@babel/eslint-parser': 7.19.1_zt6cfucldurvbyn2isj445jria '@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.54.0_mqamyc64mm623sdqp2cuitl6x4 + '@typescript-eslint/parser': 5.54.0_4lxevysaf7jvymq7c4erfx4ieu 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-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: 8.35.0 + eslint-plugin-flowtype: 8.0.3_4wfvnxdi7q4xn7cpwuonjvu574 + eslint-plugin-import: 2.27.5_ajyizmi44oc3hrc35l6ndh7p4e + eslint-plugin-jest: 25.7.0_5o6dkpzgpzf5bx4zdjzmg3to6m + eslint-plugin-jsx-a11y: 6.7.1_eslint@8.35.0 + eslint-plugin-react: 7.32.2_eslint@8.35.0 + eslint-plugin-react-hooks: 4.6.0_eslint@8.35.0 + eslint-plugin-testing-library: 5.10.2_4lxevysaf7jvymq7c4erfx4ieu + typescript: 5.1.0-dev.20230227 transitivePeerDependencies: - '@babel/plugin-syntax-flow' - '@babel/plugin-transform-react-jsx' @@ -3413,7 +2725,7 @@ packages: transitivePeerDependencies: - supports-color - /eslint-module-utils/2.7.4_npjqex3ey3rgd34fjcuucz7la4: + /eslint-module-utils/2.7.4_qynxowrxvm2kj5rbowcxf5maga: resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} engines: {node: '>=4'} peerDependencies: @@ -3434,14 +2746,14 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + '@typescript-eslint/parser': 5.54.0_4lxevysaf7jvymq7c4erfx4ieu debug: 3.2.7 - eslint: 8.34.0 + eslint: 8.35.0 eslint-import-resolver-node: 0.3.7 transitivePeerDependencies: - supports-color - /eslint-plugin-flowtype/8.0.3_5khfkqgka3gftezlren2b6mcy4: + /eslint-plugin-flowtype/8.0.3_4wfvnxdi7q4xn7cpwuonjvu574: resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -3449,14 +2761,14 @@ packages: '@babel/plugin-transform-react-jsx': ^7.14.9 eslint: ^8.1.0 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 - eslint: 8.34.0 + '@babel/plugin-syntax-flow': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-react-jsx': 7.21.0_@babel+core@7.21.0 + eslint: 8.35.0 lodash: 4.17.21 string-natural-compare: 3.0.1 dev: true - /eslint-plugin-import/2.27.5_mcvs2y73sfmcxqzpjj5lr7a2m4: + /eslint-plugin-import/2.27.5_ajyizmi44oc3hrc35l6ndh7p4e: resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} engines: {node: '>=4'} peerDependencies: @@ -3466,15 +2778,15 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + '@typescript-eslint/parser': 5.54.0_4lxevysaf7jvymq7c4erfx4ieu array-includes: 3.1.6 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.34.0 + eslint: 8.35.0 eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.7.4_npjqex3ey3rgd34fjcuucz7la4 + eslint-module-utils: 2.7.4_qynxowrxvm2kj5rbowcxf5maga has: 1.0.3 is-core-module: 2.11.0 is-glob: 4.0.3 @@ -3482,13 +2794,13 @@ packages: object.values: 1.1.6 resolve: 1.22.1 semver: 6.3.0 - tsconfig-paths: 3.14.1 + tsconfig-paths: 3.14.2 transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - /eslint-plugin-jest/25.7.0_7hfwvekd5cgjoxqyvesymwuacm: + /eslint-plugin-jest/25.7.0_5o6dkpzgpzf5bx4zdjzmg3to6m: resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} peerDependencies: @@ -3501,21 +2813,21 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.52.0_6cfvjsbua5ptj65675bqcn6oza - '@typescript-eslint/experimental-utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm - eslint: 8.34.0 + '@typescript-eslint/eslint-plugin': 5.54.0_mqamyc64mm623sdqp2cuitl6x4 + '@typescript-eslint/experimental-utils': 5.54.0_4lxevysaf7jvymq7c4erfx4ieu + eslint: 8.35.0 transitivePeerDependencies: - supports-color - typescript dev: true - /eslint-plugin-jsx-a11y/6.7.1_eslint@8.34.0: + /eslint-plugin-jsx-a11y/6.7.1_eslint@8.35.0: resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} engines: {node: '>=4.0'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - '@babel/runtime': 7.20.13 + '@babel/runtime': 7.21.0 aria-query: 5.1.3 array-includes: 3.1.6 array.prototype.flatmap: 1.3.1 @@ -3524,7 +2836,7 @@ packages: axobject-query: 3.1.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 8.34.0 + eslint: 8.35.0 has: 1.0.3 jsx-ast-utils: 3.3.3 language-tags: 1.0.5 @@ -3534,16 +2846,16 @@ packages: semver: 6.3.0 dev: true - /eslint-plugin-react-hooks/4.6.0_eslint@8.34.0: + /eslint-plugin-react-hooks/4.6.0_eslint@8.35.0: resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: - eslint: 8.34.0 + eslint: 8.35.0 dev: true - /eslint-plugin-react/7.32.2_eslint@8.34.0: + /eslint-plugin-react/7.32.2_eslint@8.35.0: resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} engines: {node: '>=4'} peerDependencies: @@ -3553,7 +2865,7 @@ packages: array.prototype.flatmap: 1.3.1 array.prototype.tosorted: 1.1.1 doctrine: 2.1.0 - eslint: 8.34.0 + eslint: 8.35.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.3 minimatch: 3.1.2 @@ -3567,14 +2879,14 @@ packages: string.prototype.matchall: 4.0.8 dev: true - /eslint-plugin-testing-library/5.10.2_7kw3g6rralp5ps6mg3uyzz6azm: + /eslint-plugin-testing-library/5.10.2_4lxevysaf7jvymq7c4erfx4ieu: 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 - eslint: 8.34.0 + '@typescript-eslint/utils': 5.54.0_4lxevysaf7jvymq7c4erfx4ieu + eslint: 8.35.0 transitivePeerDependencies: - supports-color - typescript @@ -3586,6 +2898,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==} @@ -3594,13 +2907,13 @@ packages: esrecurse: 4.3.0 estraverse: 5.3.0 - /eslint-utils/3.0.0_eslint@8.34.0: + /eslint-utils/3.0.0_eslint@8.35.0: resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: eslint: '>=5' dependencies: - eslint: 8.34.0 + eslint: 8.35.0 eslint-visitor-keys: 2.1.0 /eslint-visitor-keys/2.1.0: @@ -3611,12 +2924,13 @@ packages: resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /eslint/8.34.0: - resolution: {integrity: sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==} + /eslint/8.35.0: + resolution: {integrity: sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint/eslintrc': 1.4.1 + '@eslint/eslintrc': 2.0.0 + '@eslint/js': 8.35.0 '@humanwhocodes/config-array': 0.11.8 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 @@ -3627,10 +2941,10 @@ packages: doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.1.1 - eslint-utils: 3.0.0_eslint@8.34.0 + eslint-utils: 3.0.0_eslint@8.35.0 eslint-visitor-keys: 3.3.0 espree: 9.4.1 - esquery: 1.4.2 + esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 @@ -3666,14 +2980,8 @@ packages: acorn-jsx: 5.3.2_acorn@8.8.2 eslint-visitor-keys: 3.3.0 - /esprima/4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: false - - /esquery/1.4.2: - resolution: {integrity: sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==} + /esquery/1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 @@ -3687,6 +2995,7 @@ packages: /estraverse/4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} engines: {node: '>=4.0'} + dev: true /estraverse/5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} @@ -3701,10 +3010,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 +3054,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,29 +3078,12 @@ 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} dependencies: flat-cache: 3.0.4 - /file-uri-to-path/2.0.0: - resolution: {integrity: sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==} - 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 +3127,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 +3134,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==} @@ -3909,22 +3150,13 @@ packages: resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} dependencies: inherits: 2.0.4 - readable-stream: 2.3.7 + readable-stream: 2.3.8 dev: true /fs-constants/1.0.0: 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 +3173,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,36 +3185,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'} - dependencies: - readable-stream: 1.1.14 - xregexp: 2.0.0 - dev: false - /function-bind/1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} @@ -4030,6 +3236,7 @@ packages: engines: {node: '>=8'} dependencies: pump: 3.0.0 + dev: false /get-symbol-description/1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} @@ -4038,20 +3245,6 @@ packages: call-bind: 1.0.2 get-intrinsic: 1.2.0 - /get-uri/3.0.2: - resolution: {integrity: sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==} - engines: {node: '>= 6'} - dependencies: - '@tootallnate/once': 1.1.2 - data-uri-to-buffer: 3.0.1 - debug: 4.3.4 - file-uri-to-path: 2.0.0 - fs-extra: 8.1.0 - ftp: 0.3.10 - transitivePeerDependencies: - - supports-color - dev: false - /github-from-package/0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} dev: true @@ -4068,9 +3261,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 +3271,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 +3325,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==} @@ -4200,23 +3373,6 @@ packages: dependencies: function-bind: 1.1.1 - /hls-download/2.6.10: - resolution: {integrity: sha512-WDJptONvrk94P78Q6sQUSLQErRZIP0Ojs1bQvYDcEDx+m0Lw24Cgg8cih0nx3/0tmDfTG178S9rgK2GO09/9RQ==} - dependencies: - got: 11.8.6 - proxy-agent: 5.0.0 - sei-helper: 3.3.0 - transitivePeerDependencies: - - 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 +3384,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==} @@ -4240,34 +3397,13 @@ packages: toidentifier: 1.0.1 dev: false - /http-proxy-agent/4.0.1: - resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} - engines: {node: '>= 6'} - dependencies: - '@tootallnate/once': 1.1.2 - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - 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==} @@ -4277,17 +3413,7 @@ packages: debug: 4.3.4 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==} @@ -4296,22 +3422,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 @@ -4361,14 +3471,6 @@ packages: p-is-promise: 3.0.0 dev: true - /ip/1.1.8: - resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} - dev: false - - /ip/2.0.0: - resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} - dev: false - /ipaddr.js/1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -4382,8 +3484,8 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-array-buffer/3.0.1: - resolution: {integrity: sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==} + /is-array-buffer/3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.0 @@ -4398,13 +3500,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 +3511,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 +3528,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,8 +3631,11 @@ packages: get-intrinsic: 1.2.0 dev: true - /isarray/0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + /is-wsl/2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 dev: false /isarray/1.0.0: @@ -4549,18 +3646,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 +3653,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 +3677,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 +3689,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 +3704,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 +3725,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,18 +3737,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'} - dependencies: - prelude-ls: 1.1.2 - type-check: 0.3.2 - dev: false - /levn/0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -4695,19 +3748,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'} @@ -4725,6 +3765,19 @@ packages: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} dev: true + /log4js/6.8.0: + resolution: {integrity: sha512-g+V8gZyurIexrOvWQ+AcZsIvuK/lBnx2argejZxL4gVZ4Hq02kUYH6WZOnqxgBml+zzQZYdaEoTN84B6Hzm8Fg==} + engines: {node: '>=8.0'} + dependencies: + date-format: 4.0.14 + debug: 4.3.4 + flatted: 3.2.7 + rfdc: 1.3.0 + streamroller: 3.1.5 + transitivePeerDependencies: + - supports-color + dev: false + /lookpath/1.2.2: resolution: {integrity: sha512-k2Gmn8iV6qdME3ztZC2spubmQISimFOPLuQKiPaLcVdRz0IpdxrNClVepMlyTJlhodm/zG/VfbkWERm3kUIh+Q==} engines: {npm: '>=6.13.4'} @@ -4741,6 +3794,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==} @@ -4762,7 +3816,7 @@ packages: /m3u8-parser/4.8.0: resolution: {integrity: sha512-UqA2a/Pw3liR6Df3gwxrqghCP17OpPlQj6RBPLYygf/ZSQ4MoSgvdvhvt35qV+3NaaA0FSZx93Ix+2brT1U7cA==} dependencies: - '@babel/runtime': 7.20.13 + '@babel/runtime': 7.21.0 '@videojs/vhs-utils': 3.0.5 global: 4.4.0 dev: false @@ -4771,33 +3825,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 +3853,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 +3868,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 +3881,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 +3889,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==} @@ -4919,13 +3915,7 @@ packages: resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==} dependencies: once: 1.4.0 - 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 + readable-stream: 3.6.1 dev: true /napi-build-utils/1.0.2: @@ -4944,30 +3934,12 @@ 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'} - dev: false - /node-abi/2.30.1: resolution: {integrity: sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==} dependencies: 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 +3952,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 +3983,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,16 +4053,13 @@ packages: dependencies: wrappy: 1.0.2 - /optionator/0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} - engines: {node: '>= 0.8.0'} + /open/8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.3.0 - prelude-ls: 1.1.2 - type-check: 0.3.2 - word-wrap: 1.2.3 + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 dev: false /optionator/0.9.1: @@ -5122,6 +4076,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==} @@ -5140,32 +4095,6 @@ packages: dependencies: p-limit: 3.1.0 - /pac-proxy-agent/5.0.0: - resolution: {integrity: sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==} - engines: {node: '>= 8'} - dependencies: - '@tootallnate/once': 1.1.2 - agent-base: 6.0.2 - debug: 4.3.4 - get-uri: 3.0.2 - http-proxy-agent: 4.0.1 - https-proxy-agent: 5.0.1 - pac-resolver: 5.0.1 - raw-body: 2.5.1 - socks-proxy-agent: 5.0.1 - transitivePeerDependencies: - - supports-color - dev: false - - /pac-resolver/5.0.1: - resolution: {integrity: sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==} - engines: {node: '>= 8'} - dependencies: - degenerator: 3.0.2 - ip: 1.1.8 - netmask: 2.0.2 - dev: false - /parent-module/1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -5223,10 +4152,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 +4204,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'} @@ -5369,11 +4224,6 @@ packages: tunnel-agent: 0.6.0 dev: true - /prelude-ls/1.1.2: - resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} - engines: {node: '>= 0.8.0'} - dev: false - /prelude-ls/1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -5408,26 +4258,6 @@ packages: ipaddr.js: 1.9.1 dev: false - /proxy-agent/5.0.0: - resolution: {integrity: sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==} - engines: {node: '>= 8'} - dependencies: - agent-base: 6.0.2 - debug: 4.3.4 - http-proxy-agent: 4.0.1 - https-proxy-agent: 5.0.1 - lru-cache: 5.1.1 - pac-proxy-agent: 5.0.0 - proxy-from-env: 1.1.0 - socks-proxy-agent: 5.0.1 - transitivePeerDependencies: - - supports-color - dev: false - - /proxy-from-env/1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: false - /pump/3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} dependencies: @@ -5451,11 +4281,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,28 +4312,8 @@ 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: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 0.0.1 - string_decoder: 0.10.31 - dev: false - - /readable-stream/2.3.7: - resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} + /readable-stream/2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -5518,8 +4324,8 @@ packages: util-deprecate: 1.0.2 dev: true - /readable-stream/3.6.0: - resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} + /readable-stream/3.6.1: + resolution: {integrity: sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==} engines: {node: '>= 6'} dependencies: inherits: 2.0.4 @@ -5527,13 +4333,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'} @@ -5551,7 +4350,7 @@ packages: /regenerator-transform/0.15.1: resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} dependencies: - '@babel/runtime': 7.20.13 + '@babel/runtime': 7.21.0 dev: true /regexp.prototype.flags/1.4.3: @@ -5597,6 +4396,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,30 +4423,22 @@ 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==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + /rfdc/1.3.0: + resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + dev: false + /rimraf/3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true 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 +4460,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 +4475,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 +4503,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,76 +4556,10 @@ 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'} - - /socks-proxy-agent/5.0.1: - resolution: {integrity: sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==} - engines: {node: '>= 6'} - dependencies: - agent-base: 6.0.2 - debug: 4.3.4 - socks: 2.7.1 - transitivePeerDependencies: - - supports-color - dev: false - - /socks/2.7.1: - resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} - engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} - dependencies: - ip: 2.0.0 - 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 - 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'} @@ -5889,9 +4575,20 @@ packages: /stream-meter/1.0.4: resolution: {integrity: sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==} dependencies: - readable-stream: 2.3.7 + readable-stream: 2.3.8 dev: true + /streamroller/3.1.5: + resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==} + engines: {node: '>=8.0'} + dependencies: + date-format: 4.0.14 + debug: 4.3.4 + fs-extra: 8.1.0 + transitivePeerDependencies: + - supports-color + dev: false + /string-natural-compare/3.0.1: resolution: {integrity: sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==} dev: true @@ -5940,10 +4637,6 @@ packages: define-properties: 1.2.0 es-abstract: 1.21.1 - /string_decoder/0.10.31: - resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} - dev: false - /string_decoder/1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: @@ -5982,24 +4675,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 +4687,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: @@ -6043,77 +4708,12 @@ packages: end-of-stream: 1.4.4 fs-constants: 1.0.0 inherits: 2.0.4 - readable-stream: 3.6.0 + readable-stream: 3.6.1 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 +4724,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 +4737,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_xvqu66keneofebty6bzlkwfjuy: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -6173,20 +4756,20 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 18.14.0 + '@types/node': 18.14.6 acorn: 8.8.2 acorn-walk: 8.2.0 arg: 4.1.3 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 - /tsconfig-paths/3.14.1: - resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} + /tsconfig-paths/3.14.2: + resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} dependencies: '@types/json5': 0.0.29 json5: 1.0.2 @@ -6196,18 +4779,14 @@ packages: /tslib/1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - /tslib/2.5.0: - 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==} @@ -6215,25 +4794,12 @@ packages: safe-buffer: 5.2.1 dev: true - /type-check/0.3.2: - resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.1.2 - dev: false - /type-check/0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} 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 +4823,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 +4862,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 +4892,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,80 +4910,10 @@ 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'} - hasBin: true - dependencies: - acorn: 8.8.2 - 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,14 +4978,17 @@ 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 - - /xregexp/2.0.0: - resolution: {integrity: sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==} + /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 /y18n/5.0.8: @@ -6523,6 +5019,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==} @@ -6537,8 +5034,8 @@ packages: yargs-parser: 20.2.9 dev: true - /yargs/17.7.0: - resolution: {integrity: sha512-dwqOPg5trmrre9+v8SUo2q/hAwyKoVfu8OC1xPHKJGNdxAvPl4sKxL4vBnh3bQz/ZvvGAFeA5H3ou2kcOY8sQQ==} + /yargs/17.7.1: + resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} engines: {node: '>=12'} dependencies: cliui: 8.0.1 @@ -6548,13 +5045,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..b3c33ae 100644 --- a/tsc.ts +++ b/tsc.ts @@ -2,7 +2,6 @@ import { ChildProcess, exec } from 'child_process'; import fs from 'fs-extra'; import path from 'path'; import { removeSync, copyFileSync } from 'fs-extra'; -import packageJSON from './package.json'; const argv = process.argv.slice(2); let buildIgnore: string[] = []; @@ -13,12 +12,14 @@ const isGUI = !(argv.length > 1 && argv[1] === 'false'); if (!isTest) buildIgnore = [ '*/\\.env', + './config/setup.json' ]; if (!isGUI) buildIgnore = buildIgnore.concat([ './gui*', - './build*' + './build*', + 'gui.ts' ]); @@ -77,6 +78,10 @@ export { ignore }; const react = exec('pnpm run build', { cwd: path.join(__dirname, 'gui', 'react'), + env: { + ...process.env, + CI: 'false' + } }); await waitForProcess(react); @@ -84,7 +89,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 +104,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 +114,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