diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 857cfce0..aa03719a 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -1,47 +1,37 @@ module.exports = { - extends: [ - 'airbnb', - 'airbnb/hooks', - 'eslint:recommended', - 'plugin:import/recommended', - 'plugin:import/typescript', - 'plugin:@typescript-eslint/recommended', - 'plugin:@typescript-eslint/stylistic', - 'plugin:react/recommended', - 'plugin:react/jsx-runtime', - 'plugin:react-hooks/recommended', - 'plugin:jsx-a11y/recommended', - ], - env: { - node: true, - browser: true, - }, + extends: ['mifi'], rules: { - 'max-len': 0, - 'import/no-extraneous-dependencies': ['error', { - devDependencies: true, - optionalDependencies: false, - }], 'no-console': 0, 'jsx-a11y/click-events-have-key-events': 0, 'jsx-a11y/interactive-supports-focus': 0, - 'react/jsx-one-expression-per-line': 0, - 'object-curly-newline': 0, - 'arrow-parens': 0, 'jsx-a11y/control-has-associated-label': 0, - 'react/prop-types': 0, - 'no-multiple-empty-lines': ['error', { max: 2, maxBOF: 0, maxEOF: 0 }], - 'no-promise-executor-return': 0, - 'react/function-component-definition': 0, - 'no-constant-binary-expression': 'error', + 'unicorn/prefer-node-protocol': 0, // todo '@typescript-eslint/no-var-requires': 0, // todo 'react/display-name': 0, // todo - '@typescript-eslint/no-unused-vars': 0, // todo - 'import/extensions': 0, // doesn't work with TS https://github.com/import-js/eslint-plugin-import/issues/2111 - 'react/jsx-filename-extension': ['error', { extensions: ['.jsx', '.tsx'] }], - 'react/require-default-props': 0, - }, - parserOptions: { - ecmaVersion: 2022, }, + + overrides: [ + { + files: ['./src/**/*.{js,cjs,mjs,jsx,ts,tsx,mts}'], + env: { + node: false, + browser: true, + }, + rules: { + 'import/no-extraneous-dependencies': ['error', { + devDependencies: true, + optionalDependencies: false, + }], + }, + }, + { + files: ['./script/**/*.{js,cjs,mjs,jsx,ts,tsx,mts}', 'vite.config.js'], + rules: { + 'import/no-extraneous-dependencies': ['error', { + devDependencies: true, + optionalDependencies: false, + }], + }, + }, + ], }; diff --git a/developer-notes.md b/developer-notes.md index a8950c24..43fee72c 100644 --- a/developer-notes.md +++ b/developer-notes.md @@ -21,10 +21,10 @@ Note: `yarn` may take some time to complete. Run one of the below commands: ```bash -npm run download-ffmpeg-darwin-x64 -npm run download-ffmpeg-darwin-arm64 -npm run download-ffmpeg-linux-x64 -npm run download-ffmpeg-win32-x64 +yarn download-ffmpeg-darwin-x64 +yarn download-ffmpeg-darwin-arm64 +yarn download-ffmpeg-linux-x64 +yarn download-ffmpeg-win32-x64 ``` For Windows, you may have to install [7z](https://www.7-zip.org/download.html), and then put the 7z folder in your `PATH`. @@ -32,7 +32,7 @@ For Windows, you may have to install [7z](https://www.7-zip.org/download.html), ### Running ```bash -npm start +yarn dev ``` ## `mas-dev` (Mac App Store) local build @@ -40,7 +40,7 @@ npm start This will sign using the development provisioning profile: ``` -npm run pack-mas-dev +yarn pack-mas-dev ``` MAS builds have some restrictions, see `isMasBuild` variable in code. In particular, any file cannot be read without the user's consent. @@ -86,7 +86,7 @@ For per-platform build/signing setup, see [this article](https://mifi.no/blog/au - If Mac App Store / Windows Store - Merge `stores` into `master` - Bump [snap version](https://snapcraft.io/losslesscut/listing) -- `npm run scan-i18n` to get the newest English strings and push so weblate gets them +- `yarn scan-i18n` to get the newest English strings and push so weblate gets them ## Minimum OS version @@ -100,7 +100,7 @@ Minimum supported OS versions for Electron. As of electron 22: How to check the value: ```bash -npm run pack-mas-dev +yarn pack-mas-dev cat dist/mas-dev-arm64/LosslessCut.app/Contents/Info.plist ``` @@ -126,7 +126,7 @@ Links: - package.json ### i18n -`npm run scan-i18n` +`yarn scan-i18n` ### Licenses @@ -139,7 +139,7 @@ npx license-checker --summary #### Regenerate licenses file ``` -npm run generate-licenses +yarn generate-licenses #cp licenses.txt losslesscut.mifi.no/public/ ``` Then deploy. diff --git a/i18next-parser.config.mjs b/i18next-parser.config.mjs index fe8840cd..4bb1dc26 100644 --- a/i18next-parser.config.mjs +++ b/i18next-parser.config.mjs @@ -1,3 +1,4 @@ +// eslint-disable-line unicorn/filename-case export default { input: ['src/**/*.{js,jsx,ts,tsx}', 'public/*.{js,ts}'], diff --git a/package.json b/package.json index ff374b07..a1957d91 100644 --- a/package.json +++ b/package.json @@ -7,9 +7,9 @@ "main": "public/electron.js", "homepage": "./", "scripts": { - "start": "concurrently -k \"npm run start:frontend\" \"npm run start:electron\"", - "start:frontend": "cross-env vite --port 3001", - "start:electron": "wait-on tcp:3001 && electron .", + "dev": "concurrently -k \"npm run dev:frontend\" \"npm run dev:electron\"", + "dev:frontend": "cross-env vite --port 3001", + "dev:electron": "wait-on tcp:3001 && electron .", "icon-gen": "mkdirp icon-build build-resources/appx && node script/icon-gen.mjs", "download-ffmpeg-darwin-x64": "mkdirp ffmpeg/darwin-x64 && cd ffmpeg/darwin-x64 && wget https://github.com/mifi/ffmpeg-build-script/releases/download/6.0-1/ffmpeg-macos-X64 -O ffmpeg && wget https://github.com/mifi/ffmpeg-build-script/releases/download/6.0-1/ffprobe-macos-X64 -O ffprobe && chmod +x ffmpeg && chmod +x ffprobe", "download-ffmpeg-darwin-arm64": "mkdirp ffmpeg/darwin-arm64 && cd ffmpeg/darwin-arm64 && wget https://github.com/mifi/ffmpeg-build-script/releases/download/6.0-1/ffmpeg-macos-ARM64 -O ffmpeg && wget https://github.com/mifi/ffmpeg-build-script/releases/download/6.0-1/ffprobe-macos-ARM64 -O ffprobe && chmod +x ffmpeg && chmod +x ffprobe", @@ -18,7 +18,7 @@ "build": "yarn icon-gen && vite build --outDir vite-dist", "tsc": "tsc --build", "test": "vitest", - "lint": "eslint --ext .jsx --ext .js . --ext .mjs", + "lint": "eslint --ext .js,.ts,.jsx,.tsx,.mjs .", "pack-mac": "electron-builder --mac -m dmg", "prepack-mac": "yarn build", "pack-mas-dev": "electron-builder --mac -m mas-dev -c.mas.provisioningProfile=LosslessCut_Dev.provisionprofile -c.mas.identity='Apple Development: Mikael Finstad (JH4PH8B3C8)'", @@ -47,10 +47,11 @@ "@radix-ui/react-switch": "^1.0.1", "@tsconfig/strictest": "^2.0.2", "@tsconfig/vite-react": "^3.0.0", + "@types/eslint": "^8", "@types/lodash": "^4.14.202", "@types/sortablejs": "^1.15.0", - "@typescript-eslint/eslint-plugin": "^6.17.0", - "@typescript-eslint/parser": "^6.17.0", + "@typescript-eslint/eslint-plugin": "^6.12.0", + "@typescript-eslint/parser": "^6.12.0", "@uidotdev/usehooks": "^2.4.1", "@vitejs/plugin-react": "^3.1.0", "color": "^3.1.0", @@ -61,13 +62,13 @@ "electron": "^27.0.0", "electron-builder": "^24.6.4", "electron-devtools-installer": "^3.2.0", - "eslint": "^8.53.0", - "eslint-config-airbnb": "^19.0.4", - "eslint-import-resolver-typescript": "^3.6.1", + "eslint": "^8.2.0", + "eslint-config-mifi": "^0.0.3", "eslint-plugin-import": "^2.25.3", "eslint-plugin-jsx-a11y": "^6.5.1", "eslint-plugin-react": "^7.28.0", "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-unicorn": "^51.0.1", "evergreen-ui": "^6.13.1", "fast-xml-parser": "^4.2.5", "framer-motion": "^9.0.3", @@ -97,7 +98,7 @@ "sortablejs": "^1.13.0", "sweetalert2": "^11.0.0", "sweetalert2-react-content": "^5.0.7", - "typescript": "^5.3.3", + "typescript": "~5.2.0", "typescript-plugin-css-modules": "^5.1.0", "use-debounce": "^5.1.0", "use-trace-update": "^1.3.0", @@ -132,9 +133,6 @@ "winston": "^3.8.1", "yargs-parser": "^21.0.0" }, - "eslintConfig": { - "extends": "react-app" - }, "build": { "directories": { "buildResources": "build-resources" diff --git a/public/compatPlayer.js b/public/compatPlayer.js index 827841f0..362fc0fd 100644 --- a/public/compatPlayer.js +++ b/public/compatPlayer.js @@ -7,6 +7,7 @@ function createMediaSourceStream({ path, videoStreamIndex, audioStreamIndex, see logger.info('Starting preview process', { videoStreamIndex, audioStreamIndex, seekTo }); const process = createMediaSourceProcess({ path, videoStreamIndex, audioStreamIndex, seekTo, size, fps }); + // eslint-disable-next-line unicorn/prefer-add-event-listener abortController.signal.onabort = () => { logger.info('Aborting preview process', { videoStreamIndex, audioStreamIndex, seekTo }); process.kill('SIGKILL'); @@ -64,7 +65,7 @@ function createMediaSourceStream({ path, videoStreamIndex, audioStreamIndex, see if (!err.killed) { console.warn(err.message); - console.warn(stderr.toString('utf-8')); + console.warn(stderr.toString('utf8')); } } })(); @@ -76,6 +77,7 @@ function readOneJpegFrameWrapper({ path, seekTo, videoStreamIndex }) { const abortController = new AbortController(); const process = readOneJpegFrame({ path, seekTo, videoStreamIndex }); + // eslint-disable-next-line unicorn/prefer-add-event-listener abortController.signal.onabort = () => process.kill('SIGKILL'); function abort() { diff --git a/public/configStore.js b/public/configStore.js index e8d27d29..d70f5047 100644 --- a/public/configStore.js +++ b/public/configStore.js @@ -1,4 +1,5 @@ const Store = require('electron-store'); +// eslint-disable-next-line import/no-extraneous-dependencies const electron = require('electron'); const os = require('os'); const { join, dirname } = require('path'); @@ -175,7 +176,7 @@ async function tryCreateStore({ customStoragePath }) { return; } catch (err) { // eslint-disable-next-line no-await-in-loop - await new Promise(r => setTimeout(r, 2000)); + await new Promise((r) => setTimeout(r, 2000)); logger.error('Failed to create config store, retrying', err); } } @@ -198,11 +199,9 @@ async function init() { } const cleanupChoices = store.get('cleanupChoices'); // todo remove after a while - if (cleanupChoices != null) { - if (cleanupChoices.closeFile == null) { - logger.info('Migrating cleanupChoices.closeFile'); - set('cleanupChoices', { ...cleanupChoices, closeFile: true }); - } + if (cleanupChoices != null && cleanupChoices.closeFile == null) { + logger.info('Migrating cleanupChoices.closeFile'); + set('cleanupChoices', { ...cleanupChoices, closeFile: true }); } } diff --git a/public/contextMenu.js b/public/contextMenu.js index fd1c5a0e..16a30a14 100644 --- a/public/contextMenu.js +++ b/public/contextMenu.js @@ -1,3 +1,4 @@ +// eslint-disable-next-line import/no-extraneous-dependencies const { Menu } = require('electron'); // https://github.com/electron/electron/issues/4068#issuecomment-274159726 diff --git a/public/electron.js b/public/electron.js index bb824da5..425bf185 100644 --- a/public/electron.js +++ b/public/electron.js @@ -1,6 +1,7 @@ process.traceDeprecation = true; process.traceProcessWarnings = true; +// eslint-disable-next-line import/no-extraneous-dependencies const electron = require('electron'); const isDev = require('electron-is-dev'); const unhandled = require('electron-unhandled'); @@ -14,7 +15,7 @@ const { stat } = require('fs/promises'); const logger = require('./logger'); const menu = require('./menu'); const configStore = require('./configStore'); -const { frontendBuildDir, isLinux, isWindows } = require('./util'); +const { frontendBuildDir, isLinux } = require('./util'); const attachContextMenu = require('./contextMenu'); const HttpServer = require('./httpServer'); @@ -298,6 +299,7 @@ function initApp() { // Call this immediately, to make sure we don't miss it (race condition) const readyPromise = app.whenReady(); +// eslint-disable-next-line unicorn/prefer-top-level-await (async () => { try { logger.info('Initializing config store'); @@ -343,8 +345,8 @@ const readyPromise = app.whenReady(); const { default: installExtension, REACT_DEVELOPER_TOOLS } = require('electron-devtools-installer'); // eslint-disable-line global-require,import/no-extraneous-dependencies installExtension(REACT_DEVELOPER_TOOLS) - .then(name => logger.info('Added Extension', name)) - .catch(err => logger.error('Failed to add extension', err)); + .then((name) => logger.info('Added Extension', name)) + .catch((err) => logger.error('Failed to add extension', err)); } createWindow(); diff --git a/public/ffmpeg.js b/public/ffmpeg.js index 81c786d4..2adf0329 100644 --- a/public/ffmpeg.js +++ b/public/ffmpeg.js @@ -18,8 +18,7 @@ function setCustomFfPath(path) { } function getFfCommandLine(cmd, args) { - const mapArg = arg => (/[^0-9a-zA-Z-_]/.test(arg) ? `'${arg}'` : arg); - return `${cmd} ${args.map(mapArg).join(' ')}`; + return `${cmd} ${args.map((arg) => (/[^\w-]/.test(arg) ? `'${arg}'` : arg)).join(' ')}`; } function getFfPath(cmd) { @@ -56,8 +55,10 @@ function handleProgress(process, durationIn, onProgress, customMatcher = () => u // console.log('progress', line); try { + // eslint-disable-next-line unicorn/better-regex let match = line.match(/frame=\s*[^\s]+\s+fps=\s*[^\s]+\s+q=\s*[^\s]+\s+(?:size|Lsize)=\s*[^\s]+\s+time=\s*([^\s]+)\s+/); // Audio only looks like this: "line size= 233422kB time=01:45:50.68 bitrate= 301.1kbits/s speed= 353x " + // eslint-disable-next-line unicorn/better-regex if (!match) match = line.match(/(?:size|Lsize)=\s*[^\s]+\s+time=\s*([^\s]+)\s+/); if (!match) { customMatcher(line); @@ -108,7 +109,7 @@ function runFfmpegProcess(args, customExecaOptions, { logCli = true } = {}) { runningFfmpegs.add(process); try { await process; - } catch (err) { + } catch { // ignored here } finally { runningFfmpegs.delete(process); @@ -246,10 +247,11 @@ async function detectSceneChanges({ filePath, minChange, onProgress, from, to }) handleProgress(process, to - from, onProgress); const rl = readline.createInterface({ input: process.stdout }); rl.on('line', (line) => { + // eslint-disable-next-line unicorn/better-regex const match = line.match(/^frame:\d+\s+pts:\d+\s+pts_time:([\d.]+)/); if (!match) return; const time = parseFloat(match[1]); - if (Number.isNaN(time) || time <= times[times.length - 1]) return; + if (Number.isNaN(time) || time <= times.at(-1)) return; times.push(time); }); @@ -288,6 +290,7 @@ const mapFilterOptions = (options) => Object.entries(options).map(([key, value]) async function blackDetect({ filePath, filterOptions, onProgress, from, to }) { function matchLineTokens(line) { + // eslint-disable-next-line unicorn/better-regex const match = line.match(/^[blackdetect\s*@\s*0x[0-9a-f]+] black_start:([\d\\.]+) black_end:([\d\\.]+) black_duration:[\d\\.]+/); if (!match) return {}; return { @@ -301,6 +304,7 @@ async function blackDetect({ filePath, filterOptions, onProgress, from, to }) { async function silenceDetect({ filePath, filterOptions, onProgress, from, to }) { function matchLineTokens(line) { + // eslint-disable-next-line unicorn/better-regex const match = line.match(/^[silencedetect\s*@\s*0x[0-9a-f]+] silence_end: ([\d\\.]+)[|\s]+silence_duration: ([\d\\.]+)/); if (!match) return {}; const end = parseFloat(match[1]); @@ -409,6 +413,7 @@ async function html5ify({ outPath, filePath: filePathArg, speed, hasAudio, hasVi switch (video) { case 'hq': { + // eslint-disable-next-line unicorn/prefer-ternary if (isMac) { videoArgs = ['-vf', 'format=yuv420p', '-allow_sw', '1', '-vcodec', 'h264', '-b:v', '15M']; } else { @@ -423,6 +428,7 @@ async function html5ify({ outPath, filePath: filePathArg, speed, hasAudio, hasVi break; } case 'lq': { + // eslint-disable-next-line unicorn/prefer-ternary if (isMac) { videoArgs = ['-vf', `scale=-2:${targetHeight},format=yuv420p`, '-allow_sw', '1', '-sws_flags', 'lanczos', '-vcodec', 'h264', '-b:v', '1500k']; } else { @@ -443,6 +449,7 @@ async function html5ify({ outPath, filePath: filePathArg, speed, hasAudio, hasVi switch (audio) { case 'hq': { + // eslint-disable-next-line unicorn/prefer-ternary if (isMac) { audioArgs = ['-acodec', 'aac_at', '-b:a', '192k']; } else { @@ -451,6 +458,7 @@ async function html5ify({ outPath, filePath: filePathArg, speed, hasAudio, hasVi break; } case 'lq': { + // eslint-disable-next-line unicorn/prefer-ternary if (isMac) { audioArgs = ['-acodec', 'aac_at', '-ar', '44100', '-ac', '2', '-b:a', '96k']; } else { diff --git a/public/i18n-common.js b/public/i18n-common.js index 917d43f1..ef091ce3 100644 --- a/public/i18n-common.js +++ b/public/i18n-common.js @@ -1,6 +1,8 @@ +// eslint-disable-line unicorn/filename-case // intentionally disabled because I don't know the quality of the languages, so better to default to english // const LanguageDetector = window.require('i18next-electron-language-detector'); const isDev = require('electron-is-dev'); +// eslint-disable-next-line import/no-extraneous-dependencies const { app } = require('electron'); const { join } = require('path'); diff --git a/public/logger.js b/public/logger.js index bbf66034..a436abfa 100644 --- a/public/logger.js +++ b/public/logger.js @@ -1,6 +1,7 @@ const winston = require('winston'); const util = require('util'); const isDev = require('electron-is-dev'); +// eslint-disable-next-line import/no-extraneous-dependencies const { app } = require('electron'); const { join } = require('path'); diff --git a/public/menu.js b/public/menu.js index a1cc3d0b..36d05d52 100644 --- a/public/menu.js +++ b/public/menu.js @@ -1,9 +1,10 @@ +// eslint-disable-next-line import/no-extraneous-dependencies const electron = require('electron'); const { t } = require('i18next'); // menu-safe i18n.t: // https://github.com/mifi/lossless-cut/issues/1456 -const esc = (val) => val.replace(/&/g, '&&'); +const esc = (val) => val.replaceAll('&', '&&'); const { Menu } = electron; diff --git a/public/update-checker.js b/public/update-checker.js index 19395e04..5a90888d 100644 --- a/public/update-checker.js +++ b/public/update-checker.js @@ -1,3 +1,4 @@ +// eslint-disable-line unicorn/filename-case const GitHub = require('github-api'); // eslint-disable-next-line import/no-extraneous-dependencies const electron = require('electron'); diff --git a/script/icon-gen.mjs b/script/icon-gen.mjs index a454adf4..ba1b0d7c 100644 --- a/script/icon-gen.mjs +++ b/script/icon-gen.mjs @@ -1,3 +1,4 @@ +// eslint-disable-line unicorn/filename-case import sharp from 'sharp'; import icongen from 'icon-gen'; diff --git a/script/xcrun-wrapper.mjs b/script/xcrun-wrapper.mjs index b2b4c404..1c3c6e54 100644 --- a/script/xcrun-wrapper.mjs +++ b/script/xcrun-wrapper.mjs @@ -1,3 +1,4 @@ +// eslint-disable-line unicorn/filename-case import execa from 'execa'; import { readFile } from 'fs/promises'; diff --git a/src/App.tsx b/src/App.tsx index d799d651..39df4bb5 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -101,6 +101,7 @@ const videoStyle: CSSProperties = { width: '100%', height: '100%', objectFit: 'c const bottomStyle: CSSProperties = { background: controlsBackground, transition: darkModeTransition }; const hevcPlaybackSupportedPromise = doesPlayerSupportHevcPlayback(); +// eslint-disable-next-line unicorn/prefer-top-level-await hevcPlaybackSupportedPromise.catch((err) => console.error(err)); @@ -256,7 +257,7 @@ function App() { }); }, []); - const toggleSegmentsList = useCallback(() => setShowRightBar(v => !v), []); + const toggleSegmentsList = useCallback(() => setShowRightBar((v) => !v), []); const toggleCopyStreamId = useCallback((path, index) => { setCopyStreamIdsForPath(path, (old) => ({ ...old, [index]: !old[index] })); @@ -333,7 +334,7 @@ function App() { !!(copyStreamIdsByFile[path] || {})[streamId] ), [copyStreamIdsByFile]); - const checkCopyingAnyTrackOfType = useCallback((filter) => mainStreams.some(stream => isCopyingStreamId(filePath, stream.index) && filter(stream)), [filePath, isCopyingStreamId, mainStreams]); + const checkCopyingAnyTrackOfType = useCallback((filter) => mainStreams.some((stream) => isCopyingStreamId(filePath, stream.index) && filter(stream)), [filePath, isCopyingStreamId, mainStreams]); const copyAnyAudioTrack = useMemo(() => checkCopyingAnyTrackOfType((stream) => stream.codec_type === 'audio'), [checkCopyingAnyTrackOfType]); const subtitleStreams = useMemo(() => getSubtitleStreams(mainStreams), [mainStreams]); @@ -633,7 +634,7 @@ function App() { }, []); const mainCopiedStreams = useMemo(() => mainStreams.filter((stream) => isCopyingStreamId(filePath, stream.index)), [filePath, isCopyingStreamId, mainStreams]); - const mainCopiedThumbnailStreams = useMemo(() => mainCopiedStreams.filter(isStreamThumbnail), [mainCopiedStreams]); + const mainCopiedThumbnailStreams = useMemo(() => mainCopiedStreams.filter((stream) => isStreamThumbnail(stream)), [mainCopiedStreams]); // Streams that are not copy enabled by default const extraStreams = useMemo(() => mainStreams.filter((stream) => !shouldCopyStreamByDefault(stream)), [mainStreams]); @@ -678,7 +679,7 @@ function App() { function addThumbnail(thumbnail) { // console.log('Rendered thumbnail', thumbnail.url); - setThumbnails(v => [...v, thumbnail]); + setThumbnails((v) => [...v, thumbnail]); } const hasAudio = !!activeAudioStream; @@ -710,7 +711,7 @@ function App() { // Cleanup removed thumbnails useEffect(() => { thumnailsRef.current.forEach((thumbnail) => { - if (!thumbnails.some(t => t.url === thumbnail.url)) URL.revokeObjectURL(thumbnail.url); + if (!thumbnails.some((t) => t.url === thumbnail.url)) URL.revokeObjectURL(thumbnail.url); }); thumnailsRef.current = thumbnails; }, [thumbnails]); @@ -719,7 +720,7 @@ function App() { const subtitlesByStreamIdRef = useRef({}); useEffect(() => { Object.values(thumnailsRef.current).forEach(({ url }) => { - if (!Object.values(subtitlesByStreamId).some(t => t.url === url)) URL.revokeObjectURL(url); + if (!Object.values(subtitlesByStreamId).some((t) => t.url === url)) URL.revokeObjectURL(url); }); subtitlesByStreamIdRef.current = subtitlesByStreamId; }, [subtitlesByStreamId]); @@ -732,7 +733,7 @@ function App() { const resetMergedOutFileName = useCallback(() => { const ext = getOutFileExtension({ isCustomFormatSelected, outFormat: fileFormat, filePath }); - const outFileName = getSuffixedFileName(filePath, `cut-merged-${new Date().getTime()}${ext}`); + const outFileName = getSuffixedFileName(filePath, `cut-merged-${Date.now()}${ext}`); setMergedOutFileName(outFileName); }, [fileFormat, filePath, isCustomFormatSelected]); @@ -833,7 +834,7 @@ function App() { }, [html5ify, html5ifyDummy]); const convertFormatBatch = useCallback(async () => { - if (batchFiles.length < 1) return; + if (batchFiles.length === 0) return; const filePaths = batchFiles.map((f) => f.path); const failedFiles: string[] = []; @@ -1008,7 +1009,7 @@ function App() { externalFilesMeta, mainStreams, copyStreamIdsByFile, - cutSegments: cutSegments.map(s => ({ start: s.start, end: s.end })), + cutSegments: cutSegments.map((s) => ({ start: s.start, end: s.end })), mainFileFormatData, rotation, shortestFlag, @@ -1176,7 +1177,7 @@ function App() { return; } - if (segmentsToExport.length < 1) { + if (segmentsToExport.length === 0) { return; } @@ -1526,6 +1527,7 @@ function App() { await html5ifyAndLoadWithPreferences(cod, fp, 'fastest', haveVideoStream, haveAudioStream); } + // eslint-disable-next-line unicorn/prefer-ternary if (projectPath) { await loadEdlFile({ path: projectPath, type: 'llc' }); } else { @@ -1565,16 +1567,14 @@ function App() { // https://github.com/mifi/lossless-cut/issues/515 setFilePath(fp); } catch (err) { - if (err) { - if (err instanceof DirectoryAccessDeclinedError) return; - } + if (err instanceof DirectoryAccessDeclinedError) return; resetState(); throw err; } }, [storeProjectInWorkingDir, setWorking, loadEdlFile, getEdlFilePath, getEdlFilePathOld, enableAskForImportChapters, ensureAccessToSourceDir, loadCutSegments, autoLoadTimecode, enableNativeHevc, ensureWritableOutDir, customOutDir, resetState, setCopyStreamIdsForPath, setFileFormat, outFormatLocked, setDetectedFileFormat, html5ifyAndLoadWithPreferences, showPreviewFileLoadedMessage, showUnsupportedFileMessage, hideAllNotifications]); - const toggleLastCommands = useCallback(() => setLastCommandsVisible(val => !val), []); - const toggleSettings = useCallback(() => setSettingsVisible(val => !val), []); + const toggleLastCommands = useCallback(() => setLastCommandsVisible((val) => !val), []); + const toggleSettings = useCallback(() => setSettingsVisible((val) => !val), []); const seekClosestKeyframe = useCallback((direction) => { const time = findNearestKeyFrameTime({ time: getRelevantTime(), direction }); @@ -1822,7 +1822,7 @@ function App() { const userOpenFiles = useCallback(async (filePathsIn) => { let filePaths = filePathsIn; - if (!filePaths || filePaths.length < 1) return; + if (!filePaths || filePaths.length === 0) return; console.log('userOpenFiles'); console.log(filePaths.join('\n')); @@ -1866,7 +1866,7 @@ function App() { const firstFilePath = filePaths[0]; // https://en.wikibooks.org/wiki/Inside_DVD-Video/Directory_Structure - if (/^VIDEO_TS$/i.test(basename(firstFilePath))) { + if (/^video_ts$/i.test(basename(firstFilePath))) { if (mustDisallowVob()) return; filePaths = await readVideoTs(firstFilePath); } @@ -1975,7 +1975,7 @@ function App() { const showIncludeExternalStreamsDialog = useCallback(async () => { try { const { canceled, filePaths } = await showOpenDialog({ properties: ['openFile'] }); - if (canceled || filePaths.length < 1) return; + if (canceled || filePaths.length === 0) return; await addStreamSourceFile(filePaths[0]); } catch (err) { handleError(err); @@ -2031,9 +2031,9 @@ function App() { play: () => play(), pause, reducePlaybackRate: () => changePlaybackRate(-1), - reducePlaybackRateMore: () => changePlaybackRate(-1, 2.0), + reducePlaybackRateMore: () => changePlaybackRate(-1, 2), increasePlaybackRate: () => changePlaybackRate(1), - increasePlaybackRateMore: () => changePlaybackRate(1, 2.0), + increasePlaybackRateMore: () => changePlaybackRate(1, 2), timelineToggleComfortZoom, captureSnapshot, captureSnapshotAsCoverArt, @@ -2191,7 +2191,9 @@ function App() { useKeyboard({ keyBindings, onKeyPress }); useEffect(() => { + // eslint-disable-next-line unicorn/prefer-add-event-listener document.ondragover = dragPreventer; + // eslint-disable-next-line unicorn/prefer-add-event-listener document.ondragend = dragPreventer; electron.ipcRenderer.send('renderer-ready'); @@ -2309,7 +2311,7 @@ function App() { // todo // eslint-disable-next-line @typescript-eslint/no-explicit-any const actionsWithArgs: Record void> = { - openFiles: (filePaths: string[]) => { userOpenFiles(filePaths.map(resolvePathIfNeeded)); }, + openFiles: (filePaths: string[]) => { userOpenFiles(filePaths.map((p) => resolvePathIfNeeded(p))); }, // todo separate actions per type and move them into mainActions? https://github.com/mifi/lossless-cut/issues/254#issuecomment-932649424 importEdlFile, exportEdlFile: tryExportEdlFile, @@ -2351,7 +2353,7 @@ function App() { ev.preventDefault(); if (!ev.dataTransfer) return; const { files } = ev.dataTransfer; - const filePaths = Array.from(files).map(f => f.path); + const filePaths = [...files].map((f) => f.path); focusWindow(); @@ -2382,7 +2384,7 @@ function App() { useEffect(() => { const keyScrollPreventer = (e) => { // https://stackoverflow.com/questions/8916620/disable-arrow-key-scrolling-in-users-browser - if (e.target === document.body && [32, 37, 38, 39, 40].indexOf(e.keyCode) > -1) { + if (e.target === document.body && [32, 37, 38, 39, 40].includes(e.keyCode)) { e.preventDefault(); } }; @@ -2393,7 +2395,7 @@ function App() { const showLeftBar = batchFiles.length > 0; - const thumbnailsSorted = useMemo(() => sortBy(thumbnails, thumbnail => thumbnail.time), [thumbnails]); + const thumbnailsSorted = useMemo(() => sortBy(thumbnails, (thumbnail) => thumbnail.time), [thumbnails]); const { t } = useTranslation(); diff --git a/src/BetweenSegments.jsx b/src/BetweenSegments.jsx index f549d744..a59de8dc 100644 --- a/src/BetweenSegments.jsx +++ b/src/BetweenSegments.jsx @@ -1,4 +1,4 @@ -import React, { memo } from 'react'; +import { memo } from 'react'; import { motion } from 'framer-motion'; import { FaTrashAlt, FaSave } from 'react-icons/fa'; diff --git a/src/BottomBar.jsx b/src/BottomBar.jsx index da7a1bc2..c08d5496 100644 --- a/src/BottomBar.jsx +++ b/src/BottomBar.jsx @@ -27,7 +27,7 @@ import { askForPlaybackRate } from './dialogs'; const { clipboard } = window.require('electron'); -const zoomOptions = Array(13).fill().map((unused, z) => 2 ** z); +const zoomOptions = Array.from({ length: 13 }).fill().map((unused, z) => 2 ** z); const leftRightWidth = 100; @@ -35,7 +35,7 @@ const InvertCutModeButton = memo(({ invertCutSegments, setInvertCutSegments }) = const { t } = useTranslation(); const onYinYangClick = useCallback(() => { - setInvertCutSegments(v => { + setInvertCutSegments((v) => { const newVal = !v; if (newVal) toast.fire({ title: t('When you export, selected segments on the timeline will be REMOVED - the surrounding areas will be KEPT') }); else toast.fire({ title: t('When you export, selected segments on the timeline will be KEPT - the surrounding areas will be REMOVED.') }); @@ -154,7 +154,7 @@ const CutTimeInput = memo(({ darkMode, cutTime, setCutTime, startTimeOffset, see style={{ ...cutTimeInputStyle, color: isCutTimeManualSet() ? 'var(--red11)' : 'var(--gray12)' }} type="text" title={isStart ? t('Manually input current segment\'s start time') : t('Manually input current segment\'s end time')} - onChange={e => handleCutTimeInput(e.target.value)} + onChange={(e) => handleCutTimeInput(e.target.value)} onPaste={handleCutTimePaste} onBlur={() => setCutTimeManual()} onContextMenu={handleContextMenu} @@ -392,9 +392,9 @@ const BottomBar = memo(({
{Math.floor(zoom)}x
- setZoom(parseInt(e.target.value, 10)))}> - {zoomOptions.map(val => ( + {zoomOptions.map((val) => ( ))} diff --git a/src/MediaSourcePlayer.tsx b/src/MediaSourcePlayer.tsx index bf572bfd..2a781e1a 100644 --- a/src/MediaSourcePlayer.tsx +++ b/src/MediaSourcePlayer.tsx @@ -94,7 +94,7 @@ async function startPlayback({ path, video, videoStreamIndex, audioStreamIndex, return undefined; } - if (sourceBuffer.buffered.length < 1) { + if (sourceBuffer.buffered.length === 0) { return undefined; } @@ -239,7 +239,9 @@ function drawJpegFrame(canvas: HTMLCanvasElement, jpegImage: Buffer) { console.error('Canvas context is null'); return; } + // eslint-disable-next-line unicorn/prefer-add-event-listener img.onload = () => ctx.drawImage(img, 0, 0, canvas.width, canvas.height); + // eslint-disable-next-line unicorn/prefer-add-event-listener img.onerror = (error) => console.error('Canvas JPEG image error', error); img.src = `data:image/jpeg;base64,${jpegImage.toString('base64')}`; } diff --git a/src/SegmentList.jsx b/src/SegmentList.jsx index e640d00b..e89440df 100644 --- a/src/SegmentList.jsx +++ b/src/SegmentList.jsx @@ -1,4 +1,4 @@ -import React, { memo, useMemo, useRef, useCallback, useState } from 'react'; +import { memo, useMemo, useRef, useCallback, useState } from 'react'; import { FaYinYang, FaSave, FaPlus, FaMinus, FaTag, FaSortNumericDown, FaAngleRight, FaRegCheckCircle, FaRegCircle } from 'react-icons/fa'; import { AiOutlineSplitCells } from 'react-icons/ai'; import { motion } from 'framer-motion'; @@ -186,13 +186,9 @@ const SegmentList = memo(({ let header = t('Segments to export:'); if (segments.length === 0) { - if (invertCutSegments) { - header = ( - You have enabled the "invert segments" mode which will cut away selected segments instead of keeping them. But there is no space between any segments, or at least two segments are overlapping. This would not produce any output. Either make room between segments or click the Yinyang symbol below to disable this mode. Alternatively you may combine overlapping segments from the menu. - ); - } else { - header = t('No segments to export.'); - } + header = invertCutSegments ? ( + You have enabled the "invert segments" mode which will cut away selected segments instead of keeping them. But there is no space between any segments, or at least two segments are overlapping. This would not produce any output. Either make room between segments or click the Yinyang symbol below to disable this mode. Alternatively you may combine overlapping segments from the menu. + ) : t('No segments to export.'); } const onReorderSegs = useCallback(async (index) => { @@ -285,6 +281,7 @@ const SegmentList = memo(({ [tag]: value, })), [setEditingSegmentTags]); + // eslint-disable-next-line @typescript-eslint/no-unused-vars const onTagReset = useCallback((tag) => setEditingSegmentTags(({ [tag]: deleted, ...rest }) => rest), [setEditingSegmentTags]); const onSegmentTagsCloseComplete = useCallback(() => { diff --git a/src/StreamsSelector.jsx b/src/StreamsSelector.jsx index 2384aa59..44ab5dc2 100644 --- a/src/StreamsSelector.jsx +++ b/src/StreamsSelector.jsx @@ -1,4 +1,4 @@ -import React, { memo, useState, useMemo, useCallback } from 'react'; +import { memo, useState, useMemo, useCallback } from 'react'; import { FaImage, FaCheckCircle, FaPaperclip, FaVideo, FaVideoSlash, FaFileImport, FaVolumeUp, FaVolumeMute, FaBan, FaFileExport } from 'react-icons/fa'; import { GoFileBinary } from 'react-icons/go'; @@ -34,6 +34,7 @@ const EditFileDialog = memo(({ editingFile, allFilesMeta, customTagsByFile, setC const onTagReset = useCallback((tag) => { setCustomTagsByFile((old) => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars const { [tag]: deleted, ...rest } = old[editingFile] || {}; return { ...old, [editingFile]: rest }; }); @@ -101,7 +102,8 @@ const EditStreamDialog = memo(({ editingStream: { streamId: editingStreamId, pat const onTagReset = useCallback((tag) => { updateStreamParams(editingFile, editingStreamId, (params) => { if (!params.has('customTags')) return; - // eslint-disable-next-line no-param-reassign + // todo + // eslint-disable-next-line no-param-reassign, @typescript-eslint/no-dynamic-delete delete params.get('customTags')[tag]; }); }, [editingFile, editingStreamId, updateStreamParams]); @@ -140,6 +142,7 @@ const Stream = memo(({ filePath, stream, onToggle, batchSetCopyStreamIds, copySt let Icon; let codecTypeHuman; + // eslint-disable-next-line unicorn/prefer-switch if (stream.codec_type === 'audio') { Icon = copyStream ? FaVolumeUp : FaVolumeMute; codecTypeHuman = t('audio'); @@ -310,6 +313,7 @@ const StreamsSelector = memo(({ async function removeFile(path) { setCopyStreamIdsForPath(path, () => ({})); setExternalFilesMeta((old) => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars const { [path]: val, ...rest } = old; return rest; }); @@ -318,6 +322,7 @@ const StreamsSelector = memo(({ async function batchSetCopyStreamIdsForPath(path, streams, filter, enabled) { setCopyStreamIdsForPath(path, (old) => { const ret = { ...old }; + // eslint-disable-next-line unicorn/no-array-callback-reference streams.filter(filter).forEach(({ index }) => { ret[index] = enabled; }); diff --git a/src/Timeline.jsx b/src/Timeline.jsx index 6effe3cd..68e6ce8d 100644 --- a/src/Timeline.jsx +++ b/src/Timeline.jsx @@ -245,6 +245,7 @@ const Timeline = memo(({ style={{ position: 'relative', borderTop: '1px solid var(--gray7)', borderBottom: '1px solid var(--gray7)' }} onMouseDown={onMouseDown} onMouseMove={onMouseMove} + // eslint-disable-next-line jsx-a11y/mouse-events-have-key-events onMouseOut={onMouseOut} > {(waveformEnabled && !shouldShowWaveform) && ( diff --git a/src/TopMenu.jsx b/src/TopMenu.jsx index 22abe0e3..ce822d3e 100644 --- a/src/TopMenu.jsx +++ b/src/TopMenu.jsx @@ -1,7 +1,7 @@ import React, { memo, useCallback } from 'react'; import { IoIosSettings } from 'react-icons/io'; import { FaLock, FaUnlock } from 'react-icons/fa'; -import { IconButton, CrossIcon, ListIcon, VolumeUpIcon, VolumeOffIcon } from 'evergreen-ui'; +import { CrossIcon, ListIcon, VolumeUpIcon, VolumeOffIcon } from 'evergreen-ui'; import { useTranslation } from 'react-i18next'; import Button from './components/Button'; diff --git a/src/components/BigWaveform.tsx b/src/components/BigWaveform.tsx index 71602d2e..656decc9 100644 --- a/src/components/BigWaveform.tsx +++ b/src/components/BigWaveform.tsx @@ -52,14 +52,14 @@ const BigWaveform = memo(({ waveforms, relevantTime, playing, durationSafe, zoom useEffect(() => { - const startTime = new Date().getTime(); + const startTime = Date.now(); if (playing) { let raf; // eslint-disable-next-line no-inner-declarations function render() { raf = window.requestAnimationFrame(() => { - setSmoothTime(relevantTime + (new Date().getTime() - startTime) / 1000); + setSmoothTime(relevantTime + (Date.now() - startTime) / 1000); render(); }); } diff --git a/src/components/ConcatDialog.tsx b/src/components/ConcatDialog.tsx index 9cd9b86a..c1fa6331 100644 --- a/src/components/ConcatDialog.tsx +++ b/src/components/ConcatDialog.tsx @@ -25,12 +25,16 @@ const rowStyle: CSSProperties = { }; const ConcatDialog = memo(({ isShown, onHide, paths, onConcat, alwaysConcatMultipleFiles, setAlwaysConcatMultipleFiles }: { + // todo + // eslint-disable-next-line @typescript-eslint/no-explicit-any isShown: boolean, onHide: () => void, paths: string[], onConcat: (a: { paths: string[], includeAllStreams: boolean, streams: any, outFileName: string, fileFormat: string, clearBatchFilesAfterConcat: boolean }) => Promise, alwaysConcatMultipleFiles: boolean, setAlwaysConcatMultipleFiles: (a: boolean) => void, }) => { const { t } = useTranslation(); const { preserveMovData, setPreserveMovData, segmentsToChapters, setSegmentsToChapters, preserveMetadataOnMerge, setPreserveMetadataOnMerge } = useUserSettings(); const [includeAllStreams, setIncludeAllStreams] = useState(false); + // todo + // eslint-disable-next-line @typescript-eslint/no-explicit-any const [fileMeta, setFileMeta] = useState<{ format: any, streams: any, chapters: any }>(); const [allFilesMetaCache, setAllFilesMetaCache] = useState({}); const [clearBatchFilesAfterConcat, setClearBatchFilesAfterConcat] = useState(false); @@ -62,7 +66,7 @@ const ConcatDialog = memo(({ isShown, onHide, paths, onConcat, alwaysConcatMulti setFileMeta(fileMetaNew); setFileFormat(fileFormatNew); setDetectedFileFormat(fileFormatNew); - setUniqueSuffix(new Date().getTime()); + setUniqueSuffix(Date.now()); })().catch(console.error); return () => { diff --git a/src/components/KeyboardShortcuts.jsx b/src/components/KeyboardShortcuts.jsx index cdd67b5c..9c06f91f 100644 --- a/src/components/KeyboardShortcuts.jsx +++ b/src/components/KeyboardShortcuts.jsx @@ -24,7 +24,7 @@ const renderKeys = (keys) => keys.map((key, i) => ( // From https://craig.is/killing/mice // For modifier keys you can use shift, ctrl, alt, or meta. // You can substitute option for alt and command for meta. -const allModifiers = ['shift', 'ctrl', 'alt', 'meta']; +const allModifiers = new Set(['shift', 'ctrl', 'alt', 'meta']); function fixKeys(keys) { const replaced = keys.map((key) => { if (key === 'option') return 'alt'; @@ -32,10 +32,10 @@ function fixKeys(keys) { return key; }); const uniqed = uniq(replaced); - const nonModifierKeys = keys.filter((key) => !allModifiers.includes(key)); + const nonModifierKeys = keys.filter((key) => !allModifiers.has(key)); if (nonModifierKeys.length === 0) return []; // only modifiers is invalid if (nonModifierKeys.length > 1) return []; // can only have one non-modifier - return orderBy(uniqed, [key => key !== 'shift', key => key !== 'ctrl', key => key !== 'alt', key => key !== 'meta', key => key]); + return orderBy(uniqed, [(key) => key !== 'shift', (key) => key !== 'ctrl', (key) => key !== 'alt', (key) => key !== 'meta', (key) => key]); } const CreateBinding = memo(({ diff --git a/src/components/OutputFormatSelect.tsx b/src/components/OutputFormatSelect.tsx index f1d4b82f..3f7d74b3 100644 --- a/src/components/OutputFormatSelect.tsx +++ b/src/components/OutputFormatSelect.tsx @@ -27,7 +27,7 @@ const OutputFormatSelect = memo(({ style, detectedFileFormat, fileFormat, onOutp return ( // eslint-disable-next-line react/jsx-props-no-spreading - onOutputFormatUserChange(e.target.value))}> {detectedFileFormat && ( diff --git a/src/dialogs/index.tsx b/src/dialogs/index.tsx index 5c2a0881..e6277168 100644 --- a/src/dialogs/index.tsx +++ b/src/dialogs/index.tsx @@ -222,7 +222,8 @@ async function askForSegmentDuration(fileDuration) { // https://github.com/mifi/lossless-cut/issues/1153 async function askForSegmentsRandomDurationRange() { function parse(str) { - const match = str.replace(/\s/g, '').match(/^duration([\d.]+)to([\d.]+),gap([-\d.]+)to([-\d.]+)$/i); + // eslint-disable-next-line unicorn/better-regex + const match = str.replaceAll(/\s/g, '').match(/^duration([\d.]+)to([\d.]+),gap([-\d.]+)to([-\d.]+)$/i); if (!match) return undefined; const values = match.slice(1); const parsed = values.map((val) => parseFloat(val)); @@ -275,7 +276,7 @@ export async function askForShiftSegments() { let parseableValue = value; let sign = 1; if (parseableValue[0] === '-') { - parseableValue = parseableValue.substring(1); + parseableValue = parseableValue.slice(1); sign = -1; } const duration = parseDuration(parseableValue); diff --git a/src/edlFormats.test.ts b/src/edlFormats.test.ts index 91ef3ddd..f37c6c94 100644 --- a/src/edlFormats.test.ts +++ b/src/edlFormats.test.ts @@ -9,7 +9,7 @@ import { parseSrt, formatSrt, parseYouTube, formatYouTube, parseMplayerEdl, pars // eslint-disable-next-line no-underscore-dangle const __dirname = dirname(fileURLToPath(import.meta.url)); -const readFixture = async (name: string, encoding: BufferEncoding = 'utf-8') => fs.readFile(join(__dirname, 'fixtures', name), encoding); +const readFixture = async (name: string, encoding: BufferEncoding = 'utf8') => fs.readFile(join(__dirname, 'fixtures', name), encoding); const readFixtureBinary = async (name: string) => fs.readFile(join(__dirname, 'fixtures', name), null); const expectYouTube1 = [ @@ -259,5 +259,5 @@ it('format srt', async () => { // https://github.com/mifi/lossless-cut/issues/1664 it('parses DV Analyzer Summary.txt', async () => { - expect(parseDvAnalyzerSummaryTxt(await readFixture('DV Analyzer Summary.txt', 'utf-8'))).toMatchSnapshot(); + expect(parseDvAnalyzerSummaryTxt(await readFixture('DV Analyzer Summary.txt', 'utf8'))).toMatchSnapshot(); }); diff --git a/src/edlFormats.ts b/src/edlFormats.ts index 77cc900a..cf3aec3b 100644 --- a/src/edlFormats.ts +++ b/src/edlFormats.ts @@ -21,10 +21,10 @@ export function getFrameCountRaw(detectedFps: number | undefined, sec: number) { } function parseTime(str: string) { - const timeMatch = str.match(/^[^0-9]*(?:(?:([0-9]{1,}):)?([0-9]{1,2}):)?([0-9]{1,})(?:\.([0-9]{1,3}))?:?/); + const timeMatch = str.match(/^\D*(?:(?:(\d+):)?(\d{1,2}):)?(\d+)(?:\.(\d{1,3}))?:?/); if (!timeMatch) return undefined; - const rest = str.substring(timeMatch[0].length); + const rest = str.slice(timeMatch[0].length); const [, hourStr, minStr, secStr, msStr] = timeMatch; const hour = hourStr != null ? parseInt(hourStr, 10) : 0; @@ -49,7 +49,7 @@ export const getFrameValParser = (fps) => (str) => { export async function parseCsv(csvStr, parseTimeFn) { const rows = await csvParseAsync(csvStr, {}); if (rows.length === 0) throw new Error(i18n.t('No rows found')); - if (!rows.every(row => row.length === 3)) throw new Error(i18n.t('One or more rows does not have 3 columns')); + if (!rows.every((row) => row.length === 3)) throw new Error(i18n.t('One or more rows does not have 3 columns')); const mapped = rows .map(([start, end, name]) => ({ @@ -71,7 +71,7 @@ export async function parseCsv(csvStr, parseTimeFn) { export async function parseMplayerEdl(text) { const allRows = text.split('\n').map((line) => { - const match = line.match(/^\s*([^\s]+)\s+([^\s]+)\s+([0123])\s*$/); + const match = line.match(/^\s*(\S+)\s+(\S+)\s+([0-3])\s*$/); if (!match) return undefined; const start = parseFloat(match[1]); const end = parseFloat(match[2]); @@ -79,7 +79,7 @@ export async function parseMplayerEdl(text) { if (Number.isNaN(start) || Number.isNaN(end)) return undefined; if (start < 0 || end < 0 || start >= end) return undefined; return { start, end, type }; - }).filter((it) => it); + }).filter(Boolean); const cutAwaySegments = allRows.filter((row) => row.type === 0); const muteSegments = allRows.filter((row) => row.type === 1); @@ -128,10 +128,10 @@ export function parseCuesheet(cuesheet) { export function parsePbf(buf: Buffer) { const text = buf.toString('utf16le'); const bookmarks = text.split('\n').map((line) => { - const match = line.match(/^[0-9]+=([0-9]+)\*([^*]+)*([^*]+)?/); + const match = line.match(/^\d+=(\d+)\*([^*]+)*([^*]+)?/); if (match) return { time: parseInt(match[1]!, 10) / 1000, name: match[2] }; return undefined; - }).filter((it) => it); + }).filter(Boolean); const out: Segment[] = []; @@ -156,7 +156,7 @@ export function parseXmeml(xmlStr) { // TODO maybe support media.audio also? const { xmeml } = xml; - if (!xmeml) throw Error('Root element not found in file'); + if (!xmeml) throw new Error('Root element not found in file'); let sequence; @@ -181,10 +181,10 @@ export function parseFcpXml(xmlStr) { const xml = new XMLParser({ ignoreAttributes: false }).parse(xmlStr); const { fcpxml } = xml; - if (!fcpxml) throw Error('Root element not found in file'); + if (!fcpxml) throw new Error('Root element not found in file'); function getTime(str) { - const match = str.match(/([0-9]+)\/([0-9]+)s/); + const match = str.match(/(\d+)\/(\d+)s/); if (!match) throw new Error('Invalid attribute'); return parseInt(match[1], 10) / parseInt(match[2], 10); } @@ -212,7 +212,7 @@ export function parseYouTube(str) { return { time, name }; } - const lines = str.split('\n').map(parseLine).filter((line) => line); + const lines = str.split('\n').map((line) => parseLine(line)).filter(Boolean); const linesSorted = sortBy(lines, (l) => l.time); @@ -275,7 +275,7 @@ export function parseDvAnalyzerSummaryTxt(txt: string) { // eslint-disable-next-line no-restricted-syntax for (const line of lines) { if (headerFound) { - const match = line.match(/^(\d{2}):(\d{2}):(\d{2}).(\d{3})\s+([^\s]+)\s+-\s+([^\s]+)\s+([^\s]+\s+[^\s]+)\s+-\s+([^\s]+\s+[^\s]+)/); + const match = line.match(/^(\d{2}):(\d{2}):(\d{2}).(\d{3})\s+(\S+)\s+-\s+(\S+)\s+(\S+\s+\S+)\s+-\s+(\S+\s+\S+)/); if (!match) break; const h = parseInt(match[1]!, 10); const m = parseInt(match[2]!, 10); @@ -325,7 +325,7 @@ export function parseSrt(text: string) { } else if (subtitleIndexAt != null && subtitleIndexAt > 0) { const match = line.match(/^(\d+:\d+:\d+[,.]\d+\s+)-->(\s+\d+:\d+:\d+[,.]\d+)$/); if (match) { - const fixComma = (v) => v.replace(/,/g, '.'); + const fixComma = (v) => v.replaceAll(',', '.'); start = parseTime(fixComma(match[1]))?.time; end = parseTime(fixComma(match[2]))?.time; } else if (start != null && end != null) { @@ -345,5 +345,5 @@ export function parseSrt(text: string) { } export function formatSrt(segments) { - return segments.reduce((acc, segment, index) => `${acc}${index > 0 ? '\r\n' : ''}${index + 1}\r\n${formatDuration({ seconds: segment.start }).replace(/\./g, ',')} --> ${formatDuration({ seconds: segment.end }).replace(/\./g, ',')}\r\n${segment.name || '-'}\r\n`, ''); + return segments.reduce((acc, segment, index) => `${acc}${index > 0 ? '\r\n' : ''}${index + 1}\r\n${formatDuration({ seconds: segment.start }).replaceAll('.', ',')} --> ${formatDuration({ seconds: segment.end }).replaceAll('.', ',')}\r\n${segment.name || '-'}\r\n`, ''); } diff --git a/src/edlStore.ts b/src/edlStore.ts index d0a22ab5..d341d046 100644 --- a/src/edlStore.ts +++ b/src/edlStore.ts @@ -13,24 +13,24 @@ const { basename } = window.require('path'); const { dialog } = window.require('@electron/remote'); export async function loadCsvSeconds(path) { - return parseCsv(await readFile(path, 'utf-8'), parseCsvTime); + return parseCsv(await readFile(path, 'utf8'), parseCsvTime); } export async function loadCsvFrames(path, fps) { if (!fps) throw new Error('The loaded file has an unknown framerate'); - return parseCsv(await readFile(path, 'utf-8'), getFrameValParser(fps)); + return parseCsv(await readFile(path, 'utf8'), getFrameValParser(fps)); } export async function loadXmeml(path) { - return parseXmeml(await readFile(path, 'utf-8')); + return parseXmeml(await readFile(path, 'utf8')); } export async function loadFcpXml(path) { - return parseFcpXml(await readFile(path, 'utf-8')); + return parseFcpXml(await readFile(path, 'utf8')); } export async function loadDvAnalyzerSummaryTxt(path) { - return parseDvAnalyzerSummaryTxt(await readFile(path, 'utf-8')); + return parseDvAnalyzerSummaryTxt(await readFile(path, 'utf8')); } export async function loadPbf(path) { @@ -38,7 +38,7 @@ export async function loadPbf(path) { } export async function loadMplayerEdl(path) { - return parseMplayerEdl(await readFile(path, 'utf-8')); + return parseMplayerEdl(await readFile(path, 'utf8')); } export async function loadCue(path) { @@ -46,7 +46,7 @@ export async function loadCue(path) { } export async function loadSrt(path) { - return parseSrt(await readFile(path, 'utf-8')); + return parseSrt(await readFile(path, 'utf8')); } export async function saveCsv(path, cutSegments) { @@ -103,6 +103,7 @@ export async function askForEdlImport({ type, fps }: { type: EdlImportType, fps? if (type === 'youtube') return askForYouTubeInput(); let filters; + // eslint-disable-next-line unicorn/prefer-switch if (type === 'csv' || type === 'csv-frames') filters = [{ name: i18n.t('CSV files'), extensions: ['csv'] }]; else if (type === 'xmeml') filters = [{ name: i18n.t('XML files'), extensions: ['xml'] }]; else if (type === 'fcpxml') filters = [{ name: i18n.t('FCPXML files'), extensions: ['fcpxml'] }]; @@ -114,7 +115,7 @@ export async function askForEdlImport({ type, fps }: { type: EdlImportType, fps? else if (type === 'llc') filters = [{ name: i18n.t('LosslessCut project'), extensions: ['llc'] }]; const { canceled, filePaths } = await showOpenDialog({ properties: ['openFile'], filters }); - if (canceled || filePaths.length < 1) return []; + if (canceled || filePaths.length === 0) return []; return readEdlFile({ type, path: filePaths[0], fps }); } @@ -123,6 +124,7 @@ export async function exportEdlFile({ type, cutSegments, customOutDir, filePath, }) { let filters; let ext; + // eslint-disable-next-line unicorn/prefer-switch if (type === 'csv') { ext = 'csv'; filters = [{ name: i18n.t('CSV files'), extensions: [ext, 'txt'] }]; @@ -148,6 +150,7 @@ export async function exportEdlFile({ type, cutSegments, customOutDir, filePath, const { canceled, filePath: savePath } = await dialog.showSaveDialog({ defaultPath, filters }); if (canceled || !savePath) return; console.log('Saving', type, savePath); + // eslint-disable-next-line unicorn/prefer-switch if (type === 'csv') await saveCsv(savePath, cutSegments); else if (type === 'tsv-human') await saveTsv(savePath, cutSegments); else if (type === 'csv-human') await saveCsvHuman(savePath, cutSegments); diff --git a/src/ffmpeg-parameters.js b/src/ffmpeg-parameters.js index 08b2282b..5aea92b3 100644 --- a/src/ffmpeg-parameters.js +++ b/src/ffmpeg-parameters.js @@ -1,3 +1,4 @@ +// eslint-disable-line unicorn/filename-case import i18n from 'i18next'; export const blackdetect = () => ({ diff --git a/src/ffmpeg.ts b/src/ffmpeg.ts index 63c34e12..a71ae02c 100644 --- a/src/ffmpeg.ts +++ b/src/ffmpeg.ts @@ -19,7 +19,12 @@ const { renderWaveformPng, mapTimesToSegments, detectSceneChanges, captureFrames export { renderWaveformPng, mapTimesToSegments, detectSceneChanges, captureFrames, captureFrame, getFfCommandLine, runFfmpegConcat, runFfmpegWithProgress, html5ify, getDuration, abortFfmpegs, runFfprobe, getFfmpegPath, setCustomFfPath }; -export class RefuseOverwriteError extends Error {} +export class RefuseOverwriteError extends Error { + constructor() { + super(); + this.name = 'RefuseOverwriteError'; + } +} export function logStdoutStderr({ stdout, stderr }) { if (stdout.length > 0) { @@ -63,12 +68,12 @@ export async function readFrames({ filePath, from, to, streamIndex }) { // todo types // eslint-disable-next-line @typescript-eslint/no-explicit-any const packetsFiltered: Frame[] = (JSON.parse(stdout).packets as any[]) - .map(p => ({ + .map((p) => ({ keyframe: p.flags[0] === 'K', time: parseFloat(p.pts_time), createdAt: new Date(), })) - .filter(p => !Number.isNaN(p.time)); + .filter((p) => !Number.isNaN(p.time)); return sortBy(packetsFiltered, 'time'); } @@ -93,10 +98,18 @@ export type FindKeyframeMode = 'nearest' | 'before' | 'after'; function findKeyframe(keyframes: Keyframe[], time: number, mode: FindKeyframeMode) { switch (mode) { - case 'nearest': return findNearestKeyframe(keyframes, time); - case 'before': return findPreviousKeyframe(keyframes, time); - case 'after': return findNextKeyframe(keyframes, time); - default: return undefined; + case 'nearest': { + return findNearestKeyframe(keyframes, time); + } + case 'before': { + return findPreviousKeyframe(keyframes, time); + } + case 'after': { + return findNextKeyframe(keyframes, time); + } + default: { + return undefined; + } } } @@ -125,7 +138,7 @@ export function getSafeCutTime(frames, cutTime, nextMode) { if (frames.length < 2) throw new Error(i18n.t('Less than 2 frames found')); if (nextMode) { - index = frames.findIndex(f => f.keyframe && f.time >= cutTime - sigma); + index = frames.findIndex((f) => f.keyframe && f.time >= cutTime - sigma); if (index === -1) throw new Error(i18n.t('Failed to find next keyframe')); if (index >= frames.length - 1) throw new Error(i18n.t('We are on the last frame')); const { time } = frames[index]; @@ -136,12 +149,13 @@ export function getSafeCutTime(frames, cutTime, nextMode) { } const findReverseIndex = (arr, cb) => { + // eslint-disable-next-line unicorn/no-array-callback-reference const ret = [...arr].reverse().findIndex(cb); if (ret === -1) return -1; return arr.length - 1 - ret; }; - index = findReverseIndex(frames, f => f.time <= cutTime + sigma); + index = findReverseIndex(frames, (f) => f.time <= cutTime + sigma); if (index === -1) throw new Error(i18n.t('Failed to find any prev frame')); if (index === 0) throw new Error(i18n.t('We are on the first frame')); @@ -155,7 +169,7 @@ export function getSafeCutTime(frames, cutTime, nextMode) { } // We are not on a frame before keyframe, look for preceding keyframe instead - index = findReverseIndex(frames, f => f.keyframe && f.time <= cutTime + sigma); + index = findReverseIndex(frames, (f) => f.keyframe && f.time <= cutTime + sigma); if (index === -1) throw new Error(i18n.t('Failed to find any prev keyframe')); if (index === 0) throw new Error(i18n.t('We are on the first keyframe')); @@ -165,9 +179,9 @@ export function getSafeCutTime(frames, cutTime, nextMode) { export function findNearestKeyFrameTime({ frames, time, direction, fps }) { const sigma = fps ? (1 / fps) : 0.1; - const keyframes = frames.filter(f => f.keyframe && (direction > 0 ? f.time > time + sigma : f.time < time - sigma)); + const keyframes = frames.filter((f) => f.keyframe && (direction > 0 ? f.time > time + sigma : f.time < time - sigma)); if (keyframes.length === 0) return undefined; - const nearestKeyFrame = sortBy(keyframes, keyframe => (direction > 0 ? keyframe.time - time : time - keyframe.time))[0]; + const nearestKeyFrame = sortBy(keyframes, (keyframe) => (direction > 0 ? keyframe.time - time : time - keyframe.time))[0]; if (!nearestKeyFrame) return undefined; return nearestKeyFrame.time; } @@ -186,7 +200,7 @@ export async function tryMapChaptersToEdl(chapters) { end, name, }; - }).filter((it) => it); + }).filter(Boolean); } catch (err) { console.error('Failed to read chapters from file', err); return []; @@ -218,6 +232,7 @@ export async function createChaptersFromSegments({ segmentPaths, chapterNames }) function mapDefaultFormat({ streams, requestedFormat }) { if (requestedFormat === 'mp4') { // Only MOV supports these codecs, so default to MOV instead https://github.com/mifi/lossless-cut/issues/948 + // eslint-disable-next-line unicorn/no-lonely-if if (streams.some((stream) => pcmAudioCodecs.includes(stream.codec_name))) { return 'mov'; } @@ -230,7 +245,7 @@ function mapDefaultFormat({ streams, requestedFormat }) { } async function determineOutputFormat(ffprobeFormatsStr, filePath) { - const ffprobeFormats = (ffprobeFormatsStr || '').split(',').map((str) => str.trim()).filter((str) => str); + const ffprobeFormats = (ffprobeFormatsStr || '').split(',').map((str) => str.trim()).filter(Boolean); if (ffprobeFormats.length === 0) { console.warn('ffprobe returned unknown formats', ffprobeFormatsStr); return undefined; @@ -256,19 +271,30 @@ async function determineOutputFormat(ffprobeFormatsStr, filePath) { // https://www.ftyps.com/ // https://exiftool.org/TagNames/QuickTime.html switch (fileTypeResponse.mime) { - case 'video/x-matroska': return 'matroska'; - case 'video/webm': return 'webm'; - case 'video/quicktime': return 'mov'; - case 'video/3gpp2': return '3g2'; - case 'video/3gpp': return '3gp'; + case 'video/x-matroska': { + return 'matroska'; + } + case 'video/webm': { + return 'webm'; + } + case 'video/quicktime': { + return 'mov'; + } + case 'video/3gpp2': { + return '3g2'; + } + case 'video/3gpp': { + return '3gp'; + } // These two cmds produce identical output, so we assume that encoding "ipod" means encoding m4a // ffmpeg -i example.aac -c copy OutputFile2.m4a // ffmpeg -i example.aac -c copy -f ipod OutputFile.m4a // See also https://github.com/mifi/lossless-cut/issues/28 case 'audio/x-m4a': - case 'audio/mp4': + case 'audio/mp4': { return 'ipod'; + } case 'image/avif': case 'image/heif': case 'image/heif-sequence': @@ -276,8 +302,9 @@ async function determineOutputFormat(ffprobeFormatsStr, filePath) { case 'image/heic-sequence': case 'video/x-m4v': case 'video/mp4': - case 'image/x-canon-cr3': + case 'image/x-canon-cr3': { return 'mp4'; + } default: { console.warn('file-type returned unknown format', ffprobeFormats, fileTypeResponse.mime); @@ -303,7 +330,7 @@ export async function readFileMeta(filePath) { try { // https://github.com/mifi/lossless-cut/issues/1342 parsedJson = JSON.parse(stdout); - } catch (err) { + } catch { console.log('ffprobe stdout', stdout); throw new Error('ffprobe returned malformed data'); } @@ -482,16 +509,16 @@ export async function extractSubtitleTrack(filePath, streamId) { export async function renderThumbnails({ filePath, from, duration, onThumbnail }) { // Time first render to determine how many to render - const startTime = new Date().getTime() / 1000; + const startTime = Date.now() / 1000; let url = await renderThumbnail(filePath, from); - const endTime = new Date().getTime() / 1000; + const endTime = Date.now() / 1000; onThumbnail({ time: from, url }); // Aim for max 3 sec to render all const numThumbs = Math.floor(Math.min(Math.max(3 / (endTime - startTime), 3), 10)); // console.log(numThumbs); - const thumbTimes = Array(numThumbs - 1).fill(undefined).map((_unused, i) => (from + ((duration * (i + 1)) / (numThumbs)))); + const thumbTimes = Array.from({ length: numThumbs - 1 }).fill(undefined).map((_unused, i) => (from + ((duration * (i + 1)) / (numThumbs)))); // console.log(thumbTimes); await pMap(thumbTimes, async (time) => { @@ -504,7 +531,7 @@ export async function extractWaveform({ filePath, outPath }) { const numSegs = 10; const duration = 60 * 60; const maxLen = 0.1; - const segments = Array(numSegs).fill(undefined).map((_unused, i) => [i * (duration / numSegs), Math.min(duration / numSegs, maxLen)] as const); + const segments = Array.from({ length: numSegs }).fill(undefined).map((_unused, i) => [i * (duration / numSegs), Math.min(duration / numSegs, maxLen)] as const); // https://superuser.com/questions/681885/how-can-i-remove-multiple-segments-from-a-video-using-ffmpeg let filter = segments.map(([from, len], i) => `[0:a]atrim=start=${from}:end=${from + len},asetpts=PTS-STARTPTS[a${i}]`).join(';'); @@ -541,7 +568,7 @@ export function isProblematicAvc1(outFormat, streams) { } function parseFfprobeFps(stream) { - const match = typeof stream.avg_frame_rate === 'string' && stream.avg_frame_rate.match(/^([0-9]+)\/([0-9]+)$/); + const match = typeof stream.avg_frame_rate === 'string' && stream.avg_frame_rate.match(/^(\d+)\/(\d+)$/); if (!match) return undefined; const num = parseInt(match[1], 10); const den = parseInt(match[2], 10); @@ -555,6 +582,7 @@ export function getStreamFps(stream) { return fps; } if (stream.codec_type === 'audio') { + // eslint-disable-next-line unicorn/no-lonely-if if (typeof stream.sample_rate === 'string') { const sampleRate = parseInt(stream.sample_rate, 10); if (!Number.isNaN(sampleRate) && sampleRate > 0) { @@ -595,7 +623,7 @@ export function getTimecodeFromStreams(streams) { return true; } return undefined; - } catch (err) { + } catch { // console.warn('Failed to parse timecode from file streams', err); return undefined; } diff --git a/src/hooks/normalizeWheel.js b/src/hooks/normalizeWheel.js index 26f75088..feb431f3 100644 --- a/src/hooks/normalizeWheel.js +++ b/src/hooks/normalizeWheel.js @@ -1,5 +1,4 @@ // Taken from: https://github.com/facebookarchive/fixed-data-table/blob/master/src/vendor_upstream/dom/normalizeWheel.js -/* eslint-disable */ /** * Copyright (c) 2015, Facebook, Inc. @@ -13,12 +12,10 @@ * @typechecks */ -'use strict'; - // Reasonable defaults -var PIXEL_STEP = 10; -var LINE_HEIGHT = 40; -var PAGE_HEIGHT = 800; +const PIXEL_STEP = 10; +const LINE_HEIGHT = 40; +const PAGE_HEIGHT = 800; /** * Mouse wheel (and 2-finger trackpad) support on the web sucks. It is @@ -120,18 +117,18 @@ var PAGE_HEIGHT = 800; * Firefox v4/Win7 | undefined | 3 * */ -export default function normalizeWheel(/*object*/ event) /*object*/ { - var sX = 0, sY = 0, // spinX, spinY - pX = 0, pY = 0; // pixelX, pixelY +export default function normalizeWheel(/* object */ event) /* object */ { + let sX = 0; let sY = 0; // spinX, spinY + let pX = 0; let pY = 0; // pixelX, pixelY // Legacy - if ('detail' in event) { sY = event.detail; } - if ('wheelDelta' in event) { sY = -event.wheelDelta / 120; } + if ('detail' in event) { sY = event.detail; } + if ('wheelDelta' in event) { sY = -event.wheelDelta / 120; } if ('wheelDeltaY' in event) { sY = -event.wheelDeltaY / 120; } if ('wheelDeltaX' in event) { sX = -event.wheelDeltaX / 120; } // side scrolling on FF with DOMMouseScroll - if ( 'axis' in event && event.axis === event.HORIZONTAL_AXIS ) { + if ('axis' in event && event.axis === event.HORIZONTAL_AXIS) { sX = sY; sY = 0; } @@ -143,10 +140,10 @@ export default function normalizeWheel(/*object*/ event) /*object*/ { if ('deltaX' in event) { pX = event.deltaX; } if ((pX || pY) && event.deltaMode) { - if (event.deltaMode == 1) { // delta in LINE units + if (event.deltaMode === 1) { // delta in LINE units pX *= LINE_HEIGHT; pY *= LINE_HEIGHT; - } else { // delta in PAGE units + } else { // delta in PAGE units pX *= PAGE_HEIGHT; pY *= PAGE_HEIGHT; } @@ -156,8 +153,10 @@ export default function normalizeWheel(/*object*/ event) /*object*/ { if (pX && !sX) { sX = (pX < 1) ? -1 : 1; } if (pY && !sY) { sY = (pY < 1) ? -1 : 1; } - return { spinX : sX, - spinY : sY, - pixelX : pX, - pixelY : pY }; + return { + spinX: sX, + spinY: sY, + pixelX: pX, + pixelY: pY, + }; } diff --git a/src/hooks/useDirectoryAccess.js b/src/hooks/useDirectoryAccess.js index 3ffdd2a3..e85810dd 100644 --- a/src/hooks/useDirectoryAccess.js +++ b/src/hooks/useDirectoryAccess.js @@ -7,7 +7,12 @@ import { errorToast } from '../swal'; // eslint-disable-next-line no-unused-vars import isDev from '../isDev'; -export class DirectoryAccessDeclinedError extends Error {} +export class DirectoryAccessDeclinedError extends Error { + constructor() { + super(); + this.name = 'DirectoryAccessDeclinedError'; + } +} // MacOS App Store sandbox doesn't allow reading/writing anywhere, // except those exact file paths that have been explicitly drag-dropped into LosslessCut or opened using the opener dialog diff --git a/src/hooks/useFfmpegOperations.js b/src/hooks/useFfmpegOperations.js index 89ca6bdd..d7452eb4 100644 --- a/src/hooks/useFfmpegOperations.js +++ b/src/hooks/useFfmpegOperations.js @@ -16,7 +16,7 @@ const { writeFile, mkdir } = window.require('fs/promises'); async function writeChaptersFfmetadata(outDir, chapters) { if (!chapters || chapters.length === 0) return undefined; - const path = join(outDir, `ffmetadata-${new Date().getTime()}.txt`); + const path = join(outDir, `ffmetadata-${Date.now()}.txt`); const ffmetadata = chapters.map(({ start, end, name }) => ( `[CHAPTER]\nTIMEBASE=1/1000\nSTART=${Math.floor(start * 1000)}\nEND=${Math.floor(end * 1000)}\ntitle=${name || ''}` @@ -37,7 +37,7 @@ function getMovFlags({ preserveMovData, movFastStart }) { if (movFastStart) flags.push('+faststart'); if (flags.length === 0) return []; - return flatMap(flags, flag => ['-movflags', flag]); + return flatMap(flags, (flag) => ['-movflags', flag]); } function getMatroskaFlags() { @@ -153,7 +153,7 @@ function useFfmpegOperations({ filePath, treatInputFileModifiedTimeAsStart, trea // https://superuser.com/questions/787064/filename-quoting-in-ffmpeg-concat // Must add "file:" or we get "Impossible to open 'pipe:xyz.mp4'" on newer ffmpeg versions // https://superuser.com/questions/718027/ffmpeg-concat-doesnt-work-with-absolute-path - const concatTxt = paths.map(file => `file 'file:${resolve(file).replace(/'/g, "'\\''")}'`).join('\n'); + const concatTxt = paths.map((file) => `file 'file:${resolve(file).replaceAll('\'', "'\\''")}'`).join('\n'); const ffmpegCommandLine = getFfCommandLine('ffmpeg', ffmpegArgs); diff --git a/src/hooks/useKeyboard.js b/src/hooks/useKeyboard.js index 4f87d3bb..a2588373 100644 --- a/src/hooks/useKeyboard.js +++ b/src/hooks/useKeyboard.js @@ -4,7 +4,7 @@ import { useEffect, useRef } from 'react'; // Also document.addEventListener needs custom handling of modifier keys or C will be triggered by CTRL+C, etc import Mousetrap from 'mousetrap'; -const keyupActions = ['seekBackwards', 'seekForwards']; +const keyupActions = new Set(['seekBackwards', 'seekForwards']); export default ({ keyBindings, onKeyPress: onKeyPressProp }) => { const onKeyPressRef = useRef(); @@ -25,7 +25,7 @@ export default ({ keyBindings, onKeyPress: onKeyPressProp }) => { keyBindings.forEach(({ action, keys }) => { mousetrap.bind(keys, () => onKeyPress({ action })); - if (keyupActions.includes(action)) { + if (keyupActions.has(action)) { mousetrap.bind(keys, () => onKeyPress({ action, keyup: true }), 'keyup'); } }); diff --git a/src/hooks/useSegments.js b/src/hooks/useSegments.js index 9f3bb186..5917d40a 100644 --- a/src/hooks/useSegments.js +++ b/src/hooks/useSegments.js @@ -117,7 +117,7 @@ export default ({ const currentCutSeg = useMemo(() => cutSegments[currentSegIndexSafe], [currentSegIndexSafe, cutSegments]); const currentApparentCutSeg = useMemo(() => apparentCutSegments[currentSegIndexSafe], [apparentCutSegments, currentSegIndexSafe]); - const selectedSegmentsRaw = useMemo(() => apparentCutSegments.filter(isSegmentSelected), [apparentCutSegments, isSegmentSelected]); + const selectedSegmentsRaw = useMemo(() => apparentCutSegments.filter((segment) => isSegmentSelected(segment)), [apparentCutSegments, isSegmentSelected]); const detectBlackScenes = useCallback(async () => { const filterOptions = await showParametersDialog({ title: i18n.t('Enter parameters'), parameters: ffmpegParameters.blackdetect(), docUrl: 'https://ffmpeg.org/ffmpeg-filters.html#blackdetect' }); @@ -170,7 +170,7 @@ export default ({ }, [apparentCutSegments, duration, haveInvalidSegs]); const invertAllSegments = useCallback(() => { - if (inverseCutSegments.length < 1) { + if (inverseCutSegments.length === 0) { errorToast(i18n.t('Make sure you have no overlapping segments.')); return; } @@ -180,7 +180,7 @@ export default ({ }, [inverseCutSegments, setCutSegments]); const fillSegmentsGaps = useCallback(() => { - if (inverseCutSegments.length < 1) { + if (inverseCutSegments.length === 0) { errorToast(i18n.t('Make sure you have no overlapping segments.')); return; } @@ -227,7 +227,7 @@ export default ({ return newSegment; }, { concurrency }); newSegments = newSegments.filter((segment) => segment.end > segment.start); - if (newSegments.length < 1) setCutSegments(createInitialCutSegments()); + if (newSegments.length === 0) setCutSegments(createInitialCutSegments()); else setCutSegments(newSegments); }, [apparentCutSegments, createInitialCutSegments, duration, isSegmentSelected, setCutSegments]); @@ -449,7 +449,7 @@ export default ({ }, [cutSegments, enableSegments]); const onLabelSelectedSegments = useCallback(async () => { - if (selectedSegmentsRaw.length < 1) return; + if (selectedSegmentsRaw.length === 0) return; const { name } = selectedSegmentsRaw[0]; const value = await labelSegmentDialog({ currentName: name, maxLength: maxLabelLength }); if (value == null) return; diff --git a/src/i18n.ts b/src/i18n.ts index 55b66319..603b054f 100644 --- a/src/i18n.ts +++ b/src/i18n.ts @@ -42,4 +42,5 @@ i18n }, }); +// eslint-disable-next-line unicorn/prefer-export-from export default i18n; diff --git a/src/segments.test.ts b/src/segments.test.ts index b4fd2c1d..b353575f 100644 --- a/src/segments.test.ts +++ b/src/segments.test.ts @@ -84,7 +84,7 @@ it('detects overlapping segments', () => { ]); expect(partitionIntoOverlappingRanges([ - { start: 9, end: 10.50 }, + { start: 9, end: 10.5 }, { start: 11, end: 12 }, { start: 11.5, end: 12.5 }, { start: 11.5, end: 13 }, diff --git a/src/segments.ts b/src/segments.ts index b3ebaa35..58cb5574 100644 --- a/src/segments.ts +++ b/src/segments.ts @@ -99,11 +99,11 @@ export function combineOverlappingSegments(existingSegments, getSegApparentEnd2) }; } return undefined; // then remove all other segments in this partition group - }).filter((segment) => segment); + }).filter(Boolean); } export function combineSelectedSegments(existingSegments: T[], getSegApparentEnd2, isSegmentSelected) { - const selectedSegments = existingSegments.filter(isSegmentSelected); + const selectedSegments = existingSegments.filter((segment) => isSegmentSelected(segment)); const firstSegment = minBy(selectedSegments, (seg) => getSegApparentStart(seg)); const lastSegment = maxBy(selectedSegments, (seg) => getSegApparentEnd2(seg)); @@ -117,18 +117,18 @@ export function combineSelectedSegments(existingSegments: } if (isSegmentSelected(existingSegment)) return undefined; // remove other selected segments return existingSegment; - }).filter((segment) => segment); + }).filter(Boolean); } export function hasAnySegmentOverlap(sortedSegments) { - if (sortedSegments.length < 1) return false; + if (sortedSegments.length === 0) return false; const overlappingGroups = partitionIntoOverlappingRanges(sortedSegments); return overlappingGroups.length > 0; } export function invertSegments(sortedCutSegments, includeFirstSegment: boolean, includeLastSegment: boolean, duration?: number) { - if (sortedCutSegments.length < 1) return undefined; + if (sortedCutSegments.length === 0) return undefined; if (hasAnySegmentOverlap(sortedCutSegments)) return undefined; @@ -157,7 +157,7 @@ export function invertSegments(sortedCutSegments, includeFirstSegment: boolean, }); if (includeLastSegment) { - const lastSeg = sortedCutSegments[sortedCutSegments.length - 1]; + const lastSeg = sortedCutSegments.at(-1); if (duration == null || lastSeg.end < duration) { const inverted: InverseSegment = { start: lastSeg.end, @@ -175,7 +175,7 @@ export function invertSegments(sortedCutSegments, includeFirstSegment: boolean, // because chapters need to be contiguous, we need to insert gaps in-between export function convertSegmentsToChapters(sortedSegments) { - if (sortedSegments.length < 1) return []; + if (sortedSegments.length === 0) return []; if (hasAnySegmentOverlap(sortedSegments)) throw new Error('Segments cannot overlap'); sortedSegments.map((segment) => ({ start: segment.start, end: segment.end, name: segment.name })); diff --git a/src/util.ts b/src/util.ts index bd1781b5..77c4124e 100644 --- a/src/util.ts +++ b/src/util.ts @@ -163,12 +163,12 @@ export function handleError(arg1: unknown, arg2?: unknown) { toast.fire({ icon: 'error', title: msg || i18n.t('An error has occurred.'), - text: errorMsg ? errorMsg.substring(0, 300) : undefined, + text: errorMsg ? errorMsg.slice(0, 300) : undefined, }); } export function filenamify(name) { - return name.replace(/[^0-9a-zA-Z_\-.]/g, '_'); + return name.replaceAll(/[^\w.-]/g, '_'); } export function withBlur(cb) { @@ -248,7 +248,7 @@ export async function findExistingHtml5FriendlyFile(fp, cod) { matches = [...matches, ...nonMatches]; // console.log(matches); - if (matches.length < 1) return undefined; + if (matches.length === 0) return undefined; const { suffix, entry } = matches[0]!; @@ -318,7 +318,7 @@ export async function checkAppPath() { // eslint-disable-next-line no-useless-concat, one-var, one-var-declaration-per-line const mf = 'mi' + 'fi.no', llc = 'Los' + 'slessC' + 'ut'; const appPath = isDev ? 'C:\\Program Files\\WindowsApps\\37672NoveltyStudio.MediaConverter_9.0.6.0_x64__vjhnv588cyf84' : remote.app.getAppPath(); - const pathMatch = appPath.replace(/\\/g, '/').match(/Windows ?Apps\/([^/]+)/); // find the first component after WindowsApps + const pathMatch = appPath.replaceAll('\\', '/').match(/Windows ?Apps\/([^/]+)/); // find the first component after WindowsApps // example pathMatch: 37672NoveltyStudio.MediaConverter_9.0.6.0_x64__vjhnv588cyf84 if (!pathMatch) { console.warn('Unknown path match', appPath); @@ -358,7 +358,8 @@ export function shuffleArray(arrayIn) { // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping export function escapeRegExp(string) { - return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string + // eslint-disable-next-line unicorn/better-regex + return string.replaceAll(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string } export const readFileSize = async (path) => (await stat(path)).size; @@ -377,8 +378,7 @@ export function checkFileSizes(inputSize, outputSize) { function setDocumentExtraTitle(extra) { const baseTitle = 'LosslessCut'; - if (extra != null) document.title = `${baseTitle} - ${extra}`; - else document.title = baseTitle; + document.title = extra != null ? `${baseTitle} - ${extra}` : baseTitle; } export function setDocumentTitle({ filePath, working, cutProgress }: { filePath: string, working?: string, cutProgress?: number }) { @@ -402,7 +402,7 @@ export function mustDisallowVob() { export async function readVideoTs(videoTsPath) { const files = await readdir(videoTsPath); - const relevantFiles = files.filter((file) => /^VTS_\d+_\d+\.vob$/i.test(file) && !/^VTS_\d+_00\.vob$/i.test(file)); // skip menu + const relevantFiles = files.filter((file) => /^vts_\d+_\d+\.vob$/i.test(file) && !/^vts_\d+_00\.vob$/i.test(file)); // skip menu const ret = sortBy(relevantFiles).map((file) => join(videoTsPath, file)); if (ret.length === 0) throw new Error('No VTS vob files found in folder'); return ret; diff --git a/src/util/duration.ts b/src/util/duration.ts index bcabb0a3..9c010b75 100644 --- a/src/util/duration.ts +++ b/src/util/duration.ts @@ -43,7 +43,8 @@ export const isExactDurationMatch = (str) => /^-?\d{2}:\d{2}:\d{2}.\d{3}$/.test( // See also parseYoutube export function parseDuration(str) { - const match = str.replace(/\s/g, '').match(/^(-?)(?:(?:(\d{1,}):)?(\d{1,2}):)?(\d{1,2}(?:[.,]\d{1,3})?)$/); + // eslint-disable-next-line unicorn/better-regex + const match = str.replaceAll(/\s/g, '').match(/^(-?)(?:(?:(\d{1,}):)?(\d{1,2}):)?(\d{1,2}(?:[.,]\d{1,3})?)$/); if (!match) return undefined; diff --git a/src/util/outputNameTemplate.ts b/src/util/outputNameTemplate.ts index 8055078d..1966784d 100644 --- a/src/util/outputNameTemplate.ts +++ b/src/util/outputNameTemplate.ts @@ -126,7 +126,7 @@ export function generateOutSegFileNames({ segments, template: desiredTemplate, f // Fields that did not come from the source file's name must be sanitized, because they may contain characters that are not supported by the target operating/file system // however we disable this when the user has chosen to (safeOutputFileName === false) - const filenamifyOrNot = (fileName) => (safeOutputFileName || forceSafeOutputFileName ? filenamify(fileName) : fileName).substr(0, maxLabelLength); + const filenamifyOrNot = (fileName) => (safeOutputFileName || forceSafeOutputFileName ? filenamify(fileName) : fileName).slice(0, Math.max(0, maxLabelLength)); function getSegSuffix() { if (name) return `-${filenamifyOrNot(name)}`; @@ -159,7 +159,7 @@ export function generateOutSegFileNames({ segments, template: desiredTemplate, f return [ ...rest, // If sanitation is enabled, make sure filename (last seg of the path) is not too long - safeOutputFileName ? lastSeg!.substring(0, 200) : lastSeg, + safeOutputFileName ? lastSeg!.slice(0, 200) : lastSeg, ].join(pathSep); }); } diff --git a/src/util/rate-calculator.js b/src/util/rate-calculator.js index 508aaa80..a49d3ee0 100644 --- a/src/util/rate-calculator.js +++ b/src/util/rate-calculator.js @@ -1,3 +1,4 @@ +// eslint-disable-line unicorn/filename-case import clamp from 'lodash/clamp'; /** @@ -24,12 +25,12 @@ export function adjustRate(playbackRate, direction, multiplier) { // stop along the way at 1.0. This could happen if the current playbackRate was reached // using a different multiplier (e.g., holding the shift key). // https://github.com/mifi/lossless-cut/issues/447#issuecomment-766339083 - if ((newRate > 1.0 && playbackRate < 1.0) || (newRate < 1.0 && playbackRate > 1.0)) { - newRate = 1.0; + if ((newRate > 1 && playbackRate < 1) || (newRate < 1 && playbackRate > 1)) { + newRate = 1; } // And, clean up any rounding errors that get us to almost 1.0 (e.g., treat 1.00001 as 1) if ((newRate > (m ** (-1 / 2))) && (newRate < (m ** (1 / 2)))) { - newRate = 1.0; + newRate = 1; } return clamp(newRate, 0.1, 16); } diff --git a/src/util/rate-calculator.test.ts b/src/util/rate-calculator.test.ts index 02c28abe..fb2923a0 100644 --- a/src/util/rate-calculator.test.ts +++ b/src/util/rate-calculator.test.ts @@ -1,3 +1,4 @@ +// eslint-disable-line unicorn/filename-case import { describe, it, expect } from 'vitest'; import { adjustRate, DEFAULT_PLAYBACK_RATE } from './rate-calculator'; diff --git a/src/util/streams.ts b/src/util/streams.ts index bd7b5928..6828d699 100644 --- a/src/util/streams.ts +++ b/src/util/streams.ts @@ -1,14 +1,14 @@ // https://www.ffmpeg.org/doxygen/3.2/libavutil_2utils_8c_source.html#l00079 -const defaultProcessedCodecTypes = [ +const defaultProcessedCodecTypes = new Set([ 'video', 'audio', 'subtitle', 'attachment', -]; +]); -const unprocessableCodecs = [ +const unprocessableCodecs = new Set([ 'dvb_teletext', // ffmpeg doesn't seem to support this https://github.com/mifi/lossless-cut/issues/1343 -]; +]); // taken from `ffmpeg -codecs` export const pcmAudioCodecs = [ @@ -122,6 +122,7 @@ function getPerStreamFlags({ stream, outputIndex, outFormat, manuallyCopyDisposi addArgs(`-c:${outputIndex}`, codec); } + // eslint-disable-next-line unicorn/prefer-switch if (stream.codec_type === 'subtitle') { // mp4/mov only supports mov_text, so convert it https://stackoverflow.com/a/17584272/6519037 // https://github.com/mifi/lossless-cut/issues/418 @@ -135,6 +136,7 @@ function getPerStreamFlags({ stream, outputIndex, outFormat, manuallyCopyDisposi } else if (outFormat === 'webm' && stream.codec_name === 'mov_text') { // Only WebVTT subtitles are supported for WebM. addCodecArgs('webvtt'); + // eslint-disable-next-line unicorn/prefer-switch } else if (outFormat === 'srt') { // not technically lossless but why not addCodecArgs('srt'); } else if (outFormat === 'ass') { // not technically lossless but why not @@ -171,6 +173,7 @@ function getPerStreamFlags({ stream, outputIndex, outFormat, manuallyCopyDisposi if (isMov(outFormat)) { // 0x31766568 see https://github.com/mifi/lossless-cut/issues/1444 + // eslint-disable-next-line unicorn/prefer-switch, unicorn/no-lonely-if if (['0x0000', '0x31637668', '0x31766568'].includes(stream.codec_tag) && stream.codec_name === 'hevc') { addArgs(`-tag:${outputIndex}`, 'hvc1'); } @@ -214,8 +217,8 @@ export function getMapStreamsArgs({ startIndex = 0, outFormat, allFilesMeta, cop } export function shouldCopyStreamByDefault(stream) { - if (!defaultProcessedCodecTypes.includes(stream.codec_type)) return false; - if (unprocessableCodecs.includes(stream.codec_name)) return false; + if (!defaultProcessedCodecTypes.has(stream.codec_type)) return false; + if (unprocessableCodecs.has(stream.codec_name)) return false; return true; } @@ -225,9 +228,9 @@ export function isStreamThumbnail(stream) { return stream && stream.codec_type === 'video' && stream.disposition?.[attachedPicDisposition] === 1; } -export const getAudioStreams = (streams) => streams.filter(stream => stream.codec_type === 'audio'); -export const getRealVideoStreams = (streams) => streams.filter(stream => stream.codec_type === 'video' && !isStreamThumbnail(stream)); -export const getSubtitleStreams = (streams) => streams.filter(stream => stream.codec_type === 'subtitle'); +export const getAudioStreams = (streams) => streams.filter((stream) => stream.codec_type === 'audio'); +export const getRealVideoStreams = (streams) => streams.filter((stream) => stream.codec_type === 'video' && !isStreamThumbnail(stream)); +export const getSubtitleStreams = (streams) => streams.filter((stream) => stream.codec_type === 'subtitle'); // videoTracks/audioTracks seems to be 1-indexed, while ffmpeg is 0-indexes const getHtml5TrackId = (ffmpegTrackIndex: number) => String(ffmpegTrackIndex + 1); diff --git a/yarn.lock b/yarn.lock index 6e1d728c..6aa97cd8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -36,6 +36,16 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.0.0": + version: 7.23.5 + resolution: "@babel/code-frame@npm:7.23.5" + dependencies: + "@babel/highlight": "npm:^7.23.4" + chalk: "npm:^2.4.2" + checksum: 44e58529c9d93083288dc9e649c553c5ba997475a7b0758cc3ddc4d77b8a7d985dbe78cc39c9bbc61f26d50af6da1ddf0a3427eae8cc222a9370619b671ed8f5 + languageName: node + linkType: hard + "@babel/code-frame@npm:^7.18.6": version: 7.18.6 resolution: "@babel/code-frame@npm:7.18.6" @@ -283,6 +293,17 @@ __metadata: languageName: node linkType: hard +"@babel/highlight@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/highlight@npm:7.23.4" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.22.20" + chalk: "npm:^2.4.2" + js-tokens: "npm:^4.0.0" + checksum: 62fef9b5bcea7131df4626d009029b1ae85332042f4648a4ce6e740c3fd23112603c740c45575caec62f260c96b11054d3be5987f4981a5479793579c3aac71f + languageName: node + linkType: hard + "@babel/parser@npm:^7.20.7": version: 7.20.15 resolution: "@babel/parser@npm:7.20.15" @@ -323,17 +344,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime-corejs3@npm:^7.10.2": - version: 7.16.8 - resolution: "@babel/runtime-corejs3@npm:7.16.8" - dependencies: - core-js-pure: "npm:^3.20.2" - regenerator-runtime: "npm:^0.13.4" - checksum: 87042723fad0f19b4666a0f7b9db18b9ab193a0c913cfadfb7f1411ef4453f19e6df30505dda90596f1ebd07533e8375c2bfd236387dea635825f39f43d4649e - languageName: node - linkType: hard - -"@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.16.3, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7": +"@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7": version: 7.16.7 resolution: "@babel/runtime@npm:7.16.7" dependencies: @@ -360,6 +371,15 @@ __metadata: languageName: node linkType: hard +"@babel/runtime@npm:^7.23.2": + version: 7.23.9 + resolution: "@babel/runtime@npm:7.23.9" + dependencies: + regenerator-runtime: "npm:^0.14.0" + checksum: 9a520fe1bf72249f7dd60ff726434251858de15cccfca7aa831bd19d0d3fb17702e116ead82724659b8da3844977e5e13de2bae01eb8a798f2823a669f122be6 + languageName: node + linkType: hard + "@babel/template@npm:^7.20.7": version: 7.20.7 resolution: "@babel/template@npm:7.20.7" @@ -1056,9 +1076,9 @@ __metadata: languageName: node linkType: hard -"@eslint/eslintrc@npm:^2.1.3": - version: 2.1.3 - resolution: "@eslint/eslintrc@npm:2.1.3" +"@eslint/eslintrc@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/eslintrc@npm:2.1.4" dependencies: ajv: "npm:^6.12.4" debug: "npm:^4.3.2" @@ -1069,14 +1089,14 @@ __metadata: js-yaml: "npm:^4.1.0" minimatch: "npm:^3.1.2" strip-json-comments: "npm:^3.1.1" - checksum: 77b70a89232fe702c2f765b5b92970f5e4224b55363b923238b996c66fcd991504f40d3663c0543ae17d6c5049ab9b07ab90b65d7601e6f25e8bcd4caf69ac75 + checksum: 7a3b14f4b40fc1a22624c3f84d9f467a3d9ea1ca6e9a372116cb92507e485260359465b58e25bcb6c9981b155416b98c9973ad9b796053fd7b3f776a6946bce8 languageName: node linkType: hard -"@eslint/js@npm:8.53.0": - version: 8.53.0 - resolution: "@eslint/js@npm:8.53.0" - checksum: a372d55aa2bbe0d9399acc8de3c892dcfe507fd914d29fde6826ae54a13452619be626aa7eb70b1ec4d4da5302b6ed8e8ac9bf1f830003f15c0ad56c30b4f520 +"@eslint/js@npm:8.56.0": + version: 8.56.0 + resolution: "@eslint/js@npm:8.56.0" + checksum: 97a4b5ccf7e24f4d205a1fb0f21cdcd610348ecf685f6798a48dd41ba443f2c1eedd3050ff5a0b8f30b8cf6501ab512aa9b76e531db15e59c9ebaa41f3162e37 languageName: node linkType: hard @@ -1111,13 +1131,13 @@ __metadata: linkType: hard "@humanwhocodes/config-array@npm:^0.11.13": - version: 0.11.13 - resolution: "@humanwhocodes/config-array@npm:0.11.13" + version: 0.11.14 + resolution: "@humanwhocodes/config-array@npm:0.11.14" dependencies: - "@humanwhocodes/object-schema": "npm:^2.0.1" - debug: "npm:^4.1.1" + "@humanwhocodes/object-schema": "npm:^2.0.2" + debug: "npm:^4.3.1" minimatch: "npm:^3.0.5" - checksum: 9f655e1df7efa5a86822cd149ca5cef57240bb8ffd728f0c07cc682cc0a15c6bdce68425fbfd58f9b3e8b16f79b3fd8cb1e96b10c434c9a76f20b2a89f213272 + checksum: 3ffb24ecdfab64014a230e127118d50a1a04d11080cbb748bc21629393d100850496456bbcb4e8c438957fe0934430d731042f1264d6a167b62d32fc2863580a languageName: node linkType: hard @@ -1128,10 +1148,10 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^2.0.1": - version: 2.0.1 - resolution: "@humanwhocodes/object-schema@npm:2.0.1" - checksum: dbddfd0465aecf92ed845ec30d06dba3f7bb2496d544b33b53dac7abc40370c0e46b8787b268d24a366730d5eeb5336ac88967232072a183905ee4abf7df4dab +"@humanwhocodes/object-schema@npm:^2.0.2": + version: 2.0.2 + resolution: "@humanwhocodes/object-schema@npm:2.0.2" + checksum: ef915e3e2f34652f3d383b28a9a99cfea476fa991482370889ab14aac8ecd2b38d47cc21932526c6d949da0daf4a4a6bf629d30f41b0caca25e146819cbfa70e languageName: node linkType: hard @@ -1689,7 +1709,17 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:1.0.5, @types/estree@npm:^1.0.0": +"@types/eslint@npm:^8": + version: 8.56.2 + resolution: "@types/eslint@npm:8.56.2" + dependencies: + "@types/estree": "npm:*" + "@types/json-schema": "npm:*" + checksum: 9e4805e770ea90a561e1f69e5edce28b8f66e92e290705100e853c7c252cf87bef654168d0d47fc60c0effbe4517dd7a8d2fa6d3f04c7f831367d568009fd368 + languageName: node + linkType: hard + +"@types/estree@npm:*, @types/estree@npm:1.0.5, @types/estree@npm:^1.0.0": version: 1.0.5 resolution: "@types/estree@npm:1.0.5" checksum: 7de6d928dd4010b0e20c6919e1a6c27b61f8d4567befa89252055fad503d587ecb9a1e3eab1b1901f923964d7019796db810b7fd6430acb26c32866d126fd408 @@ -1728,7 +1758,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:^7.0.12": +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.12": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 1a3c3e06236e4c4aab89499c428d585527ce50c24fe8259e8b3926d3df4cfbbbcf306cfc73ddfb66cbafc973116efd15967020b0f738f63e09e64c7d260519e7 @@ -1786,6 +1816,13 @@ __metadata: languageName: node linkType: hard +"@types/normalize-package-data@npm:^2.4.0": + version: 2.4.4 + resolution: "@types/normalize-package-data@npm:2.4.4" + checksum: 65dff72b543997b7be8b0265eca7ace0e34b75c3e5fee31de11179d08fa7124a7a5587265d53d0409532ecb7f7fba662c2012807963e1f9b059653ec2c83ee05 + languageName: node + linkType: hard + "@types/plist@npm:^3.0.1": version: 3.0.2 resolution: "@types/plist@npm:3.0.2" @@ -1876,9 +1913,9 @@ __metadata: linkType: hard "@types/semver@npm:^7.5.0": - version: 7.5.6 - resolution: "@types/semver@npm:7.5.6" - checksum: e77282b17f74354e17e771c0035cccb54b94cc53d0433fa7e9ba9d23fd5d7edcd14b6c8b7327d58bbd89e83b1c5eda71dfe408e06b929007e2b89586e9b63459 + version: 7.5.7 + resolution: "@types/semver@npm:7.5.7" + checksum: 535d88ec577fe59e38211881f79a1e2ba391e9e1516f8fff74e7196a5ba54315bace9c67a4616c334c830c89027d70a9f473a4ceb634526086a9da39180f2f9a languageName: node linkType: hard @@ -1919,15 +1956,15 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^6.17.0": - version: 6.17.0 - resolution: "@typescript-eslint/eslint-plugin@npm:6.17.0" +"@typescript-eslint/eslint-plugin@npm:^6.12.0": + version: 6.21.0 + resolution: "@typescript-eslint/eslint-plugin@npm:6.21.0" dependencies: "@eslint-community/regexpp": "npm:^4.5.1" - "@typescript-eslint/scope-manager": "npm:6.17.0" - "@typescript-eslint/type-utils": "npm:6.17.0" - "@typescript-eslint/utils": "npm:6.17.0" - "@typescript-eslint/visitor-keys": "npm:6.17.0" + "@typescript-eslint/scope-manager": "npm:6.21.0" + "@typescript-eslint/type-utils": "npm:6.21.0" + "@typescript-eslint/utils": "npm:6.21.0" + "@typescript-eslint/visitor-keys": "npm:6.21.0" debug: "npm:^4.3.4" graphemer: "npm:^1.4.0" ignore: "npm:^5.2.4" @@ -1940,44 +1977,44 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: f2a5774e9cc03e491a5a488501e5622c7eebd766f5a4fc2c30642864a3b89b0807946bde33a678f326ba7032f3f6a51aa0bf9c2d10adc823804fc9fb47db55a6 + checksum: a57de0f630789330204cc1531f86cfc68b391cafb1ba67c8992133f1baa2a09d629df66e71260b040de4c9a3ff1252952037093c4128b0d56c4dbb37720b4c1d languageName: node linkType: hard -"@typescript-eslint/parser@npm:^6.17.0": - version: 6.17.0 - resolution: "@typescript-eslint/parser@npm:6.17.0" +"@typescript-eslint/parser@npm:^6.12.0": + version: 6.21.0 + resolution: "@typescript-eslint/parser@npm:6.21.0" dependencies: - "@typescript-eslint/scope-manager": "npm:6.17.0" - "@typescript-eslint/types": "npm:6.17.0" - "@typescript-eslint/typescript-estree": "npm:6.17.0" - "@typescript-eslint/visitor-keys": "npm:6.17.0" + "@typescript-eslint/scope-manager": "npm:6.21.0" + "@typescript-eslint/types": "npm:6.21.0" + "@typescript-eslint/typescript-estree": "npm:6.21.0" + "@typescript-eslint/visitor-keys": "npm:6.21.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 2ed0ed4a5b30e953430ce3279df3655af09fa1caed2abf11804d239717daefc32a22864f6620ef57bb9c684c74a99a13241384fea5096e961385e3678fc2e920 + checksum: 4d51cdbc170e72275efc5ef5fce48a81ec431e4edde8374f4d0213d8d370a06823e1a61ae31d502a5f1b0d1f48fc4d29a1b1b5c2dcf809d66d3872ccf6e46ac7 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:6.17.0": - version: 6.17.0 - resolution: "@typescript-eslint/scope-manager@npm:6.17.0" +"@typescript-eslint/scope-manager@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/scope-manager@npm:6.21.0" dependencies: - "@typescript-eslint/types": "npm:6.17.0" - "@typescript-eslint/visitor-keys": "npm:6.17.0" - checksum: fe09c628553c9336e6a36d32c1d34e78ebd20aa02130a6bf535329621ba5a98aaac171f607bc6e4d17b3478c42e7de6476376636897ce3f227c754eb99acd07e + "@typescript-eslint/types": "npm:6.21.0" + "@typescript-eslint/visitor-keys": "npm:6.21.0" + checksum: fe91ac52ca8e09356a71dc1a2f2c326480f3cccfec6b2b6d9154c1a90651ab8ea270b07c67df5678956c3bbf0bbe7113ab68f68f21b20912ea528b1214197395 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:6.17.0": - version: 6.17.0 - resolution: "@typescript-eslint/type-utils@npm:6.17.0" +"@typescript-eslint/type-utils@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/type-utils@npm:6.21.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:6.17.0" - "@typescript-eslint/utils": "npm:6.17.0" + "@typescript-eslint/typescript-estree": "npm:6.21.0" + "@typescript-eslint/utils": "npm:6.21.0" debug: "npm:^4.3.4" ts-api-utils: "npm:^1.0.1" peerDependencies: @@ -1985,23 +2022,23 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: dc7938429193acfda61b7282197ec046039e2c4da41cdcddf4daaf300d10229e4e23bb0fcf0503b19c0b99a874849c8a9f5bb35ce106260f56a14106d2b41d8c + checksum: d03fb3ee1caa71f3ce053505f1866268d7ed79ffb7fed18623f4a1253f5b8f2ffc92636d6fd08fcbaf5bd265a6de77bf192c53105131e4724643dfc910d705fc languageName: node linkType: hard -"@typescript-eslint/types@npm:6.17.0": - version: 6.17.0 - resolution: "@typescript-eslint/types@npm:6.17.0" - checksum: 87ab1b5a3270ab34b917c22a2fb90a9ad7d9f3b19d73a337bc9efbe65f924da13482c97e8ccbe3bd3d081aa96039eeff50de41c1da2a2128066429b931cdb21d +"@typescript-eslint/types@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/types@npm:6.21.0" + checksum: e26da86d6f36ca5b6ef6322619f8ec55aabcd7d43c840c977ae13ae2c964c3091fc92eb33730d8be08927c9de38466c5323e78bfb270a9ff1d3611fe821046c5 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:6.17.0": - version: 6.17.0 - resolution: "@typescript-eslint/typescript-estree@npm:6.17.0" +"@typescript-eslint/typescript-estree@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.21.0" dependencies: - "@typescript-eslint/types": "npm:6.17.0" - "@typescript-eslint/visitor-keys": "npm:6.17.0" + "@typescript-eslint/types": "npm:6.21.0" + "@typescript-eslint/visitor-keys": "npm:6.21.0" debug: "npm:^4.3.4" globby: "npm:^11.1.0" is-glob: "npm:^4.0.3" @@ -2011,34 +2048,34 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 1671b0d2f2fdf07074fb1e2524d61935cec173bd8db6e482cc5b2dcc77aed3ffa831396736ffa0ee2fdbddd8585ae9ca8d6c97bcaea1385b23907a1ec0508f83 + checksum: b32fa35fca2a229e0f5f06793e5359ff9269f63e9705e858df95d55ca2cd7fdb5b3e75b284095a992c48c5fc46a1431a1a4b6747ede2dd08929dc1cbacc589b8 languageName: node linkType: hard -"@typescript-eslint/utils@npm:6.17.0": - version: 6.17.0 - resolution: "@typescript-eslint/utils@npm:6.17.0" +"@typescript-eslint/utils@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/utils@npm:6.21.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" "@types/json-schema": "npm:^7.0.12" "@types/semver": "npm:^7.5.0" - "@typescript-eslint/scope-manager": "npm:6.17.0" - "@typescript-eslint/types": "npm:6.17.0" - "@typescript-eslint/typescript-estree": "npm:6.17.0" + "@typescript-eslint/scope-manager": "npm:6.21.0" + "@typescript-eslint/types": "npm:6.21.0" + "@typescript-eslint/typescript-estree": "npm:6.21.0" semver: "npm:^7.5.4" peerDependencies: eslint: ^7.0.0 || ^8.0.0 - checksum: 37c63afcf66124bf84808699997953b8c84a378aa2c490a771b611d82cdac8499c58fac8eeb8378528e97660b59563d99297bfec4b982cd68760b0ffe54aa714 + checksum: b404a2c55a425a79d054346ae123087d30c7ecf7ed7abcf680c47bf70c1de4fabadc63434f3f460b2fa63df76bc9e4a0b9fa2383bb8a9fcd62733fb5c4e4f3e3 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:6.17.0": - version: 6.17.0 - resolution: "@typescript-eslint/visitor-keys@npm:6.17.0" +"@typescript-eslint/visitor-keys@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" dependencies: - "@typescript-eslint/types": "npm:6.17.0" + "@typescript-eslint/types": "npm:6.21.0" eslint-visitor-keys: "npm:^3.4.1" - checksum: a2aed0e1437fdab8858ab9c7c8e355f8b72a5fa4b0adc54f28b8a2bbc29d4bb93214968ee940f83d013d0a4b83d00cd4eeeb05fb4c2c7d0ead324c6793f7d6d4 + checksum: 30422cdc1e2ffad203df40351a031254b272f9c6f2b7e02e9bfa39e3fc2c7b1c6130333b0057412968deda17a3a68a578a78929a8139c6acef44d9d841dc72e1 languageName: node linkType: hard @@ -2175,7 +2212,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.10.0, acorn@npm:^8.11.3": +"acorn@npm:^8.10.0, acorn@npm:^8.11.3, acorn@npm:^8.9.0": version: 8.11.3 resolution: "acorn@npm:8.11.3" bin: @@ -2184,15 +2221,6 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.9.0": - version: 8.11.2 - resolution: "acorn@npm:8.11.2" - bin: - acorn: bin/acorn - checksum: ff559b891382ad4cd34cc3c493511d0a7075a51f5f9f02a03440e92be3705679367238338566c5fbd3521ecadd565d29301bc8e16cb48379206bffbff3d72500 - languageName: node - linkType: hard - "agent-base@npm:6, agent-base@npm:^6.0.2": version: 6.0.2 resolution: "agent-base@npm:6.0.2" @@ -2432,13 +2460,22 @@ __metadata: languageName: node linkType: hard -"aria-query@npm:^4.2.2": - version: 4.2.2 - resolution: "aria-query@npm:4.2.2" +"aria-query@npm:^5.3.0": + version: 5.3.0 + resolution: "aria-query@npm:5.3.0" dependencies: - "@babel/runtime": "npm:^7.10.2" - "@babel/runtime-corejs3": "npm:^7.10.2" - checksum: c9f0b85c1f948fe76c60bd1e08fc61a73c9d12cae046723d31b1dd0e029a1b23f8d3badea651453475fa3ff974c801fb96065ff58a1344d9bd7eef992096116e + dequal: "npm:^2.0.3" + checksum: c3e1ed127cc6886fea4732e97dd6d3c3938e64180803acfb9df8955517c4943760746ffaf4020ce8f7ffaa7556a3b5f85c3769a1f5ca74a1288e02d042f9ae4e + languageName: node + linkType: hard + +"array-buffer-byte-length@npm:^1.0.1": + version: 1.0.1 + resolution: "array-buffer-byte-length@npm:1.0.1" + dependencies: + call-bind: "npm:^1.0.5" + is-array-buffer: "npm:^3.0.4" + checksum: 53524e08f40867f6a9f35318fafe467c32e45e9c682ba67b11943e167344d2febc0f6977a17e699b05699e805c3e8f073d876f8bbf1b559ed494ad2cd0fae09e languageName: node linkType: hard @@ -2449,16 +2486,16 @@ __metadata: languageName: node linkType: hard -"array-includes@npm:^3.1.3, array-includes@npm:^3.1.4": - version: 3.1.4 - resolution: "array-includes@npm:3.1.4" +"array-includes@npm:^3.1.6, array-includes@npm:^3.1.7": + version: 3.1.7 + resolution: "array-includes@npm:3.1.7" dependencies: call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.3" - es-abstract: "npm:^1.19.1" - get-intrinsic: "npm:^1.1.1" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + get-intrinsic: "npm:^1.2.1" is-string: "npm:^1.0.7" - checksum: 31fde89258678d21f1a7fb21f5be63253d4d6a6cde3b6cd03fd117bbd9683c6837f0f0b3c43624d4bbe636d6f2cb62e831ab91e5ec0a923d946a63028ce5f6a8 + checksum: 856a8be5d118967665936ad33ff3b07adfc50b06753e596e91fb80c3da9b8c022e92e3cc6781156d6ad95db7109b9f603682c7df2d6a529ed01f7f6b39a4a360 languageName: node linkType: hard @@ -2469,25 +2506,82 @@ __metadata: languageName: node linkType: hard -"array.prototype.flat@npm:^1.2.5": - version: 1.2.5 - resolution: "array.prototype.flat@npm:1.2.5" +"array.prototype.filter@npm:^1.0.3": + version: 1.0.3 + resolution: "array.prototype.filter@npm:1.0.3" dependencies: call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.3" - es-abstract: "npm:^1.19.0" - checksum: 4cec7b7e0eb17b43e095d321a9e3cdc04f4a895ac7e628da9c158da3f720921d210a4fc93502748416b079f7f7b6a49ad90001d20e04caf0c639d8de38626ba4 + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + es-array-method-boxes-properly: "npm:^1.0.0" + is-string: "npm:^1.0.7" + checksum: 3da2189afb00f95559cc73fc3c50f17a071a65bb705c0b2f2e2a2b2142781215b622442368c8b4387389b6ab251adf09ad347f9a8a4cf29d24404cc5ea1e295c languageName: node linkType: hard -"array.prototype.flatmap@npm:^1.2.5": - version: 1.2.5 - resolution: "array.prototype.flatmap@npm:1.2.5" +"array.prototype.findlastindex@npm:^1.2.3": + version: 1.2.4 + resolution: "array.prototype.findlastindex@npm:1.2.4" dependencies: - call-bind: "npm:^1.0.0" - define-properties: "npm:^1.1.3" - es-abstract: "npm:^1.19.0" - checksum: 61567517d73e3e1bc1d98be4b8dd2c149d3cda9917e562d55b2431365106a25e4cde771db524f7d0634aae1c6ae46fd7bdac1fe73d7c685c30a25dff522a50a1 + call-bind: "npm:^1.0.5" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.22.3" + es-errors: "npm:^1.3.0" + es-shim-unscopables: "npm:^1.0.2" + checksum: 12d7de8da619065b9d4c40550d11c13f2fbbc863c4270ef01d022f49ef16fbe9022441ee9d60b1e952853c661dd4b3e05c21e4348d4631c6d93ddf802a252296 + languageName: node + linkType: hard + +"array.prototype.flat@npm:^1.3.1, array.prototype.flat@npm:^1.3.2": + version: 1.3.2 + resolution: "array.prototype.flat@npm:1.3.2" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + es-shim-unscopables: "npm:^1.0.0" + checksum: d9d2f6f27584de92ec7995bc931103e6de722cd2498bdbfc4cba814fc3e52f056050a93be883018811f7c0a35875f5056584a0e940603a5e5934f0279896aebe + languageName: node + linkType: hard + +"array.prototype.flatmap@npm:^1.3.1, array.prototype.flatmap@npm:^1.3.2": + version: 1.3.2 + resolution: "array.prototype.flatmap@npm:1.3.2" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + es-shim-unscopables: "npm:^1.0.0" + checksum: 33f20006686e0cbe844fde7fd290971e8366c6c5e3380681c2df15738b1df766dd02c7784034aeeb3b037f65c496ee54de665388288edb323a2008bb550f77ea + languageName: node + linkType: hard + +"array.prototype.tosorted@npm:^1.1.1": + version: 1.1.3 + resolution: "array.prototype.tosorted@npm:1.1.3" + dependencies: + call-bind: "npm:^1.0.5" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.22.3" + es-errors: "npm:^1.1.0" + es-shim-unscopables: "npm:^1.0.2" + checksum: 9a5b7909a9ddd02a5f5489911766c314a11fb40f8f5106bdbedf6c21898763faeb78ba3af53f7038f288de9161d2605ad10d8b720e07f71a7ed1de49f39c0897 + languageName: node + linkType: hard + +"arraybuffer.prototype.slice@npm:^1.0.3": + version: 1.0.3 + resolution: "arraybuffer.prototype.slice@npm:1.0.3" + dependencies: + array-buffer-byte-length: "npm:^1.0.1" + call-bind: "npm:^1.0.5" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.22.3" + es-errors: "npm:^1.2.1" + get-intrinsic: "npm:^1.2.3" + is-array-buffer: "npm:^3.0.4" + is-shared-array-buffer: "npm:^1.0.2" + checksum: 0221f16c1e3ec7b67da870ee0e1f12b825b5f9189835392b59a22990f715827561a4f4cd5330dc7507de272d8df821be6cd4b0cb569babf5ea4be70e365a2f3d languageName: node linkType: hard @@ -2519,10 +2613,10 @@ __metadata: languageName: node linkType: hard -"ast-types-flow@npm:^0.0.7": - version: 0.0.7 - resolution: "ast-types-flow@npm:0.0.7" - checksum: 663b90e99b56ee2d7f736a6b6fff8b3c5404f28fa1860bb8d83ee5a9bff9e687520d0d6d9db6edff5a34fd4d3c0c11a3beb1cf75e43c9a880cca04371cc99808 +"ast-types-flow@npm:^0.0.8": + version: 0.0.8 + resolution: "ast-types-flow@npm:0.0.8" + checksum: 85a1c24af4707871c27cfe456bd2ff7fcbe678f3d1c878ac968c9557735a171a17bdcc8c8f903ceab3fc3c49d5b3da2194e6ab0a6be7fec0e133fa028f21ba1b languageName: node linkType: hard @@ -2547,6 +2641,15 @@ __metadata: languageName: node linkType: hard +"asynciterator.prototype@npm:^1.0.0": + version: 1.0.0 + resolution: "asynciterator.prototype@npm:1.0.0" + dependencies: + has-symbols: "npm:^1.0.3" + checksum: e8ebfd9493ac651cf9b4165e9d64030b3da1d17181bb1963627b59e240cdaf021d9b59d44b827dc1dde4e22387ec04c2d0f8720cf58a1c282e34e40cc12721b3 + languageName: node + linkType: hard + "asynckit@npm:^0.4.0": version: 0.4.0 resolution: "asynckit@npm:0.4.0" @@ -2561,10 +2664,19 @@ __metadata: languageName: node linkType: hard -"axe-core@npm:^4.3.5": - version: 4.3.5 - resolution: "axe-core@npm:4.3.5" - checksum: ad01b0aa6c5de5a1180be2dec46e4014b23f1c1e72844227ec4fb42b95dc609f5cf4ef288beb7adf42e74d0c28ec8d269e3617d2454f2b2adaeb3b8c24cfb11d +"available-typed-arrays@npm:^1.0.6": + version: 1.0.7 + resolution: "available-typed-arrays@npm:1.0.7" + dependencies: + possible-typed-array-names: "npm:^1.0.0" + checksum: 6c9da3a66caddd83c875010a1ca8ef11eac02ba15fb592dc9418b2b5e7b77b645fa7729380a92d9835c2f05f2ca1b6251f39b993e0feb3f1517c74fa1af02cab + languageName: node + linkType: hard + +"axe-core@npm:=4.7.0": + version: 4.7.0 + resolution: "axe-core@npm:4.7.0" + checksum: 615c0f7722c3c9fcf353dbd70b00e2ceae234d4c17cbc839dd85c01d16797c4e4da45f8d27c6118e9e6b033fb06efd196106e13651a1b2f3a10e0f11c7b2f660 languageName: node linkType: hard @@ -2587,10 +2699,12 @@ __metadata: languageName: node linkType: hard -"axobject-query@npm:^2.2.0": - version: 2.2.0 - resolution: "axobject-query@npm:2.2.0" - checksum: 25de4b5ba6b28f5856fab60d86ea20fea941586bc38f33c81b78d66cd7e9c5792a9b9a9e60a38407aa634e01fee6a34133fbbd1d1d3d24cc686de83c6bb1e634 +"axobject-query@npm:^3.2.1": + version: 3.2.1 + resolution: "axobject-query@npm:3.2.1" + dependencies: + dequal: "npm:^2.0.3" + checksum: 675af2548ed4ece75ad6d50cc0473cfdec7579eac77ec9861e7088d03ffb171aa697b70d2877423bee2ce16460ef62c698c6442a105612cc015719e8ea06b0bd languageName: node linkType: hard @@ -2781,6 +2895,20 @@ __metadata: languageName: node linkType: hard +"browserslist@npm:^4.22.3": + version: 4.23.0 + resolution: "browserslist@npm:4.23.0" + dependencies: + caniuse-lite: "npm:^1.0.30001587" + electron-to-chromium: "npm:^1.4.668" + node-releases: "npm:^2.0.14" + update-browserslist-db: "npm:^1.0.13" + bin: + browserslist: cli.js + checksum: 496c3862df74565dd942b4ae65f502c575cbeba1fa4a3894dad7aa3b16130dc3033bc502d8848147f7b625154a284708253d9598bcdbef5a1e34cf11dc7bad8e + languageName: node + linkType: hard + "buffer-crc32@npm:~0.2.3": version: 0.2.13 resolution: "buffer-crc32@npm:0.2.13" @@ -2846,6 +2974,13 @@ __metadata: languageName: node linkType: hard +"builtin-modules@npm:^3.3.0": + version: 3.3.0 + resolution: "builtin-modules@npm:3.3.0" + checksum: 62e063ab40c0c1efccbfa9ffa31873e4f9d57408cb396a2649981a0ecbce56aabc93c28feaccbc5658c95aab2703ad1d11980e62ec2e5e72637404e1eb60f39e + languageName: node + linkType: hard + "bytes@npm:3.1.2": version: 3.1.2 resolution: "bytes@npm:3.1.2" @@ -2908,7 +3043,7 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": +"call-bind@npm:^1.0.0": version: 1.0.2 resolution: "call-bind@npm:1.0.2" dependencies: @@ -2918,6 +3053,19 @@ __metadata: languageName: node linkType: hard +"call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.6, call-bind@npm:^1.0.7": + version: 1.0.7 + resolution: "call-bind@npm:1.0.7" + dependencies: + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" + set-function-length: "npm:^1.2.1" + checksum: cd6fe658e007af80985da5185bff7b55e12ef4c2b6f41829a26ed1eef254b1f1c12e3dfd5b2b068c6ba8b86aba62390842d81752e67dcbaec4f6f76e7113b6b7 + languageName: node + linkType: hard + "callsites@npm:^3.0.0": version: 3.1.0 resolution: "callsites@npm:3.1.0" @@ -2932,6 +3080,13 @@ __metadata: languageName: node linkType: hard +"caniuse-lite@npm:^1.0.30001587": + version: 1.0.30001588 + resolution: "caniuse-lite@npm:1.0.30001588" + checksum: 09150ef2daa65c75cb2681832d5bc203760a02d9f71eb033dc0401fbfdbe026d3a84e54a8d2085f730a4f51eb074028b89013dd033841e1a0eb3c7323a50ed45 + languageName: node + linkType: hard + "chai@npm:^4.3.10": version: 4.4.1 resolution: "chai@npm:4.4.1" @@ -3081,6 +3236,13 @@ __metadata: languageName: node linkType: hard +"ci-info@npm:^4.0.0": + version: 4.0.0 + resolution: "ci-info@npm:4.0.0" + checksum: c983bb7ff1b06648f4a47432201abbd58291147d8ab5043dbb5c03e1a0e3fb2347f40d29b66a3044f28ffeb5dade01ac35aa6bd4e7464a44d9a49a3d7532415a + languageName: node + linkType: hard + "classnames@npm:2.3.1": version: 2.3.1 resolution: "classnames@npm:2.3.1" @@ -3095,6 +3257,15 @@ __metadata: languageName: node linkType: hard +"clean-regexp@npm:^1.0.0": + version: 1.0.0 + resolution: "clean-regexp@npm:1.0.0" + dependencies: + escape-string-regexp: "npm:^1.0.5" + checksum: 0b1ce281b07da2463c6882ea2e8409119b6cabbd9f687cdbdcee942c45b2b9049a2084f7b5f228c63ef9f21e722963ae0bfe56a735dbdbdd92512867625a7e40 + languageName: node + linkType: hard + "clean-stack@npm:^2.0.0, clean-stack@npm:^2.1.0": version: 2.2.0 resolution: "clean-stack@npm:2.2.0" @@ -3466,10 +3637,12 @@ __metadata: languageName: node linkType: hard -"core-js-pure@npm:^3.20.2": - version: 3.20.2 - resolution: "core-js-pure@npm:3.20.2" - checksum: 18c5ba0ce70b7412e5a60272bd71cf8178a77b943fe5aabe82a92cf9b21f4d0b4299e71c665dd8b937217daa500d2cf308160ec05eb128450dd2f7a358ea4b2f +"core-js-compat@npm:^3.34.0": + version: 3.36.0 + resolution: "core-js-compat@npm:3.36.0" + dependencies: + browserslist: "npm:^4.22.3" + checksum: 633c49a254fe48981057e33651e5a74a0a14f14731aa5afed5d2e61fbe3c5cbc116ffd4feaa158c683c40d6dc4fd2e6aa0ebe12c45d157cfa571309d08400c98 languageName: node linkType: hard @@ -3605,7 +3778,7 @@ __metadata: languageName: node linkType: hard -"damerau-levenshtein@npm:^1.0.7": +"damerau-levenshtein@npm:^1.0.8": version: 1.0.8 resolution: "damerau-levenshtein@npm:1.0.8" checksum: f4eba1c90170f96be25d95fa3857141b5f81e254f7e4d530da929217b19990ea9a0390fc53d3c1cafac9152fda78e722ea4894f765cf6216be413b5af1fbf821 @@ -3642,7 +3815,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:2.6.9, debug@npm:^2.2.0, debug@npm:^2.6.9": +"debug@npm:2.6.9, debug@npm:^2.2.0": version: 2.6.9 resolution: "debug@npm:2.6.9" dependencies: @@ -3723,6 +3896,17 @@ __metadata: languageName: node linkType: hard +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.2, define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" + dependencies: + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.0.1" + checksum: abdcb2505d80a53524ba871273e5da75e77e52af9e15b3aa65d8aad82b8a3a424dad7aee2cc0b71470ac7acf501e08defac362e8b6a73cdb4309f028061df4ae + languageName: node + linkType: hard + "define-properties@npm:^1.1.3": version: 1.1.3 resolution: "define-properties@npm:1.1.3" @@ -3732,6 +3916,17 @@ __metadata: languageName: node linkType: hard +"define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": + version: 1.2.1 + resolution: "define-properties@npm:1.2.1" + dependencies: + define-data-property: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + object-keys: "npm:^1.1.1" + checksum: b4ccd00597dd46cb2d4a379398f5b19fca84a16f3374e2249201992f36b30f6835949a9429669ee6b41b6e837205a163eadd745e472069e70dfc10f03e5fcc12 + languageName: node + linkType: hard + "del@npm:^6.0.0": version: 6.0.0 resolution: "del@npm:6.0.0" @@ -3776,6 +3971,13 @@ __metadata: languageName: node linkType: hard +"dequal@npm:^2.0.3": + version: 2.0.3 + resolution: "dequal@npm:2.0.3" + checksum: 6ff05a7561f33603df87c45e389c9ac0a95e3c056be3da1a0c4702149e3a7f6fe5ffbb294478687ba51a9e95f3a60e8b6b9005993acd79c292c7d15f71964b6b + languageName: node + linkType: hard + "destroy@npm:1.2.0": version: 1.2.0 resolution: "destroy@npm:1.2.0" @@ -4088,6 +4290,13 @@ __metadata: languageName: node linkType: hard +"electron-to-chromium@npm:^1.4.668": + version: 1.4.676 + resolution: "electron-to-chromium@npm:1.4.676" + checksum: 44e663ef85c3f0ac0014d6d5f72526ba579382dfacd120b1c5f9379bbf0527e93b005a257a12a4f64a8f72c6b5e41a3185344515c9a77f0299733ad0036f8252 + languageName: node + linkType: hard + "electron-unhandled@npm:^4.0.1": version: 4.0.1 resolution: "electron-unhandled@npm:4.0.1" @@ -4160,16 +4369,6 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.12.0": - version: 5.15.0 - resolution: "enhanced-resolve@npm:5.15.0" - dependencies: - graceful-fs: "npm:^4.2.4" - tapable: "npm:^2.2.0" - checksum: 180c3f2706f9117bf4dc7982e1df811dad83a8db075723f299245ef4488e0cad7e96859c5f0e410682d28a4ecd4da021ec7d06265f7e4eb6eed30c69ca5f7d3e - languageName: node - linkType: hard - "ensure-error@npm:^2.0.0": version: 2.1.0 resolution: "ensure-error@npm:2.1.0" @@ -4223,6 +4422,15 @@ __metadata: languageName: node linkType: hard +"error-ex@npm:^1.3.1": + version: 1.3.2 + resolution: "error-ex@npm:1.3.2" + dependencies: + is-arrayish: "npm:^0.2.1" + checksum: d547740aa29c34e753fb6fed2c5de81802438529c12b3673bd37b6bb1fe49b9b7abdc3c11e6062fe625d8a296b3cf769a80f878865e25e685f787763eede3ffb + languageName: node + linkType: hard + "error-stack-parser@npm:^2.0.6": version: 2.0.6 resolution: "error-stack-parser@npm:2.0.6" @@ -4232,31 +4440,118 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.19.0, es-abstract@npm:^1.19.1": - version: 1.19.1 - resolution: "es-abstract@npm:1.19.1" +"es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3, es-abstract@npm:^1.22.4": + version: 1.22.4 + resolution: "es-abstract@npm:1.22.4" dependencies: - call-bind: "npm:^1.0.2" + array-buffer-byte-length: "npm:^1.0.1" + arraybuffer.prototype.slice: "npm:^1.0.3" + available-typed-arrays: "npm:^1.0.6" + call-bind: "npm:^1.0.7" + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + es-set-tostringtag: "npm:^2.0.2" es-to-primitive: "npm:^1.2.1" - function-bind: "npm:^1.1.1" - get-intrinsic: "npm:^1.1.1" - get-symbol-description: "npm:^1.0.0" - has: "npm:^1.0.3" - has-symbols: "npm:^1.0.2" - internal-slot: "npm:^1.0.3" - is-callable: "npm:^1.2.4" - is-negative-zero: "npm:^2.0.1" + function.prototype.name: "npm:^1.1.6" + get-intrinsic: "npm:^1.2.4" + get-symbol-description: "npm:^1.0.2" + globalthis: "npm:^1.0.3" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.2" + has-proto: "npm:^1.0.1" + has-symbols: "npm:^1.0.3" + hasown: "npm:^2.0.1" + internal-slot: "npm:^1.0.7" + is-array-buffer: "npm:^3.0.4" + is-callable: "npm:^1.2.7" + is-negative-zero: "npm:^2.0.2" is-regex: "npm:^1.1.4" - is-shared-array-buffer: "npm:^1.0.1" + is-shared-array-buffer: "npm:^1.0.2" is-string: "npm:^1.0.7" - is-weakref: "npm:^1.0.1" - object-inspect: "npm:^1.11.0" + is-typed-array: "npm:^1.1.13" + is-weakref: "npm:^1.0.2" + object-inspect: "npm:^1.13.1" object-keys: "npm:^1.1.1" - object.assign: "npm:^4.1.2" - string.prototype.trimend: "npm:^1.0.4" - string.prototype.trimstart: "npm:^1.0.4" - unbox-primitive: "npm:^1.0.1" - checksum: 39d31c7dea477bd0fc89404e4beb3b008832e8c56426a448e5c44577929063037824130ea12f6273012b6d744b49c0ba11d7696fc8eb55731f2444d86a8a8e14 + object.assign: "npm:^4.1.5" + regexp.prototype.flags: "npm:^1.5.2" + safe-array-concat: "npm:^1.1.0" + safe-regex-test: "npm:^1.0.3" + string.prototype.trim: "npm:^1.2.8" + string.prototype.trimend: "npm:^1.0.7" + string.prototype.trimstart: "npm:^1.0.7" + typed-array-buffer: "npm:^1.0.1" + typed-array-byte-length: "npm:^1.0.0" + typed-array-byte-offset: "npm:^1.0.0" + typed-array-length: "npm:^1.0.4" + unbox-primitive: "npm:^1.0.2" + which-typed-array: "npm:^1.1.14" + checksum: 062e562a000e280c0c0683ad4a7b81732f97463bc769110c668a8edb739cd5df56975fa55965f5304a3256fd6eee03b9b66a47d863076f8976c2050731946b1f + languageName: node + linkType: hard + +"es-array-method-boxes-properly@npm:^1.0.0": + version: 1.0.0 + resolution: "es-array-method-boxes-properly@npm:1.0.0" + checksum: 27a8a21acf20f3f51f69dce8e643f151e380bffe569e95dc933b9ded9fcd89a765ee21b5229c93f9206c93f87395c6b75f80be8ac8c08a7ceb8771e1822ff1fb + languageName: node + linkType: hard + +"es-define-property@npm:^1.0.0": + version: 1.0.0 + resolution: "es-define-property@npm:1.0.0" + dependencies: + get-intrinsic: "npm:^1.2.4" + checksum: f66ece0a887b6dca71848fa71f70461357c0e4e7249696f81bad0a1f347eed7b31262af4a29f5d726dc026426f085483b6b90301855e647aa8e21936f07293c6 + languageName: node + linkType: hard + +"es-errors@npm:^1.0.0, es-errors@npm:^1.1.0, es-errors@npm:^1.2.1, es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: 96e65d640156f91b707517e8cdc454dd7d47c32833aa3e85d79f24f9eb7ea85f39b63e36216ef0114996581969b59fe609a94e30316b08f5f4df1d44134cf8d5 + languageName: node + linkType: hard + +"es-iterator-helpers@npm:^1.0.12, es-iterator-helpers@npm:^1.0.15": + version: 1.0.17 + resolution: "es-iterator-helpers@npm:1.0.17" + dependencies: + asynciterator.prototype: "npm:^1.0.0" + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.22.4" + es-errors: "npm:^1.3.0" + es-set-tostringtag: "npm:^2.0.2" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" + globalthis: "npm:^1.0.3" + has-property-descriptors: "npm:^1.0.2" + has-proto: "npm:^1.0.1" + has-symbols: "npm:^1.0.3" + internal-slot: "npm:^1.0.7" + iterator.prototype: "npm:^1.1.2" + safe-array-concat: "npm:^1.1.0" + checksum: 42c6eb65368d34b556dac1cc8d34ba753eb526bc7d4594be3b77799440be78d31fddfd60717af2d9ce6d021de8346e7a573141d789821e38836e60441f93ccfd + languageName: node + linkType: hard + +"es-set-tostringtag@npm:^2.0.2": + version: 2.0.2 + resolution: "es-set-tostringtag@npm:2.0.2" + dependencies: + get-intrinsic: "npm:^1.2.2" + has-tostringtag: "npm:^1.0.0" + hasown: "npm:^2.0.0" + checksum: afcec3a4c9890ae14d7ec606204858441c801ff84f312538e1d1ccf1e5493c8b17bd672235df785f803756472cb4f2d49b87bde5237aef33411e74c22f194e07 + languageName: node + linkType: hard + +"es-shim-unscopables@npm:^1.0.0, es-shim-unscopables@npm:^1.0.2": + version: 1.0.2 + resolution: "es-shim-unscopables@npm:1.0.2" + dependencies: + hasown: "npm:^2.0.0" + checksum: 6d3bf91f658a27cc7217cd32b407a0d714393a84d125ad576319b9e83a893bea165cf41270c29e9ceaa56d3cf41608945d7e2a2c31fd51c0009b0c31402b91c7 languageName: node linkType: hard @@ -4579,45 +4874,37 @@ __metadata: languageName: node linkType: hard -"eslint-import-resolver-node@npm:^0.3.6": - version: 0.3.6 - resolution: "eslint-import-resolver-node@npm:0.3.6" +"eslint-config-mifi@npm:^0.0.3": + version: 0.0.3 + resolution: "eslint-config-mifi@npm:0.0.3" dependencies: - debug: "npm:^3.2.7" - resolve: "npm:^1.20.0" - checksum: c35c6edb7e77980a90922be8aedfacde572839b817146ab9fbed01195cb173cc40aa02d44ba0950170cfd41add11bc652dda8efed7ca766d733dc1eefc174614 - languageName: node - linkType: hard - -"eslint-import-resolver-typescript@npm:^3.6.1": - version: 3.6.1 - resolution: "eslint-import-resolver-typescript@npm:3.6.1" - dependencies: - debug: "npm:^4.3.4" - enhanced-resolve: "npm:^5.12.0" - eslint-module-utils: "npm:^2.7.4" - fast-glob: "npm:^3.3.1" - get-tsconfig: "npm:^4.5.0" - is-core-module: "npm:^2.11.0" - is-glob: "npm:^4.0.3" + eslint-config-airbnb: "npm:^19.0.4" peerDependencies: - eslint: "*" - eslint-plugin-import: "*" - checksum: 261df24721a7c5e37ee598b63e7e12c54e3d20c9ae5de6dbc132cecced023cb967c481007eef73252da108ac7eabb2e859853ff2e2d5776699a2954466ca716f + "@typescript-eslint/eslint-plugin": ^6.12.0 + "@typescript-eslint/parser": ^6.12.0 + eslint: ^8.2.0 + eslint-plugin-import: ^2.25.3 + eslint-plugin-jsx-a11y: ^6.5.1 + eslint-plugin-react: ^7.28.0 + eslint-plugin-react-hooks: ^4.3.0 + eslint-plugin-unicorn: ^51.0.1 + typescript: ~5.2.0 + checksum: 2f54fba3bedc39b5c6e1e631dcfe0026d96ce573c29842c5b89b3e80383f8526b3e1a8730eb5fef1f0678ba36ea19e78db02d5ca5720a9c79687558ea5de63ee languageName: node linkType: hard -"eslint-module-utils@npm:^2.7.2": - version: 2.7.2 - resolution: "eslint-module-utils@npm:2.7.2" +"eslint-import-resolver-node@npm:^0.3.9": + version: 0.3.9 + resolution: "eslint-import-resolver-node@npm:0.3.9" dependencies: debug: "npm:^3.2.7" - find-up: "npm:^2.1.0" - checksum: 9c116efc0c920402f579f92c9a8fb9401d6f3bae77d0d68569578fae94f1310aad8c9f196d1656904e60ee558767bef839dd8140dc4d9b43a3fe9efbbcb26062 + is-core-module: "npm:^2.13.0" + resolve: "npm:^1.22.4" + checksum: d52e08e1d96cf630957272e4f2644dcfb531e49dcfd1edd2e07e43369eb2ec7a7d4423d417beee613201206ff2efa4eb9a582b5825ee28802fc7c71fcd53ca83 languageName: node linkType: hard -"eslint-module-utils@npm:^2.7.4": +"eslint-module-utils@npm:^2.8.0": version: 2.8.0 resolution: "eslint-module-utils@npm:2.8.0" dependencies: @@ -4630,80 +4917,116 @@ __metadata: linkType: hard "eslint-plugin-import@npm:^2.25.3": - version: 2.25.4 - resolution: "eslint-plugin-import@npm:2.25.4" + version: 2.29.1 + resolution: "eslint-plugin-import@npm:2.29.1" dependencies: - array-includes: "npm:^3.1.4" - array.prototype.flat: "npm:^1.2.5" - debug: "npm:^2.6.9" + array-includes: "npm:^3.1.7" + array.prototype.findlastindex: "npm:^1.2.3" + array.prototype.flat: "npm:^1.3.2" + array.prototype.flatmap: "npm:^1.3.2" + debug: "npm:^3.2.7" doctrine: "npm:^2.1.0" - eslint-import-resolver-node: "npm:^0.3.6" - eslint-module-utils: "npm:^2.7.2" - has: "npm:^1.0.3" - is-core-module: "npm:^2.8.0" + eslint-import-resolver-node: "npm:^0.3.9" + eslint-module-utils: "npm:^2.8.0" + hasown: "npm:^2.0.0" + is-core-module: "npm:^2.13.1" is-glob: "npm:^4.0.3" - minimatch: "npm:^3.0.4" - object.values: "npm:^1.1.5" - resolve: "npm:^1.20.0" - tsconfig-paths: "npm:^3.12.0" + minimatch: "npm:^3.1.2" + object.fromentries: "npm:^2.0.7" + object.groupby: "npm:^1.0.1" + object.values: "npm:^1.1.7" + semver: "npm:^6.3.1" + tsconfig-paths: "npm:^3.15.0" peerDependencies: eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - checksum: fec71269083d4e7aba89fe620753166b5a548406c933324b719977d76df96a30eaceee9cc7084cc4b73f3463853bbf8c87661b93c489502f39c132cae659e86f + checksum: 5865f05c38552145423c535326ec9a7113ab2305c7614c8b896ff905cfabc859c8805cac21e979c9f6f742afa333e6f62f812eabf891a7e8f5f0b853a32593c1 languageName: node linkType: hard "eslint-plugin-jsx-a11y@npm:^6.5.1": - version: 6.5.1 - resolution: "eslint-plugin-jsx-a11y@npm:6.5.1" + version: 6.8.0 + resolution: "eslint-plugin-jsx-a11y@npm:6.8.0" dependencies: - "@babel/runtime": "npm:^7.16.3" - aria-query: "npm:^4.2.2" - array-includes: "npm:^3.1.4" - ast-types-flow: "npm:^0.0.7" - axe-core: "npm:^4.3.5" - axobject-query: "npm:^2.2.0" - damerau-levenshtein: "npm:^1.0.7" + "@babel/runtime": "npm:^7.23.2" + aria-query: "npm:^5.3.0" + array-includes: "npm:^3.1.7" + array.prototype.flatmap: "npm:^1.3.2" + ast-types-flow: "npm:^0.0.8" + axe-core: "npm:=4.7.0" + axobject-query: "npm:^3.2.1" + damerau-levenshtein: "npm:^1.0.8" emoji-regex: "npm:^9.2.2" - has: "npm:^1.0.3" - jsx-ast-utils: "npm:^3.2.1" - language-tags: "npm:^1.0.5" - minimatch: "npm:^3.0.4" + es-iterator-helpers: "npm:^1.0.15" + hasown: "npm:^2.0.0" + jsx-ast-utils: "npm:^3.3.5" + language-tags: "npm:^1.0.9" + minimatch: "npm:^3.1.2" + object.entries: "npm:^1.1.7" + object.fromentries: "npm:^2.0.7" peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: b8639da5a0614ad998f5a8481705b6ace06ad1a2e2d522f15997b070dda39ca44afd37229aa8b3cf6c310043c3a2992a6de8a700f8522bcd3f86ddcea008fdf0 + checksum: 7a8e4498531a43d988ce2f12502a3f5ce96eacfec13f956cf927f24bb041b724fb7fc0f0306ea19d143bfc79e138bf25e25acca0822847206ac6bf5ce095e846 languageName: node linkType: hard "eslint-plugin-react-hooks@npm:^4.3.0": - version: 4.3.0 - resolution: "eslint-plugin-react-hooks@npm:4.3.0" + version: 4.6.0 + resolution: "eslint-plugin-react-hooks@npm:4.6.0" peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - checksum: 7bc61f9b5c53aa459eff810131303316c8242bf761d9ccc44f7f9e56168569b0e972e457150d829f56b3555c90a583b6895f9fd7a0a3d189d68daaf7881a1418 + checksum: 3c63134e056a6d98d66e2c475c81f904169db817e89316d14e36269919e31f4876a2588aa0e466ec8ef160465169c627fe823bfdaae7e213946584e4a165a3ac languageName: node linkType: hard "eslint-plugin-react@npm:^7.28.0": - version: 7.28.0 - resolution: "eslint-plugin-react@npm:7.28.0" + version: 7.33.2 + resolution: "eslint-plugin-react@npm:7.33.2" dependencies: - array-includes: "npm:^3.1.4" - array.prototype.flatmap: "npm:^1.2.5" + array-includes: "npm:^3.1.6" + array.prototype.flatmap: "npm:^1.3.1" + array.prototype.tosorted: "npm:^1.1.1" doctrine: "npm:^2.1.0" + es-iterator-helpers: "npm:^1.0.12" estraverse: "npm:^5.3.0" jsx-ast-utils: "npm:^2.4.1 || ^3.0.0" - minimatch: "npm:^3.0.4" - object.entries: "npm:^1.1.5" - object.fromentries: "npm:^2.0.5" - object.hasown: "npm:^1.1.0" - object.values: "npm:^1.1.5" - prop-types: "npm:^15.7.2" - resolve: "npm:^2.0.0-next.3" - semver: "npm:^6.3.0" - string.prototype.matchall: "npm:^4.0.6" + minimatch: "npm:^3.1.2" + object.entries: "npm:^1.1.6" + object.fromentries: "npm:^2.0.6" + object.hasown: "npm:^1.1.2" + object.values: "npm:^1.1.6" + prop-types: "npm:^15.8.1" + resolve: "npm:^2.0.0-next.4" + semver: "npm:^6.3.1" + string.prototype.matchall: "npm:^4.0.8" peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: 6aae31c976560fa612955c10c64a388288eff96e4267ebd200389d70eb1779c40dab3f4ef6decdc02a986ee9bbc5033b1e7b12e6019de55824e15c3bc901b4f6 + checksum: cb8c5dd5859cace330e24b7d74b9c652c0d93ef1d87957261fe1ac2975c27c918d0d5dc607f25aba4972ce74d04456f4f93883a16ac10cd598680d047fc3495d + languageName: node + linkType: hard + +"eslint-plugin-unicorn@npm:^51.0.1": + version: 51.0.1 + resolution: "eslint-plugin-unicorn@npm:51.0.1" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.22.20" + "@eslint-community/eslint-utils": "npm:^4.4.0" + "@eslint/eslintrc": "npm:^2.1.4" + ci-info: "npm:^4.0.0" + clean-regexp: "npm:^1.0.0" + core-js-compat: "npm:^3.34.0" + esquery: "npm:^1.5.0" + indent-string: "npm:^4.0.0" + is-builtin-module: "npm:^3.2.1" + jsesc: "npm:^3.0.2" + pluralize: "npm:^8.0.0" + read-pkg-up: "npm:^7.0.1" + regexp-tree: "npm:^0.1.27" + regjsparser: "npm:^0.10.0" + semver: "npm:^7.5.4" + strip-indent: "npm:^3.0.0" + peerDependencies: + eslint: ">=8.56.0" + checksum: cea770332423d49d0cd86ca96055be7f14895e1d0a9fb24c8ed4f18a6e1eeff362d4881c46e85d85c37938bb85a6eeae7e347bcf7a3bb7307a8dd309651e0adf languageName: node linkType: hard @@ -4724,14 +5047,14 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^8.53.0": - version: 8.53.0 - resolution: "eslint@npm:8.53.0" +"eslint@npm:^8.2.0": + version: 8.56.0 + resolution: "eslint@npm:8.56.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" "@eslint-community/regexpp": "npm:^4.6.1" - "@eslint/eslintrc": "npm:^2.1.3" - "@eslint/js": "npm:8.53.0" + "@eslint/eslintrc": "npm:^2.1.4" + "@eslint/js": "npm:8.56.0" "@humanwhocodes/config-array": "npm:^0.11.13" "@humanwhocodes/module-importer": "npm:^1.0.1" "@nodelib/fs.walk": "npm:^1.2.8" @@ -4768,7 +5091,7 @@ __metadata: text-table: "npm:^0.2.0" bin: eslint: bin/eslint.js - checksum: e305a71ce2b9a8631b293266fe53e346c76f28bc8d004af33f10e537cf133db1fb87af3599376e70ed6e0f89a78be10c4f08ddd0c1c9c0c497cd143b4a270420 + checksum: ef6193c6e4cef20774b985a5cc2fd4bf6d3c4decd423117cbc4a0196617861745db291217ad3c537bc3a160650cca965bc818f55e1f3e446af1fcb293f9940a5 languageName: node linkType: hard @@ -4783,7 +5106,7 @@ __metadata: languageName: node linkType: hard -"esquery@npm:^1.4.2": +"esquery@npm:^1.4.2, esquery@npm:^1.5.0": version: 1.5.0 resolution: "esquery@npm:1.5.0" dependencies: @@ -5016,19 +5339,6 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.3.1": - version: 3.3.2 - resolution: "fast-glob@npm:3.3.2" - dependencies: - "@nodelib/fs.stat": "npm:^2.0.2" - "@nodelib/fs.walk": "npm:^1.2.3" - glob-parent: "npm:^5.1.2" - merge2: "npm:^1.3.0" - micromatch: "npm:^4.0.4" - checksum: 222512e9315a0efca1276af9adb2127f02105d7288fa746145bf45e2716383fb79eb983c89601a72a399a56b7c18d38ce70457c5466218c5f13fad957cee16df - languageName: node - linkType: hard - "fast-json-stable-stringify@npm:^2.0.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" @@ -5177,15 +5487,6 @@ __metadata: languageName: node linkType: hard -"find-up@npm:^2.1.0": - version: 2.1.0 - resolution: "find-up@npm:2.1.0" - dependencies: - locate-path: "npm:^2.0.0" - checksum: 43284fe4da09f89011f08e3c32cd38401e786b19226ea440b75386c1b12a4cb738c94969808d53a84f564ede22f732c8409e3cfc3f7fb5b5c32378ad0bbf28bd - languageName: node - linkType: hard - "find-up@npm:^3.0.0": version: 3.0.0 resolution: "find-up@npm:3.0.0" @@ -5195,6 +5496,16 @@ __metadata: languageName: node linkType: hard +"find-up@npm:^4.1.0": + version: 4.1.0 + resolution: "find-up@npm:4.1.0" + dependencies: + locate-path: "npm:^5.0.0" + path-exists: "npm:^4.0.0" + checksum: 4c172680e8f8c1f78839486e14a43ef82e9decd0e74145f40707cc42e7420506d5ec92d9a11c22bd2c48fb0c384ea05dd30e10dd152fefeec6f2f75282a8b844 + languageName: node + linkType: hard + "find-up@npm:^5.0.0": version: 5.0.0 resolution: "find-up@npm:5.0.0" @@ -5206,19 +5517,20 @@ __metadata: linkType: hard "flat-cache@npm:^3.0.4": - version: 3.0.4 - resolution: "flat-cache@npm:3.0.4" + version: 3.2.0 + resolution: "flat-cache@npm:3.2.0" dependencies: - flatted: "npm:^3.1.0" + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.3" rimraf: "npm:^3.0.2" - checksum: 9fe5d0cb97c988e3b25242e71346965fae22757674db3fca14206850af2efa3ca3b04a3ba0eba8d5e20fd8a3be80a2e14b1c2917e70ffe1acb98a8c3327e4c9f + checksum: 02381c6ece5e9fa5b826c9bbea481d7fd77645d96e4b0b1395238124d581d10e56f17f723d897b6d133970f7a57f0fab9148cbbb67237a0a0ffe794ba60c0c70 languageName: node linkType: hard -"flatted@npm:^3.1.0": - version: 3.2.4 - resolution: "flatted@npm:3.2.4" - checksum: 272cce99b0ae27e88307951a4aaaf18cd0c2c7e6aac0d2dc378b8e46c5faabf89f4c9f7e0e3696ef2034aa9b1f450fccb5c18ba4f20bf72e88bac47f3120bde5 +"flatted@npm:^3.2.9": + version: 3.3.0 + resolution: "flatted@npm:3.3.0" + checksum: b06075924d0801bef6d9f44dba8f71303da15a2e25d57c9e0777c4ae65b1e254ff414a8b40bb280d6b916afa08e8989d51ddd78139bb8377682d41b1f948de88 languageName: node linkType: hard @@ -5249,6 +5561,15 @@ __metadata: languageName: node linkType: hard +"for-each@npm:^0.3.3": + version: 0.3.3 + resolution: "for-each@npm:0.3.3" + dependencies: + is-callable: "npm:^1.1.3" + checksum: fdac0cde1be35610bd635ae958422e8ce0cc1313e8d32ea6d34cfda7b60850940c1fd07c36456ad76bd9c24aef6ff5e03b02beb58c83af5ef6c968a64eada676 + languageName: node + linkType: hard + "form-data@npm:^4.0.0": version: 4.0.0 resolution: "form-data@npm:4.0.0" @@ -5466,6 +5787,25 @@ __metadata: languageName: node linkType: hard +"function.prototype.name@npm:^1.1.5, function.prototype.name@npm:^1.1.6": + version: 1.1.6 + resolution: "function.prototype.name@npm:1.1.6" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + functions-have-names: "npm:^1.2.3" + checksum: 4d40be44d4609942e4e90c4fff77a811fa936f4985d92d2abfcf44f673ba344e2962bf223a33101f79c1a056465f36f09b072b9c289d7660ca554a12491cd5a2 + languageName: node + linkType: hard + +"functions-have-names@npm:^1.2.3": + version: 1.2.3 + resolution: "functions-have-names@npm:1.2.3" + checksum: 0ddfd3ed1066a55984aaecebf5419fbd9344a5c38dd120ffb0739fac4496758dcf371297440528b115e4367fc46e3abc86a2cc0ff44612181b175ae967a11a05 + languageName: node + linkType: hard + "fuzzaldrin-plus@npm:^0.6.0": version: 0.6.0 resolution: "fuzzaldrin-plus@npm:0.6.0" @@ -5526,7 +5866,7 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.0, get-intrinsic@npm:^1.1.1": +"get-intrinsic@npm:^1.0.2": version: 1.1.1 resolution: "get-intrinsic@npm:1.1.1" dependencies: @@ -5537,6 +5877,19 @@ __metadata: languageName: node linkType: hard +"get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": + version: 1.2.4 + resolution: "get-intrinsic@npm:1.2.4" + dependencies: + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + has-proto: "npm:^1.0.1" + has-symbols: "npm:^1.0.3" + hasown: "npm:^2.0.0" + checksum: 85bbf4b234c3940edf8a41f4ecbd4e25ce78e5e6ad4e24ca2f77037d983b9ef943fd72f00f3ee97a49ec622a506b67db49c36246150377efcda1c9eb03e5f06d + languageName: node + linkType: hard + "get-stream@npm:^5.1.0": version: 5.2.0 resolution: "get-stream@npm:5.2.0" @@ -5560,22 +5913,14 @@ __metadata: languageName: node linkType: hard -"get-symbol-description@npm:^1.0.0": - version: 1.0.0 - resolution: "get-symbol-description@npm:1.0.0" +"get-symbol-description@npm:^1.0.2": + version: 1.0.2 + resolution: "get-symbol-description@npm:1.0.2" dependencies: - call-bind: "npm:^1.0.2" - get-intrinsic: "npm:^1.1.1" - checksum: 7e5f298afe0f0872747dce4a949ce490ebc5d6dd6aefbbe5044543711c9b19a4dfaebdbc627aee99e1299d58a435b2fbfa083458c1d58be6dc03a3bada24d359 - languageName: node - linkType: hard - -"get-tsconfig@npm:^4.5.0": - version: 4.7.2 - resolution: "get-tsconfig@npm:4.7.2" - dependencies: - resolve-pkg-maps: "npm:^1.0.0" - checksum: f21135848fb5d16012269b7b34b186af7a41824830f8616aba17a15eb4d9e54fdc876833f1e21768395215a826c8145582f5acd594ae2b4de3284d10b38d20f8 + call-bind: "npm:^1.0.5" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.4" + checksum: e1cb53bc211f9dbe9691a4f97a46837a553c4e7caadd0488dc24ac694db8a390b93edd412b48dcdd0b4bbb4c595de1709effc75fc87c0839deedc6968f5bd973 languageName: node linkType: hard @@ -5706,11 +6051,11 @@ __metadata: linkType: hard "globals@npm:^13.19.0": - version: 13.23.0 - resolution: "globals@npm:13.23.0" + version: 13.24.0 + resolution: "globals@npm:13.24.0" dependencies: type-fest: "npm:^0.20.2" - checksum: bf6a8616f4a64959c0b9a8eb4dc8a02e7dd0082385f7f06bc9694d9fceabe39f83f83789322cfe0470914dc8b273b7a29af5570b9e1a0507d3fb7348a64703a3 + checksum: 62c5b1997d06674fc7191d3e01e324d3eda4d65ac9cc4e78329fa3b5c4fd42a0e1c8722822497a6964eee075255ce21ccf1eec2d83f92ef3f06653af4d0ee28e languageName: node linkType: hard @@ -5723,6 +6068,15 @@ __metadata: languageName: node linkType: hard +"globalthis@npm:^1.0.3": + version: 1.0.3 + resolution: "globalthis@npm:1.0.3" + dependencies: + define-properties: "npm:^1.1.3" + checksum: 45ae2f3b40a186600d0368f2a880ae257e8278b4c7704f0417d6024105ad7f7a393661c5c2fa1334669cd485ea44bc883a08fdd4516df2428aec40c99f52aa89 + languageName: node + linkType: hard + "globby@npm:^11.0.1, globby@npm:^11.1.0": version: 11.1.0 resolution: "globby@npm:11.1.0" @@ -5737,6 +6091,15 @@ __metadata: languageName: node linkType: hard +"gopd@npm:^1.0.1": + version: 1.0.1 + resolution: "gopd@npm:1.0.1" + dependencies: + get-intrinsic: "npm:^1.1.3" + checksum: 5fbc7ad57b368ae4cd2f41214bd947b045c1a4be2f194a7be1778d71f8af9dbf4004221f3b6f23e30820eb0d052b4f819fe6ebe8221e2a3c6f0ee4ef173421ca + languageName: node + linkType: hard + "got@npm:^11.8.5": version: 11.8.6 resolution: "got@npm:11.8.6" @@ -5786,10 +6149,10 @@ __metadata: languageName: node linkType: hard -"has-bigints@npm:^1.0.1": - version: 1.0.1 - resolution: "has-bigints@npm:1.0.1" - checksum: 44ab55868174470065d2e0f8f6def1c990d12b82162a8803c679699fa8a39f966e336f2a33c185092fe8aea7e8bf2e85f1c26add5f29d98f2318bd270096b183 +"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": + version: 1.0.2 + resolution: "has-bigints@npm:1.0.2" + checksum: 4e0426c900af034d12db14abfece02ce7dbf53f2022d28af1a97913ff4c07adb8799476d57dc44fbca0e07d1dbda2a042c2928b1f33d3f09c15de0640a7fb81b languageName: node linkType: hard @@ -5807,19 +6170,42 @@ __metadata: languageName: node linkType: hard -"has-symbols@npm:^1.0.1, has-symbols@npm:^1.0.2": +"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.1, has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" + dependencies: + es-define-property: "npm:^1.0.0" + checksum: 2d8c9ab8cebb572e3362f7d06139a4592105983d4317e68f7adba320fe6ddfc8874581e0971e899e633fd5f72e262830edce36d5a0bc863dad17ad20572484b2 + languageName: node + linkType: hard + +"has-proto@npm:^1.0.1": + version: 1.0.3 + resolution: "has-proto@npm:1.0.3" + checksum: 0b67c2c94e3bea37db3e412e3c41f79d59259875e636ba471e94c009cdfb1fa82bf045deeffafc7dbb9c148e36cae6b467055aaa5d9fad4316e11b41e3ba551a + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.1": version: 1.0.2 resolution: "has-symbols@npm:1.0.2" checksum: 3d8b4f3c7d9e1535a1ba969035234e20d127519447ce6252be615fae55201119ef557f629328699385ca3e992f1d480e19fe2a850088bd98044d0d9f10199b70 languageName: node linkType: hard -"has-tostringtag@npm:^1.0.0": - version: 1.0.0 - resolution: "has-tostringtag@npm:1.0.0" +"has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": + version: 1.0.3 + resolution: "has-symbols@npm:1.0.3" + checksum: 464f97a8202a7690dadd026e6d73b1ceeddd60fe6acfd06151106f050303eaa75855aaa94969df8015c11ff7c505f196114d22f7386b4a471038da5874cf5e9b + languageName: node + linkType: hard + +"has-tostringtag@npm:^1.0.0, has-tostringtag@npm:^1.0.1": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" dependencies: - has-symbols: "npm:^1.0.2" - checksum: 95546e7132efc895a9ae64a8a7cf52588601fc3d52e0304ed228f336992cdf0baaba6f3519d2655e560467db35a1ed79f6420c286cc91a13aa0647a31ed92570 + has-symbols: "npm:^1.0.3" + checksum: c74c5f5ceee3c8a5b8bc37719840dc3749f5b0306d818974141dda2471a1a2ca6c8e46b9d6ac222c5345df7a901c9b6f350b1e6d62763fec877e26609a401bfe languageName: node linkType: hard @@ -5839,12 +6225,12 @@ __metadata: languageName: node linkType: hard -"hasown@npm:^2.0.0": - version: 2.0.0 - resolution: "hasown@npm:2.0.0" +"hasown@npm:^2.0.0, hasown@npm:^2.0.1": + version: 2.0.1 + resolution: "hasown@npm:2.0.1" dependencies: function-bind: "npm:^1.1.2" - checksum: c330f8d93f9d23fe632c719d4db3d698ef7d7c367d51548b836069e06a90fa9151e868c8e67353cfe98d67865bf7354855db28fa36eb1b18fa5d4a3f4e7f1c90 + checksum: b7f9107387ee68abed88e965c2b99e868b5e0e9d289db1ddd080706ffafb69533b4f538b0e6362585bae8d6cbd080249f65e79702f74c225990f66d6106be3f6 languageName: node linkType: hard @@ -5910,6 +6296,13 @@ __metadata: languageName: node linkType: hard +"hosted-git-info@npm:^2.1.4": + version: 2.8.9 + resolution: "hosted-git-info@npm:2.8.9" + checksum: 96da7d412303704af41c3819207a09ea2cab2de97951db4cf336bb8bce8d8e36b9a6821036ad2e55e67d3be0af8f967a7b57981203fbfb88bc05cd803407b8c3 + languageName: node + linkType: hard + "hosted-git-info@npm:^4.1.0": version: 4.1.0 resolution: "hosted-git-info@npm:4.1.0" @@ -6152,9 +6545,9 @@ __metadata: linkType: hard "ignore@npm:^5.2.4": - version: 5.3.0 - resolution: "ignore@npm:5.3.0" - checksum: 51594355cea4c6ad6b28b3b85eb81afa7b988a1871feefd7062baf136c95aa06760ee934fa9590e43d967bd377ce84a4cf6135fbeb6063e063f1182a0e9a3bcd + version: 5.3.1 + resolution: "ignore@npm:5.3.1" + checksum: 0a884c2fbc8c316f0b9f92beaf84464253b73230a4d4d286697be45fca081199191ca33e1c2e82d9e5f851f5e9a48a78e25a35c951e7eb41e59f150db3530065 languageName: node linkType: hard @@ -6278,14 +6671,14 @@ __metadata: languageName: node linkType: hard -"internal-slot@npm:^1.0.3": - version: 1.0.3 - resolution: "internal-slot@npm:1.0.3" +"internal-slot@npm:^1.0.5, internal-slot@npm:^1.0.7": + version: 1.0.7 + resolution: "internal-slot@npm:1.0.7" dependencies: - get-intrinsic: "npm:^1.1.0" - has: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + hasown: "npm:^2.0.0" side-channel: "npm:^1.0.4" - checksum: 1c6d22f7977b325e51387191a992a553bf7c380db548a32c09bbb4563a799d739d3ef629841234290a032dc555ca7e89178e8a35404dad77b55f2676be8a1ba2 + checksum: 3e66720508831153ecf37d13def9f6856f9f2960989ec8a0a0476c98f887fca9eff0163127466485cb825c900c2d6fc601aa9117b7783b90ffce23a71ea5d053 languageName: node linkType: hard @@ -6330,6 +6723,23 @@ __metadata: languageName: node linkType: hard +"is-array-buffer@npm:^3.0.4": + version: 3.0.4 + resolution: "is-array-buffer@npm:3.0.4" + dependencies: + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.1" + checksum: 34a26213d981d58b30724ef37a1e0682f4040d580fa9ff58fdfdd3cefcb2287921718c63971c1c404951e7b747c50fdc7caf6e867e951353fa71b369c04c969b + languageName: node + linkType: hard + +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: 73ced84fa35e59e2c57da2d01e12cd01479f381d7f122ce41dcbb713f09dbfc651315832cd2bf8accba7681a69e4d6f1e03941d94dd10040d415086360e7005e + languageName: node + linkType: hard + "is-arrayish@npm:^0.3.1": version: 0.3.2 resolution: "is-arrayish@npm:0.3.2" @@ -6337,6 +6747,15 @@ __metadata: languageName: node linkType: hard +"is-async-function@npm:^2.0.0": + version: 2.0.0 + resolution: "is-async-function@npm:2.0.0" + dependencies: + has-tostringtag: "npm:^1.0.0" + checksum: 2cf336fbf8cba3badcf526aa3d10384c30bab32615ac4831b74492eb4e843ccb7d8439a119c27f84bcf217d72024e611b1373f870f433b48f3fa57d3d1b863f1 + languageName: node + linkType: hard + "is-bigint@npm:^1.0.1": version: 1.0.4 resolution: "is-bigint@npm:1.0.4" @@ -6372,10 +6791,19 @@ __metadata: languageName: node linkType: hard -"is-callable@npm:^1.1.4, is-callable@npm:^1.2.4": - version: 1.2.4 - resolution: "is-callable@npm:1.2.4" - checksum: 4e3d8c08208475e74a4108a9dc44dbcb74978782e38a1d1b55388342a4824685765d95917622efa2ca1483f7c4dbec631dd979cbb3ebd239f57a75c83a46d99f +"is-builtin-module@npm:^3.2.1": + version: 3.2.1 + resolution: "is-builtin-module@npm:3.2.1" + dependencies: + builtin-modules: "npm:^3.3.0" + checksum: e8f0ffc19a98240bda9c7ada84d846486365af88d14616e737d280d378695c8c448a621dcafc8332dbf0fcd0a17b0763b845400709963fa9151ddffece90ae88 + languageName: node + linkType: hard + +"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": + version: 1.2.7 + resolution: "is-callable@npm:1.2.7" + checksum: 48a9297fb92c99e9df48706241a189da362bff3003354aea4048bd5f7b2eb0d823cd16d0a383cece3d76166ba16d85d9659165ac6fcce1ac12e6c649d66dbdb9 languageName: node linkType: hard @@ -6390,7 +6818,7 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.11.0": +"is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1": version: 2.13.1 resolution: "is-core-module@npm:2.13.1" dependencies: @@ -6399,16 +6827,7 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.2.0, is-core-module@npm:^2.8.0": - version: 2.8.1 - resolution: "is-core-module@npm:2.8.1" - dependencies: - has: "npm:^1.0.3" - checksum: 80b33fbd450c3b7070a8ea101b730a8ae0aee326bb665cdb067220edbc98fb847d1294f8ded036d5b022827fb8d3e6fcf30313a601785c5d902db7660f6cd7b1 - languageName: node - linkType: hard - -"is-date-object@npm:^1.0.1": +"is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.5": version: 1.0.5 resolution: "is-date-object@npm:1.0.5" dependencies: @@ -6431,6 +6850,15 @@ __metadata: languageName: node linkType: hard +"is-finalizationregistry@npm:^1.0.2": + version: 1.0.2 + resolution: "is-finalizationregistry@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.2" + checksum: 1b8e9e1bf2075e862315ef9d38ce6d39c43ca9d81d46f73b34473506992f4b0fbaadb47ec9b420a5e76afe3f564d9f1f0d9b552ef272cc2395e0f21d743c9c29 + languageName: node + linkType: hard + "is-fullwidth-code-point@npm:^1.0.0": version: 1.0.0 resolution: "is-fullwidth-code-point@npm:1.0.0" @@ -6447,6 +6875,15 @@ __metadata: languageName: node linkType: hard +"is-generator-function@npm:^1.0.10": + version: 1.0.10 + resolution: "is-generator-function@npm:1.0.10" + dependencies: + has-tostringtag: "npm:^1.0.0" + checksum: 499a3ce6361064c3bd27fbff5c8000212d48506ebe1977842bbd7b3e708832d0deb1f4cc69186ece3640770e8c4f1287b24d99588a0b8058b2dbdd344bc1f47f + languageName: node + linkType: hard + "is-glob@npm:^3.1.0": version: 3.1.0 resolution: "is-glob@npm:3.1.0" @@ -6479,6 +6916,13 @@ __metadata: languageName: node linkType: hard +"is-map@npm:^2.0.1": + version: 2.0.2 + resolution: "is-map@npm:2.0.2" + checksum: 60ba910f835f2eacb1fdf5b5a6c60fe1c702d012a7673e6546992bcc0c873f62ada6e13d327f9e48f1720d49c152d6cdecae1fa47a261ef3d247c3ce6f0e1d39 + languageName: node + linkType: hard + "is-negated-glob@npm:^1.0.0": version: 1.0.0 resolution: "is-negated-glob@npm:1.0.0" @@ -6486,10 +6930,10 @@ __metadata: languageName: node linkType: hard -"is-negative-zero@npm:^2.0.1": - version: 2.0.2 - resolution: "is-negative-zero@npm:2.0.2" - checksum: edbec1a9e6454d68bf595a114c3a72343d2d0be7761d8173dae46c0b73d05bb8fe9398c85d121e7794a66467d2f40b4a610b0be84cd804262d234fc634c86131 +"is-negative-zero@npm:^2.0.2": + version: 2.0.3 + resolution: "is-negative-zero@npm:2.0.3" + checksum: 8fe5cffd8d4fb2ec7b49d657e1691889778d037494c6f40f4d1a524cadd658b4b53ad7b6b73a59bcb4b143ae9a3d15829af864b2c0f9d65ac1e678c4c80f17e5 languageName: node linkType: hard @@ -6501,11 +6945,11 @@ __metadata: linkType: hard "is-number-object@npm:^1.0.4": - version: 1.0.6 - resolution: "is-number-object@npm:1.0.6" + version: 1.0.7 + resolution: "is-number-object@npm:1.0.7" dependencies: has-tostringtag: "npm:^1.0.0" - checksum: d848fdc0fc69e30866b87fcaae17a3e68a8be669073ab3bf9a578c29106a2d5084089a2e7bc40819ec55eac94a52d9e20d735e7bfd3a46202b17199e555f91fa + checksum: 8700dcf7f602e0a9625830541345b8615d04953655acbf5c6d379c58eb1af1465e71227e95d501343346e1d49b6f2d53cbc166b1fc686a7ec19151272df582f9 languageName: node linkType: hard @@ -6563,10 +7007,19 @@ __metadata: languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.1": - version: 1.0.1 - resolution: "is-shared-array-buffer@npm:1.0.1" - checksum: ddb03381c5b6a468ddfbe0340506b3a18abc3525b4695f06683261d8febb5b69a51dc277f6835d440f765432fd5e666fbbfaae91051adc77b74babadcdb755d4 +"is-set@npm:^2.0.1": + version: 2.0.2 + resolution: "is-set@npm:2.0.2" + checksum: d89e82acdc7760993474f529e043f9c4a1d63ed4774d21cc2e331d0e401e5c91c27743cd7c889137028f6a742234759a4bd602368fbdbf0b0321994aefd5603f + languageName: node + linkType: hard + +"is-shared-array-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "is-shared-array-buffer@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.2" + checksum: 23d82259d6cd6dbb7c4ff3e4efeff0c30dbc6b7f88698498c17f9821cb3278d17d2b6303a5341cbd638ab925a28f3f086a6c79b3df70ac986cc526c725d43b4f languageName: node linkType: hard @@ -6609,6 +7062,15 @@ __metadata: languageName: node linkType: hard +"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.9": + version: 1.1.13 + resolution: "is-typed-array@npm:1.1.13" + dependencies: + which-typed-array: "npm:^1.1.14" + checksum: f850ba08286358b9a11aee6d93d371a45e3c59b5953549ee1c1a9a55ba5c1dd1bd9952488ae194ad8f32a9cf5e79c8fa5f0cc4d78c00720aa0bbcf238b38062d + languageName: node + linkType: hard + "is-typedarray@npm:^1.0.0": version: 1.0.0 resolution: "is-typedarray@npm:1.0.0" @@ -6639,7 +7101,14 @@ __metadata: languageName: node linkType: hard -"is-weakref@npm:^1.0.1": +"is-weakmap@npm:^2.0.1": + version: 2.0.1 + resolution: "is-weakmap@npm:2.0.1" + checksum: 289fa4e8ba1bdda40ca78481266f6925b7c46a85599e6a41a77010bf91e5a24dfb660db96863bbf655ecdbda0ab517204d6a4e0c151dbec9d022c556321f3776 + languageName: node + linkType: hard + +"is-weakref@npm:^1.0.2": version: 1.0.2 resolution: "is-weakref@npm:1.0.2" dependencies: @@ -6648,6 +7117,16 @@ __metadata: languageName: node linkType: hard +"is-weakset@npm:^2.0.1": + version: 2.0.2 + resolution: "is-weakset@npm:2.0.2" + dependencies: + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.1.1" + checksum: 8f2ddb9639716fd7936784e175ea1183c5c4c05274c34f34f6a53175313cb1c9c35a8b795623306995e2f7cc8f25aa46302f15a2113e51c5052d447be427195c + languageName: node + linkType: hard + "is-what@npm:^3.14.1": version: 3.14.1 resolution: "is-what@npm:3.14.1" @@ -6662,6 +7141,13 @@ __metadata: languageName: node linkType: hard +"isarray@npm:^2.0.5": + version: 2.0.5 + resolution: "isarray@npm:2.0.5" + checksum: 1d8bc7911e13bb9f105b1b3e0b396c787a9e63046af0b8fe0ab1414488ab06b2b099b87a2d8a9e31d21c9a6fad773c7fc8b257c4880f2d957274479d28ca3414 + languageName: node + linkType: hard + "isarray@npm:~1.0.0": version: 1.0.0 resolution: "isarray@npm:1.0.0" @@ -6707,6 +7193,19 @@ __metadata: languageName: node linkType: hard +"iterator.prototype@npm:^1.1.2": + version: 1.1.2 + resolution: "iterator.prototype@npm:1.1.2" + dependencies: + define-properties: "npm:^1.2.1" + get-intrinsic: "npm:^1.2.1" + has-symbols: "npm:^1.0.3" + reflect.getprototypeof: "npm:^1.0.4" + set-function-name: "npm:^2.0.1" + checksum: b5013967ad8f28c9ca1be8e159eb10f591b8e46deae87476fe39d668c04374fe9158c815e8b6d2f45885b0a3fd842a8ba13f497ec762b3a0eff49bec278670b1 + languageName: node + linkType: hard + "jake@npm:^10.8.5": version: 10.8.5 resolution: "jake@npm:10.8.5" @@ -6775,6 +7274,24 @@ __metadata: languageName: node linkType: hard +"jsesc@npm:^3.0.2": + version: 3.0.2 + resolution: "jsesc@npm:3.0.2" + bin: + jsesc: bin/jsesc + checksum: 8e5a7de6b70a8bd71f9cb0b5a7ade6a73ae6ab55e697c74cc997cede97417a3a65ed86c36f7dd6125fe49766e8386c845023d9e213916ca92c9dfdd56e2babf3 + languageName: node + linkType: hard + +"jsesc@npm:~0.5.0": + version: 0.5.0 + resolution: "jsesc@npm:0.5.0" + bin: + jsesc: bin/jsesc + checksum: fab949f585c71e169c5cbe00f049f20de74f067081bbd64a55443bad1c71e1b5a5b448f2359bf2fe06f5ed7c07e2e4a9101843b01c823c30b6afc11f5bfaf724 + languageName: node + linkType: hard + "json-buffer@npm:3.0.1": version: 3.0.1 resolution: "json-buffer@npm:3.0.1" @@ -6782,6 +7299,13 @@ __metadata: languageName: node linkType: hard +"json-parse-even-better-errors@npm:^2.3.0": + version: 2.3.1 + resolution: "json-parse-even-better-errors@npm:2.3.1" + checksum: 5f3a99009ed5f2a5a67d06e2f298cc97bc86d462034173308156f15b43a6e850be8511dc204b9b94566305da2947f7d90289657237d210351a39059ff9d666cf + languageName: node + linkType: hard + "json-schema-traverse@npm:^0.4.1": version: 0.4.1 resolution: "json-schema-traverse@npm:0.4.1" @@ -6810,14 +7334,14 @@ __metadata: languageName: node linkType: hard -"json5@npm:^1.0.1": - version: 1.0.1 - resolution: "json5@npm:1.0.1" +"json5@npm:^1.0.2": + version: 1.0.2 + resolution: "json5@npm:1.0.2" dependencies: minimist: "npm:^1.2.0" bin: json5: lib/cli.js - checksum: ecb5ab4e233322169b0c4b29e698c116277c45654d3b70a707d00802042b536be54345ce664523bba83e5afedfeaf643539a7667144f99d6da1dcaaa02336d80 + checksum: a78d812dbbd5642c4f637dd130954acfd231b074965871c3e28a5bbd571f099d623ecf9161f1960c4ddf68e0cc98dee8bebfdb94a71ad4551f85a1afc94b63f6 languageName: node linkType: hard @@ -6873,13 +7397,15 @@ __metadata: languageName: node linkType: hard -"jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.2.1": - version: 3.2.1 - resolution: "jsx-ast-utils@npm:3.2.1" +"jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.5": + version: 3.3.5 + resolution: "jsx-ast-utils@npm:3.3.5" dependencies: - array-includes: "npm:^3.1.3" - object.assign: "npm:^4.1.2" - checksum: 1195088f55a1aac51b9230266ced07e10c6c9914e14c025f6c55b0acf00a98b218de235cffa2cefb801ca4b2acff75bd26e391cedb46d69f9b9cf35e7b9bb393 + array-includes: "npm:^3.1.6" + array.prototype.flat: "npm:^1.3.1" + object.assign: "npm:^4.1.4" + object.values: "npm:^1.1.6" + checksum: b61d44613687dfe4cc8ad4b4fbf3711bf26c60b8d5ed1f494d723e0808415c59b24a7c0ed8ab10736a40ff84eef38cbbfb68b395e05d31117b44ffc59d31edfc languageName: node linkType: hard @@ -6904,6 +7430,15 @@ __metadata: languageName: node linkType: hard +"keyv@npm:^4.5.3": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: "npm:3.0.1" + checksum: 167eb6ef64cc84b6fa0780ee50c9de456b422a1e18802209234f7c2cf7eae648c7741f32e50d7e24ccb22b24c13154070b01563d642755b156c357431a191e75 + languageName: node + linkType: hard + "kuler@npm:^2.0.0": version: 2.0.0 resolution: "kuler@npm:2.0.0" @@ -6918,19 +7453,19 @@ __metadata: languageName: node linkType: hard -"language-subtag-registry@npm:~0.3.2": - version: 0.3.21 - resolution: "language-subtag-registry@npm:0.3.21" - checksum: 86168f7e90f1e3beb94174fcf82a8478688b5fb1b78016cd176e5296be563634c943bba847f3c0f590f411a5a0725b2a4a42242f7f8709278cffde34b7c10e85 +"language-subtag-registry@npm:^0.3.20": + version: 0.3.22 + resolution: "language-subtag-registry@npm:0.3.22" + checksum: 5591f4abd775d1ab5945355a5ba894327d2d94c900607bdb69aac1bc5bb921dbeeeb5f616df95e8c0ae875501d19c1cfa0e852ece822121e95048deb34f2b4d2 languageName: node linkType: hard -"language-tags@npm:^1.0.5": - version: 1.0.5 - resolution: "language-tags@npm:1.0.5" +"language-tags@npm:^1.0.9": + version: 1.0.9 + resolution: "language-tags@npm:1.0.9" dependencies: - language-subtag-registry: "npm:~0.3.2" - checksum: 2161292ddae73ff2f5a15fd2d753b21096b81324337dff4ad78d702c63210d5beb18892cd53a3455ee6e88065807c8e285e82c40503678951d2071d101a473b4 + language-subtag-registry: "npm:^0.3.20" + checksum: d3a7c14b694e67f519153d6df6cb200681648d38d623c3bfa9d6a66a5ec5493628acb88e9df5aceef3cf1902ab263a205e7d59ee4cf1d6bb67e707b83538bd6d languageName: node linkType: hard @@ -7027,6 +7562,13 @@ __metadata: languageName: node linkType: hard +"lines-and-columns@npm:^1.1.6": + version: 1.2.4 + resolution: "lines-and-columns@npm:1.2.4" + checksum: 0c37f9f7fa212b38912b7145e1cd16a5f3cd34d782441c3e6ca653485d326f58b3caccda66efce1c5812bde4961bbde3374fae4b0d11bf1226152337f3894aa5 + languageName: node + linkType: hard + "local-pkg@npm:^0.5.0": version: 0.5.0 resolution: "local-pkg@npm:0.5.0" @@ -7037,16 +7579,6 @@ __metadata: languageName: node linkType: hard -"locate-path@npm:^2.0.0": - version: 2.0.0 - resolution: "locate-path@npm:2.0.0" - dependencies: - p-locate: "npm:^2.0.0" - path-exists: "npm:^3.0.0" - checksum: 02d581edbbbb0fa292e28d96b7de36b5b62c2fa8b5a7e82638ebb33afa74284acf022d3b1e9ae10e3ffb7658fbc49163fcd5e76e7d1baaa7801c3e05a81da755 - languageName: node - linkType: hard - "locate-path@npm:^3.0.0": version: 3.0.0 resolution: "locate-path@npm:3.0.0" @@ -7057,6 +7589,15 @@ __metadata: languageName: node linkType: hard +"locate-path@npm:^5.0.0": + version: 5.0.0 + resolution: "locate-path@npm:5.0.0" + dependencies: + p-locate: "npm:^4.1.0" + checksum: 83e51725e67517287d73e1ded92b28602e3ae5580b301fe54bfb76c0c723e3f285b19252e375712316774cf52006cb236aed5704692c32db0d5d089b69696e30 + languageName: node + linkType: hard + "locate-path@npm:^6.0.0": version: 6.0.0 resolution: "locate-path@npm:6.0.0" @@ -7156,10 +7697,11 @@ __metadata: "@radix-ui/react-switch": "npm:^1.0.1" "@tsconfig/strictest": "npm:^2.0.2" "@tsconfig/vite-react": "npm:^3.0.0" + "@types/eslint": "npm:^8" "@types/lodash": "npm:^4.14.202" "@types/sortablejs": "npm:^1.15.0" - "@typescript-eslint/eslint-plugin": "npm:^6.17.0" - "@typescript-eslint/parser": "npm:^6.17.0" + "@typescript-eslint/eslint-plugin": "npm:^6.12.0" + "@typescript-eslint/parser": "npm:^6.12.0" "@uidotdev/usehooks": "npm:^2.4.1" "@vitejs/plugin-react": "npm:^3.1.0" color: "npm:^3.1.0" @@ -7175,13 +7717,13 @@ __metadata: electron-is-dev: "npm:^2.0.0" electron-store: "npm:5.1.1" electron-unhandled: "npm:^4.0.1" - eslint: "npm:^8.53.0" - eslint-config-airbnb: "npm:^19.0.4" - eslint-import-resolver-typescript: "npm:^3.6.1" + eslint: "npm:^8.2.0" + eslint-config-mifi: "npm:^0.0.3" eslint-plugin-import: "npm:^2.25.3" eslint-plugin-jsx-a11y: "npm:^6.5.1" eslint-plugin-react: "npm:^7.28.0" eslint-plugin-react-hooks: "npm:^4.3.0" + eslint-plugin-unicorn: "npm:^51.0.1" evergreen-ui: "npm:^6.13.1" execa: "npm:5" express: "npm:^4.18.2" @@ -7226,7 +7768,7 @@ __metadata: string-to-stream: "npm:^1.1.1" sweetalert2: "npm:^11.0.0" sweetalert2-react-content: "npm:^5.0.7" - typescript: "npm:^5.3.3" + typescript: "npm:~5.2.0" typescript-plugin-css-modules: "npm:^5.1.0" use-debounce: "npm:^5.1.0" use-trace-update: "npm:^1.3.0" @@ -7523,6 +8065,13 @@ __metadata: languageName: node linkType: hard +"min-indent@npm:^1.0.0": + version: 1.0.1 + resolution: "min-indent@npm:1.0.1" + checksum: bfc6dd03c5eaf623a4963ebd94d087f6f4bbbfd8c41329a7f09706b0cb66969c4ddd336abeb587bc44bc6f08e13bf90f0b374f9d71f9f01e04adc2cd6f083ef1 + languageName: node + linkType: hard + "minimatch@npm:9.0.3": version: 9.0.3 resolution: "minimatch@npm:9.0.3" @@ -7880,6 +8429,13 @@ __metadata: languageName: node linkType: hard +"node-releases@npm:^2.0.14": + version: 2.0.14 + resolution: "node-releases@npm:2.0.14" + checksum: 0f7607ec7db5ef1dc616899a5f24ae90c869b6a54c2d4f36ff6d84a282ab9343c7ff3ca3670fe4669171bb1e8a9b3e286e1ef1c131f09a83d70554f855d54f24 + languageName: node + linkType: hard + "node-releases@npm:^2.0.8": version: 2.0.10 resolution: "node-releases@npm:2.0.10" @@ -7898,6 +8454,18 @@ __metadata: languageName: node linkType: hard +"normalize-package-data@npm:^2.5.0": + version: 2.5.0 + resolution: "normalize-package-data@npm:2.5.0" + dependencies: + hosted-git-info: "npm:^2.1.4" + resolve: "npm:^1.10.0" + semver: "npm:2 || 3 || 4 || 5" + validate-npm-package-license: "npm:^3.0.1" + checksum: 644f830a8bb9b7cc9bf2f6150618727659ee27cdd0840d1c1f97e8e6cab0803a098a2c19f31c6247ad9d3a0792e61521a13a6e8cd87cc6bb676e3150612c03d4 + languageName: node + linkType: hard + "normalize-path@npm:^2.1.1": version: 2.1.1 resolution: "normalize-path@npm:2.1.1" @@ -7995,7 +8563,14 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.11.0, object-inspect@npm:^1.9.0": +"object-inspect@npm:^1.13.1": + version: 1.13.1 + resolution: "object-inspect@npm:1.13.1" + checksum: 92f4989ed83422d56431bc39656d4c780348eb15d397ce352ade6b7fec08f973b53744bd41b94af021901e61acaf78fcc19e65bf464ecc0df958586a672700f0 + languageName: node + linkType: hard + +"object-inspect@npm:^1.9.0": version: 1.12.0 resolution: "object-inspect@npm:1.12.0" checksum: f13b824784749ac2d40d62a4c2a60df13fd57a221968efe1d686565ef71713b56b82e01b57bc2588d6b2ab124c342f130a2d0304c14a79f7fabe01bfa327515b @@ -8009,7 +8584,7 @@ __metadata: languageName: node linkType: hard -"object.assign@npm:^4.0.4, object.assign@npm:^4.1.2": +"object.assign@npm:^4.0.4": version: 4.1.2 resolution: "object.assign@npm:4.1.2" dependencies: @@ -8021,46 +8596,71 @@ __metadata: languageName: node linkType: hard -"object.entries@npm:^1.1.5": - version: 1.1.5 - resolution: "object.entries@npm:1.1.5" +"object.assign@npm:^4.1.2, object.assign@npm:^4.1.4, object.assign@npm:^4.1.5": + version: 4.1.5 + resolution: "object.assign@npm:4.1.5" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.3" - es-abstract: "npm:^1.19.1" - checksum: ed3a5ba6f7fb30b55185ab11e8c91a7534305628e057a2d2a88f851689332b4b069df25193f54f45dbf3fe6fbbc204d20255138960cc740277c982ebb50a3877 + call-bind: "npm:^1.0.5" + define-properties: "npm:^1.2.1" + has-symbols: "npm:^1.0.3" + object-keys: "npm:^1.1.1" + checksum: dbb22da4cda82e1658349ea62b80815f587b47131b3dd7a4ab7f84190ab31d206bbd8fe7e26ae3220c55b65725ac4529825f6142154211220302aa6b1518045d languageName: node linkType: hard -"object.fromentries@npm:^2.0.5": - version: 2.0.5 - resolution: "object.fromentries@npm:2.0.5" +"object.entries@npm:^1.1.5, object.entries@npm:^1.1.6, object.entries@npm:^1.1.7": + version: 1.1.7 + resolution: "object.entries@npm:1.1.7" dependencies: call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.3" - es-abstract: "npm:^1.19.1" - checksum: e60a00c590d0e9bed782630dda02189fa10e136d640c1f511fff89dc912faf05bc95a6a7d47345ea3de1d792cce0545c776f658038e865fcecddd084d0ac6b5e + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + checksum: 03f0bd0f23a8626c94429d15abf26ccda7723f08cd26be2c09c72d436765f8c7468605b5476ca58d4a7cec1ec7eca5be496dbd938fd4236b77ed6d05a8680048 languageName: node linkType: hard -"object.hasown@npm:^1.1.0": - version: 1.1.0 - resolution: "object.hasown@npm:1.1.0" +"object.fromentries@npm:^2.0.6, object.fromentries@npm:^2.0.7": + version: 2.0.7 + resolution: "object.fromentries@npm:2.0.7" dependencies: - define-properties: "npm:^1.1.3" - es-abstract: "npm:^1.19.1" - checksum: 6701453f36340442a5d585110383bf4eedea181fe39fdf0c5eca2d687d31e56814ab06730aa4021d37251d0a169189127e74d85fda9e23a926129a80914b1c73 + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + checksum: 1bfbe42a51f8d84e417d193fae78e4b8eebb134514cdd44406480f8e8a0e075071e0717635d8e3eccd50fec08c1d555fe505c38804cbac0808397187653edd59 languageName: node linkType: hard -"object.values@npm:^1.1.5": - version: 1.1.5 - resolution: "object.values@npm:1.1.5" +"object.groupby@npm:^1.0.1": + version: 1.0.2 + resolution: "object.groupby@npm:1.0.2" + dependencies: + array.prototype.filter: "npm:^1.0.3" + call-bind: "npm:^1.0.5" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.22.3" + es-errors: "npm:^1.0.0" + checksum: 07c1bea1772c45f7967a63358a683ef7b0bd99cabe0563e6fee3e8acc061cc5984d2f01a46472ebf10b2cb439298c46776b2134550dce457fd7240baaaa4f592 + languageName: node + linkType: hard + +"object.hasown@npm:^1.1.2": + version: 1.1.3 + resolution: "object.hasown@npm:1.1.3" + dependencies: + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + checksum: 735679729c25a4e0d3713adf5df9861d862f0453e87ada4d991b75cd4225365dec61a08435e1127f42c9cc1adfc8e952fa5dca75364ebda6539dadf4721dc9c4 + languageName: node + linkType: hard + +"object.values@npm:^1.1.6, object.values@npm:^1.1.7": + version: 1.1.7 + resolution: "object.values@npm:1.1.7" dependencies: call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.3" - es-abstract: "npm:^1.19.1" - checksum: 83db44d40d99175249dfcf93e642e1931290e2ab16ce35702c324bfeafa8bc9f3602d6cc7990a0371c28015d8a7b0072593bc897cb8d05d63ac0684502ae40f5 + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + checksum: 20ab42c0bbf984405c80e060114b18cf5d629a40a132c7eac4fb79c5d06deb97496311c19297dcf9c61f45c2539cd4c7f7c5d6230e51db360ff297bbc9910162 languageName: node linkType: hard @@ -8155,16 +8755,7 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^1.1.0": - version: 1.3.0 - resolution: "p-limit@npm:1.3.0" - dependencies: - p-try: "npm:^1.0.0" - checksum: eb9d9bc378d48ab1998d2a2b2962a99eddd3e3726c82d3258ecc1a475f22907968edea4fec2736586d100366a001c6bb449a2abe6cd65e252e9597394f01e789 - languageName: node - linkType: hard - -"p-limit@npm:^2.0.0": +"p-limit@npm:^2.0.0, p-limit@npm:^2.2.0": version: 2.3.0 resolution: "p-limit@npm:2.3.0" dependencies: @@ -8191,15 +8782,6 @@ __metadata: languageName: node linkType: hard -"p-locate@npm:^2.0.0": - version: 2.0.0 - resolution: "p-locate@npm:2.0.0" - dependencies: - p-limit: "npm:^1.1.0" - checksum: e2dceb9b49b96d5513d90f715780f6f4972f46987dc32a0e18bc6c3fc74a1a5d73ec5f81b1398af5e58b99ea1ad03fd41e9181c01fa81b4af2833958696e3081 - languageName: node - linkType: hard - "p-locate@npm:^3.0.0": version: 3.0.0 resolution: "p-locate@npm:3.0.0" @@ -8209,6 +8791,15 @@ __metadata: languageName: node linkType: hard +"p-locate@npm:^4.1.0": + version: 4.1.0 + resolution: "p-locate@npm:4.1.0" + dependencies: + p-limit: "npm:^2.2.0" + checksum: 513bd14a455f5da4ebfcb819ef706c54adb09097703de6aeaa5d26fe5ea16df92b48d1ac45e01e3944ce1e6aa2a66f7f8894742b8c9d6e276e16cd2049a2b870 + languageName: node + linkType: hard + "p-locate@npm:^5.0.0": version: 5.0.0 resolution: "p-locate@npm:5.0.0" @@ -8247,13 +8838,6 @@ __metadata: languageName: node linkType: hard -"p-try@npm:^1.0.0": - version: 1.0.0 - resolution: "p-try@npm:1.0.0" - checksum: 20d9735f57258158df50249f172c77fe800d31e80f11a3413ac9e68ccbe6b11798acb3f48f2df8cea7ba2b56b753ce695a4fe2a2987c3c7691c44226b6d82b6f - languageName: node - linkType: hard - "p-try@npm:^2.0.0": version: 2.2.0 resolution: "p-try@npm:2.2.0" @@ -8291,6 +8875,18 @@ __metadata: languageName: node linkType: hard +"parse-json@npm:^5.0.0": + version: 5.2.0 + resolution: "parse-json@npm:5.2.0" + dependencies: + "@babel/code-frame": "npm:^7.0.0" + error-ex: "npm:^1.3.1" + json-parse-even-better-errors: "npm:^2.3.0" + lines-and-columns: "npm:^1.1.6" + checksum: 62085b17d64da57f40f6afc2ac1f4d95def18c4323577e1eced571db75d9ab59b297d1d10582920f84b15985cbfc6b6d450ccbf317644cfa176f3ed982ad87e2 + languageName: node + linkType: hard + "parse-node-version@npm:^1.0.1": version: 1.0.1 resolution: "parse-node-version@npm:1.0.1" @@ -8366,7 +8962,7 @@ __metadata: languageName: node linkType: hard -"path-parse@npm:^1.0.6, path-parse@npm:^1.0.7": +"path-parse@npm:^1.0.7": version: 1.0.7 resolution: "path-parse@npm:1.0.7" checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a @@ -8498,6 +9094,13 @@ __metadata: languageName: node linkType: hard +"pluralize@npm:^8.0.0": + version: 8.0.0 + resolution: "pluralize@npm:8.0.0" + checksum: 17877fdfdb7ddb3639ce257ad73a7c51a30a966091e40f56ea9f2f545b5727ce548d4928f8cb3ce38e7dc0c5150407d318af6a4ed0ea5265d378473b4c2c61ec + languageName: node + linkType: hard + "pngjs@npm:^6.0.0": version: 6.0.0 resolution: "pngjs@npm:6.0.0" @@ -8505,6 +9108,13 @@ __metadata: languageName: node linkType: hard +"possible-typed-array-names@npm:^1.0.0": + version: 1.0.0 + resolution: "possible-typed-array-names@npm:1.0.0" + checksum: 8ed3e96dfeea1c5880c1f4c9cb707e5fb26e8be22f14f82ef92df20fd2004e635c62ba47fbe8f2bb63bfd80dac1474be2fb39798da8c2feba2815435d1f749af + languageName: node + linkType: hard + "postcss-load-config@npm:^3.1.4": version: 3.1.4 resolution: "postcss-load-config@npm:3.1.4" @@ -8726,7 +9336,7 @@ __metadata: languageName: node linkType: hard -"prop-types@npm:^15.5.10, prop-types@npm:^15.5.7, prop-types@npm:^15.6.2, prop-types@npm:^15.7.2": +"prop-types@npm:^15.5.10, prop-types@npm:^15.5.7, prop-types@npm:^15.6.2, prop-types@npm:^15.7.2, prop-types@npm:^15.8.1": version: 15.8.1 resolution: "prop-types@npm:15.8.1" dependencies: @@ -9058,6 +9668,29 @@ __metadata: languageName: node linkType: hard +"read-pkg-up@npm:^7.0.1": + version: 7.0.1 + resolution: "read-pkg-up@npm:7.0.1" + dependencies: + find-up: "npm:^4.1.0" + read-pkg: "npm:^5.2.0" + type-fest: "npm:^0.8.1" + checksum: e4e93ce70e5905b490ca8f883eb9e48b5d3cebc6cd4527c25a0d8f3ae2903bd4121c5ab9c5a3e217ada0141098eeb661313c86fa008524b089b8ed0b7f165e44 + languageName: node + linkType: hard + +"read-pkg@npm:^5.2.0": + version: 5.2.0 + resolution: "read-pkg@npm:5.2.0" + dependencies: + "@types/normalize-package-data": "npm:^2.4.0" + normalize-package-data: "npm:^2.5.0" + parse-json: "npm:^5.0.0" + type-fest: "npm:^0.6.0" + checksum: eb696e60528b29aebe10e499ba93f44991908c57d70f2d26f369e46b8b9afc208ef11b4ba64f67630f31df8b6872129e0a8933c8c53b7b4daf0eace536901222 + languageName: node + linkType: hard + "readable-stream@npm:3, readable-stream@npm:^3.0.2, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": version: 3.6.0 resolution: "readable-stream@npm:3.6.0" @@ -9102,6 +9735,21 @@ __metadata: languageName: node linkType: hard +"reflect.getprototypeof@npm:^1.0.4": + version: 1.0.5 + resolution: "reflect.getprototypeof@npm:1.0.5" + dependencies: + call-bind: "npm:^1.0.5" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.22.3" + es-errors: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.3" + globalthis: "npm:^1.0.3" + which-builtin-type: "npm:^1.1.3" + checksum: 14560efa54b4b8549f5e0961ee4dfa9f034bd4b85c7805d487da30eb520ea252b566bc4098a7cb1bc2219e4d9cb095db43c05b27205bd6299bb141294cea2d14 + languageName: node + linkType: hard + "refractor@npm:^3.2.0": version: 3.5.0 resolution: "refractor@npm:3.5.0" @@ -9127,13 +9775,42 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.3.1": - version: 1.4.0 - resolution: "regexp.prototype.flags@npm:1.4.0" +"regenerator-runtime@npm:^0.14.0": + version: 0.14.1 + resolution: "regenerator-runtime@npm:0.14.1" + checksum: 5db3161abb311eef8c45bcf6565f4f378f785900ed3945acf740a9888c792f75b98ecb77f0775f3bf95502ff423529d23e94f41d80c8256e8fa05ed4b07cf471 + languageName: node + linkType: hard + +"regexp-tree@npm:^0.1.27": + version: 0.1.27 + resolution: "regexp-tree@npm:0.1.27" + bin: + regexp-tree: bin/regexp-tree + checksum: 08c70c8adb5a0d4af1061bf9eb05d3b6e1d948c433d6b7008e4b5eb12a49429c2d6ca8e9106339a432aa0d07bd6e1bccc638d8f4ab0d045f3adad22182b300a2 + languageName: node + linkType: hard + +"regexp.prototype.flags@npm:^1.5.0, regexp.prototype.flags@npm:^1.5.2": + version: 1.5.2 + resolution: "regexp.prototype.flags@npm:1.5.2" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.3" - checksum: bd1a291149068ca1b389d54a6555e061782a4ea82a05771e63a9fb4b5f1e68e079af3a9fbbe8f314e5b8d0a6a2c833b7c33e35769c9877222616f37cc47917b6 + call-bind: "npm:^1.0.6" + define-properties: "npm:^1.2.1" + es-errors: "npm:^1.3.0" + set-function-name: "npm:^2.0.1" + checksum: 9fffc01da9c4e12670ff95bc5204364615fcc12d86fc30642765af908675678ebb0780883c874b2dbd184505fb52fa603d80073ecf69f461ce7f56b15d10be9c + languageName: node + linkType: hard + +"regjsparser@npm:^0.10.0": + version: 0.10.0 + resolution: "regjsparser@npm:0.10.0" + dependencies: + jsesc: "npm:~0.5.0" + bin: + regjsparser: bin/parser + checksum: 06f7f0e59598de20769ce5637bbd8879387f67c0eeb8ccc8857331c623332718c25d8d20bd74df210bf636dde061474e8bd365cf73af20470f0b3cb42cd42019 languageName: node linkType: hard @@ -9223,56 +9900,55 @@ __metadata: languageName: node linkType: hard -"resolve-pkg-maps@npm:^1.0.0": - version: 1.0.0 - resolution: "resolve-pkg-maps@npm:1.0.0" - checksum: 0763150adf303040c304009231314d1e84c6e5ebfa2d82b7d94e96a6e82bacd1dcc0b58ae257315f3c8adb89a91d8d0f12928241cba2df1680fbe6f60bf99b0e - languageName: node - linkType: hard - -"resolve@npm:^1.20.0": - version: 1.21.0 - resolution: "resolve@npm:1.21.0" +"resolve@npm:^1.10.0, resolve@npm:^1.22.4": + version: 1.22.8 + resolution: "resolve@npm:1.22.8" dependencies: - is-core-module: "npm:^2.8.0" + is-core-module: "npm:^2.13.0" path-parse: "npm:^1.0.7" supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: b45bf0d0761069cf1f1d810dfdf93fd3c4af79f0ab0f770da76edf15f2c2dcd454dec9843248cf8a72077179274dd165647b1a12c0fd1603109d7f211c65344a + checksum: c473506ee01eb45cbcfefb68652ae5759e092e6b0fb64547feadf9736a6394f258fbc6f88e00c5ca36d5477fbb65388b272432a3600fa223062e54333c156753 languageName: node linkType: hard -"resolve@npm:^2.0.0-next.3": - version: 2.0.0-next.3 - resolution: "resolve@npm:2.0.0-next.3" +"resolve@npm:^2.0.0-next.4": + version: 2.0.0-next.5 + resolution: "resolve@npm:2.0.0-next.5" dependencies: - is-core-module: "npm:^2.2.0" - path-parse: "npm:^1.0.6" - checksum: 20378839484ef1dbfcfd271ada32e49176d15639f001669d07e23a6dce7d458208716aaafd05c99737ff1656db9381c9f43792e9568fa7787e0d2aba7401cd49 - languageName: node - linkType: hard - -"resolve@patch:resolve@npm%3A^1.20.0#optional!builtin": - version: 1.21.0 - resolution: "resolve@patch:resolve@npm%3A1.21.0#optional!builtin::version=1.21.0&hash=c3c19d" - dependencies: - is-core-module: "npm:^2.8.0" + is-core-module: "npm:^2.13.0" path-parse: "npm:^1.0.7" supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 537da5481b5f74593d2c860eba1953c248579fd461085a658a9b08a3fdb9cc4e59f082e127e03eb13282fd59062a93bd1827a930b30bf8f7f6b27a0939335428 + checksum: 2d6fd28699f901744368e6f2032b4268b4c7b9185fd8beb64f68c93ac6b22e52ae13560ceefc96241a665b985edf9ffd393ae26d2946a7d3a07b7007b7d51e79 languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^2.0.0-next.3#optional!builtin": - version: 2.0.0-next.3 - resolution: "resolve@patch:resolve@npm%3A2.0.0-next.3#optional!builtin::version=2.0.0-next.3&hash=c3c19d" +"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": + version: 1.22.8 + resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" dependencies: - is-core-module: "npm:^2.2.0" - path-parse: "npm:^1.0.6" - checksum: e29030dd551be0f1244dbc691c426e89407d90061da99675a8578a6127fc2c23d4d3a7e16e31dbab1bf75330e023a4c19a15e37cca2269736c8fac09f8f2a38c + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: f345cd37f56a2c0275e3fe062517c650bb673815d885e7507566df589375d165bbbf4bdb6aa95600a9bc55f4744b81f452b5a63f95b9f10a72787dba3c90890a + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^2.0.0-next.4#optional!builtin": + version: 2.0.0-next.5 + resolution: "resolve@patch:resolve@npm%3A2.0.0-next.5#optional!builtin::version=2.0.0-next.5&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 05fa778de9d0347c8b889eb7a18f1f06bf0f801b0eb4610b4871a4b2f22e220900cf0ad525e94f990bb8d8921c07754ab2122c0c225ab4cdcea98f36e64fa4c2 languageName: node linkType: hard @@ -9467,6 +10143,18 @@ __metadata: languageName: node linkType: hard +"safe-array-concat@npm:^1.1.0": + version: 1.1.0 + resolution: "safe-array-concat@npm:1.1.0" + dependencies: + call-bind: "npm:^1.0.5" + get-intrinsic: "npm:^1.2.2" + has-symbols: "npm:^1.0.3" + isarray: "npm:^2.0.5" + checksum: 41ac35ce46c44e2e8637b1805b0697d5269507779e3082b7afb92c01605fd73ab813bbc799510c56e300cfc941b1447fd98a338205db52db7fd1322ab32d7c9f + languageName: node + linkType: hard + "safe-buffer@npm:5.1.2, safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": version: 5.1.2 resolution: "safe-buffer@npm:5.1.2" @@ -9481,6 +10169,17 @@ __metadata: languageName: node linkType: hard +"safe-regex-test@npm:^1.0.3": + version: 1.0.3 + resolution: "safe-regex-test@npm:1.0.3" + dependencies: + call-bind: "npm:^1.0.6" + es-errors: "npm:^1.3.0" + is-regex: "npm:^1.1.4" + checksum: b04de61114b10274d92e25b6de7ccb5de07f11ea15637ff636de4b5190c0f5cd8823fe586dde718504cf78055437d70fd8804976894df502fcf5a210c970afb3 + languageName: node + linkType: hard + "safe-stable-stringify@npm:^2.3.1": version: 2.3.1 resolution: "safe-stable-stringify@npm:2.3.1" @@ -9570,7 +10269,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^5.6.0": +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.6.0": version: 5.7.2 resolution: "semver@npm:5.7.2" bin: @@ -9588,6 +10287,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:^6.3.1": + version: 6.3.1 + resolution: "semver@npm:6.3.1" + bin: + semver: bin/semver.js + checksum: 1ef3a85bd02a760c6ef76a45b8c1ce18226de40831e02a00bad78485390b98b6ccaa31046245fc63bba4a47a6a592b6c7eedc65cc47126e60489f9cc1ce3ed7e + languageName: node + linkType: hard + "semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.5": version: 7.3.7 resolution: "semver@npm:7.3.7" @@ -9679,6 +10387,32 @@ __metadata: languageName: node linkType: hard +"set-function-length@npm:^1.2.1": + version: 1.2.1 + resolution: "set-function-length@npm:1.2.1" + dependencies: + define-data-property: "npm:^1.1.2" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.3" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.1" + checksum: 9ab1d200149574ab27c1a7acae56d6235e02568fc68655fe8afe63e4e02ccad3c27665f55c32408bd1ff40705939dbb7539abfb9c3a07fda27ecad1ab9e449f5 + languageName: node + linkType: hard + +"set-function-name@npm:^2.0.0, set-function-name@npm:^2.0.1": + version: 2.0.2 + resolution: "set-function-name@npm:2.0.2" + dependencies: + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + functions-have-names: "npm:^1.2.3" + has-property-descriptors: "npm:^1.0.2" + checksum: c7614154a53ebf8c0428a6c40a3b0b47dac30587c1a19703d1b75f003803f73cdfa6a93474a9ba678fa565ef5fbddc2fae79bca03b7d22ab5fd5163dbe571a74 + languageName: node + linkType: hard + "set-harmonic-interval@npm:^1.0.1": version: 1.0.1 resolution: "set-harmonic-interval@npm:1.0.1" @@ -9953,6 +10687,40 @@ __metadata: languageName: node linkType: hard +"spdx-correct@npm:^3.0.0": + version: 3.2.0 + resolution: "spdx-correct@npm:3.2.0" + dependencies: + spdx-expression-parse: "npm:^3.0.0" + spdx-license-ids: "npm:^3.0.0" + checksum: cc2e4dbef822f6d12142116557d63f5facf3300e92a6bd24e907e4865e17b7e1abd0ee6b67f305cae6790fc2194175a24dc394bfcc01eea84e2bdad728e9ae9a + languageName: node + linkType: hard + +"spdx-exceptions@npm:^2.1.0": + version: 2.5.0 + resolution: "spdx-exceptions@npm:2.5.0" + checksum: bb127d6e2532de65b912f7c99fc66097cdea7d64c10d3ec9b5e96524dbbd7d20e01cba818a6ddb2ae75e62bb0c63d5e277a7e555a85cbc8ab40044984fa4ae15 + languageName: node + linkType: hard + +"spdx-expression-parse@npm:^3.0.0": + version: 3.0.1 + resolution: "spdx-expression-parse@npm:3.0.1" + dependencies: + spdx-exceptions: "npm:^2.1.0" + spdx-license-ids: "npm:^3.0.0" + checksum: a1c6e104a2cbada7a593eaa9f430bd5e148ef5290d4c0409899855ce8b1c39652bcc88a725259491a82601159d6dc790bedefc9016c7472f7de8de7361f8ccde + languageName: node + linkType: hard + +"spdx-license-ids@npm:^3.0.0": + version: 3.0.17 + resolution: "spdx-license-ids@npm:3.0.17" + checksum: 8f6c6ae02ebb25b4ca658b8990d9e8a8f8d8a95e1d8b9fd84d87eed80a7dc8f8073d6a8d50b8a0295c0e8399e1f8814f5c00e2985e6bf3731540a16f7241cbf1 + languageName: node + linkType: hard + "sprintf-js@npm:^1.1.1, sprintf-js@npm:^1.1.2": version: 1.1.2 resolution: "sprintf-js@npm:1.1.2" @@ -10100,39 +10868,53 @@ __metadata: languageName: node linkType: hard -"string.prototype.matchall@npm:^4.0.6": - version: 4.0.6 - resolution: "string.prototype.matchall@npm:4.0.6" +"string.prototype.matchall@npm:^4.0.8": + version: 4.0.10 + resolution: "string.prototype.matchall@npm:4.0.10" dependencies: call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.3" - es-abstract: "npm:^1.19.1" - get-intrinsic: "npm:^1.1.1" - has-symbols: "npm:^1.0.2" - internal-slot: "npm:^1.0.3" - regexp.prototype.flags: "npm:^1.3.1" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + get-intrinsic: "npm:^1.2.1" + has-symbols: "npm:^1.0.3" + internal-slot: "npm:^1.0.5" + regexp.prototype.flags: "npm:^1.5.0" + set-function-name: "npm:^2.0.0" side-channel: "npm:^1.0.4" - checksum: a2d1204677a764d9aa7608a736da722d1d0badef6708ace2d1054e61ffa5b90c7415f1b102562cbe8ec5d2bb16470309b266db29b2008d05a89663843cb8185d + checksum: 0f7a1a7f91790cd45f804039a16bc6389c8f4f25903e648caa3eea080b019a5c7b0cac2ca83976646140c2332b159042140bf389f23675609d869dd52450cddc languageName: node linkType: hard -"string.prototype.trimend@npm:^1.0.4": - version: 1.0.4 - resolution: "string.prototype.trimend@npm:1.0.4" +"string.prototype.trim@npm:^1.2.8": + version: 1.2.8 + resolution: "string.prototype.trim@npm:1.2.8" dependencies: call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.3" - checksum: 5733b0f9801276387be136f1591883fc1b6371e263533d7797dc6178916a98bd9f632870f25e58a827ed028c17003b70e37650e80fc6703af6883cb2f3b0c1b3 + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + checksum: 9301f6cb2b6c44f069adde1b50f4048915985170a20a1d64cf7cb2dc53c5cd6b9525b92431f1257f894f94892d6c4ae19b5aa7f577c3589e7e51772dffc9d5a4 languageName: node linkType: hard -"string.prototype.trimstart@npm:^1.0.4": - version: 1.0.4 - resolution: "string.prototype.trimstart@npm:1.0.4" +"string.prototype.trimend@npm:^1.0.7": + version: 1.0.7 + resolution: "string.prototype.trimend@npm:1.0.7" dependencies: call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.3" - checksum: 18e0b7362c51f566a3de095c4bab953174897f6cebe92826234f04d2744b0fdb25095c74661e0c15776d1338d64965be0a4f9c8be8851ee15b827c63a5280fdb + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + checksum: 3f0d3397ab9bd95cd98ae2fe0943bd3e7b63d333c2ab88f1875cf2e7c958c75dc3355f6fe19ee7c8fca28de6f39f2475e955e103821feb41299a2764a7463ffa + languageName: node + linkType: hard + +"string.prototype.trimstart@npm:^1.0.7": + version: 1.0.7 + resolution: "string.prototype.trimstart@npm:1.0.7" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + checksum: 6e594d3a61b127d243b8be1312e9f78683abe452cfe0bcafa3e0dc62ad6f030ccfb64d87ed3086fb7cb540fda62442c164d237cc5cc4d53c6e3eb659c29a0aeb languageName: node linkType: hard @@ -10193,6 +10975,15 @@ __metadata: languageName: node linkType: hard +"strip-indent@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-indent@npm:3.0.0" + dependencies: + min-indent: "npm:^1.0.0" + checksum: 18f045d57d9d0d90cd16f72b2313d6364fd2cb4bf85b9f593523ad431c8720011a4d5f08b6591c9d580f446e78855c5334a30fb91aa1560f5d9f95ed1b4a0530 + languageName: node + linkType: hard + "strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" @@ -10323,13 +11114,6 @@ __metadata: languageName: node linkType: hard -"tapable@npm:^2.2.0": - version: 2.2.1 - resolution: "tapable@npm:2.2.1" - checksum: 1769336dd21481ae6347611ca5fca47add0962fd8e80466515032125eca0084a4f0ede11e65341b9c0018ef4e1cf1ad820adbb0fba7cc99865c6005734000b0a - languageName: node - linkType: hard - "tar-fs@npm:^2.0.0, tar-fs@npm:^2.1.1": version: 2.1.1 resolution: "tar-fs@npm:2.1.1" @@ -10633,11 +11417,11 @@ __metadata: linkType: hard "ts-api-utils@npm:^1.0.1": - version: 1.0.3 - resolution: "ts-api-utils@npm:1.0.3" + version: 1.2.1 + resolution: "ts-api-utils@npm:1.2.1" peerDependencies: typescript: ">=4.2.0" - checksum: 1350a5110eb1e534e9a6178f4081fb8a4fcc439749e19f4ad699baec9090fcb90fe532d5e191d91a062dc6e454a14a8d7eb2ad202f57135a30c4a44a3024f039 + checksum: 6d7f60fd01e3885bb334607f22b9cb1002e72da81dad2e672fef1b0d1a2f640b0f0ff5310369401488fac90c7a7f5d39c89fd18789af59c672c9b5aef4cade3e languageName: node linkType: hard @@ -10648,15 +11432,15 @@ __metadata: languageName: node linkType: hard -"tsconfig-paths@npm:^3.12.0": - version: 3.12.0 - resolution: "tsconfig-paths@npm:3.12.0" +"tsconfig-paths@npm:^3.15.0": + version: 3.15.0 + resolution: "tsconfig-paths@npm:3.15.0" dependencies: "@types/json5": "npm:^0.0.29" - json5: "npm:^1.0.1" - minimist: "npm:^1.2.0" + json5: "npm:^1.0.2" + minimist: "npm:^1.2.6" strip-bom: "npm:^3.0.0" - checksum: f58356153bd0d828da846995015f6467c68496ac9b069b949280cd36877d79eeaf5ce242d5da852bfdd36a005550614830a47c463eb179fd889302cb985aaea9 + checksum: 2041beaedc6c271fc3bedd12e0da0cc553e65d030d4ff26044b771fac5752d0460944c0b5e680f670c2868c95c664a256cec960ae528888db6ded83524e33a14 languageName: node linkType: hard @@ -10738,6 +11522,13 @@ __metadata: languageName: node linkType: hard +"type-fest@npm:^0.6.0": + version: 0.6.0 + resolution: "type-fest@npm:0.6.0" + checksum: 9ecbf4ba279402b14c1a0614b6761bbe95626fab11377291fecd7e32b196109551e0350dcec6af74d97ced1b000ba8060a23eca33157091e642b409c2054ba82 + languageName: node + linkType: hard + "type-fest@npm:^0.7.1": version: 0.7.1 resolution: "type-fest@npm:0.7.1" @@ -10745,6 +11536,13 @@ __metadata: languageName: node linkType: hard +"type-fest@npm:^0.8.1": + version: 0.8.1 + resolution: "type-fest@npm:0.8.1" + checksum: fd4a91bfb706aeeb0d326ebd2e9a8ea5263979e5dec8d16c3e469a5bd3a946e014a062ef76c02e3086d3d1c7209a56a20a4caafd0e9f9a5c2ab975084ea3d388 + languageName: node + linkType: hard + "type-is@npm:~1.6.18": version: 1.6.18 resolution: "type-is@npm:1.6.18" @@ -10755,6 +11553,54 @@ __metadata: languageName: node linkType: hard +"typed-array-buffer@npm:^1.0.1": + version: 1.0.2 + resolution: "typed-array-buffer@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.7" + es-errors: "npm:^1.3.0" + is-typed-array: "npm:^1.1.13" + checksum: 02ffc185d29c6df07968272b15d5319a1610817916ec8d4cd670ded5d1efe72901541ff2202fcc622730d8a549c76e198a2f74e312eabbfb712ed907d45cbb0b + languageName: node + linkType: hard + +"typed-array-byte-length@npm:^1.0.0": + version: 1.0.0 + resolution: "typed-array-byte-length@npm:1.0.0" + dependencies: + call-bind: "npm:^1.0.2" + for-each: "npm:^0.3.3" + has-proto: "npm:^1.0.1" + is-typed-array: "npm:^1.1.10" + checksum: 6f376bf5d988f00f98ccee41fd551cafc389095a2a307c18fab30f29da7d1464fc3697139cf254cda98b4128bbcb114f4b557bbabdc6d9c2e5039c515b31decf + languageName: node + linkType: hard + +"typed-array-byte-offset@npm:^1.0.0": + version: 1.0.1 + resolution: "typed-array-byte-offset@npm:1.0.1" + dependencies: + available-typed-arrays: "npm:^1.0.6" + call-bind: "npm:^1.0.7" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + has-proto: "npm:^1.0.1" + is-typed-array: "npm:^1.1.13" + checksum: b174c0bac20bcd8787d2f5ccd7bd8f5e5a128e060ffe0909ffe27d65e486de50a3552248a307a45e5c9c593fd8ec97f5acdf119c3e13806f11943b7a2ce555be + languageName: node + linkType: hard + +"typed-array-length@npm:^1.0.4": + version: 1.0.4 + resolution: "typed-array-length@npm:1.0.4" + dependencies: + call-bind: "npm:^1.0.2" + for-each: "npm:^0.3.3" + is-typed-array: "npm:^1.1.9" + checksum: 0444658acc110b233176cb0b7689dcb828b0cfa099ab1d377da430e8553b6fdcdce882360b7ffe9ae085b6330e1d39383d7b2c61574d6cd8eef651d3e4a87822 + languageName: node + linkType: hard + "typedarray-to-buffer@npm:^3.1.5": version: 3.1.5 resolution: "typedarray-to-buffer@npm:3.1.5" @@ -10807,13 +11653,13 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^5.3.3": - version: 5.3.3 - resolution: "typescript@npm:5.3.3" +"typescript@npm:~5.2.0": + version: 5.2.2 + resolution: "typescript@npm:5.2.2" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 6e4e6a14a50c222b3d14d4ea2f729e79f972fa536ac1522b91202a9a65af3605c2928c4a790a4a50aa13694d461c479ba92cedaeb1e7b190aadaa4e4b96b8e18 + checksum: d65e50eb849bd21ff8677e5b9447f9c6e74777e346afd67754934264dcbf4bd59e7d2473f6062d9a015d66bd573311166357e3eb07fea0b52859cf9bb2b58555 languageName: node linkType: hard @@ -10827,13 +11673,13 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^5.3.3#optional!builtin": - version: 5.3.3 - resolution: "typescript@patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7" +"typescript@patch:typescript@npm%3A~5.2.0#optional!builtin": + version: 5.2.2 + resolution: "typescript@patch:typescript@npm%3A5.2.2#optional!builtin::version=5.2.2&hash=f3b441" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: c93786fcc9a70718ba1e3819bab56064ead5817004d1b8186f8ca66165f3a2d0100fee91fa64c840dcd45f994ca5d615d8e1f566d39a7470fc1e014dbb4cf15d + checksum: f79cc2ba802c94c2b78dbb00d767a10adb67368ae764709737dc277273ec148aa4558033a03ce901406b35fddf4eac46dabc94a1e1d12d2587e2b9cfe5707b4a languageName: node linkType: hard @@ -10864,15 +11710,15 @@ __metadata: languageName: node linkType: hard -"unbox-primitive@npm:^1.0.1": - version: 1.0.1 - resolution: "unbox-primitive@npm:1.0.1" +"unbox-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "unbox-primitive@npm:1.0.2" dependencies: - function-bind: "npm:^1.1.1" - has-bigints: "npm:^1.0.1" - has-symbols: "npm:^1.0.2" + call-bind: "npm:^1.0.2" + has-bigints: "npm:^1.0.2" + has-symbols: "npm:^1.0.3" which-boxed-primitive: "npm:^1.0.2" - checksum: 16aacdfc555545a89ddc678f136029ead18215f6843b9b707ab383cdc2f739efc34470b6b79c36ce7d376432f75b65b4ecb437d20f97196ba9d4683db0425ea3 + checksum: 06e1ee41c1095e37281cb71a975cb3350f7cb470a0665d2576f02cc9564f623bd90cfc0183693b8a7fdf2d242963dcc3010b509fa3ac683f540c765c0f3e7e43 languageName: node linkType: hard @@ -10967,6 +11813,20 @@ __metadata: languageName: node linkType: hard +"update-browserslist-db@npm:^1.0.13": + version: 1.0.13 + resolution: "update-browserslist-db@npm:1.0.13" + dependencies: + escalade: "npm:^3.1.1" + picocolors: "npm:^1.0.0" + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 9074b4ef34d2ed931f27d390aafdd391ee7c45ad83c508e8fed6aaae1eb68f81999a768ed8525c6f88d4001a4fbf1b8c0268f099d0e8e72088ec5945ac796acf + languageName: node + linkType: hard + "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -11029,6 +11889,16 @@ __metadata: languageName: node linkType: hard +"validate-npm-package-license@npm:^3.0.1": + version: 3.0.4 + resolution: "validate-npm-package-license@npm:3.0.4" + dependencies: + spdx-correct: "npm:^3.0.0" + spdx-expression-parse: "npm:^3.0.0" + checksum: 86242519b2538bb8aeb12330edebb61b4eb37fd35ef65220ab0b03a26c0592c1c8a7300d32da3cde5abd08d18d95e8dabfad684b5116336f6de9e6f207eec224 + languageName: node + linkType: hard + "value-or-function@npm:^3.0.0": version: 3.0.0 resolution: "value-or-function@npm:3.0.0" @@ -11331,6 +12201,51 @@ __metadata: languageName: node linkType: hard +"which-builtin-type@npm:^1.1.3": + version: 1.1.3 + resolution: "which-builtin-type@npm:1.1.3" + dependencies: + function.prototype.name: "npm:^1.1.5" + has-tostringtag: "npm:^1.0.0" + is-async-function: "npm:^2.0.0" + is-date-object: "npm:^1.0.5" + is-finalizationregistry: "npm:^1.0.2" + is-generator-function: "npm:^1.0.10" + is-regex: "npm:^1.1.4" + is-weakref: "npm:^1.0.2" + isarray: "npm:^2.0.5" + which-boxed-primitive: "npm:^1.0.2" + which-collection: "npm:^1.0.1" + which-typed-array: "npm:^1.1.9" + checksum: d7823c4a6aa4fc8183eb572edd9f9ee2751e5f3ba2ccd5b298cc163f720df0f02ee1a5291d18ca8a41d48144ef40007ff6a64e6f5e7c506527086c7513a5f673 + languageName: node + linkType: hard + +"which-collection@npm:^1.0.1": + version: 1.0.1 + resolution: "which-collection@npm:1.0.1" + dependencies: + is-map: "npm:^2.0.1" + is-set: "npm:^2.0.1" + is-weakmap: "npm:^2.0.1" + is-weakset: "npm:^2.0.1" + checksum: 85c95fcf92df7972ce66bed879e53d9dc752a30ef08e1ca4696df56bcf1c302e3b9965a39b04a20fa280a997fad6c170eb0b4d62435569b7f6c0bc7be910572b + languageName: node + linkType: hard + +"which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.9": + version: 1.1.14 + resolution: "which-typed-array@npm:1.1.14" + dependencies: + available-typed-arrays: "npm:^1.0.6" + call-bind: "npm:^1.0.5" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.1" + checksum: 56253d2c9d6b41b8a4af96d8c2751bac5508906bd500cdcd0dc5301fb082de0391a4311ab21258bc8d2609ed593f422c1a66f0020fcb3a1e97f719bc928b9018 + languageName: node + linkType: hard + "which@npm:^2.0.1, which@npm:^2.0.2": version: 2.0.2 resolution: "which@npm:2.0.2"