diff --git a/cypress/e2e/editor.cy.js b/cypress/e2e/editor.cy.js index c8b85103..e42ec32d 100644 --- a/cypress/e2e/editor.cy.js +++ b/cypress/e2e/editor.cy.js @@ -21,7 +21,7 @@ describe('Editor', () => { }); it('autocompletes', () => { - typeCode(''); + typeCode('', { delay: 100 }); assertFirstFrameContains('Foo'); assertCodePaneContains(''); }); diff --git a/cypress/e2e/scope.cy.js b/cypress/e2e/scope.cy.js index 1cb11119..abc121d8 100644 --- a/cypress/e2e/scope.cy.js +++ b/cypress/e2e/scope.cy.js @@ -10,7 +10,7 @@ describe('useScope', () => { }); it('works', () => { - typeCode('{{}hello()} {{}world()}', { delay: 0 }); + typeCode('{{}hello()} {{}world()}'); assertFirstFrameContains('HELLO WORLD'); }); }); diff --git a/cypress/e2e/smoke.cy.js b/cypress/e2e/smoke.cy.js index f9ff3572..9cdb4dbc 100644 --- a/cypress/e2e/smoke.cy.js +++ b/cypress/e2e/smoke.cy.js @@ -1,13 +1,13 @@ import { assertPreviewContains, - getFirstFrame, + getPreviewFrames, loadPlayroom, } from '../support/utils'; describe('Smoke', () => { it('frames are interactive', () => { loadPlayroom(); - getFirstFrame().click('center'); + getPreviewFrames().first().click('center'); }); it('preview mode loads correctly', () => { diff --git a/cypress/e2e/toolbar.cy.js b/cypress/e2e/toolbar.cy.js index bda4da82..d5eaa3fb 100644 --- a/cypress/e2e/toolbar.cy.js +++ b/cypress/e2e/toolbar.cy.js @@ -4,7 +4,6 @@ import { assertPreviewContains, typeCode, gotoPreview, - visit, loadPlayroom, } from '../support/utils'; @@ -33,7 +32,7 @@ describe('Toolbar', () => { it('copy to clipboard', () => { const copySpy = cy.spy(); - visit( + cy.visit( 'http://localhost:9000/#?code=N4Igxg9gJgpiBcIA8AxCEB8r1YEIEMAnAei2LUyXJxAF8g' ); diff --git a/cypress/e2e/urlHandling.cy.js b/cypress/e2e/urlHandling.cy.js index baaf4af3..fa971d1e 100644 --- a/cypress/e2e/urlHandling.cy.js +++ b/cypress/e2e/urlHandling.cy.js @@ -2,13 +2,12 @@ import { assertFirstFrameContains, assertCodePaneContains, assertFramesMatch, - visit, } from '../support/utils'; describe('URL handling', () => { describe('where paramType is hash', () => { it('code', () => { - visit( + cy.visit( 'http://localhost:9000/#?code=N4Igxg9gJgpiBcIA8AxCEB8r1YEIEMAnAei2LUyXJxAF8g' ); @@ -17,7 +16,7 @@ describe('URL handling', () => { }); it('widths', () => { - visit( + cy.visit( 'http://localhost:9000/#?code=N4Ig7glgJgLgFgZxALgNoGYDsBWANJgNgA4BdAXyA' ); @@ -27,7 +26,7 @@ describe('URL handling', () => { describe('where paramType is search', () => { it('code', () => { - visit( + cy.visit( 'http://localhost:9001/index.html?code=N4Igxg9gJgpiBcIA8AxCEB8r1YEIEMAnAei2LUyXJxAF8g' ); @@ -36,7 +35,7 @@ describe('URL handling', () => { }); it('widths', () => { - visit( + cy.visit( 'http://localhost:9001/index.html?code=N4Ig7glgJgLgFgZxALgNoGYDsBWANJgNgA4BdAXyA' ); diff --git a/cypress/support/utils.js b/cypress/support/utils.js index 5fe88aff..18986518 100644 --- a/cypress/support/utils.js +++ b/cypress/support/utils.js @@ -5,38 +5,20 @@ import dedent from 'dedent'; import { createUrl } from '../../utils'; import { isMac } from '../../src/utils/formatting'; -const WAIT_FOR_FRAME_TO_RENDER = 1000; - -const getCodeEditor = () => cy.get('.CodeMirror-code'); +const getCodeEditor = () => + cy.get('.CodeMirror-code').then((editor) => cy.wrap(editor)); export const getPreviewFrames = () => cy.get('[data-testid="previewFrame"]'); export const getPreviewFrameNames = () => cy.get('[data-testid="frameName"]'); -export const getFirstFrame = () => getPreviewFrames().first(); - -export const visit = (url) => - cy - .visit(url) - .reload() - .then(() => { - getFirstFrame().then( - ($iframe) => - new Cypress.Promise((resolve) => $iframe.on('load', resolve)) - ); - }); - -export const typeCode = (code, { delay = 200 } = {}) => - getCodeEditor() - .focused() - .type(code, { force: true, delay }) - .wait(WAIT_FOR_FRAME_TO_RENDER); +export const typeCode = (code, { delay } = {}) => + getCodeEditor().focused().type(code, { delay }); export const formatCode = () => getCodeEditor() .focused() - .type(`${isMac() ? '{cmd}' : '{ctrl}'}s`) - .wait(WAIT_FOR_FRAME_TO_RENDER); + .type(`${isMac() ? '{cmd}' : '{ctrl}'}s`); export const selectWidthPreferenceByIndex = (index) => cy @@ -59,9 +41,7 @@ export const toggleSnippets = () => cy.get('[data-testid="toggleSnippets"]').click(); export const filterSnippets = (search) => { - cy.get('[data-testid="filterSnippets"]').type(search, { force: true }); - // eslint-disable-next-line @finsit/cypress/no-unnecessary-waiting - cy.wait(200); + cy.get('[data-testid="filterSnippets"]').type(search); }; export const assertSnippetsListIsVisible = () => @@ -72,24 +52,19 @@ const getSnippets = () => cy.get('[data-testid="snippet-list"] li'); export const selectSnippetByIndex = (index) => getSnippets().eq(index); export const mouseOverSnippet = (index) => - selectSnippetByIndex(index) - .trigger('mousemove', { force: true }) // force stops cypress scrolling the panel out of the editor - .wait(WAIT_FOR_FRAME_TO_RENDER); + // force stops cypress scrolling the panel out of the editor + selectSnippetByIndex(index).trigger('mousemove', { force: true }); export const assertSnippetCount = (count) => getSnippets().should('have.length', count); -export const assertFirstFrameContains = (text) => { - getFirstFrame().then(($el) => - // eslint-disable-next-line @finsit/cypress/no-unnecessary-waiting - cy - .wrap($el.contents().find('body')) - .wait(WAIT_FOR_FRAME_TO_RENDER) - .then((el) => { - expect(el.get(0).innerText).to.eq(text); - }) - ); -}; +export const assertFirstFrameContains = (text) => + getPreviewFrames() + .first() + .its('0.contentDocument.body') + .should((frameBody) => { + expect(frameBody.innerText).to.eq(text); + }); /** * @param {number} numCharacters @@ -156,13 +131,15 @@ export const selectNextLines = (numLines, direction = 'down') => { export const assertCodePaneContains = (text) => { getCodeEditor().within(() => { + // Accumulate text from individual line elements as they don't include line numbers const lines = []; cy.get('.CodeMirror-line').each(($el) => lines.push($el.text())); + cy.then(() => { - const code = lines.join('\n'); // removes code mirrors invisible last line character placeholder - // which is inserted to preserve prettiers new line at end of string. - expect(code.replace(/[\u200b]$/, '')).to.eq(text); + // which is inserted to preserve prettier's new line at end of string. + const code = lines.join('\n').replace(/[\u200b]$/, ''); + expect(code).to.equal(text); }); }); }; @@ -176,7 +153,7 @@ export const assertCodePaneLineCount = (lines) => { export const assertFramesMatch = (matches) => getPreviewFrameNames() .should('have.length', matches.length) - .then((frames) => { + .should((frames) => { const frameNames = frames.map((_, el) => el.innerText).toArray(); return expect(frameNames).to.deep.equal(matches); }); @@ -187,7 +164,7 @@ export const assertPreviewContains = (text) => cy.get('[data-testid="splashscreen"]').should('not.be.visible'); }) .get('body') - .then((el) => { + .should((el) => { expect(el.get(0).innerText).to.eq(text); }); @@ -203,12 +180,5 @@ export const loadPlayroom = (initialCode) => { .then((win) => { const { storageKey } = win.__playroomConfig__; indexedDB.deleteDatabase(storageKey); - }) - .reload() - .then(() => - getFirstFrame().then( - ($iframe) => - new Cypress.Promise((resolve) => $iframe.on('load', resolve)) - ) - ); + }); }; diff --git a/package.json b/package.json index 1ffde33f..ad3f90fb 100644 --- a/package.json +++ b/package.json @@ -118,7 +118,7 @@ "@types/jest": "^29.2.4", "@types/react-helmet": "^6.1.6", "concurrently": "^7.6.0", - "cypress": "^12.0.2", + "cypress": "^13.6.6", "eslint": "^8.44.0", "eslint-config-seek": "^11.3.1", "husky": "^8.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cd3efbf5..7ce2a9ad 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -191,8 +191,8 @@ devDependencies: specifier: ^7.6.0 version: 7.6.0 cypress: - specifier: ^12.0.2 - version: 12.0.2 + specifier: ^13.6.6 + version: 13.6.6 eslint: specifier: ^8.44.0 version: 8.44.0 @@ -1686,8 +1686,8 @@ packages: dev: true optional: true - /@cypress/request@2.88.10: - resolution: {integrity: sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==} + /@cypress/request@3.0.1: + resolution: {integrity: sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==} engines: {node: '>= 6'} dependencies: aws-sign2: 0.7.0 @@ -1703,9 +1703,9 @@ packages: json-stringify-safe: 5.0.1 mime-types: 2.1.35 performance-now: 2.1.0 - qs: 6.5.3 + qs: 6.10.4 safe-buffer: 5.2.1 - tough-cookie: 2.5.0 + tough-cookie: 4.1.3 tunnel-agent: 0.6.0 uuid: 8.3.2 dev: true @@ -2783,10 +2783,6 @@ packages: resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} dev: true - /@types/node@14.18.34: - resolution: {integrity: sha512-hcU9AIQVHmPnmjRK+XUUYlILlr9pQrsqSrwov/JK1pnf3GTQowVBhx54FbvM0AU/VXGH4i3+vgXS5EguR7fysA==} - dev: true - /@types/node@18.11.12: resolution: {integrity: sha512-FgD3NtTAKvyMmD44T07zz2fEf+OKwutgBCEVM8GcvMGVGaDktiLNTDvPwC/LUe3PinMW+X6CuLOF2Ui1mAlSXg==} @@ -2923,7 +2919,7 @@ packages: graphemer: 1.4.0 ignore: 5.2.4 natural-compare-lite: 1.4.0 - semver: 7.3.8 + semver: 7.6.0 tsutils: 3.21.0(typescript@5.0.4) typescript: 5.0.4 transitivePeerDependencies: @@ -2997,7 +2993,7 @@ packages: debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 - semver: 7.3.8 + semver: 7.6.0 tsutils: 3.21.0(typescript@5.0.4) typescript: 5.0.4 transitivePeerDependencies: @@ -3018,7 +3014,7 @@ packages: '@typescript-eslint/typescript-estree': 5.61.0(typescript@5.0.4) eslint: 8.44.0 eslint-scope: 5.1.1 - semver: 7.3.8 + semver: 7.6.0 transitivePeerDependencies: - supports-color - typescript @@ -4182,8 +4178,8 @@ packages: engines: {node: '>= 6'} dev: false - /commander@5.1.0: - resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + /commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} engines: {node: '>= 6'} dev: true @@ -4332,7 +4328,7 @@ packages: postcss-modules-scope: 3.0.0(postcss@8.4.35) postcss-modules-values: 4.0.0(postcss@8.4.35) postcss-value-parser: 4.2.0 - semver: 7.3.8 + semver: 7.6.0 webpack: 5.75.0 dev: false @@ -4398,15 +4394,14 @@ packages: is-git-repository: 1.1.1 dev: false - /cypress@12.0.2: - resolution: {integrity: sha512-WnLx1DpnbF1vbpDBkgP14rK5yS3U+Gvxrv2fsB4Owma26oIyENj7DDRnsJbSZuTfG4mcuUJxAkRHJR2wBqBfMA==} - engines: {node: ^14.0.0 || ^16.0.0 || >=18.0.0} + /cypress@13.6.6: + resolution: {integrity: sha512-S+2S9S94611hXimH9a3EAYt81QM913ZVA03pUmGDfLTFa5gyp85NJ8dJGSlEAEmyRsYkioS1TtnWtbv/Fzt11A==} + engines: {node: ^16.0.0 || ^18.0.0 || >=20.0.0} hasBin: true requiresBuild: true dependencies: - '@cypress/request': 2.88.10 + '@cypress/request': 3.0.1 '@cypress/xvfb': 1.2.4(supports-color@8.1.1) - '@types/node': 14.18.34 '@types/sinonjs__fake-timers': 8.1.1 '@types/sizzle': 2.3.3 arch: 2.2.0 @@ -4418,7 +4413,7 @@ packages: check-more-types: 2.24.0 cli-cursor: 3.1.0 cli-table3: 0.6.3 - commander: 5.1.0 + commander: 6.2.1 common-tags: 1.8.2 dayjs: 1.11.7 debug: 4.3.4(supports-color@8.1.1) @@ -4436,12 +4431,13 @@ packages: listr2: 3.14.0(enquirer@2.3.6) lodash: 4.17.21 log-symbols: 4.1.0 - minimist: 1.2.7 + minimist: 1.2.8 ospath: 1.2.2 pretty-bytes: 5.6.0 + process: 0.11.10 proxy-from-env: 1.0.0 request-progress: 3.0.0 - semver: 7.3.8 + semver: 7.6.0 supports-color: 8.1.1 tmp: 0.2.1 untildify: 4.0.0 @@ -6816,7 +6812,7 @@ packages: jest-util: 29.3.1 natural-compare: 1.4.0 pretty-format: 29.3.1 - semver: 7.3.8 + semver: 7.6.0 transitivePeerDependencies: - supports-color dev: true @@ -6969,7 +6965,7 @@ packages: resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} hasBin: true dependencies: - minimist: 1.2.7 + minimist: 1.2.8 dev: true /json5@2.2.3: @@ -7419,8 +7415,8 @@ packages: resolution: {integrity: sha512-+bMdgqjMN/Z77a6NlY/I3U5LlRDbnmaAk6lDveAPKwSpcPM4tKAuYsvYF8xjhOPXhOYGe/73vVLVez5PW+jqhw==} dev: true - /minimist@1.2.7: - resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} /mixme@0.5.4: resolution: {integrity: sha512-3KYa4m4Vlqx98GPdOHghxSdNtTvcP8E0kkaJ5Dlh+h2DRzF7zpuVVcA8B0QpKd11YJeP9QQ7ASkKzOeu195Wzw==} @@ -7431,7 +7427,7 @@ packages: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true dependencies: - minimist: 1.2.7 + minimist: 1.2.8 /mlly@1.5.0: resolution: {integrity: sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==} @@ -8063,6 +8059,11 @@ packages: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: false + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: true + /progress@1.1.8: resolution: {integrity: sha512-UdA8mJ4weIkUBO224tIarHzuHs4HuYiJvsuGT7j/SPQiUJVjYvNDBIPa0hAorduOfjGohB/qHWRa/lrrWX/mXw==} engines: {node: '>=0.4.0'} @@ -8125,6 +8126,13 @@ packages: resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} engines: {node: '>=6'} + /qs@6.10.4: + resolution: {integrity: sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: true + /qs@6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} @@ -8147,6 +8155,10 @@ packages: strict-uri-encode: 2.0.0 dev: false + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: true + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -8187,7 +8199,7 @@ packages: dependencies: deep-extend: 0.6.0 ini: 1.3.8 - minimist: 1.2.7 + minimist: 1.2.8 strip-json-comments: 2.0.1 dev: true @@ -8497,7 +8509,6 @@ packages: /requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: false /resize-observer-polyfill@1.5.1: resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} @@ -8717,8 +8728,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - /semver@7.3.8: - resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + /semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} engines: {node: '>=10'} hasBin: true dependencies: @@ -9538,6 +9549,16 @@ packages: punycode: 2.1.1 dev: true + /tough-cookie@4.1.3: + resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} + engines: {node: '>=6'} + dependencies: + psl: 1.9.0 + punycode: 2.1.1 + universalify: 0.2.0 + url-parse: 1.5.10 + dev: true + /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: true @@ -9565,7 +9586,7 @@ packages: dependencies: '@types/json5': 0.0.29 json5: 1.0.1 - minimist: 1.2.7 + minimist: 1.2.8 strip-bom: 3.0.0 dev: true @@ -9728,6 +9749,11 @@ packages: engines: {node: '>= 4.0.0'} dev: true + /universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + dev: true + /universalify@2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} @@ -9769,6 +9795,13 @@ packages: resolution: {integrity: sha512-1WJ8YX1Kcec9wgxy8d/ATzGP1ayO6BRnd3iB6NlM+7cOnn6U8p5PKppRTCPLobh3CSdJ4d0TdPjopzyU2KcVFw==} dev: true + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: true + /use-debounce@10.0.0(react@18.2.0): resolution: {integrity: sha512-XRjvlvCB46bah9IBXVnq/ACP2lxqXyZj0D9hj4K5OzNroMDpTEBg8Anuh1/UfRTRs7pLhQ+RiNxxwZu9+MVl1A==} engines: {node: '>= 16.0.0'} @@ -9893,7 +9926,7 @@ packages: axios: 0.25.0(debug@4.3.4) joi: 17.7.0 lodash: 4.17.21 - minimist: 1.2.7 + minimist: 1.2.8 rxjs: 7.6.0 transitivePeerDependencies: - debug