mirror of
https://github.com/elastic/kibana.git
synced 2025-06-27 10:40:07 -04:00
[Reporting/Screenshotting] upgrade Puppeteer dependency to v20.1.0 (#156766)
## Summary Upgrades the dependency for capturing screenshots with Chromium to [Puppeteer v20.1.0](https://github.com/puppeteer/puppeteer/releases/tag/puppeteer-v20.1.0) We're using publicly available Chromium downloads for Windows and Mac. For Linux, we create a custom build that doesn't have dependencies on X11 shared libraries. **Versions:** * Linux: **113.0.5672.63** * Windows: **113.0.5672.0** * Darwin x64: **113.0.5672.0** * Darwin arm64: **113.0.5672.0** ### Checklist Delete any items that are not applicable to this PR. - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [x] Verified in Cloud deployment ### For maintainers - [x] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
This commit is contained in:
parent
f2b4de617b
commit
89a8ab858e
15 changed files with 301 additions and 139 deletions
|
@ -880,7 +880,7 @@
|
||||||
"prop-types": "^15.8.1",
|
"prop-types": "^15.8.1",
|
||||||
"proxy-from-env": "1.0.0",
|
"proxy-from-env": "1.0.0",
|
||||||
"puid": "1.0.7",
|
"puid": "1.0.7",
|
||||||
"puppeteer": "19.7.2",
|
"puppeteer": "20.1.0",
|
||||||
"query-string": "^6.13.2",
|
"query-string": "^6.13.2",
|
||||||
"rbush": "^3.0.1",
|
"rbush": "^3.0.1",
|
||||||
"re-resizable": "^6.1.1",
|
"re-resizable": "^6.1.1",
|
||||||
|
|
|
@ -6,9 +6,11 @@
|
||||||
* Side Public License, v 1.
|
* Side Public License, v 1.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import type { Logger } from '@kbn/core/server';
|
||||||
import { install, paths } from '@kbn/screenshotting-plugin/server/utils';
|
import { install, paths } from '@kbn/screenshotting-plugin/server/utils';
|
||||||
|
import type { Task } from '../lib';
|
||||||
|
|
||||||
export const InstallChromium = {
|
export const InstallChromium: Task = {
|
||||||
description: 'Installing Chromium',
|
description: 'Installing Chromium',
|
||||||
|
|
||||||
async run(config, log, build) {
|
async run(config, log, build) {
|
||||||
|
@ -43,7 +45,7 @@ export const InstallChromium = {
|
||||||
platform,
|
platform,
|
||||||
'node_modules/@kbn/screenshotting-plugin/chromium'
|
'node_modules/@kbn/screenshotting-plugin/chromium'
|
||||||
);
|
);
|
||||||
await install(logger, pkg, path);
|
await install(logger as unknown as Logger, pkg, path);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
};
|
};
|
|
@ -7,30 +7,31 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { run } from '@kbn/dev-cli-runner';
|
import { run } from '@kbn/dev-cli-runner';
|
||||||
import { ToolingLog } from '@kbn/tooling-log';
|
|
||||||
import { REPO_ROOT } from '@kbn/repo-info';
|
import { REPO_ROOT } from '@kbn/repo-info';
|
||||||
|
import { ToolingLog } from '@kbn/tooling-log';
|
||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
import cheerio from 'cheerio';
|
|
||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import fetch from 'node-fetch';
|
import fetch from 'node-fetch';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
|
import {
|
||||||
type PuppeteerRelease = string;
|
type ChromeVersion,
|
||||||
type ChromiumRevision = string;
|
type ChromiumCommit,
|
||||||
type ChromiumCommit = string;
|
type ChromiumDashVersionType,
|
||||||
|
ChromiumDashVersionSchema,
|
||||||
// We forked the Puppeteer node module for Kibana,
|
forkCompatibilityMap,
|
||||||
// So we need to translate OUR version to the official Puppeteer Release
|
PuppeteerPackageSchema,
|
||||||
const forkCompatibilityMap: Record<string, PuppeteerRelease> = {
|
type PuppeteerPackageType,
|
||||||
'5.4.1-patch.1': '5.4.1',
|
type PuppeteerRelease,
|
||||||
};
|
} from './util';
|
||||||
|
|
||||||
async function getPuppeteerRelease(log: ToolingLog): Promise<PuppeteerRelease> {
|
async function getPuppeteerRelease(log: ToolingLog): Promise<PuppeteerRelease> {
|
||||||
// open node_modules/puppeteer/package.json
|
// open node_modules/puppeteer/package.json
|
||||||
const puppeteerPackageJson = JSON.parse(
|
const { version }: PuppeteerPackageType = JSON.parse(
|
||||||
fs.readFileSync(path.resolve(REPO_ROOT, 'node_modules', 'puppeteer', 'package.json'), 'utf8')
|
fs.readFileSync(path.resolve(REPO_ROOT, 'node_modules', 'puppeteer', 'package.json'), 'utf8')
|
||||||
);
|
);
|
||||||
const { version } = puppeteerPackageJson;
|
|
||||||
|
PuppeteerPackageSchema.validate({ version });
|
||||||
|
|
||||||
if (version == null) {
|
if (version == null) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
'Could not get the Puppeteer version! Check node_modules/puppteer/package.json'
|
'Could not get the Puppeteer version! Check node_modules/puppteer/package.json'
|
||||||
|
@ -42,10 +43,10 @@ async function getPuppeteerRelease(log: ToolingLog): Promise<PuppeteerRelease> {
|
||||||
return puppeteerRelease;
|
return puppeteerRelease;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getChromiumRevision(
|
async function getChromeVersion(
|
||||||
kibanaPuppeteerVersion: PuppeteerRelease,
|
kibanaPuppeteerVersion: PuppeteerRelease,
|
||||||
log: ToolingLog
|
log: ToolingLog
|
||||||
): Promise<ChromiumRevision> {
|
): Promise<ChromeVersion> {
|
||||||
const url = `https://raw.githubusercontent.com/puppeteer/puppeteer/puppeteer-v${kibanaPuppeteerVersion}/packages/puppeteer-core/src/revisions.ts`;
|
const url = `https://raw.githubusercontent.com/puppeteer/puppeteer/puppeteer-v${kibanaPuppeteerVersion}/packages/puppeteer-core/src/revisions.ts`;
|
||||||
let body: string;
|
let body: string;
|
||||||
try {
|
try {
|
||||||
|
@ -57,58 +58,51 @@ async function getChromiumRevision(
|
||||||
throw new Error(`Could not fetch ${url}. Check the URL in a browser and try again.`);
|
throw new Error(`Could not fetch ${url}. Check the URL in a browser and try again.`);
|
||||||
}
|
}
|
||||||
|
|
||||||
let revision: ChromiumRevision | undefined;
|
let version: ChromeVersion | undefined;
|
||||||
const lines = body.split('\n');
|
const lines = body.split('\n');
|
||||||
let cursor = lines.length;
|
let cursor = lines.length;
|
||||||
while (--cursor >= 0) {
|
while (--cursor >= 0) {
|
||||||
// look for the line of code matching ` chromium: '0123456',`
|
// look for the line of code matching ` chrome: '113.0.5672.63',`
|
||||||
const test = lines[cursor].match(/^\s+chromium: '(\S+)',$/);
|
const test = lines[cursor].match(/^\s+chrome: '(\S+)',$/);
|
||||||
if (test != null) {
|
if (test != null) {
|
||||||
log.debug(`Parsed revision from source text: \`${lines[cursor]}\``);
|
log.debug(`Parsed Chrome version from source text: \`${lines[cursor]}\``);
|
||||||
[, revision] = test;
|
[, version] = test;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (revision == null) {
|
if (version == null) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Could not find a Chromium revision listed in Puppeteer source! Check ${url} in a browser`
|
`Could not find a Chrome version listed in Puppeteer source! Check ${url} in a browser`
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
log.info(`Found Chromium revision ${revision} from Puppeteer ${kibanaPuppeteerVersion}`);
|
log.info(`Found Chrome version ${version} from Puppeteer ${kibanaPuppeteerVersion}`);
|
||||||
return revision;
|
return version;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getChromiumCommit(
|
async function getChromiumCommit(version: ChromeVersion, log: ToolingLog): Promise<ChromiumCommit> {
|
||||||
revision: ChromiumRevision,
|
const url = `https://chromiumdash.appspot.com/fetch_version?version=${version}`;
|
||||||
log: ToolingLog
|
|
||||||
): Promise<ChromiumCommit> {
|
|
||||||
const url = `https://crrev.com/${revision}`;
|
|
||||||
log.info(`Fetching ${url}`);
|
log.info(`Fetching ${url}`);
|
||||||
const pageText = await fetch(url);
|
const fetchResponse = await fetch(url);
|
||||||
const $ = cheerio.load(await pageText.text());
|
const chromeJson: ChromiumDashVersionType = await fetchResponse.json();
|
||||||
|
|
||||||
// get the commit from the page title
|
const {
|
||||||
let commit: ChromiumCommit | null = null;
|
chromium_main_branch_position: revision,
|
||||||
const matches = $('title')
|
hashes: { chromium: commit },
|
||||||
.text()
|
} = chromeJson;
|
||||||
.match(/\S{40}/);
|
|
||||||
if (matches != null) {
|
ChromiumDashVersionSchema.validate({
|
||||||
log.debug(`Parsed commit hash from page title: \`${$('title').text()}\``);
|
chromium_main_branch_position: revision,
|
||||||
[commit] = matches;
|
hashes: { chromium: commit },
|
||||||
}
|
});
|
||||||
|
|
||||||
if (commit == null) {
|
if (commit == null) {
|
||||||
throw new Error(`Could not find a Chromium commit! Check ${url} in a browser.`);
|
throw new Error(`Could not find a Chromium commit! Check ${url} in a browser.`);
|
||||||
}
|
}
|
||||||
|
|
||||||
const baseUrl = 'https://commondatastorage.googleapis.com/chromium-browser-snapshots';
|
log.info(`Found Chromium revision ${revision} from version ${version}.`);
|
||||||
|
log.info(`Found Chromium commit ${commit} from revision ${revision}.`);
|
||||||
log.info(`Found Chromium commit ${commit} from revision ${revision}.`);
|
|
||||||
log.info(`Mac x64 download: ${baseUrl}/Mac/${revision}/chrome-mac.zip`);
|
|
||||||
log.info(`Mac ARM download: ${baseUrl}/Mac_Arm/${revision}/chrome-mac.zip`);
|
|
||||||
log.info(`Windows x64 download: ${baseUrl}/Win/${revision}/chrome-win.zip`);
|
|
||||||
return commit;
|
return commit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,8 +121,8 @@ run(
|
||||||
puppeteerVersion = await getPuppeteerRelease(log);
|
puppeteerVersion = await getPuppeteerRelease(log);
|
||||||
}
|
}
|
||||||
|
|
||||||
const chromiumRevision = await getChromiumRevision(puppeteerVersion, log);
|
const chromeVersion = await getChromeVersion(puppeteerVersion, log);
|
||||||
await getChromiumCommit(chromiumRevision, log);
|
await getChromiumCommit(chromeVersion, log);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
log.error(err);
|
log.error(err);
|
||||||
}
|
}
|
33
src/dev/chromium_version/util.ts
Normal file
33
src/dev/chromium_version/util.ts
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
/*
|
||||||
|
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
||||||
|
* or more contributor license agreements. Licensed under the Elastic License
|
||||||
|
* 2.0 and the Server Side Public License, v 1; you may not use this file except
|
||||||
|
* in compliance with, at your election, the Elastic License 2.0 or the Server
|
||||||
|
* Side Public License, v 1.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { schema, TypeOf } from '@kbn/config-schema';
|
||||||
|
|
||||||
|
export type PuppeteerRelease = string;
|
||||||
|
export type ChromeVersion = string;
|
||||||
|
export type ChromiumCommit = string;
|
||||||
|
|
||||||
|
export type PuppeteerPackageType = TypeOf<typeof PuppeteerPackageSchema>;
|
||||||
|
export type ChromiumDashVersionType = TypeOf<typeof ChromiumDashVersionSchema>;
|
||||||
|
|
||||||
|
export const PuppeteerPackageSchema = schema.object({
|
||||||
|
version: schema.string(),
|
||||||
|
});
|
||||||
|
|
||||||
|
export const ChromiumDashVersionSchema = schema.object({
|
||||||
|
chromium_main_branch_position: schema.number(),
|
||||||
|
hashes: schema.object({
|
||||||
|
chromium: schema.string({ minLength: 40, maxLength: 40 }),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
// We forked the Puppeteer node module for Kibana,
|
||||||
|
// So we need to translate OUR version to the official Puppeteer Release
|
||||||
|
export const forkCompatibilityMap: Record<string, PuppeteerRelease> = {
|
||||||
|
'5.4.1-patch.1': '5.4.1',
|
||||||
|
};
|
|
@ -39,5 +39,6 @@
|
||||||
"@kbn/get-repo-files",
|
"@kbn/get-repo-files",
|
||||||
"@kbn/import-locator",
|
"@kbn/import-locator",
|
||||||
"@kbn/journeys",
|
"@kbn/journeys",
|
||||||
|
"@kbn/config-schema",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,4 +24,4 @@ enable_vr = false
|
||||||
use_kerberos = false
|
use_kerberos = false
|
||||||
|
|
||||||
target_os = "linux"
|
target_os = "linux"
|
||||||
# target_cpu is added at build timeure a minimal build
|
# target_cpu is added at build time
|
||||||
|
|
|
@ -49,7 +49,7 @@ describe('headless webgl arm mac workaround', () => {
|
||||||
|
|
||||||
// if you're updating this, then you're likely updating chromium
|
// if you're updating this, then you're likely updating chromium
|
||||||
// please double-check that the --use-angle flag is still needed for arm macs
|
// please double-check that the --use-angle flag is still needed for arm macs
|
||||||
// if you're updating to v112, then likely instead of --use-angle you should use --enable-gpu
|
// instead of --use-angle you may need --enable-gpu
|
||||||
expect(getChromiumPackage().binaryChecksum).toBe('0a12a34a0d8bc9c616d3cc339abb167e'); // just putting this here so that someone updating the chromium version will see this comment
|
expect(getChromiumPackage().binaryChecksum).toBe('4cc4ee072b23e4a65e714ff543eea21b'); // just putting this here so that someone updating the chromium version will see this comment
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -75,9 +75,8 @@ export const args = ({
|
||||||
|
|
||||||
// Since chromium v111 headless mode in arm based macs is not working with `--disable-gpu`
|
// Since chromium v111 headless mode in arm based macs is not working with `--disable-gpu`
|
||||||
// This is a known issue: headless uses swiftshader by default and swiftshader's support for WebGL is currently disabled on Arm pending the resolution of https://issuetracker.google.com/issues/165000222.
|
// This is a known issue: headless uses swiftshader by default and swiftshader's support for WebGL is currently disabled on Arm pending the resolution of https://issuetracker.google.com/issues/165000222.
|
||||||
// As a workaround, we force hardware GL drivers on mac.
|
// As a workaround, we force hardware GL drivers on mac: v111 and older versions should work with --use-angle.
|
||||||
// The best way to do this starting with v112 is by passing --enable-gpu,
|
// The best way to do this when the issue is resolved will be to pass --enable-gpu,
|
||||||
// v111 and older versions should work with --use-angle.
|
|
||||||
if (os.arch() === 'arm64' && process.platform === 'darwin') {
|
if (os.arch() === 'arm64' && process.platform === 'darwin') {
|
||||||
flags.push('--use-angle');
|
flags.push('--use-angle');
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -166,6 +166,7 @@ export class HeadlessChromiumDriverFactory {
|
||||||
env: {
|
env: {
|
||||||
TZ: browserTimezone,
|
TZ: browserTimezone,
|
||||||
},
|
},
|
||||||
|
headless: 'new',
|
||||||
});
|
});
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
observer.error(
|
observer.error(
|
||||||
|
|
|
@ -0,0 +1,72 @@
|
||||||
|
/*
|
||||||
|
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
||||||
|
* or more contributor license agreements. Licensed under the Elastic License
|
||||||
|
* 2.0; you may not use this file except in compliance with the Elastic License
|
||||||
|
* 2.0.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { loggingSystemMock } from '@kbn/core-logging-server-mocks';
|
||||||
|
import assert from 'assert';
|
||||||
|
import axios from 'axios';
|
||||||
|
import path from 'path';
|
||||||
|
import { PackageInfo } from '..';
|
||||||
|
import { paths as chromiumArchivePaths } from '../../../utils';
|
||||||
|
import { download } from '../../download';
|
||||||
|
import { install } from '../../install';
|
||||||
|
|
||||||
|
/* eslint-disable no-console */
|
||||||
|
|
||||||
|
const mockLogger = loggingSystemMock.create().get();
|
||||||
|
mockLogger.warn = jest.fn((message: string | Error) => {
|
||||||
|
console.warn(message);
|
||||||
|
});
|
||||||
|
mockLogger.debug = jest.fn((message: string | Error) => {
|
||||||
|
console.log(message);
|
||||||
|
});
|
||||||
|
mockLogger.error = jest.fn((message: string | Error) => {
|
||||||
|
console.error(message);
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NOTE: these test cases download actual browsers. Running the suite could take
|
||||||
|
* a long time with a clean cache.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// test case tuples
|
||||||
|
const packageInfos = chromiumArchivePaths.packages.map(({ platform, architecture }) => [
|
||||||
|
architecture,
|
||||||
|
platform,
|
||||||
|
]);
|
||||||
|
|
||||||
|
describe.each(packageInfos)('Chromium archive: %s/%s', (architecture, platform) => {
|
||||||
|
// For testing, suffix the unzip folder by cpu + platform so the extracted folders do not overwrite each other in the cache
|
||||||
|
const chromiumPath = path.resolve(__dirname, '../../../../chromium', architecture, platform);
|
||||||
|
|
||||||
|
const originalAxios = axios.defaults.adapter;
|
||||||
|
beforeAll(async () => {
|
||||||
|
axios.defaults.adapter = require('axios/lib/adapters/http'); // allow Axios to send actual requests
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(() => {
|
||||||
|
axios.defaults.adapter = originalAxios;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Allow package definition to be altered to check error handling
|
||||||
|
const originalPkg = chromiumArchivePaths.packages.find(
|
||||||
|
(packageInfo) => packageInfo.platform === platform && packageInfo.architecture === architecture
|
||||||
|
);
|
||||||
|
assert(originalPkg);
|
||||||
|
|
||||||
|
let pkg: PackageInfo = originalPkg;
|
||||||
|
beforeEach(() => {
|
||||||
|
pkg = { ...originalPkg };
|
||||||
|
});
|
||||||
|
|
||||||
|
it('references the correct checksums and binary path', async () => {
|
||||||
|
const downloadedChecksum = await download(chromiumArchivePaths, pkg, mockLogger);
|
||||||
|
expect(downloadedChecksum).toBe(pkg.archiveChecksum);
|
||||||
|
|
||||||
|
const binaryPath = await install(chromiumArchivePaths, mockLogger, pkg, chromiumPath);
|
||||||
|
expect(binaryPath).toBe(path.join(chromiumPath, pkg.binaryRelativePath));
|
||||||
|
});
|
||||||
|
});
|
|
@ -16,10 +16,9 @@ export interface PackageInfo {
|
||||||
binaryRelativePath: string;
|
binaryRelativePath: string;
|
||||||
isPreInstalled: boolean;
|
isPreInstalled: boolean;
|
||||||
location: 'custom' | 'common';
|
location: 'custom' | 'common';
|
||||||
|
revision: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
const REVISION = 1095492;
|
|
||||||
|
|
||||||
enum BaseUrl {
|
enum BaseUrl {
|
||||||
// see https://www.chromium.org/getting-involved/download-chromium
|
// see https://www.chromium.org/getting-involved/download-chromium
|
||||||
common = 'https://commondatastorage.googleapis.com/chromium-browser-snapshots',
|
common = 'https://commondatastorage.googleapis.com/chromium-browser-snapshots',
|
||||||
|
@ -45,9 +44,10 @@ export class ChromiumArchivePaths {
|
||||||
platform: 'darwin',
|
platform: 'darwin',
|
||||||
architecture: 'x64',
|
architecture: 'x64',
|
||||||
archiveFilename: 'chrome-mac.zip',
|
archiveFilename: 'chrome-mac.zip',
|
||||||
archiveChecksum: '318ac652b5ba64fb3b37a25e312ffd6e',
|
archiveChecksum: '2ce969500158dd98e3ad4502dbb6b13c',
|
||||||
binaryChecksum: '107a554a0f7828a1844173cb3830716c',
|
binaryChecksum: '9960dd00ab27b4e9ee1455692bb65701',
|
||||||
binaryRelativePath: 'chrome-mac/Chromium.app/Contents/MacOS/Chromium',
|
binaryRelativePath: 'chrome-mac/Chromium.app/Contents/MacOS/Chromium',
|
||||||
|
revision: 1121448,
|
||||||
location: 'common',
|
location: 'common',
|
||||||
archivePath: 'Mac',
|
archivePath: 'Mac',
|
||||||
isPreInstalled: false,
|
isPreInstalled: false,
|
||||||
|
@ -56,9 +56,10 @@ export class ChromiumArchivePaths {
|
||||||
platform: 'darwin',
|
platform: 'darwin',
|
||||||
architecture: 'arm64',
|
architecture: 'arm64',
|
||||||
archiveFilename: 'chrome-mac.zip',
|
archiveFilename: 'chrome-mac.zip',
|
||||||
archiveChecksum: 'e8f09d0c992d181b986d38a13dfb88c3',
|
archiveChecksum: 'a4fea96b155483e0617d909c9b2cb32a',
|
||||||
binaryChecksum: '0a12a34a0d8bc9c616d3cc339abb167e',
|
binaryChecksum: '4cc4ee072b23e4a65e714ff543eea21b',
|
||||||
binaryRelativePath: 'chrome-mac/Chromium.app/Contents/MacOS/Chromium',
|
binaryRelativePath: 'chrome-mac/Chromium.app/Contents/MacOS/Chromium',
|
||||||
|
revision: 1121443,
|
||||||
location: 'common',
|
location: 'common',
|
||||||
archivePath: 'Mac_Arm',
|
archivePath: 'Mac_Arm',
|
||||||
isPreInstalled: false,
|
isPreInstalled: false,
|
||||||
|
@ -66,20 +67,22 @@ export class ChromiumArchivePaths {
|
||||||
{
|
{
|
||||||
platform: 'linux',
|
platform: 'linux',
|
||||||
architecture: 'x64',
|
architecture: 'x64',
|
||||||
archiveFilename: 'chromium-7abd50c-locales-linux_x64.zip',
|
archiveFilename: 'chromium-38c3182-locales-linux_x64.zip',
|
||||||
archiveChecksum: 'dc141a6cae734c29a1144d3d9f8ca7ee',
|
archiveChecksum: '9635c58ccd7a6260dcfc0be7fa1545f6',
|
||||||
binaryChecksum: '9b9611ba0c65fc34d1be1e40ae80c036',
|
binaryChecksum: '02b21e91e39eb9aa68bbb4fedfa73204',
|
||||||
binaryRelativePath: 'headless_shell-linux_x64/headless_shell',
|
binaryRelativePath: 'headless_shell-linux_x64/headless_shell',
|
||||||
|
revision: 1121455,
|
||||||
location: 'custom',
|
location: 'custom',
|
||||||
isPreInstalled: true,
|
isPreInstalled: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
platform: 'linux',
|
platform: 'linux',
|
||||||
architecture: 'arm64',
|
architecture: 'arm64',
|
||||||
archiveFilename: 'chromium-7abd50c-locales-linux_arm64.zip',
|
archiveFilename: 'chromium-38c3182-locales-linux_arm64.zip',
|
||||||
archiveChecksum: '1ce431a6cd7b3d7e5aa63fc8f7327b0f',
|
archiveChecksum: '96dca82cccea6ae82aaf0bc46104a501',
|
||||||
binaryChecksum: 'ef21a88efa18f000e6da6d9c51ee2fd7',
|
binaryChecksum: '753e07c59b6f269b2f06091155d53f4b',
|
||||||
binaryRelativePath: 'headless_shell-linux_arm64/headless_shell',
|
binaryRelativePath: 'headless_shell-linux_arm64/headless_shell',
|
||||||
|
revision: 1121455,
|
||||||
location: 'custom',
|
location: 'custom',
|
||||||
isPreInstalled: true,
|
isPreInstalled: true,
|
||||||
},
|
},
|
||||||
|
@ -87,9 +90,10 @@ export class ChromiumArchivePaths {
|
||||||
platform: 'win32',
|
platform: 'win32',
|
||||||
architecture: 'x64',
|
architecture: 'x64',
|
||||||
archiveFilename: 'chrome-win.zip',
|
archiveFilename: 'chrome-win.zip',
|
||||||
archiveChecksum: '83e7e89ae749668d3eaa8b3bd6120e8a',
|
archiveChecksum: '76b6c8aa15f0b16df18f793c9953f59f',
|
||||||
binaryChecksum: 'cbfe0d2db3117f13554999bdc7aab68d',
|
binaryChecksum: '762fe3b0ffe86d525bb3ed91f870cb7a',
|
||||||
binaryRelativePath: path.join('chrome-win', 'chrome.exe'),
|
binaryRelativePath: path.join('chrome-win', 'chrome.exe'),
|
||||||
|
revision: 1121435,
|
||||||
location: 'common',
|
location: 'common',
|
||||||
archivePath: 'Win',
|
archivePath: 'Win',
|
||||||
isPreInstalled: true,
|
isPreInstalled: true,
|
||||||
|
@ -114,7 +118,9 @@ export class ChromiumArchivePaths {
|
||||||
|
|
||||||
public getDownloadUrl(p: PackageInfo) {
|
public getDownloadUrl(p: PackageInfo) {
|
||||||
if (isCommonPackage(p)) {
|
if (isCommonPackage(p)) {
|
||||||
return `${BaseUrl.common}/${p.archivePath}/${REVISION}/${p.archiveFilename}`;
|
const { common } = BaseUrl;
|
||||||
|
const { archivePath, revision, archiveFilename } = p;
|
||||||
|
return `${common}/${archivePath}/${revision}/${archiveFilename}`;
|
||||||
}
|
}
|
||||||
return BaseUrl.custom + '/' + p.archiveFilename; // revision is not used for URL if package is a custom build
|
return BaseUrl.custom + '/' + p.archiveFilename; // revision is not used for URL if package is a custom build
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,14 +12,18 @@ import type { ChromiumArchivePaths, PackageInfo } from '../chromium';
|
||||||
import { md5 } from './checksum';
|
import { md5 } from './checksum';
|
||||||
import { fetch } from './fetch';
|
import { fetch } from './fetch';
|
||||||
|
|
||||||
|
type ValidChecksum = string;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clears the unexpected files in the browsers archivesPath
|
* Clears the unexpected files in the browsers archivesPath
|
||||||
* and ensures that all packages/archives are downloaded and
|
* and ensures that all packages/archives are downloaded and
|
||||||
* that their checksums match the declared value
|
* that their checksums match the declared value
|
||||||
* @param {BrowserSpec} browsers
|
|
||||||
* @return {Promise<undefined>}
|
|
||||||
*/
|
*/
|
||||||
export async function download(paths: ChromiumArchivePaths, pkg: PackageInfo, logger?: Logger) {
|
export async function download(
|
||||||
|
paths: ChromiumArchivePaths,
|
||||||
|
pkg: PackageInfo,
|
||||||
|
logger?: Logger
|
||||||
|
): Promise<ValidChecksum | undefined> {
|
||||||
const removedFiles = await del(`${paths.archivesPath}/**/*`, {
|
const removedFiles = await del(`${paths.archivesPath}/**/*`, {
|
||||||
force: true,
|
force: true,
|
||||||
onlyFiles: true,
|
onlyFiles: true,
|
||||||
|
@ -41,9 +45,9 @@ export async function download(paths: ChromiumArchivePaths, pkg: PackageInfo, lo
|
||||||
const pathExists = existsSync(resolvedPath);
|
const pathExists = existsSync(resolvedPath);
|
||||||
if (pathExists && foundChecksum === archiveChecksum) {
|
if (pathExists && foundChecksum === archiveChecksum) {
|
||||||
logger?.debug(
|
logger?.debug(
|
||||||
`Browser archive for ${pkg.platform}/${pkg.architecture} already found in ${resolvedPath}.`
|
`Browser archive for ${pkg.platform}/${pkg.architecture} already found in ${resolvedPath} with matching checksum.`
|
||||||
);
|
);
|
||||||
return;
|
return foundChecksum;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!pathExists) {
|
if (!pathExists) {
|
||||||
|
@ -60,11 +64,12 @@ export async function download(paths: ChromiumArchivePaths, pkg: PackageInfo, lo
|
||||||
}
|
}
|
||||||
|
|
||||||
const url = paths.getDownloadUrl(pkg);
|
const url = paths.getDownloadUrl(pkg);
|
||||||
|
let downloadedChecksum: string | undefined;
|
||||||
try {
|
try {
|
||||||
const downloadedChecksum = await fetch(url, resolvedPath, logger);
|
downloadedChecksum = await fetch(url, resolvedPath, logger);
|
||||||
if (downloadedChecksum !== archiveChecksum) {
|
if (downloadedChecksum !== archiveChecksum) {
|
||||||
logger?.warn(
|
logger?.warn(
|
||||||
`Invalid checksum for ${pkg.platform}/${pkg.architecture}: ` +
|
`Invalid archive checksum for ${pkg.platform}/${pkg.architecture}: ` +
|
||||||
`expected ${archiveChecksum} got ${downloadedChecksum}`
|
`expected ${archiveChecksum} got ${downloadedChecksum}`
|
||||||
);
|
);
|
||||||
invalidChecksums.push(`${url} => ${resolvedPath}`);
|
invalidChecksums.push(`${url} => ${resolvedPath}`);
|
||||||
|
@ -75,7 +80,7 @@ export async function download(paths: ChromiumArchivePaths, pkg: PackageInfo, lo
|
||||||
|
|
||||||
if (invalidChecksums.length) {
|
if (invalidChecksums.length) {
|
||||||
const error = new Error(
|
const error = new Error(
|
||||||
`Error downloading browsers, checksums incorrect for:\n - ${invalidChecksums.join(
|
`Error downloading browsers, archive checksums incorrect for:\n - ${invalidChecksums.join(
|
||||||
'\n - '
|
'\n - '
|
||||||
)}`
|
)}`
|
||||||
);
|
);
|
||||||
|
@ -83,4 +88,6 @@ export async function download(paths: ChromiumArchivePaths, pkg: PackageInfo, lo
|
||||||
|
|
||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return downloadedChecksum;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,8 @@ import { download } from './download';
|
||||||
import { md5 } from './download/checksum';
|
import { md5 } from './download/checksum';
|
||||||
import { extract } from './extract';
|
import { extract } from './extract';
|
||||||
|
|
||||||
|
type BinaryPath = string;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* "install" a browser by type into installs path by extracting the downloaded
|
* "install" a browser by type into installs path by extracting the downloaded
|
||||||
* archive. If there is an error extracting the archive an `ExtractError` is thrown
|
* archive. If there is an error extracting the archive an `ExtractError` is thrown
|
||||||
|
@ -22,32 +24,48 @@ export async function install(
|
||||||
logger: Logger,
|
logger: Logger,
|
||||||
pkg: PackageInfo,
|
pkg: PackageInfo,
|
||||||
chromiumPath: string = path.resolve(__dirname, '../../chromium')
|
chromiumPath: string = path.resolve(__dirname, '../../chromium')
|
||||||
): Promise<string> {
|
): Promise<BinaryPath> {
|
||||||
|
const { architecture, platform } = pkg;
|
||||||
const binaryPath = paths.getBinaryPath(pkg, chromiumPath);
|
const binaryPath = paths.getBinaryPath(pkg, chromiumPath);
|
||||||
const binaryChecksum = await md5(binaryPath).catch(() => 'MISSING');
|
const binaryChecksum = await md5(binaryPath).catch(() => 'MISSING');
|
||||||
|
|
||||||
if (binaryChecksum !== pkg.binaryChecksum) {
|
if (binaryChecksum === pkg.binaryChecksum) {
|
||||||
logger?.warn(
|
// validated a previously extracted browser binary
|
||||||
`Found browser binary checksum for ${pkg.platform}/${pkg.architecture} in ${binaryPath}` +
|
logger.info(`Browser executable: ${binaryPath}`);
|
||||||
` is ${binaryChecksum} but ${pkg.binaryChecksum} was expected. Re-installing...`
|
return binaryPath;
|
||||||
);
|
|
||||||
try {
|
|
||||||
await del(chromiumPath);
|
|
||||||
} catch (error) {
|
|
||||||
logger.error(error);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
await download(paths, pkg, logger);
|
|
||||||
const archive = path.join(paths.archivesPath, pkg.architecture, pkg.archiveFilename);
|
|
||||||
logger.info(`Extracting [${archive}] to [${chromiumPath}]`);
|
|
||||||
await extract(archive, chromiumPath);
|
|
||||||
} catch (error) {
|
|
||||||
logger.error(error);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.info(`Browser executable: ${binaryPath}`);
|
logger?.warn(
|
||||||
|
`Found browser binary checksum for ${platform}/${architecture} in ${binaryPath}` +
|
||||||
|
` is ${binaryChecksum} but ${pkg.binaryChecksum} was expected. Re-installing...`
|
||||||
|
);
|
||||||
|
try {
|
||||||
|
await del(chromiumPath);
|
||||||
|
} catch (error) {
|
||||||
|
logger.error(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
await download(paths, pkg, logger);
|
||||||
|
const archive = path.join(paths.archivesPath, architecture, pkg.archiveFilename);
|
||||||
|
logger.info(`Extracting [${archive}] to [${chromiumPath}]`);
|
||||||
|
await extract(archive, chromiumPath);
|
||||||
|
} catch (error) {
|
||||||
|
logger.error(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
// check the newly extracted browser binary
|
||||||
|
const downloadedBinaryChecksum = await md5(binaryPath).catch(() => 'MISSING');
|
||||||
|
if (downloadedBinaryChecksum !== pkg.binaryChecksum) {
|
||||||
|
const error = new Error(
|
||||||
|
`Error installing browsers, binary checksums incorrect for [${architecture}/${platform}]`
|
||||||
|
);
|
||||||
|
logger?.error(error);
|
||||||
|
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.info(`Browser executable has been installed: ${binaryPath}`);
|
||||||
|
|
||||||
return binaryPath;
|
return binaryPath;
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
"@kbn/i18n",
|
"@kbn/i18n",
|
||||||
"@kbn/utils",
|
"@kbn/utils",
|
||||||
"@kbn/safer-lodash-set",
|
"@kbn/safer-lodash-set",
|
||||||
|
"@kbn/core-logging-server-mocks",
|
||||||
],
|
],
|
||||||
"exclude": [
|
"exclude": [
|
||||||
"target/**/*",
|
"target/**/*",
|
||||||
|
|
102
yarn.lock
102
yarn.lock
|
@ -6480,6 +6480,20 @@
|
||||||
resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
|
resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
|
||||||
integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=
|
integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=
|
||||||
|
|
||||||
|
"@puppeteer/browsers@1.0.0":
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-1.0.0.tgz#89de56a718c922857b1d802aac473ebbe1f54d99"
|
||||||
|
integrity sha512-YKecOIlwH0UsiM9zkKy31DYg11iD8NhOoQ7SQ4oCpwDSd1Ud31WYRoAldbVlVBj9b4hLJIXxn7XSnkH1ta1tpA==
|
||||||
|
dependencies:
|
||||||
|
debug "4.3.4"
|
||||||
|
extract-zip "2.0.1"
|
||||||
|
https-proxy-agent "5.0.1"
|
||||||
|
progress "2.0.3"
|
||||||
|
proxy-from-env "1.1.0"
|
||||||
|
tar-fs "2.1.1"
|
||||||
|
unbzip2-stream "1.4.3"
|
||||||
|
yargs "17.7.1"
|
||||||
|
|
||||||
"@redux-saga/core@^1.1.3":
|
"@redux-saga/core@^1.1.3":
|
||||||
version "1.1.3"
|
version "1.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/@redux-saga/core/-/core-1.1.3.tgz#3085097b57a4ea8db5528d58673f20ce0950f6a4"
|
resolved "https://registry.yarnpkg.com/@redux-saga/core/-/core-1.1.3.tgz#3085097b57a4ea8db5528d58673f20ce0950f6a4"
|
||||||
|
@ -11993,10 +12007,10 @@ chromedriver@^113.0.0:
|
||||||
proxy-from-env "^1.1.0"
|
proxy-from-env "^1.1.0"
|
||||||
tcp-port-used "^1.0.1"
|
tcp-port-used "^1.0.1"
|
||||||
|
|
||||||
chromium-bidi@0.4.4:
|
chromium-bidi@0.4.7:
|
||||||
version "0.4.4"
|
version "0.4.7"
|
||||||
resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.4.4.tgz#44f25d4fa5d2f3debc3fc3948d0657194cac4407"
|
resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.4.7.tgz#4c022c2b0fb1d1c9b571fadf373042160e71d236"
|
||||||
integrity sha512-4BX5cSaponuvVT1+SbLYTOAgDoVtX/Khoc9UsbFJ/AsPVUeFAM3RiIDFI6XFhLYMi9WmVJqh1ZH+dRpNKkKwiQ==
|
integrity sha512-6+mJuFXwTMU6I3vYLs6IL8A1DyQTPjCfIL971X0aMPVGRbGnNfl6i6Cl0NMbxi2bRYLGESt9T2ZIMRM5PAEcIQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
mitt "3.0.0"
|
mitt "3.0.0"
|
||||||
|
|
||||||
|
@ -12667,10 +12681,10 @@ core-util-is@1.0.2, core-util-is@^1.0.2, core-util-is@~1.0.0:
|
||||||
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
|
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
|
||||||
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
|
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
|
||||||
|
|
||||||
cosmiconfig@8.0.0:
|
cosmiconfig@8.1.3:
|
||||||
version "8.0.0"
|
version "8.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.0.0.tgz#e9feae014eab580f858f8a0288f38997a7bebe97"
|
resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.1.3.tgz#0e614a118fcc2d9e5afc2f87d53cd09931015689"
|
||||||
integrity sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==
|
integrity sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==
|
||||||
dependencies:
|
dependencies:
|
||||||
import-fresh "^3.2.1"
|
import-fresh "^3.2.1"
|
||||||
js-yaml "^4.1.0"
|
js-yaml "^4.1.0"
|
||||||
|
@ -13909,10 +13923,10 @@ detective@^5.0.2:
|
||||||
defined "^1.0.0"
|
defined "^1.0.0"
|
||||||
minimist "^1.1.1"
|
minimist "^1.1.1"
|
||||||
|
|
||||||
devtools-protocol@0.0.1094867:
|
devtools-protocol@0.0.1120988:
|
||||||
version "0.0.1094867"
|
version "0.0.1120988"
|
||||||
resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1094867.tgz#2ab93908e9376bd85d4e0604aa2651258f13e374"
|
resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1120988.tgz#8fe49088919ae3b8df7235774633763f1f925066"
|
||||||
integrity sha512-pmMDBKiRVjh0uKK6CT1WqZmM3hBVSgD+N2MrgyV1uNizAZMw4tx6i/RTc+/uCsKSCmg0xXx7arCP/OFcIwTsiQ==
|
integrity sha512-39fCpE3Z78IaIPChJsP6Lhmkbf4dWXOmzLk/KFTdRkNk/0JymRIfUynDVRndV9HoDz8PyalK1UH21ST/ivwW5Q==
|
||||||
|
|
||||||
dezalgo@^1.0.0:
|
dezalgo@^1.0.0:
|
||||||
version "1.0.3"
|
version "1.0.3"
|
||||||
|
@ -23756,33 +23770,34 @@ pupa@^2.1.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
escape-goat "^2.0.0"
|
escape-goat "^2.0.0"
|
||||||
|
|
||||||
puppeteer-core@19.7.2:
|
puppeteer-core@20.1.0:
|
||||||
version "19.7.2"
|
version "20.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-19.7.2.tgz#deee9ef915829b6a1d1a3a008625c29eeb251161"
|
resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-20.1.0.tgz#c74e21ad642b0adb273da83b4bf444fdecc6500f"
|
||||||
integrity sha512-PvI+fXqgP0uGJxkyZcX51bnzjFA73MODZOAv0fSD35yR7tvbqwtMV3/Y+hxQ0AMMwzxkEebP6c7po/muqxJvmQ==
|
integrity sha512-/xTvabzAN4mnnuYkJCuWNnnEhOb3JrBTa3sY6qVi1wybuIEk5ODRg8Z5PPiKUGiKC9iG7GWOJ5CjF3iuMuxZSA==
|
||||||
dependencies:
|
dependencies:
|
||||||
chromium-bidi "0.4.4"
|
"@puppeteer/browsers" "1.0.0"
|
||||||
|
chromium-bidi "0.4.7"
|
||||||
cross-fetch "3.1.5"
|
cross-fetch "3.1.5"
|
||||||
debug "4.3.4"
|
debug "4.3.4"
|
||||||
devtools-protocol "0.0.1094867"
|
devtools-protocol "0.0.1120988"
|
||||||
extract-zip "2.0.1"
|
extract-zip "2.0.1"
|
||||||
https-proxy-agent "5.0.1"
|
https-proxy-agent "5.0.1"
|
||||||
proxy-from-env "1.1.0"
|
proxy-from-env "1.1.0"
|
||||||
rimraf "3.0.2"
|
|
||||||
tar-fs "2.1.1"
|
tar-fs "2.1.1"
|
||||||
unbzip2-stream "1.4.3"
|
unbzip2-stream "1.4.3"
|
||||||
ws "8.11.0"
|
ws "8.13.0"
|
||||||
|
|
||||||
puppeteer@19.7.2:
|
puppeteer@20.1.0:
|
||||||
version "19.7.2"
|
version "20.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-19.7.2.tgz#1b3ce99a093cc2f8f84dfb06f066d0757ea79d4b"
|
resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-20.1.0.tgz#30331e2729b235b3306a39cab3ad5b0cf2b90e7d"
|
||||||
integrity sha512-4Lm7Qpe/LU95Svirei/jDLDvR5oMrl9BPGd7HMY5+Q28n+BhvKuW97gKkR+1LlI86bO8J3g8rG/Ll5kv9J1nlQ==
|
integrity sha512-kZp1eYScK1IpHxkgnDaFSGKKCzt27iZfsxO6Xlv/cklzYrhobxTK9/PxzCacPCrYnxNQwKwHzHLPOCuSyjw1jg==
|
||||||
dependencies:
|
dependencies:
|
||||||
cosmiconfig "8.0.0"
|
"@puppeteer/browsers" "1.0.0"
|
||||||
|
cosmiconfig "8.1.3"
|
||||||
https-proxy-agent "5.0.1"
|
https-proxy-agent "5.0.1"
|
||||||
progress "2.0.3"
|
progress "2.0.3"
|
||||||
proxy-from-env "1.1.0"
|
proxy-from-env "1.1.0"
|
||||||
puppeteer-core "19.7.2"
|
puppeteer-core "20.1.0"
|
||||||
|
|
||||||
q@^1.5.1:
|
q@^1.5.1:
|
||||||
version "1.5.1"
|
version "1.5.1"
|
||||||
|
@ -25339,13 +25354,6 @@ rgbcolor@^1.0.1:
|
||||||
resolved "https://registry.yarnpkg.com/rgbcolor/-/rgbcolor-1.0.1.tgz#d6505ecdb304a6595da26fa4b43307306775945d"
|
resolved "https://registry.yarnpkg.com/rgbcolor/-/rgbcolor-1.0.1.tgz#d6505ecdb304a6595da26fa4b43307306775945d"
|
||||||
integrity sha1-1lBezbMEplldom+ktDMHMGd1lF0=
|
integrity sha1-1lBezbMEplldom+ktDMHMGd1lF0=
|
||||||
|
|
||||||
rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2:
|
|
||||||
version "3.0.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
|
|
||||||
integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
|
|
||||||
dependencies:
|
|
||||||
glob "^7.1.3"
|
|
||||||
|
|
||||||
rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3:
|
rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3:
|
||||||
version "2.7.1"
|
version "2.7.1"
|
||||||
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
|
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
|
||||||
|
@ -25353,6 +25361,13 @@ rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3:
|
||||||
dependencies:
|
dependencies:
|
||||||
glob "^7.1.3"
|
glob "^7.1.3"
|
||||||
|
|
||||||
|
rimraf@^3.0.0, rimraf@^3.0.2:
|
||||||
|
version "3.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
|
||||||
|
integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
|
||||||
|
dependencies:
|
||||||
|
glob "^7.1.3"
|
||||||
|
|
||||||
ripemd160@^2.0.0, ripemd160@^2.0.1:
|
ripemd160@^2.0.0, ripemd160@^2.0.1:
|
||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7"
|
resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7"
|
||||||
|
@ -29573,10 +29588,10 @@ write-file-atomic@^4.0.1:
|
||||||
imurmurhash "^0.1.4"
|
imurmurhash "^0.1.4"
|
||||||
signal-exit "^3.0.7"
|
signal-exit "^3.0.7"
|
||||||
|
|
||||||
ws@8.11.0:
|
ws@8.13.0:
|
||||||
version "8.11.0"
|
version "8.13.0"
|
||||||
resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143"
|
resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0"
|
||||||
integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==
|
integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==
|
||||||
|
|
||||||
ws@>=8.11.0, ws@^8.2.3, ws@^8.4.2, ws@^8.9.0:
|
ws@>=8.11.0, ws@^8.2.3, ws@^8.4.2, ws@^8.9.0:
|
||||||
version "8.12.0"
|
version "8.12.0"
|
||||||
|
@ -29780,6 +29795,19 @@ yargs@16.2.0, yargs@^16.2.0:
|
||||||
y18n "^5.0.5"
|
y18n "^5.0.5"
|
||||||
yargs-parser "^20.2.2"
|
yargs-parser "^20.2.2"
|
||||||
|
|
||||||
|
yargs@17.7.1:
|
||||||
|
version "17.7.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967"
|
||||||
|
integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==
|
||||||
|
dependencies:
|
||||||
|
cliui "^8.0.1"
|
||||||
|
escalade "^3.1.1"
|
||||||
|
get-caller-file "^2.0.5"
|
||||||
|
require-directory "^2.1.1"
|
||||||
|
string-width "^4.2.3"
|
||||||
|
y18n "^5.0.5"
|
||||||
|
yargs-parser "^21.1.1"
|
||||||
|
|
||||||
yargs@^13.3.0:
|
yargs@^13.3.0:
|
||||||
version "13.3.2"
|
version "13.3.2"
|
||||||
resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
|
resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue