diff --git a/.github/workflows/pipeline.yml b/.github/workflows/pipeline.yml index 8d27cfb8..31016bb2 100644 --- a/.github/workflows/pipeline.yml +++ b/.github/workflows/pipeline.yml @@ -23,6 +23,7 @@ jobs: env: APP_REPO_FOLDER: ../ RELEASE_FOLDER: ../release + ELECTRON_VERSION: '13.6.9' - name: Sign data run: yarn sign_data env: @@ -55,6 +56,7 @@ jobs: env: APP_REPO_FOLDER: ../ RELEASE_FOLDER: ../release + ELECTRON_VERSION: '13.6.9' - name: Archive build artifacts uses: actions/upload-artifact@v2 with: @@ -62,17 +64,18 @@ jobs: path: ./release/*.deb windows: - runs-on: windows-latest + runs-on: windows-2019 strategy: matrix: platform: [x86, x64] steps: - name: Checkout uses: actions/checkout@v2 + - uses: actions/setup-node@v3 + with: + node-version: '14.x' - name: Setup msbuild - uses: microsoft/setup-msbuild@v1 - - name: Setup NuGet.exe for use with actions - uses: nuget/setup-nuget@v1.0.5 + uses: microsoft/setup-msbuild@v1.1 - name: Prepare app repository uses: ./.github/actions/prepare-app-repo - name: Prepare fortify-setup repository @@ -85,6 +88,7 @@ jobs: Platform: ${{ matrix.platform }} APP_REPO_FOLDER: ../ RELEASE_FOLDER: ../release + ELECTRON_VERSION: '13.6.9' - name: Archive build artifacts uses: actions/upload-artifact@v2 with: diff --git a/.yarnrc b/.yarnrc index 3b7b9ef1..afe82262 100644 --- a/.yarnrc +++ b/.yarnrc @@ -1,4 +1,4 @@ runtime "electron" -target "11.5.0" +target "13.6.9" target_arch "x64" disturl "https://atom.io/download/atom-shell" diff --git a/CHANGELOG.md b/CHANGELOG.md index 422c817b..23aaf5e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,18 @@ +## [1.8.4](https://github.com/PeculiarVentures/fortify/releases/tag/1.8.4) (5.04.2022) + +### Features +- Update `electron` dependency to `13.6.9`. +- Update `minimist ` dependency to `1.2.6`. +- Update `@webcrypto-local/* ` dependency to `1.6.11`. +- Use `nanoid` instead of `uuid`. + +### Bug Fixes + +- Fix ERR_CERT_AUTHORITY_INVALID exception on Mac ([#475](https://github.com/PeculiarVentures/fortify/issues/475)). +- Fix Firefox in Ubuntu can't communicate with Fortify ([#461](https://github.com/PeculiarVentures/fortify/issues/461)). +- Fix Unable to open fortify tools in Chrome ([#409](https://github.com/PeculiarVentures/fortify/issues/409)). +- Fix App doesn't install CA certificate to Firefox ([#327](https://github.com/PeculiarVentures/fortify/issues/327)). + ## [1.8.3](https://github.com/PeculiarVentures/fortify/releases/tag/1.8.3) (27.10.2021) ### Features diff --git a/package.json b/package.json index 9b92eec8..89199ca3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "fortify", "productName": "Fortify", - "version": "1.8.3", + "version": "1.8.4", "description": "Fortify enables web applications to use smart cards, local certificate stores and do certificate enrollment", "main": "out/main.js", "scripts": { @@ -36,7 +36,6 @@ "@types/request": "^2.48.5", "@types/rimraf": "^2.0.4", "@types/semver": "^6.2.1", - "@types/uuid": "^8.3.0", "@types/websocket": "^0.0.40", "@types/ws": "^7.2.6", "@types/xmldom": "^0.1.30", @@ -44,7 +43,7 @@ "colors": "^1.4.0", "cross-env": "^7.0.2", "css-loader": "^5.2.6", - "electron": "^11.5.0", + "electron": "^13.6.9", "eslint": "^6.8.0", "eslint-config-airbnb-typescript": "^7.2.1", "eslint-plugin-import": "^2.22.0", @@ -83,6 +82,7 @@ "jose-jwe-jws": "github:microshine/js-jose", "lib-react-components": "^3.0.1", "mixpanel": "^0.13.0", + "nanoid": "^3.3.2", "pkcs11js": "^1.2.6", "pkijs": "^2.2.1", "public-ip": "^4.0.3", @@ -92,9 +92,7 @@ "reflect-metadata": "^0.1.13", "request": "^2.88.2", "semver": "^6.3.0", - "sudo-prompt": "^9.2.1", "tsyringe": "^4.3.0", - "uuid": "^8.3.1", "webcrypto-core": "^1.3.0", "winston": "^3.3.3", "winston-transport": "^4.4.0" diff --git a/src/main/config.ts b/src/main/config.ts index 9ccf575a..229d41d8 100644 --- a/src/main/config.ts +++ b/src/main/config.ts @@ -1,10 +1,10 @@ import * as fs from 'fs'; import * as path from 'path'; -import { v4 as uuidv4 } from 'uuid'; +import { nanoid } from 'nanoid'; import { APP_CONFIG_FILE } from './constants'; const defaultConfig: IConfigure = { - userId: uuidv4(), + userId: nanoid(36), providers: [], cards: [], disableCardUpdate: false, diff --git a/src/main/services/ssl/firefox.ts b/src/main/services/ssl/firefox.ts index 127382a0..7b5772a5 100644 --- a/src/main/services/ssl/firefox.ts +++ b/src/main/services/ssl/firefox.ts @@ -27,10 +27,8 @@ export class Firefox { const profiles = fs.readdirSync(profilesFolder); // eslint-disable-next-line no-restricted-syntax for (const profile of profiles) { - if (/default/.test(profile)) { - const profileFolder = path.normalize(path.join(profilesFolder, profile)); - res.push(profileFolder); - } + const profileFolder = path.normalize(path.join(profilesFolder, profile)); + res.push(profileFolder); } } else { logger.info('firefox', 'Profiles folder does not exist', { path: profilesFolder }); diff --git a/src/main/services/ssl/installer.ts b/src/main/services/ssl/installer.ts index c0d8bafb..57d5eb1e 100644 --- a/src/main/services/ssl/installer.ts +++ b/src/main/services/ssl/installer.ts @@ -5,7 +5,7 @@ import * as fs from 'fs'; import * as os from 'os'; import * as path from 'path'; -import * as sudo from 'sudo-prompt'; +import * as childProcess from 'child_process'; import { PemConverter } from 'webcrypto-core'; import { Firefox } from './firefox'; import { NssCertUtils } from './nss'; @@ -92,15 +92,11 @@ export class SslCertInstaller { private async installDarwin(certPath: string) { await new Promise((resolve, reject) => { const certName = this.policy.nssCertName; - const options = { - name: this.policy.osxAppName || 'Fortify application', - icons: this.policy.osxAppIcons || '/Applications/Fortify.app/Contents/Resources/static/icons/tray/mac/icon.icns', - }; const { username } = os.userInfo(); logger.info('ssl-installer', 'Adding CA certificate to System KeyChain'); - sudo.exec(`certPath="${certPath}" certName="${certName}" userDir="${os.homedir()}" USER="${username}" bash ${SRC_DIR}/resources/osx-ssl.sh`, options, (err) => { + childProcess.exec(`certPath="${certPath}" certName="${certName}" userDir="${os.homedir()}" USER="${username}" bash ${SRC_DIR}/resources/osx-ssl.sh`, (err) => { if (err) { reject(err); } else { @@ -108,7 +104,7 @@ export class SslCertInstaller { } }); - logger.info('ssl-installer', 'SSL certificate added to System KeyChain', { + logger.info('ssl-installer', 'SSL certificate added to User KeyChain', { certName, }); }); diff --git a/src/main/services/ssl/nss.ts b/src/main/services/ssl/nss.ts index 891182b8..f5f7f55c 100644 --- a/src/main/services/ssl/nss.ts +++ b/src/main/services/ssl/nss.ts @@ -3,8 +3,8 @@ import { execSync } from 'child_process'; import * as os from 'os'; import { BufferSourceConverter, Convert } from 'pvtsutils'; -import { PemConverter } from 'webcrypto-core'; import logger from '../../logger'; +import { PemConverter } from './pem_converter'; export interface INssCertUtilArguments { [key: string]: string | undefined; @@ -433,9 +433,10 @@ export class NssCertUtils { if (ok && cert) { const derCert = BufferSourceConverter.toArrayBuffer(cert); const nssCertPem = this.get(certName); - const nssCertDer = PemConverter.toArrayBuffer(nssCertPem); + const nssCertDerList = PemConverter.decode(nssCertPem); - return Convert.ToHex(derCert) === Convert.ToHex(nssCertDer); + return nssCertDerList + .some((nssCertDer) => Convert.ToHex(derCert) === Convert.ToHex(nssCertDer)); } return ok; diff --git a/src/main/services/ssl/pem_converter.ts b/src/main/services/ssl/pem_converter.ts new file mode 100644 index 00000000..b8ebe609 --- /dev/null +++ b/src/main/services/ssl/pem_converter.ts @@ -0,0 +1,97 @@ +import { Convert } from 'pvtsutils'; + +/** + * Represents PEM Converter. + */ +export class PemConverter { + public CertificateTag = 'CERTIFICATE'; + + public CertificateRequestTag = 'CERTIFICATE REQUEST'; + + public PublicKeyTag = 'PUBLIC KEY'; + + public PrivateKeyTag = 'PRIVATE KEY'; + + static isPem(data: any): data is string { + return typeof data === 'string' + && /-{5}BEGIN [A-Z0-9 ]+-{5}([a-zA-Z0-9=+/\n\r]+)-{5}END [A-Z0-9 ]+-{5}/g.test(data); + } + + /** + * Decodes PEM to a list of raws + * @param pem message in PEM format + */ + public static decode(pem: string) { + const pattern = /-{5}BEGIN [A-Z0-9 ]+-{5}([a-zA-Z0-9=+/\n\r]+)-{5}END [A-Z0-9 ]+-{5}/g; + + const res: ArrayBuffer[] = []; + let matches: RegExpExecArray | null = null; + // eslint-disable-next-line no-cond-assign + while (matches = pattern.exec(pem)) { + const base64 = matches[1] + .replace(/\r/g, '') + .replace(/\n/g, ''); + res.push(Convert.FromBase64(base64)); + } + + return res; + } + + /** + * Encodes a raw data to PEM format + * @param rawData Raw data + * @param tag PEM tag + */ + public static encode(rawData: BufferSource, tag: string): string; + + /** + * Encodes a list of raws to PEM format + * @param raws A list of raws + * @param tag PEM tag + */ + public static encode(rawData: BufferSource[], tag: string): string; + + public static encode(rawData: BufferSource | BufferSource[], tag: string) { + if (Array.isArray(rawData)) { + const raws = new Array(); + rawData.forEach((element) => { + raws.push(this.encodeBuffer(element, tag)); + }); + + return raws.join('\n'); + } + + return this.encodeBuffer(rawData, tag); + } + + /** + * Encodes a raw data to PEM format + * @param rawData Raw data + * @param tag PEM tag + */ + private static encodeBuffer(rawData: BufferSource, tag: string) { + const base64 = Convert.ToBase64(rawData); + let sliced: string; + let offset = 0; + const rows = Array(); + while (offset < base64.length) { + if (base64.length - offset < 64) { + sliced = base64.substring(offset); + } else { + sliced = base64.substring(offset, offset + 64); + offset += 64; + } + if (sliced.length !== 0) { + rows.push(sliced); + if (sliced.length < 64) { + break; + } + } else { + break; + } + } + const upperCaseTag = tag.toLocaleUpperCase(); + + return `-----BEGIN ${upperCaseTag}-----\n${rows.join('\n')}\n-----END ${upperCaseTag}-----`; + } +} diff --git a/src/main/type.d.ts b/src/main/type.d.ts index 4de50511..8faa6ba0 100644 --- a/src/main/type.d.ts +++ b/src/main/type.d.ts @@ -31,11 +31,3 @@ interface IConfigure { telemetry?: boolean; theme: ('system' | 'dark' | 'light'); } - -declare module 'sudo-prompt' { - export function exec( - script: string, - options: any, - cb: (err: Error, stdout: Buffer) => void, - ): void; -} diff --git a/src/main/windows/browser_window.ts b/src/main/windows/browser_window.ts index fae08016..df5e25c7 100644 --- a/src/main/windows/browser_window.ts +++ b/src/main/windows/browser_window.ts @@ -126,6 +126,7 @@ export class BrowserWindow { enableRemoteModule: true, // https://github.com/PeculiarVentures/fortify/issues/453 backgroundThrottling: false, + contextIsolation: false, }, }; } diff --git a/src/resources/osx-ssl.sh b/src/resources/osx-ssl.sh index d7205542..88e60af3 100644 --- a/src/resources/osx-ssl.sh +++ b/src/resources/osx-ssl.sh @@ -1,11 +1,17 @@ # Add certificate to system key chain certPath=${certPath} -certificateName="${certName}" +certificateName=${certName} echo -e "certificateName: ${certificateName}" echo -e "certPath: ${certPath}" # keychain -security delete-certificate -c ${certificateName} /Library/Keychains/System.keychain -security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ${certPath} \ No newline at end of file +keychain=$(security default-keychain -d user | sed 's/"//g') +security delete-certificate -c ${certificateName} ${keychain} +security add-trusted-cert -r trustRoot -k ${keychain} ${certPath} +certDir=$(dirname ${certPath}) +echo -e "certDir: ${certDir}" +mkdir "$certDir/mkcert" +cp ${certPath} "$certDir/mkcert/rootCA.pem" +CAROOT="$certDir/mkcert" TRUST_STORES=system mkcert -install \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 515922b6..d5731f7f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -70,9 +70,9 @@ integrity sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA== "@electron/get@^1.0.1": - version "1.12.4" - resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.12.4.tgz#a5971113fc1bf8fa12a8789dc20152a7359f06ab" - integrity sha512-6nr9DbJPUR9Xujw6zD3y+rS95TyItEVM0NVjt1EehY2vUWfIgPiIPVHxCvaTS0xr2B+DRxovYVKbuOWqC35kjg== + version "1.14.1" + resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.14.1.tgz#16ba75f02dffb74c23965e72d617adc721d27f40" + integrity sha512-BrZYyL/6m0ZXz/lDxy/nlVhQz+WF+iPS6qXolEU8atw7h6v1aYkjwJZ63m+bJMBTxDE66X+r2tPS4a/8C82sZw== dependencies: debug "^4.1.1" env-paths "^2.2.0" @@ -82,7 +82,7 @@ semver "^6.2.0" sumchecker "^3.0.1" optionalDependencies: - global-agent "^2.0.2" + global-agent "^3.0.0" global-tunnel-ng "^2.7.1" "@hypnosphi/create-react-context@^0.3.1": @@ -387,11 +387,16 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.0.0.tgz#067a6c49dc7a5c2412a505628e26902ae967bf6f" integrity sha512-TmCW5HoZ2o2/z2EYi109jLqIaPIi9y/lc2LmDCWzuCi35bcaQ+OtUh6nwBiFK7SOu25FAU5+YKdqFZUwtqGSdg== -"@types/node@^12.0.12", "@types/node@^12.12.51": +"@types/node@^12.12.51": version "12.20.13" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.13.tgz#e743bae112bd779ac9650f907197dd2caa7f0364" integrity sha512-1x8W5OpxPq+T85OUsHRP6BqXeosKmeXRtjoF39STcdf/UWLqUsoehstZKOi0CunhVqHG17AyZgpj20eRVooK6A== +"@types/node@^14.6.2": + version "14.18.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.12.tgz#0d4557fd3b94497d793efd4e7d92df2f83b4ef24" + integrity sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A== + "@types/prop-types@*": version "15.7.3" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" @@ -451,11 +456,6 @@ resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.0.tgz#fef1904e4668b6e5ecee60c52cc6a078ffa6697d" integrity sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A== -"@types/uuid@^8.3.0": - version "8.3.0" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.0.tgz#215c231dff736d5ba92410e6d602050cce7e273f" - integrity sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ== - "@types/websocket@^0.0.40": version "0.0.40" resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-0.0.40.tgz#887cd632a8b3d0d11da7b9d0d106af85997b358c" @@ -1641,11 +1641,6 @@ core-js@^2.6.5: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== -core-js@^3.6.5: - version "3.13.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.13.1.tgz#30303fabd53638892062d8b4e802cac7599e9fb7" - integrity sha512-JqveUc4igkqwStL2RTRn/EPFGBOfEZHxJl/8ej1mXJR75V3go2mFF4bmUYkEIT1rveHKnkUlcJX/c+f1TyIovQ== - core-util-is@1.0.2, core-util-is@^1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -1963,13 +1958,13 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -electron@^11.5.0: - version "11.5.0" - resolved "https://registry.yarnpkg.com/electron/-/electron-11.5.0.tgz#f1650543b9d8f2047d3807755bdb120153ed210f" - integrity sha512-WjNDd6lGpxyiNjE3LhnFCAk/D9GIj1rU3GSDealVShhkkkPR3Vh4q8ErXGDl1OAO/faomVa10KoFPUN/pLbNxg== +electron@^13.6.9: + version "13.6.9" + resolved "https://registry.yarnpkg.com/electron/-/electron-13.6.9.tgz#7bd83cc1662ceaaa09dcd132a7b507cec888b028" + integrity sha512-Es/sBy85NIuqsO9MW41PUCpwIkeinlTQ7g0ainfnmRAM2rmog3GBxVCaoV5dzEjwTF7TKG1Yr/E7Z3qHmlfWAg== dependencies: "@electron/get" "^1.0.1" - "@types/node" "^12.0.12" + "@types/node" "^14.6.2" extract-zip "^1.0.3" elliptic@^6.5.3: @@ -2800,13 +2795,12 @@ glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -global-agent@^2.0.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-2.2.0.tgz#566331b0646e6bf79429a16877685c4a1fbf76dc" - integrity sha512-+20KpaW6DDLqhG7JDiJpD1JvNvb8ts+TNl7BPOYcURqCrXqnN1Vf+XVOrkKJAFPqfX+oEhsdzOj1hLWkBTdNJg== +global-agent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6" + integrity sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q== dependencies: boolean "^3.0.1" - core-js "^3.6.5" es6-error "^4.1.1" matcher "^3.0.0" roarr "^2.15.3" @@ -3998,10 +3992,10 @@ nan@^2.12.1, nan@^2.14.0, nan@^2.14.2: resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== -nanoid@^3.1.23: - version "3.2.0" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c" - integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA== +nanoid@^3.1.23, nanoid@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.2.tgz#c89622fafb4381cd221421c69ec58547a1eec557" + integrity sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA== nanomatch@^1.2.9: version "1.2.13" @@ -5632,11 +5626,6 @@ style-loader@^1.2.1: loader-utils "^2.0.0" schema-utils "^2.7.0" -sudo-prompt@^9.2.1: - version "9.2.1" - resolved "https://registry.yarnpkg.com/sudo-prompt/-/sudo-prompt-9.2.1.tgz#77efb84309c9ca489527a4e749f287e6bdd52afd" - integrity sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw== - sumchecker@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42" @@ -6046,11 +6035,6 @@ uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^8.3.1: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - v8-compile-cache@^2.0.3: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"