diff --git a/.circleci/config.yml b/.circleci/config.yml index f7ffe6087ec3..02786e74109f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -677,57 +677,118 @@ jobs: - run: npm run chromatic # E2E TESTS - e2e-tests: + e2e-setup-db: docker: - - image: cimg/base:2021.03 - parallelism: 3 + - image: cimg/base:2024.08 working_directory: ~/citizenlab - resource_class: medium+ + resource_class: medium steps: - shallow-clone - copy_secrets_from_lastpass - - setup_remote_docker + - setup_remote_docker: + docker_layer_caching: true - run: docker login -u $DOCKER_USER -p $DOCKER_PASS - run: | cd e2e - # --parallel is weird https://github.com/docker/compose/issues/7901 but it seems to work. - # `docker compose` (w/o hythen) doesn't work atm "docker: 'compose' is not a docker command" - docker-compose build --parallel + docker compose run web bin/rails db:drop db:create db:schema:load + docker compose run web bin/rails "cl2_back:create_tenant[e2e.front,e2etests_template]" + - run: docker cp $(docker ps -lq):/cl2_back/public/uploads . - run: | cd e2e - docker-compose run web bin/rails db:drop db:create db:schema:load - docker-compose run web bin/rails "cl2_back:create_tenant[e2e.front,e2etests_template]" + docker cp -a $(docker compose ps -q postgres):/var/lib/postgresql/data ../postgresql-data + - run: | + docker tag e2e-web citizenlabdotco/back-e2e:$CIRCLE_SHA1 + docker push citizenlabdotco/back-e2e:$CIRCLE_SHA1 + - persist_to_workspace: + root: . + paths: + - postgresql-data + - uploads + - env_files + + e2e-setup-front: + docker: + - image: cimg/base:2024.08 + resource_class: large + working_directory: ~/citizenlab + steps: + - shallow-clone + - copy_secrets_from_lastpass + - setup_remote_docker: + docker_layer_caching: true + - run: docker login -u $DOCKER_USER -p $DOCKER_PASS + - run: | + cd e2e + docker compose run --build front npm run build:test + - run: docker cp $(docker ps -lq):/front/build . + - run: | + docker tag e2e-front citizenlabdotco/front-e2e:$CIRCLE_SHA1 + - run: | + docker push citizenlabdotco/front-e2e:$CIRCLE_SHA1 + - persist_to_workspace: + root: . + paths: + - build + e2e-tests: + docker: + - image: cimg/base:2024.08 + parallelism: 16 + working_directory: ~/citizenlab + resource_class: medium + steps: + - shallow-clone + - setup_remote_docker + - run: docker login -u $DOCKER_USER -p $DOCKER_PASS + - attach_workspace: + at: . - run: command: | - cd e2e - docker-compose up + cd e2e + docker compose -f docker-compose.yml -f docker-compose.test.yml pull cypress background: true - # Wait until build is finished. - run: | - sleep 10 # if we run `docker-compose run` immediately, it fails with "network is ambiguous (2 matches found on name)" cd e2e - # we cannot access localhost:3000, so we call it from the container - # https://discuss.circleci.com/t/cannot-communicate-with-docker-container/27253/2 - docker-compose run front curl --retry 2 --retry-delay 5 --retry-connrefused -v http://e2e.front:3000 + docker compose -f docker-compose.yml -f docker-compose.test.yml up --no-start + - run: | + cd e2e + WEB_CONTAINER_ID=$(docker compose ps -a -q web) + FRONT_CONTAINER_ID=$(docker compose ps -a -q front) + POSTGRES_CONTAINER_ID=$(docker compose ps -a -q postgres) + docker cp ../uploads/. $WEB_CONTAINER_ID:/cl2_back/public/uploads + docker cp ../build $FRONT_CONTAINER_ID:/front/build + docker cp ../postgresql-data/. $POSTGRES_CONTAINER_ID:/var/lib/postgresql/data + - run: | + cd e2e + docker compose -f docker-compose.yml -f docker-compose.test.yml up -d --wait + - run: + command: | + cd e2e + docker compose -f docker-compose.yml -f docker-compose.test.yml logs -f + background: true - run: | cd front - mkdir -p reports - TESTFILES=$(circleci tests glob "cypress/e2e/**/*.cy.ts" | circleci tests split --split-by=timings) + TESTFILES=$(circleci tests glob "cypress/e2e/**/*.cy.ts" | circleci tests split --split-by=timings) COMMA_SEPARATED_TESTFILES=$(echo $TESTFILES | sed 's/ /,/g') echo $COMMA_SEPARATED_TESTFILES cd ../e2e - docker-compose run --name cypress_run front npm run cypress:run -- --reporter junit --reporter-options "mochaFile=../front/reports/cypress.xml" --config baseUrl=http://e2e.front:3000 --spec ${COMMA_SEPARATED_TESTFILES} - # We run cypress tests in container, so we need to copy the results out. - - run: | - mkdir -p front/reports - docker cp cypress_run:/front/reports/cypress.xml front/reports/cypress.xml + docker compose -f docker-compose.yml -f docker-compose.test.yml --profile cypress run --name cypress_run \ + cypress npm run cypress:run -- \ + --reporter cypress-circleci-reporter \ + --config baseUrl=http://e2e.front:3000 \ + --spec ${COMMA_SEPARATED_TESTFILES} + - run: + command: | + docker cp cypress_run:/front/test_results . + when: always - run: command: docker cp cypress_run:/front/cypress/screenshots . # If `when: always`, it fails on success with # Error: No such container:path: cypress_run:/front/cypress/screenshots when: on_fail - store_test_results: - path: front/reports + path: test_results + - store_artifacts: + path: test_results - store_artifacts: path: screenshots @@ -888,7 +949,7 @@ workflows: branches: only: production - back-deploy-to-swarm: - name: Deploy to Europe (Frankfurt) + name: Deploy to Europe requires: - back-push-deployment-docker-image filters: @@ -900,19 +961,6 @@ workflows: stack_name: cl2-prd-bnlx-stack env_file: ".env-web" cluster_name: "eu" - - back-deploy-to-swarm: - name: Deploy to Europe (Paris) - requires: - - back-push-deployment-docker-image - filters: - branches: - only: - - production - ssh_host: $CITIZENLAB_CLUSTER_IP_ADDRESS_PARIS - compose_file: docker-compose-production.yml - stack_name: cl2 - env_file: ".env-web" - cluster_name: "paris" - back-deploy-to-swarm: name: Deploy to Canada requires: @@ -1064,10 +1112,21 @@ workflows: manually-e2e-tests: when: << pipeline.parameters.e2e >> jobs: + - e2e-setup-db: + context: + - docker-hub-access + - lastpass + - e2e-setup-front: + context: + - docker-hub-access + - lastpass - e2e-tests: context: - docker-hub-access - lastpass + requires: + - e2e-setup-db + - e2e-setup-front nightly-e2e-tests: triggers: @@ -1102,7 +1161,7 @@ workflows: - slack-dev-notifications-tenant-templates <<: *slack-fail-post-step-templates - back-generate-tenant-templates: - name: "Europe (Frankfurt)" + name: "Europe (mainland)" context: - docker-hub-access - citizenlab-ee-environment @@ -1110,15 +1169,6 @@ workflows: <<: *slack-fail-post-step-templates ssh_host: $CITIZENLAB_CLUSTER_IP_ADDRESS_EUROPE env_file: ".env-web" - - back-generate-tenant-templates: - name: "Europe (Paris)" - context: - - docker-hub-access - - citizenlab-ee-environment - - slack-dev-notifications-tenant-templates - <<: *slack-fail-post-step-templates - ssh_host: $CITIZENLAB_CLUSTER_IP_ADDRESS_PARIS - env_file: ".env-web" - back-generate-tenant-templates: name: "South America" context: @@ -1163,8 +1213,7 @@ workflows: <<: *slack-fail-post-step-templates requires: - back-build-docker-image - - "Europe (Frankfurt)" - - "Europe (Paris)" + - "Europe (mainland)" - "South America" - "Canada" - "US West" @@ -1203,7 +1252,7 @@ workflows: - slack-dev-notifications-tenant-templates <<: *slack-fail-post-step-templates - back-generate-tenant-templates: - name: "Europe (Frankfurt)" + name: "Europe (mainland)" context: - docker-hub-access - citizenlab-ee-environment @@ -1211,15 +1260,6 @@ workflows: <<: *slack-fail-post-step-templates ssh_host: $CITIZENLAB_CLUSTER_IP_ADDRESS_EUROPE env_file: ".env-web" - - back-generate-tenant-templates: - name: "Europe (Paris)" - context: - - docker-hub-access - - citizenlab-ee-environment - - slack-dev-notifications-tenant-templates - <<: *slack-fail-post-step-templates - ssh_host: $CITIZENLAB_CLUSTER_IP_ADDRESS_PARIS - env_file: ".env-web" - back-generate-tenant-templates: name: "South America" context: @@ -1264,8 +1304,7 @@ workflows: <<: *slack-fail-post-step-templates requires: - back-build-docker-image - - "Europe (Frankfurt)" - - "Europe (Paris)" + - "Europe (mainland)" - "South America" - "Canada" - "US West" @@ -1295,13 +1334,6 @@ workflows: only: - production jobs: - - check-for-inconsistent-data: - <<: *slack-fail-post-step-inconsistent-data - name: "Europe (Paris)" - context: - - slack-dev-notifications-inconsistent-data - ssh_host: $CITIZENLAB_CLUSTER_IP_ADDRESS_PARIS - env_file: ".env-web" - check-for-inconsistent-data: <<: *slack-fail-post-step-inconsistent-data name: "South America" @@ -1364,4 +1396,4 @@ workflows: - front-chromatic: context: - docker-hub-access - - chromatic + - chromatic \ No newline at end of file diff --git a/.circleci/install_lpass.sh b/.circleci/install_lpass.sh index df140344e38d..21a4d7a6ea0a 100755 --- a/.circleci/install_lpass.sh +++ b/.circleci/install_lpass.sh @@ -14,21 +14,46 @@ if ! git clone --depth 1 --branch "$version" "$repository" lastpass-cli; then exit 1 fi + +if [ ! -f /etc/lsb-release ]; then + echo "lsb-release missing, unlikely to be a Ubuntu system" + exit 1 +fi +. /etc/lsb-release +if [ "$DISTRIB_RELEASE" == "22.04" ]; then # Install the dependencies -apt-get update -apt-get --no-install-recommends -yqq install \ - bash-completion \ - build-essential \ - cmake \ - libcurl4 \ - libcurl4-openssl-dev \ - libssl-dev \ - libxml2 \ - libxml2-dev \ - libssl1.1 \ - pkg-config \ - ca-certificates \ - xclip + apt-get update + apt-get --no-install-recommends -yqq install \ + bash-completion \ + build-essential \ + cmake \ + libcurl4 \ + libcurl4-openssl-dev \ + libssl-dev \ + libxml2 \ + libxml2-dev \ + pkg-config \ + ca-certificates \ + xclip +fi + +if [ "$DISTRIB_RELEASE" != "22.04" ]; then +# Install the dependencies + apt-get update + apt-get --no-install-recommends -yqq install \ + bash-completion \ + build-essential \ + cmake \ + libcurl4 \ + libcurl4-openssl-dev \ + libssl-dev \ + libxml2 \ + libxml2-dev \ + libssl1.1 \ + pkg-config \ + ca-certificates \ + xclip +fi # Build and install the LastPass CLI cd lastpass-cli diff --git a/e2e/docker-compose.test.yml b/e2e/docker-compose.test.yml new file mode 100644 index 000000000000..3404baf72e38 --- /dev/null +++ b/e2e/docker-compose.test.yml @@ -0,0 +1,46 @@ +# This files should be used in a chained way with +# `docker compose -f docker-compose.yml -f docker-compose.test.yml up` + +version: "3.8" + +services: + web: + image: citizenlabdotco/back-e2e:${CIRCLE_SHA1} + healthcheck: + test: ["CMD", "curl", "-f", "http://e2e-web:4000"] + interval: 2s + timeout: 1s + retries: 20 + start_period: 30s + + front: + image: citizenlabdotco/cl2-devops-front-e2e-static:latest + build: + context: ../front/. + dockerfile: Dockerfile-static-hosting + healthcheck: + test: ["CMD", "curl", "-f", "http://e2e.front:3000"] + interval: 2s + timeout: 1s + retries: 10 + environment: + API_HOST: e2e-web + API_PORT: 4000 + command: node server/production.js + + postgres: + healthcheck: + test: ["CMD", "pg_isready", "-U", "postgres"] + interval: 1s + timeout: 1s + retries: 10 + + cypress: + profiles: [cypress] + image: citizenlabdotco/front-e2e:${CIRCLE_SHA1} + environment: + API_HOST: e2e.front + API_PORT: 3000 + env_file: + - "../env_files/front-safe.env" + - "../env_files/front-secret.env" diff --git a/e2e/docker-compose.yml b/e2e/docker-compose.yml index 9a5e9bb9c391..4951e5138592 100644 --- a/e2e/docker-compose.yml +++ b/e2e/docker-compose.yml @@ -27,7 +27,7 @@ services: POSTGRES_HOST: e2e-postgres OVERRIDE_HOST: "e2e.front" ASSET_HOST_URI: "http://e2e.front:3000" # it's proxied to `API_HOST: e2e-web` by webpack server - WEB_CONCURRENCY: 3 + WEB_CONCURRENCY: 2 rabbitmq: container_name: e2e-rabbit @@ -48,5 +48,7 @@ services: - "../env_files/front-safe.env" - "../env_files/front-secret.env" environment: - API_HOST: e2e-web - command: npm start + NODE_ENV: "test" + API_HOST: e2e.front + API_PORT: 3000 + TEST_BUILD: "true" diff --git a/front/Dockerfile b/front/Dockerfile index 129e8fbf7f2a..52722e26f2a4 100644 --- a/front/Dockerfile +++ b/front/Dockerfile @@ -1,4 +1,8 @@ -FROM cypress/browsers:node-20.11.1-chrome-123.0.6312.58-1-ff-124.0-edge-122.0.2365.92-1 + +ARG NODE_VERSION='20.11.1' +ARG CHROME_VERSION='125.0.6422.141-1' + +FROM cypress/factory:4.1.0 WORKDIR / diff --git a/front/Dockerfile-static-hosting b/front/Dockerfile-static-hosting new file mode 100644 index 000000000000..1597aac3d666 --- /dev/null +++ b/front/Dockerfile-static-hosting @@ -0,0 +1,19 @@ +# This Dockerfile is used to build the image that CI uses to run the front-end +# for the e2e tests. The front-end bundle is already built, so it only needs +# minimal depencencies to host a small express server. The image is stored in +# Docker Hub as citizenlabdotco/cl2-devops-front-e2e-static. In case you need to +# update it, perform following steps: +# 1. Build the image with `docker build -f Dockerfile-static-hosting -t citizenlabdotco/cl2-devops-front-e2e-static .` +# 2. Push the image to Docker Hub with `docker push citizenlabdotco/cl2-devops-front-e2e-static` + +FROM node:20.16.0-slim + +RUN apt-get update && apt-get install -y curl + +WORKDIR /front + +RUN npm install express request compression + +ADD ./server server + +CMD ["node", "server/production"] diff --git a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx index 1984c019f29f..6444782e00f7 100644 --- a/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx +++ b/front/app/containers/Admin/reporting/components/ReportBuilder/TopBar/index.tsx @@ -50,6 +50,17 @@ type ContentBuilderTopBarProps = { setSelectedLocale: React.Dispatch>; }; +const TEMPLATE_NODES = new Set([ + 'ProjectTemplate', + 'PhaseTemplate', + 'PlatformTemplate', +]); + +const isTemplateNode = (resolvedName?: string) => { + if (!resolvedName) return false; + return TEMPLATE_NODES.has(resolvedName); +}; + const ContentBuilderTopBar = ({ selectedLocale, hasPendingState, @@ -137,13 +148,11 @@ const ContentBuilderTopBar = ({ const firstNode = nodes.ROOT?.nodes[0]; if (!firstNode) return; - const displayName = nodes?.[firstNode].displayName; + const type = nodes?.[firstNode].type; + const resolvedName = + typeof type === 'object' ? type.resolvedName : undefined; - if ( - !['ProjectTemplate', 'PhaseTemplate', 'PlatformTemplate'].includes( - displayName - ) - ) { + if (!isTemplateNode(resolvedName)) { // In theory this should not be possible, but handling // it gracefully just in case setInitialized(true); @@ -158,13 +167,13 @@ const ContentBuilderTopBar = ({ const numberOfNodes = Object.keys(nodes).length; if ( - displayName === 'ProjectTemplate' && + resolvedName === 'ProjectTemplate' && numberOfNodes < PROJECT_TEMPLATE_MIN_NUMBER_OF_NODES_BEFORE_AUTOSAVE ) { return; } if ( - displayName === 'PlatformTemplate' && + resolvedName === 'PlatformTemplate' && numberOfNodes < PLATFORM_TEMPLATE_MIN_NUMBER_OF_NODES_BEFORE_AUTOSAVE ) { return; diff --git a/front/cypress.config.ts b/front/cypress.config.ts index e00525893f49..f3fc38e49b28 100644 --- a/front/cypress.config.ts +++ b/front/cypress.config.ts @@ -27,6 +27,6 @@ export default defineConfig({ return require('./cypress/plugins/index.js')(on, config); }, baseUrl: 'http://localhost:3000', - experimentalSessionAndOrigin: true, + experimentalSessionAndOrigin: false, }, }); diff --git a/front/cypress/e2e/auth/verification_modal.cy.ts b/front/cypress/e2e/auth/verification_modal.cy.ts index 9d47dcc365ad..338c886a7638 100644 --- a/front/cypress/e2e/auth/verification_modal.cy.ts +++ b/front/cypress/e2e/auth/verification_modal.cy.ts @@ -46,6 +46,7 @@ describe('Verification modal', () => { describe('Participation with group conditions', () => { it('lets you participate if you meet group conditions', () => { + cy.clearCookies(); cy.visit('/projects/verified-charlie-poeple-project'); cy.get('.e2e-idea-button').find('button').should('exist'); cy.get('.e2e-idea-button').find('button').click({ force: true }); @@ -93,6 +94,7 @@ describe('Verification modal', () => { }); it('does not let you participate if you do not meet group conditions', () => { + cy.clearCookies(); cy.visit('/projects/verified-charlie-poeple-project'); cy.get('.e2e-idea-button').find('button').should('exist'); cy.get('.e2e-idea-button').find('button').click({ force: true }); diff --git a/front/cypress/e2e/email_consent.cy.ts b/front/cypress/e2e/email_consent.cy.ts index bcf6d1181b44..67ce523ae6b0 100644 --- a/front/cypress/e2e/email_consent.cy.ts +++ b/front/cypress/e2e/email_consent.cy.ts @@ -13,20 +13,25 @@ describe('email consent', () => { (button) => { // input cy.wrap(button).click(); + cy.wrap(button).should('have.class', 'selected'); cy.get('.e2e-campaign_subject_multiloc') .find('input') .first() .type('Test subject'); + cy.wrap(button).find('div').should('have.class', 'notEmpty'); } ); cy.get('.e2e-campaign_body_multiloc .e2e-localeswitcher').each((button) => { // input cy.wrap(button).click(); + cy.wrap(button).should('have.class', 'selected'); + // cy.wait(1000); cy.get('.e2e-campaign_body_multiloc') .find('.ql-editor') .first() .type('Test content'); + cy.wrap(button).find('div').should('have.class', 'notEmpty'); }); cy.get('#e2e-campaign-form-save-button').click(); diff --git a/front/cypress/e2e/report_builder/idea_template.cy.ts b/front/cypress/e2e/report_builder/idea_template.cy.ts index b2f01fbe7832..08a9e94383a0 100644 --- a/front/cypress/e2e/report_builder/idea_template.cy.ts +++ b/front/cypress/e2e/report_builder/idea_template.cy.ts @@ -151,7 +151,9 @@ describe('Idea template', () => { cy.intercept('PATCH', `/web_api/v1/reports/${reportId}`).as( 'saveReportLayout' ); - cy.get('#e2e-content-builder-topbar-save').click(); + cy.get('#e2e-content-builder-topbar-save > button').click({ + force: true, + }); cy.wait('@saveReportLayout'); // Refresh page diff --git a/front/package-lock.json b/front/package-lock.json index 56d2f6cefcc9..b4a105a4eded 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -31,7 +31,7 @@ "canvg": "^4.0.1", "clipboard-polyfill": "4.0.2", "compression": "1.7.4", - "cross-env": "7.0.3", + "cross-env": "^7.0.3", "date-fns": "^2.30.0", "dnd-core": "^16.0.1", "dotenv": "^16.0.3", @@ -168,6 +168,7 @@ "css-loader": "^6.7.3", "css-mediaquery": "^0.1.2", "cypress": "^13.14.1", + "cypress-circleci-reporter": "^0.2.0", "cypress-file-upload": "^5.0.8", "dependency-cruiser": "^16.2.4", "esbuild-loader": "^4.1.0", @@ -2687,22 +2688,6 @@ "version": "0.3.1", "license": "MIT" }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "dev": true, @@ -4060,6 +4045,54 @@ "node": ">= 8" } }, + "node_modules/@oozcitak/dom": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-1.15.8.tgz", + "integrity": "sha512-MoOnLBNsF+ok0HjpAvxYxR4piUhRDCEWK0ot3upwOOHYudJd30j6M+LNcE8RKpwfnclAX9T66nXXzkytd29XSw==", + "dev": true, + "dependencies": { + "@oozcitak/infra": "1.0.8", + "@oozcitak/url": "1.0.4", + "@oozcitak/util": "8.3.8" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@oozcitak/infra": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@oozcitak/infra/-/infra-1.0.8.tgz", + "integrity": "sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==", + "dev": true, + "dependencies": { + "@oozcitak/util": "8.3.8" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/@oozcitak/url": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@oozcitak/url/-/url-1.0.4.tgz", + "integrity": "sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==", + "dev": true, + "dependencies": { + "@oozcitak/infra": "1.0.8", + "@oozcitak/util": "8.3.8" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@oozcitak/util": { + "version": "8.3.8", + "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-8.3.8.tgz", + "integrity": "sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==", + "dev": true, + "engines": { + "node": ">=8.0" + } + }, "node_modules/@open-draft/deferred-promise": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", @@ -4333,160 +4366,6 @@ } } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", - "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "peer": true - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", - "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "peer": true - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", - "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", - "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", - "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", - "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", - "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", - "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", - "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", - "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", - "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, "node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.18.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", @@ -4515,48 +4394,6 @@ ], "peer": true }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", - "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "peer": true - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", - "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "peer": true - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", - "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "peer": true - }, "node_modules/@segment/snippet": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/@segment/snippet/-/snippet-5.2.1.tgz", @@ -6566,9 +6403,9 @@ } }, "node_modules/@storybook/core/node_modules/@types/node": { - "version": "18.19.47", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.47.tgz", - "integrity": "sha512-1f7dB3BL/bpd9tnDJrrHb66Y+cVrhxSOTGorRNdHwYTUlTay3HuTDPKo9a/4vX9pMQkhYBcAbL4jQdNlhCFP9A==", + "version": "18.19.48", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.48.tgz", + "integrity": "sha512-7WevbG4ekUcRQSZzOwxWgi5dZmTak7FaxXDoW7xVxPBmKx1rTzfmRLkeCgJzcbBnOV2dkhAPc8cCeT6agocpjg==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -10926,9 +10763,10 @@ } }, "node_modules/ansi-colors": { - "version": "4.1.1", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -12011,6 +11849,13 @@ "dev": true, "license": "BSD-2-Clause" }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true, + "peer": true + }, "node_modules/browserslist": { "version": "4.23.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", @@ -12479,8 +12324,7 @@ }, "node_modules/clone": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "license": "MIT", "engines": { "node": ">=0.8" } @@ -13339,6 +13183,19 @@ "node": "^16.0.0 || ^18.0.0 || >=20.0.0" } }, + "node_modules/cypress-circleci-reporter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/cypress-circleci-reporter/-/cypress-circleci-reporter-0.2.0.tgz", + "integrity": "sha512-uhqcJwvtKJ7Bw3RHVBTqUH9GP2L6jq+qLp/+/Jh3/OSe5Af6H7RxIARhvawsvbPrg9lMWdW/jCezjeUcXrl9uA==", + "dev": true, + "dependencies": { + "strip-ansi": "^6.0.0", + "xmlbuilder2": "^2.1.1" + }, + "peerDependencies": { + "mocha": ">=7" + } + }, "node_modules/cypress-file-upload": { "version": "5.0.8", "dev": true, @@ -13555,8 +13412,9 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.3.4", - "license": "MIT", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dependencies": { "ms": "2.1.2" }, @@ -13569,6 +13427,19 @@ } } }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/decimal.js": { "version": "10.4.1", "dev": true, @@ -13596,19 +13467,15 @@ "license": "MIT" }, "node_modules/deep-equal": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", - "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", + "version": "1.1.1", + "license": "MIT", "dependencies": { - "is-arguments": "^1.1.1", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "object-is": "^1.1.5", + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.5.1" - }, - "engines": { - "node": ">= 0.4" + "regexp.prototype.flags": "^1.2.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -14147,6 +14014,16 @@ "version": "1.1.0", "license": "MIT" }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/diff-sequences": { "version": "29.4.3", "dev": true, @@ -15291,8 +15168,7 @@ }, "node_modules/eventemitter3": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", - "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==" + "license": "MIT" }, "node_modules/events": { "version": "3.3.0", @@ -15814,6 +15690,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "peer": true, + "bin": { + "flat": "cli.js" + } + }, "node_modules/flat-cache": { "version": "3.0.4", "dev": true, @@ -17779,6 +17665,16 @@ "node": ">=8" } }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-object": { "version": "2.0.4", "dev": true, @@ -20126,6 +20022,170 @@ "ufo": "^1.5.3" } }, + "node_modules/mocha": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz", + "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/mocha/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "peer": true + }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "peer": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "peer": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "peer": true + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "peer": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + } + }, "node_modules/moment": { "version": "2.29.4", "license": "MIT", @@ -22429,8 +22489,7 @@ }, "node_modules/quill": { "version": "1.3.7", - "resolved": "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz", - "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==", + "license": "BSD-3-Clause", "dependencies": { "clone": "^2.1.1", "deep-equal": "^1.0.1", @@ -22469,13 +22528,11 @@ }, "node_modules/quill/node_modules/fast-diff": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", - "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==" + "license": "Apache-2.0" }, "node_modules/quill/node_modules/quill-delta": { "version": "3.6.3", - "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz", - "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==", + "license": "MIT", "dependencies": { "deep-equal": "^1.0.1", "extend": "^3.0.2", @@ -27324,6 +27381,13 @@ "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true }, + "node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true, + "peer": true + }, "node_modules/wrap-ansi": { "version": "7.0.0", "dev": true, @@ -27419,6 +27483,35 @@ "node": ">=12" } }, + "node_modules/xmlbuilder2": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/xmlbuilder2/-/xmlbuilder2-2.4.1.tgz", + "integrity": "sha512-vliUplZsk5vJnhxXN/mRcij/AE24NObTUm/Zo4vkLusgayO6s3Et5zLEA14XZnY1c3hX5o1ToR0m0BJOPy0UvQ==", + "dev": true, + "dependencies": { + "@oozcitak/dom": "1.15.8", + "@oozcitak/infra": "1.0.8", + "@oozcitak/util": "8.3.8", + "@types/node": "*", + "js-yaml": "3.14.0" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/xmlbuilder2/node_modules/js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/xmlchars": { "version": "2.2.0", "dev": true, @@ -27494,6 +27587,35 @@ "node": ">=12" } }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "peer": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/yauzl": { "version": "2.10.0", "dev": true, diff --git a/front/package.json b/front/package.json index 89d3f6e2122f..7182ffd823b8 100644 --- a/front/package.json +++ b/front/package.json @@ -14,6 +14,7 @@ "extract-intl": "tsc --skipLibCheck app/containers/App/constants && babel-node --presets @babel/env -- ./internals/scripts/extract-intl.js", "prebuild": "npm run build:clean", "build": "cross-env NODE_ENV=production NODE_OPTIONS='--max-old-space-size=4096' webpack --config internals/webpack/webpack.config.js --color", + "build:test": "cross-env NODE_ENV=test NODE_OPTIONS='--max-old-space-size=4096' webpack --config internals/webpack/webpack.config.js --color", "build:clean": "rimraf ./build", "build:staging": "cross-env NODE_ENV=staging NODE_OPTIONS='--max-old-space-size=4096' webpack --config internals/webpack/webpack.config.js --color", "start": "cross-env NODE_ENV=development webpack-dev-server --config internals/webpack/webpack.config.js", @@ -75,7 +76,7 @@ "canvg": "^4.0.1", "clipboard-polyfill": "4.0.2", "compression": "1.7.4", - "cross-env": "7.0.3", + "cross-env": "^7.0.3", "date-fns": "^2.30.0", "dnd-core": "^16.0.1", "dotenv": "^16.0.3", @@ -211,6 +212,7 @@ "copy-webpack-plugin": "^12.0.2", "css-loader": "^6.7.3", "css-mediaquery": "^0.1.2", + "cypress-circleci-reporter": "^0.2.0", "cypress": "^13.14.1", "cypress-file-upload": "^5.0.8", "dependency-cruiser": "^16.2.4", diff --git a/front/server/production.js b/front/server/production.js index 07618c5b3bd1..ea962972b605 100644 --- a/front/server/production.js +++ b/front/server/production.js @@ -17,28 +17,28 @@ app.use(compression()); // Redirects API requests app.use('/web_api', (req, res) => { req - .pipe(request(`http://${API_HOST}:${API_PORT}/web_api/${req.url}`)) + .pipe(request(`http://${API_HOST}:${API_PORT}/web_api${req.url}`)) .pipe(res); }); app.use('/admin_templates_api', (req, res) => { req .pipe( request( - `http://${GRAPHQL_HOST}:${GRAPHQL_PORT}/admin_templates_api/${req.url}` + `http://${GRAPHQL_HOST}:${GRAPHQL_PORT}/admin_templates_api${req.url}` ) ) .pipe(res); }); app.use('/auth', (req, res) => { - req.pipe(request(`http://${API_HOST}:${API_PORT}/auth/${req.url}`)).pipe(res); + req.pipe(request(`http://${API_HOST}:${API_PORT}/auth${req.url}`)).pipe(res); }); app.use('/uploads', function (req, res) { req - .pipe(request(`http://${API_HOST}:${API_PORT}/uploads/${req.url}`)) + .pipe(request(`http://${API_HOST}:${API_PORT}/uploads${req.url}`)) .pipe(res); }); app.use('/widgets', function (req, res) { - req.pipe(request(`http://${API_HOST}:3200/${req.url}`)).pipe(res); + req.pipe(request(`http://${API_HOST}:3200${req.url}`)).pipe(res); }); // Serve static files