From edbbefd9798804758b48fa06e449403e02e91bb0 Mon Sep 17 00:00:00 2001 From: Saroj <43822041+sarojsarab@users.noreply.github.com> Date: Fri, 25 Aug 2023 10:21:12 +0530 Subject: [PATCH] chore: Changes to enable internal cypress dashboard (#26626) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit > Pull Request Template > > Use this template to quickly create a well written pull request. Delete all quotes before creating the pull request. > ## Description > Add a TL;DR when description is extra long (helps content team) > > Please include a summary of the changes and which issue has been fixed. Please also include relevant motivation > and context. List any dependencies that are required for this change > > Links to Notion, Figma or any other documents that might be relevant to the PR > > #### PR fixes following issue(s) Fixes # (issue number) > if no issue exists, please create an issue and ask the maintainers about this first > > #### Media > A video or a GIF is preferred. when using Loom, don’t embed because it looks like it’s a GIF. instead, just link to the video > > #### Type of change > Please delete options that are not relevant. - Bug fix (non-breaking change which fixes an issue) - New feature (non-breaking change which adds functionality) - Breaking change (fix or feature that would cause existing functionality to not work as expected) - Chore (housekeeping or task changes that don't impact user perception) - This change requires a documentation update > > > ## Testing > #### How Has This Been Tested? > Please describe the tests that you ran to verify your changes. Also list any relevant details for your test configuration. > Delete anything that is not relevant - [ ] Manual - [ ] JUnit - [ ] Jest - [ ] Cypress > > #### Test Plan > Add Testsmith test cases links that relate to this PR > > #### Issues raised during DP testing > Link issues raised during DP testing for better visiblity and tracking (copy link from comments dropped on this PR) > > > ## Checklist: #### Dev activity - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my own code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] PR is being merged under a feature flag #### QA activity: - [ ] [Speedbreak features](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#speedbreakers-) have been covered - [ ] Test plan covers all impacted features and [areas of interest](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#areas-of-interest-) - [ ] Test plan has been peer reviewed by project stakeholders and other QA members - [ ] Manually tested functionality on DP - [ ] We had an implementation alignment call with stakeholders post QA Round 2 - [ ] Cypress test cases have been added and approved by SDET/manual QA - [ ] Added `Test Plan Approved` label after Cypress tests were reviewed - [ ] Added `Test Plan Approved` label after JUnit tests were reviewed --- .github/workflows/ci-test-custom-script.yml | 61 +++++ .github/workflows/ci-test.yml | 26 ++ .github/workflows/upgrade-appsmith-tests.yml | 1 + app/client/cypress/plugins/index.js | 4 + app/client/cypress/scripts/cypress-hooks.js | 224 ++++++++++++++++ app/client/package.json | 2 + app/client/yarn.lock | 266 +++++++++++++++++-- 7 files changed, 569 insertions(+), 15 deletions(-) create mode 100644 app/client/cypress/scripts/cypress-hooks.js diff --git a/.github/workflows/ci-test-custom-script.yml b/.github/workflows/ci-test-custom-script.yml index aaa0202152..f6399c032d 100644 --- a/.github/workflows/ci-test-custom-script.yml +++ b/.github/workflows/ci-test-custom-script.yml @@ -239,6 +239,42 @@ jobs: - run: | echo "BROWSER_PATH=$(which chrome)" >> $GITHUB_ENV + - name: Save Git values + # pass env variables from this step to other steps + # using GitHub Actions environment file + # https://docs.github.com/en/actions/learn-github-actions/workflow-commands-for-github-actions#environment-files + run: | + PR_NUMBER=${{ inputs.pr }} + echo COMMIT_INFO_BRANCH=$(git rev-parse --abbrev-ref HEAD) >> $GITHUB_ENV + echo COMMIT_INFO_MESSAGE=OkToTest run on PR# ${{ inputs.pr }} >> $GITHUB_ENV + echo COMMIT_INFO_EMAIL=$(git show -s --pretty=%ae) >> $GITHUB_ENV + echo COMMIT_INFO_AUTHOR=$(git show -s --pretty=%an) >> $GITHUB_ENV + echo COMMIT_INFO_SHA=$(git show -s --pretty=%H) >> $GITHUB_ENV + echo COMMIT_INFO_TIMESTAMP=$(git show -s --pretty=%ct) >> $GITHUB_ENV + echo COMMIT_INFO_REMOTE=$(git config --get remote.origin.url) >> $GITHUB_ENV + # delete the .git folder afterwords to use the environment values + rm -rf .git + + - name: Show Git values + run: | + echo Branch $COMMIT_INFO_BRANCH + echo Message $COMMIT_INFO_MESSAGE + echo Email $COMMIT_INFO_EMAIL + echo Author $COMMIT_INFO_AUTHOR + echo SHA $COMMIT_INFO_SHA + echo Timestamp $COMMIT_INFO_TIMESTAMP + echo Remote $COMMIT_INFO_REMOTE + + - name: Set Commit Message + env: + EVENT_COMMITS: ${{ toJson(github.event.commits[0].message) }} + run: | + if [[ ${{ inputs.pr }} -ne 0 ]]; then + echo "COMMIT_INFO_MESSAGE=${{ env.COMMIT_INFO_MESSAGE }}" >> $GITHUB_ENV + else + echo "COMMIT_INFO_MESSAGE=$(echo \"${{ env.EVENT_COMMITS }}\" | awk -F '\\\\n' '{print $1}' | sed 's/^\"//')" >> $GITHUB_ENV + fi + - name: Run the cypress test if: steps.run_result.outputs.run_result != 'success' && steps.run_result.outputs.run_result != 'failedtest' id: cypress_test @@ -292,6 +328,18 @@ jobs: CYPRESS_CONFIG_FILE: cypress_ci_custom.config.ts CYPRESS_HEADLESS: "true" CYPRESS_BROWSER: ${{ env.BROWSER_PATH }} + RUNID: ${{ github.run_id }} + ATTEMPT_NUMBER: ${{ github.run_attempt }} + REPOSITORY: ${{ github.repository }} + COMMITTER: ${{ env.COMMIT_INFO_AUTHOR }} + TAG: ${{ github.event_name }} + BRANCH: ${{ env.COMMIT_INFO_BRANCH }} + CYPRESS_DB_USER: ${{ secrets.CYPRESS_DB_USER }} + CYPRESS_DB_HOST: ${{ secrets.CYPRESS_DB_HOST }} + CYPRESS_DB_NAME: ${{ secrets.CYPRESS_DB_NAME }} + CYPRESS_DB_PWD: ${{ secrets.CYPRESS_DB_PWD }} + CYPRESS_S3_ACCESS: ${{ secrets.CYPRESS_S3_ACCESS }} + CYPRESS_S3_SECRET: ${{ secrets.CYPRESS_S3_SECRET }} with: install: false working-directory: app/client @@ -347,6 +395,19 @@ jobs: CYPRESS_CONFIG_FILE: cypress_ci.config.ts CYPRESS_HEADLESS: "true" CYPRESS_BROWSER: ${{ env.BROWSER_PATH }} + RUNID: ${{ github.run_id }} + ATTEMPT_NUMBER: ${{ github.run_attempt }} + REPOSITORY: ${{ github.repository }} + COMMITTER: ${{ env.COMMIT_INFO_AUTHOR }} + TAG: ${{ github.event_name }} + BRANCH: ${{ env.COMMIT_INFO_BRANCH }} + THIS_RUNNER: ${{ strategy.job-index }} + CYPRESS_DB_USER: ${{ secrets.CYPRESS_DB_USER }} + CYPRESS_DB_HOST: ${{ secrets.CYPRESS_DB_HOST }} + CYPRESS_DB_NAME: ${{ secrets.CYPRESS_DB_NAME }} + CYPRESS_DB_PWD: ${{ secrets.CYPRESS_DB_PWD }} + CYPRESS_S3_ACCESS: ${{ secrets.CYPRESS_S3_ACCESS }} + CYPRESS_S3_SECRET: ${{ secrets.CYPRESS_S3_SECRET }} with: install: false working-directory: app/client diff --git a/.github/workflows/ci-test.yml b/.github/workflows/ci-test.yml index a15128b10e..22a1e9242b 100644 --- a/.github/workflows/ci-test.yml +++ b/.github/workflows/ci-test.yml @@ -363,6 +363,19 @@ jobs: APPSMITH_GOOGLE_MAPS_API_KEY: ${{ secrets.APPSMITH_GOOGLE_MAPS_API_KEY }} COMMIT_INFO_MESSAGE: ${{ env.COMMIT_INFO_MESSAGE }} CYPRESS_VERIFY_TIMEOUT: 100000 + RUNID: ${{ github.run_id }} + ATTEMPT_NUMBER: ${{ github.run_attempt }} + REPOSITORY: ${{ github.repository }} + COMMITTER: ${{ env.COMMIT_INFO_AUTHOR }} + TAG: ${{ github.event_name }} + BRANCH: ${{ env.COMMIT_INFO_BRANCH }} + THIS_RUNNER: ${{ strategy.job-index }} + CYPRESS_DB_USER: ${{ secrets.CYPRESS_DB_USER }} + CYPRESS_DB_HOST: ${{ secrets.CYPRESS_DB_HOST }} + CYPRESS_DB_NAME: ${{ secrets.CYPRESS_DB_NAME }} + CYPRESS_DB_PWD: ${{ secrets.CYPRESS_DB_PWD }} + CYPRESS_S3_ACCESS: ${{ secrets.CYPRESS_S3_ACCESS }} + CYPRESS_S3_SECRET: ${{ secrets.CYPRESS_S3_SECRET }} with: browser: ${{ env.BROWSER_PATH }} record: true @@ -442,6 +455,19 @@ jobs: APPSMITH_DISABLE_TELEMETRY: true APPSMITH_GOOGLE_MAPS_API_KEY: ${{ secrets.APPSMITH_GOOGLE_MAPS_API_KEY }} COMMIT_INFO_MESSAGE: ${{ env.COMMIT_INFO_MESSAGE }} + RUNID: ${{ github.run_id }} + ATTEMPT_NUMBER: ${{ github.run_attempt }} + REPOSITORY: ${{ github.repository }} + COMMITTER: ${{ env.COMMIT_INFO_AUTHOR }} + TAG: ${{ github.event_name }} + BRANCH: ${{ env.COMMIT_INFO_BRANCH }} + THIS_RUNNER: ${{ strategy.job-index }} + CYPRESS_DB_USER: ${{ secrets.CYPRESS_DB_USER }} + CYPRESS_DB_HOST: ${{ secrets.CYPRESS_DB_HOST }} + CYPRESS_DB_NAME: ${{ secrets.CYPRESS_DB_NAME }} + CYPRESS_DB_PWD: ${{ secrets.CYPRESS_DB_PWD }} + CYPRESS_S3_ACCESS: ${{ secrets.CYPRESS_S3_ACCESS }} + CYPRESS_S3_SECRET: ${{ secrets.CYPRESS_S3_SECRET }} with: browser: ${{ env.BROWSER_PATH }} record: true diff --git a/.github/workflows/upgrade-appsmith-tests.yml b/.github/workflows/upgrade-appsmith-tests.yml index df708c5a44..38c19c0d55 100644 --- a/.github/workflows/upgrade-appsmith-tests.yml +++ b/.github/workflows/upgrade-appsmith-tests.yml @@ -122,3 +122,4 @@ jobs: - name: Check ci-test set status if: needs.ci-test.result != 'success' run: exit 1 + \ No newline at end of file diff --git a/app/client/cypress/plugins/index.js b/app/client/cypress/plugins/index.js index d594688142..26737e8c26 100644 --- a/app/client/cypress/plugins/index.js +++ b/app/client/cypress/plugins/index.js @@ -11,6 +11,7 @@ const { addMatchImageSnapshotPlugin, } = require("cypress-image-snapshot/plugin"); const { tagify } = require("cypress-tags"); +const { cypressHooks } = require("../scripts/cypress-hooks"); // *********************************************************** // This example plugins/index.js can be used to load plugins // @@ -44,6 +45,9 @@ module.exports = (on, config) => { on("file:preprocessor", tagify(config)); addMatchImageSnapshotPlugin(on, config); + if (process.env["RUNID"]) { + cypressHooks(on, config); + } on("before:browser:launch", (browser = {}, launchOptions) => { /* diff --git a/app/client/cypress/scripts/cypress-hooks.js b/app/client/cypress/scripts/cypress-hooks.js new file mode 100644 index 0000000000..991a89a6ba --- /dev/null +++ b/app/client/cypress/scripts/cypress-hooks.js @@ -0,0 +1,224 @@ +const { Client } = require("pg"); +const os = require("os"); +const AWS = require("aws-sdk"); +const fs = require("fs"); + +exports.cypressHooks = cypressHooks; + +// This function will helps to check and get env variables +function getEnvValue(varName, { required = true }) { + if (required && process.env[varName] === undefined) { + throw Error( + `Please check some or all the following ENV variables are not set properly [ RUNID, ATTEMPT_NUMBER, REPOSITORY, COMMITTER, TAG, BRANCH, THIS_RUNNER, CYPRESS_DB_USER, CYPRESS_DB_HOST, CYPRESS_DB_NAME, CYPRESS_DB_PWD, CYPRESS_S3_ACCESS, CYPRESS_S3_SECRET ].`, + ); + } + const value = + process.env[varName] === undefined ? "Cypress test" : process.env[varName]; + return value; +} + +//This is to setup the db client +function configureDbClient() { + const dbConfig = { + user: getEnvValue("CYPRESS_DB_USER", { required: true }), + host: getEnvValue("CYPRESS_DB_HOST", { required: true }), + database: getEnvValue("CYPRESS_DB_NAME", { required: true }), + password: getEnvValue("CYPRESS_DB_PWD", { required: true }), + port: 5432, + ssl: true, + keepalives: 0, + }; + + const dbClient = new Client(dbConfig); + dbClient.connect(); + + return dbClient; +} + +// This is to setup the AWS client +AWS.config.update({ region: "ap-south-1" }); +const s3 = new AWS.S3({ + credentials: { + accessKeyId: getEnvValue("CYPRESS_S3_ACCESS", { required: true }), + secretAccessKey: getEnvValue("CYPRESS_S3_SECRET", { required: true }), + }, +}); + +// This is to upload files to s3 when required +function uploadToS3(filePath, key) { + const fileContent = fs.readFileSync(filePath); + + const params = { + Bucket: "appsmith-internal-cy-db", + Key: key, + Body: fileContent, + }; + return s3.upload(params).promise(); +} + +async function cypressHooks(on, config) { + const dbClient = configureDbClient(); + const runData = { + commitMsg: getEnvValue("COMMIT_INFO_MESSAGE", { required: false }), + workflowId: getEnvValue("RUNID", { required: true }), + attempt: getEnvValue("ATTEMPT_NUMBER", { required: true }), + os: os.type(), + repo: getEnvValue("REPOSITORY", { required: true }), + committer: getEnvValue("COMMITTER", { required: true }), + type: getEnvValue("TAG", { required: true }), + branch: getEnvValue("BRANCH", { required: true }), + }; + const matrix = { + matrixId: getEnvValue("THIS_RUNNER", { required: true }), + matrixStatus: "started", + }; + + const specData = {}; + + await on("before:run", async (runDetails) => { + runData.browser = runDetails.browser.name; + try { + const runResponse = await dbClient.query( + `INSERT INTO public.attempt ("workflowId", "attempt", "browser", "os", "repo", "committer", "type", "commitMsg", "branch") + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) + ON CONFLICT ("workflowId", attempt) DO NOTHING + RETURNING id;`, + [ + runData.workflowId, + runData.attempt, + runData.browser, + runData.os, + runData.repo, + runData.committer, + runData.type, + runData.commitMsg, + runData.branch, + ], + ); + + if (runResponse.rows.length > 0) { + runData.attemptId = runResponse.rows[0].id; // Save the inserted attempt ID for later updates + } else { + const res = await dbClient.query( + `SELECT id FROM public.attempt WHERE "workflowId" = $1 AND attempt = $2`, + [runData.workflowId, runData.attempt], + ); + runData.attemptId = res.rows[0].id; + } + + const matrixResponse = await dbClient.query( + `INSERT INTO public.matrix ("workflowId", "matrixId", "status", "attemptId") + VALUES ($1, $2, $3, $4) + ON CONFLICT ("matrixId", "attemptId") DO NOTHING + RETURNING id;`, + [ + runData.workflowId, + matrix.matrixId, + matrix.matrixStatus, + runData.attemptId, + ], + ); + matrix.id = matrixResponse.rows[0].id; // Save the inserted matrix ID for later updates + } catch (err) { + console.log(err); + } + }); + + await on("before:spec", async (spec) => { + specData.name = spec.relative; + specData.matrixId = matrix.id; + try { + const specResponse = await dbClient.query( + 'INSERT INTO public.specs ("name", "matrixId") VALUES ($1, $2) RETURNING id', + [specData.name, matrix.id], + ); + specData.specId = specResponse.rows[0].id; // Save the inserted spec ID for later updates + } catch (err) { + console.log(err); + } + }); + + await on("after:spec", async (spec, results) => { + specData.testCount = results.stats.tests; + specData.passes = results.stats.passes; + specData.failed = results.stats.failures; + specData.pending = results.stats.pending; + specData.skipped = results.stats.skipped; + specData.status = results.stats.failures > 0 ? "fail" : "pass"; + + try { + await dbClient.query( + 'UPDATE public.specs SET "testCount" = $1, "passes" = $2, "failed" = $3, "skipped" = $4, "pending" = $5, "status" = $6 WHERE id = $7', + [ + results.stats.tests, + results.stats.passes, + results.stats.failures, + results.stats.skipped, + results.stats.pending, + specData.status, + specData.specId, + ], + ); + for (const test of results.tests) { + const testResponse = await dbClient.query( + `INSERT INTO public.tests ("name", "specId", "status", "retries", "retryData") VALUES ($1, $2, $3, $4, $5) RETURNING id`, + [ + test.title[1], + specData.specId, + test.state, + test.attempts.length, + JSON.stringify(test.attempts), + ], + ); + if ( + test.attempts.some((attempt) => attempt.state === "failed") && + results.screenshots + ) { + const out = results.screenshots.filter( + (scr) => scr.testId === test.testId, + ); + console.log("Uploading screenshots..."); + for (const scr of out) { + const key = `${testResponse.rows[0].id}_${specData.specId}_${ + scr.testAttemptIndex + 1 + }`; + Promise.all([uploadToS3(scr.path, key)]).catch((error) => { + console.log("Error in uploading screenshots:", error); + }); + } + } + } + + if ( + results.tests.some((test) => + test.attempts.some((attempt) => attempt.state === "failed"), + ) && + results.video + ) { + console.log("Uploading video..."); + const key = `${specData.specId}`; + Promise.all([uploadToS3(results.video, key)]).catch((error) => { + console.log("Error in uploading video:", error); + }); + } + } catch (err) { + console.log(err); + } + }); + + on("after:run", async (runDetails) => { + try { + await dbClient.query( + `UPDATE public.matrix SET "status" = $1 WHERE id = $2`, + ["done", matrix.id], + ); + await dbClient.query( + `UPDATE public.attempt SET "endTime" = $1 WHERE "id" = $2`, + [new Date(), runData.attemptId], + ); + await dbClient.end(); + } catch (err) { + console.log(err); + } + }); +} diff --git a/app/client/package.json b/app/client/package.json index 4305b83933..9db2b455a3 100644 --- a/app/client/package.json +++ b/app/client/package.json @@ -83,6 +83,7 @@ "algoliasearch": "^4.2.0", "assert-never": "^1.2.1", "astring": "^1.7.5", + "aws-sdk": "^2.1443.0", "axios": "^0.27.2", "classnames": "^2.3.1", "clsx": "^1.2.1", @@ -138,6 +139,7 @@ "normalizr": "^3.3.0", "object-hash": "^3.0.0", "path-to-regexp": "^6.2.0", + "pg": "^8.11.3", "popper.js": "^1.15.0", "prismjs": "^1.27.0", "proxy-memoize": "^1.2.0", diff --git a/app/client/yarn.lock b/app/client/yarn.lock index 24c4ad27ea..ac9b9b7014 100644 --- a/app/client/yarn.lock +++ b/app/client/yarn.lock @@ -9946,6 +9946,7 @@ __metadata: algoliasearch: ^4.2.0 assert-never: ^1.2.1 astring: ^1.7.5 + aws-sdk: ^2.1443.0 axios: ^0.27.2 babel-plugin-lodash: ^3.3.4 babel-plugin-module-resolver: ^4.1.0 @@ -10041,6 +10042,7 @@ __metadata: normalizr: ^3.3.0 object-hash: ^3.0.0 path-to-regexp: ^6.2.0 + pg: ^8.11.3 plop: ^3.1.1 popper.js: ^1.15.0 postinstall-postinstall: ^2.1.0 @@ -10526,6 +10528,24 @@ __metadata: languageName: node linkType: hard +"aws-sdk@npm:^2.1443.0": + version: 2.1443.0 + resolution: "aws-sdk@npm:2.1443.0" + dependencies: + buffer: 4.9.2 + events: 1.1.1 + ieee754: 1.1.13 + jmespath: 0.16.0 + querystring: 0.2.0 + sax: 1.2.1 + url: 0.10.3 + util: ^0.12.4 + uuid: 8.0.0 + xml2js: 0.5.0 + checksum: 494124cded48679ec449bfa1cee54db969141639414b71fd984d519f5cc4904b614a023339ad17f58f89d5ca45e038d9bc89b22bdd4e5b02b138eb0d800162f7 + languageName: node + linkType: hard + "aws-sign2@npm:~0.7.0": version: 0.7.0 resolution: "aws-sign2@npm:0.7.0" @@ -11501,6 +11521,13 @@ __metadata: languageName: node linkType: hard +"buffer-writer@npm:2.0.0": + version: 2.0.0 + resolution: "buffer-writer@npm:2.0.0" + checksum: 11736b48bb75106c52ca8ec9f025e7c1b3b25ce31875f469d7210eabd5c576c329e34f6b805d4a8d605ff3f0db1e16342328802c4c963e9c826b0e43a4e631c2 + languageName: node + linkType: hard + "buffer-xor@npm:^1.0.3": version: 1.0.3 resolution: "buffer-xor@npm:1.0.3" @@ -11508,6 +11535,17 @@ __metadata: languageName: node linkType: hard +"buffer@npm:4.9.2": + version: 4.9.2 + resolution: "buffer@npm:4.9.2" + dependencies: + base64-js: ^1.0.2 + ieee754: ^1.1.4 + isarray: ^1.0.0 + checksum: 8801bc1ba08539f3be70eee307a8b9db3d40f6afbfd3cf623ab7ef41dffff1d0a31de0addbe1e66e0ca5f7193eeb667bfb1ecad3647f8f1b0750de07c13295c3 + languageName: node + linkType: hard + "buffer@npm:^5.5.0, buffer@npm:^5.6.0": version: 5.7.1 resolution: "buffer@npm:5.7.1" @@ -15415,7 +15453,7 @@ __metadata: languageName: node linkType: hard -"events@npm:^1.1.1": +"events@npm:1.1.1, events@npm:^1.1.1": version: 1.1.1 resolution: "events@npm:1.1.1" checksum: 40431eb005cc4c57861b93d44c2981a49e7feb99df84cf551baed299ceea4444edf7744733f6a6667e942af687359b1f4a87ec1ec4f21d5127dac48a782039b9 @@ -17622,6 +17660,13 @@ __metadata: languageName: node linkType: hard +"ieee754@npm:1.1.13": + version: 1.1.13 + resolution: "ieee754@npm:1.1.13" + checksum: 102df1ba662e316e6160f7ce29c7c7fa3e04f2014c288336c5a9ff40bbcc2a27d209fa2a81ebfb33f28b1941021343d30e9ad8ee85a2d61f79f5936c35edc33d + languageName: node + linkType: hard + "ieee754@npm:^1.1.13, ieee754@npm:^1.1.4, ieee754@npm:^1.2.1": version: 1.2.1 resolution: "ieee754@npm:1.2.1" @@ -18509,6 +18554,13 @@ __metadata: languageName: node linkType: hard +"isarray@npm:^1.0.0, isarray@npm:~1.0.0": + version: 1.0.0 + resolution: "isarray@npm:1.0.0" + checksum: f032df8e02dce8ec565cf2eb605ea939bdccea528dbcf565cdf92bfa2da9110461159d86a537388ef1acef8815a330642d7885b29010e8f7eac967c9993b65ab + languageName: node + linkType: hard + "isarray@npm:^2.0.5": version: 2.0.5 resolution: "isarray@npm:2.0.5" @@ -18516,13 +18568,6 @@ __metadata: languageName: node linkType: hard -"isarray@npm:~1.0.0": - version: 1.0.0 - resolution: "isarray@npm:1.0.0" - checksum: f032df8e02dce8ec565cf2eb605ea939bdccea528dbcf565cdf92bfa2da9110461159d86a537388ef1acef8815a330642d7885b29010e8f7eac967c9993b65ab - languageName: node - linkType: hard - "isbinaryfile@npm:^4.0.8": version: 4.0.10 resolution: "isbinaryfile@npm:4.0.10" @@ -19732,6 +19777,13 @@ __metadata: languageName: node linkType: hard +"jmespath@npm:0.16.0": + version: 0.16.0 + resolution: "jmespath@npm:0.16.0" + checksum: 2d602493a1e4addfd1350ac8c9d54b1b03ed09e305fd863bab84a4ee1f52868cf939dd1a08c5cdea29ce9ba8f86875ebb458b6ed45dab3e1c3f2694503fb2fd9 + languageName: node + linkType: hard + "joi@npm:^17.3.0": version: 17.9.2 resolution: "joi@npm:17.9.2" @@ -22270,6 +22322,13 @@ __metadata: languageName: node linkType: hard +"packet-reader@npm:1.0.0": + version: 1.0.0 + resolution: "packet-reader@npm:1.0.0" + checksum: 0b7516f0cbf3e322aad591bed29ba544220088c53943145c0d9121a6f59182ad811f7fd6785a8979a34356aca69d97653689029964c5998dc02645633d88ffd7 + languageName: node + linkType: hard + "paging-algorithm@npm:^1.0.1": version: 1.0.1 resolution: "paging-algorithm@npm:1.0.1" @@ -22581,6 +22640,89 @@ __metadata: languageName: node linkType: hard +"pg-cloudflare@npm:^1.1.1": + version: 1.1.1 + resolution: "pg-cloudflare@npm:1.1.1" + checksum: 32aac06b5dc4588bbf78801b6267781bc7e13be672009df949d08e9627ba9fdc26924916665d4de99d47f9b0495301930547488dad889d826856976c7b3f3731 + languageName: node + linkType: hard + +"pg-connection-string@npm:^2.6.2": + version: 2.6.2 + resolution: "pg-connection-string@npm:2.6.2" + checksum: 22265882c3b6f2320785378d0760b051294a684989163d5a1cde4009e64e84448d7bf67d9a7b9e7f69440c3ee9e2212f9aa10dd17ad6773f6143c6020cebbcb5 + languageName: node + linkType: hard + +"pg-int8@npm:1.0.1": + version: 1.0.1 + resolution: "pg-int8@npm:1.0.1" + checksum: a1e3a05a69005ddb73e5f324b6b4e689868a447c5fa280b44cd4d04e6916a344ac289e0b8d2695d66e8e89a7fba023affb9e0e94778770ada5df43f003d664c9 + languageName: node + linkType: hard + +"pg-pool@npm:^3.6.1": + version: 3.6.1 + resolution: "pg-pool@npm:3.6.1" + peerDependencies: + pg: ">=8.0" + checksum: 8a6513e6f74a794708c9dd16d2ccda0debadc56435ec2582de2b2e35b01315550c5dab8a0a9a2a16f4adce45523228f5739940fb7687ec7e9c300f284eb08fd1 + languageName: node + linkType: hard + +"pg-protocol@npm:^1.6.0": + version: 1.6.0 + resolution: "pg-protocol@npm:1.6.0" + checksum: e12662d2de2011e0c3a03f6a09f435beb1025acdc860f181f18a600a5495dc38a69d753bbde1ace279c8c442536af9c1a7c11e1d0fe3fad3aa1348b28d9d2683 + languageName: node + linkType: hard + +"pg-types@npm:^2.1.0": + version: 2.2.0 + resolution: "pg-types@npm:2.2.0" + dependencies: + pg-int8: 1.0.1 + postgres-array: ~2.0.0 + postgres-bytea: ~1.0.0 + postgres-date: ~1.0.4 + postgres-interval: ^1.1.0 + checksum: bf4ec3f594743442857fb3a8dfe5d2478a04c98f96a0a47365014557cbc0b4b0cee01462c79adca863b93befbf88f876299b75b72c665b5fb84a2c94fbd10316 + languageName: node + linkType: hard + +"pg@npm:^8.11.3": + version: 8.11.3 + resolution: "pg@npm:8.11.3" + dependencies: + buffer-writer: 2.0.0 + packet-reader: 1.0.0 + pg-cloudflare: ^1.1.1 + pg-connection-string: ^2.6.2 + pg-pool: ^3.6.1 + pg-protocol: ^1.6.0 + pg-types: ^2.1.0 + pgpass: 1.x + peerDependencies: + pg-native: ">=3.0.1" + dependenciesMeta: + pg-cloudflare: + optional: true + peerDependenciesMeta: + pg-native: + optional: true + checksum: 8af9468b8969fa0d73a6b349216c8cbc953d938fcae5594f2d24043060e9226a072c8085fc4230172b5576fcab4c39c8563c655f271dc2a9209b6ad5370cafe5 + languageName: node + linkType: hard + +"pgpass@npm:1.x": + version: 1.0.5 + resolution: "pgpass@npm:1.0.5" + dependencies: + split2: ^4.1.0 + checksum: 947ac096c031eebdf08d989de2e9f6f156b8133d6858c7c2c06c041e1e71dda6f5f3bad3c0ec1e96a09497bbc6ef89e762eefe703b5ef9cb2804392ec52ec400 + languageName: node + linkType: hard + "picocolors@npm:^0.2.1": version: 0.2.1 resolution: "picocolors@npm:0.2.1" @@ -23632,6 +23774,36 @@ __metadata: languageName: node linkType: hard +"postgres-array@npm:~2.0.0": + version: 2.0.0 + resolution: "postgres-array@npm:2.0.0" + checksum: 0e1e659888147c5de579d229a2d95c0d83ebdbffc2b9396d890a123557708c3b758a0a97ed305ce7f58edfa961fa9f0bbcd1ea9f08b6e5df73322e683883c464 + languageName: node + linkType: hard + +"postgres-bytea@npm:~1.0.0": + version: 1.0.0 + resolution: "postgres-bytea@npm:1.0.0" + checksum: d844ae4ca7a941b70e45cac1261a73ee8ed39d72d3d74ab1d645248185a1b7f0ac91a3c63d6159441020f4e1f7fe64689ac56536a307b31cef361e5187335090 + languageName: node + linkType: hard + +"postgres-date@npm:~1.0.4": + version: 1.0.7 + resolution: "postgres-date@npm:1.0.7" + checksum: 5745001d47e51cd767e46bcb1710649cd705d91a24d42fa661c454b6dcbb7353c066a5047983c90a626cd3bbfea9e626cc6fa84a35ec57e5bbb28b49f78e13ed + languageName: node + linkType: hard + +"postgres-interval@npm:^1.1.0": + version: 1.2.0 + resolution: "postgres-interval@npm:1.2.0" + dependencies: + xtend: ^4.0.0 + checksum: 746b71f93805ae33b03528e429dc624706d1f9b20ee81bf743263efb6a0cd79ae02a642a8a480dbc0f09547b4315ab7df6ce5ec0be77ed700bac42730f5c76b2 + languageName: node + linkType: hard + "postinstall-postinstall@npm:^2.1.0": version: 2.1.0 resolution: "postinstall-postinstall@npm:2.1.0" @@ -23968,6 +24140,13 @@ __metadata: languageName: node linkType: hard +"punycode@npm:1.3.2": + version: 1.3.2 + resolution: "punycode@npm:1.3.2" + checksum: b8807fd594b1db33335692d1f03e8beeddde6fda7fbb4a2e32925d88d20a3aa4cd8dcc0c109ccaccbd2ba761c208dfaaada83007087ea8bfb0129c9ef1b99ed6 + languageName: node + linkType: hard + "punycode@npm:^1.3.2, punycode@npm:^1.4.1": version: 1.4.1 resolution: "punycode@npm:1.4.1" @@ -24087,6 +24266,13 @@ __metadata: languageName: node linkType: hard +"querystring@npm:0.2.0": + version: 0.2.0 + resolution: "querystring@npm:0.2.0" + checksum: 8258d6734f19be27e93f601758858c299bdebe71147909e367101ba459b95446fbe5b975bf9beb76390156a592b6f4ac3a68b6087cea165c259705b8b4e56a69 + languageName: node + linkType: hard + "querystringify@npm:^2.1.1": version: 2.2.0 resolution: "querystringify@npm:2.2.0" @@ -26407,6 +26593,20 @@ __metadata: languageName: node linkType: hard +"sax@npm:1.2.1": + version: 1.2.1 + resolution: "sax@npm:1.2.1" + checksum: 8dca7d5e1cd7d612f98ac50bdf0b9f63fbc964b85f0c4e2eb271f8b9b47fd3bf344c4d6a592e69ecf726d1485ca62cd8a52e603bbc332d18a66af25a9a1045ad + languageName: node + linkType: hard + +"sax@npm:>=0.6.0, sax@npm:~1.2.4": + version: 1.2.4 + resolution: "sax@npm:1.2.4" + checksum: d3df7d32b897a2c2f28e941f732c71ba90e27c24f62ee918bd4d9a8cfb3553f2f81e5493c7f0be94a11c1911b643a9108f231dd6f60df3fa9586b5d2e3e9e1fe + languageName: node + linkType: hard + "sax@npm:~1.1.1": version: 1.1.6 resolution: "sax@npm:1.1.6" @@ -26414,13 +26614,6 @@ __metadata: languageName: node linkType: hard -"sax@npm:~1.2.4": - version: 1.2.4 - resolution: "sax@npm:1.2.4" - checksum: d3df7d32b897a2c2f28e941f732c71ba90e27c24f62ee918bd4d9a8cfb3553f2f81e5493c7f0be94a11c1911b643a9108f231dd6f60df3fa9586b5d2e3e9e1fe - languageName: node - linkType: hard - "saxes@npm:^5.0.1": version: 5.0.1 resolution: "saxes@npm:5.0.1" @@ -27212,6 +27405,13 @@ __metadata: languageName: node linkType: hard +"split2@npm:^4.1.0": + version: 4.2.0 + resolution: "split2@npm:4.2.0" + checksum: 05d54102546549fe4d2455900699056580cca006c0275c334611420f854da30ac999230857a85fdd9914dc2109ae50f80fda43d2a445f2aa86eccdc1dfce779d + languageName: node + linkType: hard + "sprintf-js@npm:~1.0.2": version: 1.0.3 resolution: "sprintf-js@npm:1.0.3" @@ -29220,6 +29420,16 @@ __metadata: languageName: node linkType: hard +"url@npm:0.10.3": + version: 0.10.3 + resolution: "url@npm:0.10.3" + dependencies: + punycode: 1.3.2 + querystring: 0.2.0 + checksum: 7b83ddb106c27bf9bde8629ccbe8d26e9db789c8cda5aa7db72ca2c6f9b8a88a5adf206f3e10db78e6e2d042b327c45db34c7010c1bf0d9908936a17a2b57d05 + languageName: node + linkType: hard + "url@npm:~0.11.0": version: 0.11.1 resolution: "url@npm:0.11.1" @@ -29381,6 +29591,15 @@ __metadata: languageName: node linkType: hard +"uuid@npm:8.0.0": + version: 8.0.0 + resolution: "uuid@npm:8.0.0" + bin: + uuid: dist/bin/uuid + checksum: 56d4e23aa7ac26fa2db6bd1778db34cb8c9f5a10df1770a27167874bf6705fc8f14a4ac414af58a0d96c7653b2bd4848510b29d1c2ef8c91ccb17429c1872b5e + languageName: node + linkType: hard + "uuid@npm:^3.2.1": version: 3.4.0 resolution: "uuid@npm:3.4.0" @@ -30483,6 +30702,16 @@ __metadata: languageName: node linkType: hard +"xml2js@npm:0.5.0": + version: 0.5.0 + resolution: "xml2js@npm:0.5.0" + dependencies: + sax: ">=0.6.0" + xmlbuilder: ~11.0.0 + checksum: 1aa71d62e5bc2d89138e3929b9ea46459157727759cbc62ef99484b778641c0cd21fb637696c052d901a22f82d092a3e740a16b4ce218e81ac59b933535124ea + languageName: node + linkType: hard + "xmlbuilder@npm:^10.0.0": version: 10.1.1 resolution: "xmlbuilder@npm:10.1.1" @@ -30497,6 +30726,13 @@ __metadata: languageName: node linkType: hard +"xmlbuilder@npm:~11.0.0": + version: 11.0.1 + resolution: "xmlbuilder@npm:11.0.1" + checksum: 7152695e16f1a9976658215abab27e55d08b1b97bca901d58b048d2b6e106b5af31efccbdecf9b07af37c8377d8e7e821b494af10b3a68b0ff4ae60331b415b0 + languageName: node + linkType: hard + "xmlchars@npm:^2.2.0": version: 2.2.0 resolution: "xmlchars@npm:2.2.0"