diff --git a/.github/workflows/aws-frontend-deploy.mdx b/.github/workflows/aws-frontend-deploy.mdx new file mode 100644 index 000000000..c9755cb10 --- /dev/null +++ b/.github/workflows/aws-frontend-deploy.mdx @@ -0,0 +1,182 @@ +--- +title: AWS Frontend Deploy Workflow +--- + +# AWS Frontend Deploy Workflow + +This document describes the purpose and structure of the GitHub Actions workflow defined in `.github/workflows/aws-frontend-deploy.yml`. + +## Overview + +This workflow automates the process of building, pushing, and deploying the frontend application to AWS. It is triggered manually via the GitHub Actions UI using `workflow_dispatch`: + +```yaml +on: + workflow_dispatch: # Manual trigger from GitHub Actions UI + inputs: + env: + type: choice + description: "AWS Incubator Env" + options: # Selectable environment options + - dev + - prod + ref: + description: "Branch, Tag, or SHA" # Code reference to deploy + required: true +``` + +Users can select the environment (`dev` or `prod`) and specify a branch, tag, or SHA to deploy. + +## Environment Variables + +The workflow sets several environment variables for use throughout the jobs: + +```yaml +env: + AWS_SHARED_CLUSTER: incubator-prod # Target ECS cluster name + AWS_APP_NAME: vrms-frontend # Application name for tagging and service + AWS_REGION: us-west-2 # AWS region for deployment + DOCKERFILE: Dockerfile.prod # Dockerfile used for build + DOCKER_PATH: client # Path to frontend source and Dockerfile +``` + +Each of these environment variables is set at the top level of the workflow and is available to all jobs and steps. Here is a description of each: + +- `AWS_SHARED_CLUSTER`: The name of the AWS ECS cluster to which the frontend will be deployed. In this workflow, it is set to `incubator-prod`. _Might be sourced from your AWS infrastructure naming conventions or deployment environment._ +- `AWS_APP_NAME`: The application name used for tagging Docker images and identifying the service in AWS. Here, it is set to `vrms-frontend`. _Might be sourced from your project or repository name._ +- `AWS_REGION`: The AWS region where resources are deployed. Set to `us-west-2` (Oregon). _Might be sourced from your AWS account's preferred deployment region._ +- `DOCKERFILE`: The Dockerfile used for building the frontend image. Set to `Dockerfile.prod`, indicating a production-ready build. _Might be sourced from your repository's Docker configuration._ +- `DOCKER_PATH`: The path to the directory containing the Dockerfile and frontend source code. Set to `client`. _Might be sourced from your repository structure._ + +## Jobs + +### 1. `setup_env` + +This job checks out the code and sets up environment-specific variables for the deployment: + +```yaml +jobs: + setup_env: + name: Set-up environment + runs-on: ubuntu-latest + steps: + - name: Debug Action + uses: hmarr/debug-action@v2 # Prints debug info to logs + - name: Checkout + uses: actions/checkout@v3 # Checks out code at specified ref + with: + ref: ${{ github.event.inputs.ref }} # Uses user-specified ref + - name: Set AWS Env & Image Tag per workflow + # Get short SHA of current commit + # if -- action is triggered manually + # Get environment input from workflow dispatch + # Get ref input from workflow dispatch + # Set AWS_APPENV for later steps + # Set IMAGE_TAG for later steps + # fi + run: | + SHORT_SHA=$(git rev-parse --short HEAD) + if [[ "$GITHUB_EVENT_NAME" == "workflow_dispatch" ]]; then + INPUT_ENV=${{ github.event.inputs.env }} + INPUT_REF=${{ github.event.inputs.ref }} + echo AWS_APPENV="$AWS_APP_NAME"-$INPUT_ENV >> $GITHUB_ENV + echo IMAGE_TAG=$SHORT_SHA >> $GITHUB_ENV + fi +``` + +This job outputs the application environment and image tag for use in subsequent jobs. + +### 2. `build` + +This job builds the Docker image for the frontend and pushes it to Amazon ECR: + +```yaml +build: + name: Build & Push Docker Image + runs-on: ubuntu-latest + permissions: + id-token: write # Needed for OIDC authentication to AWS + needs: [setup_env] # Waits for environment setup + steps: + - name: Checkout + uses: actions/checkout@v3 # Checks out code at specified ref + with: + ref: ${{ github.event.inputs.ref }} + - name: Setup Node.js + uses: actions/setup-node@v3 # Sets up Node.js for build + with: + node-version: 18 # Uses Node.js v18 + cache: "npm" # Enables npm caching + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v3 # Sets AWS credentials for CLI + with: + role-to-assume: arn:aws:iam::035866691871:role/incubator-cicd-vrms # IAM role for deploy + role-session-name: incubator-cicd-vrms-gha # Session name for audit + aws-region: us-west-2 # AWS region + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v1 # Authenticates Docker to ECR + - name: Build, tag, and push the image to Amazon ECR + id: build-push-image + env: + ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} # ECR registry URL + ECR_REPOSITORY: ${{ env.AWS_APP_NAME }} # ECR repo name + run: | + ls # List files for debug + cd ./${{ env.DOCKER_PATH }} # Enter frontend directory + docker build \ + -f ${{ env.DOCKERFILE }} \ # Use production Dockerfile + -t ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:${{ needs.setup_env.outputs.IMAGE_TAG }} \ # Tag with image SHA + -t ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:${{ github.event.inputs.env }} \ # Tag with environment + . + docker image push --all-tags ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }} # Push all tags +``` + +### 3. `deploy` + +This job deploys the new Docker image to AWS ECS by forcing a new deployment of the ECS service: + +```yaml +deploy: + name: Deploy to AWS ECS + runs-on: ubuntu-latest + needs: [setup_env, build] # Waits for setup and build jobs + permissions: + id-token: write # Needed for OIDC authentication to AWS + steps: + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v3 # Sets AWS credentials for CLI + with: + role-to-assume: arn:aws:iam::035866691871:role/incubator-cicd-vrms # IAM role for deploy + role-session-name: incubator-cicd-vrms-gha # Session name for audit + aws-region: us-west-2 # AWS region + - name: Restart ECS Service + id: redeploy-service + env: + SERVICE_NAME: ${{env.AWS_APP_NAME}}-${{ github.event.inputs.env }} # ECS service name + run: | + aws ecs update-service --force-new-deployment --service $SERVICE_NAME --cluster $AWS_SHARED_CLUSTER # Triggers ECS redeploy +``` + +## Repository Checkout and Working Directory + +When this workflow runs, it uses the `actions/checkout@v3` action to clone the entire repository. The initial working directory for all steps is the root of the repository. + +Before building the Docker image, the workflow explicitly changes into the `client` directory using: + +```bash +cd ./${{ env.DOCKER_PATH }} +``` + +This means that for the Docker build step, the working directory is `client/`, and the Dockerfile path `Dockerfile.prod` refers to `client/Dockerfile.prod`. + +**Summary:** + +- The workflow clones the entire repository. +- The working directory starts at the repo root. +- The workflow changes into the `client` directory before building the Docker image. +- The Docker build context and Dockerfile are both relative to the `client` directory. + +## Summary + +This workflow provides a manual, environment-aware deployment pipeline for the frontend application, leveraging Docker, Amazon ECR, and ECS. It ensures that only the specified code reference is built and deployed, and that deployments are traceable and auditable via GitHub Actions. diff --git a/.github/workflows/aws-frontend-deploy.yml b/.github/workflows/aws-frontend-deploy.yml index 2ca6e0f7c..7fc27d4f7 100644 --- a/.github/workflows/aws-frontend-deploy.yml +++ b/.github/workflows/aws-frontend-deploy.yml @@ -1,118 +1,118 @@ name: Frontend Build and Deploy on: - workflow_dispatch: + workflow_dispatch: # Manual trigger from GitHub Actions UI inputs: env: type: choice - description: 'AWS Incubator Env' - options: - - dev - - prod + description: "AWS Incubator Env" + options: # Selectable environment options + - dev + - prod ref: - description: 'Branch, Tag, or SHA' + description: "Branch, Tag, or SHA" # Code reference to deploy required: true env: + # Target ECS cluster name AWS_SHARED_CLUSTER: incubator-prod - AWS_APP_NAME: vrms-client + # Application name for tagging and service + AWS_APP_NAME: vrms-frontend + # AWS region for deployment AWS_REGION: us-west-2 - DOCKERFILE: client/Dockerfile.prod + # Dockerfile used for build (located in client/) + DOCKERFILE: Dockerfile.prod + # Path to frontend source and Dockerfile DOCKER_PATH: client jobs: setup_env: - name: Set-up environment + name: Set-up environment runs-on: ubuntu-latest steps: - - name: Debug Action - uses: hmarr/debug-action@v2 - - name: Checkout - uses: actions/checkout@v3 - with: - ref: ${{ github.event.inputs.ref }} - - name: Set AWS Env & Image Tag per workflow - run: | - SHORT_SHA=$(git rev-parse --short HEAD) - if [[ "$GITHUB_EVENT_NAME" == "workflow_dispatch" ]]; then - INPUT_ENV=${{ github.event.inputs.env }}; INPUT_REF=${{ github.event.inputs.ref }} - echo AWS_APPENV="$AWS_APP_NAME"-$INPUT_ENV >> $GITHUB_ENV - echo IMAGE_TAG=$SHORT_SHA >> $GITHUB_ENV - fi + - name: Debug Action + uses: hmarr/debug-action@v2 # Prints debug info to logs + - name: Checkout + uses: actions/checkout@v3 # Checks out code at specified ref + with: + ref: ${{ github.event.inputs.ref }} # Uses user-specified ref + # Get short SHA of current commit + # Only run if triggered manually + # Get environment input from workflow dispatch + # Get ref input from workflow dispatch + # Set AWS_APPENV for later steps + # Set IMAGE_TAG for later steps + - name: Set AWS Env & Image Tag per workflow + run: | + SHORT_SHA=$(git rev-parse --short HEAD) + if [[ "$GITHUB_EVENT_NAME" == "workflow_dispatch" ]]; then + INPUT_ENV=${{ github.event.inputs.env }}; INPUT_REF=${{ github.event.inputs.ref }} + echo AWS_APPENV="$AWS_APP_NAME"-$INPUT_ENV >> $GITHUB_ENV + echo IMAGE_TAG=$SHORT_SHA >> $GITHUB_ENV + fi outputs: AWS_APPENV: ${{ env.AWS_APPENV }} IMAGE_TAG: ${{ env.IMAGE_TAG }} build: name: Build & Push Docker Image runs-on: ubuntu-latest - needs: [setup_env] + permissions: + id-token: write # Needed for OIDC authentication to AWS + needs: [setup_env] # Waits for environment setup steps: - - name: Checkout - uses: actions/checkout@v3 - with: - ref: ${{ github.event.inputs.ref }} - - name: Checkout - uses: actions/setup-node@v3 - with: - node-version: 18 - cache: 'npm' - - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v2 - with: - aws-access-key-id: ${{ secrets.INCUBATOR_AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.INCUBATOR_AWS_SECRET_ACCESS_KEY }} - aws-region: ${{ env.AWS_REGION }} - - name: Login to Amazon ECR - id: login-ecr - uses: aws-actions/amazon-ecr-login@v1 - - name: Init Docker Cache - uses: jpribyl/action-docker-layer-caching@v0.1.0 - with: - key: ${{ github.workflow }}-2-{hash} - restore-keys: | - ${{ github.workflow }}-2- - - name: Build & Push Image to ECR - uses: kciter/aws-ecr-action@v3 - with: - access_key_id: ${{ secrets.INCUBATOR_AWS_ACCESS_KEY_ID }} - secret_access_key: ${{ secrets.INCUBATOR_AWS_SECRET_ACCESS_KEY }} - account_id: ${{ secrets.INCUBATOR_AWS_ACCOUNT_ID }} - repo: ${{ needs.setup_env.outputs.AWS_APPENV }} - region: ${{ env.AWS_REGION }} - tags: latest,${{ needs.setup_env.outputs.IMAGE_TAG }} - dockerfile: ${{ env.DOCKERFILE }} - path: ${{ env.DOCKER_PATH }} + - name: Checkout + uses: actions/checkout@v3 # Checks out code at specified ref + with: + ref: ${{ github.event.inputs.ref }} + - name: Setup Node.js + uses: actions/setup-node@v3 # Sets up Node.js for build + with: + node-version: 18 # Uses Node.js v18 + cache: "npm" # Enables npm caching + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v3 # Sets AWS credentials for CLI + with: + role-to-assume: arn:aws:iam::035866691871:role/incubator-cicd-vrms # IAM role for deploy + role-session-name: incubator-cicd-vrms-gha # Session name for audit + aws-region: us-west-2 # AWS region + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v1 # Authenticates Docker to ECR + - name: Build, tag, and push the image to Amazon ECR + id: build-push-image + env: + ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} # ECR registry URL + ECR_REPOSITORY: ${{ env.AWS_APP_NAME }} # ECR repo name + # List files for debug + # Enter frontend directory for Docker build context + # Build Docker image using production Dockerfile + # Tag image with short SHA + # Tag image with environment (dev/prod) + # Use current directory as build context + # Push all tags for this image to ECR + run: | + ls + cd ./${{ env.DOCKER_PATH }} + docker build \ + -f ${{ env.DOCKERFILE }} \ + -t ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:${{ needs.setup_env.outputs.IMAGE_TAG }} \ + -t ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:${{ github.event.inputs.env }} \ + . + docker image push --all-tags ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }} deploy: name: Deploy to AWS ECS runs-on: ubuntu-latest - needs: [setup_env, build] + needs: [setup_env, build] # Waits for setup and build jobs + permissions: + id-token: write # Needed for OIDC authentication to AWS steps: - - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v2 - with: - aws-access-key-id: ${{ secrets.INCUBATOR_AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.INCUBATOR_AWS_SECRET_ACCESS_KEY }} - aws-region: ${{ env.AWS_REGION }} - - name: Login to Amazon ECR - id: login-ecr - uses: aws-actions/amazon-ecr-login@v1 - - name: Pull Task Definition & write to file - id: aws-task-definition - run: | - aws ecs describe-task-definition \ - --task-definition ${{ needs.setup_env.outputs.AWS_APPENV }} \ - --query taskDefinition | \ - jq 'del(.taskDefinitionArn,.revision,.status,.registeredBy,.registeredAt,.compatibilities,.requiresAttributes)' > task-def.json - - name: Interpolate new Docker Image into Task Definition - id: task-definition - uses: aws-actions/amazon-ecs-render-task-definition@v1 - with: - task-definition: task-def.json - container-name: ${{ needs.setup_env.outputs.AWS_APPENV }} - image: ${{ steps.login-ecr.outputs.registry }}/${{ needs.setup_env.outputs.AWS_APPENV }}:${{ needs.setup_env.outputs.IMAGE_TAG }} - - name: Deploy Amazon ECS - uses: aws-actions/amazon-ecs-deploy-task-definition@v1 - with: - task-definition: ${{ steps.task-definition.outputs.task-definition }} - service: ${{ needs.setup_env.outputs.AWS_APPENV }} - cluster: ${{ env.AWS_SHARED_CLUSTER }} - wait-for-service-stability: true - wait-for-minutes: 5 minutes - + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v3 # Sets AWS credentials for CLI + with: + role-to-assume: arn:aws:iam::035866691871:role/incubator-cicd-vrms # IAM role for deploy + role-session-name: incubator-cicd-vrms-gha # Session name for audit + aws-region: us-west-2 # AWS region + - name: Restart ECS Service + id: redeploy-service + env: + SERVICE_NAME: ${{env.AWS_APP_NAME}}-${{ github.event.inputs.env }} # ECS service name + # Force a new deployment of the ECS service to use the latest Docker image + run: | + aws ecs update-service --force-new-deployment --service $SERVICE_NAME --cluster $AWS_SHARED_CLUSTER diff --git a/client/package.json b/client/package.json index 790d9cc12..294b99057 100644 --- a/client/package.json +++ b/client/package.json @@ -64,6 +64,7 @@ "devDependencies": { "@testing-library/dom": "^10.3.2", "@testing-library/react": "^16.0.0", + "autoprefixer": "^10.4.21", "eslint-config-airbnb": "^18.2.0", "eslint-config-airbnb-base": "^14.2.0", "eslint-config-prettier": "^6.11.0", diff --git a/client/yarn.lock b/client/yarn.lock index 94969bc9c..2232f2f12 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -1706,6 +1706,18 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== +autoprefixer@^10.4.21: + version "10.4.21" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.21.tgz#77189468e7a8ad1d9a37fbc08efc9f480cf0a95d" + integrity sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ== + dependencies: + browserslist "^4.24.4" + caniuse-lite "^1.0.30001702" + fraction.js "^4.3.7" + normalize-range "^0.1.2" + picocolors "^1.1.1" + postcss-value-parser "^4.2.0" + available-typed-arrays@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" @@ -2448,6 +2460,16 @@ browserslist@^4.22.2: node-releases "^2.0.14" update-browserslist-db "^1.0.13" +browserslist@^4.24.4: + version "4.25.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.25.0.tgz#986aa9c6d87916885da2b50d8eb577ac8d133b2c" + integrity sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA== + dependencies: + caniuse-lite "^1.0.30001718" + electron-to-chromium "^1.5.160" + node-releases "^2.0.19" + update-browserslist-db "^1.1.3" + cac@^6.7.14: version "6.7.14" resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" @@ -2479,6 +2501,11 @@ caniuse-lite@^1.0.30001587: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001625.tgz#ead1b155ea691d6a87938754d3cb119c24465b03" integrity sha512-4KE9N2gcRH+HQhpeiRZXd+1niLB/XNLAhSy4z7fI8EzcbcPoAqjNInxVHTiTwWfTIV4w096XG8OtCOCQQKPv3w== +caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001718: + version "1.0.30001723" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001723.tgz#c4f3174f02089720736e1887eab345e09bb10944" + integrity sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw== + chai@^4.3.10: version "4.4.1" resolved "https://registry.yarnpkg.com/chai/-/chai-4.4.1.tgz#3603fa6eba35425b0f2ac91a009fe924106e50d1" @@ -3123,6 +3150,11 @@ electron-to-chromium@^1.4.668: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.784.tgz#729a80154cee6ee9cb8bc3948af83431ab5cb394" integrity sha512-9CZwh+sDrhDAeOEFh8s3PqwduzTyYIeYwZolc1b9ENAUt3ePu7R1sJSCWr/820ISssRxCJUyHI9Wb7j+0Uo1AA== +electron-to-chromium@^1.5.160: + version "1.5.170" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.170.tgz#9f6697de4339e24da8b234e4492a9ecb91f5989c" + integrity sha512-GP+M7aeluQo9uAyiTCxgIj/j+PrWhMlY7LFVj8prlsPljd0Fdg9AprlfUi+OCSFWy9Y5/2D/Jrj9HS8Z4rpKWA== + emoji-regex@^9.2.2: version "9.2.2" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" @@ -3329,6 +3361,11 @@ escalade@^3.1.2: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== +escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + escape-latex@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/escape-latex/-/escape-latex-1.2.0.tgz#07c03818cf7dac250cce517f4fda1b001ef2bca1" @@ -3556,7 +3593,7 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -fraction.js@^4.0.12: +fraction.js@^4.0.12, fraction.js@^4.3.7: version "4.3.7" resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== @@ -4466,11 +4503,21 @@ node-releases@^2.0.14: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + npm-run-path@^5.1.0: version "5.3.0" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" @@ -4678,6 +4725,11 @@ possible-typed-array-names@^1.0.0: resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== +postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + postcss@^8.4.38: version "8.4.38" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" @@ -5535,6 +5587,14 @@ update-browserslist-db@^1.0.13: escalade "^3.1.2" picocolors "^1.0.1" +update-browserslist-db@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" + integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + url-parse@^1.5.3: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1"