Remove file-type dependency via jimp (#137214)

* Removed file-type from package.json deps.
Updated jimp to 0.16.1.
Updated light & dark dashboard baseline screenshots to resolve failure due to resize degradation.

* Replaced jimp with sharp and pixelmatch. Eliminates several deps, including file-type.
Eliminates quality degradation from image resizing.

* Fixed copy paste error, which lead to pass positives and errors.

* Integrated updateBaselines flag into dashboards report testing.
Fixed sharp resize to fit and not truncate the original image.

* Removed accidental '.only'

* Reverted area chart baseline.

* Removed explicit declaration of sharp from package.json.

* Adjusted dashboard screenshot size in attempt to eliminate layout scaling issues in CI testing.

* Reverted dashboard screenshot size. Lowered tolerance in dashboard PNG reporting tests to force failure and collect CI screenshots.

* Changed session save location for dashboard report images for better CI reporting.

* Fixed small dashboard baseline screenshot with correct aspect ratio.

* Updated 2 basline screenshots from CI. Lowered PNG match tolerance for dashboard screenshots to 1% for investigation of remaining screens.

* Update of dashboard controls light mode baseline.
Change of forced container width size in large dashboard layout test.

* Updated dashboard controls dark mode baseline screenshot.
Adjusted forced container width in large dashboard layout test for troubleshooting.

* Lowering tolerance of PNG compare tests from 9% to 1% for troubleshooting.
Replaced references to dedundant image service with existing, more adopted reporting service.
Ideally, the PNG functions of the reporting service would be merged with the screenshot service as an image service.

* Reverting tolerance of PNG compares to 0.09. Will create GH issues for specific teams to investigate.

* Implemented PngService to provide an accessible single reference to PNG compare testing.
Removed redundant implementations and references.

* Updated service reference and call to png compare function left out of last commit.

* Updated another missed PNG reference.

* Removed superfluous parameter.

* Update after bootstrap

* Updated area chart baseline to match new render with panel filters.

* Reverted limits in dashboard snapshot tests to original values.

* Merge and rebuild.

Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
This commit is contained in:
Jeramy Soucy 2022-08-24 13:24:38 -05:00 committed by GitHub
parent e2dd24b65f
commit de9b7c6f48
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 312 additions and 708 deletions

1
.gitignore vendored
View file

@ -39,6 +39,7 @@ __tmp__
/x-pack/test/*/screenshots/failure /x-pack/test/*/screenshots/failure
/x-pack/test/*/screenshots/session /x-pack/test/*/screenshots/session
/x-pack/test/*/screenshots/visual_regression_gallery.html /x-pack/test/*/screenshots/visual_regression_gallery.html
/x-pack/test/functional/apps/*/*/reporting/reports/failure
/html_docs /html_docs
.eslintcache .eslintcache

View file

@ -425,7 +425,6 @@
"fast-deep-equal": "^3.1.1", "fast-deep-equal": "^3.1.1",
"fflate": "^0.6.9", "fflate": "^0.6.9",
"file-saver": "^1.3.8", "file-saver": "^1.3.8",
"file-type": "^10.9.0",
"font-awesome": "4.7.0", "font-awesome": "4.7.0",
"formik": "^2.2.9", "formik": "^2.2.9",
"fp-ts": "^2.3.1", "fp-ts": "^2.3.1",
@ -1071,6 +1070,7 @@
"@types/pbf": "3.0.2", "@types/pbf": "3.0.2",
"@types/pdfmake": "^0.2.0", "@types/pdfmake": "^0.2.0",
"@types/pegjs": "^0.10.1", "@types/pegjs": "^0.10.1",
"@types/pixelmatch": "^5.2.4",
"@types/pngjs": "^3.4.0", "@types/pngjs": "^3.4.0",
"@types/prettier": "^2.3.2", "@types/prettier": "^2.3.2",
"@types/pretty-ms": "^5.0.0", "@types/pretty-ms": "^5.0.0",
@ -1099,6 +1099,7 @@
"@types/selenium-webdriver": "^4.1.2", "@types/selenium-webdriver": "^4.1.2",
"@types/semver": "^7", "@types/semver": "^7",
"@types/set-value": "^2.0.0", "@types/set-value": "^2.0.0",
"@types/sharp": "^0.30.4",
"@types/sinon": "^7.0.13", "@types/sinon": "^7.0.13",
"@types/source-map-support": "^0.5.3", "@types/source-map-support": "^0.5.3",
"@types/stats-lite": "^2.2.0", "@types/stats-lite": "^2.2.0",
@ -1229,7 +1230,6 @@
"jest-snapshot": "^26.6.2", "jest-snapshot": "^26.6.2",
"jest-specific-snapshot": "^4.0.0", "jest-specific-snapshot": "^4.0.0",
"jest-styled-components": "^7.0.3", "jest-styled-components": "^7.0.3",
"jimp": "^0.14.0",
"jsdom": "^16.4.0", "jsdom": "^16.4.0",
"json-schema-typed": "^8.0.1", "json-schema-typed": "^8.0.1",
"json5": "^1.0.1", "json5": "^1.0.1",
@ -1259,6 +1259,7 @@
"peggy": "^1.2.0", "peggy": "^1.2.0",
"pirates": "^4.0.1", "pirates": "^4.0.1",
"piscina": "^3.2.0", "piscina": "^3.2.0",
"pixelmatch": "^5.3.0",
"playwright": "^1.17.1", "playwright": "^1.17.1",
"pngjs": "^3.4.0", "pngjs": "^3.4.0",
"postcss": "^8.4.14", "postcss": "^8.4.14",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 KiB

After

Width:  |  Height:  |  Size: 67 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 63 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Before After
Before After

View file

@ -11,7 +11,7 @@ import { cloneDeepWith } from 'lodash';
import { Key, Origin, WebDriver } from 'selenium-webdriver'; import { Key, Origin, WebDriver } from 'selenium-webdriver';
import { modifyUrl } from '@kbn/std'; import { modifyUrl } from '@kbn/std';
import Jimp from 'jimp'; import sharp from 'sharp';
import { WebElementWrapper } from '../lib/web_element_wrapper'; import { WebElementWrapper } from '../lib/web_element_wrapper';
import { FtrProviderContext, FtrService } from '../../ftr_provider_context'; import { FtrProviderContext, FtrService } from '../../ftr_provider_context';
import { Browsers } from '../remote/browsers'; import { Browsers } from '../remote/browsers';
@ -87,8 +87,9 @@ class BrowserService extends FtrService {
public async getScreenshotAsBitmap() { public async getScreenshotAsBitmap() {
const screenshot = await this.takeScreenshot(); const screenshot = await this.takeScreenshot();
const buffer = Buffer.from(screenshot, 'base64'); const buffer = Buffer.from(screenshot, 'base64');
const session = (await Jimp.read(buffer)).clone();
return session.bitmap; const session = sharp(buffer).png({ quality: 100, progressive: true }).clone();
return session;
} }
/** /**
@ -103,23 +104,36 @@ class BrowserService extends FtrService {
// We really want to set the Kibana app to a specific size without regard to the browser chrome (borders) // We really want to set the Kibana app to a specific size without regard to the browser chrome (borders)
// But that means we first need to figure out the display scaling factor. // But that means we first need to figure out the display scaling factor.
// NOTE: None of this is required when running Chrome headless because there's no scaling and no borders. // NOTE: None of this is required when running Chrome headless because there's no scaling and no borders.
await this.setWindowSize(1200, 800); const largeWidth = 1200;
const largeHeight = 800;
const smallWidth = 600;
const smallHeight = 400;
await this.setWindowSize(largeWidth, largeHeight);
const bitmap1 = await this.getScreenshotAsBitmap(); const bitmap1 = await this.getScreenshotAsBitmap();
const bm1Data = await bitmap1.metadata();
this.log.debug( this.log.debug(
`======browser======== actual initial screenshot size width=${bitmap1.width}, height=${bitmap1.height}` `======browser======== actual initial screenshot size width=${bm1Data.width}, height=${bm1Data.height}`
); );
// drasticly change the window size so we can calculate the scaling // drasticly change the window size so we can calculate the scaling
await this.setWindowSize(600, 400); await this.setWindowSize(smallWidth, smallHeight);
const bitmap2 = await this.getScreenshotAsBitmap(); const bitmap2 = await this.getScreenshotAsBitmap();
const bm2Data = await bitmap2.metadata();
this.log.debug( this.log.debug(
`======browser======== actual second screenshot size width= ${bitmap2.width}, height=${bitmap2.height}` `======browser======== actual second screenshot size width= ${bm2Data.width}, height=${bm2Data.height}`
); );
const xScaling = (bitmap1.width - bitmap2.width) / 600; const bm1Width = bm1Data.width ?? smallWidth;
const yScaling = (bitmap1.height - bitmap2.height) / 400; const bm1Height = bm1Data.height ?? smallHeight;
const xBorder = Math.round(600 - bitmap2.width / xScaling); const bm2Width = bm2Data.width ?? smallWidth;
const yBorder = Math.round(400 - bitmap2.height / yScaling); const bm2Height = bm2Data.height ?? smallHeight;
const xScaling = (bm1Width - bm2Width) / smallWidth;
const yScaling = (bm1Height - bm2Height) / smallHeight;
const xBorder = Math.round(600 - bm2Width / xScaling);
const yBorder = Math.round(400 - bm2Height / yScaling);
this.log.debug( this.log.debug(
`======browser======== calculated values xBorder= ${xBorder}, yBorder=${yBorder}, xScaling=${xScaling}, yScaling=${yScaling}` `======browser======== calculated values xBorder= ${xBorder}, yBorder=${yBorder}, xScaling=${xScaling}, yScaling=${yScaling}`
); );
@ -129,9 +143,12 @@ class BrowserService extends FtrService {
await this.setWindowSize(width + xBorder, height + yBorder); await this.setWindowSize(width + xBorder, height + yBorder);
const bitmap3 = await this.getScreenshotAsBitmap(); const bitmap3 = await this.getScreenshotAsBitmap();
const bm3Data = await bitmap3.metadata();
const bm3Width = bm3Data.width ?? width;
const bm3Height = bm3Data.height ?? height;
// when there is display scaling this won't show the expected size. It will show expected size * scaling factor // when there is display scaling this won't show the expected size. It will show expected size * scaling factor
this.log.debug( this.log.debug(
`======browser======== final screenshot size width=${bitmap3.width}, height=${bitmap3.height}` `======browser======== final screenshot size width=${bm3Width}, height=${bm3Height}`
); );
} }

View file

@ -10,6 +10,7 @@ export type { Browser } from './browser';
export { BrowserProvider } from './browser'; export { BrowserProvider } from './browser';
export { FailureDebuggingProvider } from './failure_debugging'; export { FailureDebuggingProvider } from './failure_debugging';
export { FindProvider } from './find'; export { FindProvider } from './find';
export { PngService } from './png';
export { ScreenshotsService } from './screenshots'; export { ScreenshotsService } from './screenshots';
export { SnapshotsService } from './snapshots'; export { SnapshotsService } from './snapshots';
export { TestSubjects } from './test_subjects'; export { TestSubjects } from './test_subjects';

View file

@ -0,0 +1,96 @@
/*
* 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 { dirname } from 'path';
import { promisify } from 'util';
import { promises as fs, writeFile, readFileSync, mkdir } from 'fs';
import path from 'path';
import { comparePngs, PngDescriptor } from '../lib/compare_pngs';
import { FtrProviderContext, FtrService } from '../../ftr_provider_context';
const mkdirAsync = promisify(mkdir);
const writeFileAsync = promisify(writeFile);
export class PngService extends FtrService {
private readonly log = this.ctx.getService('log');
constructor(ctx: FtrProviderContext) {
super(ctx);
}
async comparePngs(
sessionInfo: string | PngDescriptor,
baselineInfo: string | PngDescriptor,
diffPath: string,
sessionDirectory: string
) {
return await comparePngs(sessionInfo, baselineInfo, diffPath, sessionDirectory, this.log);
}
async checkIfPngsMatch(actualpngPath: string, baselinepngPath: string, folder: string) {
this.log.debug(`checkIfpngsMatch: ${actualpngPath} vs ${baselinepngPath}`);
// Copy the pngs into the session directory, as that's where the generated pngs will automatically be
// stored.
const sessionDirectoryPath = path.resolve(folder, 'session');
const failureDirectoryPath = path.resolve(folder, 'failure');
await fs.mkdir(sessionDirectoryPath, { recursive: true });
await fs.mkdir(failureDirectoryPath, { recursive: true });
const actualpngFileName = path.basename(actualpngPath, '.png');
const baselinepngFileName = path.basename(baselinepngPath, '.png');
const baselineCopyPath = path.resolve(
sessionDirectoryPath,
`${baselinepngFileName}_baseline.png`
);
const actualCopyPath = path.resolve(sessionDirectoryPath, `${actualpngFileName}_actual.png`);
// Don't cause a test failure if the baseline snapshot doesn't exist - we don't have all OS's covered and we
// don't want to start causing failures for other devs working on OS's which are lacking snapshots. We have
// mac and linux covered which is better than nothing for now.
try {
this.log.debug(`writeFile: ${baselineCopyPath}`);
await fs.writeFile(baselineCopyPath, await fs.readFile(baselinepngPath));
} catch (error) {
throw new Error(`No baseline png found at ${baselinepngPath}`);
}
this.log.debug(`writeFile: ${actualCopyPath}`);
await fs.writeFile(actualCopyPath, await fs.readFile(actualpngPath));
let diffTotal = 0;
const diffPngPath = path.resolve(failureDirectoryPath, `${baselinepngFileName}-${1}.png`);
diffTotal += await this.comparePngs(
actualCopyPath,
baselineCopyPath,
diffPngPath,
sessionDirectoryPath
);
return diffTotal;
}
async compareAgainstBaseline(
sessionPath: string,
baselinePath: string,
folder: string,
updateBaselines: boolean
) {
this.log.debug(`compareAgainstBaseline: ${sessionPath} vs ${baselinePath}`);
if (updateBaselines) {
this.log.debug('Updating baseline PNG');
await mkdirAsync(dirname(baselinePath), { recursive: true });
await writeFileAsync(baselinePath, readFileSync(sessionPath));
return 0;
} else {
return await this.checkIfPngsMatch(sessionPath, baselinePath, folder);
}
}
}

View file

@ -13,6 +13,7 @@ import {
BrowserProvider, BrowserProvider,
FailureDebuggingProvider, FailureDebuggingProvider,
FindProvider, FindProvider,
PngService,
ScreenshotsService, ScreenshotsService,
SnapshotsService, SnapshotsService,
TestSubjects, TestSubjects,
@ -58,6 +59,7 @@ export const services = {
find: FindProvider, find: FindProvider,
testSubjects: TestSubjects, testSubjects: TestSubjects,
docTable: DocTableService, docTable: DocTableService,
png: PngService,
screenshots: ScreenshotsService, screenshots: ScreenshotsService,
snapshots: SnapshotsService, snapshots: SnapshotsService,
failureDebugging: FailureDebuggingProvider, failureDebugging: FailureDebuggingProvider,

View file

@ -6,13 +6,13 @@
* Side Public License, v 1. * Side Public License, v 1.
*/ */
import { parse, join } from 'path'; import { join, parse } from 'path';
import Jimp from 'jimp'; import sharp from 'sharp';
import pixelmatch from 'pixelmatch';
import { ToolingLog } from '@kbn/tooling-log'; import { ToolingLog } from '@kbn/tooling-log';
import { promises as fs } from 'fs'; import { promises as fs } from 'fs';
import path from 'path'; import { PNG } from 'pngjs';
export interface PngDescriptor {
interface PngDescriptor {
path: string; path: string;
/** /**
@ -31,11 +31,14 @@ const toDescriptor = (imageInfo: string | PngDescriptor): PngDescriptor => {
}; };
/** /**
* Override Jimp types that expect to be mapped to either string or buffer even though Jimp * Use sharp to open the image and get the metadata
* accepts both https://www.npmjs.com/package/jimp#basic-usage.
*/ */
const toJimp = (imageInfo: string | Buffer): Promise<Jimp> => { const getSharpInstance = async (
return (Jimp.read as (value: string | Buffer) => Promise<Jimp>)(imageInfo); imageInfo: string | Buffer
): Promise<{ instance: sharp.Sharp; metadata: sharp.Metadata }> => {
const instance = sharp(imageInfo).png({ quality: 100, progressive: true }).clone();
const metadata = await instance.metadata();
return { instance, metadata };
}; };
/** /**
@ -46,7 +49,7 @@ const toJimp = (imageInfo: string | Buffer): Promise<Jimp> => {
* @param diffPath * @param diffPath
* @param sessionDirectory * @param sessionDirectory
* @param log * @param log
* @returns Percent * @returns diffRatio
*/ */
export async function comparePngs( export async function comparePngs(
sessionInfo: string | PngDescriptor, sessionInfo: string | PngDescriptor,
@ -58,99 +61,68 @@ export async function comparePngs(
const sessionDescriptor = toDescriptor(sessionInfo); const sessionDescriptor = toDescriptor(sessionInfo);
const baselineDescriptor = toDescriptor(baselineInfo); const baselineDescriptor = toDescriptor(baselineInfo);
log.debug(`comparePngs: ${sessionDescriptor.path} vs ${baselineDescriptor.path}`); let sessionTestPath: string = sessionDescriptor.path;
let baselineTestPath: string = baselineDescriptor.path;
const session = (await toJimp(sessionDescriptor.buffer ?? sessionDescriptor.path)).clone(); log.debug(`comparePngs: ${sessionTestPath} vs ${baselineTestPath}`);
const baseline = (await toJimp(baselineDescriptor.buffer ?? baselineDescriptor.path)).clone();
if ( const { instance: session, metadata: sessionMetadata } = await getSharpInstance(
session.bitmap.width !== baseline.bitmap.width || sessionDescriptor.buffer ?? sessionTestPath
session.bitmap.height !== baseline.bitmap.height
) {
// eslint-disable-next-line no-console
console.log(
'expected height ' + baseline.bitmap.height + ' and width ' + baseline.bitmap.width
); );
// eslint-disable-next-line no-console const sessionWidth = sessionMetadata.width ?? 0;
console.log('actual height ' + session.bitmap.height + ' and width ' + session.bitmap.width); const sessionHeight = sessionMetadata.height ?? 0;
const width = Math.min(session.bitmap.width, baseline.bitmap.width); const { instance: baseline, metadata: baselineMetadata } = await getSharpInstance(
const height = Math.min(session.bitmap.height, baseline.bitmap.height); baselineDescriptor.buffer ?? baselineTestPath
session.resize(width, height); // , Jimp.HORIZONTAL_ALIGN_LEFT | Jimp.VERTICAL_ALIGN_TOP); );
baseline.resize(width, height); // , Jimp.HORIZONTAL_ALIGN_LEFT | Jimp.VERTICAL_ALIGN_TOP); const baselineWidth = baselineMetadata.width ?? 0;
const baselineHeight = baselineMetadata.height ?? 0;
// Adjust screenshot size
const testWidth = Math.min(sessionWidth, baselineWidth);
const testHeight = Math.min(sessionHeight, baselineHeight);
log.debug('baseline height ' + baselineHeight + ' and width ' + baselineWidth);
log.debug('session height ' + sessionHeight + ' and width ' + sessionWidth);
log.debug('test height ' + testHeight + ' and width ' + testWidth);
if (sessionWidth !== baselineWidth || sessionHeight !== baselineHeight) {
sessionTestPath = join(
sessionDirectory,
`${parse(sessionDescriptor.path).name}-session-resized.png`
);
baselineTestPath = join(
sessionDirectory,
`${parse(baselineDescriptor.path).name}-baseline-resized.png`
);
await session.resize(testWidth, testHeight, { fit: 'fill' }).png().toFile(sessionTestPath);
await baseline.resize(testWidth, testHeight, { fit: 'fill' }).png().toFile(baselineTestPath);
} }
session.quality(60);
baseline.quality(60);
log.debug(`calculating diff pixels...`); log.debug(`calculating diff pixels...`);
// Note that this threshold value only affects color comparison from pixel to pixel. It won't have // Note that this threshold value only affects color comparison from pixel to pixel. It won't have
// any affect when comparing neighboring pixels - so slight shifts, font variations, or "blurry-ness" // any affect when comparing neighboring pixels - so slight shifts, font variations, or "blurry-ness"
// will still show up as diffs, but upping this will not help that. Instead we keep the threshold low, and expect // will still show up as diffs, but upping this will not help that. Instead we keep the threshold low, and expect
// some the diffCount to be lower than our own threshold value. // some the diffCount to be lower than our own threshold value.
const THRESHOLD = 0.1; const THRESHOLD = 0.1;
const { image, percent } = Jimp.diff(session, baseline, THRESHOLD); const sessionTestImg = PNG.sync.read(await fs.readFile(sessionTestPath));
log.debug(`percent different: ${percent}`); const baselineTestImg = PNG.sync.read(await fs.readFile(baselineTestPath));
if (percent > 0) { const diff = new PNG({ width: testWidth, height: testHeight });
image.write(diffPath); const mismatchedPixels = pixelmatch(
sessionTestImg.data,
// For debugging purposes it'll help to see the resized images and how they compare. baselineTestImg.data,
session.write( diff.data,
join(sessionDirectory, `${parse(sessionDescriptor.path).name}-session-resized.png`) testWidth,
); testHeight,
baseline.write( {
join(sessionDirectory, `${parse(baselineDescriptor.path).name}-baseline-resized.png`) threshold: THRESHOLD,
);
} }
return percent;
}
export async function checkIfPngsMatch(
actualpngPath: string,
baselinepngPath: string,
screenshotsDirectory: string,
log: any
) {
log.debug(`checkIfpngsMatch: ${actualpngPath} vs ${baselinepngPath}`);
// Copy the pngs into the screenshot session directory, as that's where the generated pngs will automatically be
// stored.
const sessionDirectoryPath = path.resolve(screenshotsDirectory, 'session');
const failureDirectoryPath = path.resolve(screenshotsDirectory, 'failure');
await fs.mkdir(sessionDirectoryPath, { recursive: true });
await fs.mkdir(failureDirectoryPath, { recursive: true });
const actualpngFileName = path.basename(actualpngPath, '.png');
const baselinepngFileName = path.basename(baselinepngPath, '.png');
const baselineCopyPath = path.resolve(
sessionDirectoryPath,
`${baselinepngFileName}_baseline.png`
);
const actualCopyPath = path.resolve(sessionDirectoryPath, `${actualpngFileName}_actual.png`);
// Don't cause a test failure if the baseline snapshot doesn't exist - we don't have all OS's covered and we
// don't want to start causing failures for other devs working on OS's which are lacking snapshots. We have
// mac and linux covered which is better than nothing for now.
try {
log.debug(`writeFile: ${baselineCopyPath}`);
await fs.writeFile(baselineCopyPath, await fs.readFile(baselinepngPath));
} catch (error) {
throw new Error(`No baseline png found at ${baselinepngPath}`);
}
log.debug(`writeFile: ${actualCopyPath}`);
await fs.writeFile(actualCopyPath, await fs.readFile(actualpngPath));
let diffTotal = 0;
const diffPngPath = path.resolve(failureDirectoryPath, `${baselinepngFileName}-${1}.png`);
diffTotal += await comparePngs(
actualCopyPath,
baselineCopyPath,
diffPngPath,
sessionDirectoryPath,
log
); );
return diffTotal; const diffRatio = mismatchedPixels / (testWidth * testHeight);
log.debug(`percent different (ratio): ${diffRatio}`);
if (diffRatio > 0) {
const buffer = PNG.sync.write(diff);
await fs.writeFile(diffPath, buffer);
}
return diffRatio;
} }

View file

@ -10,10 +10,16 @@ import path from 'path';
import type { FtrProviderContext } from '../../functional/ftr_provider_context'; import type { FtrProviderContext } from '../../functional/ftr_provider_context';
// eslint-disable-next-line import/no-default-export // eslint-disable-next-line import/no-default-export
export default function ({ getService, getPageObjects }: FtrProviderContext) { export default function ({
getService,
getPageObjects,
updateBaselines,
}: FtrProviderContext & { updateBaselines: boolean }) {
const PageObjects = getPageObjects(['common', 'reporting']); const PageObjects = getPageObjects(['common', 'reporting']);
const compareImages = getService('compareImages');
const testSubjects = getService('testSubjects'); const testSubjects = getService('testSubjects');
const png = getService('png');
const config = getService('config');
const screenshotDir = config.get('screenshots.directory');
const appId = 'reportingExample'; const appId = 'reportingExample';
@ -35,13 +41,20 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
const url = await PageObjects.reporting.getReportURL(60000); const url = await PageObjects.reporting.getReportURL(60000);
const captureData = await PageObjects.reporting.getRawPdfReportData(url); const captureData = await PageObjects.reporting.getRawPdfReportData(url);
const pngSessionFilePath = await compareImages.writeToSessionFile( const pngSessionFilePath = await PageObjects.reporting.writeSessionReport(
'capture_test_baseline_a', 'capture_test_baseline_a',
captureData 'png',
captureData,
screenshotDir
); );
expect( expect(
await compareImages.checkIfPngsMatch(pngSessionFilePath, fixtures.baselineAPng) await png.compareAgainstBaseline(
pngSessionFilePath,
fixtures.baselineAPng,
screenshotDir,
updateBaselines
)
).to.be.lessThan(0.09); ).to.be.lessThan(0.09);
}); });
}); });

Binary file not shown.

Before

Width:  |  Height:  |  Size: 832 KiB

After

Width:  |  Height:  |  Size: 747 KiB

Before After
Before After

View file

@ -11,17 +11,19 @@ import { FtrProviderContext } from '../../../../ftr_provider_context';
const REPORTS_FOLDER = path.resolve(__dirname, 'reports'); const REPORTS_FOLDER = path.resolve(__dirname, 'reports');
export default function ({ getPageObjects, getService }: FtrProviderContext) { export default function ({
getPageObjects,
getService,
updateBaselines,
}: FtrProviderContext & { updateBaselines: boolean }) {
const PageObjects = getPageObjects(['reporting', 'common', 'dashboard']); const PageObjects = getPageObjects(['reporting', 'common', 'dashboard']);
const esArchiver = getService('esArchiver'); const esArchiver = getService('esArchiver');
const security = getService('security'); const security = getService('security');
const browser = getService('browser'); const browser = getService('browser');
const log = getService('log');
const config = getService('config');
const es = getService('es'); const es = getService('es');
const testSubjects = getService('testSubjects'); const testSubjects = getService('testSubjects');
const kibanaServer = getService('kibanaServer'); const kibanaServer = getService('kibanaServer');
const reporting = getService('reporting'); const png = getService('png');
const ecommerceSOPath = 'x-pack/test/functional/fixtures/kbn_archiver/reporting/ecommerce.json'; const ecommerceSOPath = 'x-pack/test/functional/fixtures/kbn_archiver/reporting/ecommerce.json';
const loadEcommerce = async () => { const loadEcommerce = async () => {
@ -169,11 +171,12 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
reportData, reportData,
REPORTS_FOLDER REPORTS_FOLDER
); );
const percentDiff = await reporting.checkIfPngsMatch(
const percentDiff = await png.compareAgainstBaseline(
sessionReportPath, sessionReportPath,
PageObjects.reporting.getBaselineReportPath(reportFileName, 'png', REPORTS_FOLDER), PageObjects.reporting.getBaselineReportPath(reportFileName, 'png', REPORTS_FOLDER),
config.get('screenshots.directory'), REPORTS_FOLDER,
log updateBaselines
); );
expect(percentDiff).to.be.lessThan(0.09); expect(percentDiff).to.be.lessThan(0.09);
@ -198,11 +201,11 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
reportData, reportData,
REPORTS_FOLDER REPORTS_FOLDER
); );
const percentDiff = await reporting.checkIfPngsMatch( const percentDiff = await png.compareAgainstBaseline(
sessionReportPath, sessionReportPath,
PageObjects.reporting.getBaselineReportPath(reportFileName, 'png', REPORTS_FOLDER), PageObjects.reporting.getBaselineReportPath(reportFileName, 'png', REPORTS_FOLDER),
config.get('screenshots.directory'), REPORTS_FOLDER,
log updateBaselines
); );
expect(percentDiff).to.be.lessThan(0.09); expect(percentDiff).to.be.lessThan(0.09);
@ -303,11 +306,11 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
it('PNG file matches the baseline image', async function () { it('PNG file matches the baseline image', async function () {
this.timeout(300000); this.timeout(300000);
const percentDiff = await reporting.checkIfPngsMatch( const percentDiff = await png.compareAgainstBaseline(
sessionReportPath, sessionReportPath,
PageObjects.reporting.getBaselineReportPath(reportFileName, 'png', REPORTS_FOLDER), PageObjects.reporting.getBaselineReportPath(reportFileName, 'png', REPORTS_FOLDER),
config.get('screenshots.directory'), REPORTS_FOLDER,
log updateBaselines
); );
expect(percentDiff).to.be.lessThan(0.09); expect(percentDiff).to.be.lessThan(0.09);

View file

@ -15,6 +15,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
const config = getService('config'); const config = getService('config');
const log = getService('log'); const log = getService('log');
const reporting = getService('reporting'); const reporting = getService('reporting');
const png = getService('png');
describe('dashboard reporting: creates a map report', () => { describe('dashboard reporting: creates a map report', () => {
// helper function to check the difference between the new image and the baseline // helper function to check the difference between the new image and the baseline
@ -31,11 +32,10 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
log.debug(`session report path: ${sessionReportPath}`); log.debug(`session report path: ${sessionReportPath}`);
expect(sessionReportPath).not.to.be(null); expect(sessionReportPath).not.to.be(null);
return await reporting.checkIfPngsMatch( return await png.checkIfPngsMatch(
sessionReportPath, sessionReportPath,
PageObjects.reporting.getBaselineReportPath(fileName, 'png', REPORTS_FOLDER), PageObjects.reporting.getBaselineReportPath(fileName, 'png', REPORTS_FOLDER),
config.get('screenshots.directory'), config.get('screenshots.directory')
log
); );
}; };

View file

@ -18,7 +18,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
const log = getService('log'); const log = getService('log');
const config = getService('config'); const config = getService('config');
const kibanaServer = getService('kibanaServer'); const kibanaServer = getService('kibanaServer');
const reporting = getService('reporting'); const png = getService('png');
const PageObjects = getPageObjects([ const PageObjects = getPageObjects([
'reporting', 'reporting',
@ -136,11 +136,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
); );
// check the file // check the file
const percentDiff = await reporting.checkIfPngsMatch( const percentDiff = await png.checkIfPngsMatch(
sessionReportPath, sessionReportPath,
PageObjects.reporting.getBaselineReportPath(reportFileName, 'png', REPORTS_FOLDER), PageObjects.reporting.getBaselineReportPath(reportFileName, 'png', REPORTS_FOLDER),
config.get('screenshots.directory'), config.get('screenshots.directory')
log
); );
expect(percentDiff).to.be.lessThan(0.09); expect(percentDiff).to.be.lessThan(0.09);

View file

@ -1,78 +0,0 @@
/*
* 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 path from 'path';
import { promises as fs } from 'fs';
import { comparePngs } from '../../../../test/functional/services/lib/compare_pngs';
import { FtrProviderContext } from '../ftr_provider_context';
export function CompareImagesProvider({ getService }: FtrProviderContext) {
const log = getService('log');
const config = getService('config');
const screenshotsDir = config.get('screenshots.directory');
const writeToSessionFile = async (name: string, rawPdf: Buffer) => {
const sessionDirectory = path.resolve(screenshotsDir, 'session');
await fs.mkdir(sessionDirectory, { recursive: true });
const sessionReportPath = path.resolve(sessionDirectory, `${name}.png`);
await fs.writeFile(sessionReportPath, rawPdf);
return sessionReportPath;
};
return {
writeToSessionFile,
async checkIfPngsMatch(
actualPngPath: string,
baselinePngPath: string,
screenshotsDirectory: string = screenshotsDir
) {
log.debug(`checkIfPngsMatch: ${baselinePngPath}`);
// Copy the pngs into the screenshot session directory, as that's where the generated pngs will automatically be
// stored.
const sessionDirectoryPath = path.resolve(screenshotsDirectory, 'session');
const failureDirectoryPath = path.resolve(screenshotsDirectory, 'failure');
await fs.mkdir(sessionDirectoryPath, { recursive: true });
await fs.mkdir(failureDirectoryPath, { recursive: true });
const actualPngFileName = path.basename(actualPngPath, '.png');
const baselinePngFileName = path.basename(baselinePngPath, '.png');
const baselineCopyPath = path.resolve(
sessionDirectoryPath,
`${baselinePngFileName}_baseline.png`
);
// Don't cause a test failure if the baseline snapshot doesn't exist - we don't have all OS's covered and we
// don't want to start causing failures for other devs working on OS's which are lacking snapshots. We have
// mac and linux covered which is better than nothing for now.
try {
log.debug(`writeFile: ${baselineCopyPath}`);
await fs.writeFile(baselineCopyPath, await fs.readFile(baselinePngPath));
} catch (error) {
throw new Error(`No baseline png found at ${baselinePngPath}`);
}
const actualCopyPath = path.resolve(sessionDirectoryPath, `${actualPngFileName}_actual.png`);
log.debug(`writeFile: ${actualCopyPath}`);
await fs.writeFile(actualCopyPath, await fs.readFile(actualPngPath));
let diffTotal = 0;
const diffPngPath = path.resolve(failureDirectoryPath, `${baselinePngFileName}-${1}.png`);
diffTotal += await comparePngs(
actualCopyPath,
baselineCopyPath,
diffPngPath,
sessionDirectoryPath,
log
);
return diffTotal;
},
};
}

View file

@ -68,7 +68,7 @@ import {
} from './dashboard'; } from './dashboard';
import { SearchSessionsService } from './search_sessions'; import { SearchSessionsService } from './search_sessions';
import { ObservabilityProvider } from './observability'; import { ObservabilityProvider } from './observability';
import { CompareImagesProvider } from './compare_images'; // import { CompareImagesProvider } from './compare_images';
import { CasesServiceProvider } from './cases'; import { CasesServiceProvider } from './cases';
import { AiopsProvider } from './aiops'; import { AiopsProvider } from './aiops';
@ -129,7 +129,7 @@ export const services = {
reporting: ReportingFunctionalProvider, reporting: ReportingFunctionalProvider,
searchSessions: SearchSessionsService, searchSessions: SearchSessionsService,
observability: ObservabilityProvider, observability: ObservabilityProvider,
compareImages: CompareImagesProvider, // compareImages: CompareImagesProvider,
cases: CasesServiceProvider, cases: CasesServiceProvider,
aiops: AiopsProvider, aiops: AiopsProvider,
}; };

View file

@ -15,7 +15,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
const reportingAPI = getService('reportingAPI'); const reportingAPI = getService('reportingAPI');
const reportingFunctional = getService('reportingFunctional'); const reportingFunctional = getService('reportingFunctional');
const browser = getService('browser'); const browser = getService('browser');
const compareImages = getService('compareImages'); const png = getService('png');
const config = getService('config');
const screenshotDir = config.get('screenshots.directory');
describe('Reporting Functional Tests with forced timeout', function () { describe('Reporting Functional Tests with forced timeout', function () {
const dashboardTitle = 'Ecom Dashboard Hidden Panel Titles'; const dashboardTitle = 'Ecom Dashboard Hidden Panel Titles';
@ -48,12 +50,17 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
it('adds a visual warning in the report output', async () => { it('adds a visual warning in the report output', async () => {
const captureData = await PageObjects.reporting.getRawPdfReportData(url); const captureData = await PageObjects.reporting.getRawPdfReportData(url);
const pngSessionFilePath = await compareImages.writeToSessionFile(sessionPng, captureData); const pngSessionFilePath = await PageObjects.reporting.writeSessionReport(
sessionPng,
'png',
captureData,
screenshotDir
);
// allow minor visual differences: https://github.com/elastic/kibana/issues/135309#issuecomment-1169095186 // allow minor visual differences: https://github.com/elastic/kibana/issues/135309#issuecomment-1169095186
expect(await compareImages.checkIfPngsMatch(pngSessionFilePath, baselineAPng)).to.be.lessThan( expect(
0.015 await png.checkIfPngsMatch(pngSessionFilePath, baselineAPng, screenshotDir)
); // this factor of difference allows passing whether or not the page has loaded things like the loading graphics and titlebars ).to.be.lessThan(0.015); // this factor of difference allows passing whether or not the page has loaded things like the loading graphics and titlebars
}); });
}); });
} }

View file

@ -6,7 +6,6 @@
*/ */
import expect from '@kbn/expect'; import expect from '@kbn/expect';
import { checkIfPngsMatch } from '../../../../test/functional/services/lib/compare_pngs';
import { createScenarios as createAPIScenarios } from '../../reporting_api_integration/services/scenarios'; import { createScenarios as createAPIScenarios } from '../../reporting_api_integration/services/scenarios';
import { FtrProviderContext } from '../ftr_provider_context'; import { FtrProviderContext } from '../ftr_provider_context';
@ -162,6 +161,5 @@ export function createScenarios(
tryReportsNotAvailable, tryReportsNotAvailable,
loginDataAnalyst, loginDataAnalyst,
loginReportingUser, loginReportingUser,
checkIfPngsMatch,
}; };
} }

552
yarn.lock
View file

@ -2566,296 +2566,6 @@
"@types/yargs" "^17.0.8" "@types/yargs" "^17.0.8"
chalk "^4.0.0" chalk "^4.0.0"
"@jimp/bmp@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.14.0.tgz#6df246026554f276f7b354047c6fff9f5b2b5182"
integrity sha512-5RkX6tSS7K3K3xNEb2ygPuvyL9whjanhoaB/WmmXlJS6ub4DjTqrapu8j4qnIWmO4YYtFeTbDTXV6v9P1yMA5A==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.14.0"
bmp-js "^0.1.0"
"@jimp/core@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/core/-/core-0.14.0.tgz#870c9ca25b40be353ebda1d2abb48723d9010055"
integrity sha512-S62FcKdtLtj3yWsGfJRdFXSutjvHg7aQNiFogMbwq19RP4XJWqS2nOphu7ScB8KrSlyy5nPF2hkWNhLRLyD82w==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.14.0"
any-base "^1.1.0"
buffer "^5.2.0"
exif-parser "^0.1.12"
file-type "^9.0.0"
load-bmfont "^1.3.1"
mkdirp "^0.5.1"
phin "^2.9.1"
pixelmatch "^4.0.2"
tinycolor2 "^1.4.1"
"@jimp/custom@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/custom/-/custom-0.14.0.tgz#1dbbf0094df7403f4e03bc984ed92e7458842f74"
integrity sha512-kQJMeH87+kWJdVw8F9GQhtsageqqxrvzg7yyOw3Tx/s7v5RToe8RnKyMM+kVtBJtNAG+Xyv/z01uYQ2jiZ3GwA==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/core" "^0.14.0"
"@jimp/gif@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/gif/-/gif-0.14.0.tgz#db159f57c3cfd1566bbe8b124958791998614960"
integrity sha512-DHjoOSfCaCz72+oGGEh8qH0zE6pUBaBxPxxmpYJjkNyDZP7RkbBkZJScIYeQ7BmJxmGN4/dZn+MxamoQlr+UYg==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.14.0"
gifwrap "^0.9.2"
omggif "^1.0.9"
"@jimp/jpeg@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/jpeg/-/jpeg-0.14.0.tgz#8a687a6a653bbbae38c522edef8f84bb418d9461"
integrity sha512-561neGbr+87S/YVQYnZSTyjWTHBm9F6F1obYHiyU3wVmF+1CLbxY3FQzt4YolwyQHIBv36Bo0PY2KkkU8BEeeQ==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.14.0"
jpeg-js "^0.4.0"
"@jimp/plugin-blit@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/plugin-blit/-/plugin-blit-0.14.0.tgz#5eb374be1201313b2113899fb842232d8fcfd345"
integrity sha512-YoYOrnVHeX3InfgbJawAU601iTZMwEBZkyqcP1V/S33Qnz9uzH1Uj1NtC6fNgWzvX6I4XbCWwtr4RrGFb5CFrw==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.14.0"
"@jimp/plugin-blur@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/plugin-blur/-/plugin-blur-0.14.0.tgz#fe07e4932d5a2f5d8c9831e245561553224bfc60"
integrity sha512-9WhZcofLrT0hgI7t0chf7iBQZib//0gJh9WcQMUt5+Q1Bk04dWs8vTgLNj61GBqZXgHSPzE4OpCrrLDBG8zlhQ==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.14.0"
"@jimp/plugin-circle@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/plugin-circle/-/plugin-circle-0.14.0.tgz#82c0e904a34e90fa672fb9c286bc892e92088ddf"
integrity sha512-o5L+wf6QA44tvTum5HeLyLSc5eVfIUd5ZDVi5iRfO4o6GT/zux9AxuTSkKwnjhsG8bn1dDmywAOQGAx7BjrQVA==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.14.0"
"@jimp/plugin-color@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/plugin-color/-/plugin-color-0.14.0.tgz#772bd2d80a88bc66ea1331d010207870f169a74b"
integrity sha512-JJz512SAILYV0M5LzBb9sbOm/XEj2fGElMiHAxb7aLI6jx+n0agxtHpfpV/AePTLm1vzzDxx6AJxXbKv355hBQ==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.14.0"
tinycolor2 "^1.4.1"
"@jimp/plugin-contain@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/plugin-contain/-/plugin-contain-0.14.0.tgz#c68115420d182e696f81bbe76fb5e704909b2b6a"
integrity sha512-RX2q233lGyaxiMY6kAgnm9ScmEkNSof0hdlaJAVDS1OgXphGAYAeSIAwzESZN4x3ORaWvkFefeVH9O9/698Evg==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.14.0"
"@jimp/plugin-cover@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/plugin-cover/-/plugin-cover-0.14.0.tgz#4755322589c5885e44e14e31b86b542e907297ce"
integrity sha512-0P/5XhzWES4uMdvbi3beUgfvhn4YuQ/ny8ijs5kkYIw6K8mHcl820HahuGpwWMx56DJLHRl1hFhJwo9CeTRJtQ==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.14.0"
"@jimp/plugin-crop@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/plugin-crop/-/plugin-crop-0.14.0.tgz#4cbd856ca84ffc37230fad2534906f2f75aa3057"
integrity sha512-Ojtih+XIe6/XSGtpWtbAXBozhCdsDMmy+THUJAGu2x7ZgKrMS0JotN+vN2YC3nwDpYkM+yOJImQeptSfZb2Sug==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.14.0"
"@jimp/plugin-displace@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/plugin-displace/-/plugin-displace-0.14.0.tgz#b0e6a57d00cb1f893f541413fe9d737d23c3b70c"
integrity sha512-c75uQUzMgrHa8vegkgUvgRL/PRvD7paFbFJvzW0Ugs8Wl+CDMGIPYQ3j7IVaQkIS+cAxv+NJ3TIRBQyBrfVEOg==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.14.0"
"@jimp/plugin-dither@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/plugin-dither/-/plugin-dither-0.14.0.tgz#9185ec4c38e02edc9e5831f5d709f6ba891e1b93"
integrity sha512-g8SJqFLyYexXQQsoh4dc1VP87TwyOgeTElBcxSXX2LaaMZezypmxQfLTzOFzZoK8m39NuaoH21Ou1Ftsq7LzVQ==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.14.0"
"@jimp/plugin-fisheye@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/plugin-fisheye/-/plugin-fisheye-0.14.0.tgz#9f26346cf2fbc660cc2008cd7fd30a83b5029e78"
integrity sha512-BFfUZ64EikCaABhCA6mR3bsltWhPpS321jpeIQfJyrILdpFsZ/OccNwCgpW1XlbldDHIoNtXTDGn3E+vCE7vDg==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.14.0"
"@jimp/plugin-flip@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/plugin-flip/-/plugin-flip-0.14.0.tgz#7966d6aa3b5fe1aa4d2d561ff12b8ef5ccb9b071"
integrity sha512-WtL1hj6ryqHhApih+9qZQYA6Ye8a4HAmdTzLbYdTMrrrSUgIzFdiZsD0WeDHpgS/+QMsWwF+NFmTZmxNWqKfXw==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.14.0"
"@jimp/plugin-gaussian@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/plugin-gaussian/-/plugin-gaussian-0.14.0.tgz#452bc1971a4467ad9b984aa67f4c200bf941bb65"
integrity sha512-uaLwQ0XAQoydDlF9tlfc7iD9drYPriFe+jgYnWm8fbw5cN+eOIcnneEX9XCOOzwgLPkNCxGox6Kxjn8zY6GxtQ==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.14.0"
"@jimp/plugin-invert@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/plugin-invert/-/plugin-invert-0.14.0.tgz#cd31a555860e9f821394936d15af161c09c42921"
integrity sha512-UaQW9X9vx8orQXYSjT5VcITkJPwDaHwrBbxxPoDG+F/Zgv4oV9fP+udDD6qmkgI9taU+44Fy+zm/J/gGcMWrdg==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.14.0"
"@jimp/plugin-mask@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/plugin-mask/-/plugin-mask-0.14.0.tgz#52619643ac6222f85e6b27dee33c771ca3a6a4c9"
integrity sha512-tdiGM69OBaKtSPfYSQeflzFhEpoRZ+BvKfDEoivyTjauynbjpRiwB1CaiS8En1INTDwzLXTT0Be9SpI3LkJoEA==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.14.0"
"@jimp/plugin-normalize@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/plugin-normalize/-/plugin-normalize-0.14.0.tgz#bf39e356b6d473f582ce95633ad49c9cdb82492b"
integrity sha512-AfY8sqlsbbdVwFGcyIPy5JH/7fnBzlmuweb+Qtx2vn29okq6+HelLjw2b+VT2btgGUmWWHGEHd86oRGSoWGyEQ==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.14.0"
"@jimp/plugin-print@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/plugin-print/-/plugin-print-0.14.0.tgz#1c43c2a92a7adc05b464863882cb89ce486d63e6"
integrity sha512-MwP3sH+VS5AhhSTXk7pui+tEJFsxnTKFY3TraFJb8WFbA2Vo2qsRCZseEGwpTLhENB7p/JSsLvWoSSbpmxhFAQ==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.14.0"
load-bmfont "^1.4.0"
"@jimp/plugin-resize@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/plugin-resize/-/plugin-resize-0.14.0.tgz#ef7fc6c2e45f8bcab62456baf8fd3bc415b02b64"
integrity sha512-qFeMOyXE/Bk6QXN0GQo89+CB2dQcXqoxUcDb2Ah8wdYlKqpi53skABkgVy5pW3EpiprDnzNDboMltdvDslNgLQ==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.14.0"
"@jimp/plugin-rotate@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/plugin-rotate/-/plugin-rotate-0.14.0.tgz#3632bc159bf1c3b9ec9f459d9c05d02a11781ee7"
integrity sha512-aGaicts44bvpTcq5Dtf93/8TZFu5pMo/61lWWnYmwJJU1RqtQlxbCLEQpMyRhKDNSfPbuP8nyGmaqXlM/82J0Q==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.14.0"
"@jimp/plugin-scale@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/plugin-scale/-/plugin-scale-0.14.0.tgz#d30f0cd1365b8e68f43fa423300ae7f124e9bf10"
integrity sha512-ZcJk0hxY5ZKZDDwflqQNHEGRblgaR+piePZm7dPwPUOSeYEH31P0AwZ1ziceR74zd8N80M0TMft+e3Td6KGBHw==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.14.0"
"@jimp/plugin-shadow@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/plugin-shadow/-/plugin-shadow-0.14.0.tgz#471fdb9f109ff2d9e20d533d45e1e18e0b48c749"
integrity sha512-p2igcEr/iGrLiTu0YePNHyby0WYAXM14c5cECZIVnq/UTOOIQ7xIcWZJ1lRbAEPxVVXPN1UibhZAbr3HAb5BjQ==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.14.0"
"@jimp/plugin-threshold@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/plugin-threshold/-/plugin-threshold-0.14.0.tgz#ebd72721c7d1d518c5bb6e494e55d97ac3351d3b"
integrity sha512-N4BlDgm/FoOMV/DQM2rSpzsgqAzkP0DXkWZoqaQrlRxQBo4zizQLzhEL00T/YCCMKnddzgEhnByaocgaaa0fKw==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.14.0"
"@jimp/plugins@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/plugins/-/plugins-0.14.0.tgz#41dba85f15ab8dadb4162100eb54e5f27b93ee2c"
integrity sha512-vDO3XT/YQlFlFLq5TqNjQkISqjBHT8VMhpWhAfJVwuXIpilxz5Glu4IDLK6jp4IjPR6Yg2WO8TmRY/HI8vLrOw==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/plugin-blit" "^0.14.0"
"@jimp/plugin-blur" "^0.14.0"
"@jimp/plugin-circle" "^0.14.0"
"@jimp/plugin-color" "^0.14.0"
"@jimp/plugin-contain" "^0.14.0"
"@jimp/plugin-cover" "^0.14.0"
"@jimp/plugin-crop" "^0.14.0"
"@jimp/plugin-displace" "^0.14.0"
"@jimp/plugin-dither" "^0.14.0"
"@jimp/plugin-fisheye" "^0.14.0"
"@jimp/plugin-flip" "^0.14.0"
"@jimp/plugin-gaussian" "^0.14.0"
"@jimp/plugin-invert" "^0.14.0"
"@jimp/plugin-mask" "^0.14.0"
"@jimp/plugin-normalize" "^0.14.0"
"@jimp/plugin-print" "^0.14.0"
"@jimp/plugin-resize" "^0.14.0"
"@jimp/plugin-rotate" "^0.14.0"
"@jimp/plugin-scale" "^0.14.0"
"@jimp/plugin-shadow" "^0.14.0"
"@jimp/plugin-threshold" "^0.14.0"
timm "^1.6.1"
"@jimp/png@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/png/-/png-0.14.0.tgz#0f2dddb5125c0795ca7e67c771204c5437fcda4b"
integrity sha512-0RV/mEIDOrPCcNfXSPmPBqqSZYwGADNRVUTyMt47RuZh7sugbYdv/uvKmQSiqRdR0L1sfbCBMWUEa5G/8MSbdA==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.14.0"
pngjs "^3.3.3"
"@jimp/tiff@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/tiff/-/tiff-0.14.0.tgz#a5b25bbe7c43fc3b07bad4e2ab90e0e164c1967f"
integrity sha512-zBYDTlutc7j88G/7FBCn3kmQwWr0rmm1e0FKB4C3uJ5oYfT8645lftUsvosKVUEfkdmOaMAnhrf4ekaHcb5gQw==
dependencies:
"@babel/runtime" "^7.7.2"
utif "^2.0.1"
"@jimp/types@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/types/-/types-0.14.0.tgz#ef681ff702883c5f105b5e4e30d49abf39ee9e34"
integrity sha512-hx3cXAW1KZm+b+XCrY3LXtdWy2U+hNtq0rPyJ7NuXCjU7lZR3vIkpz1DLJ3yDdS70hTi5QDXY3Cd9kd6DtloHQ==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/bmp" "^0.14.0"
"@jimp/gif" "^0.14.0"
"@jimp/jpeg" "^0.14.0"
"@jimp/png" "^0.14.0"
"@jimp/tiff" "^0.14.0"
timm "^1.6.1"
"@jimp/utils@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@jimp/utils/-/utils-0.14.0.tgz#296254e63118554c62c31c19ac6b8c4bfe6490e5"
integrity sha512-MY5KFYUru0y74IsgM/9asDwb3ERxWxXEu3CRCZEvE7DtT86y1bR1XgtlSliMrptjz4qbivNGMQSvUBpEFJDp1A==
dependencies:
"@babel/runtime" "^7.7.2"
regenerator-runtime "^0.13.3"
"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2":
version "0.3.2" version "0.3.2"
resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9"
@ -8235,6 +7945,13 @@
resolved "https://registry.yarnpkg.com/@types/pegjs/-/pegjs-0.10.1.tgz#9a2f3961dc62430fdb21061eb0ddbd890f9e3b94" resolved "https://registry.yarnpkg.com/@types/pegjs/-/pegjs-0.10.1.tgz#9a2f3961dc62430fdb21061eb0ddbd890f9e3b94"
integrity sha512-ra8IchO9odGQmYKbm+94K58UyKCEKdZh9y0vxhG4pIpOJOBlC1C+ZtBVr6jLs+/oJ4pl+1p/4t3JtBA8J10Vvw== integrity sha512-ra8IchO9odGQmYKbm+94K58UyKCEKdZh9y0vxhG4pIpOJOBlC1C+ZtBVr6jLs+/oJ4pl+1p/4t3JtBA8J10Vvw==
"@types/pixelmatch@^5.2.4":
version "5.2.4"
resolved "https://registry.yarnpkg.com/@types/pixelmatch/-/pixelmatch-5.2.4.tgz#ca145cc5ede1388c71c68edf2d1f5190e5ddd0f6"
integrity sha512-HDaSHIAv9kwpMN7zlmwfTv6gax0PiporJOipcrGsVNF3Ba+kryOZc0Pio5pn6NhisgWr7TaajlPEKTbTAypIBQ==
dependencies:
"@types/node" "*"
"@types/pngjs@^3.4.0": "@types/pngjs@^3.4.0":
version "3.4.2" version "3.4.2"
resolved "https://registry.yarnpkg.com/@types/pngjs/-/pngjs-3.4.2.tgz#8dc49b45fbcf18a5873179e3664f049388e39ecf" resolved "https://registry.yarnpkg.com/@types/pngjs/-/pngjs-3.4.2.tgz#8dc49b45fbcf18a5873179e3664f049388e39ecf"
@ -8553,6 +8270,13 @@
resolved "https://registry.yarnpkg.com/@types/set-value/-/set-value-2.0.0.tgz#63d386b103926dcf49b50e16e0f6dd49983046be" resolved "https://registry.yarnpkg.com/@types/set-value/-/set-value-2.0.0.tgz#63d386b103926dcf49b50e16e0f6dd49983046be"
integrity sha512-k8dCJEC80F/mbsIOZ5Hj3YSzTVVVBwMdtP/M9Rtc2TM4F5etVd+2UG8QUiAUfbXm4fABedL2tBZnrBheY7UwpA== integrity sha512-k8dCJEC80F/mbsIOZ5Hj3YSzTVVVBwMdtP/M9Rtc2TM4F5etVd+2UG8QUiAUfbXm4fABedL2tBZnrBheY7UwpA==
"@types/sharp@^0.30.4":
version "0.30.4"
resolved "https://registry.yarnpkg.com/@types/sharp/-/sharp-0.30.4.tgz#7430b5fcf37f35dd860112c4cf6dcd6a1ba0011b"
integrity sha512-6oJEzKt7wZeS7e+6x9QFEOWGs0T/6of00+0onZGN1zSmcSjcTDZKgIGZ6YWJnHowpaKUCFBPH52mYljWqU32Eg==
dependencies:
"@types/node" "*"
"@types/sinon@^7.0.13": "@types/sinon@^7.0.13":
version "7.0.13" version "7.0.13"
resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-7.0.13.tgz#ca039c23a9e27ebea53e0901ef928ea2a1a6d313" resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-7.0.13.tgz#ca039c23a9e27ebea53e0901ef928ea2a1a6d313"
@ -9558,11 +9282,6 @@ antlr4ts@^0.5.0-alpha.3:
resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.3.tgz#fa6d39d88d6b96341a8afef45867af9abcb38766" resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.3.tgz#fa6d39d88d6b96341a8afef45867af9abcb38766"
integrity sha512-La89tKkGcHFIVuruv4Bm1esc3zLmES2NOTEwwNS1pudz+zx/0FNqQeUu9p48i9/QHKPVqjN87LB+q3buTg7oDQ== integrity sha512-La89tKkGcHFIVuruv4Bm1esc3zLmES2NOTEwwNS1pudz+zx/0FNqQeUu9p48i9/QHKPVqjN87LB+q3buTg7oDQ==
any-base@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/any-base/-/any-base-1.1.0.tgz#ae101a62bc08a597b4c9ab5b7089d456630549fe"
integrity sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==
any-observable@^0.3.0: any-observable@^0.3.0:
version "0.3.0" version "0.3.0"
resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b"
@ -9639,7 +9358,7 @@ append-transform@^2.0.0:
dependencies: dependencies:
default-require-extensions "^3.0.0" default-require-extensions "^3.0.0"
aproba@^1.0.3, "aproba@^1.0.3 || ^2.0.0", aproba@^1.1.1: "aproba@^1.0.3 || ^2.0.0", aproba@^1.1.1:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
@ -9699,14 +9418,6 @@ are-we-there-yet@^3.0.0:
delegates "^1.0.0" delegates "^1.0.0"
readable-stream "^3.6.0" readable-stream "^3.6.0"
are-we-there-yet@~1.1.2:
version "1.1.4"
resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d"
integrity sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=
dependencies:
delegates "^1.0.0"
readable-stream "^2.0.6"
arg@^4.1.0: arg@^4.1.0:
version "4.1.3" version "4.1.3"
resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
@ -10516,11 +10227,6 @@ bluebird@3.7.2, bluebird@^3.3.5, bluebird@^3.5.0, bluebird@^3.5.1, bluebird@^3.5
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
bmp-js@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.1.0.tgz#e05a63f796a6c1ff25f4771ec7adadc148c07233"
integrity sha1-4Fpj95amwf8l9Hcex62twUjAcjM=
bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.11.9: bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.11.9:
version "4.11.9" version "4.11.9"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828"
@ -10918,7 +10624,7 @@ buffer@^4.3.0:
ieee754 "^1.1.4" ieee754 "^1.1.4"
isarray "^1.0.0" isarray "^1.0.0"
buffer@^5.2.0, buffer@^5.2.1, buffer@^5.5.0, buffer@^5.6.0: buffer@^5.2.1, buffer@^5.5.0, buffer@^5.6.0:
version "5.7.1" version "5.7.1"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
@ -11748,7 +11454,7 @@ color@3.0.x:
color-convert "^1.9.1" color-convert "^1.9.1"
color-string "^1.5.2" color-string "^1.5.2"
color@^4.2.1, color@^4.2.3: color@^4.2.3:
version "4.2.3" version "4.2.3"
resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a"
integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==
@ -11988,7 +11694,7 @@ console-browserify@^1.1.0:
dependencies: dependencies:
date-now "^0.1.4" date-now "^0.1.4"
console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0: console-control-strings@^1.0.0, console-control-strings@^1.1.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
@ -14878,11 +14584,6 @@ executable@^4.1.1:
dependencies: dependencies:
pify "^2.2.0" pify "^2.2.0"
exif-parser@^0.1.12:
version "0.1.12"
resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922"
integrity sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=
exit-hook@^2.2.0: exit-hook@^2.2.0:
version "2.2.0" version "2.2.0"
resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-2.2.0.tgz#f5502f92179018e867f2d8ee4428392da7f3894e" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-2.2.0.tgz#f5502f92179018e867f2d8ee4428392da7f3894e"
@ -15327,16 +15028,6 @@ file-system-cache@^1.0.5:
fs-extra "^0.30.0" fs-extra "^0.30.0"
ramda "^0.21.0" ramda "^0.21.0"
file-type@^10.9.0:
version "10.9.0"
resolved "https://registry.yarnpkg.com/file-type/-/file-type-10.9.0.tgz#f6c12c7cb9e6b8aeefd6917555fd4f9eadf31891"
integrity sha512-9C5qtGR/fNibHC5gzuMmmgnjH3QDDLKMa8lYe9CiZVmAnI4aUaoMh40QyUPzzs0RYo837SOBKh7TYwle4G8E4w==
file-type@^9.0.0:
version "9.0.0"
resolved "https://registry.yarnpkg.com/file-type/-/file-type-9.0.0.tgz#a68d5ad07f486414dfb2c8866f73161946714a18"
integrity sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==
filelist@^1.0.1: filelist@^1.0.1:
version "1.0.4" version "1.0.4"
resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5"
@ -15820,20 +15511,6 @@ gauge@^4.0.0:
strip-ansi "^6.0.1" strip-ansi "^6.0.1"
wide-align "^1.1.5" wide-align "^1.1.5"
gauge@~2.7.3:
version "2.7.4"
resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=
dependencies:
aproba "^1.0.3"
console-control-strings "^1.0.0"
has-unicode "^2.0.0"
object-assign "^4.1.0"
signal-exit "^3.0.0"
string-width "^1.0.1"
strip-ansi "^3.0.1"
wide-align "^1.1.0"
gaze@^1.0.0: gaze@^1.0.0:
version "1.1.3" version "1.1.3"
resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a"
@ -15999,14 +15676,6 @@ gif-encoder@~0.4.1:
dependencies: dependencies:
readable-stream "~1.1.9" readable-stream "~1.1.9"
gifwrap@^0.9.2:
version "0.9.2"
resolved "https://registry.yarnpkg.com/gifwrap/-/gifwrap-0.9.2.tgz#348e286e67d7cf57942172e1e6f05a71cee78489"
integrity sha512-fcIswrPaiCDAyO8xnWvHSZdWChjKXUanKKpAiWWJ/UTkEi/aYKn5+90e7DE820zbEaVR9CE2y4z9bzhQijZ0BA==
dependencies:
image-q "^1.1.1"
omggif "^1.0.10"
git-hooks-list@1.0.3: git-hooks-list@1.0.3:
version "1.0.3" version "1.0.3"
resolved "https://registry.yarnpkg.com/git-hooks-list/-/git-hooks-list-1.0.3.tgz#be5baaf78203ce342f2f844a9d2b03dba1b45156" resolved "https://registry.yarnpkg.com/git-hooks-list/-/git-hooks-list-1.0.3.tgz#be5baaf78203ce342f2f844a9d2b03dba1b45156"
@ -16168,14 +15837,6 @@ global@^4.3.1, global@^4.4.0:
min-document "^2.19.0" min-document "^2.19.0"
process "^0.11.10" process "^0.11.10"
global@~4.3.0:
version "4.3.2"
resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f"
integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=
dependencies:
min-document "^2.19.0"
process "~0.5.1"
globals@^11.1.0, globals@^11.12.0: globals@^11.1.0, globals@^11.12.0:
version "11.12.0" version "11.12.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
@ -16521,7 +16182,7 @@ has-tostringtag@^1.0.0:
dependencies: dependencies:
has-symbols "^1.0.2" has-symbols "^1.0.2"
has-unicode@^2.0.0, has-unicode@^2.0.1: has-unicode@^2.0.1:
version "2.0.1" version "2.0.1"
resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
@ -17156,11 +16817,6 @@ ignore@^5.0.5, ignore@^5.1.1, ignore@^5.1.4, ignore@^5.1.8, ignore@^5.2.0:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
image-q@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/image-q/-/image-q-1.1.1.tgz#fc84099664460b90ca862d9300b6bfbbbfbf8056"
integrity sha1-/IQJlmRGC5DKhi2TALa/u7+/gFY=
image-size@^0.8.2: image-size@^0.8.2:
version "0.8.3" version "0.8.3"
resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.8.3.tgz#f0b568857e034f29baffd37013587f2c0cad8b46" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.8.3.tgz#f0b568857e034f29baffd37013587f2c0cad8b46"
@ -17672,7 +17328,7 @@ is-fullwidth-code-point@^3.0.0:
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
is-function@^1.0.1, is-function@^1.0.2: is-function@^1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08"
integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==
@ -18769,17 +18425,6 @@ jest@^26.6.3:
import-local "^3.0.2" import-local "^3.0.2"
jest-cli "^26.6.3" jest-cli "^26.6.3"
jimp@^0.14.0:
version "0.14.0"
resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.14.0.tgz#fde55f69bdb918c1b01ac633d89a25853af85625"
integrity sha512-8BXU+J8+SPmwwyq9ELihpSV4dWPTiOKBWCEgtkbnxxAVMjXdf3yGmyaLSshBfXc8sP/JQ9OZj5R8nZzz2wPXgA==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/custom" "^0.14.0"
"@jimp/plugins" "^0.14.0"
"@jimp/types" "^0.14.0"
regenerator-runtime "^0.13.3"
joi@*, joi@^17.3.0, joi@^17.4.0: joi@*, joi@^17.3.0, joi@^17.4.0:
version "17.4.0" version "17.4.0"
resolved "https://registry.yarnpkg.com/joi/-/joi-17.4.0.tgz#b5c2277c8519e016316e49ababd41a1908d9ef20" resolved "https://registry.yarnpkg.com/joi/-/joi-17.4.0.tgz#b5c2277c8519e016316e49ababd41a1908d9ef20"
@ -18801,7 +18446,7 @@ jpeg-js@^0.3.2:
resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.3.7.tgz#471a89d06011640592d314158608690172b1028d" resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.3.7.tgz#471a89d06011640592d314158608690172b1028d"
integrity sha512-9IXdWudL61npZjvLuVe/ktHiA41iE8qFyLB+4VDTblEsWBzeg8WQTlktdUK4CdncUqtUgUg0bbOmTE2bKBKaBQ== integrity sha512-9IXdWudL61npZjvLuVe/ktHiA41iE8qFyLB+4VDTblEsWBzeg8WQTlktdUK4CdncUqtUgUg0bbOmTE2bKBKaBQ==
jpeg-js@^0.4.0, jpeg-js@^0.4.2: jpeg-js@^0.4.2:
version "0.4.3" version "0.4.3"
resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.3.tgz#6158e09f1983ad773813704be80680550eff977b" resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.3.tgz#6158e09f1983ad773813704be80680550eff977b"
integrity sha512-ru1HWKek8octvUHFHvE5ZzQ1yAsJmIvRdGWvSoKV52XKyuyYA437QWDttXT8eZXDSbuMpHlLzPDZUPd6idIz+Q== integrity sha512-ru1HWKek8octvUHFHvE5ZzQ1yAsJmIvRdGWvSoKV52XKyuyYA437QWDttXT8eZXDSbuMpHlLzPDZUPd6idIz+Q==
@ -19442,20 +19087,6 @@ lmdb-store@^1.6.11:
optionalDependencies: optionalDependencies:
msgpackr "^1.4.7" msgpackr "^1.4.7"
load-bmfont@^1.3.1, load-bmfont@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.0.tgz#75f17070b14a8c785fe7f5bee2e6fd4f98093b6b"
integrity sha512-kT63aTAlNhZARowaNYcY29Fn/QYkc52M3l6V1ifRcPewg2lvUZDAj7R6dXjOL9D0sict76op3T5+odumDSF81g==
dependencies:
buffer-equal "0.0.1"
mime "^1.3.4"
parse-bmfont-ascii "^1.0.3"
parse-bmfont-binary "^1.0.5"
parse-bmfont-xml "^1.1.4"
phin "^2.9.1"
xhr "^2.0.1"
xtend "^4.0.0"
load-json-file@^4.0.0: load-json-file@^4.0.0:
version "4.0.0" version "4.0.0"
resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b"
@ -20320,7 +19951,7 @@ mime-types@^2.0.1, mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, m
dependencies: dependencies:
mime-db "1.51.0" mime-db "1.51.0"
mime@1.6.0, mime@^1.3.4, mime@^1.4.1: mime@1.6.0, mime@^1.4.1:
version "1.6.0" version "1.6.0"
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
@ -20929,10 +20560,10 @@ node-addon-api@^3.0.0:
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161"
integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==
node-addon-api@^4.3.0: node-addon-api@^5.0.0:
version "4.3.0" version "5.0.0"
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.0.0.tgz#7d7e6f9ef89043befdb20c1989c905ebde18c501"
integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== integrity sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==
node-bitmap@0.0.1: node-bitmap@0.0.1:
version "0.0.1" version "0.0.1"
@ -21201,16 +20832,6 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1:
dependencies: dependencies:
path-key "^3.0.0" path-key "^3.0.0"
npmlog@^4.0.1:
version "4.1.2"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
dependencies:
are-we-there-yet "~1.1.2"
console-control-strings "~1.1.0"
gauge "~2.7.3"
set-blocking "~2.0.0"
npmlog@^5.0.0, npmlog@^5.0.1: npmlog@^5.0.0, npmlog@^5.0.1:
version "5.0.1" version "5.0.1"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0"
@ -21462,7 +21083,7 @@ octokit-pagination-methods@^1.1.0:
resolved "https://registry.yarnpkg.com/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz#cf472edc9d551055f9ef73f6e42b4dbb4c80bea4" resolved "https://registry.yarnpkg.com/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz#cf472edc9d551055f9ef73f6e42b4dbb4c80bea4"
integrity sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ== integrity sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ==
omggif@^1.0.10, omggif@^1.0.5, omggif@^1.0.9: omggif@^1.0.5:
version "1.0.10" version "1.0.10"
resolved "https://registry.yarnpkg.com/omggif/-/omggif-1.0.10.tgz#ddaaf90d4a42f532e9e7cb3a95ecdd47f17c7b19" resolved "https://registry.yarnpkg.com/omggif/-/omggif-1.0.10.tgz#ddaaf90d4a42f532e9e7cb3a95ecdd47f17c7b19"
integrity sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw== integrity sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==
@ -21852,7 +21473,7 @@ pako@^0.2.5:
resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75"
integrity sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU= integrity sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=
pako@^1.0.3, pako@^1.0.5, pako@~1.0.2, pako@~1.0.5: pako@^1.0.3, pako@~1.0.2, pako@~1.0.5:
version "1.0.11" version "1.0.11"
resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
@ -21909,24 +21530,6 @@ parse-asn1@^5.0.0:
evp_bytestokey "^1.0.0" evp_bytestokey "^1.0.0"
pbkdf2 "^3.0.3" pbkdf2 "^3.0.3"
parse-bmfont-ascii@^1.0.3:
version "1.0.6"
resolved "https://registry.yarnpkg.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz#11ac3c3ff58f7c2020ab22769079108d4dfa0285"
integrity sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=
parse-bmfont-binary@^1.0.5:
version "1.0.6"
resolved "https://registry.yarnpkg.com/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz#d038b476d3e9dd9db1e11a0b0e53a22792b69006"
integrity sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=
parse-bmfont-xml@^1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz#015319797e3e12f9e739c4d513872cd2fa35f389"
integrity sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==
dependencies:
xml-parse-from-string "^1.0.0"
xml2js "^0.4.5"
parse-data-uri@^0.2.0: parse-data-uri@^0.2.0:
version "0.2.0" version "0.2.0"
resolved "https://registry.yarnpkg.com/parse-data-uri/-/parse-data-uri-0.2.0.tgz#bf04d851dd5c87b0ab238e5d01ace494b604b4c9" resolved "https://registry.yarnpkg.com/parse-data-uri/-/parse-data-uri-0.2.0.tgz#bf04d851dd5c87b0ab238e5d01ace494b604b4c9"
@ -21946,11 +21549,6 @@ parse-entities@^2.0.0:
is-decimal "^1.0.0" is-decimal "^1.0.0"
is-hexadecimal "^1.0.0" is-hexadecimal "^1.0.0"
parse-headers@^2.0.0:
version "2.0.5"
resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9"
integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==
parse-json@^4.0.0: parse-json@^4.0.0:
version "4.0.0" version "4.0.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
@ -22177,11 +21775,6 @@ performance-now@^2.1.0:
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
phin@^2.9.1:
version "2.9.3"
resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c"
integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==
picocolors@^0.2.1: picocolors@^0.2.1:
version "0.2.1" version "0.2.1"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f"
@ -22257,12 +21850,12 @@ piscina@^3.2.0:
optionalDependencies: optionalDependencies:
nice-napi "^1.0.2" nice-napi "^1.0.2"
pixelmatch@^4.0.2: pixelmatch@^5.3.0:
version "4.0.2" version "5.3.0"
resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854" resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-5.3.0.tgz#5e5321a7abedfb7962d60dbf345deda87cb9560a"
integrity sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ= integrity sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q==
dependencies: dependencies:
pngjs "^3.0.0" pngjs "^6.0.0"
pkg-dir@4.2.0, pkg-dir@^4.1.0, pkg-dir@^4.2.0: pkg-dir@4.2.0, pkg-dir@^4.1.0, pkg-dir@^4.2.0:
version "4.2.0" version "4.2.0"
@ -22392,7 +21985,7 @@ pngjs-nozlib@^1.0.0:
resolved "https://registry.yarnpkg.com/pngjs-nozlib/-/pngjs-nozlib-1.0.0.tgz#9e64d602cfe9cce4d9d5997d0687429a73f0b7d7" resolved "https://registry.yarnpkg.com/pngjs-nozlib/-/pngjs-nozlib-1.0.0.tgz#9e64d602cfe9cce4d9d5997d0687429a73f0b7d7"
integrity sha1-nmTWAs/pzOTZ1Zl9BodCmnPwt9c= integrity sha1-nmTWAs/pzOTZ1Zl9BodCmnPwt9c=
pngjs@^3.0.0, pngjs@^3.3.3, pngjs@^3.4.0: pngjs@^3.3.3, pngjs@^3.4.0:
version "3.4.0" version "3.4.0"
resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f"
integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==
@ -22402,6 +21995,11 @@ pngjs@^5.0.0:
resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb"
integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==
pngjs@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-6.0.0.tgz#ca9e5d2aa48db0228a52c419c3308e87720da821"
integrity sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==
pnp-webpack-plugin@1.6.4: pnp-webpack-plugin@1.6.4:
version "1.6.4" version "1.6.4"
resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149"
@ -22756,10 +22354,10 @@ preact-render-to-string@^5.1.19:
dependencies: dependencies:
pretty-format "^3.8.0" pretty-format "^3.8.0"
prebuild-install@^7.0.1: prebuild-install@^7.1.1:
version "7.0.1" version "7.1.1"
resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.0.1.tgz#c10075727c318efe72412f333e0ef625beaf3870" resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45"
integrity sha512-QBSab31WqkyxpnMWQxubYAHR5S9B2+r81ucocew34Fkl98FhvKIF50jIJnNOBmAZfyNV7vE5T6gd3hTVWgY6tg== integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==
dependencies: dependencies:
detect-libc "^2.0.0" detect-libc "^2.0.0"
expand-template "^2.0.3" expand-template "^2.0.3"
@ -22768,7 +22366,6 @@ prebuild-install@^7.0.1:
mkdirp-classic "^0.5.3" mkdirp-classic "^0.5.3"
napi-build-utils "^1.0.1" napi-build-utils "^1.0.1"
node-abi "^3.3.0" node-abi "^3.3.0"
npmlog "^4.0.1"
pump "^3.0.0" pump "^3.0.0"
rc "^1.2.7" rc "^1.2.7"
simple-get "^4.0.0" simple-get "^4.0.0"
@ -22905,11 +22502,6 @@ process@^0.11.10, process@~0.11.0:
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
process@~0.5.1:
version "0.5.2"
resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf"
integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=
progress@2.0.1: progress@2.0.1:
version "2.0.1" version "2.0.1"
resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.1.tgz#c9242169342b1c29d275889c95734621b1952e31" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.1.tgz#c9242169342b1c29d275889c95734621b1952e31"
@ -24113,7 +23705,7 @@ read-pkg@^5.2.0:
parse-json "^5.0.0" parse-json "^5.0.0"
type-fest "^0.6.0" type-fest "^0.6.0"
"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@~2.3.3, readable-stream@~2.3.6: "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@~2.3.3, readable-stream@~2.3.6:
version "2.3.7" version "2.3.7"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
@ -24319,7 +23911,7 @@ regenerator-runtime@^0.11.0:
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
regenerator-runtime@^0.13.1, regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: regenerator-runtime@^0.13.1, regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7:
version "0.13.7" version "0.13.7"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55"
integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==
@ -25273,6 +24865,13 @@ semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@~7.3.2:
dependencies: dependencies:
lru-cache "^6.0.0" lru-cache "^6.0.0"
semver@^7.3.7:
version "7.3.7"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f"
integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==
dependencies:
lru-cache "^6.0.0"
send@0.17.2: send@0.17.2:
version "0.17.2" version "0.17.2"
resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820"
@ -25347,7 +24946,7 @@ serve-static@1.14.2:
parseurl "~1.3.3" parseurl "~1.3.3"
send "0.17.2" send "0.17.2"
set-blocking@^2.0.0, set-blocking@~2.0.0: set-blocking@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
@ -25433,15 +25032,15 @@ shallowequal@^1.1.0:
integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==
sharp@^0.30.1: sharp@^0.30.1:
version "0.30.3" version "0.30.7"
resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.30.3.tgz#315a1817423a4d1cde5119a21c99c234a7a6fb37" resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.30.7.tgz#7862bda98804fdd1f0d5659c85e3324b90d94c7c"
integrity sha512-rjpfJFK58ZOFSG8sxYSo3/JQb4ej095HjXp9X7gVu7gEn1aqSG8TCW29h/Rr31+PXrFADo1H/vKfw0uhMQWFtg== integrity sha512-G+MY2YW33jgflKPTXXptVO28HvNOo9G3j0MybYAHeEmby+QuD2U98dT6ueht9cv/XDqZspSpIhoSW+BAKJ7Hig==
dependencies: dependencies:
color "^4.2.1" color "^4.2.3"
detect-libc "^2.0.1" detect-libc "^2.0.1"
node-addon-api "^4.3.0" node-addon-api "^5.0.0"
prebuild-install "^7.0.1" prebuild-install "^7.1.1"
semver "^7.3.5" semver "^7.3.7"
simple-get "^4.0.1" simple-get "^4.0.1"
tar-fs "^2.1.1" tar-fs "^2.1.1"
tunnel-agent "^0.6.0" tunnel-agent "^0.6.0"
@ -27009,11 +26608,6 @@ timers-ext@^0.1.5:
es5-ext "~0.10.46" es5-ext "~0.10.46"
next-tick "1" next-tick "1"
timm@^1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/timm/-/timm-1.6.1.tgz#5f8aafc932248c76caf2c6af60542a32d3c30701"
integrity sha512-hqDTYi/bWuDxL2i6T3v6nrvkAQ/1Bc060GSkVEQZp02zTSTB4CHSKsOkliequCftQaNRcjRqUZmpGWs5FfhrNg==
tiny-inflate@^1.0.0, tiny-inflate@^1.0.2: tiny-inflate@^1.0.0, tiny-inflate@^1.0.2:
version "1.0.3" version "1.0.3"
resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz#122715494913a1805166aaf7c93467933eea26c4" resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz#122715494913a1805166aaf7c93467933eea26c4"
@ -28012,13 +27606,6 @@ usng.js@^0.4.5:
resolved "https://registry.yarnpkg.com/usng.js/-/usng.js-0.4.5.tgz#49301e131baa9f7f7ab36c0539472c1aa1ecdae7" resolved "https://registry.yarnpkg.com/usng.js/-/usng.js-0.4.5.tgz#49301e131baa9f7f7ab36c0539472c1aa1ecdae7"
integrity sha512-JTJcFFDy/JqA5iiU8DqMOV5gJiL3ZdXH0hCKYaRMDbbredhFna5Ok4C1YDFU07mTGAgm+5FzHaaOzQnO/3BzWQ== integrity sha512-JTJcFFDy/JqA5iiU8DqMOV5gJiL3ZdXH0hCKYaRMDbbredhFna5Ok4C1YDFU07mTGAgm+5FzHaaOzQnO/3BzWQ==
utif@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/utif/-/utif-2.0.1.tgz#9e1582d9bbd20011a6588548ed3266298e711759"
integrity sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==
dependencies:
pako "^1.0.5"
util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
@ -29058,7 +28645,7 @@ which@^2.0.1, which@^2.0.2:
dependencies: dependencies:
isexe "^2.0.0" isexe "^2.0.0"
wide-align@^1.1.0, wide-align@^1.1.2, wide-align@^1.1.5: wide-align@^1.1.2, wide-align@^1.1.5:
version "1.1.5" version "1.1.5"
resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3"
integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==
@ -29266,16 +28853,6 @@ xdg-basedir@^4.0.0:
resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==
xhr@^2.0.1:
version "2.4.1"
resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.4.1.tgz#ba982cced205ae5eec387169ac9dc77ca4853d38"
integrity sha512-pAIU5vBr9Hiy5cpFIbPnwf0C18ZF86DBsZKrlsf87N5De/JbA6RJ83UP/cv+aljl4S40iRVMqP4pr4sF9Dnj0A==
dependencies:
global "~4.3.0"
is-function "^1.0.1"
parse-headers "^2.0.0"
xtend "^4.0.0"
xml-crypto@^2.1.4: xml-crypto@^2.1.4:
version "2.1.4" version "2.1.4"
resolved "https://registry.yarnpkg.com/xml-crypto/-/xml-crypto-2.1.4.tgz#85b3c62fa0debc4956ee72cb2dfee65651e865b5" resolved "https://registry.yarnpkg.com/xml-crypto/-/xml-crypto-2.1.4.tgz#85b3c62fa0debc4956ee72cb2dfee65651e865b5"
@ -29289,12 +28866,7 @@ xml-name-validator@^3.0.0:
resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==
xml-parse-from-string@^1.0.0: xml2js@^0.4.22:
version "1.0.1"
resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28"
integrity sha1-qQKekp09vN7RafPG4oI42VpdWig=
xml2js@^0.4.22, xml2js@^0.4.5:
version "0.4.22" version "0.4.22"
resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.22.tgz#4fa2d846ec803237de86f30aa9b5f70b6600de02" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.22.tgz#4fa2d846ec803237de86f30aa9b5f70b6600de02"
integrity sha512-MWTbxAQqclRSTnehWWe5nMKzI3VmJ8ltiJEco8akcC6j3miOhjjfzKum5sId+CWhfxdOs/1xauYr8/ZDBtQiRw== integrity sha512-MWTbxAQqclRSTnehWWe5nMKzI3VmJ8ltiJEco8akcC6j3miOhjjfzKum5sId+CWhfxdOs/1xauYr8/ZDBtQiRw==