diff --git a/apps/ngrid-dev-app-e2e/src/__snapshots__/.gitkeep b/apps/ngrid-dev-app-e2e/src/__snapshots__/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/apps/ngrid-dev-app-e2e/src/integration/ngrid/column-width/column-width.component.spec.ts b/apps/ngrid-dev-app-e2e/src/integration/ngrid/column-width/column-width.component.spec.ts new file mode 100644 index 000000000..705d45537 --- /dev/null +++ b/apps/ngrid-dev-app-e2e/src/integration/ngrid/column-width/column-width.component.spec.ts @@ -0,0 +1,7 @@ +describe('ngrid-dev-app', () => { + beforeEach(() => cy.visit('/ngrid-column-width')); + + it('should display welcome message', () => { + cy.matchImageSnapshot('column-width.component'); + }); +}); diff --git a/apps/ngrid-dev-app-e2e/src/plugins/index.js b/apps/ngrid-dev-app-e2e/src/plugins/index.js index 9067e75a2..a77728ce1 100644 --- a/apps/ngrid-dev-app-e2e/src/plugins/index.js +++ b/apps/ngrid-dev-app-e2e/src/plugins/index.js @@ -11,6 +11,7 @@ // This function is called when a project is opened or re-opened (e.g. due to // the project's config changing) +const { addMatchImageSnapshotPlugin } = require('cypress-image-snapshot/plugin'); const { preprocessTypescript } = require('@nrwl/cypress/plugins/preprocessor'); module.exports = (on, config) => { @@ -19,4 +20,6 @@ module.exports = (on, config) => { // Preprocess Typescript file using Nx helper on('file:preprocessor', preprocessTypescript(config)); + + addMatchImageSnapshotPlugin(on, config); }; diff --git a/apps/ngrid-dev-app-e2e/src/support/app.po.ts b/apps/ngrid-dev-app-e2e/src/support/app.po.ts deleted file mode 100644 index 329342469..000000000 --- a/apps/ngrid-dev-app-e2e/src/support/app.po.ts +++ /dev/null @@ -1 +0,0 @@ -export const getGreeting = () => cy.get('h1'); diff --git a/apps/ngrid-dev-app-e2e/src/support/commands.ts b/apps/ngrid-dev-app-e2e/src/support/commands.ts index 5a4807ef8..dc1356f7a 100644 --- a/apps/ngrid-dev-app-e2e/src/support/commands.ts +++ b/apps/ngrid-dev-app-e2e/src/support/commands.ts @@ -1,20 +1,24 @@ -// *********************************************** -// This example commands.js shows you how to -// create various custom commands and overwrite -// existing commands. -// -// For more comprehensive examples of custom -// commands please read more here: -// https://on.cypress.io/custom-commands -// *********************************************** +import '@pebula/ngrid-cypress'; +import { addMatchImageSnapshotCommand } from 'cypress-image-snapshot/command'; -// -- This is a child command -- -// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... }) -// -// -// -- This is a dual command -- -// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... }) -// -// -// -- This will overwrite an existing command -- -// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) +declare global { + namespace Cypress { + interface ResolvedConfigOptions { + isInteractive: boolean; + } + } +} + +// if (Cypress.config('isInteractive')) { +// Cypress.Commands.add('matchImageSnapshot', () => { +// cy.log('Skipping snapshot 👀') +// }) +// } else { +// addMatchImageSnapshotCommand({ +// customSnapshotsDir: './src/__snapshots__', +// failureThreshold: 0.03, // threshold for entire image +// failureThresholdType: 'percent', // percent of image or number of pixels +// customDiffConfig: { threshold: 0.1 }, // threshold for each pixel +// capture: 'viewport', // capture viewport in screenshot +// }); +// } \ No newline at end of file diff --git a/apps/ngrid-docs-app-e2e/src/integration/features/columns/column-groups.spec.ts b/apps/ngrid-docs-app-e2e/src/integration/features/columns/column-groups.spec.ts index 02fd44726..7495a7cf3 100644 --- a/apps/ngrid-docs-app-e2e/src/integration/features/columns/column-groups.spec.ts +++ b/apps/ngrid-docs-app-e2e/src/integration/features/columns/column-groups.spec.ts @@ -6,7 +6,7 @@ describe('ngrid-docs-app', () => { .nGrid() .should( ngrid => { expect(ngrid.getColumns()).to.deep.eq(['id', 'name', 'gender', 'email', 'country', 'language']); - const headerRows = ngrid.getHeaderMetRows(); + const headerRows = ngrid.getHeaderMetaRows(); expect(headerRows.length).to.eq(1); const hr = headerRows[0]; expect(hr.isGroup).to.eq(true); @@ -25,7 +25,7 @@ describe('ngrid-docs-app', () => { .nGrid() .should( ngrid => { expect(ngrid.getColumns()).to.deep.eq(['id', 'name', 'gender', 'email', 'country', 'language']); - const headerRows = ngrid.getHeaderMetRows(); + const headerRows = ngrid.getHeaderMetaRows(); expect(headerRows.length).to.eq(3); const [hr0, hr1, hr2] = headerRows; diff --git a/apps/ngrid-docs-app-e2e/src/integration/features/columns/column-reorder.spec.ts b/apps/ngrid-docs-app-e2e/src/integration/features/columns/column-reorder.spec.ts index b03a8f650..3d40fc603 100644 --- a/apps/ngrid-docs-app-e2e/src/integration/features/columns/column-reorder.spec.ts +++ b/apps/ngrid-docs-app-e2e/src/integration/features/columns/column-reorder.spec.ts @@ -7,7 +7,7 @@ describe('ngrid-docs-app', () => { .nGrid() .should( ngrid => { expect(ngrid.getColumns()).to.deep.eq(['id', 'name', 'gender', 'email', 'country', 'language', 'birthdate', 'balance']); - const headerRows = ngrid.getHeaderMetRows(); + const headerRows = ngrid.getHeaderMetaRows(); expect(headerRows.length).to.eq(2); const [hr0, hr1] = headerRows; @@ -36,7 +36,7 @@ describe('ngrid-docs-app', () => { .wait(500) .should( ngrid => { expect(ngrid.getColumns()).to.deep.eq(['id', 'name', 'email', 'gender', 'language', 'country', 'birthdate', 'balance']); - const headerRows = ngrid.getHeaderMetRows(); + const headerRows = ngrid.getHeaderMetaRows(); expect(headerRows.length).to.eq(2); const [hr0, hr1] = headerRows; diff --git a/apps/ngrid-docs-app-e2e/src/integration/features/columns/hide-column.spec.ts b/apps/ngrid-docs-app-e2e/src/integration/features/columns/hide-column.spec.ts index b1589d11c..b82a9a4b6 100644 --- a/apps/ngrid-docs-app-e2e/src/integration/features/columns/hide-column.spec.ts +++ b/apps/ngrid-docs-app-e2e/src/integration/features/columns/hide-column.spec.ts @@ -30,7 +30,7 @@ describe('ngrid-docs-app', () => { .nGrid() .should( ngrid => { expect(ngrid.getColumns()).to.deep.eq(['id', 'name', 'gender', 'birthdate', 'bio', 'email', 'country', 'language']); - const headerRows = ngrid.getHeaderMetRows(); + const headerRows = ngrid.getHeaderMgetHeaderMetaRowsetRows(); expect(headerRows.length).to.eq(1); const hr = headerRows[0]; expect(hr.isGroup).to.eq(true); @@ -50,7 +50,7 @@ describe('ngrid-docs-app', () => { cy.wait(100).should(() => { expect(ngrid.getColumns()).to.deep.eq(['id', 'bio', 'email', 'country', 'language']); - const headerRows1 = ngrid.getHeaderMetRows(); + const headerRows1 = ngrid.getHeaderMetaRows(); expect(headerRows1.length).to.eq(1); const hr1 = headerRows1[0]; expect(hr1.isGroup).to.eq(true); diff --git a/apps/ngrid-docs-app-e2e/src/support/app.po.ts b/apps/ngrid-docs-app-e2e/src/support/app.po.ts deleted file mode 100644 index 329342469..000000000 --- a/apps/ngrid-docs-app-e2e/src/support/app.po.ts +++ /dev/null @@ -1 +0,0 @@ -export const getGreeting = () => cy.get('h1'); diff --git a/apps/ngrid-docs-app-e2e/src/support/ngrid-harness/actions.ts b/apps/ngrid-docs-app-e2e/src/support/ngrid-harness/actions.ts deleted file mode 100644 index 0e609bd43..000000000 --- a/apps/ngrid-docs-app-e2e/src/support/ngrid-harness/actions.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { NGridCypressHarness } from './ngrid-harness'; - -function getCoords(el: Element) { - const domRect = el.getBoundingClientRect() - const coords = { x: domRect.left + (domRect.width / 2 || 0), y: domRect.top + (domRect.height / 2 || 0) } - return coords -} - -export interface DragOptions { - /** - * delay in between steps - * @default 0 - */ - delay?: number; - /** - * interpolation between coords - * @default 0 - */ - steps?: number; - /** - * >=10 steps - * @default false - */ - smooth?: boolean; -} - -export class NGridCypressHarnessActions { - constructor(private readonly harness: NGridCypressHarness) { } - - - dragMoveColumns(sourceColumnId: string, targetColumnId: string, opts?: DragOptions): Cypress.Chainable { - const sourceEl = this.harness.element.querySelector(`.cdk-column-${sourceColumnId}.cdk-drag`); - const targetEl = this.harness.element.querySelector(`.cdk-column-${targetColumnId}.cdk-drag`); - - opts = Cypress._.defaults(opts, { delay: 0, steps: 0, smooth: false }); - - if (opts.smooth) { - opts.steps = Math.max(opts.steps, 10); - } - - const defaultView = sourceEl.ownerDocument.defaultView; - const elFromCoords = (coords: ReturnType) => defaultView.document.elementFromPoint(coords.x, coords.y); - const send = (type: string, coords: ReturnType, el?: Element) => { - el = el || elFromCoords(coords) - el.dispatchEvent(new defaultView.MouseEvent(type, Object.assign({}, { clientX: coords.x, clientY: coords.y }, { bubbles: true, cancelable: true }))); - } - - const fromCoords = getCoords(sourceEl); - const toCoords = getCoords(targetEl); - - const _log = Cypress.log({ - $el: Cypress.$(sourceEl as any), - name: 'drag to', - message: targetColumnId, - }); - - _log.snapshot('before', { next: 'after', at: 0 }); - _log.set({ consoleProps: () => ({ coords: toCoords }) }); - - send('mouseover', fromCoords, sourceEl); - send('mousedown', fromCoords, sourceEl); - - return cy.then(() => Cypress.Promise - .try(() => { - const steps = opts.steps; - if (steps > 0) { - - const dx = (toCoords.x - fromCoords.x) / steps; - const dy = (toCoords.y - fromCoords.y) / steps; - - return Cypress.Promise.map(Array(steps).fill(null), (v, i) => { - i = steps - 1 - i; - - const _to = { - x: fromCoords.x + dx * (i), - y: fromCoords.y + dy * (i), - }; - - send('mousemove', _to, sourceEl); - - return Cypress.Promise.delay(opts.delay); - - }, { concurrency: 1 }); - } - }) - .then(() => { - send('mousemove', toCoords, sourceEl); - send('mouseover', toCoords); - send('mousemove', toCoords); - send('mouseup', toCoords); - _log.snapshot('after', { at: 1, next: null }).end(); - return this.harness; - }) - ); - } -} diff --git a/apps/ngrid-docs-app-e2e/src/support/ngrid-harness/index.ts b/apps/ngrid-docs-app-e2e/src/support/ngrid-harness/index.ts deleted file mode 100644 index 21c538d5e..000000000 --- a/apps/ngrid-docs-app-e2e/src/support/ngrid-harness/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './ngrid-harness'; diff --git a/apps/ngrid-docs-app-e2e/src/support/ngrid-harness/ngrid-harness.ts b/apps/ngrid-docs-app-e2e/src/support/ngrid-harness/ngrid-harness.ts deleted file mode 100644 index 100b4a6f2..000000000 --- a/apps/ngrid-docs-app-e2e/src/support/ngrid-harness/ngrid-harness.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { NGridCypressHarnessActions } from './actions'; - -export class NGridCypressHarness { - public readonly actions = new NGridCypressHarnessActions(this); - - constructor(public readonly element: HTMLElement) { - const fixedMetaRows = element.querySelector('div[pbl-ngrid-fixed-meta-row-container="header"'); - const viewPort = element.querySelector('pbl-cdk-virtual-scroll-viewport'); - const cdkTable = viewPort.querySelector('pbl-cdk-table'); - } - - getHeaderMetRows() { - const fixedMetaRows = this.element.querySelector('div[pbl-ngrid-fixed-meta-row-container="header"'); - const fixedHeaderMetaRows = fixedMetaRows.querySelectorAll('pbl-ngrid-meta-row'); - - const viewPort = this.element.querySelector('pbl-cdk-virtual-scroll-viewport'); - const cdkTable = viewPort.querySelector('pbl-cdk-table'); - const headerMetaRows = cdkTable.querySelectorAll('pbl-ngrid-meta-row'); - - const CLASS_ROW_INDEX_RE = /^pbl-ngrid-row-index-(\d+)$/; - return [ - ...Array.from(fixedHeaderMetaRows).map( e => { - const match = this.findClassMatch(e, CLASS_ROW_INDEX_RE); - return { - type: 'fixed' as const, - isGroup: e.classList.contains('pbl-meta-group-row'), - rowIndex: match[1], - cells: Array.from(e.querySelectorAll('pbl-ngrid-meta-cell')).map(c => this.parseMetaCell(c)), - } - }), - ...Array.from(headerMetaRows).map( e => { - const match = this.findClassMatch(e, CLASS_ROW_INDEX_RE); - return { - type: e.classList.contains('cdk-table-sticky') ? 'sticky' as const : 'row' as const, - isGroup: e.classList.contains('pbl-meta-group-row'), - rowIndex: match[1], - cells: Array.from(e.querySelectorAll('pbl-ngrid-meta-cell')).map(c => this.parseMetaCell(c)), - } - }) - ]; - } - - getColumns() { - const fixedMetaRows = this.element.querySelector('div[pbl-ngrid-fixed-meta-row-container="header"'); - const columnRows = fixedMetaRows.querySelectorAll('pbl-ngrid-column-row'); - const [gridWidthRow, columnRow] = Array.from(columnRows); - const headerCells = columnRow.querySelectorAll('pbl-ngrid-header-cell'); - - const CLASS_COLUMN_RE = /^cdk-column-(.+)$/; - return Array.from(headerCells).map( e => { - for (let i = 0; i < e.classList.length; i++) { - const match = this.findClassMatch(e, CLASS_COLUMN_RE); - if (match) { - return match[1]; - } - } - }); - } - - private parseMetaCell(e: Element) { - const groupCell = e.classList.contains('pbl-header-group-cell'); - if (groupCell) { - const CLASS_GROUP_CELL_RE = /^cdk-column-group-(.+)-row-\d+$/; - const CLASS_GROUP_SLAVE_CELL_RE = /^cdk-column-group-(.+)-row-\d+-slave\d+$/; - - const match = this.findClassMatch(e, CLASS_GROUP_CELL_RE); - return { - groupCell: true, - slave: !match, - id: match ? match[1] : this.findClassMatch(e, CLASS_GROUP_SLAVE_CELL_RE)[1] , - placeholder: e.classList.contains('pbl-header-group-cell-placeholder'), - el: e, - } - } - - const CLASS_COLUMN_RE = /^cdk-column-(.+)$/; - return { - id: this.findClassMatch(e, CLASS_COLUMN_RE)[1], - el: e, - } - } - - private findClassMatch(e: Element, regExp: RegExp): RegExpMatchArray | undefined { - for (let i = 0; i < e.classList.length; i++) { - const match = e.classList.item(i).match(regExp); - if (match) { - return match; - } - } - } -} diff --git a/libs/ngrid-cypress/src/lib/ngrid-harness/ngrid-harness.ts b/libs/ngrid-cypress/src/lib/ngrid-harness/ngrid-harness.ts index 100b4a6f2..b6c514755 100644 --- a/libs/ngrid-cypress/src/lib/ngrid-harness/ngrid-harness.ts +++ b/libs/ngrid-cypress/src/lib/ngrid-harness/ngrid-harness.ts @@ -9,7 +9,7 @@ export class NGridCypressHarness { const cdkTable = viewPort.querySelector('pbl-cdk-table'); } - getHeaderMetRows() { + getHeaderMetaRows() { const fixedMetaRows = this.element.querySelector('div[pbl-ngrid-fixed-meta-row-container="header"'); const fixedHeaderMetaRows = fixedMetaRows.querySelectorAll('pbl-ngrid-meta-row'); diff --git a/package.json b/package.json index f859cd776..de1660766 100644 --- a/package.json +++ b/package.json @@ -92,6 +92,7 @@ "@octokit/rest": "^16.28.1", "@rigor789/remark-autolink-headings": "^5.1.0", "@types/chalk": "^0.4.31", + "@types/cypress-image-snapshot": "^3.1.2", "@types/express-serve-static-core": "^4.17.8", "@types/faker": "^4.1.4", "@types/globby": "^8.0.0", @@ -108,6 +109,7 @@ "convert-source-map": "^1.6.0", "country-data": "^0.0.31", "cypress": "^4.0.0", + "cypress-image-snapshot": "^3.1.1", "dotenv": "6.2.0", "gatsby-remark-prismjs": "^3.2.0", "glob": "^7.1.4", diff --git a/yarn.lock b/yarn.lock index 8c86a9e15..47bcf42d8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2702,6 +2702,11 @@ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== +"@types/cypress-image-snapshot@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@types/cypress-image-snapshot/-/cypress-image-snapshot-3.1.2.tgz#68524daa5afa98480996167e5e2135bac58527f5" + integrity sha512-n0YKceEVXsRzeEFW3PL2zXRhw9fB1aYePPY4ZK6J4gMTBvnI4qYzqrqUJtwzQB2qF8MpWmSL92AmW+6YJxxOpg== + "@types/debug@^4.1.5": version "4.1.5" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd" @@ -3597,7 +3602,7 @@ ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== -ansi-escapes@^4.2.1: +ansi-escapes@^4.1.0, ansi-escapes@^4.2.1: version "4.3.1" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== @@ -3682,6 +3687,13 @@ anymatch@^3.0.3, anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" +app-path@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/app-path/-/app-path-3.2.0.tgz#06d426e0c988885264e0aa0a766dfa2723491633" + integrity sha512-PQPaKXi64FZuofJkrtaO3I5RZESm9Yjv7tkeJaDz4EZMeBBfGtr5MyQ3m5AC7F0HVrISBLatPxAAAgvbe418fQ== + dependencies: + execa "^1.0.0" + app-root-path@^2.1.0: version "2.2.1" resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.2.1.tgz#d0df4a682ee408273583d43f6f79e9892624bc9a" @@ -4146,6 +4158,11 @@ base64-js@^1.0.2, base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== +base64-js@^1.2.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + base64id@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" @@ -5935,6 +5952,18 @@ cyclist@^1.0.1: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= +cypress-image-snapshot@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/cypress-image-snapshot/-/cypress-image-snapshot-3.1.1.tgz#cb7242d8086e0d4cbb7f333f927f71cdb5ff9971" + integrity sha512-r+rjnljehx45qhhV9M/lBsg34Ibys9JWSbPFo9ktV6ovnpxiZSh9GYM/SXEvtJoEonRF51M/Gn2G6J3UlaV6Dg== + dependencies: + chalk "^2.4.1" + fs-extra "^7.0.1" + glob "^7.1.3" + jest-image-snapshot "2.8.2" + pkg-dir "^3.0.0" + term-img "^4.0.0" + cypress@^4.0.0: version "4.12.1" resolved "https://registry.yarnpkg.com/cypress/-/cypress-4.12.1.tgz#0ead1b9f4c0917d69d8b57f996b6e01fe693b6ec" @@ -7423,7 +7452,7 @@ fs-extra@4.0.2: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@7.0.1, fs-extra@~7.0.1: +fs-extra@7.0.1, fs-extra@^7.0.1, fs-extra@~7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== @@ -7582,6 +7611,11 @@ get-stdin@^4.0.1: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= +get-stdin@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" + integrity sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g= + get-stream@^4.0.0, get-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -9171,6 +9205,14 @@ istanbul-reports@^3.0.2: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +iterm2-version@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/iterm2-version/-/iterm2-version-4.2.0.tgz#b78069f747f34a772bc7dc17bda5bd9ed5e09633" + integrity sha512-IoiNVk4SMPu6uTcK+1nA5QaHNok2BMDLjSl5UomrOixe5g4GkylhPwuiGdw00ysSCrXAKNMfFTu+u/Lk5f6OLQ== + dependencies: + app-path "^3.2.0" + plist "^3.0.1" + jasmine-core@^3.5.0, jasmine-core@~3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.5.0.tgz#132c23e645af96d85c8bca13c8758b18429fc1e4" @@ -9362,6 +9404,19 @@ jest-haste-map@^26.6.2: optionalDependencies: fsevents "^2.1.2" +jest-image-snapshot@2.8.2: + version "2.8.2" + resolved "https://registry.yarnpkg.com/jest-image-snapshot/-/jest-image-snapshot-2.8.2.tgz#d9e95b8987fdf176a94505cd1b1f22916b11c897" + integrity sha512-gtKgxfW5ifAikNI+fp0c0o/3byOeOUSmYeAELblGzINEZrDGUYxwUZtn5rNrgVuzjgGMBBsKYv/2gIM6VpzLaw== + dependencies: + chalk "^1.1.3" + get-stdin "^5.0.1" + lodash "^4.17.4" + mkdirp "^0.5.1" + pixelmatch "^4.0.2" + pngjs "^3.3.3" + rimraf "^2.6.2" + jest-jasmine2@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.6.2.tgz#81bc3eabc367aa65cb9e63ec7129f8831cc345fc" @@ -10235,7 +10290,7 @@ lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.1 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== -lodash@^4.17.19, lodash@~4.17.10: +lodash@^4.17.19, lodash@^4.17.4, lodash@~4.17.10: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== @@ -12089,6 +12144,13 @@ pirates@^4.0.1: dependencies: node-modules-regexp "^1.0.0" +pixelmatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854" + integrity sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ= + dependencies: + pngjs "^3.0.0" + pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -12103,6 +12165,15 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +plist@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.1.tgz#a9b931d17c304e8912ef0ba3bdd6182baf2e1f8c" + integrity sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ== + dependencies: + base64-js "^1.2.3" + xmlbuilder "^9.0.7" + xmldom "0.1.x" + plugin-error@1.0.1, plugin-error@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" @@ -12113,6 +12184,11 @@ plugin-error@1.0.1, plugin-error@^1.0.1: arr-union "^3.1.0" extend-shallow "^3.0.2" +pngjs@^3.0.0, pngjs@^3.3.3: + version "3.4.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" + integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== + pnp-webpack-plugin@1.6.4: version "1.6.4" resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" @@ -14843,6 +14919,14 @@ tar@^6.0.2: mkdirp "^1.0.3" yallist "^4.0.0" +term-img@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/term-img/-/term-img-4.1.0.tgz#5b170961f7aa20b2f3b22deb8ad504beb963a8a5" + integrity sha512-DFpBhaF5j+2f7kheKFc1ajsAUUDGOaNPpKPtiIMxlbfud6mvfFZuWGnTRpaujUa5J7yl6cIw/h6nyr4mSsENPg== + dependencies: + ansi-escapes "^4.1.0" + iterm2-version "^4.1.0" + terminal-link@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" @@ -16442,6 +16526,11 @@ xml2js@^0.4.17: sax ">=0.6.0" xmlbuilder "~11.0.0" +xmlbuilder@^9.0.7: + version "9.0.7" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" + integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= + xmlbuilder@~11.0.0: version "11.0.1" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" @@ -16452,6 +16541,11 @@ xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== +xmldom@0.1.x: + version "0.1.31" + resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff" + integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ== + xmlhttprequest-ssl@~1.5.4: version "1.5.5" resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e"