From 650f80aac196544bafe1bb12c5e01396c039573f Mon Sep 17 00:00:00 2001 From: Marcel Ryser Date: Sat, 6 Jul 2024 13:03:21 +0200 Subject: [PATCH] updated eslint and added prettifier --- .gitattributes | 2 +- .prettierrc.yaml | 14 ++ README.md | 4 +- eslint.config.mjs | 13 +- package.json | 5 +- renovate.json | 4 +- src/main/index.ts | 396 ++++++++++++++++++++++++---------------------- tsconfig.json | 6 +- yarn.lock | 224 +++++++++++++------------- 9 files changed, 347 insertions(+), 321 deletions(-) create mode 100644 .prettierrc.yaml diff --git a/.gitattributes b/.gitattributes index 3cf47db..b88c1b4 100644 --- a/.gitattributes +++ b/.gitattributes @@ -13,4 +13,4 @@ *.war binary *.pdf binary *.zip binary -*.icns binary \ No newline at end of file +*.icns binary diff --git a/.prettierrc.yaml b/.prettierrc.yaml new file mode 100644 index 0000000..fea558e --- /dev/null +++ b/.prettierrc.yaml @@ -0,0 +1,14 @@ +# Use single quotes for strings, because that is the Angular default +singleQuote: true + +# The following settings prevent excessive use of vertical space +bracketSameLine: true # avoid closing '>' each on its own line + +# Line endings are converted to lf using git, but may be checked out as crlf on windows +endOfLine: lf + +# We prefer to use more horizontal space than the prettier default of 80, esp. for html +printWidth: 100 + +plugins: + - 'prettier-plugin-sh' diff --git a/README.md b/README.md index ed073b5..fe428e9 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ # Kanbanflow Application + [![Travis Build Status](https://travis-ci.org/metawave/kanbanflow-app.svg?branch=master)](https://travis-ci.org/metawave/kanbanflow-app) This app wraps the great kanbanflow.com application as a standalone app. - ![Screenshot](KanbanFlow.png) ## Usage Login with your credentials and get work done! -Use Alt key to bring up the menu, where you can increase/decrease zoom-factor and also reload the webapp, when you run into unexpected behaviour. +Use Alt key to bring up the menu, where you can increase/decrease zoom-factor and also reload the webapp, when you run into unexpected behaviour. diff --git a/eslint.config.mjs b/eslint.config.mjs index 90d6f5e..d947f22 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,11 +1,10 @@ -import globals from "globals"; -import pluginJs from "@eslint/js"; -import tseslint from "typescript-eslint"; - +import globals from 'globals'; +import pluginJs from '@eslint/js'; +import tseslint from 'typescript-eslint'; export default [ - {files: ["**/*.{js,mjs,cjs,ts}"]}, - {languageOptions: { globals: globals.browser }}, + { files: ['**/*.{js,mjs,cjs,ts}'] }, + { languageOptions: { globals: globals.browser } }, pluginJs.configs.recommended, ...tseslint.configs.recommended, -]; \ No newline at end of file +]; diff --git a/package.json b/package.json index 583548b..e4580c5 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "build": "tsc --outDir ./tsc", "watch": "tsc -w --outDir ./tsc", "lint": "eslint ./src", + "prettify": "prettier --write --ignore-unknown '**/*.*'", "start": "yarn build && electron ./tsc/src/main/index.js", "dist": "yarn build && electron-builder", "dist:dir": "yarn dist --dir -c.compression=store -c.mac.identity=null" @@ -69,8 +70,10 @@ "@typescript-eslint/parser": "^7.15.0", "electron": "^31.1.0", "electron-builder": "^24.13.3", - "eslint": "8.57.0", + "eslint": "^9.6.0", "globals": "^15.8.0", + "prettier": "^3.3.2", + "prettier-plugin-sh": "^0.14.0", "typescript": "^5.5.3", "typescript-eslint": "^7.15.0" } diff --git a/renovate.json b/renovate.json index 39a2b6e..4bd832f 100644 --- a/renovate.json +++ b/renovate.json @@ -1,6 +1,4 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": [ - "config:base" - ] + "extends": ["config:base"] } diff --git a/src/main/index.ts b/src/main/index.ts index 02ae251..59b3e4b 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -1,263 +1,273 @@ -import {app, BrowserWindow, Event, Menu, MenuItemConstructorOptions, Rectangle, screen, shell} from 'electron'; -import {autoUpdater} from 'electron-updater'; +import { + app, + BrowserWindow, + Event, + Menu, + MenuItemConstructorOptions, + Rectangle, + screen, + shell, +} from 'electron'; +import { autoUpdater } from 'electron-updater'; import * as pkg from '../../package.json'; -import Store, {Schema} from 'electron-store'; +import Store from 'electron-store'; // Keep a global reference of the window object, if you don't, the window will // be closed automatically when the JavaScript object is garbage collected. let mainWindow: BrowserWindow; // Config store for storing some settings -const confSchema : Schema = { +const conf = new Store({ + name: pkg.name, + schema: { zoomFactor: { - type: 'number', - default: 1.0 + type: 'number', + default: 1.0, }, windowX: { - type: 'number', - default: 0 + type: 'number', + default: 0, }, windowY: { - type: 'number', - default: 0 + type: 'number', + default: 0, }, windowWidth: { - type: 'number', - default: 1440 + type: 'number', + default: 1440, }, windowHeight: { - type: 'number', - default: 900 + type: 'number', + default: 900, }, windowMaximized: { - type: 'boolean', - default: false - } -}; -const conf = new Store({name: pkg.name, schema: confSchema}); + type: 'boolean', + default: false, + }, + }, +}); function rectContains(bigRect: Rectangle, smallRect: Rectangle): boolean { - return bigRect.x <= smallRect.x && - bigRect.y <= smallRect.y && - bigRect.x + bigRect.width >= smallRect.x + smallRect.width && - bigRect.y + bigRect.height >= smallRect.y + smallRect.height; + return ( + bigRect.x <= smallRect.x && + bigRect.y <= smallRect.y && + bigRect.x + bigRect.width >= smallRect.x + smallRect.width && + bigRect.y + bigRect.height >= smallRect.y + smallRect.height + ); } function getWindowConfig(): Rectangle { - let posX = conf.get('windowX') as number|undefined; - let posY = conf.get('windowY') as number|undefined; - const width = conf.get('windowWith') as number|undefined; - const height = conf.get('windowHeight') as number|undefined; + let posX = conf.get('windowX') as number; + let posY = conf.get('windowY') as number; + const width = conf.get('windowWidth') as number; + const height = conf.get('windowHeight') as number; - // check if window is on a screen - const displays = screen.getAllDisplays(); - const displayContainingWindow = displays.filter((display) => { - return rectContains(display.bounds, {x: posX, y: posY, width, height}); - }); + // check if window is on a screen + const displays = screen.getAllDisplays(); + const displayContainingWindow = displays.filter((display) => { + return rectContains(display.bounds, { x: posX, y: posY, width, height }); + }); - if (displayContainingWindow.length === 0) { - posX = null; - posY = null; - } + if (displayContainingWindow.length === 0) { + posX = null; + posY = null; + } - return { - x: posX, - y: posY, - width: width, - height: height - } + return { + x: posX, + y: posY, + width: width, + height: height, + }; } function handleLinkClick(e: Event | undefined, reqUrl: string): void { - const getHost = (urlString: string): string => new URL(urlString).host; - const reqHost = getHost(reqUrl); + const getHost = (urlString: string): string => new URL(urlString).host; + const reqHost = getHost(reqUrl); - // is external, eg. not kanbanflow? - if (reqHost && reqHost != getHost(mainWindow.webContents.getURL())) { - if (e !== undefined) e.preventDefault(); - shell.openExternal(reqUrl); - } + // is external, eg. not kanbanflow? + if (reqHost && reqHost != getHost(mainWindow.webContents.getURL())) { + if (e !== undefined) e.preventDefault(); + shell.openExternal(reqUrl); + } } function createWindow(): void { + // restore some settings + const zFactor = conf.get('zoomFactor') as number | undefined; - // restore some settings - const zFactor = conf.get('zoomFactor') as number|undefined; + // get window config + const windowConfig = getWindowConfig(); - // get window config - const windowConfig = getWindowConfig(); + // Create the browser window. + mainWindow = new BrowserWindow({ + icon: 'appicon.ico', + x: windowConfig.x, + y: windowConfig.y, + width: windowConfig.width, + height: windowConfig.height, + autoHideMenuBar: true, + webPreferences: { + webSecurity: false, + nodeIntegration: false, + zoomFactor: zFactor, + }, + }); - // Create the browser window. - mainWindow = new BrowserWindow( + // Simple Menu for Exit and View-Zoom + const menuTemplate: MenuItemConstructorOptions[] = [ + { + label: 'File', + submenu: [ { - icon: 'appicon.ico', - x: windowConfig.x, - y: windowConfig.y, - width: windowConfig.width, - height: windowConfig.height, - autoHideMenuBar: true, - webPreferences: { - webSecurity: false, - nodeIntegration: false, - zoomFactor: zFactor - } - }); - - // Simple Menu for Exit and View-Zoom - const menuTemplate: MenuItemConstructorOptions[] = [ + label: 'Reload Webapp', + role: 'reload', + }, { - label: 'File', - submenu: [ - { - label: 'Reload Webapp', - role: 'reload' - }, - { - label: 'Quit', - role: 'close' - } - ] + label: 'Quit', + role: 'close', }, + ], + }, + { + label: 'Edit', + submenu: [ + { label: 'Undo', accelerator: 'CmdOrCtrl+Z', role: 'undo' }, + { label: 'Redo', accelerator: 'Shift+CmdOrCtrl+Z', role: 'redo' }, + { type: 'separator' }, + { label: 'Cut', accelerator: 'CmdOrCtrl+X', role: 'cut' }, + { label: 'Copy', accelerator: 'CmdOrCtrl+C', role: 'copy' }, + { label: 'Paste', accelerator: 'CmdOrCtrl+V', role: 'paste' }, + { label: 'Select All', accelerator: 'CmdOrCtrl+A', role: 'selectAll' }, + ], + }, + { + label: 'View', + submenu: [ { - label: 'Edit', - submenu: [ - {label: 'Undo', accelerator: 'CmdOrCtrl+Z', role: 'undo'}, - {label: 'Redo', accelerator: 'Shift+CmdOrCtrl+Z', role: 'redo'}, - {type: 'separator'}, - {label: 'Cut', accelerator: 'CmdOrCtrl+X', role: 'cut'}, - {label: 'Copy', accelerator: 'CmdOrCtrl+C', role: 'copy'}, - {label: 'Paste', accelerator: 'CmdOrCtrl+V', role: 'paste'}, - {label: 'Select All', accelerator: 'CmdOrCtrl+A', role: 'selectAll'} - ] + label: 'Zoom In', + role: 'zoomIn', + accelerator: 'CmdOrCtrl+Shift+3', }, { - label: 'View', - submenu: [ - { - label: 'Zoom In', - role: 'zoomIn', - accelerator: 'CmdOrCtrl+Shift+3' - }, - { - label: 'Zoom Out', - role: 'zoomOut', - accelerator: 'CmdOrCtrl+Shift+2' - }, - { - type: 'separator' - }, - { - label: 'Reset Zoom', - role: 'resetZoom', - accelerator: 'CmdOrCtrl+Shift+1' - } - ] + label: 'Zoom Out', + role: 'zoomOut', + accelerator: 'CmdOrCtrl+Shift+2', }, { - label: 'Help', - submenu: [ - { - label: 'About', - click(): void { - shell.openExternal('https://github.com/metawave/kanbanflow-app') - } - } - ] - } - ]; - - // MacOS has a slightly different menu - if (process.platform === 'darwin') { + type: 'separator', + }, + { + label: 'Reset Zoom', + role: 'resetZoom', + accelerator: 'CmdOrCtrl+Shift+1', + }, + ], + }, + { + label: 'Help', + submenu: [ + { + label: 'About', + click(): void { + shell.openExternal('https://github.com/metawave/kanbanflow-app'); + }, + }, + ], + }, + ]; - // Remove quit from File menu since this will be in the AppMenu - (menuTemplate[0].submenu as MenuItemConstructorOptions[]).pop(); + // MacOS has a slightly different menu + if (process.platform === 'darwin') { + // Remove quit from File menu since this will be in the AppMenu + (menuTemplate[0].submenu as MenuItemConstructorOptions[]).pop(); - const name = app.getName(); - const osxMenu: MenuItemConstructorOptions = { - label: name, - submenu: [ - { - label: 'Quit', - accelerator: 'CmdOrCtrl+Q', - click(): void { - app.quit(); - } - } - ] - }; - menuTemplate.unshift(osxMenu); - } + const name = app.getName(); + const osxMenu: MenuItemConstructorOptions = { + label: name, + submenu: [ + { + label: 'Quit', + accelerator: 'CmdOrCtrl+Q', + click(): void { + app.quit(); + }, + }, + ], + }; + menuTemplate.unshift(osxMenu); + } - // open devtools - //mainWindow.webContents.openDevTools(); + // open devtools + //mainWindow.webContents.openDevTools(); - // if it was previously maximized, we do that now - if (conf.get('windowMaximized')) { - mainWindow.maximize(); - } + // if it was previously maximized, we do that now + if (conf.get('windowMaximized')) { + mainWindow.maximize(); + } - const menu = Menu.buildFromTemplate(menuTemplate); - mainWindow.setMenu(menu); - if (process.platform === 'darwin') { - Menu.setApplicationMenu(menu); - } + const menu = Menu.buildFromTemplate(menuTemplate); + mainWindow.setMenu(menu); + if (process.platform === 'darwin') { + Menu.setApplicationMenu(menu); + } - // and load the index.html of the app. - mainWindow.loadURL("https://kanbanflow.com"); + // and load the index.html of the app. + mainWindow.loadURL('https://kanbanflow.com'); - mainWindow.on('close', function () { - conf.set('zoomFactor', mainWindow.webContents.zoomFactor); + mainWindow.on('close', function () { + conf.set('zoomFactor', mainWindow.webContents.zoomFactor); - // Window positions and size - const windowBounds = mainWindow.getBounds(); - conf.set('windowX', windowBounds.x); - conf.set('windowY', windowBounds.y); - conf.set('windowWidth', windowBounds.width); - conf.set('windowHeight', windowBounds.height); + // Window positions and size + const windowBounds = mainWindow.getBounds(); + conf.set('windowX', windowBounds.x); + conf.set('windowY', windowBounds.y); + conf.set('windowWidth', windowBounds.width); + conf.set('windowHeight', windowBounds.height); - // Is it maximized? - conf.set('windowMaximized', mainWindow.isMaximized()); - }); + // Is it maximized? + conf.set('windowMaximized', mainWindow.isMaximized()); + }); - // open external links always in system browser instead of kanban app - mainWindow.webContents.on('will-navigate', handleLinkClick); - mainWindow.webContents.setWindowOpenHandler((details => { - handleLinkClick(undefined, details.url); - return {action: "deny"}; - })) + // open external links always in system browser instead of kanban app + mainWindow.webContents.on('will-navigate', handleLinkClick); + mainWindow.webContents.setWindowOpenHandler((details) => { + handleLinkClick(undefined, details.url); + return { action: 'deny' }; + }); - // Emitted when the window is closed. - mainWindow.on('closed', function () { - // Dereference the window object, usually you would store windows - // in an array if your app supports multi windows, this is the time - // when you should delete the corresponding element. - mainWindow = null - }); + // Emitted when the window is closed. + mainWindow.on('closed', function () { + // Dereference the window object, usually you would store windows + // in an array if your app supports multi windows, this is the time + // when you should delete the corresponding element. + mainWindow = null; + }); - // At last, check for app updates - autoUpdater.checkForUpdatesAndNotify(); + // At last, check for app updates + autoUpdater.checkForUpdatesAndNotify(); } // This method will be called when Electron has finished // initialization and is ready to create browser windows. // Some APIs can only be used after this event occurs. app.on('ready', () => { - createWindow(); + createWindow(); - app.on("activate", function () { - // On macOS it's common to re-create a window in the app when the - // dock icon is clicked and there are no other windows open. - if (BrowserWindow.getAllWindows().length === 0) createWindow(); - }); + app.on('activate', function () { + // On macOS it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (BrowserWindow.getAllWindows().length === 0) createWindow(); + }); }); // Quit when all windows are closed. app.on('window-all-closed', () => { - // On OS X it is common for applications and their menu bar - // to stay active until the user quits explicitly with Cmd + Q - if (process.platform !== 'darwin') { - app.quit(); - } + // On OS X it is common for applications and their menu bar + // to stay active until the user quits explicitly with Cmd + Q + if (process.platform !== 'darwin') { + app.quit(); + } }); // In this file you can include the rest of your app's specific main process diff --git a/tsconfig.json b/tsconfig.json index 96c70b7..f6c66f1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,7 +12,5 @@ "*": ["node_modules/*"] } }, - "include": [ - "src/**/*" - ] -} \ No newline at end of file + "include": ["src/**/*"] +} diff --git a/yarn.lock b/yarn.lock index e869962..1c295e1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -85,49 +85,49 @@ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== +"@eslint/config-array@^0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.17.0.tgz#ff305e1ee618a00e6e5d0485454c8d92d94a860d" + integrity sha512-A68TBu6/1mHHuc5YJL0U0VVeGNiklLAL6rRmhTCP2B5XjWLMnrX+HkO+IAXyHvks5cyyY1jjK5ITPQ1HGS2EVA== + dependencies: + "@eslint/object-schema" "^2.1.4" + debug "^4.3.1" + minimatch "^3.1.2" + +"@eslint/eslintrc@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.1.0.tgz#dbd3482bfd91efa663cbe7aa1f506839868207b6" + integrity sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" + espree "^10.0.1" + globals "^14.0.0" ignore "^5.2.0" import-fresh "^3.2.1" js-yaml "^4.1.0" minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== - -"@eslint/js@^9.6.0": +"@eslint/js@9.6.0", "@eslint/js@^9.6.0": version "9.6.0" resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.6.0.tgz#5b0cb058cc13d9c92d4e561d3538807fa5127c95" integrity sha512-D9B0/3vNg44ZeWbYMpBoXqNP4j6eQD5vNwIlGAuFRRzK/WtT/jvDQW3Bi9kkf3PMDMlM7Yi+73VLUsn5bJcl8A== -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== - dependencies: - "@humanwhocodes/object-schema" "^2.0.2" - debug "^4.3.1" - minimatch "^3.0.5" +"@eslint/object-schema@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.4.tgz#9e69f8bb4031e11df79e03db09f9dbbae1740843" + integrity sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ== "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" - integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== +"@humanwhocodes/retry@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.0.tgz#6d86b8cb322660f03d3f0aa94b99bdd8e172d570" + integrity sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew== "@isaacs/cliui@^8.0.2": version "8.0.2" @@ -243,9 +243,9 @@ integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== "@types/node@*", "@types/node@^20.9.0": - version "20.14.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.9.tgz#12e8e765ab27f8c421a1820c99f5f313a933b420" - integrity sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg== + version "20.14.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.10.tgz#a1a218290f1b6428682e3af044785e5874db469a" + integrity sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ== dependencies: undici-types "~5.26.4" @@ -362,11 +362,6 @@ "@typescript-eslint/types" "7.15.0" eslint-visitor-keys "^3.4.3" -"@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== - "@xmldom/xmldom@^0.8.8": version "0.8.10" resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" @@ -377,7 +372,7 @@ acorn-jsx@^5.3.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.9.0: +acorn@^8.12.0: version "8.12.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== @@ -898,13 +893,6 @@ dmg-license@^1.0.11: smart-buffer "^4.0.2" verror "^1.10.0" -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - dot-prop@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" @@ -1049,54 +1037,55 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== +eslint-scope@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.0.1.tgz#a9601e4b81a0b9171657c343fb13111688963cfc" + integrity sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@8.57.0: - version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== +eslint-visitor-keys@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz#e3adc021aa038a2a8e0b2f8b0ce8f66b9483b1fb" + integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw== + +eslint@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.6.0.tgz#9f54373afa15e1ba356656a8d96233182027fb49" + integrity sha512-ElQkdLMEEqQNM9Njff+2Y4q2afHk7JpkPvrd7Xh7xefwgQynqPxwf55J7di9+MEibWUGdNjFF9ITG9Pck5M84w== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" + "@eslint/config-array" "^0.17.0" + "@eslint/eslintrc" "^3.1.0" + "@eslint/js" "9.6.0" "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.3.0" "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.3.2" - doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" + eslint-scope "^8.0.1" + eslint-visitor-keys "^4.0.0" + espree "^10.1.0" + esquery "^1.5.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" + file-entry-cache "^8.0.0" find-up "^5.0.0" glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" ignore "^5.2.0" imurmurhash "^0.1.4" is-glob "^4.0.0" is-path-inside "^3.0.3" - js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" @@ -1106,16 +1095,16 @@ eslint@8.57.0: strip-ansi "^6.0.1" text-table "^0.2.0" -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== +espree@^10.0.1, espree@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.1.0.tgz#8788dae611574c0f070691f522e4116c5a11fc56" + integrity sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA== dependencies: - acorn "^8.9.0" + acorn "^8.12.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" + eslint-visitor-keys "^4.0.0" -esquery@^1.4.2: +esquery@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== @@ -1195,12 +1184,12 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== dependencies: - flat-cache "^3.0.4" + flat-cache "^4.0.0" filelist@^1.0.4: version "1.0.4" @@ -1231,14 +1220,13 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" -flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== dependencies: flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" + keyv "^4.5.4" flatted@^3.2.9: version "3.3.1" @@ -1345,9 +1333,9 @@ glob-parent@^6.0.2: is-glob "^4.0.3" glob@^10.3.10: - version "10.4.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.2.tgz#bed6b95dade5c1f80b4434daced233aee76160e5" - integrity sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w== + version "10.4.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.3.tgz#e0ba2253dd21b3d0acdfb5d507c59a29f513fc7a" + integrity sha512-Q38SGlYRpVtDBPSWEylRyctn7uDeTp4NQERTLiCT1FqA9JXPYWqAVmQU6qh4r/zMM5ehxTcbaO8EjhWnvEhmyg== dependencies: foreground-child "^3.1.0" jackspeak "^3.1.2" @@ -1356,7 +1344,7 @@ glob@^10.3.10: package-json-from-dist "^1.0.0" path-scurry "^1.11.1" -glob@^7.1.3, glob@^7.1.6: +glob@^7.1.6: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -1380,12 +1368,10 @@ global-agent@^3.0.0: semver "^7.3.2" serialize-error "^7.0.1" -globals@^13.19.0: - version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== globals@^15.8.0: version "15.8.0" @@ -1618,9 +1604,9 @@ isexe@^2.0.0: integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== jackspeak@^3.1.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.0.tgz#a75763ff36ad778ede6a156d8ee8b124de445b4a" - integrity sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw== + version "3.4.1" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.1.tgz#145422416740568e9fc357bf60c844b3c1585f09" + integrity sha512-U23pQPDnmYybVkYjObcuYMk43VRlMLLqLI+RdZy8s8WV8WsxO9SnqSroKaluuvcNOdCAlauKszDwd+umbot5Mg== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: @@ -1694,7 +1680,7 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -keyv@^4.0.0, keyv@^4.5.3: +keyv@^4.0.0, keyv@^4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== @@ -1755,9 +1741,9 @@ lowercase-keys@^2.0.0: integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== lru-cache@^10.2.0: - version "10.3.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.3.0.tgz#4a4aaf10c84658ab70f79a85a9a3f1e1fb11196b" - integrity sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ== + version "10.3.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.3.1.tgz#a37050586f84ccfdb570148a253bf1632a29ef44" + integrity sha512-9/8QXrtbGeMB6LxwQd4x1tIMnsmUxMvIH/qWGsccz6bt9Uln3S+sgAaqfQNhbGA8ufzs2fHuP/yqapGgP9Hh2g== lru-cache@^6.0.0: version "6.0.0" @@ -1823,7 +1809,7 @@ mimic-response@^3.1.0: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -1884,6 +1870,11 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +mvdan-sh@^0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/mvdan-sh/-/mvdan-sh-0.10.1.tgz#5b3a4462a89cf20739b12d851589342c875f4d1f" + integrity sha512-kMbrH0EObaKmK3nVRKUIIya1dpASHIEusM13S4V1ViHFuxuNxCo+arxoa6j/dbV22YBGjl7UKJm9QQKJ2Crzhg== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -2049,6 +2040,19 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +prettier-plugin-sh@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/prettier-plugin-sh/-/prettier-plugin-sh-0.14.0.tgz#22b186adea79b36212ccd9faa8dd01f33ef34ff6" + integrity sha512-hfXulj5+zEl/ulrO5kMuuTPKmXvOg0bnLHY1hKFNN/N+/903iZbNp8NyZBTsgI8dtkSgFfAEIQq0IQTyP1ZVFQ== + dependencies: + mvdan-sh "^0.10.1" + sh-syntax "^0.4.1" + +prettier@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.2.tgz#03ff86dc7c835f2d2559ee76876a3914cec4a90a" + integrity sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA== + progress@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" @@ -2146,13 +2150,6 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - roarr@^2.15.3: version "2.15.4" resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd" @@ -2223,6 +2220,13 @@ set-function-length@^1.2.1: gopd "^1.0.1" has-property-descriptors "^1.0.2" +sh-syntax@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/sh-syntax/-/sh-syntax-0.4.2.tgz#3bad5c6134b510e7b4c53b16f409ce4fd2a65245" + integrity sha512-/l2UZ5fhGZLVZa16XQM9/Vq/hezGGbdHeVEA01uWjOL1+7Ek/gt6FquW0iKKws4a9AYPYvlz6RyVvjh3JxOteg== + dependencies: + tslib "^2.6.2" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -2427,6 +2431,11 @@ ts-api-utils@^1.3.0: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== +tslib@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" + integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -2439,11 +2448,6 @@ type-fest@^0.13.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - type-fest@^2.17.0: version "2.19.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b"