diff --git a/packages/utils/README.md b/packages/utils/README.md index 76ce251..6f93e03 100644 --- a/packages/utils/README.md +++ b/packages/utils/README.md @@ -32,28 +32,6 @@ npm i @electron-toolkit/utils - Type: boolean, `true` when `process.platform` is `linux` -### devTools - -- install - - - Type: (extensionId: ChromeExtension, options?: ChromeExtensionOptions): Promise - - - Kind: async, sequential - - Example: - - ```javascript - // main.js - import { app } from 'electron' - import { devTools } from '@electron-toolkit/utils' - - app.whenReady().then(() => { - devTools.install('REACT_DEVELOPER_TOOLS', { allowFileAccess: true }) - }) - ``` - - Note: `extensionId` see [ChromeExtension](./src/devTools.ts) - ### electronApp - setAppUserModelId diff --git a/packages/utils/package.json b/packages/utils/package.json index 7e353ab..4876382 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -28,8 +28,5 @@ }, "peerDependencies": { "electron": ">=13.0.0" - }, - "dependencies": { - "jszip": "^3.7.1" } } diff --git a/packages/utils/src/devTools.ts b/packages/utils/src/devTools.ts deleted file mode 100644 index a7db40b..0000000 --- a/packages/utils/src/devTools.ts +++ /dev/null @@ -1,139 +0,0 @@ -import path from 'path' -import fs from 'fs' -import { app, session } from 'electron' -import https from 'https' - -import { unzipCrx } from './utils/unzipCrx' -import { is } from './is' - -const getCachePath = (): string => { - return path.resolve(app.getPath('userData'), 'CachedExtensions') -} - -const mkdir = (path: string): void => { - if (!fs.existsSync(path)) { - fs.mkdirSync(path, { recursive: true }) - } -} - -const rmdir = (dir: string): void => { - const names = fs.readdirSync(dir) || [] - names.forEach(name => { - const _path = path.join(dir, name) - const i = fs.statSync(_path) - if (i.isDirectory()) { - rmdir(_path) - } else { - try { - fs.unlinkSync(_path) - } catch (e) { - console.log() - } - } - }) - try { - fs.rmdirSync(dir) - } catch (e) { - console.log() - } -} - -const dl = (url: string, savePath: string): Promise => { - return new Promise((resolve, reject) => { - const failed = (err: Error | string): void => reject(err) - const request = https.get(url) - request.on('response', res => { - if (res.statusCode === 200) { - res.pipe(fs.createWriteStream(savePath)).on('close', resolve) - res.on('error', failed) - } else if (res.statusCode === 302 && res.headers.location) { - dl(res.headers.location, savePath).then(resolve).catch(failed) - } else { - failed(`Error: download extension response with ${res.statusCode}`) - } - }) - request.on('error', failed) - request.end() - }) -} - -const downloadChromeExtension = (extensionId: string): Promise => { - return new Promise((resolve, reject) => { - const cachePath = getCachePath() - - mkdir(cachePath) - - const extensionDir = path.resolve(cachePath, extensionId) - if (fs.existsSync(extensionDir)) rmdir(extensionDir) - - const url = `https://clients2.google.com/service/update2/crx?response=redirect&acceptformat=crx2,crx3&x=id%3D${extensionId}%26uc&prodversion=32` // eslint-disable-line - const savePath = path.resolve(cachePath, `${extensionId}.crx`) - - dl(url, savePath) - .then(() => unzipCrx(savePath, extensionDir)) - .then(() => resolve(extensionDir)) - .catch(e => { - if (fs.existsSync(extensionDir)) rmdir(extensionDir) - console.error('Install extension failed.\n', e) - reject() - }) - }) -} - -const chromeExtensions = { - ANGULARJS_BATARANG: 'ighdmehidhipcmcojjgiloacoafjmpfk', - REACT_DEVELOPER_TOOLS: 'fmkadmapgofadopljbjfkapdkoienihi', - REDUX_DEVTOOLS: 'lmhkpmbekcpmknklioeibfkpmmfibljd', - VUEJS3_DEVTOOLS: 'ljjemllljcmogpfapbkkighbhhppjdbg', - VUEJS_DEVTOOLS: 'nhdogjmejiglipccpnnnanhbledajbpd' -} - -export type ChromeExtension = - | 'ANGULARJS_BATARANG' - | 'REACT_DEVELOPER_TOOLS' - | 'REDUX_DEVTOOLS' - | 'VUEJS3_DEVTOOLS' - | 'VUEJS_DEVTOOLS' - -export interface ChromeExtensionOptions { - forceDownload?: boolean - allowFileAccess?: boolean -} - -export interface DevTools { - install: (extensionId: ChromeExtension, options?: ChromeExtensionOptions) => Promise -} - -export const devTools: DevTools = { - install: async (extensionId: ChromeExtension, options?: ChromeExtensionOptions): Promise => { - if (!is.dev || !app.isReady() || process.type !== 'browser') return - - const chromeExtensionId = chromeExtensions[extensionId] - if (!chromeExtensionId) { - console.error('Invalid extension') - return - } - - if (session.defaultSession.getExtension(chromeExtensionId)) { - console.warn('Extension installed') - return - } - - const cacheDir = getCachePath() - let extensionDir = path.resolve(cacheDir, chromeExtensionId) - - if (!fs.existsSync(extensionDir) || options?.forceDownload) { - try { - extensionDir = await downloadChromeExtension(chromeExtensionId) - } catch { - extensionDir = '' - } - } - - const loadExtensionOptions = { - allowFileAccess: options?.allowFileAccess || false - } - - if (extensionDir) session.defaultSession.loadExtension(extensionDir, loadExtensionOptions) - } -} diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index 2237b3b..80c2578 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -1,6 +1,5 @@ export * from './is' export * from './platform' -export * from './devTools' export * from './app' export * from './ipcHelper' export * from './optimizer' diff --git a/packages/utils/src/utils/unzipCrx.ts b/packages/utils/src/utils/unzipCrx.ts deleted file mode 100644 index 1c7de25..0000000 --- a/packages/utils/src/utils/unzipCrx.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { promises as fs } from 'fs' -import path from 'path' - -// see https://github.com/Rob--W/crxviewer/blob/master/src/lib/crx-to-zip.js -const crxToZip = (arraybuffer: ArrayBuffer): ArrayBuffer => { - const calcLength = (a: number, b: number, c: number, d: number): number => { - let length = 0 - - length += a << 0 - length += b << 8 - length += c << 16 - length += (d << 24) >>> 0 - return length - } - - // Definition of crx format: http://developer.chrome.com/extensions/crx.html - const view = new Uint8Array(arraybuffer) - - // 50 4b 03 04 - if (view[0] === 80 && view[1] === 75 && view[2] === 3 && view[3] === 4) { - console.warn('Input is not a CRX file, but a ZIP file.') - const buffer = Buffer.from(arraybuffer) - - return Uint8Array.from(buffer).buffer - } - - // 43 72 32 34 - if (view[0] !== 67 || view[1] !== 114 || view[2] !== 50 || view[3] !== 52) { - throw new Error('Invalid header: Does not start with PK\\x03\\x04 or Cr24\n\n') - } - - // 02 00 00 00 - // 03 00 00 00 CRX3 - if ((view[4] !== 2 && view[4] !== 3) || view[5] || view[6] || view[7]) { - throw new Error('Unexpected crx format version number.') - } - - let zipStartOffset - - if (view[4] === 2) { - const publicKeyLength = calcLength(view[8], view[9], view[10], view[11]) - const signatureLength = calcLength(view[12], view[13], view[14], view[15]) - - // 16 = Magic number (4), CRX format version (4), lengths (2x4) - zipStartOffset = 16 + publicKeyLength + signatureLength - } else { - // view[4] === 3 - // CRX3 - https://cs.chromium.org/chromium/src/components/crx_file/crx3.proto - const crx3HeaderLength = calcLength(view[8], view[9], view[10], view[11]) - - // 12 = Magic number (4), CRX format version (4), header length (4) - zipStartOffset = 12 + crx3HeaderLength - } - - // Create a new view for the existing buffer, and wrap it in a Blob object. - const buffer = Buffer.from(new Uint8Array(arraybuffer, zipStartOffset)) - - return Uint8Array.from(buffer).buffer -} - -export const unzipCrx = (crxFilePath: string, destination: string): Promise<(true | void)[]> => { - const filePath = path.resolve(crxFilePath) - const extname = path.extname(crxFilePath) - const basename = path.basename(crxFilePath, extname) - const dirname = path.dirname(crxFilePath) - - destination = destination || path.resolve(dirname, basename) - const jszip = require('jszip') - return fs - .readFile(filePath) - .then(buf => jszip.loadAsync(crxToZip(buf))) - .then(zip => { - const zipFileKeys = Object.keys(zip.files) - - return Promise.all( - zipFileKeys.map(async filename => { - const isFile = !zip.files[filename].dir - const fullPath = path.join(destination, filename) - const directory = (isFile && path.dirname(fullPath)) || fullPath - const content = zip.files[filename].async('nodebuffer') - await fs.mkdir(directory, { recursive: true }) - - if (isFile) { - const data = await content - if (data) { - return fs.writeFile(fullPath, data) - } else { - return true - } - } - }) - ) - }) -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0c9e727..d44428a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: 5.3 +lockfileVersion: 5.4 importers: @@ -27,15 +27,15 @@ importers: devDependencies: '@microsoft/api-extractor': 7.19.4 '@rollup/plugin-node-resolve': 13.1.3_rollup@2.64.0 - '@rollup/plugin-typescript': 8.3.0_a3d339f058ae578f262973abedaa320c + '@rollup/plugin-typescript': 8.3.0_upjtt4cyvzly6jrjoov63krsbq '@types/node': 16.11.19 - '@typescript-eslint/eslint-plugin': 5.10.0_3b6b276e93ead7cf6063f183a5e18d1f - '@typescript-eslint/parser': 5.10.0_eslint@8.7.0+typescript@4.5.4 + '@typescript-eslint/eslint-plugin': 5.10.0_hnvso3ut5ll46ydd6gb2lymnd4 + '@typescript-eslint/parser': 5.10.0_4tfpy7rlxgvxaee6aikeliznyq electron: 16.0.6 eslint: 8.7.0 eslint-config-prettier: 8.3.0_eslint@8.7.0 eslint-define-config: 1.2.2 - eslint-plugin-prettier: 4.0.0_4660519532e4c3b0a9e5bb6623cfedf6 + eslint-plugin-prettier: 4.0.0_izqfdfjs4tb3bkpfxntcht7n6y fs-extra: 10.0.0 lint-staged: 12.1.7 picocolors: 1.0.0 @@ -63,10 +63,7 @@ importers: specifiers: {} packages/utils: - specifiers: - jszip: ^3.7.1 - dependencies: - jszip: 3.7.1 + specifiers: {} packages: @@ -195,7 +192,7 @@ packages: rollup: 2.64.0 dev: true - /@rollup/plugin-typescript/8.3.0_a3d339f058ae578f262973abedaa320c: + /@rollup/plugin-typescript/8.3.0_upjtt4cyvzly6jrjoov63krsbq: resolution: {integrity: sha512-I5FpSvLbtAdwJ+naznv+B4sjXZUcIvLLceYpITAn7wAP8W0wqc5noLdGIp9HGVntNhRWXctwPYrSSFQxtl0FPA==} engines: {node: '>=8.0.0'} peerDependencies: @@ -276,6 +273,12 @@ packages: resolution: {integrity: sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==} dev: true + /@types/keyv/3.1.4: + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + dependencies: + '@types/node': 16.11.19 + dev: true + /@types/node/12.20.24: resolution: {integrity: sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==} dev: true @@ -294,7 +297,13 @@ packages: '@types/node': 16.11.19 dev: true - /@typescript-eslint/eslint-plugin/5.10.0_3b6b276e93ead7cf6063f183a5e18d1f: + /@types/responselike/1.0.0: + resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} + dependencies: + '@types/node': 16.11.19 + dev: true + + /@typescript-eslint/eslint-plugin/5.10.0_hnvso3ut5ll46ydd6gb2lymnd4: resolution: {integrity: sha512-XXVKnMsq2fuu9K2KsIxPUGqb6xAImz8MEChClbXmE3VbveFtBUU5bzM6IPVWqzyADIgdkS2Ws/6Xo7W2TeZWjQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -305,10 +314,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.10.0_eslint@8.7.0+typescript@4.5.4 + '@typescript-eslint/parser': 5.10.0_4tfpy7rlxgvxaee6aikeliznyq '@typescript-eslint/scope-manager': 5.10.0 - '@typescript-eslint/type-utils': 5.10.0_eslint@8.7.0+typescript@4.5.4 - '@typescript-eslint/utils': 5.10.0_eslint@8.7.0+typescript@4.5.4 + '@typescript-eslint/type-utils': 5.10.0_4tfpy7rlxgvxaee6aikeliznyq + '@typescript-eslint/utils': 5.10.0_4tfpy7rlxgvxaee6aikeliznyq debug: 4.3.3 eslint: 8.7.0 functional-red-black-tree: 1.0.1 @@ -321,7 +330,7 @@ packages: - supports-color dev: true - /@typescript-eslint/parser/5.10.0_eslint@8.7.0+typescript@4.5.4: + /@typescript-eslint/parser/5.10.0_4tfpy7rlxgvxaee6aikeliznyq: resolution: {integrity: sha512-pJB2CCeHWtwOAeIxv8CHVGJhI5FNyJAIpx5Pt72YkK3QfEzt6qAlXZuyaBmyfOdM62qU0rbxJzNToPTVeJGrQw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -349,7 +358,7 @@ packages: '@typescript-eslint/visitor-keys': 5.10.0 dev: true - /@typescript-eslint/type-utils/5.10.0_eslint@8.7.0+typescript@4.5.4: + /@typescript-eslint/type-utils/5.10.0_4tfpy7rlxgvxaee6aikeliznyq: resolution: {integrity: sha512-TzlyTmufJO5V886N+hTJBGIfnjQDQ32rJYxPaeiyWKdjsv2Ld5l8cbS7pxim4DeNs62fKzRSt8Q14Evs4JnZyQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -359,7 +368,7 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/utils': 5.10.0_eslint@8.7.0+typescript@4.5.4 + '@typescript-eslint/utils': 5.10.0_4tfpy7rlxgvxaee6aikeliznyq debug: 4.3.3 eslint: 8.7.0 tsutils: 3.21.0_typescript@4.5.4 @@ -394,7 +403,7 @@ packages: - supports-color dev: true - /@typescript-eslint/utils/5.10.0_eslint@8.7.0+typescript@4.5.4: + /@typescript-eslint/utils/5.10.0_4tfpy7rlxgvxaee6aikeliznyq: resolution: {integrity: sha512-IGYwlt1CVcFoE2ueW4/ioEwybR60RAdGeiJX/iDAw0t5w0wK3S7QncDwpmsM70nKgGTuVchEWB8lwZwHqPAWRg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -651,6 +660,7 @@ packages: /core-util-is/1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true /cross-spawn/7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} @@ -663,6 +673,11 @@ packages: /debug/2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true dependencies: ms: 2.0.0 dev: true @@ -809,7 +824,7 @@ packages: engines: {node: '>= 16.9.0', npm: '>= 7.0.0', pnpm: '>= 6.17.0'} dev: true - /eslint-plugin-prettier/4.0.0_4660519532e4c3b0a9e5bb6623cfedf6: + /eslint-plugin-prettier/4.0.0_izqfdfjs4tb3bkpfxntcht7n6y: resolution: {integrity: sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==} engines: {node: '>=6.0.0'} peerDependencies: @@ -971,6 +986,8 @@ packages: debug: 2.6.9 mkdirp: 0.5.5 yauzl: 2.10.0 + transitivePeerDependencies: + - supports-color dev: true /fast-deep-equal/3.1.3: @@ -1188,6 +1205,8 @@ packages: dependencies: '@sindresorhus/is': 0.14.0 '@szmarczak/http-timer': 1.1.2 + '@types/keyv': 3.1.4 + '@types/responselike': 1.0.0 cacheable-request: 6.1.0 decompress-response: 3.3.0 duplexer3: 0.1.4 @@ -1234,10 +1253,6 @@ packages: engines: {node: '>= 4'} dev: true - /immediate/3.0.6: - resolution: {integrity: sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=} - dev: false - /import-fresh/3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -1270,6 +1285,7 @@ packages: /inherits/2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true /ini/1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} @@ -1320,6 +1336,7 @@ packages: /isarray/1.0.0: resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=} + dev: true /isexe/2.0.0: resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} @@ -1367,15 +1384,6 @@ packages: graceful-fs: 4.2.9 dev: true - /jszip/3.7.1: - resolution: {integrity: sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==} - dependencies: - lie: 3.3.0 - pako: 1.0.11 - readable-stream: 2.3.7 - set-immediate-shim: 1.0.1 - dev: false - /keyv/3.1.0: resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} dependencies: @@ -1390,12 +1398,6 @@ packages: type-check: 0.4.0 dev: true - /lie/3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - dependencies: - immediate: 3.0.6 - dev: false - /lilconfig/2.0.4: resolution: {integrity: sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==} engines: {node: '>=10'} @@ -1622,10 +1624,6 @@ packages: aggregate-error: 3.1.0 dev: true - /pako/1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - dev: false - /parent-module/1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -1696,6 +1694,7 @@ packages: /process-nextick-args/2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true /progress/2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} @@ -1733,6 +1732,7 @@ packages: safe-buffer: 5.1.2 string_decoder: 1.1.1 util-deprecate: 1.0.2 + dev: true /regexpp/3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} @@ -1831,6 +1831,7 @@ packages: /safe-buffer/5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true /semver-compare/1.0.0: resolution: {integrity: sha1-De4hahyUGrN+nvsXiPavxf9VN/w=} @@ -1858,11 +1859,6 @@ packages: dev: true optional: true - /set-immediate-shim/1.0.1: - resolution: {integrity: sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=} - engines: {node: '>=0.10.0'} - dev: false - /shebang-command/2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1957,6 +1953,7 @@ packages: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: safe-buffer: 5.1.2 + dev: true /strip-ansi/6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} @@ -2114,6 +2111,7 @@ packages: /util-deprecate/1.0.2: resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} + dev: true /v8-compile-cache/2.3.0: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==}