diff --git a/.eslintrc.js b/.eslintrc.js index 02b03cf7f..2c11d94f9 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -88,6 +88,7 @@ module.exports = { files: 'cypress/**/*', globals: { cy: true, + Cypress: true, }, }, ], diff --git a/.github/workflows/library-ci.yml b/.github/workflows/library-ci.yml index a8e01ba8a..e3589fa4c 100644 --- a/.github/workflows/library-ci.yml +++ b/.github/workflows/library-ci.yml @@ -39,7 +39,7 @@ jobs: - run: yarn install && yarn build - name: Cypress run - uses: cypress-io/github-action@v4 + uses: cypress-io/github-action@v6 functional: name: Functional tests diff --git a/cypress/e2e/capture.cy.js b/cypress/e2e/capture.cy.js index 1c08b30d1..f5411cfc0 100644 --- a/cypress/e2e/capture.cy.js +++ b/cypress/e2e/capture.cy.js @@ -12,21 +12,17 @@ describe('Event capture', () => { // :TRICKY: Use a custom start command over beforeEach to deal with given2 not being ready yet. const start = ({ waitForDecide = true } = {}) => { - cy.route({ - method: 'POST', - url: '**/decide/*', - response: { - config: { - enable_collect_everything: true, - }, - editorParams: {}, - featureFlags: ['session-recording-player'], - isAuthenticated: false, - sessionRecording: given.sessionRecording, - supportedCompression: given.supportedCompression, - excludedDomains: [], - autocaptureExceptions: false, + cy.intercept('POST', '**/decide/*', { + config: { + enable_collect_everything: true, }, + editorParams: {}, + featureFlags: ['session-recording-player'], + isAuthenticated: false, + sessionRecording: given.sessionRecording, + supportedCompression: given.supportedCompression, + excludedDomains: [], + autocaptureExceptions: false, }).as('decide') cy.visit('./playground/cypress-full') @@ -220,8 +216,9 @@ describe('Event capture', () => { it('makes a single decide request', () => { start() - cy.wait(200) - cy.shouldBeCalled('decide', 1) + cy.get('@decide.all').then((calls) => { + expect(calls.length).to.equal(1) + }) cy.phCaptures().should('include', '$pageview') cy.get('@decide').should(({ request }) => { @@ -322,31 +319,32 @@ describe('Event capture', () => { it('contains the correct payload after an event', () => { start() // Pageview will be sent immediately - cy.wait('@capture').should(({ request, url }) => { - expect(request.headers).to.eql({ - 'Content-Type': 'application/x-www-form-urlencoded', - }) + cy.wait('@capture').should(({ request }) => { + expect(request.headers['content-type']).to.eql('application/x-www-form-urlencoded') - expect(url).to.match(urlWithVersion) + expect(request.url).to.match(urlWithVersion) const data = decodeURIComponent(request.body.match(/data=(.*)/)[1]) const captures = JSON.parse(Buffer.from(data, 'base64')) expect(captures['event']).to.equal('$pageview') }) + // the code below is going to trigger an event capture + // we want to assert on the request + cy.intercept('POST', '**/e/*', async (request) => { + expect(request.headers['content-type']).to.eq('text/plain') + + const captures = await getGzipEncodedPayload(request) + expect(captures.map(({ event }) => event)).to.deep.equal(['$autocapture', 'custom-event']) + }).as('capture-assertion') + cy.get('[data-cy-custom-event-button]').click() cy.phCaptures().should('have.length', 3) cy.phCaptures().should('include', '$pageview') cy.phCaptures().should('include', '$autocapture') cy.phCaptures().should('include', 'custom-event') - cy.wait('@capture').its('requestBody.type').should('deep.equal', 'text/plain') - - cy.get('@capture').should(async ({ requestBody }) => { - const captures = await getGzipEncodedPayload(requestBody) - - expect(captures.map(({ event }) => event)).to.deep.equal(['$autocapture', 'custom-event']) - }) + cy.wait('@capture-assertion') }) }) }) @@ -374,11 +372,12 @@ describe('Event capture', () => { cy.get('[data-cy-input]') .type('hello posthog!') .then(() => { - const requests = cy - .state('requests') - .filter(({ alias }) => alias === 'session-recording' || alias === 'recorder') - expect(requests.length).to.be.equal(0) + cy.get('@session-recording.all').then((calls) => { + expect(calls.length).to.equal(0) + }) }) + + cy.phCaptures().should('not.include', '$snapshot') }) }) @@ -394,8 +393,9 @@ describe('Event capture', () => { it('makes a single decide request on start', () => { start() - cy.wait(200) - cy.shouldBeCalled('decide', 1) + cy.get('@decide.all').then((calls) => { + expect(calls.length).to.equal(1) + }) cy.get('@decide').should(({ request }) => { const payload = getBase64EncodedPayload(request) @@ -419,14 +419,19 @@ describe('Event capture', () => { start() cy.wait(200) - cy.shouldBeCalled('decide', 1) + cy.get('@decide.all').then((calls) => { + expect(calls.length).to.equal(1) + }) cy.posthog().invoke('group', 'company', 'id:6') cy.posthog().invoke('group', 'playlist', 'id:77') cy.posthog().invoke('group', 'anothergroup', 'id:99') cy.wait('@decide') - cy.shouldBeCalled('decide', 2) + + cy.get('@decide.all').then((calls) => { + expect(calls.length).to.equal(2) + }) }) }) }) diff --git a/cypress/e2e/session-recording.cy.js b/cypress/e2e/session-recording.cy.js index e4c829084..5f3a07585 100644 --- a/cypress/e2e/session-recording.cy.js +++ b/cypress/e2e/session-recording.cy.js @@ -13,19 +13,15 @@ describe('Session recording', () => { describe('array.full.js', () => { beforeEach(() => { - cy.route({ - method: 'POST', - url: '**/decide/*', - response: { - config: { enable_collect_everything: false }, - editorParams: {}, - featureFlags: ['session-recording-player'], - isAuthenticated: false, - sessionRecording: { - endpoint: '/ses/', - }, - capture_performance: true, + cy.intercept('POST', '**/decide/*', { + config: { enable_collect_everything: false }, + editorParams: {}, + featureFlags: ['session-recording-player'], + isAuthenticated: false, + sessionRecording: { + endpoint: '/ses/', }, + capture_performance: true, }).as('decide') cy.visit('./playground/cypress-full') @@ -58,20 +54,16 @@ describe('Session recording', () => { describe('array.js', () => { beforeEach(() => { - cy.route({ - method: 'POST', - url: '**/decide/*', - response: { - config: { enable_collect_everything: false }, - editorParams: {}, - featureFlags: ['session-recording-player'], - isAuthenticated: false, - sessionRecording: { - endpoint: '/ses/', - }, - supportedCompression: ['gzip', 'lz64'], - capture_performance: true, + cy.intercept('POST', '**/decide/*', { + config: { enable_collect_everything: false }, + editorParams: {}, + featureFlags: ['session-recording-player'], + isAuthenticated: false, + sessionRecording: { + endpoint: '/ses/', }, + supportedCompression: ['gzip', 'lz64'], + capture_performance: true, }).as('decide') cy.visit('./playground/cypress') diff --git a/cypress/support/commands.js b/cypress/support/commands.js index 99ea071c0..4c686d983 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -58,8 +58,3 @@ Cypress.Commands.add('resetPhCaptures', () => { $captures = [] $fullCaptures = [] }) - -Cypress.Commands.add('shouldBeCalled', (alias, timesCalled) => { - const calls = cy.state('requests').filter((call) => call.alias === alias) - expect(calls).to.have.length(timesCalled, `${alias} should have been called ${timesCalled} times`) -}) diff --git a/cypress/support/compression.js b/cypress/support/compression.js index 00e505634..f603cbf9c 100644 --- a/cypress/support/compression.js +++ b/cypress/support/compression.js @@ -5,8 +5,8 @@ export function getBase64EncodedPayload(request) { return JSON.parse(Buffer.from(data, 'base64')) } -export async function getGzipEncodedPayload(requestBody) { - const data = new Uint8Array(await requestBody.arrayBuffer()) +export async function getGzipEncodedPayload(request) { + const data = new Uint8Array(await request.body) const decoded = fflate.strFromU8(fflate.decompressSync(data)) return JSON.parse(decoded) } diff --git a/cypress/support/e2e.js b/cypress/support/e2e.js index e65e0af41..3795d6e87 100644 --- a/cypress/support/e2e.js +++ b/cypress/support/e2e.js @@ -30,11 +30,9 @@ Cypress.on('window:before:load', (win) => { }) beforeEach(() => { - cy.server() - - cy.route('POST', '**/decide/*').as('decide') - cy.route('POST', '**/e/*').as('capture') - cy.route('POST', '**/ses/*').as('session-recording') + cy.intercept('POST', '**/decide/*').as('decide') + cy.intercept('POST', '**/e/*').as('capture') + cy.intercept('POST', '**/ses/*').as('session-recording') cy.readFile('dist/array.full.js').then((body) => { cy.intercept('**/static/array.full.js', { body }) diff --git a/package.json b/package.json index 2ed643487..a6ca85e04 100644 --- a/package.json +++ b/package.json @@ -34,8 +34,6 @@ "fflate": "^0.4.1" }, "devDependencies": { - "eslint-config-posthog-js": "link:./eslint-rules", - "eslint-plugin-posthog-js": "link:./eslint-rules", "@babel/core": "7.18.9", "@babel/preset-env": "7.18.9", "@babel/preset-typescript": "^7.18.6", @@ -55,11 +53,13 @@ "@typescript-eslint/parser": "^6.4.0", "babel-eslint": "10.1.0", "babel-jest": "^26.6.3", - "cypress": "10.3.1", + "cypress": "13.5.1", "eslint": "8.20.0", + "eslint-config-posthog-js": "link:./eslint-rules", "eslint-config-prettier": "^8.5.0", "eslint-plugin-compat": "^4.1.4", "eslint-plugin-jest": "^27.2.3", + "eslint-plugin-posthog-js": "link:./eslint-rules", "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-react": "^7.30.1", "eslint-plugin-react-hooks": "^4.6.0", diff --git a/yarn.lock b/yarn.lock index 8d766a887..e09365bfa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2568,10 +2568,10 @@ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== -"@cypress/request@^2.88.10": - version "2.88.10" - resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.10.tgz#b66d76b07f860d3a4b8d7a0604d020c662752cce" - integrity sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg== +"@cypress/request@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@cypress/request/-/request-3.0.1.tgz#72d7d5425236a2413bd3d8bb66d02d9dc3168960" + integrity sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ== dependencies: aws-sign2 "~0.7.0" aws4 "^1.8.0" @@ -2586,9 +2586,9 @@ json-stringify-safe "~5.0.1" mime-types "~2.1.19" performance-now "^2.1.0" - qs "~6.5.2" + qs "6.10.4" safe-buffer "^5.1.2" - tough-cookie "~2.5.0" + tough-cookie "^4.1.3" tunnel-agent "^0.6.0" uuid "^8.3.2" @@ -3636,10 +3636,12 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.37.tgz#abb38afa9d6e8a2f627a8cb52290b3c80fbe61ed" integrity sha512-i1KGxqcvJaLQali+WuypQnXwcplhtNtjs66eNsZpp2P2FL/trJJxx/VWsM0YCL2iMoIJrbXje48lvIQAQ4p2ZA== -"@types/node@^14.14.31": - version "14.18.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.2.tgz#00fe4d1686d5f6cf3a2f2e9a0eef42594d06abfc" - integrity sha512-fqtSN5xn/bBzDxMT77C1rJg6CsH/R49E7qsGuvdPJa20HtV5zSTuLJPNfnlyVH3wauKnkHdLggTVkOW/xP9oQg== +"@types/node@^18.17.5": + version "18.18.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.9.tgz#5527ea1832db3bba8eb8023ce8497b7d3f299592" + integrity sha512-0f5klcuImLnG4Qreu9hPj/rEfFq6YRc5n2mAjSsH+ec/mJL+3voBH0+8T7o8RpFjH7ovc+TRsL/c7OYIQsPTfQ== + dependencies: + undici-types "~5.26.4" "@types/parse-json@^4.0.0": version "4.0.0" @@ -5016,6 +5018,11 @@ commander@^5.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== +commander@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + commander@^8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" @@ -5169,14 +5176,14 @@ cuint@^0.2.2: resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" integrity sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs= -cypress@10.3.1: - version "10.3.1" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-10.3.1.tgz#7fab4ef43481c05a9a17ebe9a0ec860e15b95a19" - integrity sha512-As9HrExjAgpgjCnbiQCuPdw5sWKx5HUJcK2EOKziu642akwufr/GUeqL5UnCPYXTyyibvEdWT/pSC2qnGW/e5w== +cypress@13.5.1: + version "13.5.1" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.5.1.tgz#8b19bf0b9f31ea43f78980b2479bd3f25197d5cc" + integrity sha512-yqLViT0D/lPI8Kkm7ciF/x/DCK/H/DnogdGyiTnQgX4OVR2aM30PtK+kvklTOD1u3TuItiD9wUQAF8EYWtyZug== dependencies: - "@cypress/request" "^2.88.10" + "@cypress/request" "^3.0.0" "@cypress/xvfb" "^1.2.4" - "@types/node" "^14.14.31" + "@types/node" "^18.17.5" "@types/sinonjs__fake-timers" "8.1.1" "@types/sizzle" "^2.3.2" arch "^2.2.0" @@ -5188,12 +5195,12 @@ cypress@10.3.1: check-more-types "^2.24.0" cli-cursor "^3.1.0" cli-table3 "~0.6.1" - commander "^5.1.0" + commander "^6.2.1" common-tags "^1.8.0" dayjs "^1.10.4" - debug "^4.3.2" + debug "^4.3.4" enquirer "^2.3.6" - eventemitter2 "^6.4.3" + eventemitter2 "6.4.7" execa "4.1.0" executable "^4.1.1" extract-zip "2.0.1" @@ -5206,12 +5213,13 @@ cypress@10.3.1: listr2 "^3.8.3" lodash "^4.17.21" log-symbols "^4.0.0" - minimist "^1.2.6" + 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.2" + semver "^7.5.3" supports-color "^8.1.1" tmp "~0.2.1" untildify "^4.0.0" @@ -5754,6 +5762,7 @@ escodegen@^2.0.0: "eslint-config-posthog-js@link:./eslint-rules": version "0.0.0" + uid "" eslint-config-prettier@^8.5.0: version "8.5.0" @@ -5783,6 +5792,7 @@ eslint-plugin-jest@^27.2.3: "eslint-plugin-posthog-js@link:./eslint-rules": version "0.0.0" + uid "" eslint-plugin-prettier@^4.2.1: version "4.2.1" @@ -5978,10 +5988,10 @@ event-stream@=3.3.4: stream-combiner "~0.0.4" through "~2.3.1" -eventemitter2@^6.4.3: - version "6.4.5" - resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.5.tgz#97380f758ae24ac15df8353e0cc27f8b95644655" - integrity sha512-bXE7Dyc1i6oQElDG0jMRZJrRAn9QR2xyyFGmBdZleNmyQX0FqGYmhZIrIrpPfm/w//LTo4tVQGOGQcGCb5q9uw== +eventemitter2@6.4.7: + version "6.4.7" + resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" + integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== events@^3.3.0: version "3.3.0" @@ -8988,11 +8998,16 @@ minimatch@^3.0.4, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: version "1.2.6" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== +minimist@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + mitt@^1.1.3: version "1.2.0" resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.2.0.tgz#cb24e6569c806e31bd4e3995787fe38a04fdf90d" @@ -9767,6 +9782,7 @@ posix-character-classes@^0.1.0: "posthog-js@link:.": version "0.0.0" + uid "" prelude-ls@^1.2.1: version "1.2.1" @@ -9913,6 +9929,13 @@ qrcode-terminal@^0.10.0: resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.10.0.tgz#a76a48e2610a18f97fa3a2bd532b682acff86c53" integrity sha1-p2pI4mEKGPl/o6K9UytoKs/4bFM= +qs@6.10.4: + version "6.10.4" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.4.tgz#6a3003755add91c0ec9eacdc5f878b034e73f9e7" + integrity sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g== + dependencies: + side-channel "^1.0.4" + qs@6.11.0: version "6.11.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" @@ -9925,6 +9948,11 @@ qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + queue-microtask@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.2.tgz#abf64491e6ecf0f38a6502403d4cda04f372dfd3" @@ -10228,6 +10256,11 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + reselect@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.0.0.tgz#f2529830e5d3d0e021408b246a206ef4ea4437f7" @@ -10565,7 +10598,7 @@ semver@^7.3.7: dependencies: lru-cache "^6.0.0" -semver@^7.5.4: +semver@^7.5.3, semver@^7.5.4: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -11531,6 +11564,16 @@ tough-cookie@^2.3.3, tough-cookie@~2.5.0: psl "^1.1.28" punycode "^2.1.1" +tough-cookie@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + tr46@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" @@ -11673,6 +11716,11 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -11734,6 +11782,11 @@ universalify@^0.1.2: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + universalify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" @@ -11795,6 +11848,14 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"