├── .circleci └── config.yml ├── .eslintrc ├── .gitignore ├── .npmignore ├── .prettierrc.json ├── .releaserc.json ├── LICENSE ├── README.md ├── package.json ├── src ├── downloadChromeExtension.ts ├── index.ts └── utils.ts ├── test ├── .eslintrc ├── download_spec.ts ├── fixtures │ └── simple_extension │ │ └── manifest.json ├── install_spec.ts ├── setup.ts └── testdata │ └── knownExtensions.ts ├── tsconfig.json └── yarn.lock /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2.1 2 | 3 | orbs: 4 | cfa: continuousauth/npm@2.1.1 5 | 6 | jobs: 7 | test-electron: 8 | parameters: 9 | electron_version: 10 | type: string 11 | docker: 12 | - image: ghcr.io/electron/build:bc2f48b2415a670de18d13605b1cf0eb5fdbaae1 13 | environment: 14 | DISPLAY: ':99.0' 15 | steps: 16 | - checkout 17 | - restore_cache: 18 | keys: 19 | - v1-node_modules-{{ arch }}-{{ checksum "yarn.lock" }} 20 | - v1-node_modules-{{ arch }} 21 | - run: npx yarn 22 | - save_cache: 23 | paths: 24 | - node_modules 25 | key: v1-node_modules-{{ arch }}-{{ checksum "yarn.lock" }} 26 | - run: npx yarn add electron@<< parameters.electron_version >> 27 | - run: sh -e /etc/init.d/xvfb start 28 | - run: npx yarn test 29 | 30 | workflows: 31 | version: 2 32 | test_and_release: 33 | # Run the test jobs first, then the release only when all the test jobs are successful 34 | jobs: 35 | - test-electron: 36 | name: test-electron-30 37 | electron_version: ^30.0.0 38 | - test-electron: 39 | name: test-electron-33 40 | electron_version: ^33.0.0 41 | - cfa/release: 42 | requires: 43 | - test-electron-30 44 | - test-electron-33 45 | filters: 46 | branches: 47 | only: 48 | - main 49 | context: cfa-release 50 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "airbnb-base", 3 | "rules": { 4 | "consistent-return": 0, 5 | "import/no-unresolved": 0, 6 | "max-len": [2, 170], 7 | "import/prefer-default-export": 0, 8 | "import/no-extraneous-dependencies": 0, 9 | "linebreak-style": 0, 10 | "no-restricted-syntax": 0 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | xunit.xml 4 | yarn-error.log 5 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | test 3 | xunit.xml 4 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "all", 3 | "tabWidth": 2, 4 | "singleQuote": true, 5 | "printWidth": 100, 6 | "parser": "typescript", 7 | "endOfLine": "lf" 8 | } -------------------------------------------------------------------------------- /.releaserc.json: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": [ 3 | "@semantic-release/commit-analyzer", 4 | "@semantic-release/release-notes-generator", 5 | "@continuous-auth/semantic-release-npm", 6 | "@semantic-release/github" 7 | ], 8 | "branches": ["main"] 9 | } 10 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | Copyright (c) 2016 Samuel Attard 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 5 | 6 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 7 | 8 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Electron DevTools Installer 2 | --------------------------- 3 | 4 | ![CircleCI](https://img.shields.io/circleci/build/github/MarshallOfSound/electron-devtools-installer?style=for-the-badge) 5 | [![npm](https://img.shields.io/npm/v/electron-devtools-installer?style=for-the-badge)](https://www.npmjs.com/package/electron-devtools-installer) 6 | ![npm](https://img.shields.io/npm/dt/electron-devtools-installer?style=for-the-badge) 7 | [![license](https://img.shields.io/github/license/GPMDP/electron-devtools-installer.svg?maxAge=2592000&style=for-the-badge)](https://github.com/GPMDP/electron-devtools-installer/blob/master/LICENSE) 8 | [![CFA Enabled](https://img.shields.io/badge/CFA-Enabled-success?style=for-the-badge)](https://github.com/continuousauth) 9 | 10 | This is an easy way to install DevTool extensions into Electron. You shouldn't 11 | have to mess around with downloading the extension, finding the right folder and 12 | then configuring the path for everyone's machines. 13 | 14 | ## Install 15 | 16 | ``` 17 | npm install electron-devtools-installer --save-dev 18 | ``` 19 | or 20 | ``` 21 | yarn add electron-devtools-installer -D 22 | ``` 23 | 24 | ## Usage 25 | All you have to do now is this in the **main** process of your application. 26 | 27 | ```js 28 | import { installExtension, REDUX_DEVTOOLS } from 'electron-devtools-installer'; 29 | // Or if you can not use ES6 imports 30 | /** 31 | const { default: installExtension, REACT_DEVELOPER_TOOLS } = require('electron-devtools-installer'); 32 | */ 33 | const { app } = require('electron'); 34 | 35 | app.whenReady().then(() => { 36 | installExtension(REDUX_DEVTOOLS) 37 | .then((ext) => console.log(`Added Extension: ${ext.name}`)) 38 | .catch((err) => console.log('An error occurred: ', err)); 39 | }); 40 | ``` 41 | 42 | To install multiple extensions, `installExtension` takes an array. 43 | 44 | ```typescript 45 | app.whenReady().then(() => { 46 | installExtension([REDUX_DEVTOOLS, REACT_DEVELOPER_TOOLS]) 47 | .then(([redux, react]) => console.log(`Added Extensions: ${redux.name}, ${react.name}`)) 48 | .catch((err) => console.log('An error occurred: ', err)); 49 | }); 50 | ``` 51 | 52 | ### Local Files 53 | 54 | If you want your DevTools extensions to work on local `file://` URLs (e.g. loaded via `browserWindow.loadFile()`), don't forget to set `allowFileAccess` in the options passed to `installExtension`. 55 | 56 | ```typescript 57 | installExtension(REDUX_DEVTOOLS, { loadExtensionOptions: { allowFileAccess: true } }) 58 | ``` 59 | 60 | For more information see the [Electron documentation](https://www.electronjs.org/docs/latest/api/session#sesloadextensionpath-options). 61 | 62 | ## What extensions can I use? 63 | 64 | Technically you can use whatever extension you want. Simply find the ChromeStore ID 65 | of the extension you want to install, and call `installExtension('YOUR_ID_HERE')`. We 66 | offer a few extension ID's inside the package so you can easily import them to install without 67 | having to find them yourselves. 68 | 69 | ```js 70 | import { 71 | installExtension, 72 | EMBER_INSPECTOR, REACT_DEVELOPER_TOOLS, 73 | BACKBONE_DEBUGGER, JQUERY_DEBUGGER, 74 | VUEJS_DEVTOOLS, VUEJS_DEVTOOLS_BETA, 75 | REDUX_DEVTOOLS, MOBX_DEVTOOLS, 76 | APOLLO_DEVELOPER_TOOLS, 77 | } from 'electron-devtools-installer'; 78 | ``` 79 | 80 | ## How does it work? 81 | 82 | Well, you know those steps over in the [Electron Docs](https://github.com/electron/electron/blob/master/docs/tutorial/devtools-extension.md) 83 | that involve downloading, copying, checking paths, Etc. 84 | 85 | This does all of that for you, it downloads the chrome extension directly from 86 | the Chrome WebStore. Then it extracts it to your applications `userData` directory 87 | before loading it into Electron. 88 | 89 | 90 | License 91 | ------- 92 | 93 | The MIT License (MIT) 94 | 95 | Copyright (c) 2016 Samuel Attard 96 | 97 | Permission is hereby granted, free of charge, to any person obtaining a copy of 98 | this software and associated documentation files (the "Software"), to deal in 99 | the Software without restriction, including without limitation the rights to 100 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 101 | the Software, and to permit persons to whom the Software is furnished to do so, 102 | subject to the following conditions: 103 | 104 | The above copyright notice and this permission notice shall be included in all 105 | copies or substantial portions of the Software. 106 | 107 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 108 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 109 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 110 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 111 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 112 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 113 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "electron-devtools-installer", 3 | "version": "0.0.0-development", 4 | "description": "An easy way to install Dev Tools extensions into Electron applications", 5 | "main": "dist/index.js", 6 | "types": "dist/index.d.ts", 7 | "scripts": { 8 | "prettier:check": "prettier --check \"src/**/*.ts\" \"test/**/*.ts\"", 9 | "prettier:write": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", 10 | "compile": "tsc", 11 | "prepare": "npm run compile", 12 | "pretest-unit": "npm run compile", 13 | "test": "npm run prettier:check && npm run test-unit", 14 | "test-unit": "electron-mocha ./test/**/*_spec.ts --recursive --require ts-node/register --timeout 60000 -R spec-xunit-file -r test/setup.ts" 15 | }, 16 | "keywords": [ 17 | "electron", 18 | "dev", 19 | "tools" 20 | ], 21 | "author": { 22 | "name": "Samuel Attard", 23 | "email": "samuel.r.attard@gmail.com", 24 | "url": "https://www.samuelattard.com" 25 | }, 26 | "bugs": { 27 | "url": "https://github.com/MarshallOfSound/electron-devtools-installer/issues" 28 | }, 29 | "license": "MIT", 30 | "repository": { 31 | "type": "git", 32 | "url": "https://github.com/MarshallOfSound/electron-devtools-installer.git" 33 | }, 34 | "devDependencies": { 35 | "@types/chai": "^4.2.14", 36 | "@types/chai-as-promised": "^7.1.3", 37 | "@types/chai-fs": "^2.0.2", 38 | "@types/mocha": "^8.2.0", 39 | "@types/node": "^18.0.0", 40 | "@types/semver": "^7.3.4", 41 | "chai": "^4.2.0", 42 | "chai-as-promised": "^7.1.1", 43 | "chai-fs": "chaijs/chai-fs", 44 | "electron": "33.3.0", 45 | "electron-mocha": "^13.0.1", 46 | "mocha-testdata": "^1.2.0", 47 | "prettier": "^3.4.2", 48 | "spec-xunit-file": "0.0.1-3", 49 | "ts-node": "^9.1.1", 50 | "typescript": "^5.7.2" 51 | }, 52 | "dependencies": { 53 | "unzip-crx-3": "^0.2.0" 54 | }, 55 | "files": [ 56 | "LICENSE", 57 | "README.md", 58 | "dist" 59 | ] 60 | } 61 | -------------------------------------------------------------------------------- /src/downloadChromeExtension.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'fs'; 2 | import * as path from 'path'; 3 | 4 | import { getPath, downloadFile, changePermissions } from './utils'; 5 | 6 | const unzip: any = require('unzip-crx-3'); 7 | 8 | export const downloadChromeExtension = async ( 9 | chromeStoreID: string, 10 | { 11 | forceDownload = false, 12 | attempts = 5, 13 | }: { 14 | forceDownload?: boolean; 15 | attempts?: number; 16 | } = {}, 17 | ): Promise => { 18 | const extensionsStore = getPath(); 19 | if (!fs.existsSync(extensionsStore)) { 20 | await fs.promises.mkdir(extensionsStore, { recursive: true }); 21 | } 22 | const extensionFolder = path.resolve(`${extensionsStore}/${chromeStoreID}`); 23 | 24 | if (!fs.existsSync(extensionFolder) || forceDownload) { 25 | if (fs.existsSync(extensionFolder)) { 26 | await fs.promises.rmdir(extensionFolder, { 27 | recursive: true, 28 | }); 29 | } 30 | const fileURL = `https://clients2.google.com/service/update2/crx?response=redirect&acceptformat=crx2,crx3&x=id%3D${chromeStoreID}%26uc&prodversion=${process.versions.chrome}`; // eslint-disable-line 31 | const filePath = path.resolve(`${extensionFolder}.crx`); 32 | try { 33 | await downloadFile(fileURL, filePath); 34 | 35 | try { 36 | await unzip(filePath, extensionFolder); 37 | changePermissions(extensionFolder, 755); 38 | return extensionFolder; 39 | } catch (err) { 40 | if (!fs.existsSync(path.resolve(extensionFolder, 'manifest.json'))) { 41 | throw err; 42 | } 43 | } 44 | } catch (err) { 45 | console.error(`Failed to fetch extension, trying ${attempts - 1} more times`); // eslint-disable-line 46 | if (attempts <= 1) { 47 | throw err; 48 | } 49 | await new Promise((resolve) => setTimeout(resolve, 200)); 50 | 51 | return await downloadChromeExtension(chromeStoreID, { 52 | forceDownload, 53 | attempts: attempts - 1, 54 | }); 55 | } 56 | } 57 | 58 | return extensionFolder; 59 | }; 60 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { Extension, LoadExtensionOptions, Session, session } from 'electron'; 2 | 3 | import { downloadChromeExtension } from './downloadChromeExtension'; 4 | 5 | export interface ExtensionReference { 6 | /** 7 | * Extension ID 8 | */ 9 | id: string; 10 | } 11 | 12 | export interface InstallExtensionOptions { 13 | /** 14 | * Ignore whether the extension is already downloaded and redownload every time 15 | */ 16 | forceDownload?: boolean; 17 | /** 18 | * Options passed to session.loadExtension 19 | */ 20 | loadExtensionOptions?: LoadExtensionOptions; 21 | /** 22 | * Optionally specify the session to install devtools into, by default devtools 23 | * will be installed into the "defaultSession". See the Electron Session docs 24 | * for more info. 25 | * 26 | * https://electronjs.org/docs/api/session 27 | */ 28 | session?: Session; 29 | } 30 | 31 | /** 32 | * @param extensionReference Extension or extensions to install 33 | * @param options Installation options 34 | * @returns A promise resolving with the name or names of the extensions installed 35 | */ 36 | export async function installExtension( 37 | extensionReference: Array, 38 | options?: InstallExtensionOptions, 39 | ): Promise; 40 | export async function installExtension( 41 | extensionReference: ExtensionReference | string, 42 | options?: InstallExtensionOptions, 43 | ): Promise; 44 | export async function installExtension( 45 | extensionReference: ExtensionReference | string | Array, 46 | options: InstallExtensionOptions = {}, 47 | ): Promise { 48 | const { forceDownload, loadExtensionOptions, session: _session } = options; 49 | const targetSession = _session || session.defaultSession; 50 | 51 | if (process.type !== 'browser') { 52 | return Promise.reject( 53 | new Error('electron-devtools-installer can only be used from the main process'), 54 | ); 55 | } 56 | 57 | if (Array.isArray(extensionReference)) { 58 | return extensionReference.reduce( 59 | (accum, extension) => 60 | accum.then(async (result) => { 61 | const inner = await installExtension(extension, options); 62 | return [...result, inner]; 63 | }), 64 | Promise.resolve([] as Extension[]), 65 | ); 66 | } 67 | let chromeStoreID: string; 68 | if (typeof extensionReference === 'object' && extensionReference.id) { 69 | chromeStoreID = extensionReference.id; 70 | } else if (typeof extensionReference === 'string') { 71 | chromeStoreID = extensionReference; 72 | } else { 73 | throw new Error(`Invalid extensionReference passed in: "${extensionReference}"`); 74 | } 75 | 76 | const installedExtension = targetSession.getAllExtensions().find((e) => e.id === chromeStoreID); 77 | 78 | if (!forceDownload && installedExtension) { 79 | return installedExtension; 80 | } 81 | const extensionFolder = await downloadChromeExtension(chromeStoreID, { 82 | forceDownload: forceDownload || false, 83 | }); 84 | // Use forceDownload, but already installed 85 | if (installedExtension?.id) { 86 | const unloadPromise = new Promise((resolve) => { 87 | const handler = (_: unknown, ext: Extension) => { 88 | if (ext.id === installedExtension.id) { 89 | targetSession.removeListener('extension-unloaded', handler); 90 | resolve(); 91 | } 92 | }; 93 | targetSession.on('extension-unloaded', handler); 94 | }); 95 | targetSession.removeExtension(installedExtension.id); 96 | await unloadPromise; 97 | } 98 | 99 | return targetSession.loadExtension(extensionFolder, loadExtensionOptions); 100 | } 101 | 102 | export default installExtension; 103 | export const EMBER_INSPECTOR: ExtensionReference = { 104 | id: 'bmdblncegkenkacieihfhpjfppoconhi', 105 | }; 106 | export const REACT_DEVELOPER_TOOLS: ExtensionReference = { 107 | id: 'fmkadmapgofadopljbjfkapdkoienihi', 108 | }; 109 | export const BACKBONE_DEBUGGER: ExtensionReference = { 110 | id: 'bhljhndlimiafopmmhjlgfpnnchjjbhd', 111 | }; 112 | export const JQUERY_DEBUGGER: ExtensionReference = { 113 | id: 'dbhhnnnpaeobfddmlalhnehgclcmjimi', 114 | }; 115 | export const VUEJS_DEVTOOLS: ExtensionReference = { 116 | id: 'nhdogjmejiglipccpnnnanhbledajbpd', 117 | }; 118 | export const VUEJS_DEVTOOLS_BETA: ExtensionReference = { 119 | id: 'ljjemllljcmogpfapbkkighbhhppjdbg', 120 | }; 121 | export const REDUX_DEVTOOLS: ExtensionReference = { 122 | id: 'lmhkpmbekcpmknklioeibfkpmmfibljd', 123 | }; 124 | export const MOBX_DEVTOOLS: ExtensionReference = { 125 | id: 'pfgnfdagidkfgccljigdamigbcnndkod', 126 | }; 127 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import { app, net } from 'electron'; 2 | import * as fs from 'fs'; 3 | import * as path from 'path'; 4 | import * as https from 'https'; 5 | 6 | export const getPath = () => { 7 | const savePath = app.getPath('userData'); 8 | return path.resolve(`${savePath}/extensions`); 9 | }; 10 | 11 | // Use https.get fallback for Electron < 1.4.5 12 | const request: typeof https.request = net ? (net.request as any) : https.get; 13 | 14 | export const downloadFile = (from: string, to: string) => { 15 | return new Promise((resolve, reject) => { 16 | const req = request(from); 17 | req.on('response', (res) => { 18 | // Shouldn't handle redirect with `electron.net`, this is for https.get fallback 19 | if (res.statusCode && res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) { 20 | return downloadFile(res.headers.location, to).then(resolve).catch(reject); 21 | } 22 | res.pipe(fs.createWriteStream(to)).on('close', resolve); 23 | res.on('error', reject); 24 | }); 25 | req.on('error', reject); 26 | req.end(); 27 | }); 28 | }; 29 | 30 | export const changePermissions = (dir: string, mode: string | number) => { 31 | const files = fs.readdirSync(dir); 32 | files.forEach((file) => { 33 | const filePath = path.join(dir, file); 34 | fs.chmodSync(filePath, parseInt(`${mode}`, 8)); 35 | if (fs.statSync(filePath).isDirectory()) { 36 | changePermissions(filePath, mode); 37 | } 38 | }); 39 | }; 40 | -------------------------------------------------------------------------------- /test/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "mocha": true 4 | }, 5 | "rules": { 6 | "no-unused-expressions": 0 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /test/download_spec.ts: -------------------------------------------------------------------------------- 1 | // Pre-run 2 | import * as chai from 'chai'; 3 | import * as chaiAsPromised from 'chai-as-promised'; 4 | import * as chaiFs from 'chai-fs'; 5 | import * as fs from 'fs'; 6 | import * as path from 'path'; 7 | 8 | // Actual Test Imports 9 | import { downloadChromeExtension } from '../src/downloadChromeExtension'; 10 | import { REACT_DEVELOPER_TOOLS } from '../src/'; 11 | 12 | chai.use(chaiAsPromised); 13 | chai.use(chaiFs); 14 | chai.should(); 15 | 16 | describe('Extension Downloader', () => { 17 | describe('when given a valid extension ID', () => { 18 | it('should return a valid path', (done) => { 19 | downloadChromeExtension(REACT_DEVELOPER_TOOLS.id) 20 | .then((dir) => { 21 | dir.should.be.a.directory(); 22 | done(); 23 | }) 24 | .catch((err) => done(err)); 25 | }); 26 | 27 | it('should download a valid extension', (done) => { 28 | downloadChromeExtension(REACT_DEVELOPER_TOOLS.id) 29 | .then((dir) => { 30 | dir.should.be.a.directory(); 31 | path.resolve(dir, 'manifest.json').should.be.a.file(); 32 | done(); 33 | }) 34 | .catch((err) => done(err)); 35 | }); 36 | 37 | describe('with the force parameter', () => { 38 | it('should always re-download the extension', (done) => { 39 | downloadChromeExtension(REACT_DEVELOPER_TOOLS.id) 40 | .then((dir) => { 41 | dir.should.be.a.directory(); 42 | fs.writeFileSync(path.resolve(dir, 'old_ext.file'), '__TEST__'); 43 | path.resolve(dir, 'manifest.json').should.be.a.file(); 44 | path.resolve(dir, 'old_ext.file').should.be.a.file(); 45 | 46 | downloadChromeExtension(REACT_DEVELOPER_TOOLS.id, { forceDownload: true }) 47 | .then((newDir) => { 48 | newDir.should.be.equal(dir); 49 | newDir.should.be.a.directory(); 50 | path.resolve(newDir, 'manifest.json').should.be.a.file(); 51 | fs.existsSync(path.resolve(newDir, 'old_ext.file')).should.be.equal(false); 52 | done(); 53 | }) 54 | .catch((err) => done(err)); 55 | }) 56 | .catch((err) => done(err)); 57 | }); 58 | }); 59 | }); 60 | 61 | describe('when given an invalid extension ID', () => { 62 | it('should reject the promise', () => 63 | downloadChromeExtension('YOLO SWAGGINGS').should.be.rejected); 64 | }); 65 | }); 66 | -------------------------------------------------------------------------------- /test/fixtures/simple_extension/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 2, 3 | "name": "React Developer Tools", 4 | "description": "Adds React debugging tools to the Chrome Developer Tools.", 5 | "version": "0.14.0" 6 | } 7 | -------------------------------------------------------------------------------- /test/install_spec.ts: -------------------------------------------------------------------------------- 1 | // Pre-run 2 | import * as chai from 'chai'; 3 | import * as chaiAsPromised from 'chai-as-promised'; 4 | import * as chaiFs from 'chai-fs'; 5 | import { given } from 'mocha-testdata'; 6 | import * as path from 'path'; 7 | import { session } from 'electron'; 8 | 9 | const { expect } = chai; 10 | 11 | // Actual Test Imports 12 | import installExtension, { REACT_DEVELOPER_TOOLS } from '../src/'; 13 | import knownExtensions from './testdata/knownExtensions'; 14 | 15 | chai.use(chaiAsPromised); 16 | chai.use(chaiFs); 17 | chai.should(); 18 | 19 | describe('Extension Installer', () => { 20 | describe('when given a valid extension ID', () => { 21 | given(...knownExtensions).it('should resolve the extension successfully', async (item) => { 22 | const result = await installExtension(item.id); 23 | expect(result.name).to.equal(item.description); 24 | }); 25 | 26 | describe('when attempting to install the same extension twice', () => { 27 | it('should resolve the promise', (done) => { 28 | installExtension(REACT_DEVELOPER_TOOLS) 29 | .then(() => installExtension(REACT_DEVELOPER_TOOLS)) 30 | .then(() => done()) 31 | .catch(() => done('Failed to resolve')); 32 | }); 33 | 34 | it('should upgraded the extension with forceDownload', (done) => { 35 | const extensionName = 'React Developer Tools'; 36 | const oldVersion = '0.14.0'; 37 | 38 | session.defaultSession.removeExtension(extensionName); 39 | 40 | session.defaultSession 41 | .loadExtension(path.join(__dirname, 'fixtures/simple_extension')) 42 | .then((ext) => { 43 | ext.name.should.be.equal(extensionName); 44 | session.defaultSession 45 | .getAllExtensions() 46 | .find((e) => e.name === extensionName)! 47 | .version.should.be.equal(oldVersion); 48 | 49 | installExtension(REACT_DEVELOPER_TOOLS, { 50 | forceDownload: true, 51 | }) 52 | .then(() => { 53 | session.defaultSession 54 | .getAllExtensions() 55 | .find((e) => e.name === extensionName)! 56 | .version.should.not.be.equal(oldVersion); 57 | done(); 58 | }) 59 | .catch((err) => done(err)); 60 | }) 61 | .catch((err: Error) => done(err)); 62 | }); 63 | }); 64 | }); 65 | 66 | describe('when given an array of valid extensions', () => { 67 | it('should resolve the promise and install all of them', (done) => { 68 | installExtension(knownExtensions) 69 | .then(() => { 70 | const installed = session.defaultSession.getAllExtensions(); 71 | for (const extension of knownExtensions) { 72 | installed.map((e) => e.name).should.include(extension.description); 73 | const extensionId = installed.find((e) => e.name === extension.description)!.id; 74 | session.defaultSession.removeExtension(extensionId); 75 | } 76 | done(); 77 | }) 78 | .catch((err) => done(err)); 79 | }); 80 | }); 81 | 82 | describe('when given an invalid extension ID', () => { 83 | it('should reject the promise', () => installExtension('YOLO SWAGGINGS').should.be.rejected); 84 | }); 85 | 86 | afterEach((done) => { 87 | session.defaultSession 88 | .getAllExtensions() 89 | .forEach((ext) => session.defaultSession.removeExtension(ext.id)); 90 | setTimeout(done, 200); 91 | }); 92 | }); 93 | -------------------------------------------------------------------------------- /test/setup.ts: -------------------------------------------------------------------------------- 1 | process.on('uncaughtException', (error) => { 2 | throw error; 3 | }); 4 | -------------------------------------------------------------------------------- /test/testdata/knownExtensions.ts: -------------------------------------------------------------------------------- 1 | import { 2 | EMBER_INSPECTOR, 3 | REACT_DEVELOPER_TOOLS, 4 | BACKBONE_DEBUGGER, 5 | JQUERY_DEBUGGER, 6 | VUEJS_DEVTOOLS, 7 | VUEJS_DEVTOOLS_BETA, 8 | REDUX_DEVTOOLS, 9 | MOBX_DEVTOOLS, 10 | } from '../../src/'; 11 | 12 | const knownExtensions = [ 13 | { 14 | ...EMBER_INSPECTOR, 15 | description: 'Ember Inspector', 16 | }, 17 | { 18 | ...REACT_DEVELOPER_TOOLS, 19 | description: 'React Developer Tools', 20 | }, 21 | { 22 | ...BACKBONE_DEBUGGER, 23 | description: 'Backbone Debugger', 24 | }, 25 | { 26 | ...JQUERY_DEBUGGER, 27 | description: 'jQuery Debugger', 28 | }, 29 | { 30 | ...VUEJS_DEVTOOLS, 31 | description: 'Vue.js devtools', 32 | }, 33 | { 34 | ...VUEJS_DEVTOOLS_BETA, 35 | description: 'Vue.js devtools (beta)', 36 | }, 37 | { 38 | ...REDUX_DEVTOOLS, 39 | description: 'Redux DevTools', 40 | }, 41 | { 42 | ...MOBX_DEVTOOLS, 43 | description: 'MobX Developer Tools', 44 | }, 45 | ]; 46 | 47 | export default knownExtensions; 48 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es2017", 5 | "lib": [ 6 | "es2017", 7 | "dom" 8 | ], 9 | "sourceMap": true, 10 | "strict": true, 11 | "outDir": "dist", 12 | "types": [ 13 | "node", 14 | "mocha" 15 | ], 16 | "allowSyntheticDefaultImports": true, 17 | "moduleResolution": "node", 18 | "declaration": true 19 | }, 20 | "include": [ 21 | "src" 22 | ] 23 | } -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@electron/get@^2.0.0": 6 | version "2.0.3" 7 | resolved "https://registry.yarnpkg.com/@electron/get/-/get-2.0.3.tgz#fba552683d387aebd9f3fcadbcafc8e12ee4f960" 8 | integrity sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ== 9 | dependencies: 10 | debug "^4.1.1" 11 | env-paths "^2.2.0" 12 | fs-extra "^8.1.0" 13 | got "^11.8.5" 14 | progress "^2.0.3" 15 | semver "^6.2.0" 16 | sumchecker "^3.0.1" 17 | optionalDependencies: 18 | global-agent "^3.0.0" 19 | 20 | "@sindresorhus/is@^4.0.0": 21 | version "4.6.0" 22 | resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" 23 | integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== 24 | 25 | "@szmarczak/http-timer@^4.0.5": 26 | version "4.0.6" 27 | resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" 28 | integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== 29 | dependencies: 30 | defer-to-connect "^2.0.0" 31 | 32 | "@types/cacheable-request@^6.0.1": 33 | version "6.0.3" 34 | resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" 35 | integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== 36 | dependencies: 37 | "@types/http-cache-semantics" "*" 38 | "@types/keyv" "^3.1.4" 39 | "@types/node" "*" 40 | "@types/responselike" "^1.0.0" 41 | 42 | "@types/chai-as-promised@^7.1.3": 43 | version "7.1.3" 44 | resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.3.tgz#779166b90fda611963a3adbfd00b339d03b747bd" 45 | integrity sha512-FQnh1ohPXJELpKhzjuDkPLR2BZCAqed+a6xV4MI/T3XzHfd2FlarfUGUdZYgqYe8oxkYn0fchHEeHfHqdZ96sg== 46 | dependencies: 47 | "@types/chai" "*" 48 | 49 | "@types/chai-fs@^2.0.2": 50 | version "2.0.2" 51 | resolved "https://registry.yarnpkg.com/@types/chai-fs/-/chai-fs-2.0.2.tgz#1abcb8d6fe52246e4a9a8b512abc5ca4b466b356" 52 | integrity sha512-nS385nRPNvi9UjSUCDE7f84IXZnIzooPh7Ky88kdRfSFk72juvQENqrqyrKkJeXJsN9bMG9/5zVGr06GcBRB5g== 53 | dependencies: 54 | "@types/chai" "*" 55 | "@types/node" "*" 56 | 57 | "@types/chai@*", "@types/chai@^4.2.14": 58 | version "4.2.14" 59 | resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.14.tgz#44d2dd0b5de6185089375d976b4ec5caf6861193" 60 | integrity sha512-G+ITQPXkwTrslfG5L/BksmbLUA0M1iybEsmCWPqzSxsRRhJZimBKJkoMi8fr/CPygPTj4zO5pJH7I2/cm9M7SQ== 61 | 62 | "@types/color-name@^1.1.1": 63 | version "1.1.1" 64 | resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" 65 | integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== 66 | 67 | "@types/http-cache-semantics@*": 68 | version "4.0.4" 69 | resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" 70 | integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== 71 | 72 | "@types/keyv@^3.1.4": 73 | version "3.1.4" 74 | resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" 75 | integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== 76 | dependencies: 77 | "@types/node" "*" 78 | 79 | "@types/mocha@^8.2.0": 80 | version "8.2.0" 81 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.0.tgz#3eb56d13a1de1d347ecb1957c6860c911704bc44" 82 | integrity sha512-/Sge3BymXo4lKc31C8OINJgXLaw+7vL1/L1pGiBNpGrBiT8FQiaFpSYV0uhTaG4y78vcMBTMFsWaHDvuD+xGzQ== 83 | 84 | "@types/node@*": 85 | version "14.14.25" 86 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.25.tgz#15967a7b577ff81383f9b888aa6705d43fbbae93" 87 | integrity sha512-EPpXLOVqDvisVxtlbvzfyqSsFeQxltFbluZNRndIb8tr9KiBnYNLzrc1N3pyKUCww2RNrfHDViqDWWE1LCJQtQ== 88 | 89 | "@types/node@^18.0.0": 90 | version "18.19.68" 91 | resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.68.tgz#f4f10d9927a7eaf3568c46a6d739cc0967ccb701" 92 | integrity sha512-QGtpFH1vB99ZmTa63K4/FU8twThj4fuVSBkGddTp7uIL/cuoLWIUSL2RcOaigBhfR+hg5pgGkBnkoOxrTVBMKw== 93 | dependencies: 94 | undici-types "~5.26.4" 95 | 96 | "@types/node@^20.9.0": 97 | version "20.17.10" 98 | resolved "https://registry.yarnpkg.com/@types/node/-/node-20.17.10.tgz#3f7166190aece19a0d1d364d75c8b0b5778c1e18" 99 | integrity sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA== 100 | dependencies: 101 | undici-types "~6.19.2" 102 | 103 | "@types/responselike@^1.0.0": 104 | version "1.0.3" 105 | resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.3.tgz#cc29706f0a397cfe6df89debfe4bf5cea159db50" 106 | integrity sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw== 107 | dependencies: 108 | "@types/node" "*" 109 | 110 | "@types/semver@^7.3.4": 111 | version "7.3.4" 112 | resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.4.tgz#43d7168fec6fa0988bb1a513a697b29296721afb" 113 | integrity sha512-+nVsLKlcUCeMzD2ufHEYuJ9a2ovstb6Dp52A5VsoKxDXgvE051XgHI/33I1EymwkRGQkwnA0LkhnUzituGs4EQ== 114 | 115 | "@types/yauzl@^2.9.1": 116 | version "2.10.3" 117 | resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" 118 | integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== 119 | dependencies: 120 | "@types/node" "*" 121 | 122 | ansi-colors@^4.1.1: 123 | version "4.1.1" 124 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" 125 | integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== 126 | 127 | ansi-colors@^4.1.3: 128 | version "4.1.3" 129 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" 130 | integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== 131 | 132 | ansi-regex@^5.0.0, ansi-regex@^5.0.1: 133 | version "5.0.1" 134 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 135 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 136 | 137 | ansi-styles@^4.0.0: 138 | version "4.2.1" 139 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" 140 | integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== 141 | dependencies: 142 | "@types/color-name" "^1.1.1" 143 | color-convert "^2.0.1" 144 | 145 | ansi-styles@^4.1.0: 146 | version "4.3.0" 147 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 148 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 149 | dependencies: 150 | color-convert "^2.0.1" 151 | 152 | anymatch@~3.1.2: 153 | version "3.1.3" 154 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" 155 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 156 | dependencies: 157 | normalize-path "^3.0.0" 158 | picomatch "^2.0.4" 159 | 160 | arg@^4.1.0: 161 | version "4.1.3" 162 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 163 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 164 | 165 | argparse@^2.0.1: 166 | version "2.0.1" 167 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 168 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 169 | 170 | array-events@^0.2.0: 171 | version "0.2.0" 172 | resolved "https://registry.yarnpkg.com/array-events/-/array-events-0.2.0.tgz#ff42ac53e66f485d6f883234c32252bc2286130e" 173 | integrity sha1-/0KsU+ZvSF1viDI0wyJSvCKGEw4= 174 | dependencies: 175 | async-arrays "*" 176 | extended-emitter "*" 177 | 178 | assertion-error@^1.1.0: 179 | version "1.1.0" 180 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" 181 | integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== 182 | 183 | async-arrays@*: 184 | version "1.0.1" 185 | resolved "https://registry.yarnpkg.com/async-arrays/-/async-arrays-1.0.1.tgz#347af2b70f2a7a5767a2d5679cc42bbf1c220fd9" 186 | integrity sha1-NHrytw8qeldnotVnnMQrvxwiD9k= 187 | dependencies: 188 | sift "*" 189 | 190 | balanced-match@^1.0.0: 191 | version "1.0.0" 192 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 193 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 194 | 195 | binary-extensions@^2.0.0: 196 | version "2.0.0" 197 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" 198 | integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== 199 | 200 | bit-mask@^1.0.1: 201 | version "1.0.2" 202 | resolved "https://registry.yarnpkg.com/bit-mask/-/bit-mask-1.0.2.tgz#42f708362119611d6223cd53202c79428bf70b81" 203 | integrity sha512-UGtq08LSiazxL4zVmBzrhdCWnT4RWx3JhhD/3crhfv8xxjnVHxf/WoVjEstjSUaZeZRP7kZrWNqup1VvUClCaQ== 204 | dependencies: 205 | array-events "^0.2.0" 206 | 207 | boolean@^3.0.1: 208 | version "3.0.2" 209 | resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.0.2.tgz#df1baa18b6a2b0e70840475e1d93ec8fe75b2570" 210 | integrity sha512-RwywHlpCRc3/Wh81MiCKun4ydaIFyW5Ea6JbL6sRCVx5q5irDw7pMXBUFYF/jArQ6YrG36q0kpovc9P/Kd3I4g== 211 | 212 | brace-expansion@^2.0.1: 213 | version "2.0.1" 214 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 215 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 216 | dependencies: 217 | balanced-match "^1.0.0" 218 | 219 | braces@~3.0.2: 220 | version "3.0.3" 221 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" 222 | integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== 223 | dependencies: 224 | fill-range "^7.1.1" 225 | 226 | browser-stdout@^1.3.1: 227 | version "1.3.1" 228 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 229 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 230 | 231 | buffer-crc32@~0.2.3: 232 | version "0.2.13" 233 | resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" 234 | integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= 235 | 236 | buffer-from@^1.0.0: 237 | version "1.1.1" 238 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 239 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 240 | 241 | cacheable-lookup@^5.0.3: 242 | version "5.0.4" 243 | resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" 244 | integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== 245 | 246 | cacheable-request@^7.0.2: 247 | version "7.0.4" 248 | resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817" 249 | integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== 250 | dependencies: 251 | clone-response "^1.0.2" 252 | get-stream "^5.1.0" 253 | http-cache-semantics "^4.0.0" 254 | keyv "^4.0.0" 255 | lowercase-keys "^2.0.0" 256 | normalize-url "^6.0.1" 257 | responselike "^2.0.0" 258 | 259 | call-me-maybe@^1.0.1: 260 | version "1.0.1" 261 | resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" 262 | integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= 263 | 264 | camelcase@^6.0.0: 265 | version "6.3.0" 266 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" 267 | integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== 268 | 269 | chai-as-promised@^7.1.1: 270 | version "7.1.1" 271 | resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" 272 | integrity sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA== 273 | dependencies: 274 | check-error "^1.0.2" 275 | 276 | chai-fs@chaijs/chai-fs: 277 | version "2.0.0" 278 | resolved "https://codeload.github.com/chaijs/chai-fs/tar.gz/e59d5523eed89c6d9f6cee54265e9fc5aad37cb1" 279 | dependencies: 280 | bit-mask "^1.0.1" 281 | readdir-enhanced "^2.0.0" 282 | 283 | chai@^4.2.0: 284 | version "4.2.0" 285 | resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" 286 | integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== 287 | dependencies: 288 | assertion-error "^1.1.0" 289 | check-error "^1.0.2" 290 | deep-eql "^3.0.1" 291 | get-func-name "^2.0.0" 292 | pathval "^1.1.0" 293 | type-detect "^4.0.5" 294 | 295 | chalk@^4.1.0: 296 | version "4.1.2" 297 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 298 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 299 | dependencies: 300 | ansi-styles "^4.1.0" 301 | supports-color "^7.1.0" 302 | 303 | check-error@^1.0.2: 304 | version "1.0.2" 305 | resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" 306 | integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= 307 | 308 | chokidar@^3.5.3: 309 | version "3.6.0" 310 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" 311 | integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== 312 | dependencies: 313 | anymatch "~3.1.2" 314 | braces "~3.0.2" 315 | glob-parent "~5.1.2" 316 | is-binary-path "~2.1.0" 317 | is-glob "~4.0.1" 318 | normalize-path "~3.0.0" 319 | readdirp "~3.6.0" 320 | optionalDependencies: 321 | fsevents "~2.3.2" 322 | 323 | cliui@^7.0.2: 324 | version "7.0.4" 325 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" 326 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 327 | dependencies: 328 | string-width "^4.2.0" 329 | strip-ansi "^6.0.0" 330 | wrap-ansi "^7.0.0" 331 | 332 | cliui@^8.0.1: 333 | version "8.0.1" 334 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" 335 | integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== 336 | dependencies: 337 | string-width "^4.2.0" 338 | strip-ansi "^6.0.1" 339 | wrap-ansi "^7.0.0" 340 | 341 | clone-response@^1.0.2: 342 | version "1.0.2" 343 | resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" 344 | integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= 345 | dependencies: 346 | mimic-response "^1.0.0" 347 | 348 | color-convert@^2.0.1: 349 | version "2.0.1" 350 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 351 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 352 | dependencies: 353 | color-name "~1.1.4" 354 | 355 | color-name@~1.1.4: 356 | version "1.1.4" 357 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 358 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 359 | 360 | core-util-is@~1.0.0: 361 | version "1.0.2" 362 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 363 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 364 | 365 | create-require@^1.1.0: 366 | version "1.1.1" 367 | resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" 368 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== 369 | 370 | debug@^4.1.0, debug@^4.1.1: 371 | version "4.3.1" 372 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" 373 | integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== 374 | dependencies: 375 | ms "2.1.2" 376 | 377 | debug@^4.3.5: 378 | version "4.4.0" 379 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" 380 | integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== 381 | dependencies: 382 | ms "^2.1.3" 383 | 384 | decamelize@^4.0.0: 385 | version "4.0.0" 386 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" 387 | integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== 388 | 389 | decompress-response@^6.0.0: 390 | version "6.0.0" 391 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" 392 | integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== 393 | dependencies: 394 | mimic-response "^3.1.0" 395 | 396 | deep-eql@^3.0.1: 397 | version "3.0.1" 398 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" 399 | integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== 400 | dependencies: 401 | type-detect "^4.0.0" 402 | 403 | defer-to-connect@^2.0.0: 404 | version "2.0.1" 405 | resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" 406 | integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== 407 | 408 | define-properties@^1.1.3: 409 | version "1.1.3" 410 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 411 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 412 | dependencies: 413 | object-keys "^1.0.12" 414 | 415 | detect-node@^2.0.4: 416 | version "2.0.4" 417 | resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" 418 | integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== 419 | 420 | diff@^4.0.1: 421 | version "4.0.2" 422 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 423 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 424 | 425 | diff@^5.2.0: 426 | version "5.2.0" 427 | resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" 428 | integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== 429 | 430 | electron-mocha@^13.0.1: 431 | version "13.0.1" 432 | resolved "https://registry.yarnpkg.com/electron-mocha/-/electron-mocha-13.0.1.tgz#9146fc34ed0869849cd5b876ad5143af8aa94b8a" 433 | integrity sha512-Ik7clwPU9WUYGsEsyryKhS6q+rmecNTqMqSbx3vGel7Lo6haipgscdTMdkaWGkvgVaBJFWsDWIBuFWNvlCL+og== 434 | dependencies: 435 | ansi-colors "^4.1.1" 436 | electron-window "^0.8.0" 437 | mocha "^10.7.0" 438 | which "^4.0.0" 439 | yargs "^17.7.2" 440 | 441 | electron-window@^0.8.0: 442 | version "0.8.1" 443 | resolved "https://registry.yarnpkg.com/electron-window/-/electron-window-0.8.1.tgz#16ca187eb4870b0679274fc8299c5960e6ab2c5e" 444 | integrity sha1-FsoYfrSHCwZ5J0/IKZxZYOarLF4= 445 | dependencies: 446 | is-electron-renderer "^2.0.0" 447 | 448 | electron@33.3.0: 449 | version "33.3.0" 450 | resolved "https://registry.yarnpkg.com/electron/-/electron-33.3.0.tgz#5ae603818820c2a29736ed924d32bf18d31a9f63" 451 | integrity sha512-316ZlFUHJmzGrhRj87tVStxyYvknDqVR9eYSsGKAHY7auhVWFLIcPPGxcnbD/H1mez8CpDjXvEjcz76zpWxsXw== 452 | dependencies: 453 | "@electron/get" "^2.0.0" 454 | "@types/node" "^20.9.0" 455 | extract-zip "^2.0.1" 456 | 457 | emoji-regex@^8.0.0: 458 | version "8.0.0" 459 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 460 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 461 | 462 | end-of-stream@^1.1.0: 463 | version "1.4.4" 464 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 465 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 466 | dependencies: 467 | once "^1.4.0" 468 | 469 | env-paths@^2.2.0: 470 | version "2.2.0" 471 | resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" 472 | integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== 473 | 474 | es6-error@^4.1.1: 475 | version "4.1.1" 476 | resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" 477 | integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== 478 | 479 | escalade@^3.1.1: 480 | version "3.2.0" 481 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" 482 | integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== 483 | 484 | escape-string-regexp@^4.0.0: 485 | version "4.0.0" 486 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 487 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 488 | 489 | extended-emitter@*: 490 | version "1.0.3" 491 | resolved "https://registry.yarnpkg.com/extended-emitter/-/extended-emitter-1.0.3.tgz#ea1014882a9cd29f2e11cc781b1b56fa10d5ab64" 492 | integrity sha512-gdaWWszJmr2oq6rKSxPmuclQtEwfzt4JwmGrEqTnE89GQHqZyvPZ/NWj6fBgK3IKufvRyJDnLZviUFPrrJf36Q== 493 | dependencies: 494 | sift "*" 495 | wolfy87-eventemitter "*" 496 | 497 | extract-zip@^2.0.1: 498 | version "2.0.1" 499 | resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" 500 | integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== 501 | dependencies: 502 | debug "^4.1.1" 503 | get-stream "^5.1.0" 504 | yauzl "^2.10.0" 505 | optionalDependencies: 506 | "@types/yauzl" "^2.9.1" 507 | 508 | fd-slicer@~1.1.0: 509 | version "1.1.0" 510 | resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" 511 | integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= 512 | dependencies: 513 | pend "~1.2.0" 514 | 515 | fill-range@^7.1.1: 516 | version "7.1.1" 517 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" 518 | integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== 519 | dependencies: 520 | to-regex-range "^5.0.1" 521 | 522 | find-up@^5.0.0: 523 | version "5.0.0" 524 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 525 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 526 | dependencies: 527 | locate-path "^6.0.0" 528 | path-exists "^4.0.0" 529 | 530 | flat@^5.0.2: 531 | version "5.0.2" 532 | resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" 533 | integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== 534 | 535 | fs-extra@^8.1.0: 536 | version "8.1.0" 537 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" 538 | integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== 539 | dependencies: 540 | graceful-fs "^4.2.0" 541 | jsonfile "^4.0.0" 542 | universalify "^0.1.0" 543 | 544 | fs.realpath@^1.0.0: 545 | version "1.0.0" 546 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 547 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 548 | 549 | fsevents@~2.3.2: 550 | version "2.3.3" 551 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" 552 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 553 | 554 | get-caller-file@^2.0.5: 555 | version "2.0.5" 556 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 557 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 558 | 559 | get-func-name@^2.0.0: 560 | version "2.0.2" 561 | resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" 562 | integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== 563 | 564 | get-stream@^5.1.0: 565 | version "5.2.0" 566 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" 567 | integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== 568 | dependencies: 569 | pump "^3.0.0" 570 | 571 | glob-parent@~5.1.2: 572 | version "5.1.2" 573 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 574 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 575 | dependencies: 576 | is-glob "^4.0.1" 577 | 578 | glob-to-regexp@^0.4.0: 579 | version "0.4.1" 580 | resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" 581 | integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== 582 | 583 | glob@^8.1.0: 584 | version "8.1.0" 585 | resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" 586 | integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== 587 | dependencies: 588 | fs.realpath "^1.0.0" 589 | inflight "^1.0.4" 590 | inherits "2" 591 | minimatch "^5.0.1" 592 | once "^1.3.0" 593 | 594 | global-agent@^3.0.0: 595 | version "3.0.0" 596 | resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6" 597 | integrity sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q== 598 | dependencies: 599 | boolean "^3.0.1" 600 | es6-error "^4.1.1" 601 | matcher "^3.0.0" 602 | roarr "^2.15.3" 603 | semver "^7.3.2" 604 | serialize-error "^7.0.1" 605 | 606 | globalthis@^1.0.1: 607 | version "1.0.1" 608 | resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.1.tgz#40116f5d9c071f9e8fb0037654df1ab3a83b7ef9" 609 | integrity sha512-mJPRTc/P39NH/iNG4mXa9aIhNymaQikTrnspeCa2ZuJ+mH2QN/rXwtX3XwKrHqWgUQFbNZKtHM105aHzJalElw== 610 | dependencies: 611 | define-properties "^1.1.3" 612 | 613 | got@^11.8.5: 614 | version "11.8.6" 615 | resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" 616 | integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== 617 | dependencies: 618 | "@sindresorhus/is" "^4.0.0" 619 | "@szmarczak/http-timer" "^4.0.5" 620 | "@types/cacheable-request" "^6.0.1" 621 | "@types/responselike" "^1.0.0" 622 | cacheable-lookup "^5.0.3" 623 | cacheable-request "^7.0.2" 624 | decompress-response "^6.0.0" 625 | http2-wrapper "^1.0.0-beta.5.2" 626 | lowercase-keys "^2.0.0" 627 | p-cancelable "^2.0.0" 628 | responselike "^2.0.0" 629 | 630 | graceful-fs@^4.1.6, graceful-fs@^4.2.0: 631 | version "4.2.3" 632 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" 633 | integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== 634 | 635 | has-flag@^4.0.0: 636 | version "4.0.0" 637 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 638 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 639 | 640 | he@^1.2.0: 641 | version "1.2.0" 642 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 643 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 644 | 645 | http-cache-semantics@^4.0.0: 646 | version "4.1.1" 647 | resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" 648 | integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== 649 | 650 | http2-wrapper@^1.0.0-beta.5.2: 651 | version "1.0.3" 652 | resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" 653 | integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== 654 | dependencies: 655 | quick-lru "^5.1.1" 656 | resolve-alpn "^1.0.0" 657 | 658 | immediate@~3.0.5: 659 | version "3.0.6" 660 | resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" 661 | integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= 662 | 663 | inflight@^1.0.4: 664 | version "1.0.6" 665 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 666 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 667 | dependencies: 668 | once "^1.3.0" 669 | wrappy "1" 670 | 671 | inherits@2, inherits@~2.0.3: 672 | version "2.0.4" 673 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 674 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 675 | 676 | is-binary-path@~2.1.0: 677 | version "2.1.0" 678 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 679 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 680 | dependencies: 681 | binary-extensions "^2.0.0" 682 | 683 | is-electron-renderer@^2.0.0: 684 | version "2.0.1" 685 | resolved "https://registry.yarnpkg.com/is-electron-renderer/-/is-electron-renderer-2.0.1.tgz#a469d056f975697c58c98c6023eb0aa79af895a2" 686 | integrity sha1-pGnQVvl1aXxYyYxgI+sKp5r4laI= 687 | 688 | is-extglob@^2.1.1: 689 | version "2.1.1" 690 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 691 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 692 | 693 | is-fullwidth-code-point@^3.0.0: 694 | version "3.0.0" 695 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 696 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 697 | 698 | is-glob@^4.0.1, is-glob@~4.0.1: 699 | version "4.0.1" 700 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 701 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 702 | dependencies: 703 | is-extglob "^2.1.1" 704 | 705 | is-number@^7.0.0: 706 | version "7.0.0" 707 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 708 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 709 | 710 | is-plain-obj@^2.1.0: 711 | version "2.1.0" 712 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" 713 | integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== 714 | 715 | is-unicode-supported@^0.1.0: 716 | version "0.1.0" 717 | resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" 718 | integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== 719 | 720 | isarray@~1.0.0: 721 | version "1.0.0" 722 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 723 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 724 | 725 | isexe@^3.1.1: 726 | version "3.1.1" 727 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" 728 | integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== 729 | 730 | js-yaml@^4.1.0: 731 | version "4.1.0" 732 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 733 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 734 | dependencies: 735 | argparse "^2.0.1" 736 | 737 | json-buffer@3.0.1: 738 | version "3.0.1" 739 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" 740 | integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== 741 | 742 | json-stringify-safe@^5.0.1: 743 | version "5.0.1" 744 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 745 | integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= 746 | 747 | jsonfile@^4.0.0: 748 | version "4.0.0" 749 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 750 | integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= 751 | optionalDependencies: 752 | graceful-fs "^4.1.6" 753 | 754 | jszip@^3.1.0: 755 | version "3.10.1" 756 | resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" 757 | integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== 758 | dependencies: 759 | lie "~3.3.0" 760 | pako "~1.0.2" 761 | readable-stream "~2.3.6" 762 | setimmediate "^1.0.5" 763 | 764 | keyv@^4.0.0: 765 | version "4.5.4" 766 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" 767 | integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== 768 | dependencies: 769 | json-buffer "3.0.1" 770 | 771 | lie@~3.3.0: 772 | version "3.3.0" 773 | resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" 774 | integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== 775 | dependencies: 776 | immediate "~3.0.5" 777 | 778 | locate-path@^6.0.0: 779 | version "6.0.0" 780 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 781 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 782 | dependencies: 783 | p-locate "^5.0.0" 784 | 785 | log-symbols@^4.1.0: 786 | version "4.1.0" 787 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" 788 | integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== 789 | dependencies: 790 | chalk "^4.1.0" 791 | is-unicode-supported "^0.1.0" 792 | 793 | lowercase-keys@^2.0.0: 794 | version "2.0.0" 795 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" 796 | integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== 797 | 798 | make-error@^1.1.1: 799 | version "1.3.6" 800 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 801 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 802 | 803 | matcher@^3.0.0: 804 | version "3.0.0" 805 | resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" 806 | integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== 807 | dependencies: 808 | escape-string-regexp "^4.0.0" 809 | 810 | mimic-response@^1.0.0: 811 | version "1.0.1" 812 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" 813 | integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== 814 | 815 | mimic-response@^3.1.0: 816 | version "3.1.0" 817 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" 818 | integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== 819 | 820 | minimatch@^5.0.1, minimatch@^5.1.6: 821 | version "5.1.6" 822 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" 823 | integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== 824 | dependencies: 825 | brace-expansion "^2.0.1" 826 | 827 | minimist@^1.2.5: 828 | version "1.2.8" 829 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" 830 | integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== 831 | 832 | mkdirp@^0.5.1: 833 | version "0.5.5" 834 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" 835 | integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== 836 | dependencies: 837 | minimist "^1.2.5" 838 | 839 | mocha-testdata@^1.2.0: 840 | version "1.2.0" 841 | resolved "https://registry.yarnpkg.com/mocha-testdata/-/mocha-testdata-1.2.0.tgz#6cc0d41820e9bb66903334524e5ae420de77ecea" 842 | integrity sha1-bMDUGCDpu2aQMzRSTlrkIN537Oo= 843 | 844 | mocha@^10.7.0: 845 | version "10.8.2" 846 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.8.2.tgz#8d8342d016ed411b12a429eb731b825f961afb96" 847 | integrity sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg== 848 | dependencies: 849 | ansi-colors "^4.1.3" 850 | browser-stdout "^1.3.1" 851 | chokidar "^3.5.3" 852 | debug "^4.3.5" 853 | diff "^5.2.0" 854 | escape-string-regexp "^4.0.0" 855 | find-up "^5.0.0" 856 | glob "^8.1.0" 857 | he "^1.2.0" 858 | js-yaml "^4.1.0" 859 | log-symbols "^4.1.0" 860 | minimatch "^5.1.6" 861 | ms "^2.1.3" 862 | serialize-javascript "^6.0.2" 863 | strip-json-comments "^3.1.1" 864 | supports-color "^8.1.1" 865 | workerpool "^6.5.1" 866 | yargs "^16.2.0" 867 | yargs-parser "^20.2.9" 868 | yargs-unparser "^2.0.0" 869 | 870 | ms@2.1.2: 871 | version "2.1.2" 872 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 873 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 874 | 875 | ms@^2.1.3: 876 | version "2.1.3" 877 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 878 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 879 | 880 | normalize-path@^3.0.0, normalize-path@~3.0.0: 881 | version "3.0.0" 882 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 883 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 884 | 885 | normalize-url@^6.0.1: 886 | version "6.1.0" 887 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" 888 | integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== 889 | 890 | object-keys@^1.0.12: 891 | version "1.1.1" 892 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 893 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 894 | 895 | once@^1.3.0, once@^1.3.1, once@^1.4.0: 896 | version "1.4.0" 897 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 898 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 899 | dependencies: 900 | wrappy "1" 901 | 902 | p-cancelable@^2.0.0: 903 | version "2.1.1" 904 | resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" 905 | integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== 906 | 907 | p-limit@^3.0.2: 908 | version "3.1.0" 909 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 910 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 911 | dependencies: 912 | yocto-queue "^0.1.0" 913 | 914 | p-locate@^5.0.0: 915 | version "5.0.0" 916 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 917 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 918 | dependencies: 919 | p-limit "^3.0.2" 920 | 921 | pako@~1.0.2: 922 | version "1.0.11" 923 | resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" 924 | integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== 925 | 926 | path-exists@^4.0.0: 927 | version "4.0.0" 928 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 929 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 930 | 931 | pathval@^1.1.0: 932 | version "1.1.1" 933 | resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" 934 | integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== 935 | 936 | pend@~1.2.0: 937 | version "1.2.0" 938 | resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" 939 | integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= 940 | 941 | picomatch@^2.0.4: 942 | version "2.2.2" 943 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" 944 | integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== 945 | 946 | picomatch@^2.2.1: 947 | version "2.3.1" 948 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 949 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 950 | 951 | prettier@^3.4.2: 952 | version "3.4.2" 953 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" 954 | integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ== 955 | 956 | process-nextick-args@~2.0.0: 957 | version "2.0.1" 958 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 959 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 960 | 961 | progress@^2.0.3: 962 | version "2.0.3" 963 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" 964 | integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== 965 | 966 | pump@^3.0.0: 967 | version "3.0.0" 968 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 969 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 970 | dependencies: 971 | end-of-stream "^1.1.0" 972 | once "^1.3.1" 973 | 974 | quick-lru@^5.1.1: 975 | version "5.1.1" 976 | resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" 977 | integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== 978 | 979 | randombytes@^2.1.0: 980 | version "2.1.0" 981 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 982 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 983 | dependencies: 984 | safe-buffer "^5.1.0" 985 | 986 | readable-stream@~2.3.6: 987 | version "2.3.7" 988 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" 989 | integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== 990 | dependencies: 991 | core-util-is "~1.0.0" 992 | inherits "~2.0.3" 993 | isarray "~1.0.0" 994 | process-nextick-args "~2.0.0" 995 | safe-buffer "~5.1.1" 996 | string_decoder "~1.1.1" 997 | util-deprecate "~1.0.1" 998 | 999 | readdir-enhanced@^2.0.0: 1000 | version "2.2.4" 1001 | resolved "https://registry.yarnpkg.com/readdir-enhanced/-/readdir-enhanced-2.2.4.tgz#773fb8a8de5f645fb13d9403746d490d4facb3e6" 1002 | integrity sha512-JQD83C9gAs5B5j2j40qLn/K83HhR8po3bUonebNeuJQUZbbn7q1HxL9kQuPBtxoXkaUpbtEmpFBw5kzyYnnJDA== 1003 | dependencies: 1004 | call-me-maybe "^1.0.1" 1005 | glob-to-regexp "^0.4.0" 1006 | 1007 | readdirp@~3.6.0: 1008 | version "3.6.0" 1009 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 1010 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 1011 | dependencies: 1012 | picomatch "^2.2.1" 1013 | 1014 | require-directory@^2.1.1: 1015 | version "2.1.1" 1016 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1017 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1018 | 1019 | resolve-alpn@^1.0.0: 1020 | version "1.2.1" 1021 | resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" 1022 | integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== 1023 | 1024 | responselike@^2.0.0: 1025 | version "2.0.1" 1026 | resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" 1027 | integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== 1028 | dependencies: 1029 | lowercase-keys "^2.0.0" 1030 | 1031 | roarr@^2.15.3: 1032 | version "2.15.4" 1033 | resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd" 1034 | integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A== 1035 | dependencies: 1036 | boolean "^3.0.1" 1037 | detect-node "^2.0.4" 1038 | globalthis "^1.0.1" 1039 | json-stringify-safe "^5.0.1" 1040 | semver-compare "^1.0.0" 1041 | sprintf-js "^1.1.2" 1042 | 1043 | safe-buffer@^5.1.0: 1044 | version "5.2.0" 1045 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" 1046 | integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== 1047 | 1048 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1049 | version "5.1.2" 1050 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1051 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1052 | 1053 | semver-compare@^1.0.0: 1054 | version "1.0.0" 1055 | resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" 1056 | integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= 1057 | 1058 | semver@^6.2.0: 1059 | version "6.3.1" 1060 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" 1061 | integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== 1062 | 1063 | semver@^7.3.2: 1064 | version "7.6.3" 1065 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" 1066 | integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== 1067 | 1068 | serialize-error@^7.0.1: 1069 | version "7.0.1" 1070 | resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" 1071 | integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== 1072 | dependencies: 1073 | type-fest "^0.13.1" 1074 | 1075 | serialize-javascript@^6.0.2: 1076 | version "6.0.2" 1077 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" 1078 | integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== 1079 | dependencies: 1080 | randombytes "^2.1.0" 1081 | 1082 | setimmediate@^1.0.5: 1083 | version "1.0.5" 1084 | resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" 1085 | integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== 1086 | 1087 | sift@*: 1088 | version "12.0.0" 1089 | resolved "https://registry.yarnpkg.com/sift/-/sift-12.0.0.tgz#744d46c52e60430eb80da227f8f983b946faeedb" 1090 | integrity sha512-aWQoexMzacDdUrUuPWLrvfHiYCW7QyMYZ6D7ipkuas7gdvn0GoUVzU/fyvPpgPjS49IRvZktCQWYxgWOwACk/A== 1091 | 1092 | source-map-support@^0.5.17: 1093 | version "0.5.19" 1094 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" 1095 | integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== 1096 | dependencies: 1097 | buffer-from "^1.0.0" 1098 | source-map "^0.6.0" 1099 | 1100 | source-map@^0.6.0: 1101 | version "0.6.1" 1102 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1103 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1104 | 1105 | spec-xunit-file@0.0.1-3: 1106 | version "0.0.1-3" 1107 | resolved "https://registry.yarnpkg.com/spec-xunit-file/-/spec-xunit-file-0.0.1-3.tgz#855a66ab8c382eb3165df928a81d0749029d2386" 1108 | integrity sha1-hVpmq4w4LrMWXfkoqB0HSQKdI4Y= 1109 | 1110 | sprintf-js@^1.1.2: 1111 | version "1.1.2" 1112 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" 1113 | integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== 1114 | 1115 | string-width@^4.1.0, string-width@^4.2.0: 1116 | version "4.2.0" 1117 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" 1118 | integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== 1119 | dependencies: 1120 | emoji-regex "^8.0.0" 1121 | is-fullwidth-code-point "^3.0.0" 1122 | strip-ansi "^6.0.0" 1123 | 1124 | string-width@^4.2.3: 1125 | version "4.2.3" 1126 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 1127 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1128 | dependencies: 1129 | emoji-regex "^8.0.0" 1130 | is-fullwidth-code-point "^3.0.0" 1131 | strip-ansi "^6.0.1" 1132 | 1133 | string_decoder@~1.1.1: 1134 | version "1.1.1" 1135 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1136 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1137 | dependencies: 1138 | safe-buffer "~5.1.0" 1139 | 1140 | strip-ansi@^6.0.0: 1141 | version "6.0.0" 1142 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 1143 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 1144 | dependencies: 1145 | ansi-regex "^5.0.0" 1146 | 1147 | strip-ansi@^6.0.1: 1148 | version "6.0.1" 1149 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1150 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1151 | dependencies: 1152 | ansi-regex "^5.0.1" 1153 | 1154 | strip-json-comments@^3.1.1: 1155 | version "3.1.1" 1156 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1157 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1158 | 1159 | sumchecker@^3.0.1: 1160 | version "3.0.1" 1161 | resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42" 1162 | integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg== 1163 | dependencies: 1164 | debug "^4.1.0" 1165 | 1166 | supports-color@^7.1.0: 1167 | version "7.2.0" 1168 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1169 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1170 | dependencies: 1171 | has-flag "^4.0.0" 1172 | 1173 | supports-color@^8.1.1: 1174 | version "8.1.1" 1175 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 1176 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 1177 | dependencies: 1178 | has-flag "^4.0.0" 1179 | 1180 | to-regex-range@^5.0.1: 1181 | version "5.0.1" 1182 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1183 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1184 | dependencies: 1185 | is-number "^7.0.0" 1186 | 1187 | ts-node@^9.1.1: 1188 | version "9.1.1" 1189 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" 1190 | integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== 1191 | dependencies: 1192 | arg "^4.1.0" 1193 | create-require "^1.1.0" 1194 | diff "^4.0.1" 1195 | make-error "^1.1.1" 1196 | source-map-support "^0.5.17" 1197 | yn "3.1.1" 1198 | 1199 | type-detect@^4.0.0, type-detect@^4.0.5: 1200 | version "4.0.8" 1201 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" 1202 | integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== 1203 | 1204 | type-fest@^0.13.1: 1205 | version "0.13.1" 1206 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" 1207 | integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== 1208 | 1209 | typescript@^5.7.2: 1210 | version "5.7.2" 1211 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" 1212 | integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== 1213 | 1214 | undici-types@~5.26.4: 1215 | version "5.26.5" 1216 | resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" 1217 | integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== 1218 | 1219 | undici-types@~6.19.2: 1220 | version "6.19.8" 1221 | resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" 1222 | integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== 1223 | 1224 | universalify@^0.1.0: 1225 | version "0.1.2" 1226 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 1227 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 1228 | 1229 | unzip-crx-3@^0.2.0: 1230 | version "0.2.0" 1231 | resolved "https://registry.yarnpkg.com/unzip-crx-3/-/unzip-crx-3-0.2.0.tgz#d5324147b104a8aed9ae8639c95521f6f7cda292" 1232 | integrity sha512-0+JiUq/z7faJ6oifVB5nSwt589v1KCduqIJupNVDoWSXZtWDmjDGO3RAEOvwJ07w90aoXoP4enKsR7ecMrJtWQ== 1233 | dependencies: 1234 | jszip "^3.1.0" 1235 | mkdirp "^0.5.1" 1236 | yaku "^0.16.6" 1237 | 1238 | util-deprecate@~1.0.1: 1239 | version "1.0.2" 1240 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1241 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 1242 | 1243 | which@^4.0.0: 1244 | version "4.0.0" 1245 | resolved "https://registry.yarnpkg.com/which/-/which-4.0.0.tgz#cd60b5e74503a3fbcfbf6cd6b4138a8bae644c1a" 1246 | integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== 1247 | dependencies: 1248 | isexe "^3.1.1" 1249 | 1250 | wolfy87-eventemitter@*: 1251 | version "5.2.9" 1252 | resolved "https://registry.yarnpkg.com/wolfy87-eventemitter/-/wolfy87-eventemitter-5.2.9.tgz#e879f770b30fbb6512a8afbb330c388591099c2a" 1253 | integrity sha512-P+6vtWyuDw+MB01X7UeF8TaHBvbCovf4HPEMF/SV7BdDc1SMTiBy13SRD71lQh4ExFTG1d/WNzDGDCyOKSMblw== 1254 | 1255 | workerpool@^6.5.1: 1256 | version "6.5.1" 1257 | resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" 1258 | integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== 1259 | 1260 | wrap-ansi@^7.0.0: 1261 | version "7.0.0" 1262 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 1263 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 1264 | dependencies: 1265 | ansi-styles "^4.0.0" 1266 | string-width "^4.1.0" 1267 | strip-ansi "^6.0.0" 1268 | 1269 | wrappy@1: 1270 | version "1.0.2" 1271 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1272 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1273 | 1274 | y18n@^5.0.5: 1275 | version "5.0.8" 1276 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 1277 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 1278 | 1279 | yaku@^0.16.6: 1280 | version "0.16.7" 1281 | resolved "https://registry.yarnpkg.com/yaku/-/yaku-0.16.7.tgz#1d195c78aa9b5bf8479c895b9504fd4f0847984e" 1282 | integrity sha1-HRlceKqbW/hHnIlblQT9TwhHmE4= 1283 | 1284 | yargs-parser@^20.2.2, yargs-parser@^20.2.9: 1285 | version "20.2.9" 1286 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" 1287 | integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== 1288 | 1289 | yargs-parser@^21.1.1: 1290 | version "21.1.1" 1291 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" 1292 | integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== 1293 | 1294 | yargs-unparser@^2.0.0: 1295 | version "2.0.0" 1296 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" 1297 | integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== 1298 | dependencies: 1299 | camelcase "^6.0.0" 1300 | decamelize "^4.0.0" 1301 | flat "^5.0.2" 1302 | is-plain-obj "^2.1.0" 1303 | 1304 | yargs@^16.2.0: 1305 | version "16.2.0" 1306 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" 1307 | integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== 1308 | dependencies: 1309 | cliui "^7.0.2" 1310 | escalade "^3.1.1" 1311 | get-caller-file "^2.0.5" 1312 | require-directory "^2.1.1" 1313 | string-width "^4.2.0" 1314 | y18n "^5.0.5" 1315 | yargs-parser "^20.2.2" 1316 | 1317 | yargs@^17.7.2: 1318 | version "17.7.2" 1319 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" 1320 | integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== 1321 | dependencies: 1322 | cliui "^8.0.1" 1323 | escalade "^3.1.1" 1324 | get-caller-file "^2.0.5" 1325 | require-directory "^2.1.1" 1326 | string-width "^4.2.3" 1327 | y18n "^5.0.5" 1328 | yargs-parser "^21.1.1" 1329 | 1330 | yauzl@^2.10.0: 1331 | version "2.10.0" 1332 | resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" 1333 | integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= 1334 | dependencies: 1335 | buffer-crc32 "~0.2.3" 1336 | fd-slicer "~1.1.0" 1337 | 1338 | yn@3.1.1: 1339 | version "3.1.1" 1340 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 1341 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 1342 | 1343 | yocto-queue@^0.1.0: 1344 | version "0.1.0" 1345 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 1346 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 1347 | --------------------------------------------------------------------------------