From 1f8918ac5f36e9e0b15197c30d01925d28afd1a4 Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Sun, 15 Sep 2024 10:05:06 +0000 Subject: [PATCH 01/65] GitHub Classroom Feedback --- .github/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .github/.keep diff --git a/.github/.keep b/.github/.keep new file mode 100644 index 0000000000..e69de29bb2 From d5a304288d25c51d6c222cc1711657a56e8ac573 Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Sun, 15 Sep 2024 10:05:06 +0000 Subject: [PATCH 02/65] Setting up GitHub Classroom Feedback From 9da1c6749050bb0c13ec9b0db2cbba0bc91465c4 Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Sun, 15 Sep 2024 10:05:08 +0000 Subject: [PATCH 03/65] add deadline --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 259f7bba2e..5ddee1cbf1 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +[![Review Assignment Due Date](https://classroom.github.com/assets/deadline-readme-button-22041afd0340ce965d47ae6ef1cefeee28c7c493a6346c4f15d667ab976d596c.svg)](https://classroom.github.com/a/bzPrOe11) # CS3219 Project (PeerPrep) - AY2425S1 ## Group: Gxx From e6d918d39235b9136aed1d8ce8dbe281aa60917e Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Thu, 19 Sep 2024 22:07:34 +0800 Subject: [PATCH 04/65] Docs(README): Add group number --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 5ddee1cbf1..28e2648cdb 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,9 @@ [![Review Assignment Due Date](https://classroom.github.com/assets/deadline-readme-button-22041afd0340ce965d47ae6ef1cefeee28c7c493a6346c4f15d667ab976d596c.svg)](https://classroom.github.com/a/bzPrOe11) # CS3219 Project (PeerPrep) - AY2425S1 -## Group: Gxx +## Group: G10 -### Note: -- You can choose to develop individual microservices within separate folders within this repository **OR** use individual repositories (all public) for each microservice. -- In the latter scenario, you should enable sub-modules on this GitHub classroom repository to manage the development/deployment **AND** add your mentor to the individual repositories as a collaborator. -- The teaching team should be given access to the repositories as we may require viewing the history of the repository in case of any disputes or disagreements. + +## Dependencies +| Thing | Version | +| ----- | ------- | +| | | \ No newline at end of file From b2538b6b5acc634c2e1e0e508ac61202ae470795 Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Fri, 20 Sep 2024 00:59:58 +0800 Subject: [PATCH 05/65] feat(Devops): Set up Terraform backend on Google Cloud Storage Bucket --- .env | 8 ++++++ .gitignore | 43 ++++++++++++++++++++++++++++++++ .sops.yaml | 7 ++++++ Makefile | 21 ++++++++++++++++ README.md | 33 +++++++++++++++++++++--- scripts/generate_age_key.sh | 11 ++++++++ scripts/secret.sh | 33 ++++++++++++++++++++++++ secrets/gcp_credentials.json.enc | 30 ++++++++++++++++++++++ tf_backend/.gitignore | 1 + tf_backend/.terraform.lock.hcl | 20 +++++++++++++++ tf_backend/bucket.tf | 14 +++++++++++ tf_backend/provider.tf | 33 ++++++++++++++++++++++++ tf_backend/terraform.tfvars | 2 ++ 13 files changed, 252 insertions(+), 4 deletions(-) create mode 100644 .env create mode 100644 .gitignore create mode 100644 .sops.yaml create mode 100644 Makefile create mode 100755 scripts/generate_age_key.sh create mode 100755 scripts/secret.sh create mode 100644 secrets/gcp_credentials.json.enc create mode 100644 tf_backend/.gitignore create mode 100644 tf_backend/.terraform.lock.hcl create mode 100644 tf_backend/bucket.tf create mode 100644 tf_backend/provider.tf create mode 100644 tf_backend/terraform.tfvars diff --git a/.env b/.env new file mode 100644 index 0000000000..85aae7ab92 --- /dev/null +++ b/.env @@ -0,0 +1,8 @@ +GOOGLE_APPLICATION_CREDENTIALS=$(realpath ./secrets/gcp_credentials.json) +GCP_PROJECT_NAME=cs3219-ay2425s1-project-g10 + +# Terraform General +TF_PROJECT_NAME=${GCP_PROJECT_NAME} + +# Terraform Backend +TF_BACKEND_BUCKET_NAME=${TF_PROJECT_NAME}-tfstate \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..22d12b895f --- /dev/null +++ b/.gitignore @@ -0,0 +1,43 @@ +/google-cloud-sdk/ +/secrets/* +# Encrypted secrets +!*.enc + +# https://github.com/github/gitignore/blob/main/Terraform.gitignore +# Local .terraform directories +**/.terraform/* + +# .tfstate files +*.tfstate +*.tfstate.* + +# Crash log files +crash.log +crash.*.log + +# Exclude all .tfvars files, which are likely to contain sensitive data, such as +# password, private keys, and other secrets. These should not be part of version +# control as they are data points which are potentially sensitive and subject +# to change depending on the environment. +*.tfvars +*.tfvars.json + +# Ignore override files as they are usually used to override resources locally and so +# are not checked in +override.tf +override.tf.json +*_override.tf +*_override.tf.json + +# Ignore transient lock info files created by terraform apply +.terraform.tfstate.lock.info + +# Include override files you do wish to add to version control using negated pattern +# !example_override.tf + +# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan +# example: *tfplan* + +# Ignore CLI configuration files +.terraformrc +terraform.rc \ No newline at end of file diff --git a/.sops.yaml b/.sops.yaml new file mode 100644 index 0000000000..568795b97b --- /dev/null +++ b/.sops.yaml @@ -0,0 +1,7 @@ +## KEYS: +# Yongbeom: age1c0fqjnprp4pzk8kx5y23mlkreu5z34v3tkrrwrcmf56cmu3zaf0q30sqfv + +creation_rules: + # Note: must be comma separated + - age: >- + age1c0fqjnprp4pzk8kx5y23mlkreu5z34v3tkrrwrcmf56cmu3zaf0q30sqfv \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000..6a10d433cf --- /dev/null +++ b/Makefile @@ -0,0 +1,21 @@ +gcloud_auth: + set -o allexport && source ./.env && set +o allexport && \ + gcloud auth activate-service-account --key-file=$$GOOGLE_APPLICATION_CREDENTIALS + $$SHELL + +deploy_tf_backend: + set -o allexport && source ./.env && set +o allexport && \ + export GOOGLE_APPLICATION_CREDENTIALS=$(shell realpath ./secrets/gcp_credentials.json) && \ + cd tf_backend && \ + tofu init && \ + tofu apply -auto-approve \ + -var="bucket_name=$$TF_BACKEND_BUCKET_NAME" \ + -var="project=$$TF_PROJECT_NAME" + +destroy_tf_backend: + set -o allexport && source ./.env && set +o allexport && \ + export GOOGLE_APPLICATION_CREDENTIALS=$(shell realpath ./secrets/gcp_credentials.json) && \ + cd tf_backend && \ + tofu destroy -auto-approve \ + -var="bucket_name=$$TF_BACKEND_BUCKET_NAME" \ + -var="project=$$TF_PROJECT_NAME" \ No newline at end of file diff --git a/README.md b/README.md index 28e2648cdb..c3ec7f8a85 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,33 @@ # CS3219 Project (PeerPrep) - AY2425S1 ## Group: G10 - ## Dependencies -| Thing | Version | -| ----- | ------- | -| | | \ No newline at end of file +| Thing | Version | +| ------------------------------------------------ | ------- | +| [gcloud](https://cloud.google.com/sdk/gcloud) | | +| [OpenTofu](https://github.com/opentofu/opentofu) | 1.8[^1] | +| [sops](https://github.com/getsops/sops) | 3.9 | +| [age](https://github.com/FiloSottile/age) | 1 | +| Make | 4 | +| Bash | 5 | + + +## Directory Structure +All directories (with the following exceptions) are microservices. + +### `scripts` +Contains scripts for setting up the project. + +``` +# Generate a new age key for secret encryption. +./scripts/generate_age_key.sh +``` + +### `secrets` +Contains secrets for the project. + +### `tf_backend` +Contains the Terraform configuration for the Terraform state backend. +For this project, the terraform backend is stored in a Google Cloud Storage bucket. + +[^1]: OpenTofu 1.8.0 introduces [static variable evaluation](https://opentofu.org/blog/opentofu-1-8-0/), which we use for the project. \ No newline at end of file diff --git a/scripts/generate_age_key.sh b/scripts/generate_age_key.sh new file mode 100755 index 0000000000..546e99fb84 --- /dev/null +++ b/scripts/generate_age_key.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +AGE_SOPS_KEY_FILE=${XDG_CONFIG_HOME:-$HOME/.config}/sops/age/keys.txt + +if [[ -f ${AGE_SOPS_KEY_FILE} ]]; then + echo "Keys already exist:" + cat ${AGE_SOPS_KEY_FILE} + exit 1 +fi + +# age-keygen > ${AGE_SOPS_KEY_FILE} \ No newline at end of file diff --git a/scripts/secret.sh b/scripts/secret.sh new file mode 100755 index 0000000000..88bee61071 --- /dev/null +++ b/scripts/secret.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +COMMAND=$1 +shift + +FILES=( + secrets/* + tf_backend/*.tfstate* +) + +encrypt() { + for FILE in ${FILES[@]}; do + if [[ $FILE == *.enc ]]; then + continue + fi + sops -e $FILE > $FILE.enc + done +} + +decrypt() { + for FILE in ${FILES[@]}; do + if [[ $FILE != *.enc ]]; then + continue + fi + sops -d $FILE.enc > $FILE + done +} + +if $COMMAND == "encrypt" || $COMMAND == "decrypt"; then + eval $COMMAND "$@" +else + echo "Usage: secret.sh [encrypt|decrypt]" +fi \ No newline at end of file diff --git a/secrets/gcp_credentials.json.enc b/secrets/gcp_credentials.json.enc new file mode 100644 index 0000000000..d1010a5788 --- /dev/null +++ b/secrets/gcp_credentials.json.enc @@ -0,0 +1,30 @@ +{ + "type": "ENC[AES256_GCM,data:jd5pn1Nz2V5n5AMwMvbK,iv:5gdsSAbOzs6HOkIpIvLrBJeMYbnl5Nirnbh6NwotUj0=,tag:/mcx2NJ2GwKxmsp32+Hhaw==,type:str]", + "project_id": "ENC[AES256_GCM,data:HCHHeF5wvX5GHu1X8NekLSelVetp9RBrPTiz,iv:3yN3rwQRvGF5R8tnPQ0WDj/vq/ffsyCcIjEuZZW3Q/I=,tag:INfaSfmwoUf5ESg+0SAi+w==,type:str]", + "private_key_id": "ENC[AES256_GCM,data:dQ2190mzhg1pOGXOfbvq4jDHhSsmMe6vUwdDfU1LG5vTCHarWZ1JUQ==,iv:jkAoXG+f/aQmXUa7ZEsH6a0e9my0PO9/fWrO9B2atxU=,tag:RY6mR3+sZ0RJ0rQ+1VNS3Q==,type:str]", + "private_key": "ENC[AES256_GCM,data:X/WmRy7zPYvWZrc2r4zdAdupdHZsq1FFL2CqzAOH3wnijKw+w+v8Iqe1yKZnHiTCDd0lb7A4AlgDm33x+r1m7ruh5QEfMopCurVEmMtZIicFc1mMdapigxa5Co5lLh7f373eBAN++bE7GosEMLD/4j66OK90BrCL8jozaX8BOVhgVKfIBvSnDpTlhMZo5zl4McXtvcPCL0I6nUI41qbJBWdz5ckc+xEzv6PZK8Qi8OwJmp7EyX8R9yIYPjWh/3ceBMcD2OZvlGtrzfv3KkBMC9410rMG3UyRo4oGuc2C6TG7v8+h/k1hf7V/L7pTFkSVqAwfrguoaiknlFDexIkTw0VHTgn23aXF9Jq+mo6qKkRJhZKKFhwNPbZOnee0A67vJrttvjOcMrLEpTEJ22agTs5XLxEJ8z8hNK0phTP4PNKJEmoesQGTvOenuBlP1lraR2vil2mo997j4mGRRZFV61MK2hyj6fju9XOIOnzhF502tVIEYwcJWz/e+YNG9nXeWVLsYwYNGRuLpUejAiQ6CZWd0gVQt0gkY6R8nZeexSPXq1Nj4OE/7U8u897GcSj8c3OBG2ZyZ84kxpONimnn2Id6Qz+9SqCnjoSNcOVrh9IVmsZWXJMNdAFklp+30N4kt+U4D93Lwe0qe8j52p+fC4UcvASaWhtnS6jxnx5L9fyZqOxtIxDIkBsQyb+wc+miENlG8QKmfKl0j8rD5Ap1rnhBXrhSinneVNcDCclPeZcY3CcXUg1/xmwtSTvA1Qfa6c6mg16MRBcsHt+8aSePlUYOcLAqSuY8AvT6sc3A9t8UedOF9zNwsASmXliBKofUh1I9EAntIPVejw7Z+KT/9rDoDAIk1zw8wh/a6kjF9wzrtrk3xfaBiZ4ycBL1j6YFKMaQe8WlHe0abg7+/rRa65aym4Qwc7mhxsIjyTPDoOVw8rFJAF9V57EZHZTsfd6P4EoQcWGuqkG9Jet8urlZMV+w4HP5zB1AvLYdwKWAlC6XZC3W43oA/89fmMCbjthx9MlaGSjeduk00oVvpeom1hCj+I1yHn7quokfhq1J2713J0PqdJ2TiDNtGVNkOgegYjZUwSxkXKPANjO2elOov1L94JJduz+zU/9MUuy1//wZcvl9alm3g2XYJEJlGyefKBIka0gkWD1edbz9sIK2SHpGtHCPhIS+DcWhYnpW9vxlii21Spq6O8fHkNyt7xAY4+xwhbh9Vz9GV7bVKSTUxcpfMgrJDNYBg99edMqizI0IhKm16H/63vZbmVJyqm1bfcr7w4Am5d+n+re+dwaAgNRFR/PkGS1Xc7E4kf+3LSB2vy3Rd1cNAI3quM35A7vuny9CDwQhMKpx65EAG1cPB47LqSgPNP3kE2AzrIAEP21ILLIwBHprAGw2fpgyWz2PjYuaEKA2KMHty5uZk8I7LZVksPMf6UGrx6qGlndf9Af6EBcr5SmcGq6zs3uT8rqkrO5zyGe9/4EoDJaojyofAfWAISAcyoDTQC+luzuKx4ReQ0N3QPT6/rYK1T0zwg+jGRpR2DrW3ETxcacKdMC8DKiDRCoinV4hWQKelFvJLmjXH+vByR/uxDWBcMsSlxXpVC9hfidWLdoMYNgfUVqUl/gMYBz63d7GqSJ+0taO+GMUtEVkikZeMOyXVB6r7h7mDGG8iCNW4CcHcTgMyxS5hOfMqrCyaYqE0JOte31L4u4o8MXXmD+nCZnqke16V12wKhDelGfzp4HAG9S7C55ZIe4K5dEMB3f96vhJzszEZfIkdjaFVtWubG9dHxnfRuj1BEjInYyyrDbIfhOO5DLF14AaMv8xt+dyZMEq5JjVxkmI1XgME0qaneDjz37woUzvt0o/xDiVOkiCl0oCFQPiSU5CPyzwz1W5bdWFE5DinV3B+JoSMEwyJteCtVfDT0g5wRSVs3zObJzi6zEr9fEXW/WvsKoFgMyX1K/2OzlaAbvzMXaG8BPFIkWc2TDdriN7OrI6x7zSzakioJb02iQj2qd8cSJNt10qtkwXSiK58D1AFFWKqNMpykT0Zc+UapXgCRv7+z+sUuq3V9RjMNNjXupDgkYxorVdLqBE4leV5R70c+8z0eW7OXoLvldh7Ygec5ljUZ72XM7oPISHeHP7ZGx8kulQ7KFzNy4+w2fFSk8MCGgzGO0iMTwZtFtmcUNHxlHoWlUuSSTa0RdOB/Dwi13yTmxVFAbCo4Fhg1v2TBx3fhdjM2Ta1BBaWuNMbIROHk/hlyHecwS9hPeZzr5MpO4uOOfikmHX,iv:YkAAr9PEx1bwgxomLAK5W6/uUiObvMYPstN82YO3cUc=,tag:qaT3xyNv8Ykc6JD2Ithzug==,type:str]", + "client_email": "ENC[AES256_GCM,data:FIkpLPaWajyo97K79jwPV8UK/RqYdqe40zQ1f7YsmpprWAibvLPMzS6REpuEBbo6ujqwHkjndAIseR1tEl/Ca1ECCIA8X2SItyC/njA7eQ==,iv:y7UPxnrKX0SqCLGq4RS5sqfFqroNvHZPQzh+M1orHCY=,tag:AthiGBFKQ02af+YRUbq9/w==,type:str]", + "client_id": "ENC[AES256_GCM,data:b8uufx90f+qVq+aC7n3XxiVt7mtx,iv:DafYpVb3m12Hvbtic+2Apb0bK70ijzrL5vAkfciJUi4=,tag:4oslNENjvZsTydq0V/Pfww==,type:str]", + "auth_uri": "ENC[AES256_GCM,data:7X7JWxe7KgzUTMU0LQwnoRtR0WULasJLzVmqGHaBh5S6DGANj1qDH34=,iv:yN8/GkM7CHJz/aU4CWm3EG4AUoNQwK56NRIaA1jBPok=,tag:4p15aHoVFJnsM9nc/1PMaw==,type:str]", + "token_uri": "ENC[AES256_GCM,data:bu+lGo+y+rb97M6/9tTfsBZ6g6QAuvOMNpdXEzThracWyQU=,iv:R8blDIJUkeji5hsBtroDeeoiPkAz3uDcS5v5uXswf8Y=,tag:x+ziArJWpykVYg6+GggXGQ==,type:str]", + "auth_provider_x509_cert_url": "ENC[AES256_GCM,data:owqDSmVw0SXqcX5jUxTQD5OHbmpnS7KREF8iMHghwWpTfj+5B+CaAOUL,iv:et9fSt/XrdqGVFB3q+FMwudrALkZ6NMBwdj2/TEvNUM=,tag:FwqRK0DrN81HD4VUjj8x9A==,type:str]", + "client_x509_cert_url": "ENC[AES256_GCM,data:1g1cq1rwyS37b4aL7r6DtYFAdReqmGsfwg1U0B+A9o7Q4QE1JAbOWM6g0K+jQhcayl/0xlYPXp+1OWbrxjG3kQrKbv39iPU/GpKCKznknhCg+OP7f+Rrd5aNW/Pqa6Dj3PhITT2qySXecTCXTB6BrLJbWOIgsNrmso86oklBhoL2Mb4=,iv:mZAKzcOds/ejRKt7zY7AeRdsSgH1FEdzDiygADNOKNg=,tag:tUoOMTT2Q9o1otnjjN2iWQ==,type:str]", + "universe_domain": "ENC[AES256_GCM,data:hsW9D6Xb+rmrhcyw8Bc=,iv:X+XEbu3H3wfzV8Hc+B896UNOqM0//b//XODT+BZasZA=,tag:4lVdE4631L+C1yj+uPeQGQ==,type:str]", + "sops": { + "kms": null, + "gcp_kms": null, + "azure_kv": null, + "hc_vault": null, + "age": [ + { + "recipient": "age1c0fqjnprp4pzk8kx5y23mlkreu5z34v3tkrrwrcmf56cmu3zaf0q30sqfv", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBzbjBjV2FtNytydlBML3BF\nWkdYaTAwREpFRzRqTEpjOHVIRHM1ZU1WYXpjCmFZSlVVWWdVZ29FTzFEVGUvUkcz\nQUs5Nm5GMEczaVdsMmdTaE44ZVVETXcKLS0tIEJ1QXhmVHZ5R1ExTURiNzJ4VUV5\nMHhxZllJUHZCMFY5OC9UOVhrNWE4ZDQKhKzmvlCl53rlzM2p/GFMU0M978PT+Xs0\nnca797cAnq/KWQnczZiC22hOfnrukqJcUieOT+iRQOoBoeE+Hi2DAA==\n-----END AGE ENCRYPTED FILE-----\n" + } + ], + "lastmodified": "2024-09-19T16:48:01Z", + "mac": "ENC[AES256_GCM,data:8bA7EI/4GZooIE/VbaVRiEooVMYS+f/av2dNhqKhBVJtYnhl4uRYRuXplMVqmTXCz2Pnufu8RtwhkwVvYIDA7YsnymydklNCw8t4e7oVB0DFWOsqhS6b3B/NIfLuL5D6Hh92Icx1qVHKerfR6YJBhLH0TzwAspiHL0YXgnGpcoI=,iv:FMvW0jU0az7doNS4vC0waUswPVVQ4XydVSnLzL6wQvg=,tag:VTCccPLs73OOH/CmWRIoMQ==,type:str]", + "pgp": null, + "unencrypted_suffix": "_unencrypted", + "version": "3.9.0" + } +} \ No newline at end of file diff --git a/tf_backend/.gitignore b/tf_backend/.gitignore new file mode 100644 index 0000000000..3ecf75680f --- /dev/null +++ b/tf_backend/.gitignore @@ -0,0 +1 @@ +!terraform.tfvars \ No newline at end of file diff --git a/tf_backend/.terraform.lock.hcl b/tf_backend/.terraform.lock.hcl new file mode 100644 index 0000000000..18d634b18d --- /dev/null +++ b/tf_backend/.terraform.lock.hcl @@ -0,0 +1,20 @@ +# This file is maintained automatically by "tofu init". +# Manual edits may be lost in future updates. + +provider "registry.opentofu.org/hashicorp/google" { + version = "6.3.0" + constraints = "6.3.0" + hashes = [ + "h1:2Yamc2+FSclN0at2L04+vAaL90JDNUH0e3aj2+gyTmA=", + "zh:1ce4d9270a11a99a842f4516e4a24e85b7bd14147c736bbd0ac9711feb880148", + "zh:2643cf1dacf4464688ca5d6f7c530ea941224a878cf19717b231bf0b5edc97b9", + "zh:559e23c32ab605189f2752fd261b120aa0a0604f12c063d856f1399048b856db", + "zh:5e422235813c6c34a12cede5ee535c377bee0d9de731ea7ab4abb2fc2d8e30af", + "zh:66d0b21cf6af354b0d0ee7b6aee7ad5ca1f3160a91b4ba0d21fd78db8eeca74f", + "zh:7c73c86100e26c6eb43026eec9cfa83b95a6872a0142bd221c1d4a65741180f4", + "zh:bc36f1ecd2dac775f5216097a1028fbcc63604234f446ce6220463f4b4a1fac8", + "zh:cdbd0883eaaad0e8caf79252acc3997fcebba9767db67a6b873008fb8e4945f9", + "zh:f0760ed8f0f622f88c40686cca0f4a7862cb41d67b2c1ddcf16b01418a4c8abc", + "zh:fae891937838784869a0cbfdf0c1d2bad08fba63c1e2a9fd43c269b2940925b6", + ] +} diff --git a/tf_backend/bucket.tf b/tf_backend/bucket.tf new file mode 100644 index 0000000000..59f9b56a91 --- /dev/null +++ b/tf_backend/bucket.tf @@ -0,0 +1,14 @@ +variable "bucket_name" { + type = string + description = "The name of the bucket for storing Terraform state" +} + +resource "google_storage_bucket" "tf_state" { + name = var.bucket_name + location = "US" + + versioning { + enabled = true + } +} + diff --git a/tf_backend/provider.tf b/tf_backend/provider.tf new file mode 100644 index 0000000000..81f3d9786b --- /dev/null +++ b/tf_backend/provider.tf @@ -0,0 +1,33 @@ +terraform { + required_providers { + google = { + source = "hashicorp/google" + version = "6.3.0" + } + } +} + +variable "project" { + type = string +} + +variable "region" { + type = string +} + +variable "zone" { + type = string +} + +provider "google" { + # Configuration options + project = var.project + region = var.region + zone = var.zone + + default_labels = { + "managed-by" = "opentofu" + "project" = var.project + "environment" = "terraform" + } +} \ No newline at end of file diff --git a/tf_backend/terraform.tfvars b/tf_backend/terraform.tfvars new file mode 100644 index 0000000000..be4e7bbb24 --- /dev/null +++ b/tf_backend/terraform.tfvars @@ -0,0 +1,2 @@ +region = "us-central1" +zone = "us-central1-c" \ No newline at end of file From ab8239ed275896688dd25bdc52e1a664e4cae1e3 Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Fri, 20 Sep 2024 01:00:24 +0800 Subject: [PATCH 06/65] docs: Update README --- README.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c3ec7f8a85..abb3e61fd6 100644 --- a/README.md +++ b/README.md @@ -14,16 +14,21 @@ ## Directory Structure -All directories (with the following exceptions) are microservices. +All direct subdirectories of the project base directory (with the following exceptions) are microservices. +Additional information about some directories is provided below. ### `scripts` Contains scripts for setting up the project. +Usage: ``` # Generate a new age key for secret encryption. ./scripts/generate_age_key.sh +# Encrypt all secret files +./scripts/secret.sh encrypt +# Decrypt all secret files +./scripts/secret.sh decrypt ``` - ### `secrets` Contains secrets for the project. @@ -31,4 +36,10 @@ Contains secrets for the project. Contains the Terraform configuration for the Terraform state backend. For this project, the terraform backend is stored in a Google Cloud Storage bucket. +### `{service}/tf` +Contains the Terraform configuration for the service. + +Note that each service has its own Terraform configuration, and state. + + [^1]: OpenTofu 1.8.0 introduces [static variable evaluation](https://opentofu.org/blog/opentofu-1-8-0/), which we use for the project. \ No newline at end of file From afbc4dba4158c11f86d8418267c43455d9988cad Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Fri, 20 Sep 2024 01:22:23 +0800 Subject: [PATCH 07/65] feat: Clean up Makefile --- Makefile | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 6a10d433cf..b1c92dcc8f 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,24 @@ -gcloud_auth: +.PHONY: help gcloud_auth deploy_tf_backend destroy_tf_backend + + +help: ## Display this help text + @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[$$()% 0-9a-zA-Z_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) + + +## +## Google Cloud CLI +## + +gcloud_auth: ## Authenticate with gcloud and launch a new shell. set -o allexport && source ./.env && set +o allexport && \ gcloud auth activate-service-account --key-file=$$GOOGLE_APPLICATION_CREDENTIALS $$SHELL -deploy_tf_backend: +## +## Terraform backend +## + +deploy_tf_backend: ## Deploy the OpenTofu/Terraform backend to GCP set -o allexport && source ./.env && set +o allexport && \ export GOOGLE_APPLICATION_CREDENTIALS=$(shell realpath ./secrets/gcp_credentials.json) && \ cd tf_backend && \ @@ -12,7 +27,7 @@ deploy_tf_backend: -var="bucket_name=$$TF_BACKEND_BUCKET_NAME" \ -var="project=$$TF_PROJECT_NAME" -destroy_tf_backend: +destroy_tf_backend: ## Destroy the OpenTofu/Terraform backend on GCP set -o allexport && source ./.env && set +o allexport && \ export GOOGLE_APPLICATION_CREDENTIALS=$(shell realpath ./secrets/gcp_credentials.json) && \ cd tf_backend && \ From a315e11b265c6e1a7fd3fee1a61ce4a1fdf455e4 Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Fri, 20 Sep 2024 01:25:54 +0800 Subject: [PATCH 08/65] feat(frontend): Template with yarn create vite --- frontend/.gitignore | 24 +++++++++++++ frontend/README.md | 50 ++++++++++++++++++++++++++ frontend/eslint.config.js | 28 +++++++++++++++ frontend/index.html | 13 +++++++ frontend/package.json | 29 +++++++++++++++ frontend/public/vite.svg | 1 + frontend/src/App.css | 42 ++++++++++++++++++++++ frontend/src/App.tsx | 35 ++++++++++++++++++ frontend/src/assets/react.svg | 1 + frontend/src/index.css | 68 +++++++++++++++++++++++++++++++++++ frontend/src/main.tsx | 10 ++++++ frontend/src/vite-env.d.ts | 1 + frontend/tf/bucket.tf | 0 frontend/tf/provider.tf | 18 ++++++++++ frontend/tsconfig.app.json | 24 +++++++++++++ frontend/tsconfig.json | 7 ++++ frontend/tsconfig.node.json | 22 ++++++++++++ frontend/vite.config.ts | 7 ++++ 18 files changed, 380 insertions(+) create mode 100644 frontend/.gitignore create mode 100644 frontend/README.md create mode 100644 frontend/eslint.config.js create mode 100644 frontend/index.html create mode 100644 frontend/package.json create mode 100644 frontend/public/vite.svg create mode 100644 frontend/src/App.css create mode 100644 frontend/src/App.tsx create mode 100644 frontend/src/assets/react.svg create mode 100644 frontend/src/index.css create mode 100644 frontend/src/main.tsx create mode 100644 frontend/src/vite-env.d.ts create mode 100644 frontend/tf/bucket.tf create mode 100644 frontend/tf/provider.tf create mode 100644 frontend/tsconfig.app.json create mode 100644 frontend/tsconfig.json create mode 100644 frontend/tsconfig.node.json create mode 100644 frontend/vite.config.ts diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000000..a547bf36d8 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000000..74872fd4af --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,50 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js +export default tseslint.config({ + languageOptions: { + // other options... + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + }, +}) +``` + +- Replace `tseslint.configs.recommended` to `tseslint.configs.recommendedTypeChecked` or `tseslint.configs.strictTypeChecked` +- Optionally add `...tseslint.configs.stylisticTypeChecked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and update the config: + +```js +// eslint.config.js +import react from 'eslint-plugin-react' + +export default tseslint.config({ + // Set the react version + settings: { react: { version: '18.3' } }, + plugins: { + // Add the react plugin + react, + }, + rules: { + // other rules... + // Enable its recommended rules + ...react.configs.recommended.rules, + ...react.configs['jsx-runtime'].rules, + }, +}) +``` diff --git a/frontend/eslint.config.js b/frontend/eslint.config.js new file mode 100644 index 0000000000..092408a9f0 --- /dev/null +++ b/frontend/eslint.config.js @@ -0,0 +1,28 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' + +export default tseslint.config( + { ignores: ['dist'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + }, +) diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000000..e4b78eae12 --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +
+ + + diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000000..64e796c5a3 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,29 @@ +{ + "name": "frontend", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@eslint/js": "^9.9.0", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.1", + "eslint": "^9.9.0", + "eslint-plugin-react-hooks": "^5.1.0-rc.0", + "eslint-plugin-react-refresh": "^0.4.9", + "globals": "^15.9.0", + "typescript": "^5.5.3", + "typescript-eslint": "^8.0.1", + "vite": "^5.4.1" + } +} diff --git a/frontend/public/vite.svg b/frontend/public/vite.svg new file mode 100644 index 0000000000..e7b8dfb1b2 --- /dev/null +++ b/frontend/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/App.css b/frontend/src/App.css new file mode 100644 index 0000000000..b9d355df2a --- /dev/null +++ b/frontend/src/App.css @@ -0,0 +1,42 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx new file mode 100644 index 0000000000..afe48ac750 --- /dev/null +++ b/frontend/src/App.tsx @@ -0,0 +1,35 @@ +import { useState } from 'react' +import reactLogo from './assets/react.svg' +import viteLogo from '/vite.svg' +import './App.css' + +function App() { + const [count, setCount] = useState(0) + + return ( + <> + +

Vite + React

+
+ +

+ Edit src/App.tsx and save to test HMR +

+
+

+ Click on the Vite and React logos to learn more +

+ + ) +} + +export default App diff --git a/frontend/src/assets/react.svg b/frontend/src/assets/react.svg new file mode 100644 index 0000000000..6c87de9bb3 --- /dev/null +++ b/frontend/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/index.css b/frontend/src/index.css new file mode 100644 index 0000000000..6119ad9a8f --- /dev/null +++ b/frontend/src/index.css @@ -0,0 +1,68 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx new file mode 100644 index 0000000000..6f4ac9bcca --- /dev/null +++ b/frontend/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import App from './App.tsx' +import './index.css' + +createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/frontend/src/vite-env.d.ts b/frontend/src/vite-env.d.ts new file mode 100644 index 0000000000..11f02fe2a0 --- /dev/null +++ b/frontend/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/frontend/tf/bucket.tf b/frontend/tf/bucket.tf new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frontend/tf/provider.tf b/frontend/tf/provider.tf new file mode 100644 index 0000000000..0d0f332515 --- /dev/null +++ b/frontend/tf/provider.tf @@ -0,0 +1,18 @@ +variable "service_name" { + type = string + description = "Name of the service. This name should be unique within the project." +} + +terraform { + required_providers { + google = { + source = "hashicorp/google" + version = "6.3.0" + } + } + + backend "gcs" { + bucket = var.bucket_name + prefix = "terraform/state/${var.service_name}" + } +} \ No newline at end of file diff --git a/frontend/tsconfig.app.json b/frontend/tsconfig.app.json new file mode 100644 index 0000000000..f0a235055d --- /dev/null +++ b/frontend/tsconfig.app.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json new file mode 100644 index 0000000000..1ffef600d9 --- /dev/null +++ b/frontend/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/frontend/tsconfig.node.json b/frontend/tsconfig.node.json new file mode 100644 index 0000000000..0d3d71446a --- /dev/null +++ b/frontend/tsconfig.node.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["vite.config.ts"] +} diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts new file mode 100644 index 0000000000..5a33944a9b --- /dev/null +++ b/frontend/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +}) From 8e1675b0a5d4ed1a726009fa4410600c08d1912a Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Fri, 20 Sep 2024 14:02:11 +0800 Subject: [PATCH 09/65] feat(frontent): Deploy to cloud script --- frontend/Makefile | 23 + frontend/scripts/env.sh | 12 + frontend/tf/.terraform.lock.hcl | 37 + frontend/tf/bucket.tf | 35 + frontend/tf/provider.tf | 34 +- frontend/tsconfig.app.tsbuildinfo | 1 + frontend/tsconfig.node.tsbuildinfo | 1 + frontend/vite.config.ts | 3 + frontend/yarn.lock | 1543 ++++++++++++++++++++++++++++ 9 files changed, 1688 insertions(+), 1 deletion(-) create mode 100644 frontend/Makefile create mode 100644 frontend/scripts/env.sh create mode 100644 frontend/tf/.terraform.lock.hcl create mode 100644 frontend/tsconfig.app.tsbuildinfo create mode 100644 frontend/tsconfig.node.tsbuildinfo create mode 100644 frontend/yarn.lock diff --git a/frontend/Makefile b/frontend/Makefile new file mode 100644 index 0000000000..43b8727e03 --- /dev/null +++ b/frontend/Makefile @@ -0,0 +1,23 @@ +deploy: infra_deploy code_deploy +destroy: infra_destroy + +code_build: + yarn run build + +code_deploy: code_build + . scripts/env.sh && \ + bucket_url=$$(cd tf && tofu output -raw frontend_bucket_url) && \ + gsutil -m rm $$bucket_url/'**' || true && \ + gsutil -m cp -r dist/** $$bucket_url && \ + cd tf && tofu output + +infra_deploy: tf/* + . scripts/env.sh && \ + cd tf && \ + tofu init && \ + tofu apply -auto-approve \ + +infra_destroy: + . scripts/env.sh && \ + cd tf && \ + tofu destroy -auto-approve \ \ No newline at end of file diff --git a/frontend/scripts/env.sh b/frontend/scripts/env.sh new file mode 100644 index 0000000000..17e10917f1 --- /dev/null +++ b/frontend/scripts/env.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -o allexport + +# Get the environment variables from the .env file in the root directory +source $(git rev-parse --show-toplevel)/.env + +# Environment varaibles for terraform input variables +TF_VAR_backend_gcs_bucket=$TF_BACKEND_BUCKET_NAME +TF_VAR_service_name=frontend +TF_VAR_project=$TF_PROJECT_NAME + +set +o allexport diff --git a/frontend/tf/.terraform.lock.hcl b/frontend/tf/.terraform.lock.hcl new file mode 100644 index 0000000000..5994c2bb3e --- /dev/null +++ b/frontend/tf/.terraform.lock.hcl @@ -0,0 +1,37 @@ +# This file is maintained automatically by "tofu init". +# Manual edits may be lost in future updates. + +provider "registry.opentofu.org/hashicorp/google" { + version = "6.3.0" + constraints = "6.3.0" + hashes = [ + "h1:2Yamc2+FSclN0at2L04+vAaL90JDNUH0e3aj2+gyTmA=", + "zh:1ce4d9270a11a99a842f4516e4a24e85b7bd14147c736bbd0ac9711feb880148", + "zh:2643cf1dacf4464688ca5d6f7c530ea941224a878cf19717b231bf0b5edc97b9", + "zh:559e23c32ab605189f2752fd261b120aa0a0604f12c063d856f1399048b856db", + "zh:5e422235813c6c34a12cede5ee535c377bee0d9de731ea7ab4abb2fc2d8e30af", + "zh:66d0b21cf6af354b0d0ee7b6aee7ad5ca1f3160a91b4ba0d21fd78db8eeca74f", + "zh:7c73c86100e26c6eb43026eec9cfa83b95a6872a0142bd221c1d4a65741180f4", + "zh:bc36f1ecd2dac775f5216097a1028fbcc63604234f446ce6220463f4b4a1fac8", + "zh:cdbd0883eaaad0e8caf79252acc3997fcebba9767db67a6b873008fb8e4945f9", + "zh:f0760ed8f0f622f88c40686cca0f4a7862cb41d67b2c1ddcf16b01418a4c8abc", + "zh:fae891937838784869a0cbfdf0c1d2bad08fba63c1e2a9fd43c269b2940925b6", + ] +} + +provider "registry.opentofu.org/hashicorp/google-beta" { + version = "6.3.0" + hashes = [ + "h1:oMxXasSZa60+BT4DZpea5nREQQeN43PsUlPgVPJkEo0=", + "zh:552e85dab1872ecf2a5f51c092e0c85dff0857324a75299a867d2f25cfbad80f", + "zh:5e5b313fb43a64495df0ddbfd3a3505cd67b5aaff030dd3ea56cb28fae98bb4e", + "zh:6eac7c4bf6d3d347bdced815835c152ae68e09161d261796bb42e6406514305b", + "zh:6f5a81f4422ed6aa087168ae539555abc488d3782e8abfa9bb50c3fe75b1e93d", + "zh:a913170f54b032ee62f147d641b9dcfa50606a6bb96b88168d9e4acfcf7bdef2", + "zh:abaa94951c335d876aa4b7bd964e6d182d8ab31c0968bd8af0ca806dc73d5dd6", + "zh:ac461588dc2fdf38ed15fc30624f526914e18414655ee8a629af30e847272475", + "zh:baac4cdd8c295e04e8594d792f6d42213d313f7cd6b2fc8cc97ec36377367ea5", + "zh:bda1bc41e0cb60b0b585fc801e397d051966545489428a590218e61194842d25", + "zh:d4fbc62e2123cbf8a0f0c32167d440be14de4d13fa36be39f16b97c8d46eb5f6", + ] +} diff --git a/frontend/tf/bucket.tf b/frontend/tf/bucket.tf index e69de29bb2..82d856a1a5 100644 --- a/frontend/tf/bucket.tf +++ b/frontend/tf/bucket.tf @@ -0,0 +1,35 @@ +resource "google_storage_bucket" "frontend" { + name = "${var.project}-frontend" + location = "US" + force_destroy = true + + website { + main_page_suffix = "index.html" + } + cors { # TODO: yes, yes. Incredibly insecure. I'ms sorry. + origin = [""] + method = ["*"] + response_header = ["*"] + max_age_seconds = 3600 + } +} + +resource "google_storage_bucket_access_control" "public_read" { + bucket = google_storage_bucket.frontend.name + role = "READER" + entity = "allUsers" +} + +resource "google_storage_bucket_iam_member" "public_read" { + bucket = google_storage_bucket.frontend.name + role = "roles/storage.objectViewer" + member = "allUsers" +} + +output "frontend_bucket_url" { + value = google_storage_bucket.frontend.url +} + +output "frontend_bucket_website_url" { + value = "https://storage.googleapis.com/${google_storage_bucket.frontend.name}/index.html" +} \ No newline at end of file diff --git a/frontend/tf/provider.tf b/frontend/tf/provider.tf index 0d0f332515..bf581466fc 100644 --- a/frontend/tf/provider.tf +++ b/frontend/tf/provider.tf @@ -1,8 +1,18 @@ +variable "backend_gcs_bucket" { + type = string + description = "The name of the bucket for storing Terraform state" +} + variable "service_name" { type = string description = "Name of the service. This name should be unique within the project." } +variable "project" { + type = string + description = "Name of the project. This value should be shared within the entire repository." +} + terraform { required_providers { google = { @@ -12,7 +22,29 @@ terraform { } backend "gcs" { - bucket = var.bucket_name + bucket = var.backend_gcs_bucket prefix = "terraform/state/${var.service_name}" } +} + +provider "google" { + # Configuration options + project = var.project + + default_labels = { + "managed-by" = "opentofu" + "project" = var.project + # "environment" = "production" # TODO: This depends on the environment/branch. + } +} + +provider "google-beta" { + # Configuration options + project = var.project + + default_labels = { + "managed-by" = "opentofu" + "project" = var.project + # "environment" = "production" # TODO: This depends on the environment/branch. + } } \ No newline at end of file diff --git a/frontend/tsconfig.app.tsbuildinfo b/frontend/tsconfig.app.tsbuildinfo new file mode 100644 index 0000000000..81827de0d9 --- /dev/null +++ b/frontend/tsconfig.app.tsbuildinfo @@ -0,0 +1 @@ +{"root":["./src/App.tsx","./src/main.tsx","./src/vite-env.d.ts"],"version":"5.6.2"} \ No newline at end of file diff --git a/frontend/tsconfig.node.tsbuildinfo b/frontend/tsconfig.node.tsbuildinfo new file mode 100644 index 0000000000..98ef2f9966 --- /dev/null +++ b/frontend/tsconfig.node.tsbuildinfo @@ -0,0 +1 @@ +{"root":["./vite.config.ts"],"version":"5.6.2"} \ No newline at end of file diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 5a33944a9b..6e76251d32 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -4,4 +4,7 @@ import react from '@vitejs/plugin-react' // https://vitejs.dev/config/ export default defineConfig({ plugins: [react()], + // For relative asset paths. + // See: https://stackoverflow.com/questions/69744253/vite-build-always-using-static-paths + base: './', }) diff --git a/frontend/yarn.lock b/frontend/yarn.lock new file mode 100644 index 0000000000..d60efc844b --- /dev/null +++ b/frontend/yarn.lock @@ -0,0 +1,1543 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@babel/code-frame@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== + dependencies: + "@babel/highlight" "^7.24.7" + picocolors "^1.0.0" + +"@babel/compat-data@^7.25.2": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.4.tgz#7d2a80ce229890edcf4cc259d4d696cb4dae2fcb" + integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ== + +"@babel/core@^7.24.5": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77" + integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.0" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-module-transforms" "^7.25.2" + "@babel/helpers" "^7.25.0" + "@babel/parser" "^7.25.0" + "@babel/template" "^7.25.0" + "@babel/traverse" "^7.25.2" + "@babel/types" "^7.25.2" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.25.0", "@babel/generator@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c" + integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw== + dependencies: + "@babel/types" "^7.25.6" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + +"@babel/helper-compilation-targets@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c" + integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== + dependencies: + "@babel/compat-data" "^7.25.2" + "@babel/helper-validator-option" "^7.24.8" + browserslist "^4.23.1" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-module-imports@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" + integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-module-transforms@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6" + integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ== + dependencies: + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-simple-access" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" + "@babel/traverse" "^7.25.2" + +"@babel/helper-plugin-utils@^7.24.7": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" + integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== + +"@babel/helper-simple-access@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" + integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-string-parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== + +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + +"@babel/helper-validator-option@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" + integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== + +"@babel/helpers@^7.25.0": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.6.tgz#57ee60141829ba2e102f30711ffe3afab357cc60" + integrity sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q== + dependencies: + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.6" + +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.7" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.25.0", "@babel/parser@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f" + integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q== + dependencies: + "@babel/types" "^7.25.6" + +"@babel/plugin-transform-react-jsx-self@^7.24.5": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz#66bff0248ea0b549972e733516ffad577477bdab" + integrity sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-react-jsx-source@^7.24.1": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz#1198aab2548ad19582013815c938d3ebd8291ee3" + integrity sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/template@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" + integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.25.0" + "@babel/types" "^7.25.0" + +"@babel/traverse@^7.24.7", "@babel/traverse@^7.25.2": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41" + integrity sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.6" + "@babel/parser" "^7.25.6" + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.6" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6" + integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw== + dependencies: + "@babel/helper-string-parser" "^7.24.8" + "@babel/helper-validator-identifier" "^7.24.7" + to-fast-properties "^2.0.0" + +"@esbuild/aix-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" + integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== + +"@esbuild/android-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" + integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== + +"@esbuild/android-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" + integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== + +"@esbuild/android-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" + integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== + +"@esbuild/darwin-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" + integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== + +"@esbuild/darwin-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" + integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== + +"@esbuild/freebsd-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" + integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== + +"@esbuild/freebsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" + integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== + +"@esbuild/linux-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" + integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== + +"@esbuild/linux-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" + integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== + +"@esbuild/linux-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" + integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== + +"@esbuild/linux-loong64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" + integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== + +"@esbuild/linux-mips64el@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" + integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== + +"@esbuild/linux-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" + integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== + +"@esbuild/linux-riscv64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" + integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== + +"@esbuild/linux-s390x@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" + integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== + +"@esbuild/linux-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" + integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== + +"@esbuild/netbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" + integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== + +"@esbuild/openbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" + integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== + +"@esbuild/sunos-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" + integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== + +"@esbuild/win32-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" + integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== + +"@esbuild/win32-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" + integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== + +"@esbuild/win32-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" + integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.11.0": + version "4.11.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.1.tgz#a547badfc719eb3e5f4b556325e542fbe9d7a18f" + integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q== + +"@eslint/config-array@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.18.0.tgz#37d8fe656e0d5e3dbaea7758ea56540867fd074d" + integrity sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw== + dependencies: + "@eslint/object-schema" "^2.1.4" + debug "^4.3.1" + minimatch "^3.1.2" + +"@eslint/eslintrc@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.1.0.tgz#dbd3482bfd91efa663cbe7aa1f506839868207b6" + integrity sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@9.10.0", "@eslint/js@^9.9.0": + version "9.10.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.10.0.tgz#eaa3cb0baec497970bb29e43a153d0d5650143c6" + integrity sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g== + +"@eslint/object-schema@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.4.tgz#9e69f8bb4031e11df79e03db09f9dbbae1740843" + integrity sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ== + +"@eslint/plugin-kit@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.1.0.tgz#809b95a0227ee79c3195adfb562eb94352e77974" + integrity sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ== + dependencies: + levn "^0.4.1" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/retry@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.0.tgz#6d86b8cb322660f03d3f0aa94b99bdd8e172d570" + integrity sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew== + +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@rollup/rollup-android-arm-eabi@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.0.tgz#e8c16c336f060b4cb592f62eb4f0e543d79d51fe" + integrity sha512-/IZQvg6ZR0tAkEi4tdXOraQoWeJy9gbQ/cx4I7k9dJaCk9qrXEcdouxRVz5kZXt5C2bQ9pILoAA+KB4C/d3pfw== + +"@rollup/rollup-android-arm64@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.0.tgz#7a44160a14017fa744912d7037c7d81d6f8a46e7" + integrity sha512-ETHi4bxrYnvOtXeM7d4V4kZWixib2jddFacJjsOjwbgYSRsyXYtZHC4ht134OsslPIcnkqT+TKV4eU8rNBKyyQ== + +"@rollup/rollup-darwin-arm64@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.0.tgz#6122dc37d4a09521d8abe18925956d3b46cfbac9" + integrity sha512-ZWgARzhSKE+gVUX7QWaECoRQsPwaD8ZR0Oxb3aUpzdErTvlEadfQpORPXkKSdKbFci9v8MJfkTtoEHnnW9Ulng== + +"@rollup/rollup-darwin-x64@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.0.tgz#453f345899cbf544aa0d6f5808d24d2e42f605b7" + integrity sha512-h0ZAtOfHyio8Az6cwIGS+nHUfRMWBDO5jXB8PQCARVF6Na/G6XS2SFxDl8Oem+S5ZsHQgtsI7RT4JQnI1qrlaw== + +"@rollup/rollup-linux-arm-gnueabihf@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.0.tgz#3a32fa4e80a62a6d733014838b1123fe76b060fe" + integrity sha512-9pxQJSPwFsVi0ttOmqLY4JJ9pg9t1gKhK0JDbV1yUEETSx55fdyCjt39eBQ54OQCzAF0nVGO6LfEH1KnCPvelA== + +"@rollup/rollup-linux-arm-musleabihf@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.0.tgz#55d3953c54419e93efe124882a3103c8a2f65641" + integrity sha512-YJ5Ku5BmNJZb58A4qSEo3JlIG4d3G2lWyBi13ABlXzO41SsdnUKi3HQHe83VpwBVG4jHFTW65jOQb8qyoR+qzg== + +"@rollup/rollup-linux-arm64-gnu@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.0.tgz#cd626963b9962baf8e09d792e67b87269a5bcfff" + integrity sha512-U4G4u7f+QCqHlVg1Nlx+qapZy+QoG+NV6ux+upo/T7arNGwKvKP2kmGM4W5QTbdewWFgudQxi3kDNST9GT1/mg== + +"@rollup/rollup-linux-arm64-musl@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.0.tgz#ad209270c9937a27346fce5b0670cbdfb1e6a0a6" + integrity sha512-aQpNlKmx3amwkA3a5J6nlXSahE1ijl0L9KuIjVOUhfOh7uw2S4piR3mtpxpRtbnK809SBtyPsM9q15CPTsY7HQ== + +"@rollup/rollup-linux-powerpc64le-gnu@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.0.tgz#fdd173929a5bba8b7e8b37314380213d9604088f" + integrity sha512-9fx6Zj/7vve/Fp4iexUFRKb5+RjLCff6YTRQl4CoDhdMfDoobWmhAxQWV3NfShMzQk1Q/iCnageFyGfqnsmeqQ== + +"@rollup/rollup-linux-riscv64-gnu@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.0.tgz#90b11314fbf45d04083f658e08dc3b32fd713061" + integrity sha512-VWQiCcN7zBgZYLjndIEh5tamtnKg5TGxyZPWcN9zBtXBwfcGSZ5cHSdQZfQH/GB4uRxk0D3VYbOEe/chJhPGLQ== + +"@rollup/rollup-linux-s390x-gnu@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.0.tgz#46bb2f1135aeec646b720d6032d7c86915f8b2ec" + integrity sha512-EHmPnPWvyYqncObwqrosb/CpH3GOjE76vWVs0g4hWsDRUVhg61hBmlVg5TPXqF+g+PvIbqkC7i3h8wbn4Gp2Fg== + +"@rollup/rollup-linux-x64-gnu@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.0.tgz#d731a19af5f05eabcba871bda2eeb2fa8c8adb67" + integrity sha512-tsSWy3YQzmpjDKnQ1Vcpy3p9Z+kMFbSIesCdMNgLizDWFhrLZIoN21JSq01g+MZMDFF+Y1+4zxgrlqPjid5ohg== + +"@rollup/rollup-linux-x64-musl@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.0.tgz#5438b2dc38fe467444cf769146098be083022d0f" + integrity sha512-anr1Y11uPOQrpuU8XOikY5lH4Qu94oS6j0xrulHk3NkLDq19MlX8Ng/pVipjxBJ9a2l3+F39REZYyWQFkZ4/fw== + +"@rollup/rollup-win32-arm64-msvc@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.0.tgz#6bd66c198f80c8e7050cfd901701cfb9555d768a" + integrity sha512-7LB+Bh+Ut7cfmO0m244/asvtIGQr5pG5Rvjz/l1Rnz1kDzM02pSX9jPaS0p+90H5I1x4d1FkCew+B7MOnoatNw== + +"@rollup/rollup-win32-ia32-msvc@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.0.tgz#58daea1f1e65143c44c8f3311f30ff8eefa62bae" + integrity sha512-+3qZ4rer7t/QsC5JwMpcvCVPRcJt1cJrYS/TMJZzXIJbxWFQEVhrIc26IhB+5Z9fT9umfVc+Es2mOZgl+7jdJQ== + +"@rollup/rollup-win32-x64-msvc@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.0.tgz#956948629f6b87de0bdf526b28d940221540bbb6" + integrity sha512-YdicNOSJONVx/vuPkgPTyRoAPx3GbknBZRCOUkK84FJ/YTfs/F0vl/YsMscrB6Y177d+yDRcj+JWMPMCgshwrA== + +"@types/babel__core@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.8" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*": + version "7.20.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== + dependencies: + "@babel/types" "^7.20.7" + +"@types/estree@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + +"@types/prop-types@*": + version "15.7.13" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.13.tgz#2af91918ee12d9d32914feb13f5326658461b451" + integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA== + +"@types/react-dom@^18.3.0": + version "18.3.0" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" + integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^18.3.3": + version "18.3.7" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.7.tgz#6decbfbb01f8d82d56ff5403394121940faa6569" + integrity sha512-KUnDCJF5+AiZd8owLIeVHqmW9yM4sqmDVf2JRJiBMFkGvkoZ4/WyV2lL4zVsoinmRS/W3FeEdZLEWFRofnT2FQ== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + +"@typescript-eslint/eslint-plugin@8.6.0": + version "8.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.6.0.tgz#20049754ff9f6d3a09bf240297f029ce04290999" + integrity sha512-UOaz/wFowmoh2G6Mr9gw60B1mm0MzUtm6Ic8G2yM1Le6gyj5Loi/N+O5mocugRGY+8OeeKmkMmbxNqUCq3B4Sg== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.6.0" + "@typescript-eslint/type-utils" "8.6.0" + "@typescript-eslint/utils" "8.6.0" + "@typescript-eslint/visitor-keys" "8.6.0" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/parser@8.6.0": + version "8.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.6.0.tgz#02e092b9dc8b4e319172af620d0d39b337d948f6" + integrity sha512-eQcbCuA2Vmw45iGfcyG4y6rS7BhWfz9MQuk409WD47qMM+bKCGQWXxvoOs1DUp+T7UBMTtRTVT+kXr7Sh4O9Ow== + dependencies: + "@typescript-eslint/scope-manager" "8.6.0" + "@typescript-eslint/types" "8.6.0" + "@typescript-eslint/typescript-estree" "8.6.0" + "@typescript-eslint/visitor-keys" "8.6.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@8.6.0": + version "8.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.6.0.tgz#28cc2fc26a84b75addf45091a2c6283e29e2c982" + integrity sha512-ZuoutoS5y9UOxKvpc/GkvF4cuEmpokda4wRg64JEia27wX+PysIE9q+lzDtlHHgblwUWwo5/Qn+/WyTUvDwBHw== + dependencies: + "@typescript-eslint/types" "8.6.0" + "@typescript-eslint/visitor-keys" "8.6.0" + +"@typescript-eslint/type-utils@8.6.0": + version "8.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.6.0.tgz#d4347e637478bef88cee1db691fcfa20ade9b8a0" + integrity sha512-dtePl4gsuenXVwC7dVNlb4mGDcKjDT/Ropsk4za/ouMBPplCLyznIaR+W65mvCvsyS97dymoBRrioEXI7k0XIg== + dependencies: + "@typescript-eslint/typescript-estree" "8.6.0" + "@typescript-eslint/utils" "8.6.0" + debug "^4.3.4" + ts-api-utils "^1.3.0" + +"@typescript-eslint/types@8.6.0": + version "8.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.6.0.tgz#cdc3a16f83f2f0663d6723e9fd032331cdd9f51c" + integrity sha512-rojqFZGd4MQxw33SrOy09qIDS8WEldM8JWtKQLAjf/X5mGSeEFh5ixQlxssMNyPslVIk9yzWqXCsV2eFhYrYUw== + +"@typescript-eslint/typescript-estree@8.6.0": + version "8.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.6.0.tgz#f945506de42871f04868371cb5bf21e8f7266e01" + integrity sha512-MOVAzsKJIPIlLK239l5s06YXjNqpKTVhBVDnqUumQJja5+Y94V3+4VUFRA0G60y2jNnTVwRCkhyGQpavfsbq/g== + dependencies: + "@typescript-eslint/types" "8.6.0" + "@typescript-eslint/visitor-keys" "8.6.0" + debug "^4.3.4" + fast-glob "^3.3.2" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/utils@8.6.0": + version "8.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.6.0.tgz#175fe893f32804bed1e72b3364ea6bbe1044181c" + integrity sha512-eNp9cWnYf36NaOVjkEUznf6fEgVy1TWpE0o52e4wtojjBx7D1UV2WAWGzR+8Y5lVFtpMLPwNbC67T83DWSph4A== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "8.6.0" + "@typescript-eslint/types" "8.6.0" + "@typescript-eslint/typescript-estree" "8.6.0" + +"@typescript-eslint/visitor-keys@8.6.0": + version "8.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.6.0.tgz#5432af4a1753f376f35ab5b891fc9db237aaf76f" + integrity sha512-wapVFfZg9H0qOYh4grNVQiMklJGluQrOUiOhYRrQWhx7BY/+I1IYb8BczWNbbUpO+pqy0rDciv3lQH5E1bCLrg== + dependencies: + "@typescript-eslint/types" "8.6.0" + eslint-visitor-keys "^3.4.3" + +"@vitejs/plugin-react@^4.3.1": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz#d0be6594051ded8957df555ff07a991fb618b48e" + integrity sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg== + dependencies: + "@babel/core" "^7.24.5" + "@babel/plugin-transform-react-jsx-self" "^7.24.5" + "@babel/plugin-transform-react-jsx-source" "^7.24.1" + "@types/babel__core" "^7.20.5" + react-refresh "^0.14.2" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.12.0: + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browserslist@^4.23.1: + version "4.23.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" + integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== + dependencies: + caniuse-lite "^1.0.30001646" + electron-to-chromium "^1.5.4" + node-releases "^2.0.18" + update-browserslist-db "^1.1.0" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +caniuse-lite@^1.0.30001646: + version "1.0.30001662" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001662.tgz#3574b22dfec54a3f3b6787331da1040fe8e763ec" + integrity sha512-sgMUVwLmGseH8ZIrm1d51UbrhqMCH3jvS7gF/M6byuHOnKyLOBL7W8yz5V02OHwgLGA36o/AFhWzzh4uc5aqTA== + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +csstype@^3.0.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +electron-to-chromium@^1.5.4: + version "1.5.25" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.25.tgz#492ade1cde401332b9b75aa0c55fd5e1550ca66c" + integrity sha512-kMb204zvK3PsSlgvvwzI3wBIcAw15tRkYk+NQdsjdDtcQWTp2RABbMQ9rUBy8KNEOM+/E6ep+XC3AykiWZld4g== + +esbuild@^0.21.3: + version "0.21.5" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" + integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== + optionalDependencies: + "@esbuild/aix-ppc64" "0.21.5" + "@esbuild/android-arm" "0.21.5" + "@esbuild/android-arm64" "0.21.5" + "@esbuild/android-x64" "0.21.5" + "@esbuild/darwin-arm64" "0.21.5" + "@esbuild/darwin-x64" "0.21.5" + "@esbuild/freebsd-arm64" "0.21.5" + "@esbuild/freebsd-x64" "0.21.5" + "@esbuild/linux-arm" "0.21.5" + "@esbuild/linux-arm64" "0.21.5" + "@esbuild/linux-ia32" "0.21.5" + "@esbuild/linux-loong64" "0.21.5" + "@esbuild/linux-mips64el" "0.21.5" + "@esbuild/linux-ppc64" "0.21.5" + "@esbuild/linux-riscv64" "0.21.5" + "@esbuild/linux-s390x" "0.21.5" + "@esbuild/linux-x64" "0.21.5" + "@esbuild/netbsd-x64" "0.21.5" + "@esbuild/openbsd-x64" "0.21.5" + "@esbuild/sunos-x64" "0.21.5" + "@esbuild/win32-arm64" "0.21.5" + "@esbuild/win32-ia32" "0.21.5" + "@esbuild/win32-x64" "0.21.5" + +escalade@^3.1.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-plugin-react-hooks@^5.1.0-rc.0: + version "5.1.0-rc-fb9a90fa48-20240614" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0-rc-fb9a90fa48-20240614.tgz#206a7ec005f0b286aaf7091f4e566083d310b189" + integrity sha512-xsiRwaDNF5wWNC4ZHLut+x/YcAxksUd9Rizt7LaEn3bV8VyYRpXnRJQlLOfYaVy9esk4DFP4zPPnoNVjq5Gc0w== + +eslint-plugin-react-refresh@^0.4.9: + version "0.4.12" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.12.tgz#73d61c7fcbe3f7280edb6579380b4350d2f547ed" + integrity sha512-9neVjoGv20FwYtCP6CB1dzR1vr57ZDNOXst21wd2xJ/cTlM2xLq0GWVlSNTdMn/4BtP6cHYBMCSp1wFBJ9jBsg== + +eslint-scope@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.0.2.tgz#5cbb33d4384c9136083a71190d548158fe128f94" + integrity sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint-visitor-keys@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz#e3adc021aa038a2a8e0b2f8b0ce8f66b9483b1fb" + integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw== + +eslint@^9.9.0: + version "9.10.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.10.0.tgz#0bd74d7fe4db77565d0e7f57c7df6d2b04756806" + integrity sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.11.0" + "@eslint/config-array" "^0.18.0" + "@eslint/eslintrc" "^3.1.0" + "@eslint/js" "9.10.0" + "@eslint/plugin-kit" "^0.1.0" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.3.0" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^8.0.2" + eslint-visitor-keys "^4.0.0" + espree "^10.1.0" + esquery "^1.5.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + json-stable-stringify-without-jsonify "^1.0.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^10.0.1, espree@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.1.0.tgz#8788dae611574c0f070691f522e4116c5a11fc56" + integrity sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA== + dependencies: + acorn "^8.12.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.0.0" + +esquery@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + +fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + +globals@^15.9.0: + version "15.9.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-15.9.0.tgz#e9de01771091ffbc37db5714dab484f9f69ff399" + integrity sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +ignore@^5.2.0, ignore@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +keyv@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +loose-envify@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== + +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" + integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== + +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +postcss@^8.4.43: + version "8.4.47" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.47.tgz#5bf6c9a010f3e724c503bf03ef7947dcb0fea365" + integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ== + dependencies: + nanoid "^3.3.7" + picocolors "^1.1.0" + source-map-js "^1.2.1" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +react-dom@^18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.2" + +react-refresh@^0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" + integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== + +react@^18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== + dependencies: + loose-envify "^1.1.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rollup@^4.20.0: + version "4.22.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.22.0.tgz#23cd9e4565a458587683accc34a054660c01f351" + integrity sha512-W21MUIFPZ4+O2Je/EU+GP3iz7PH4pVPUXSbEZdatQnxo29+3rsUjgrJmzuAZU24z7yRAnFN6ukxeAhZh/c7hzg== + dependencies: + "@types/estree" "1.0.5" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.22.0" + "@rollup/rollup-android-arm64" "4.22.0" + "@rollup/rollup-darwin-arm64" "4.22.0" + "@rollup/rollup-darwin-x64" "4.22.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.22.0" + "@rollup/rollup-linux-arm-musleabihf" "4.22.0" + "@rollup/rollup-linux-arm64-gnu" "4.22.0" + "@rollup/rollup-linux-arm64-musl" "4.22.0" + "@rollup/rollup-linux-powerpc64le-gnu" "4.22.0" + "@rollup/rollup-linux-riscv64-gnu" "4.22.0" + "@rollup/rollup-linux-s390x-gnu" "4.22.0" + "@rollup/rollup-linux-x64-gnu" "4.22.0" + "@rollup/rollup-linux-x64-musl" "4.22.0" + "@rollup/rollup-win32-arm64-msvc" "4.22.0" + "@rollup/rollup-win32-ia32-msvc" "4.22.0" + "@rollup/rollup-win32-x64-msvc" "4.22.0" + fsevents "~2.3.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== + dependencies: + loose-envify "^1.1.0" + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.6.0: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +ts-api-utils@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +typescript-eslint@^8.0.1: + version "8.6.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.6.0.tgz#5f0b5e23b34385ef146e447616c1a0d6bd14bedb" + integrity sha512-eEhhlxCEpCd4helh3AO1hk0UP2MvbRi9CtIAJTVPQjuSXOOO2jsEacNi4UdcJzZJbeuVg1gMhtZ8UYb+NFYPrA== + dependencies: + "@typescript-eslint/eslint-plugin" "8.6.0" + "@typescript-eslint/parser" "8.6.0" + "@typescript-eslint/utils" "8.6.0" + +typescript@^5.5.3: + version "5.6.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.2.tgz#d1de67b6bef77c41823f822df8f0b3bcff60a5a0" + integrity sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw== + +update-browserslist-db@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== + dependencies: + escalade "^3.1.2" + picocolors "^1.0.1" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +vite@^5.4.1: + version "5.4.6" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.6.tgz#85a93a1228a7fb5a723ca1743e337a2588ed008f" + integrity sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q== + dependencies: + esbuild "^0.21.3" + postcss "^8.4.43" + rollup "^4.20.0" + optionalDependencies: + fsevents "~2.3.3" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From fc2c3835f6e43507d69d98b0172d4bbe488b48e3 Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Fri, 20 Sep 2024 14:05:57 +0800 Subject: [PATCH 10/65] docs: Update .env file with comments --- .env | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.env b/.env index 85aae7ab92..c78e3f5799 100644 --- a/.env +++ b/.env @@ -1,4 +1,5 @@ -GOOGLE_APPLICATION_CREDENTIALS=$(realpath ./secrets/gcp_credentials.json) +## Shared Environment Variables for the project +GOOGLE_APPLICATION_CREDENTIALS=$(git rev-parse --show-toplevel)/secrets/gcp_credentials.json GCP_PROJECT_NAME=cs3219-ay2425s1-project-g10 # Terraform General From d05910ca73ba9c6825beead1f8cb33155c875e9a Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Fri, 20 Sep 2024 14:18:27 +0800 Subject: [PATCH 11/65] feat(backend): Skeleton TypeScript server with Docker image --- backend/.dockerignore | 2 + backend/.gitignore | 142 +++++++++ backend/Dockerfile | 12 + backend/index.ts | 12 + backend/package.json | 15 + backend/tsconfig.json | 110 +++++++ backend/yarn.lock | 663 ++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 956 insertions(+) create mode 100644 backend/.dockerignore create mode 100644 backend/.gitignore create mode 100644 backend/Dockerfile create mode 100644 backend/index.ts create mode 100644 backend/package.json create mode 100644 backend/tsconfig.json create mode 100644 backend/yarn.lock diff --git a/backend/.dockerignore b/backend/.dockerignore new file mode 100644 index 0000000000..77c9570c63 --- /dev/null +++ b/backend/.dockerignore @@ -0,0 +1,2 @@ +/node_modules/ +.gitignore diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 0000000000..5de9178342 --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1,142 @@ +# https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored + +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/sdks +!.yarn/versions + +# https://github.com/github/gitignore/blob/main/Node.gitignore + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* \ No newline at end of file diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000000..9b47166be6 --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,12 @@ +FROM node:22-alpine + +COPY --link package.json yarn.lock ./ + +RUN yarn + +COPY --link . . + +# The port should be specified in an .env file. +EXPOSE 3333 + +CMD ["yarn", "run", "start"] \ No newline at end of file diff --git a/backend/index.ts b/backend/index.ts new file mode 100644 index 0000000000..1b1d4c9d01 --- /dev/null +++ b/backend/index.ts @@ -0,0 +1,12 @@ +import express from 'express'; + + +const app = express(); + +app.get('/hello', (req, res) => { + res.send('Hello World!'); +}); + +app.listen(3333, () => { + console.log('Server is running on localhost:3333'); +}) diff --git a/backend/package.json b/backend/package.json new file mode 100644 index 0000000000..01a896fc23 --- /dev/null +++ b/backend/package.json @@ -0,0 +1,15 @@ +{ + "name": "backend", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "dependencies": { + "@types/express": "^4.17.21", + "express": "^4.21.0", + "ts-node": "^10.9.2", + "typescript": "^5.6.2" + }, + "scripts": { + "start": "ts-node index.ts" + } +} diff --git a/backend/tsconfig.json b/backend/tsconfig.json new file mode 100644 index 0000000000..3f3166a018 --- /dev/null +++ b/backend/tsconfig.json @@ -0,0 +1,110 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "noUncheckedSideEffectImports": true, /* Check side effect imports. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "strictBuiltinIteratorReturn": true, /* Built-in iterators are instantiated with a 'TReturn' type of 'undefined' instead of 'any'. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} diff --git a/backend/yarn.lock b/backend/yarn.lock new file mode 100644 index 0000000000..b1515d4c6d --- /dev/null +++ b/backend/yarn.lock @@ -0,0 +1,663 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@tsconfig/node10@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@types/body-parser@*": + version "1.19.5" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + dependencies: + "@types/node" "*" + +"@types/express-serve-static-core@^4.17.33": + version "4.19.5" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz#218064e321126fcf9048d1ca25dd2465da55d9c6" + integrity sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@^4.17.21": + version "4.17.21" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/http-errors@*": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== + +"@types/mime@^1": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== + +"@types/node@*": + version "22.5.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.5.tgz#52f939dd0f65fc552a4ad0b392f3c466cc5d7a44" + integrity sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA== + dependencies: + undici-types "~6.19.2" + +"@types/qs@*": + version "6.9.16" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.16.tgz#52bba125a07c0482d26747d5d4947a64daf8f794" + integrity sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A== + +"@types/range-parser@*": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== + +"@types/send@*": + version "0.17.4" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-static@*": + version "1.15.7" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" + integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== + dependencies: + "@types/http-errors" "*" + "@types/node" "*" + "@types/send" "*" + +accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-walk@^8.1.1: + version "8.3.4" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" + integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== + dependencies: + acorn "^8.11.0" + +acorn@^8.11.0, acorn@^8.4.1: + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +body-parser@1.20.3: + version "1.20.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" + integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.13.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +express@^4.21.0: + version "4.21.0" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.0.tgz#d57cb706d49623d4ac27833f1cbc466b668eb915" + integrity sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.3" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.6.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~2.0.0" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.3.1" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.3" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.10" + proxy-addr "~2.0.7" + qs "6.13.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.19.0" + serve-static "1.16.2" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +finalhandler@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" + integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== + dependencies: + debug "2.6.9" + encodeurl "~2.0.0" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +hasown@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +inherits@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +merge-descriptors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" + integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +object-inspect@^1.13.1: + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-to-regexp@0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" + integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +qs@6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== + dependencies: + side-channel "^1.0.6" + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +safe-buffer@5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +send@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" + integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serve-static@1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== + dependencies: + encodeurl "~2.0.0" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.19.0" + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +ts-node@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typescript@^5.6.2: + version "5.6.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.2.tgz#d1de67b6bef77c41823f822df8f0b3bcff60a5a0" + integrity sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw== + +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== From ff33f48857d35152c4ff45ffcbd6af6dcda8c6b9 Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Fri, 20 Sep 2024 21:18:35 +0800 Subject: [PATCH 12/65] feat: Terraform configs + Deployment for backend --- .env | 13 +- Makefile | 31 +- backend/Dockerfile | 5 +- backend/Makefile | 22 + backend/index.ts | 3 +- backend/package-lock.json | 1062 +++++++++++++++++++++++++++++++ backend/source.sh | 18 + backend/tf/.terraform.lock.hcl | 20 + backend/tf/cloud_run.tf | 31 + backend/tf/provider.tf | 45 ++ backend/yarn.lock | 194 +++--- frontend/Makefile | 6 +- frontend/scripts/env.sh | 12 - frontend/source.sh | 6 + frontend/tf/.terraform.lock.hcl | 17 - frontend/tf/provider.tf | 11 - source.sh | 29 + tf/.terraform.lock.hcl | 20 + tf/provider.tf | 33 + tf/registry.tf | 14 + tf_backend/terraform.tfvars | 2 - 21 files changed, 1435 insertions(+), 159 deletions(-) create mode 100644 backend/Makefile create mode 100644 backend/package-lock.json create mode 100644 backend/source.sh create mode 100644 backend/tf/.terraform.lock.hcl create mode 100644 backend/tf/cloud_run.tf create mode 100644 backend/tf/provider.tf delete mode 100644 frontend/scripts/env.sh create mode 100644 frontend/source.sh create mode 100755 source.sh create mode 100644 tf/.terraform.lock.hcl create mode 100644 tf/provider.tf create mode 100644 tf/registry.tf delete mode 100644 tf_backend/terraform.tfvars diff --git a/.env b/.env index c78e3f5799..9d97a5b762 100644 --- a/.env +++ b/.env @@ -1,9 +1,10 @@ ## Shared Environment Variables for the project -GOOGLE_APPLICATION_CREDENTIALS=$(git rev-parse --show-toplevel)/secrets/gcp_credentials.json -GCP_PROJECT_NAME=cs3219-ay2425s1-project-g10 +GOOGLE_APPLICATION_CREDENTIALS=./secrets/gcp_credentials.json +GCLOUD_PROJECT=cs3219-ay2425s1-project-g10 +GCLOUD_REGION=us-central1 +GCLOUD_ZONE=us-central1-c +GCLOUD_REPOSITORY_ID=cs3219-ay2425s1-project-g10 -# Terraform General -TF_PROJECT_NAME=${GCP_PROJECT_NAME} +# Terraform backend variables +TF_BACKEND_BUCKET_NAME=${GCLOUD_PROJECT}-tfstate -# Terraform Backend -TF_BACKEND_BUCKET_NAME=${TF_PROJECT_NAME}-tfstate \ No newline at end of file diff --git a/Makefile b/Makefile index b1c92dcc8f..c7a34e9562 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,8 @@ +SHELL := /bin/bash .PHONY: help gcloud_auth deploy_tf_backend destroy_tf_backend + help: ## Display this help text @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[$$()% 0-9a-zA-Z_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) @@ -14,23 +16,36 @@ gcloud_auth: ## Authenticate with gcloud and launch a new shell. gcloud auth activate-service-account --key-file=$$GOOGLE_APPLICATION_CREDENTIALS $$SHELL +## +## Global Terraform Infrastructure +## + +deploy_infra: ## Deploy Global OpenTofu/Terraform infrastructure + . source.sh && \ + cd tf && \ + tofu init && \ + tofu apply -auto-approve + +destroy_infra: ## Destroy Global OpenTofu/Terraform infrastructure + . source.sh && \ + cd tf && \ + tofu destroy -auto-approve + ## ## Terraform backend ## deploy_tf_backend: ## Deploy the OpenTofu/Terraform backend to GCP - set -o allexport && source ./.env && set +o allexport && \ - export GOOGLE_APPLICATION_CREDENTIALS=$(shell realpath ./secrets/gcp_credentials.json) && \ + . source.sh && \ + unset TF_WORKSPACE && \ cd tf_backend && \ tofu init && \ tofu apply -auto-approve \ - -var="bucket_name=$$TF_BACKEND_BUCKET_NAME" \ - -var="project=$$TF_PROJECT_NAME" + -var="bucket_name=$$TF_BACKEND_BUCKET_NAME" destroy_tf_backend: ## Destroy the OpenTofu/Terraform backend on GCP - set -o allexport && source ./.env && set +o allexport && \ - export GOOGLE_APPLICATION_CREDENTIALS=$(shell realpath ./secrets/gcp_credentials.json) && \ + . source.sh && \ + unset TF_WORKSPACE && \ cd tf_backend && \ tofu destroy -auto-approve \ - -var="bucket_name=$$TF_BACKEND_BUCKET_NAME" \ - -var="project=$$TF_PROJECT_NAME" \ No newline at end of file + -var="bucket_name=$$TF_BACKEND_BUCKET_NAME" \ No newline at end of file diff --git a/backend/Dockerfile b/backend/Dockerfile index 9b47166be6..5f5554280f 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,4 +1,6 @@ FROM node:22-alpine +ARG PORT +ENV PORT=$PORT COPY --link package.json yarn.lock ./ @@ -6,7 +8,6 @@ RUN yarn COPY --link . . -# The port should be specified in an .env file. -EXPOSE 3333 +EXPOSE ${PORT} CMD ["yarn", "run", "start"] \ No newline at end of file diff --git a/backend/Makefile b/backend/Makefile new file mode 100644 index 0000000000..24ec1a647a --- /dev/null +++ b/backend/Makefile @@ -0,0 +1,22 @@ +deploy: infra_deploy code_deploy +destroy: infra_destroy + +code_build: + . ./source.sh && \ + docker build -t $$DOCKER_IMAGE_NAME . + +code_deploy: code_build infra_deploy + . ./source.sh && \ + docker push $$DOCKER_IMAGE_NAME && \ + gcloud run deploy $$CLOUD_RUN_SERVICE_NAME --project $$GCLOUD_PROJECT --image $$DOCKER_IMAGE_NAME --port $$EXPOSED_PORT --region $$GCLOUD_REGION --allow-unauthenticated + +infra_deploy: + . ./source.sh && \ + cd tf && \ + tofu init && \ + tofu apply -auto-approve + +infra_destroy: + . ./source.sh && \ + cd tf && \ + tofu destroy -auto-approve \ No newline at end of file diff --git a/backend/index.ts b/backend/index.ts index 1b1d4c9d01..dcd73d6a3a 100644 --- a/backend/index.ts +++ b/backend/index.ts @@ -1,5 +1,6 @@ import express from 'express'; +const PORT = process.env.PORT ?? 8080; const app = express(); @@ -7,6 +8,6 @@ app.get('/hello', (req, res) => { res.send('Hello World!'); }); -app.listen(3333, () => { +app.listen(PORT, () => { console.log('Server is running on localhost:3333'); }) diff --git a/backend/package-lock.json b/backend/package-lock.json new file mode 100644 index 0000000000..c2bd52c3d0 --- /dev/null +++ b/backend/package-lock.json @@ -0,0 +1,1062 @@ +{ + "name": "backend", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "backend", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@types/express": "^4.17.21", + "express": "^4.21.0", + "ts-node": "^10.9.2", + "typescript": "^5.6.2" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "license": "MIT" + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.5.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", + "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/qs": { + "version": "6.9.16", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", + "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "license": "MIT" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", + "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.10", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "license": "ISC" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/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==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", + "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + } + } +} diff --git a/backend/source.sh b/backend/source.sh new file mode 100644 index 0000000000..ad46a7648f --- /dev/null +++ b/backend/source.sh @@ -0,0 +1,18 @@ +#!/bin/bash +# Get global environment variables for project +source ../source.sh + +set -o allexport + +source ./.env + +GCLOUD_REPOSITORY_URL=$(cd ../tf && tofu output -raw repository_url) +TF_VAR_service_name=${SERVICE_NAME} +DOCKER_IMAGE_NAME=${GCLOUD_REPOSITORY_URL}/${SERVICE_NAME}:$(git rev-parse HEAD) + +CLOUD_RUN_SERVICE_NAME=${GCLOUD_PROJECT}-${SERVICE_NAME}-${ENV} +TF_VAR_cloud_run_service_name=${CLOUD_RUN_SERVICE_NAME} + +EXPOSED_PORT=8080 + +set +o allexport diff --git a/backend/tf/.terraform.lock.hcl b/backend/tf/.terraform.lock.hcl new file mode 100644 index 0000000000..18d634b18d --- /dev/null +++ b/backend/tf/.terraform.lock.hcl @@ -0,0 +1,20 @@ +# This file is maintained automatically by "tofu init". +# Manual edits may be lost in future updates. + +provider "registry.opentofu.org/hashicorp/google" { + version = "6.3.0" + constraints = "6.3.0" + hashes = [ + "h1:2Yamc2+FSclN0at2L04+vAaL90JDNUH0e3aj2+gyTmA=", + "zh:1ce4d9270a11a99a842f4516e4a24e85b7bd14147c736bbd0ac9711feb880148", + "zh:2643cf1dacf4464688ca5d6f7c530ea941224a878cf19717b231bf0b5edc97b9", + "zh:559e23c32ab605189f2752fd261b120aa0a0604f12c063d856f1399048b856db", + "zh:5e422235813c6c34a12cede5ee535c377bee0d9de731ea7ab4abb2fc2d8e30af", + "zh:66d0b21cf6af354b0d0ee7b6aee7ad5ca1f3160a91b4ba0d21fd78db8eeca74f", + "zh:7c73c86100e26c6eb43026eec9cfa83b95a6872a0142bd221c1d4a65741180f4", + "zh:bc36f1ecd2dac775f5216097a1028fbcc63604234f446ce6220463f4b4a1fac8", + "zh:cdbd0883eaaad0e8caf79252acc3997fcebba9767db67a6b873008fb8e4945f9", + "zh:f0760ed8f0f622f88c40686cca0f4a7862cb41d67b2c1ddcf16b01418a4c8abc", + "zh:fae891937838784869a0cbfdf0c1d2bad08fba63c1e2a9fd43c269b2940925b6", + ] +} diff --git a/backend/tf/cloud_run.tf b/backend/tf/cloud_run.tf new file mode 100644 index 0000000000..9d9fc35aa3 --- /dev/null +++ b/backend/tf/cloud_run.tf @@ -0,0 +1,31 @@ +variable "cloud_run_service_name" { + description = "The name of the Cloud Run service" + type = string +} + +resource "google_cloud_run_v2_service" "service" { + name = var.cloud_run_service_name + location = var.region + deletion_protection = false + + template { + containers { + image = "nginx:alpine" + ports { + container_port = 80 + } + } + } +} + +resource "google_cloud_run_v2_service_iam_member" "noauth" { + location = google_cloud_run_v2_service.service.location + name = google_cloud_run_v2_service.service.name + role = "roles/run.invoker" + member = "allUsers" +} + + +output "service_url" { + value = google_cloud_run_v2_service.service.uri +} \ No newline at end of file diff --git a/backend/tf/provider.tf b/backend/tf/provider.tf new file mode 100644 index 0000000000..9fb2693d6d --- /dev/null +++ b/backend/tf/provider.tf @@ -0,0 +1,45 @@ +variable "backend_gcs_bucket" { + type = string + description = "The name of the bucket for storing Terraform state" +} + +variable "service_name" { + type = string + description = "Name of the service. This name should be unique within the project." +} + +variable "project" { + type = string + description = "Name of the project. This value should be shared within the entire repository." +} + +variable "region" { + type = string +} + +terraform { + required_providers { + google = { + source = "hashicorp/google" + version = "6.3.0" + } + } + + backend "gcs" { + bucket = var.backend_gcs_bucket + prefix = "terraform/state/${var.service_name}" + } +} + +provider "google" { + # Configuration options + project = var.project + + region = var.region + + default_labels = { + "managed-by" = "opentofu" + "project" = var.project + # "environment" = "production" # TODO: This depends on the environment/branch. + } +} \ No newline at end of file diff --git a/backend/yarn.lock b/backend/yarn.lock index b1515d4c6d..b38637647e 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -4,24 +4,24 @@ "@cspotcode/source-map-support@^0.8.0": version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== dependencies: "@jridgewell/trace-mapping" "0.3.9" "@jridgewell/resolve-uri@^3.0.3": version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/sourcemap-codec@^1.4.10": version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== "@jridgewell/trace-mapping@0.3.9": version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" @@ -29,27 +29,27 @@ "@tsconfig/node10@^1.0.7": version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz" integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== "@tsconfig/node12@^1.0.7": version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== "@tsconfig/node14@^1.0.0": version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== "@tsconfig/node16@^1.0.2": version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== "@types/body-parser@*": version "1.19.5" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz" integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== dependencies: "@types/connect" "*" @@ -57,14 +57,14 @@ "@types/connect@*": version "3.4.38" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz" integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== dependencies: "@types/node" "*" "@types/express-serve-static-core@^4.17.33": version "4.19.5" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz#218064e321126fcf9048d1ca25dd2465da55d9c6" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz" integrity sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg== dependencies: "@types/node" "*" @@ -74,7 +74,7 @@ "@types/express@^4.17.21": version "4.17.21" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz" integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== dependencies: "@types/body-parser" "*" @@ -84,34 +84,34 @@ "@types/http-errors@*": version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz" integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== "@types/mime@^1": version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz" integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== "@types/node@*": version "22.5.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.5.tgz#52f939dd0f65fc552a4ad0b392f3c466cc5d7a44" + resolved "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz" integrity sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA== dependencies: undici-types "~6.19.2" "@types/qs@*": version "6.9.16" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.16.tgz#52bba125a07c0482d26747d5d4947a64daf8f794" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz" integrity sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A== "@types/range-parser@*": version "1.2.7" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz" integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== "@types/send@*": version "0.17.4" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + resolved "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz" integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== dependencies: "@types/mime" "^1" @@ -119,7 +119,7 @@ "@types/serve-static@*": version "1.15.7" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz" integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== dependencies: "@types/http-errors" "*" @@ -128,7 +128,7 @@ accepts@~1.3.8: version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== dependencies: mime-types "~2.1.34" @@ -136,29 +136,29 @@ accepts@~1.3.8: acorn-walk@^8.1.1: version "8.3.4" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz" integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== dependencies: acorn "^8.11.0" acorn@^8.11.0, acorn@^8.4.1: version "8.12.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== arg@^4.1.0: version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== array-flatten@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== body-parser@1.20.3: version "1.20.3" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz" integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== dependencies: bytes "3.1.2" @@ -176,12 +176,12 @@ body-parser@1.20.3: bytes@3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== call-bind@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz" integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== dependencies: es-define-property "^1.0.0" @@ -192,41 +192,41 @@ call-bind@^1.0.7: content-disposition@0.5.4: version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: safe-buffer "5.2.1" content-type@~1.0.4, content-type@~1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== cookie-signature@1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== cookie@0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz" integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== create-require@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== debug@2.6.9: version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" define-data-property@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: es-define-property "^1.0.0" @@ -235,59 +235,59 @@ define-data-property@^1.1.4: depd@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== destroy@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== diff@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== ee-first@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== encodeurl@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== encodeurl@~2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== es-define-property@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz" integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== dependencies: get-intrinsic "^1.2.4" es-errors@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== escape-html@~1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== etag@~1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== express@^4.21.0: version "4.21.0" - resolved "https://registry.yarnpkg.com/express/-/express-4.21.0.tgz#d57cb706d49623d4ac27833f1cbc466b668eb915" + resolved "https://registry.npmjs.org/express/-/express-4.21.0.tgz" integrity sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng== dependencies: accepts "~1.3.8" @@ -324,7 +324,7 @@ express@^4.21.0: finalhandler@1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz" integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== dependencies: debug "2.6.9" @@ -337,22 +337,22 @@ finalhandler@1.3.1: forwarded@0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fresh@0.5.2: version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== dependencies: es-errors "^1.3.0" @@ -363,38 +363,38 @@ get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: gopd@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: get-intrinsic "^1.1.3" has-property-descriptors@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: es-define-property "^1.0.0" has-proto@^1.0.1: version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz" integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== has-symbols@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== hasown@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" http-errors@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: depd "2.0.0" @@ -405,98 +405,98 @@ http-errors@2.0.0: iconv-lite@0.4.24: version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" inherits@2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== ipaddr.js@1.9.1: version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== make-error@^1.1.1: version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== media-typer@0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== merge-descriptors@1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz" integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== methods@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== mime-db@1.52.0: version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" mime@1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== ms@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== negotiator@0.6.3: version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== object-inspect@^1.13.1: version "1.13.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz" integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== on-finished@2.4.1: version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" parseurl@~1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== path-to-regexp@0.1.10: version "0.1.10" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz" integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== proxy-addr@~2.0.7: version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: forwarded "0.2.0" @@ -504,19 +504,19 @@ proxy-addr@~2.0.7: qs@6.13.0: version "6.13.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + resolved "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz" integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== dependencies: side-channel "^1.0.6" range-parser@~1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== raw-body@2.5.2: version "2.5.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz" integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== dependencies: bytes "3.1.2" @@ -526,17 +526,17 @@ raw-body@2.5.2: safe-buffer@5.2.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== "safer-buffer@>= 2.1.2 < 3": version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== send@0.19.0: version "0.19.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" + resolved "https://registry.npmjs.org/send/-/send-0.19.0.tgz" integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== dependencies: debug "2.6.9" @@ -555,7 +555,7 @@ send@0.19.0: serve-static@1.16.2: version "1.16.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz" integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== dependencies: encodeurl "~2.0.0" @@ -565,7 +565,7 @@ serve-static@1.16.2: set-function-length@^1.2.1: version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: define-data-property "^1.1.4" @@ -577,12 +577,12 @@ set-function-length@^1.2.1: setprototypeof@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== side-channel@^1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz" integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== dependencies: call-bind "^1.0.7" @@ -592,17 +592,17 @@ side-channel@^1.0.6: statuses@2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== toidentifier@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== ts-node@^10.9.2: version "10.9.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz" integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== dependencies: "@cspotcode/source-map-support" "^0.8.0" @@ -621,43 +621,43 @@ ts-node@^10.9.2: type-is@~1.6.18: version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" mime-types "~2.1.24" -typescript@^5.6.2: +typescript@^5.6.2, typescript@>=2.7: version "5.6.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.2.tgz#d1de67b6bef77c41823f822df8f0b3bcff60a5a0" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz" integrity sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw== undici-types@~6.19.2: version "6.19.8" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz" integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@~1.0.0, unpipe@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== utils-merge@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== v8-compile-cache-lib@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== vary@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== yn@3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== diff --git a/frontend/Makefile b/frontend/Makefile index 43b8727e03..7a7dd45649 100644 --- a/frontend/Makefile +++ b/frontend/Makefile @@ -5,19 +5,19 @@ code_build: yarn run build code_deploy: code_build - . scripts/env.sh && \ + . ./source.sh && \ bucket_url=$$(cd tf && tofu output -raw frontend_bucket_url) && \ gsutil -m rm $$bucket_url/'**' || true && \ gsutil -m cp -r dist/** $$bucket_url && \ cd tf && tofu output infra_deploy: tf/* - . scripts/env.sh && \ + . ./source.sh && \ cd tf && \ tofu init && \ tofu apply -auto-approve \ infra_destroy: - . scripts/env.sh && \ + . ./source.sh && \ cd tf && \ tofu destroy -auto-approve \ \ No newline at end of file diff --git a/frontend/scripts/env.sh b/frontend/scripts/env.sh deleted file mode 100644 index 17e10917f1..0000000000 --- a/frontend/scripts/env.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -set -o allexport - -# Get the environment variables from the .env file in the root directory -source $(git rev-parse --show-toplevel)/.env - -# Environment varaibles for terraform input variables -TF_VAR_backend_gcs_bucket=$TF_BACKEND_BUCKET_NAME -TF_VAR_service_name=frontend -TF_VAR_project=$TF_PROJECT_NAME - -set +o allexport diff --git a/frontend/source.sh b/frontend/source.sh new file mode 100644 index 0000000000..cf1a8a79d5 --- /dev/null +++ b/frontend/source.sh @@ -0,0 +1,6 @@ +#!/bin/bash +PWD="$(git rev-parse --show-toplevel)"/frontend +# Get global environment variables for project +source $PWD/../source.sh + +export TF_VAR_service_name=backend diff --git a/frontend/tf/.terraform.lock.hcl b/frontend/tf/.terraform.lock.hcl index 5994c2bb3e..18d634b18d 100644 --- a/frontend/tf/.terraform.lock.hcl +++ b/frontend/tf/.terraform.lock.hcl @@ -18,20 +18,3 @@ provider "registry.opentofu.org/hashicorp/google" { "zh:fae891937838784869a0cbfdf0c1d2bad08fba63c1e2a9fd43c269b2940925b6", ] } - -provider "registry.opentofu.org/hashicorp/google-beta" { - version = "6.3.0" - hashes = [ - "h1:oMxXasSZa60+BT4DZpea5nREQQeN43PsUlPgVPJkEo0=", - "zh:552e85dab1872ecf2a5f51c092e0c85dff0857324a75299a867d2f25cfbad80f", - "zh:5e5b313fb43a64495df0ddbfd3a3505cd67b5aaff030dd3ea56cb28fae98bb4e", - "zh:6eac7c4bf6d3d347bdced815835c152ae68e09161d261796bb42e6406514305b", - "zh:6f5a81f4422ed6aa087168ae539555abc488d3782e8abfa9bb50c3fe75b1e93d", - "zh:a913170f54b032ee62f147d641b9dcfa50606a6bb96b88168d9e4acfcf7bdef2", - "zh:abaa94951c335d876aa4b7bd964e6d182d8ab31c0968bd8af0ca806dc73d5dd6", - "zh:ac461588dc2fdf38ed15fc30624f526914e18414655ee8a629af30e847272475", - "zh:baac4cdd8c295e04e8594d792f6d42213d313f7cd6b2fc8cc97ec36377367ea5", - "zh:bda1bc41e0cb60b0b585fc801e397d051966545489428a590218e61194842d25", - "zh:d4fbc62e2123cbf8a0f0c32167d440be14de4d13fa36be39f16b97c8d46eb5f6", - ] -} diff --git a/frontend/tf/provider.tf b/frontend/tf/provider.tf index bf581466fc..f8b100679b 100644 --- a/frontend/tf/provider.tf +++ b/frontend/tf/provider.tf @@ -36,15 +36,4 @@ provider "google" { "project" = var.project # "environment" = "production" # TODO: This depends on the environment/branch. } -} - -provider "google-beta" { - # Configuration options - project = var.project - - default_labels = { - "managed-by" = "opentofu" - "project" = var.project - # "environment" = "production" # TODO: This depends on the environment/branch. - } } \ No newline at end of file diff --git a/source.sh b/source.sh new file mode 100755 index 0000000000..aa53258b07 --- /dev/null +++ b/source.sh @@ -0,0 +1,29 @@ +#!/bin/bash +PWD="$(git rev-parse --show-toplevel)" + +set -o allexport + +# Get the environment variables from the .env file in the root directory +source $PWD/.env + +GOOGLE_APPLICATION_CREDENTIALS=$(realpath $PWD/$GOOGLE_APPLICATION_CREDENTIALS) + +# Environment varaibles for terraform input variables +TF_VAR_backend_gcs_bucket=$TF_BACKEND_BUCKET_NAME +TF_VAR_project=$GCLOUD_PROJECT +TF_VAR_region=$GCLOUD_REGION +TF_VAR_zone=$GCLOUD_ZONE + +# Environmen.t +BRANCH=$(git rev-parse --abbrev-ref HEAD) +if [[ $BRANCH == "main" ]]; then + ENV="production" +elif [[ $BRANCH == "dev" ]]; then + ENV="staging" +else + ENV=$(echo $BRANCH | tr '[:upper:]' '[:lower:]' | tr "/" "-") +fi + +TF_WORKSPACE=$ENV + +set +o allexport \ No newline at end of file diff --git a/tf/.terraform.lock.hcl b/tf/.terraform.lock.hcl new file mode 100644 index 0000000000..18d634b18d --- /dev/null +++ b/tf/.terraform.lock.hcl @@ -0,0 +1,20 @@ +# This file is maintained automatically by "tofu init". +# Manual edits may be lost in future updates. + +provider "registry.opentofu.org/hashicorp/google" { + version = "6.3.0" + constraints = "6.3.0" + hashes = [ + "h1:2Yamc2+FSclN0at2L04+vAaL90JDNUH0e3aj2+gyTmA=", + "zh:1ce4d9270a11a99a842f4516e4a24e85b7bd14147c736bbd0ac9711feb880148", + "zh:2643cf1dacf4464688ca5d6f7c530ea941224a878cf19717b231bf0b5edc97b9", + "zh:559e23c32ab605189f2752fd261b120aa0a0604f12c063d856f1399048b856db", + "zh:5e422235813c6c34a12cede5ee535c377bee0d9de731ea7ab4abb2fc2d8e30af", + "zh:66d0b21cf6af354b0d0ee7b6aee7ad5ca1f3160a91b4ba0d21fd78db8eeca74f", + "zh:7c73c86100e26c6eb43026eec9cfa83b95a6872a0142bd221c1d4a65741180f4", + "zh:bc36f1ecd2dac775f5216097a1028fbcc63604234f446ce6220463f4b4a1fac8", + "zh:cdbd0883eaaad0e8caf79252acc3997fcebba9767db67a6b873008fb8e4945f9", + "zh:f0760ed8f0f622f88c40686cca0f4a7862cb41d67b2c1ddcf16b01418a4c8abc", + "zh:fae891937838784869a0cbfdf0c1d2bad08fba63c1e2a9fd43c269b2940925b6", + ] +} diff --git a/tf/provider.tf b/tf/provider.tf new file mode 100644 index 0000000000..81f3d9786b --- /dev/null +++ b/tf/provider.tf @@ -0,0 +1,33 @@ +terraform { + required_providers { + google = { + source = "hashicorp/google" + version = "6.3.0" + } + } +} + +variable "project" { + type = string +} + +variable "region" { + type = string +} + +variable "zone" { + type = string +} + +provider "google" { + # Configuration options + project = var.project + region = var.region + zone = var.zone + + default_labels = { + "managed-by" = "opentofu" + "project" = var.project + "environment" = "terraform" + } +} \ No newline at end of file diff --git a/tf/registry.tf b/tf/registry.tf new file mode 100644 index 0000000000..597e2bfc60 --- /dev/null +++ b/tf/registry.tf @@ -0,0 +1,14 @@ +resource "google_artifact_registry_repository" "repo" { + repository_id = terraform.workspace + description = "Docker Repository for project ${var.project}." + format = "DOCKER" + + docker_config { + immutable_tags = true + } + +} + +output "repository_url" { + value = "${google_artifact_registry_repository.repo.location}-docker.pkg.dev/${google_artifact_registry_repository.repo.project}/${google_artifact_registry_repository.repo.repository_id}" +} \ No newline at end of file diff --git a/tf_backend/terraform.tfvars b/tf_backend/terraform.tfvars deleted file mode 100644 index be4e7bbb24..0000000000 --- a/tf_backend/terraform.tfvars +++ /dev/null @@ -1,2 +0,0 @@ -region = "us-central1" -zone = "us-central1-c" \ No newline at end of file From 4fd12592892e1a7a701678b6240cb1fd4e22bb0c Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Fri, 20 Sep 2024 23:38:14 +0800 Subject: [PATCH 13/65] feat: Integrate frontend with backend --- backend/Makefile | 7 ++++- backend/index.ts | 2 ++ backend/package-lock.json | 48 ++++++++++++++++++++++++++++++++- backend/package.json | 6 ++++- backend/yarn.lock | 26 +++++++++++++++--- frontend/Makefile | 19 ++++++++++++- frontend/package.json | 1 + frontend/src/App.tsx | 17 +++++++++++- frontend/yarn.lock | 57 +++++++++++++++++++++++++++++++++++++++ 9 files changed, 175 insertions(+), 8 deletions(-) diff --git a/backend/Makefile b/backend/Makefile index 24ec1a647a..61a5e2183b 100644 --- a/backend/Makefile +++ b/backend/Makefile @@ -19,4 +19,9 @@ infra_deploy: infra_destroy: . ./source.sh && \ cd tf && \ - tofu destroy -auto-approve \ No newline at end of file + tofu destroy -auto-approve + +api_url: + @ . ./source.sh && \ + cd tf && \ + tofu output -raw service_url \ No newline at end of file diff --git a/backend/index.ts b/backend/index.ts index dcd73d6a3a..00f555fcb9 100644 --- a/backend/index.ts +++ b/backend/index.ts @@ -1,8 +1,10 @@ import express from 'express'; +import cors from 'cors'; const PORT = process.env.PORT ?? 8080; const app = express(); +app.use(cors()); app.get('/hello', (req, res) => { res.send('Hello World!'); diff --git a/backend/package-lock.json b/backend/package-lock.json index c2bd52c3d0..e5f39ddd2a 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -9,10 +9,14 @@ "version": "1.0.0", "license": "MIT", "dependencies": { - "@types/express": "^4.17.21", + "cors": "^2.8.5", "express": "^4.21.0", "ts-node": "^10.9.2", "typescript": "^5.6.2" + }, + "devDependencies": { + "@types/cors": "^2.8.17", + "@types/express": "^4.17.21" } }, "node_modules/@cspotcode/source-map-support": { @@ -80,6 +84,7 @@ "version": "1.19.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, "license": "MIT", "dependencies": { "@types/connect": "*", @@ -90,6 +95,17 @@ "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" @@ -99,6 +115,7 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, "license": "MIT", "dependencies": { "@types/body-parser": "*", @@ -111,6 +128,7 @@ "version": "4.19.5", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", + "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", @@ -123,12 +141,14 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true, "license": "MIT" }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, "license": "MIT" }, "node_modules/@types/node": { @@ -144,18 +164,21 @@ "version": "6.9.16", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==", + "dev": true, "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, "license": "MIT" }, "node_modules/@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, "license": "MIT", "dependencies": { "@types/mime": "^1", @@ -166,6 +189,7 @@ "version": "1.15.7", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, "license": "MIT", "dependencies": { "@types/http-errors": "*", @@ -310,6 +334,19 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "license": "MIT" }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -711,6 +748,15 @@ "node": ">= 0.6" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", diff --git a/backend/package.json b/backend/package.json index 01a896fc23..b80a37c31c 100644 --- a/backend/package.json +++ b/backend/package.json @@ -4,12 +4,16 @@ "main": "index.js", "license": "MIT", "dependencies": { - "@types/express": "^4.17.21", + "cors": "^2.8.5", "express": "^4.21.0", "ts-node": "^10.9.2", "typescript": "^5.6.2" }, "scripts": { "start": "ts-node index.ts" + }, + "devDependencies": { + "@types/express": "^4.17.21", + "@types/cors": "^2.8.17" } } diff --git a/backend/yarn.lock b/backend/yarn.lock index b38637647e..968a8889f4 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -62,6 +62,13 @@ dependencies: "@types/node" "*" +"@types/cors@^2.8.17": + version "2.8.17" + resolved "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz" + integrity sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA== + dependencies: + "@types/node" "*" + "@types/express-serve-static-core@^4.17.33": version "4.19.5" resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz" @@ -212,6 +219,14 @@ cookie@0.6.0: resolved "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz" integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== +cors@^2.8.5: + version "2.8.5" + resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + create-require@^1.1.0: version "1.1.1" resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" @@ -472,6 +487,11 @@ negotiator@0.6.3: resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +object-assign@^4: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + object-inspect@^1.13.1: version "1.13.2" resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz" @@ -627,7 +647,7 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -typescript@^5.6.2, typescript@>=2.7: +typescript@^5.6.2: version "5.6.2" resolved "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz" integrity sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw== @@ -637,7 +657,7 @@ undici-types@~6.19.2: resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz" integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== -unpipe@~1.0.0, unpipe@1.0.0: +unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -652,7 +672,7 @@ v8-compile-cache-lib@^3.0.1: resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== -vary@~1.1.2: +vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== diff --git a/frontend/Makefile b/frontend/Makefile index 7a7dd45649..666cf8c6e1 100644 --- a/frontend/Makefile +++ b/frontend/Makefile @@ -1,8 +1,25 @@ +SHELL=/bin/bash + deploy: infra_deploy code_deploy destroy: infra_destroy +BACKEND_SERVICE_URL=$(shell cd ../backend && $(MAKE) -s api_url | head -n 2) + +serve: + @if [[ "$(BACKEND_SERVICE_URL)" == *"No outputs found"* ]] ; then \ + echo "Backend service URL not found, please go to the backend service and deploy it first."; \ + exit 1; \ + fi + export VITE_BACKEND_SERVICE_URL=$(BACKEND_SERVICE_URL) && \ + yarn run dev + code_build: - yarn run build + @if [[ "$(BACKEND_SERVICE_URL)" == *"No outputs found"* ]] ; then \ + echo "Backend service URL not found, please go to the backend service and deploy it first."; \ + exit 1; \ + fi + export VITE_BACKEND_SERVICE_URL=$(BACKEND_SERVICE_URL) && \ + yarn run build code_deploy: code_build . ./source.sh && \ diff --git a/frontend/package.json b/frontend/package.json index 64e796c5a3..f51e2f4e42 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -10,6 +10,7 @@ "preview": "vite preview" }, "dependencies": { + "axios": "^1.7.7", "react": "^18.3.1", "react-dom": "^18.3.1" }, diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index afe48ac750..04fc7f0d9f 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1,11 +1,22 @@ -import { useState } from 'react' +import { useEffect, useState } from 'react' import reactLogo from './assets/react.svg' import viteLogo from '/vite.svg' import './App.css' +import axios from 'axios' + +axios.defaults.baseURL = import.meta.env.VITE_BACKEND_SERVICE_URL function App() { const [count, setCount] = useState(0) + const [res, setRes] = useState('Processing...') + + useEffect(() => { + axios.get('/hello').then((response) => { + setRes(response.data) + }) + }) + return ( <>
@@ -24,6 +35,10 @@ function App() {

Edit src/App.tsx and save to test HMR

+

+ Pinging the backend service at {axios.defaults.baseURL}:
+ {res} +

Click on the Vite and React logos to learn more diff --git a/frontend/yarn.lock b/frontend/yarn.lock index d60efc844b..001016af96 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -686,6 +686,20 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +axios@^1.7.7: + version "1.7.7" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f" + integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -774,6 +788,13 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -810,6 +831,11 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + electron-to-chromium@^1.5.4: version "1.5.25" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.25.tgz#492ade1cde401332b9b75aa0c55fd5e1550ca66c" @@ -1028,6 +1054,20 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== +follow-redirects@^1.15.6: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" @@ -1218,6 +1258,18 @@ micromatch@^4.0.4: braces "^3.0.3" picomatch "^2.3.1" +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -1319,6 +1371,11 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + punycode@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" From 4a19fe3bbb72ba3004811497bdb8aeed4a524e0b Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Sat, 21 Sep 2024 00:02:18 +0800 Subject: [PATCH 14/65] feat: Basic GitHub Actions --- .github/actions/setup_runner/action.yml | 36 +++++++++++++++++++++++++ .github/workflows/on_pr.yml | 30 +++++++++++++++++++++ .github/workflows/on_push.yml | 30 +++++++++++++++++++++ 3 files changed, 96 insertions(+) create mode 100644 .github/actions/setup_runner/action.yml create mode 100644 .github/workflows/on_pr.yml create mode 100644 .github/workflows/on_push.yml diff --git a/.github/actions/setup_runner/action.yml b/.github/actions/setup_runner/action.yml new file mode 100644 index 0000000000..c9a2773f6b --- /dev/null +++ b/.github/actions/setup_runner/action.yml @@ -0,0 +1,36 @@ +name: Setup Runner Dependencies +description: "Install dependencies for the runner" + +runs: + using: "composite" + steps: + - name: Sudo apt update and upgrade + shell: bash + run: | + sudo apt update + sudo apt upgrade -y + - name: Install SOPS + shell: bash + run: | + # https://github.com/getsops/sops/releases + curl -LO https://github.com/getsops/sops/releases/download/v3.9.0/sops-v3.9.0.linux.amd64 + mv sops-v3.9.0.linux.amd64 /usr/local/bin/sops + chmod +x /usr/local/bin/sops + - name: Install age + shell: bash + run: sudo apt install -y age + - name: Install OpenTofu + shell: bash + run: | + # https://opentofu.org/docs/intro/install/deb/ + curl --proto '=https' --tlsv1.2 -fsSL https://get.opentofu.org/install-opentofu.sh -o install-opentofu.sh + chmod +x install-opentofu.sh + ./install-opentofu.sh --install-method deb + rm -f install-opentofu.sh + - name: Install gcloud + shell: bash + run: | + curl -O https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-cli-linux-x86_64.tar.gz + tar -xf google-cloud-cli-linux-x86_64.tar.gz + yes | ./google-cloud-sdk/install.sh + ./google-cloud-sdk/bin/gcloud init diff --git a/.github/workflows/on_pr.yml b/.github/workflows/on_pr.yml new file mode 100644 index 0000000000..0cfa877157 --- /dev/null +++ b/.github/workflows/on_pr.yml @@ -0,0 +1,30 @@ +# This is a basic workflow to help you get started with Actions + +name: Checks on PRs + +# Controls when the workflow will run +on: + # Triggers the workflow on push or pull request events but only for the "main" branch + pull_request: + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + test: + # The type of runner that the job will run on + runs-on: ubuntu-latest + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v4 + + - name: Setup Runner Dependencies + uses: ./.github/actions/setup_runner + + # Runs a single command using the runners shell + - name: Run a one-line script + run: echo Hello, world! diff --git a/.github/workflows/on_push.yml b/.github/workflows/on_push.yml new file mode 100644 index 0000000000..7034cc1a81 --- /dev/null +++ b/.github/workflows/on_push.yml @@ -0,0 +1,30 @@ +# This is a basic workflow to help you get started with Actions + +name: Checks on PRs + +# Controls when the workflow will run +on: + # Triggers the workflow on push or pull request events but only for the "main" branch + push: + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + test: + # The type of runner that the job will run on + runs-on: ubuntu-latest + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v4 + + - name: Setup Runner Dependencies + uses: ./.github/actions/setup_runner + + # Runs a single command using the runners shell + - name: Run a one-line script + run: echo Hello, world! From 0e80b6050567a14aab2d358519b06655f1d6823b Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Sat, 21 Sep 2024 00:08:02 +0800 Subject: [PATCH 15/65] fix: Fix GCloud script --- .github/actions/setup_runner/action.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/actions/setup_runner/action.yml b/.github/actions/setup_runner/action.yml index c9a2773f6b..c405c0378c 100644 --- a/.github/actions/setup_runner/action.yml +++ b/.github/actions/setup_runner/action.yml @@ -32,5 +32,4 @@ runs: run: | curl -O https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-cli-linux-x86_64.tar.gz tar -xf google-cloud-cli-linux-x86_64.tar.gz - yes | ./google-cloud-sdk/install.sh - ./google-cloud-sdk/bin/gcloud init + ./google-cloud-sdk/install.sh -q From 7dddf9c58102d7557989fcdd97d04d32b9b873ca Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Sat, 21 Sep 2024 00:53:01 +0800 Subject: [PATCH 16/65] feat: Fix GH Actions on push --- .github/actions/setup_runner/action.yml | 3 + .github/workflows/on_push.yml | 34 +- .sops.yaml | 4 +- frontend/yarn.lock | 611 +++++++++--------------- scripts/secret.sh | 10 +- secrets/gcp_credentials.json.enc | 32 +- tf_backend/.gitignore | 3 +- tf_backend/bucket.tf | 4 +- 8 files changed, 276 insertions(+), 425 deletions(-) diff --git a/.github/actions/setup_runner/action.yml b/.github/actions/setup_runner/action.yml index c405c0378c..6dfed35a0f 100644 --- a/.github/actions/setup_runner/action.yml +++ b/.github/actions/setup_runner/action.yml @@ -19,6 +19,9 @@ runs: - name: Install age shell: bash run: sudo apt install -y age + - name: Setup age secret key + shell: bash + run: echo ${{ secrets.AGE_SECRET_KEY }} > ${XDG_CONFIG_HOME:-$HOME/.config}/sops/age/keys.txt - name: Install OpenTofu shell: bash run: | diff --git a/.github/workflows/on_push.yml b/.github/workflows/on_push.yml index 7034cc1a81..a734aa61e1 100644 --- a/.github/workflows/on_push.yml +++ b/.github/workflows/on_push.yml @@ -1,6 +1,6 @@ # This is a basic workflow to help you get started with Actions -name: Checks on PRs +name: Checks on Push # Controls when the workflow will run on: @@ -21,10 +21,34 @@ jobs: steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/checkout@v4 - + - name: Setup Runner Dependencies uses: ./.github/actions/setup_runner - # Runs a single command using the runners shell - - name: Run a one-line script - run: echo Hello, world! + # We don't use this, for now. + # - name: Find Changed Files + # uses: dorny/paths-filter@v3 + # id: changes + # with: + # filters: | + # global_infra: + # - 'tf/**' + # frontend: + # - 'frontend/**' + # backend: + # - 'backend/**' + + - name: Deploy Global Infrastructure + run: | + make deploy_infra + + - name: Deploy Backend + run: | + cd backend + make deploy + + - name: Deploy Frontend + run: | + cd frontend + make deploy + diff --git a/.sops.yaml b/.sops.yaml index 568795b97b..64e66addc4 100644 --- a/.sops.yaml +++ b/.sops.yaml @@ -1,7 +1,9 @@ ## KEYS: # Yongbeom: age1c0fqjnprp4pzk8kx5y23mlkreu5z34v3tkrrwrcmf56cmu3zaf0q30sqfv +# GH Actions Runner: age1g2yz8vzyyzmdsht3398da6nu3pgl54rkw5wuveqh5wfn23r2hy0qu6d4dw creation_rules: # Note: must be comma separated - age: >- - age1c0fqjnprp4pzk8kx5y23mlkreu5z34v3tkrrwrcmf56cmu3zaf0q30sqfv \ No newline at end of file + age1c0fqjnprp4pzk8kx5y23mlkreu5z34v3tkrrwrcmf56cmu3zaf0q30sqfv, + age1g2yz8vzyyzmdsht3398da6nu3pgl54rkw5wuveqh5wfn23r2hy0qu6d4dw \ No newline at end of file diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 001016af96..13bb91baff 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -4,7 +4,7 @@ "@ampproject/remapping@^2.2.0": version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: "@jridgewell/gen-mapping" "^0.3.5" @@ -12,7 +12,7 @@ "@babel/code-frame@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz" integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== dependencies: "@babel/highlight" "^7.24.7" @@ -20,12 +20,12 @@ "@babel/compat-data@^7.25.2": version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.4.tgz#7d2a80ce229890edcf4cc259d4d696cb4dae2fcb" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz" integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ== -"@babel/core@^7.24.5": +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.24.5": version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz" integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== dependencies: "@ampproject/remapping" "^2.2.0" @@ -46,7 +46,7 @@ "@babel/generator@^7.25.0", "@babel/generator@^7.25.6": version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz" integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw== dependencies: "@babel/types" "^7.25.6" @@ -56,7 +56,7 @@ "@babel/helper-compilation-targets@^7.25.2": version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz" integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== dependencies: "@babel/compat-data" "^7.25.2" @@ -67,7 +67,7 @@ "@babel/helper-module-imports@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz" integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== dependencies: "@babel/traverse" "^7.24.7" @@ -75,7 +75,7 @@ "@babel/helper-module-transforms@^7.25.2": version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz" integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ== dependencies: "@babel/helper-module-imports" "^7.24.7" @@ -85,12 +85,12 @@ "@babel/helper-plugin-utils@^7.24.7": version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz" integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== "@babel/helper-simple-access@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz" integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== dependencies: "@babel/traverse" "^7.24.7" @@ -98,22 +98,22 @@ "@babel/helper-string-parser@^7.24.8": version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz" integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== "@babel/helper-validator-identifier@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz" integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== "@babel/helper-validator-option@^7.24.8": version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz" integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== "@babel/helpers@^7.25.0": version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.6.tgz#57ee60141829ba2e102f30711ffe3afab357cc60" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz" integrity sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q== dependencies: "@babel/template" "^7.25.0" @@ -121,7 +121,7 @@ "@babel/highlight@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz" integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== dependencies: "@babel/helper-validator-identifier" "^7.24.7" @@ -131,28 +131,28 @@ "@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.25.0", "@babel/parser@^7.25.6": version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz" integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q== dependencies: "@babel/types" "^7.25.6" "@babel/plugin-transform-react-jsx-self@^7.24.5": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz#66bff0248ea0b549972e733516ffad577477bdab" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz" integrity sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-react-jsx-source@^7.24.1": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz#1198aab2548ad19582013815c938d3ebd8291ee3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz" integrity sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/template@^7.25.0": version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz" integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== dependencies: "@babel/code-frame" "^7.24.7" @@ -161,7 +161,7 @@ "@babel/traverse@^7.24.7", "@babel/traverse@^7.25.2": version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz" integrity sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ== dependencies: "@babel/code-frame" "^7.24.7" @@ -174,143 +174,33 @@ "@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.6": version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz" integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw== dependencies: "@babel/helper-string-parser" "^7.24.8" "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" -"@esbuild/aix-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" - integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== - -"@esbuild/android-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" - integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== - -"@esbuild/android-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" - integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== - -"@esbuild/android-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" - integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== - -"@esbuild/darwin-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" - integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== - -"@esbuild/darwin-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" - integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== - -"@esbuild/freebsd-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" - integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== - -"@esbuild/freebsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" - integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== - -"@esbuild/linux-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" - integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== - -"@esbuild/linux-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" - integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== - -"@esbuild/linux-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" - integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== - -"@esbuild/linux-loong64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" - integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== - -"@esbuild/linux-mips64el@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" - integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== - -"@esbuild/linux-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" - integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== - -"@esbuild/linux-riscv64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" - integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== - -"@esbuild/linux-s390x@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" - integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== - "@esbuild/linux-x64@0.21.5": version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" + resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz" integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== -"@esbuild/netbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" - integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== - -"@esbuild/openbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" - integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== - -"@esbuild/sunos-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" - integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== - -"@esbuild/win32-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" - integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== - -"@esbuild/win32-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" - integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== - -"@esbuild/win32-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" - integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== - "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.11.0": version "4.11.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.1.tgz#a547badfc719eb3e5f4b556325e542fbe9d7a18f" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz" integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q== "@eslint/config-array@^0.18.0": version "0.18.0" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.18.0.tgz#37d8fe656e0d5e3dbaea7758ea56540867fd074d" + resolved "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz" integrity sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw== dependencies: "@eslint/object-schema" "^2.1.4" @@ -319,7 +209,7 @@ "@eslint/eslintrc@^3.1.0": version "3.1.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.1.0.tgz#dbd3482bfd91efa663cbe7aa1f506839868207b6" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz" integrity sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ== dependencies: ajv "^6.12.4" @@ -332,36 +222,36 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@9.10.0", "@eslint/js@^9.9.0": +"@eslint/js@^9.9.0", "@eslint/js@9.10.0": version "9.10.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.10.0.tgz#eaa3cb0baec497970bb29e43a153d0d5650143c6" + resolved "https://registry.npmjs.org/@eslint/js/-/js-9.10.0.tgz" integrity sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g== "@eslint/object-schema@^2.1.4": version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.4.tgz#9e69f8bb4031e11df79e03db09f9dbbae1740843" + resolved "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz" integrity sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ== "@eslint/plugin-kit@^0.1.0": version "0.1.0" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.1.0.tgz#809b95a0227ee79c3195adfb562eb94352e77974" + resolved "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.1.0.tgz" integrity sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ== dependencies: levn "^0.4.1" "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== "@humanwhocodes/retry@^0.3.0": version "0.3.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.0.tgz#6d86b8cb322660f03d3f0aa94b99bdd8e172d570" + resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz" integrity sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew== "@jridgewell/gen-mapping@^0.3.5": version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz" integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: "@jridgewell/set-array" "^1.2.1" @@ -370,22 +260,22 @@ "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/set-array@^1.2.1": version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" @@ -393,108 +283,38 @@ "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@rollup/rollup-android-arm-eabi@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.0.tgz#e8c16c336f060b4cb592f62eb4f0e543d79d51fe" - integrity sha512-/IZQvg6ZR0tAkEi4tdXOraQoWeJy9gbQ/cx4I7k9dJaCk9qrXEcdouxRVz5kZXt5C2bQ9pILoAA+KB4C/d3pfw== - -"@rollup/rollup-android-arm64@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.0.tgz#7a44160a14017fa744912d7037c7d81d6f8a46e7" - integrity sha512-ETHi4bxrYnvOtXeM7d4V4kZWixib2jddFacJjsOjwbgYSRsyXYtZHC4ht134OsslPIcnkqT+TKV4eU8rNBKyyQ== - -"@rollup/rollup-darwin-arm64@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.0.tgz#6122dc37d4a09521d8abe18925956d3b46cfbac9" - integrity sha512-ZWgARzhSKE+gVUX7QWaECoRQsPwaD8ZR0Oxb3aUpzdErTvlEadfQpORPXkKSdKbFci9v8MJfkTtoEHnnW9Ulng== - -"@rollup/rollup-darwin-x64@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.0.tgz#453f345899cbf544aa0d6f5808d24d2e42f605b7" - integrity sha512-h0ZAtOfHyio8Az6cwIGS+nHUfRMWBDO5jXB8PQCARVF6Na/G6XS2SFxDl8Oem+S5ZsHQgtsI7RT4JQnI1qrlaw== - -"@rollup/rollup-linux-arm-gnueabihf@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.0.tgz#3a32fa4e80a62a6d733014838b1123fe76b060fe" - integrity sha512-9pxQJSPwFsVi0ttOmqLY4JJ9pg9t1gKhK0JDbV1yUEETSx55fdyCjt39eBQ54OQCzAF0nVGO6LfEH1KnCPvelA== - -"@rollup/rollup-linux-arm-musleabihf@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.0.tgz#55d3953c54419e93efe124882a3103c8a2f65641" - integrity sha512-YJ5Ku5BmNJZb58A4qSEo3JlIG4d3G2lWyBi13ABlXzO41SsdnUKi3HQHe83VpwBVG4jHFTW65jOQb8qyoR+qzg== - -"@rollup/rollup-linux-arm64-gnu@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.0.tgz#cd626963b9962baf8e09d792e67b87269a5bcfff" - integrity sha512-U4G4u7f+QCqHlVg1Nlx+qapZy+QoG+NV6ux+upo/T7arNGwKvKP2kmGM4W5QTbdewWFgudQxi3kDNST9GT1/mg== - -"@rollup/rollup-linux-arm64-musl@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.0.tgz#ad209270c9937a27346fce5b0670cbdfb1e6a0a6" - integrity sha512-aQpNlKmx3amwkA3a5J6nlXSahE1ijl0L9KuIjVOUhfOh7uw2S4piR3mtpxpRtbnK809SBtyPsM9q15CPTsY7HQ== - -"@rollup/rollup-linux-powerpc64le-gnu@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.0.tgz#fdd173929a5bba8b7e8b37314380213d9604088f" - integrity sha512-9fx6Zj/7vve/Fp4iexUFRKb5+RjLCff6YTRQl4CoDhdMfDoobWmhAxQWV3NfShMzQk1Q/iCnageFyGfqnsmeqQ== - -"@rollup/rollup-linux-riscv64-gnu@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.0.tgz#90b11314fbf45d04083f658e08dc3b32fd713061" - integrity sha512-VWQiCcN7zBgZYLjndIEh5tamtnKg5TGxyZPWcN9zBtXBwfcGSZ5cHSdQZfQH/GB4uRxk0D3VYbOEe/chJhPGLQ== - -"@rollup/rollup-linux-s390x-gnu@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.0.tgz#46bb2f1135aeec646b720d6032d7c86915f8b2ec" - integrity sha512-EHmPnPWvyYqncObwqrosb/CpH3GOjE76vWVs0g4hWsDRUVhg61hBmlVg5TPXqF+g+PvIbqkC7i3h8wbn4Gp2Fg== - "@rollup/rollup-linux-x64-gnu@4.22.0": version "4.22.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.0.tgz#d731a19af5f05eabcba871bda2eeb2fa8c8adb67" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.0.tgz" integrity sha512-tsSWy3YQzmpjDKnQ1Vcpy3p9Z+kMFbSIesCdMNgLizDWFhrLZIoN21JSq01g+MZMDFF+Y1+4zxgrlqPjid5ohg== "@rollup/rollup-linux-x64-musl@4.22.0": version "4.22.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.0.tgz#5438b2dc38fe467444cf769146098be083022d0f" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.0.tgz" integrity sha512-anr1Y11uPOQrpuU8XOikY5lH4Qu94oS6j0xrulHk3NkLDq19MlX8Ng/pVipjxBJ9a2l3+F39REZYyWQFkZ4/fw== -"@rollup/rollup-win32-arm64-msvc@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.0.tgz#6bd66c198f80c8e7050cfd901701cfb9555d768a" - integrity sha512-7LB+Bh+Ut7cfmO0m244/asvtIGQr5pG5Rvjz/l1Rnz1kDzM02pSX9jPaS0p+90H5I1x4d1FkCew+B7MOnoatNw== - -"@rollup/rollup-win32-ia32-msvc@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.0.tgz#58daea1f1e65143c44c8f3311f30ff8eefa62bae" - integrity sha512-+3qZ4rer7t/QsC5JwMpcvCVPRcJt1cJrYS/TMJZzXIJbxWFQEVhrIc26IhB+5Z9fT9umfVc+Es2mOZgl+7jdJQ== - -"@rollup/rollup-win32-x64-msvc@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.0.tgz#956948629f6b87de0bdf526b28d940221540bbb6" - integrity sha512-YdicNOSJONVx/vuPkgPTyRoAPx3GbknBZRCOUkK84FJ/YTfs/F0vl/YsMscrB6Y177d+yDRcj+JWMPMCgshwrA== - "@types/babel__core@^7.20.5": version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== dependencies: "@babel/parser" "^7.20.7" @@ -505,14 +325,14 @@ "@types/babel__generator@*": version "7.6.8" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz" integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": version "7.4.4" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz" integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== dependencies: "@babel/parser" "^7.1.0" @@ -520,31 +340,31 @@ "@types/babel__traverse@*": version "7.20.6" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz" integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== dependencies: "@babel/types" "^7.20.7" "@types/estree@1.0.5": version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== "@types/prop-types@*": version "15.7.13" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.13.tgz#2af91918ee12d9d32914feb13f5326658461b451" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz" integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA== "@types/react-dom@^18.3.0": version "18.3.0" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz" integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== dependencies: "@types/react" "*" "@types/react@*", "@types/react@^18.3.3": version "18.3.7" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.7.tgz#6decbfbb01f8d82d56ff5403394121940faa6569" + resolved "https://registry.npmjs.org/@types/react/-/react-18.3.7.tgz" integrity sha512-KUnDCJF5+AiZd8owLIeVHqmW9yM4sqmDVf2JRJiBMFkGvkoZ4/WyV2lL4zVsoinmRS/W3FeEdZLEWFRofnT2FQ== dependencies: "@types/prop-types" "*" @@ -552,7 +372,7 @@ "@typescript-eslint/eslint-plugin@8.6.0": version "8.6.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.6.0.tgz#20049754ff9f6d3a09bf240297f029ce04290999" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.6.0.tgz" integrity sha512-UOaz/wFowmoh2G6Mr9gw60B1mm0MzUtm6Ic8G2yM1Le6gyj5Loi/N+O5mocugRGY+8OeeKmkMmbxNqUCq3B4Sg== dependencies: "@eslint-community/regexpp" "^4.10.0" @@ -565,9 +385,9 @@ natural-compare "^1.4.0" ts-api-utils "^1.3.0" -"@typescript-eslint/parser@8.6.0": +"@typescript-eslint/parser@^8.0.0 || ^8.0.0-alpha.0", "@typescript-eslint/parser@8.6.0": version "8.6.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.6.0.tgz#02e092b9dc8b4e319172af620d0d39b337d948f6" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.6.0.tgz" integrity sha512-eQcbCuA2Vmw45iGfcyG4y6rS7BhWfz9MQuk409WD47qMM+bKCGQWXxvoOs1DUp+T7UBMTtRTVT+kXr7Sh4O9Ow== dependencies: "@typescript-eslint/scope-manager" "8.6.0" @@ -578,7 +398,7 @@ "@typescript-eslint/scope-manager@8.6.0": version "8.6.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.6.0.tgz#28cc2fc26a84b75addf45091a2c6283e29e2c982" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.6.0.tgz" integrity sha512-ZuoutoS5y9UOxKvpc/GkvF4cuEmpokda4wRg64JEia27wX+PysIE9q+lzDtlHHgblwUWwo5/Qn+/WyTUvDwBHw== dependencies: "@typescript-eslint/types" "8.6.0" @@ -586,7 +406,7 @@ "@typescript-eslint/type-utils@8.6.0": version "8.6.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.6.0.tgz#d4347e637478bef88cee1db691fcfa20ade9b8a0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.6.0.tgz" integrity sha512-dtePl4gsuenXVwC7dVNlb4mGDcKjDT/Ropsk4za/ouMBPplCLyznIaR+W65mvCvsyS97dymoBRrioEXI7k0XIg== dependencies: "@typescript-eslint/typescript-estree" "8.6.0" @@ -596,12 +416,12 @@ "@typescript-eslint/types@8.6.0": version "8.6.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.6.0.tgz#cdc3a16f83f2f0663d6723e9fd032331cdd9f51c" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.6.0.tgz" integrity sha512-rojqFZGd4MQxw33SrOy09qIDS8WEldM8JWtKQLAjf/X5mGSeEFh5ixQlxssMNyPslVIk9yzWqXCsV2eFhYrYUw== "@typescript-eslint/typescript-estree@8.6.0": version "8.6.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.6.0.tgz#f945506de42871f04868371cb5bf21e8f7266e01" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.6.0.tgz" integrity sha512-MOVAzsKJIPIlLK239l5s06YXjNqpKTVhBVDnqUumQJja5+Y94V3+4VUFRA0G60y2jNnTVwRCkhyGQpavfsbq/g== dependencies: "@typescript-eslint/types" "8.6.0" @@ -615,7 +435,7 @@ "@typescript-eslint/utils@8.6.0": version "8.6.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.6.0.tgz#175fe893f32804bed1e72b3364ea6bbe1044181c" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.6.0.tgz" integrity sha512-eNp9cWnYf36NaOVjkEUznf6fEgVy1TWpE0o52e4wtojjBx7D1UV2WAWGzR+8Y5lVFtpMLPwNbC67T83DWSph4A== dependencies: "@eslint-community/eslint-utils" "^4.4.0" @@ -625,7 +445,7 @@ "@typescript-eslint/visitor-keys@8.6.0": version "8.6.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.6.0.tgz#5432af4a1753f376f35ab5b891fc9db237aaf76f" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.6.0.tgz" integrity sha512-wapVFfZg9H0qOYh4grNVQiMklJGluQrOUiOhYRrQWhx7BY/+I1IYb8BczWNbbUpO+pqy0rDciv3lQH5E1bCLrg== dependencies: "@typescript-eslint/types" "8.6.0" @@ -633,7 +453,7 @@ "@vitejs/plugin-react@^4.3.1": version "4.3.1" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz#d0be6594051ded8957df555ff07a991fb618b48e" + resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz" integrity sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg== dependencies: "@babel/core" "^7.24.5" @@ -644,17 +464,17 @@ acorn-jsx@^5.3.2: version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.12.0: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.12.0: version "8.12.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== ajv@^6.12.4: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -664,36 +484,36 @@ ajv@^6.12.4: ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== axios@^1.7.7: version "1.7.7" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f" + resolved "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz" integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q== dependencies: follow-redirects "^1.15.6" @@ -702,12 +522,12 @@ axios@^1.7.7: balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -715,21 +535,21 @@ brace-expansion@^1.1.7: brace-expansion@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: balanced-match "^1.0.0" braces@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: fill-range "^7.1.1" -browserslist@^4.23.1: +browserslist@^4.23.1, "browserslist@>= 4.21.0": version "4.23.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz" integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== dependencies: caniuse-lite "^1.0.30001646" @@ -739,17 +559,17 @@ browserslist@^4.23.1: callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== caniuse-lite@^1.0.30001646: version "1.0.30001662" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001662.tgz#3574b22dfec54a3f3b6787331da1040fe8e763ec" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001662.tgz" integrity sha512-sgMUVwLmGseH8ZIrm1d51UbrhqMCH3jvS7gF/M6byuHOnKyLOBL7W8yz5V02OHwgLGA36o/AFhWzzh4uc5aqTA== chalk@^2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" @@ -758,7 +578,7 @@ chalk@^2.4.2: chalk@^4.0.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -766,48 +586,48 @@ chalk@^4.0.0: color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + combined-stream@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== convert-source-map@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== cross-spawn@^7.0.2: version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" @@ -816,34 +636,34 @@ cross-spawn@^7.0.2: csstype@^3.0.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz" integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== dependencies: ms "^2.1.3" deep-is@^0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== electron-to-chromium@^1.5.4: version "1.5.25" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.25.tgz#492ade1cde401332b9b75aa0c55fd5e1550ca66c" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.25.tgz" integrity sha512-kMb204zvK3PsSlgvvwzI3wBIcAw15tRkYk+NQdsjdDtcQWTp2RABbMQ9rUBy8KNEOM+/E6ep+XC3AykiWZld4g== esbuild@^0.21.3: version "0.21.5" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz" integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== optionalDependencies: "@esbuild/aix-ppc64" "0.21.5" @@ -872,32 +692,32 @@ esbuild@^0.21.3: escalade@^3.1.2: version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== eslint-plugin-react-hooks@^5.1.0-rc.0: version "5.1.0-rc-fb9a90fa48-20240614" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0-rc-fb9a90fa48-20240614.tgz#206a7ec005f0b286aaf7091f4e566083d310b189" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0-rc-fb9a90fa48-20240614.tgz" integrity sha512-xsiRwaDNF5wWNC4ZHLut+x/YcAxksUd9Rizt7LaEn3bV8VyYRpXnRJQlLOfYaVy9esk4DFP4zPPnoNVjq5Gc0w== eslint-plugin-react-refresh@^0.4.9: version "0.4.12" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.12.tgz#73d61c7fcbe3f7280edb6579380b4350d2f547ed" + resolved "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.12.tgz" integrity sha512-9neVjoGv20FwYtCP6CB1dzR1vr57ZDNOXst21wd2xJ/cTlM2xLq0GWVlSNTdMn/4BtP6cHYBMCSp1wFBJ9jBsg== eslint-scope@^8.0.2: version "8.0.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.0.2.tgz#5cbb33d4384c9136083a71190d548158fe128f94" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz" integrity sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA== dependencies: esrecurse "^4.3.0" @@ -905,17 +725,17 @@ eslint-scope@^8.0.2: eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.3: version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint-visitor-keys@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz#e3adc021aa038a2a8e0b2f8b0ce8f66b9483b1fb" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz" integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw== -eslint@^9.9.0: +"eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^8.57.0 || ^9.0.0", eslint@^9.9.0, eslint@>=7: version "9.10.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.10.0.tgz#0bd74d7fe4db77565d0e7f57c7df6d2b04756806" + resolved "https://registry.npmjs.org/eslint/-/eslint-9.10.0.tgz" integrity sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw== dependencies: "@eslint-community/eslint-utils" "^4.2.0" @@ -955,7 +775,7 @@ eslint@^9.9.0: espree@^10.0.1, espree@^10.1.0: version "10.1.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-10.1.0.tgz#8788dae611574c0f070691f522e4116c5a11fc56" + resolved "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz" integrity sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA== dependencies: acorn "^8.12.0" @@ -964,36 +784,36 @@ espree@^10.0.1, espree@^10.1.0: esquery@^1.5.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz" integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.3.2: version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -1004,38 +824,38 @@ fast-glob@^3.3.2: fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: version "1.17.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz" integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== dependencies: reusify "^1.0.4" file-entry-cache@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz" integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== dependencies: flat-cache "^4.0.0" fill-range@^7.1.1: version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" find-up@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -1043,7 +863,7 @@ find-up@^5.0.0: flat-cache@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz" integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== dependencies: flatted "^3.2.9" @@ -1051,85 +871,80 @@ flat-cache@^4.0.0: flatted@^3.2.9: version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz" integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== follow-redirects@^1.15.6: version "1.15.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz" integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== form-data@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" mime-types "^2.1.12" -fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== glob-parent@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-parent@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" globals@^11.1.0: version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^14.0.0: version "14.0.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + resolved "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz" integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== globals@^15.9.0: version "15.9.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-15.9.0.tgz#e9de01771091ffbc37db5714dab484f9f69ff399" + resolved "https://registry.npmjs.org/globals/-/globals-15.9.0.tgz" integrity sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA== graphemer@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== ignore@^5.2.0, ignore@^5.3.1: version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== import-fresh@^3.2.1: version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" @@ -1137,83 +952,83 @@ import-fresh@^3.2.1: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-path-inside@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" jsesc@^2.5.1: version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== json-buffer@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json5@^2.2.3: version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== keyv@^4.5.4: version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" levn@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" @@ -1221,38 +1036,38 @@ levn@^0.4.1: locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== loose-envify@^1.1.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" merge2@^1.3.0: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@^4.0.4: version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: braces "^3.0.3" @@ -1260,53 +1075,53 @@ micromatch@^4.0.4: mime-db@1.52.0: version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12: version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" minimatch@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimatch@^9.0.4: version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" ms@^2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== nanoid@^3.3.7: version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== node-releases@^2.0.18: version "2.0.18" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz" integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== optionator@^0.9.3: version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: deep-is "^0.1.3" @@ -1318,48 +1133,48 @@ optionator@^0.9.3: p-limit@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz" integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== postcss@^8.4.43: version "8.4.47" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.47.tgz#5bf6c9a010f3e724c503bf03ef7947dcb0fea365" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz" integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ== dependencies: nanoid "^3.3.7" @@ -1368,27 +1183,27 @@ postcss@^8.4.43: prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== proxy-from-env@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== punycode@^2.1.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== react-dom@^18.3.1: version "18.3.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz" integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== dependencies: loose-envify "^1.1.0" @@ -1396,29 +1211,29 @@ react-dom@^18.3.1: react-refresh@^0.14.2: version "0.14.2" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" + resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz" integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== react@^18.3.1: version "18.3.1" - resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz" integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== dependencies: loose-envify "^1.1.0" resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== reusify@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rollup@^4.20.0: version "4.22.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.22.0.tgz#23cd9e4565a458587683accc34a054660c01f351" + resolved "https://registry.npmjs.org/rollup/-/rollup-4.22.0.tgz" integrity sha512-W21MUIFPZ4+O2Je/EU+GP3iz7PH4pVPUXSbEZdatQnxo29+3rsUjgrJmzuAZU24z7yRAnFN6ukxeAhZh/c7hzg== dependencies: "@types/estree" "1.0.5" @@ -1443,117 +1258,117 @@ rollup@^4.20.0: run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" scheduler@^0.23.2: version "0.23.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz" integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== dependencies: loose-envify "^1.1.0" semver@^6.3.1: version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.6.0: version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== source-map-js@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" text-table@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== to-fast-properties@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" ts-api-utils@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz" integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" typescript-eslint@^8.0.1: version "8.6.0" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.6.0.tgz#5f0b5e23b34385ef146e447616c1a0d6bd14bedb" + resolved "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.6.0.tgz" integrity sha512-eEhhlxCEpCd4helh3AO1hk0UP2MvbRi9CtIAJTVPQjuSXOOO2jsEacNi4UdcJzZJbeuVg1gMhtZ8UYb+NFYPrA== dependencies: "@typescript-eslint/eslint-plugin" "8.6.0" "@typescript-eslint/parser" "8.6.0" "@typescript-eslint/utils" "8.6.0" -typescript@^5.5.3: +typescript@^5.5.3, typescript@>=4.2.0: version "5.6.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.2.tgz#d1de67b6bef77c41823f822df8f0b3bcff60a5a0" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz" integrity sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw== update-browserslist-db@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz" integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== dependencies: escalade "^3.1.2" @@ -1561,14 +1376,14 @@ update-browserslist-db@^1.1.0: uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" -vite@^5.4.1: +"vite@^4.2.0 || ^5.0.0", vite@^5.4.1: version "5.4.6" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.6.tgz#85a93a1228a7fb5a723ca1743e337a2588ed008f" + resolved "https://registry.npmjs.org/vite/-/vite-5.4.6.tgz" integrity sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q== dependencies: esbuild "^0.21.3" @@ -1579,22 +1394,22 @@ vite@^5.4.1: which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" word-wrap@^1.2.5: version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== yallist@^3.0.2: version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/scripts/secret.sh b/scripts/secret.sh index 88bee61071..824f13a31f 100755 --- a/scripts/secret.sh +++ b/scripts/secret.sh @@ -10,19 +10,21 @@ FILES=( encrypt() { for FILE in ${FILES[@]}; do - if [[ $FILE == *.enc ]]; then + if [[ $FILE == *".enc" ]]; then continue fi - sops -e $FILE > $FILE.enc + echo "Encrypting $FILE to $FILE.enc" + sops -e --input-type json --output-type json $FILE > $FILE.enc done } decrypt() { for FILE in ${FILES[@]}; do - if [[ $FILE != *.enc ]]; then + if [[ $FILE == *".enc" ]]; then continue fi - sops -d $FILE.enc > $FILE + echo "Decrypting $FILE.enc to $FILE" + sops -d --input-type json --output-type json $FILE.enc > $FILE done } diff --git a/secrets/gcp_credentials.json.enc b/secrets/gcp_credentials.json.enc index d1010a5788..2372780174 100644 --- a/secrets/gcp_credentials.json.enc +++ b/secrets/gcp_credentials.json.enc @@ -1,15 +1,15 @@ { - "type": "ENC[AES256_GCM,data:jd5pn1Nz2V5n5AMwMvbK,iv:5gdsSAbOzs6HOkIpIvLrBJeMYbnl5Nirnbh6NwotUj0=,tag:/mcx2NJ2GwKxmsp32+Hhaw==,type:str]", - "project_id": "ENC[AES256_GCM,data:HCHHeF5wvX5GHu1X8NekLSelVetp9RBrPTiz,iv:3yN3rwQRvGF5R8tnPQ0WDj/vq/ffsyCcIjEuZZW3Q/I=,tag:INfaSfmwoUf5ESg+0SAi+w==,type:str]", - "private_key_id": "ENC[AES256_GCM,data:dQ2190mzhg1pOGXOfbvq4jDHhSsmMe6vUwdDfU1LG5vTCHarWZ1JUQ==,iv:jkAoXG+f/aQmXUa7ZEsH6a0e9my0PO9/fWrO9B2atxU=,tag:RY6mR3+sZ0RJ0rQ+1VNS3Q==,type:str]", - "private_key": "ENC[AES256_GCM,data:X/WmRy7zPYvWZrc2r4zdAdupdHZsq1FFL2CqzAOH3wnijKw+w+v8Iqe1yKZnHiTCDd0lb7A4AlgDm33x+r1m7ruh5QEfMopCurVEmMtZIicFc1mMdapigxa5Co5lLh7f373eBAN++bE7GosEMLD/4j66OK90BrCL8jozaX8BOVhgVKfIBvSnDpTlhMZo5zl4McXtvcPCL0I6nUI41qbJBWdz5ckc+xEzv6PZK8Qi8OwJmp7EyX8R9yIYPjWh/3ceBMcD2OZvlGtrzfv3KkBMC9410rMG3UyRo4oGuc2C6TG7v8+h/k1hf7V/L7pTFkSVqAwfrguoaiknlFDexIkTw0VHTgn23aXF9Jq+mo6qKkRJhZKKFhwNPbZOnee0A67vJrttvjOcMrLEpTEJ22agTs5XLxEJ8z8hNK0phTP4PNKJEmoesQGTvOenuBlP1lraR2vil2mo997j4mGRRZFV61MK2hyj6fju9XOIOnzhF502tVIEYwcJWz/e+YNG9nXeWVLsYwYNGRuLpUejAiQ6CZWd0gVQt0gkY6R8nZeexSPXq1Nj4OE/7U8u897GcSj8c3OBG2ZyZ84kxpONimnn2Id6Qz+9SqCnjoSNcOVrh9IVmsZWXJMNdAFklp+30N4kt+U4D93Lwe0qe8j52p+fC4UcvASaWhtnS6jxnx5L9fyZqOxtIxDIkBsQyb+wc+miENlG8QKmfKl0j8rD5Ap1rnhBXrhSinneVNcDCclPeZcY3CcXUg1/xmwtSTvA1Qfa6c6mg16MRBcsHt+8aSePlUYOcLAqSuY8AvT6sc3A9t8UedOF9zNwsASmXliBKofUh1I9EAntIPVejw7Z+KT/9rDoDAIk1zw8wh/a6kjF9wzrtrk3xfaBiZ4ycBL1j6YFKMaQe8WlHe0abg7+/rRa65aym4Qwc7mhxsIjyTPDoOVw8rFJAF9V57EZHZTsfd6P4EoQcWGuqkG9Jet8urlZMV+w4HP5zB1AvLYdwKWAlC6XZC3W43oA/89fmMCbjthx9MlaGSjeduk00oVvpeom1hCj+I1yHn7quokfhq1J2713J0PqdJ2TiDNtGVNkOgegYjZUwSxkXKPANjO2elOov1L94JJduz+zU/9MUuy1//wZcvl9alm3g2XYJEJlGyefKBIka0gkWD1edbz9sIK2SHpGtHCPhIS+DcWhYnpW9vxlii21Spq6O8fHkNyt7xAY4+xwhbh9Vz9GV7bVKSTUxcpfMgrJDNYBg99edMqizI0IhKm16H/63vZbmVJyqm1bfcr7w4Am5d+n+re+dwaAgNRFR/PkGS1Xc7E4kf+3LSB2vy3Rd1cNAI3quM35A7vuny9CDwQhMKpx65EAG1cPB47LqSgPNP3kE2AzrIAEP21ILLIwBHprAGw2fpgyWz2PjYuaEKA2KMHty5uZk8I7LZVksPMf6UGrx6qGlndf9Af6EBcr5SmcGq6zs3uT8rqkrO5zyGe9/4EoDJaojyofAfWAISAcyoDTQC+luzuKx4ReQ0N3QPT6/rYK1T0zwg+jGRpR2DrW3ETxcacKdMC8DKiDRCoinV4hWQKelFvJLmjXH+vByR/uxDWBcMsSlxXpVC9hfidWLdoMYNgfUVqUl/gMYBz63d7GqSJ+0taO+GMUtEVkikZeMOyXVB6r7h7mDGG8iCNW4CcHcTgMyxS5hOfMqrCyaYqE0JOte31L4u4o8MXXmD+nCZnqke16V12wKhDelGfzp4HAG9S7C55ZIe4K5dEMB3f96vhJzszEZfIkdjaFVtWubG9dHxnfRuj1BEjInYyyrDbIfhOO5DLF14AaMv8xt+dyZMEq5JjVxkmI1XgME0qaneDjz37woUzvt0o/xDiVOkiCl0oCFQPiSU5CPyzwz1W5bdWFE5DinV3B+JoSMEwyJteCtVfDT0g5wRSVs3zObJzi6zEr9fEXW/WvsKoFgMyX1K/2OzlaAbvzMXaG8BPFIkWc2TDdriN7OrI6x7zSzakioJb02iQj2qd8cSJNt10qtkwXSiK58D1AFFWKqNMpykT0Zc+UapXgCRv7+z+sUuq3V9RjMNNjXupDgkYxorVdLqBE4leV5R70c+8z0eW7OXoLvldh7Ygec5ljUZ72XM7oPISHeHP7ZGx8kulQ7KFzNy4+w2fFSk8MCGgzGO0iMTwZtFtmcUNHxlHoWlUuSSTa0RdOB/Dwi13yTmxVFAbCo4Fhg1v2TBx3fhdjM2Ta1BBaWuNMbIROHk/hlyHecwS9hPeZzr5MpO4uOOfikmHX,iv:YkAAr9PEx1bwgxomLAK5W6/uUiObvMYPstN82YO3cUc=,tag:qaT3xyNv8Ykc6JD2Ithzug==,type:str]", - "client_email": "ENC[AES256_GCM,data:FIkpLPaWajyo97K79jwPV8UK/RqYdqe40zQ1f7YsmpprWAibvLPMzS6REpuEBbo6ujqwHkjndAIseR1tEl/Ca1ECCIA8X2SItyC/njA7eQ==,iv:y7UPxnrKX0SqCLGq4RS5sqfFqroNvHZPQzh+M1orHCY=,tag:AthiGBFKQ02af+YRUbq9/w==,type:str]", - "client_id": "ENC[AES256_GCM,data:b8uufx90f+qVq+aC7n3XxiVt7mtx,iv:DafYpVb3m12Hvbtic+2Apb0bK70ijzrL5vAkfciJUi4=,tag:4oslNENjvZsTydq0V/Pfww==,type:str]", - "auth_uri": "ENC[AES256_GCM,data:7X7JWxe7KgzUTMU0LQwnoRtR0WULasJLzVmqGHaBh5S6DGANj1qDH34=,iv:yN8/GkM7CHJz/aU4CWm3EG4AUoNQwK56NRIaA1jBPok=,tag:4p15aHoVFJnsM9nc/1PMaw==,type:str]", - "token_uri": "ENC[AES256_GCM,data:bu+lGo+y+rb97M6/9tTfsBZ6g6QAuvOMNpdXEzThracWyQU=,iv:R8blDIJUkeji5hsBtroDeeoiPkAz3uDcS5v5uXswf8Y=,tag:x+ziArJWpykVYg6+GggXGQ==,type:str]", - "auth_provider_x509_cert_url": "ENC[AES256_GCM,data:owqDSmVw0SXqcX5jUxTQD5OHbmpnS7KREF8iMHghwWpTfj+5B+CaAOUL,iv:et9fSt/XrdqGVFB3q+FMwudrALkZ6NMBwdj2/TEvNUM=,tag:FwqRK0DrN81HD4VUjj8x9A==,type:str]", - "client_x509_cert_url": "ENC[AES256_GCM,data:1g1cq1rwyS37b4aL7r6DtYFAdReqmGsfwg1U0B+A9o7Q4QE1JAbOWM6g0K+jQhcayl/0xlYPXp+1OWbrxjG3kQrKbv39iPU/GpKCKznknhCg+OP7f+Rrd5aNW/Pqa6Dj3PhITT2qySXecTCXTB6BrLJbWOIgsNrmso86oklBhoL2Mb4=,iv:mZAKzcOds/ejRKt7zY7AeRdsSgH1FEdzDiygADNOKNg=,tag:tUoOMTT2Q9o1otnjjN2iWQ==,type:str]", - "universe_domain": "ENC[AES256_GCM,data:hsW9D6Xb+rmrhcyw8Bc=,iv:X+XEbu3H3wfzV8Hc+B896UNOqM0//b//XODT+BZasZA=,tag:4lVdE4631L+C1yj+uPeQGQ==,type:str]", + "type": "ENC[AES256_GCM,data:9n0pwWSZdXralWIPDsFy,iv:1OHje/MnWxDXcSoqPv4ZjLhcXoVNDJ+RwzzQDSC4CPU=,tag:e/ieewg4ajF2BHVncuFuww==,type:str]", + "project_id": "ENC[AES256_GCM,data:VSE+Eep2B75iwGDsEBT9Ie2Ml7k3j2yuo1Qg,iv:Npby4+nmOyr7x75KfGxs4NaTGQgZmUG6ihPTiSsRNXE=,tag:C7x17VTIVug1p6t53yjP2A==,type:str]", + "private_key_id": "ENC[AES256_GCM,data:hvN8SsWi+0yD4diyJ1A6rZ+QDYKzYuyUlEzzbAxMg99lYDcjYzC41Q==,iv:+dbwGz1u94AWql8wsjMD3zf+1jSVBmAwNjT1JwylCX8=,tag:JfFVnAV4bfTqc7agX7BN9Q==,type:str]", + "private_key": "ENC[AES256_GCM,data:23i5iXpM1q2A6dTqGXs+5woNN6+Jcxrm7D/1BuowymTvtXCgcLpLmx7ug5C8dbhOFH4z1VBMASW/ApEyytlMjsyDe83wwghdBIxiHyMuGJALOeB9qPfvmOHfRP3xoyr8L4TkdhP29a0fUHzig9aZlAtTUBIr5ksAOksgJpe9Omy3XF9zbC2HyBUuDYR7yzq2KLt4XemdN/Hqz57+RdUV4PCYk2X/7//Frf2s1qD9mBqoycN5hfO55GYmKpSCamzz/VnnNKEqRlIkm6Mc+khU846kJWv/2xolsuL8eS5sgPbTCONSnVMe45fl8XKkdH8fkztyu8yuRy712Iq6CMIp7WqHqN32kiTq5JYbw5X2Hiy14bCFTbj00nyQxUE8AvQ2yr+q9pD/LwZ1HnF2Uyemdxud8ePnjUARFHJosXgXT/ImmIT+xG2jAml9EHBs887akf+EUV5JAMDeY60/aXGVt8RkceJ1ppQBH2aq1pwRZifCALYLLRqbRwYfY5N/7q16T39n0pCRjsW7OZhK+x4PrTnpFCSYUV1qRqZ0oPFb/FXAoEwI8AVeZt7/452hJ3oK4vVEGr3xsjUjPzwZBPoerW5yQKACruw4ZDSoBLyuFa/L/RbV9NOD88MyJpFuXwjzpxmm8OeDCImE2qcVGmW9BVt828ijdNYotrMdTWMLupaNOvzRnh/ULWER/rLVuSZdLJdlA9mWCwapB/hJR/yI5FKh4OtMxnLZBEHuaKKL/zFh1UXjAbGRZO3Tvp2rQeqayYoM9+y2rtDvelXELk44J2ci3hW1XrtBR/h9Q8FmHv7P+FQXOFhcwrdAFvLcDwcrIgdqQpoMHkDv/NxNcFcoETkFVyQQ1AcsAE66BQWwztOga4pHqgyiUcSapkNhNz0yCkR6ZDMZdLy7ZTC/yLbiAQTI9mycVNsJvmwfz/sN0T3tXXfec86Nf+LQW3cSXWheE1q9X7D4GETyBG7VofeHfT7UwRCK0ykWv9JpVYTJjgoj0HpgxVzMs5B1JCRi2lRo6yuHu5owFQVyXL3wvNK+iE1zvBD2oHTC/lky26C8eUR4iwoahHy6xDy7xYotWU0FAVsvvXdaGwGqjG8B6YBqSROCPI9QHnWrNfHRX6RPlFxJx3gYy8GP1zEqTfVZp17Xmhgy4cfMjt/5IcYJg1uPlKZ1DILrzA57bDUR/G5GGvgWeh0kWAjR3n8SSSk5FaSN0vyWBf+J9aExcxxnQlMgjoDZK31jXgUdC5WlbOrmffj/r3JF6oNUdI5MiXICn+OUZqnSmpTTFGhaNyDcQxrEeqUXhLY9ccBIOLRfwKeTLARDEduGG8IAVNE0CbMjJG0ugbDFdCC7VNpDWi+LcfWDVRJQ/81tXf85H/bpKAzLvJp/kOcsLCf4mPrGfnZqWIslsettkixtFjJDNxls0Ck95lEVb6LgS1UGmg9O7jyLxK939vK0PgGjUQUop24O0R+a9b+/J8ClBPUxGpTTLAdmoGnfaJLyGY22/c/CPgxvJhkwL6RWFXsLVHAzCa6YxHsc9dEPYt0fcEckVjyTyq8+R3YhlGRkDxazj6dAk9PxQnBy6TCtPbQDIAbaCiognQbIbt0/V73S1aNkMgRGM81mj+0YvIB3CvkZ7Js9GfYu3prlcNeEzMfwI+cUa2AV2vRklI5q1LR6DvkxG2CGDG64jv0aHy0E6eEFTwmckB3Hngx9IN7ZCq44Kc5P4NNrhPLh444tcjf/YegJPACW/JYFfryiowsKx5dHOWKFa2BuuOS0mPz/m2cwITTq60FEXIU1SDC2dJ1Zm6/sYYIgSa63uMYMOa0vx+0vNGR+wimUDdWUH6j8YERV2/OBXqRwRqAnG6pJNcZ6jPdmW3ENzh0Gyiv85PeFtFi2cwyO0+KdLUae7sufcq9j9BppcsUCtclA5PwHr0d1YKyID0OuTK2d3e27VU8vAg5zpBBzd6vl0fFHBW8nkVjKIvQRtJ0lcsW6b9SctXwRF5bKuCxQcufK/0YqmjjnP9iQF66Sxd8HjC3GzV20TnEZTPzOHt0OnMImDGyceD4PP7nMga9z6ZGn+hqnRmHAfiuGsZ+nJOjBUSebZK8l6rw2yYHaYvHrYydULdci4WwW2oWc+3SVhIGcbm6KDc10Gx5Sx78TaTdn+Qh63eXw8d8tqaW2XL/M/3KS1y1yY4O3Vzt8Tk87sIW9m4ID+anqRFbQRQUJmi+NKW/b5nfLRaFB+Uu3UUi24LeUuhwWRzkYygkv8q9f08LzI9x/P5URoMBd,iv:G8p3ktf8hXXaoCklv96zOnQ0IfkkHO3sT5XPsXukFe8=,tag:+LmaWBKjX1p5eG0tOSRihg==,type:str]", + "client_email": "ENC[AES256_GCM,data:qXZ2rQsHXASpbyuue70q6U7ypYIjVjKDpwNwmGeE6MR3auVFr8fIskdagFD7vDIWr3y4u1W1m0FSBbo91I4YinrsbwDZmOjE8yvZ28bexA==,iv:v+U4nrPMnw+e1IbgJXXn7NmPDjyZcWYgGrZVh0QOkLs=,tag:v5Cmj3VljFVhPJMcjkFHiw==,type:str]", + "client_id": "ENC[AES256_GCM,data:00dgpzEeU2nO4DyyAsC0qBoGBf2w,iv:5A8zFHcysM7RcsmjmZ/zooezHK4UOFSakcVfFq3T6PU=,tag:fUDjpsTi33uCkbxZAJTOIQ==,type:str]", + "auth_uri": "ENC[AES256_GCM,data:2eMU4vR9mr45dhsamtXFoFTdj3kl008pUNTqTtE88iu3KxMfOyTtsfs=,iv:Zk2a5FzLjXDFKnSUC0MQXCQz45Eztsxr7aBgQD10hcc=,tag:b5Ok77/rUKrSB5Ip1xjmfw==,type:str]", + "token_uri": "ENC[AES256_GCM,data:0lekHrpHHaT6xuqgBAYC9goVj9W/7ByiMae+hAU92a8qvsg=,iv:HsSTnXCw3KDizpXp7GubzNmdc2m5Nxx2gubaWPe2LUk=,tag:HSx0QeJ0PctlgUL1a9Avgw==,type:str]", + "auth_provider_x509_cert_url": "ENC[AES256_GCM,data:fq/+3t4YMQQT4eizd2rcZKrI4ZU+5ow41Ww0wIA3weAEilcmHVOvvhb/,iv:xW+TcWwMm6zqxXIAhmqw5wW7kp9r1CZNcEKlal9VCgM=,tag:gWs4vTPqmSg52SKWf8ttlQ==,type:str]", + "client_x509_cert_url": "ENC[AES256_GCM,data:9p275N8Nkv7QZ2NHd6zfB05NqKkvpl0WQewN12+17SecBD5uTwx0yGmp4WFK6/r0z3NdccZUMLjavnyJ1SSNMKn5WTRkOLqpVyvLQFVvBwx9n7cjpeQTDzJ+RuuDhGe/rFGNJIPmjoK5g7Np7WQhdHlbvbNibm7lrIHqM9UXkoisxMQ=,iv:W41R1OYph/wB7tDsHB2880NdMWCAA25P1bR1txlT2Bk=,tag:7SmrMdF/qdmeQD/NUS15Gw==,type:str]", + "universe_domain": "ENC[AES256_GCM,data:hX2/9LS7c1Z3qGIK/E4=,iv:JqhcirHnsDMaTnynSxDiStSMF+YWWelY4OjKZX6P9QE=,tag:wnVENt8Ckc77WX7porBKvw==,type:str]", "sops": { "kms": null, "gcp_kms": null, @@ -18,11 +18,15 @@ "age": [ { "recipient": "age1c0fqjnprp4pzk8kx5y23mlkreu5z34v3tkrrwrcmf56cmu3zaf0q30sqfv", - "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBzbjBjV2FtNytydlBML3BF\nWkdYaTAwREpFRzRqTEpjOHVIRHM1ZU1WYXpjCmFZSlVVWWdVZ29FTzFEVGUvUkcz\nQUs5Nm5GMEczaVdsMmdTaE44ZVVETXcKLS0tIEJ1QXhmVHZ5R1ExTURiNzJ4VUV5\nMHhxZllJUHZCMFY5OC9UOVhrNWE4ZDQKhKzmvlCl53rlzM2p/GFMU0M978PT+Xs0\nnca797cAnq/KWQnczZiC22hOfnrukqJcUieOT+iRQOoBoeE+Hi2DAA==\n-----END AGE ENCRYPTED FILE-----\n" + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBYVzJVam5mK3l1YkRoTUpM\nK01VOTZHNkpRVDZqcEVvUy9TNkxSaXQyK0cwCmZUTzVoaFFRZGx2RzZNY1VsL2ww\nWWdLRVFuS2J1QmF3TnJzd2Q1d1BBWEEKLS0tIFhoekgwTTBOUkhqdC9JbVlTV1dJ\nTHZLSUpwRFdpUlg3RHprQnB0NVNsTGcKFsIseomUL3q9Z/O8RsFfgVk6gv40qIhi\n/8RO9vdKD9zS8zHwiE8lCNh38BD8PoVLyDc0n3KfWKWmPz02qVCAiw==\n-----END AGE ENCRYPTED FILE-----\n" + }, + { + "recipient": "age1g2yz8vzyyzmdsht3398da6nu3pgl54rkw5wuveqh5wfn23r2hy0qu6d4dw", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBVRnJINUhQWlBtZkVXdDhv\nVS9tUmQyUWw3RVNHREs0MUZ1eGIxOTFvRlhNCk4xWTZzc3BZMzFtVCtPMGVsVERa\nYWZxWURiUHZmN0lmbFpUUDZtb3lrK00KLS0tIGlPMDh3WXg4NERzVTZnVlBEMzk1\nMTVPR1NtME9Lc2RyVVJqbnhoRlU2TEEK9vaijmtSF2teczSokppTo+YEo5mvXdte\ns64IAoMFFxbTjM39YS50VQhANDlRumZeEgaBPnlAxEcYiIDE/ufHmw==\n-----END AGE ENCRYPTED FILE-----\n" } ], - "lastmodified": "2024-09-19T16:48:01Z", - "mac": "ENC[AES256_GCM,data:8bA7EI/4GZooIE/VbaVRiEooVMYS+f/av2dNhqKhBVJtYnhl4uRYRuXplMVqmTXCz2Pnufu8RtwhkwVvYIDA7YsnymydklNCw8t4e7oVB0DFWOsqhS6b3B/NIfLuL5D6Hh92Icx1qVHKerfR6YJBhLH0TzwAspiHL0YXgnGpcoI=,iv:FMvW0jU0az7doNS4vC0waUswPVVQ4XydVSnLzL6wQvg=,tag:VTCccPLs73OOH/CmWRIoMQ==,type:str]", + "lastmodified": "2024-09-20T16:48:03Z", + "mac": "ENC[AES256_GCM,data:PWXGqvgcUCptq4D6i4+7czbr28ii1+GR/d8pjk6d6/OwpjnY/ksk/jvH9seIsbCLzmUD1j1cleMQrpVUYvBaBtlUF8QBVYhzWNhqZO7OVorIyDnKl/E92u2cJ3ZTbzBHkVAu9XewhZUNPwOekB7LXx3Bl6uyLL3MqmqFzrMqjBs=,iv:K69ETx01BYc0rPAQFUz+JOHU8shujDPe11XicW8nV3Q=,tag:xi2YBuI9buTR1sLHQwHw8w==,type:str]", "pgp": null, "unencrypted_suffix": "_unencrypted", "version": "3.9.0" diff --git a/tf_backend/.gitignore b/tf_backend/.gitignore index 3ecf75680f..8208f41442 100644 --- a/tf_backend/.gitignore +++ b/tf_backend/.gitignore @@ -1 +1,2 @@ -!terraform.tfvars \ No newline at end of file +!terraform.tfvars +!*.secret \ No newline at end of file diff --git a/tf_backend/bucket.tf b/tf_backend/bucket.tf index 59f9b56a91..d8cfd90b39 100644 --- a/tf_backend/bucket.tf +++ b/tf_backend/bucket.tf @@ -1,10 +1,10 @@ -variable "bucket_name" { +variable "backend_gcs_bucket" { type = string description = "The name of the bucket for storing Terraform state" } resource "google_storage_bucket" "tf_state" { - name = var.bucket_name + name = var.backend_gcs_bucket location = "US" versioning { From dd1e4add8fb49ef97b79ae2464a6a00d4170a868 Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Sat, 21 Sep 2024 01:05:20 +0800 Subject: [PATCH 17/65] feat: Fix GH Actions --- .github/actions/setup_runner/action.yml | 9 ++++++++- .github/workflows/on_pr.yml | 2 ++ .github/workflows/on_push.yml | 27 ++++++++++++++++--------- Makefile | 10 +++++---- backend/Makefile | 7 ++++++- backend/source.sh | 2 +- backend/yarn.lock | 4 ++-- frontend/Makefile | 6 +++++- frontend/source.sh | 2 +- scripts/secret.sh | 11 +++------- source.sh | 4 +++- tf/provider.tf | 27 ++++++++++++++++--------- 12 files changed, 72 insertions(+), 39 deletions(-) diff --git a/.github/actions/setup_runner/action.yml b/.github/actions/setup_runner/action.yml index 6dfed35a0f..957d23fe23 100644 --- a/.github/actions/setup_runner/action.yml +++ b/.github/actions/setup_runner/action.yml @@ -1,6 +1,11 @@ name: Setup Runner Dependencies description: "Install dependencies for the runner" +inputs: + AGE_SECRET_KEY: + description: 'The age secret key' + required: true + runs: using: "composite" steps: @@ -21,7 +26,9 @@ runs: run: sudo apt install -y age - name: Setup age secret key shell: bash - run: echo ${{ secrets.AGE_SECRET_KEY }} > ${XDG_CONFIG_HOME:-$HOME/.config}/sops/age/keys.txt + run: | + mkdir -p ${XDG_CONFIG_HOME:-$HOME/.config}/sops/age + echo ${{ inputs.AGE_SECRET_KEY }} > ${XDG_CONFIG_HOME:-$HOME/.config}/sops/age/keys.txt - name: Install OpenTofu shell: bash run: | diff --git a/.github/workflows/on_pr.yml b/.github/workflows/on_pr.yml index 0cfa877157..f238d4dca7 100644 --- a/.github/workflows/on_pr.yml +++ b/.github/workflows/on_pr.yml @@ -24,6 +24,8 @@ jobs: - name: Setup Runner Dependencies uses: ./.github/actions/setup_runner + with: + AGE_SECRET_KEY: ${{ secrets.AGE_SECRET_KEY }} # Runs a single command using the runners shell - name: Run a one-line script diff --git a/.github/workflows/on_push.yml b/.github/workflows/on_push.yml index a734aa61e1..899bf61857 100644 --- a/.github/workflows/on_push.yml +++ b/.github/workflows/on_push.yml @@ -1,6 +1,6 @@ # This is a basic workflow to help you get started with Actions -name: Checks on Push +name: Actions on Push # Controls when the workflow will run on: @@ -24,6 +24,8 @@ jobs: - name: Setup Runner Dependencies uses: ./.github/actions/setup_runner + with: + AGE_SECRET_KEY: ${{ secrets.AGE_SECRET_KEY }} # We don't use this, for now. # - name: Find Changed Files @@ -37,18 +39,23 @@ jobs: # - 'frontend/**' # backend: # - 'backend/**' - + - name: Decrypt Secret Files + shell: bash + run: /bin/bash ./scripts/secret.sh decrypt + + - name: Authenticate to Google Cloud + shell: bash + run: make gcloud_auth + - name: Deploy Global Infrastructure - run: | - make deploy_infra + shell: bash + run: make deploy_infra - name: Deploy Backend - run: | - cd backend - make deploy + shell: bash + run: cd backend && make deploy - name: Deploy Frontend - run: | - cd frontend - make deploy + shell: bash + run: cd frontend && make deploy diff --git a/Makefile b/Makefile index c7a34e9562..ac30e8c4a2 100644 --- a/Makefile +++ b/Makefile @@ -11,10 +11,10 @@ help: ## Display this help text ## Google Cloud CLI ## -gcloud_auth: ## Authenticate with gcloud and launch a new shell. - set -o allexport && source ./.env && set +o allexport && \ - gcloud auth activate-service-account --key-file=$$GOOGLE_APPLICATION_CREDENTIALS - $$SHELL +gcloud_auth: ## Authenticate with gcloud + . source.sh && \ + gcloud auth activate-service-account --key-file=$$GOOGLE_APPLICATION_CREDENTIALS && \ + gcloud auth configure-docker $$GCLOUD_REGION-docker.pkg.dev ## ## Global Terraform Infrastructure @@ -24,11 +24,13 @@ deploy_infra: ## Deploy Global OpenTofu/Terraform infrastructure . source.sh && \ cd tf && \ tofu init && \ + tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ tofu apply -auto-approve destroy_infra: ## Destroy Global OpenTofu/Terraform infrastructure . source.sh && \ cd tf && \ + tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ tofu destroy -auto-approve ## diff --git a/backend/Makefile b/backend/Makefile index 61a5e2183b..9479d4abba 100644 --- a/backend/Makefile +++ b/backend/Makefile @@ -1,3 +1,5 @@ +SHELL=/bin/bash + deploy: infra_deploy code_deploy destroy: infra_destroy @@ -14,14 +16,17 @@ infra_deploy: . ./source.sh && \ cd tf && \ tofu init && \ + tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ tofu apply -auto-approve infra_destroy: - . ./source.sh && \ + . ./source.sh && + tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ cd tf && \ tofu destroy -auto-approve api_url: @ . ./source.sh && \ cd tf && \ + tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ tofu output -raw service_url \ No newline at end of file diff --git a/backend/source.sh b/backend/source.sh index ad46a7648f..d53ac266ca 100644 --- a/backend/source.sh +++ b/backend/source.sh @@ -4,7 +4,7 @@ source ../source.sh set -o allexport -source ./.env +SERVICE_NAME=backend GCLOUD_REPOSITORY_URL=$(cd ../tf && tofu output -raw repository_url) TF_VAR_service_name=${SERVICE_NAME} diff --git a/backend/yarn.lock b/backend/yarn.lock index 968a8889f4..0be0c537a7 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -647,7 +647,7 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -typescript@^5.6.2: +typescript@^5.6.2, typescript@>=2.7: version "5.6.2" resolved "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz" integrity sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw== @@ -657,7 +657,7 @@ undici-types@~6.19.2: resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz" integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@~1.0.0, unpipe@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== diff --git a/frontend/Makefile b/frontend/Makefile index 666cf8c6e1..42097b65fc 100644 --- a/frontend/Makefile +++ b/frontend/Makefile @@ -4,7 +4,8 @@ deploy: infra_deploy code_deploy destroy: infra_destroy BACKEND_SERVICE_URL=$(shell cd ../backend && $(MAKE) -s api_url | head -n 2) - +test: + @echo $(BACKEND_SERVICE_URL) serve: @if [[ "$(BACKEND_SERVICE_URL)" == *"No outputs found"* ]] ; then \ echo "Backend service URL not found, please go to the backend service and deploy it first."; \ @@ -19,6 +20,7 @@ code_build: exit 1; \ fi export VITE_BACKEND_SERVICE_URL=$(BACKEND_SERVICE_URL) && \ + yarn && \ yarn run build code_deploy: code_build @@ -32,9 +34,11 @@ infra_deploy: tf/* . ./source.sh && \ cd tf && \ tofu init && \ + tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ tofu apply -auto-approve \ infra_destroy: . ./source.sh && \ cd tf && \ + tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ tofu destroy -auto-approve \ \ No newline at end of file diff --git a/frontend/source.sh b/frontend/source.sh index cf1a8a79d5..6ce2d80b92 100644 --- a/frontend/source.sh +++ b/frontend/source.sh @@ -3,4 +3,4 @@ PWD="$(git rev-parse --show-toplevel)"/frontend # Get global environment variables for project source $PWD/../source.sh -export TF_VAR_service_name=backend +export TF_VAR_service_name=frontend diff --git a/scripts/secret.sh b/scripts/secret.sh index 824f13a31f..b0c02a84e3 100755 --- a/scripts/secret.sh +++ b/scripts/secret.sh @@ -4,15 +4,13 @@ COMMAND=$1 shift FILES=( - secrets/* - tf_backend/*.tfstate* + secrets/gcp_credentials.json + tf_backend/terraform.tfstate + tf_backend/terraform.tfstate.backup ) encrypt() { for FILE in ${FILES[@]}; do - if [[ $FILE == *".enc" ]]; then - continue - fi echo "Encrypting $FILE to $FILE.enc" sops -e --input-type json --output-type json $FILE > $FILE.enc done @@ -20,9 +18,6 @@ encrypt() { decrypt() { for FILE in ${FILES[@]}; do - if [[ $FILE == *".enc" ]]; then - continue - fi echo "Decrypting $FILE.enc to $FILE" sops -d --input-type json --output-type json $FILE.enc > $FILE done diff --git a/source.sh b/source.sh index aa53258b07..f109c8803e 100755 --- a/source.sh +++ b/source.sh @@ -24,6 +24,8 @@ else ENV=$(echo $BRANCH | tr '[:upper:]' '[:lower:]' | tr "/" "-") fi -TF_WORKSPACE=$ENV +# Stupid issue: TF_WORKSPACE environment variable is literally broken, WTF? +# https://discuss.hashicorp.com/t/help-using-terraform-workspaces-in-an-automation-pipeline-with-tf-workspace-currently-selected-workspace-x-does-not-exist/40676 +TERRAFORM_WORKSPACE=$ENV set +o allexport \ No newline at end of file diff --git a/tf/provider.tf b/tf/provider.tf index 81f3d9786b..471ace3745 100644 --- a/tf/provider.tf +++ b/tf/provider.tf @@ -1,12 +1,3 @@ -terraform { - required_providers { - google = { - source = "hashicorp/google" - version = "6.3.0" - } - } -} - variable "project" { type = string } @@ -19,6 +10,24 @@ variable "zone" { type = string } +variable "backend_gcs_bucket" { + type = string +} + +terraform { + required_providers { + google = { + source = "hashicorp/google" + version = "6.3.0" + } + } + + backend "gcs" { + bucket = var.backend_gcs_bucket + prefix = "terraform/state/global" + } +} + provider "google" { # Configuration options project = var.project From 117db9a5d3836514baa506e0d1c9d47fe8bfd8bc Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Sat, 21 Sep 2024 02:53:57 +0800 Subject: [PATCH 18/65] feat: Use container actions to cache dependencies --- .github/actions/setup_runner/action.yml | 45 ------------- .github/workflows/on_pr.yml | 12 ++-- .github/workflows/on_push.yml | 24 ++++--- Makefile | 2 +- ci/actions_runner_image/Dockerfile | 55 +++++++++++++++ ci/actions_runner_image/Makefile | 17 +++++ scripts/secret.sh | 8 +++ source.sh | 2 +- tf_backend/.gitignore | 2 +- tf_backend/terraform.tfstate.backup.enc | 30 +++++++++ tf_backend/terraform.tfstate.enc | 89 +++++++++++++++++++++++++ 11 files changed, 225 insertions(+), 61 deletions(-) delete mode 100644 .github/actions/setup_runner/action.yml create mode 100644 ci/actions_runner_image/Dockerfile create mode 100644 ci/actions_runner_image/Makefile create mode 100644 tf_backend/terraform.tfstate.backup.enc create mode 100644 tf_backend/terraform.tfstate.enc diff --git a/.github/actions/setup_runner/action.yml b/.github/actions/setup_runner/action.yml deleted file mode 100644 index 957d23fe23..0000000000 --- a/.github/actions/setup_runner/action.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: Setup Runner Dependencies -description: "Install dependencies for the runner" - -inputs: - AGE_SECRET_KEY: - description: 'The age secret key' - required: true - -runs: - using: "composite" - steps: - - name: Sudo apt update and upgrade - shell: bash - run: | - sudo apt update - sudo apt upgrade -y - - name: Install SOPS - shell: bash - run: | - # https://github.com/getsops/sops/releases - curl -LO https://github.com/getsops/sops/releases/download/v3.9.0/sops-v3.9.0.linux.amd64 - mv sops-v3.9.0.linux.amd64 /usr/local/bin/sops - chmod +x /usr/local/bin/sops - - name: Install age - shell: bash - run: sudo apt install -y age - - name: Setup age secret key - shell: bash - run: | - mkdir -p ${XDG_CONFIG_HOME:-$HOME/.config}/sops/age - echo ${{ inputs.AGE_SECRET_KEY }} > ${XDG_CONFIG_HOME:-$HOME/.config}/sops/age/keys.txt - - name: Install OpenTofu - shell: bash - run: | - # https://opentofu.org/docs/intro/install/deb/ - curl --proto '=https' --tlsv1.2 -fsSL https://get.opentofu.org/install-opentofu.sh -o install-opentofu.sh - chmod +x install-opentofu.sh - ./install-opentofu.sh --install-method deb - rm -f install-opentofu.sh - - name: Install gcloud - shell: bash - run: | - curl -O https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-cli-linux-x86_64.tar.gz - tar -xf google-cloud-cli-linux-x86_64.tar.gz - ./google-cloud-sdk/install.sh -q diff --git a/.github/workflows/on_pr.yml b/.github/workflows/on_pr.yml index f238d4dca7..cc2152bdb3 100644 --- a/.github/workflows/on_pr.yml +++ b/.github/workflows/on_pr.yml @@ -16,17 +16,19 @@ jobs: test: # The type of runner that the job will run on runs-on: ubuntu-latest + container: + image: kimyongbeom/peerprep-actions-runner:latest + env: + AGE_SECRET_KEY: ${{ secrets.AGE_SECRET_KEY }} + volumes: + - /var/run/docker.sock:/var/run/docker.sock + options: --privileged # Steps represent a sequence of tasks that will be executed as part of the job steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/checkout@v4 - - name: Setup Runner Dependencies - uses: ./.github/actions/setup_runner - with: - AGE_SECRET_KEY: ${{ secrets.AGE_SECRET_KEY }} - # Runs a single command using the runners shell - name: Run a one-line script run: echo Hello, world! diff --git a/.github/workflows/on_push.yml b/.github/workflows/on_push.yml index 899bf61857..eb3916733d 100644 --- a/.github/workflows/on_push.yml +++ b/.github/workflows/on_push.yml @@ -13,19 +13,24 @@ on: # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: # This workflow contains a single job called "build" - test: + deploy: # The type of runner that the job will run on runs-on: ubuntu-latest + container: + image: kimyongbeom/peerprep-actions-runner:latest + env: + AGE_SECRET_KEY: ${{ secrets.AGE_SECRET_KEY }} + volumes: + - /var/run/docker.sock:/var/run/docker.sock + options: --privileged + # Steps represent a sequence of tasks that will be executed as part of the job steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/checkout@v4 - - - name: Setup Runner Dependencies - uses: ./.github/actions/setup_runner - with: - AGE_SECRET_KEY: ${{ secrets.AGE_SECRET_KEY }} + # https://github.com/actions/checkout/issues/1169 + - run: git config --global --add safe.directory "$PWD" # We don't use this, for now. # - name: Find Changed Files @@ -41,7 +46,10 @@ jobs: # - 'backend/**' - name: Decrypt Secret Files shell: bash - run: /bin/bash ./scripts/secret.sh decrypt + run: | + mkdir -p ${XDG_CONFIG_HOME:-$HOME/.config}/sops/age + echo $AGE_SECRET_KEY > ${XDG_CONFIG_HOME:-$HOME/.config}/sops/age/keys.txt + /bin/bash ./scripts/secret.sh decrypt - name: Authenticate to Google Cloud shell: bash @@ -57,5 +65,5 @@ jobs: - name: Deploy Frontend shell: bash - run: cd frontend && make deploy + run: . $NVM_DIR/nvm.sh && cd frontend && make deploy diff --git a/Makefile b/Makefile index ac30e8c4a2..909665f4be 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ help: ## Display this help text gcloud_auth: ## Authenticate with gcloud . source.sh && \ gcloud auth activate-service-account --key-file=$$GOOGLE_APPLICATION_CREDENTIALS && \ - gcloud auth configure-docker $$GCLOUD_REGION-docker.pkg.dev + gcloud auth configure-docker $$GCLOUD_REGION-docker.pkg.dev --quiet ## ## Global Terraform Infrastructure diff --git a/ci/actions_runner_image/Dockerfile b/ci/actions_runner_image/Dockerfile new file mode 100644 index 0000000000..d4da0bd8ab --- /dev/null +++ b/ci/actions_runner_image/Dockerfile @@ -0,0 +1,55 @@ +# Start from Ubuntu 22.04 base image +FROM ubuntu:22.04 + +# Set arguments for versioning +ARG SOPS_VERSION=3.9.0 +ARG NODE_VERSION=20 + +# Install necessary packages and dependencies +RUN apt-get update && apt-get upgrade -y && \ + apt-get install -y \ + curl \ + apt-transport-https \ + ca-certificates \ + gnupg \ + age \ + build-essential + +# Install Docker +RUN curl -fsSL https://get.docker.com -o get-docker.sh && \ + sh get-docker.sh && \ + rm -f get-docker.sh + +# Install SOPS +RUN curl -LO https://github.com/getsops/sops/releases/download/v${SOPS_VERSION}/sops-v${SOPS_VERSION}.linux.amd64 && \ + mv sops-v${SOPS_VERSION}.linux.amd64 /usr/local/bin/sops && \ + chmod +x /usr/local/bin/sops + +# Create the directory for age keys +RUN mkdir -p /root/.config/sops/age + +# Install OpenTofu +RUN curl --proto '=https' --tlsv1.2 -fsSL https://get.opentofu.org/install-opentofu.sh -o install-opentofu.sh && \ + chmod +x install-opentofu.sh && \ + ./install-opentofu.sh --install-method deb && \ + rm -f install-opentofu.sh + +# Install Google Cloud SDK +RUN apt-get install -y apt-transport-https ca-certificates gnupg && \ + curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | \ + gpg --dearmor | \ + tee /usr/share/keyrings/cloud.google.gpg > /dev/null && \ + echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | \ + tee /etc/apt/sources.list.d/google-cloud-sdk.list && \ + apt-get update && \ + apt-get install -y google-cloud-sdk + +# Install npm, yarn, and Node.js +ENV NVM_DIR=/root/.nvm +RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash && \ + . "$NVM_DIR/nvm.sh" && nvm install ${NODE_VERSION} && \ + npm install -g yarn + + +# Default command +CMD ["bash"] diff --git a/ci/actions_runner_image/Makefile b/ci/actions_runner_image/Makefile new file mode 100644 index 0000000000..cc157bde83 --- /dev/null +++ b/ci/actions_runner_image/Makefile @@ -0,0 +1,17 @@ +.PHONY: all build push + +all: build push + +build: + docker build -t kimyongbeom/peerprep-actions-runner:latest . + +push: + docker push kimyongbeom/peerprep-actions-runner:latest + +run: + docker run -it \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v $(shell git rev-parse --show-toplevel):/home \ + --privileged \ + -e AGE_SECRET_KEY=$$(tail -n1 $${XDG_CONFIG_HOME:-$$HOME/.config}/sops/age/keys.txt) \ + kimyongbeom/peerprep-actions-runner:latest \ No newline at end of file diff --git a/scripts/secret.sh b/scripts/secret.sh index b0c02a84e3..1846c9b4fc 100755 --- a/scripts/secret.sh +++ b/scripts/secret.sh @@ -12,6 +12,10 @@ FILES=( encrypt() { for FILE in ${FILES[@]}; do echo "Encrypting $FILE to $FILE.enc" + if [ ! -f $FILE ]; then + echo "File $FILE does not exist" + exit 1 + fi sops -e --input-type json --output-type json $FILE > $FILE.enc done } @@ -19,6 +23,10 @@ encrypt() { decrypt() { for FILE in ${FILES[@]}; do echo "Decrypting $FILE.enc to $FILE" + if [ ! -f $FILE.enc ]; then + echo "File $FILE.enc does not exist" + exit 1 + fi sops -d --input-type json --output-type json $FILE.enc > $FILE done } diff --git a/source.sh b/source.sh index f109c8803e..6f145fd5f9 100755 --- a/source.sh +++ b/source.sh @@ -14,7 +14,7 @@ TF_VAR_project=$GCLOUD_PROJECT TF_VAR_region=$GCLOUD_REGION TF_VAR_zone=$GCLOUD_ZONE -# Environmen.t +# Environment BRANCH=$(git rev-parse --abbrev-ref HEAD) if [[ $BRANCH == "main" ]]; then ENV="production" diff --git a/tf_backend/.gitignore b/tf_backend/.gitignore index 8208f41442..3a138fff14 100644 --- a/tf_backend/.gitignore +++ b/tf_backend/.gitignore @@ -1,2 +1,2 @@ !terraform.tfvars -!*.secret \ No newline at end of file +!*.enc \ No newline at end of file diff --git a/tf_backend/terraform.tfstate.backup.enc b/tf_backend/terraform.tfstate.backup.enc new file mode 100644 index 0000000000..9e0ed59c0c --- /dev/null +++ b/tf_backend/terraform.tfstate.backup.enc @@ -0,0 +1,30 @@ +{ + "version": "ENC[AES256_GCM,data:Lw==,iv:kumulXKUGGDB5zzEvXRMZkBlXgtXk7Ti5rr76kSi9N0=,tag:xr/vA2x9nlFvh1iOzEoUmg==,type:float]", + "terraform_version": "ENC[AES256_GCM,data:9I4pNn0=,iv:p/rvLqTY5qfAu1YfGdsUEHpec9uB7PCdaikDhaifv2o=,tag:yEeDLJTC97fYyRnGg4C8nw==,type:str]", + "serial": "ENC[AES256_GCM,data:iw==,iv:C5GrfVIDubIUfWXM5GG7vLW5bUp3mf6lHmJayBsbRLs=,tag:k01TY0oEJW1F+tnPozDWyA==,type:float]", + "lineage": "ENC[AES256_GCM,data:U2W6OJjekOSlTgUAgsM9A83o5qI1gOKDjRn+QIb/Sk0o6Z1C,iv:qDOQ1SGiXBEmwy6LMCJNT8xc/cXlsShcFi2qR31R2d4=,tag:YC3wTixkQ+QyRMpylSlByA==,type:str]", + "outputs": {}, + "resources": [], + "check_results": null, + "sops": { + "kms": null, + "gcp_kms": null, + "azure_kv": null, + "hc_vault": null, + "age": [ + { + "recipient": "age1c0fqjnprp4pzk8kx5y23mlkreu5z34v3tkrrwrcmf56cmu3zaf0q30sqfv", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBqR2huTzJpL2xxaXRtSE43\nRG5YN3FpY0dIeDV1OEg4SzRPYk9wQzZBQkRBCnVqYlFxY1FpcXVRQXFFV1NsTFMv\nQWhSSTEvcjdyZHYwR25oc2hVNUdEN0kKLS0tIHhMZ0t0N3daL0szZXZRelpOWUhL\nQ05RTmx2UjBBeG9tOHI2bEFUM0xZc3MKiMnylHuOPqD41h4cAdvWDwp02tzCGKNl\n/6vVnzey8G1kphA95geHIGHgXse+y/UYjDvLNNpDlx9vK6ZSlNTDcg==\n-----END AGE ENCRYPTED FILE-----\n" + }, + { + "recipient": "age1g2yz8vzyyzmdsht3398da6nu3pgl54rkw5wuveqh5wfn23r2hy0qu6d4dw", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBqMGRpYUl4bE43SC81cUJt\nMFYyUkNVeER4TjRpWUgxS00xTFJaRGlUU0MwCkViZGVlc0Y2OTdGQlF2cXRxR3RF\nRm9ibXFZUjJ4WFpEUmU5YytUVE8wbXMKLS0tIFhFR1UvZ2drNjVUMjVFT0RDRjUy\nS3VUaitEZlFzWWdDcGVVMlFkL0dyV1EKxQAZaF2zMrudQG3J4RZLf2WzuYyTtvyO\nRHmwN6INoGTdKxB3xu63Cp0P7ZbQZzc2QCCbSyHUG321tQrKK8C6Ng==\n-----END AGE ENCRYPTED FILE-----\n" + } + ], + "lastmodified": "2024-09-20T16:48:03Z", + "mac": "ENC[AES256_GCM,data:hK+YLSiRS9SPsyKPCa7veMobaAipXmaj/bwiJDoQbq457sF4omDifMDpJONKCEesJx1kGNkAZAfBVhw9c2SyCFyy9DtpFRdzUvWKSPyukQlWamywzniXn7OYNlCuPQ5/qRPA9aZ6cFcC8PSnMFnJ9bl14et/4jQY0s8Rrmi7ODs=,iv:9FPS3SQhWFSutqusIWPDUuj8fiq6a90lP+nRRqbWN00=,tag:TJuxqr8hMWTmniuyRPUGeQ==,type:str]", + "pgp": null, + "unencrypted_suffix": "_unencrypted", + "version": "3.9.0" + } +} \ No newline at end of file diff --git a/tf_backend/terraform.tfstate.enc b/tf_backend/terraform.tfstate.enc new file mode 100644 index 0000000000..28bff57104 --- /dev/null +++ b/tf_backend/terraform.tfstate.enc @@ -0,0 +1,89 @@ +{ + "version": "ENC[AES256_GCM,data:Aw==,iv:Py19YugXLsiH3I6FDZTmXugtSHbB3gI8VWPUEP4Vu+Q=,tag:CeEsK4t8P4+MCeN/ddxvSA==,type:float]", + "terraform_version": "ENC[AES256_GCM,data:Vtiz3nc=,iv:YG6O3podGHr6GdSOVEem8TTsh1gj/bkXwjHpg28EZ4c=,tag:/pplGSYQRxOh/aY33cV25Q==,type:str]", + "serial": "ENC[AES256_GCM,data:Iw==,iv:QWYjHdQZf8xnmFR60sSHNaDOfR9tS3kbO8t0Xhd1azc=,tag:TJzMezbjmEaulsb00KitJQ==,type:float]", + "lineage": "ENC[AES256_GCM,data:ctMEN0yeCRZvFcCwsvTfUWpgHdJq7/D2tNbbFfboAOve1HxF,iv:pxCsPzPDd4dddXECspNTlG/eMGMFH5vITL8E4YMOCPo=,tag:f5ijdb7J48LIDrG1edjQgQ==,type:str]", + "outputs": {}, + "resources": [ + { + "mode": "ENC[AES256_GCM,data:Wh7dFJ4e5w==,iv:Em0nfB6sBrPquVSn4mdh8/wYEHzIKmv/g0R+pym2840=,tag:lZ+q75esO3E/njE9HJAbOg==,type:str]", + "type": "ENC[AES256_GCM,data:OSMtijoPBzQsM2u69KvDTT3l9Uao,iv:JftsxFphu5AK28kUOF07OyJbpG+m4RADRV/PO/A/e2I=,tag:bDCmPEsWXhlBYVsGmEK5vg==,type:str]", + "name": "ENC[AES256_GCM,data:tIldIWLq1/c=,iv:QFIiVl42R2w58Lq30KSCOyfQdJi0OB2OQKHE2NbVlvE=,tag:dCTPWytAXp5hksc1mPZ2EQ==,type:str]", + "provider": "ENC[AES256_GCM,data:jIpk2dQvZEE4yOwtsgBFZooNbydd2udvJX5+eU3QRGAFbRaWtn+UoUTluxLvqM50Xao=,iv:H5dv2XA6e8SegwldBz1Ekh1FQ0LhjXOGhuqT+3bAjp4=,tag:AZ9Oh+czRbzozAz4nsLnGQ==,type:str]", + "instances": [ + { + "schema_version": "ENC[AES256_GCM,data:gw==,iv:r3OiFjFmU8EQOCi7GLW3M7qkLv2S2NaF5YO+TfajymY=,tag:TR8R8tLXcekfuk+lCtUhHQ==,type:float]", + "attributes": { + "autoclass": [], + "cors": [], + "custom_placement_config": [], + "default_event_based_hold": "ENC[AES256_GCM,data:UeY+H3g=,iv:d8uoDc6vjTr1w8yohiUKPlZYCMj7zel85ySR8BP+r5c=,tag:l+CGT9Qga1Nz7sfXrBwO8w==,type:bool]", + "effective_labels": { + "environment": "ENC[AES256_GCM,data:SnV2JbTmXm8t,iv:YVxole7GLIcauH+A6j51fvap/omNwQGKhNvIw8HRtcQ=,tag:L1eX1BK+4P5j8tRibIOkGA==,type:str]", + "goog-terraform-provisioned": "ENC[AES256_GCM,data:PopBpg==,iv:Ys1tSEl+I7qaiy1KgoJlRWNUUPvUFe+jszQsCWh4ObI=,tag:E1HNEfNNe15F4urs3+ZL9Q==,type:str]", + "managed-by": "ENC[AES256_GCM,data:/K8QgSKD/HI=,iv:ZTJZu8bYi7Gh0gqyAThBWaVYz1hgo07Yd+ngDm5zb1s=,tag:wwSRU+Cw7oOqtx+us6SWQg==,type:str]", + "project": "ENC[AES256_GCM,data:vntLUpYkXL4DyEcPAMqGVl3cuvYrN4hXL6j8,iv:Zvbr9hXH4eFoimDHSqkQsxrn4ndp45T9OiYtIOe3nn0=,tag:xpHuZLxNZh6fMbs1EXCI2Q==,type:str]" + }, + "enable_object_retention": "ENC[AES256_GCM,data:jl0O6aI=,iv:tkE2nBUtcJ1hpAFupWFELfiEANrLsJ/xCOKrURjtNNs=,tag:48NaDsvWG7a6+wNWgvzD4Q==,type:bool]", + "encryption": [], + "force_destroy": "ENC[AES256_GCM,data:VM567mA=,iv:7WUwnrgBOz87nJ/3sP/9Bsnetj09nx3RQDUpNcJzuSk=,tag:EN2SLS7D11yXRtIZIWTNAg==,type:bool]", + "id": "ENC[AES256_GCM,data:i6xAyw2A+TnhPBwFdUIxOK5Qh1VXn6PucwtkwTw85XPgDHE=,iv:mci2sUwV1zk3gT8aVDEpxGW/Qu5Mnj2yaTqSS9WXBIM=,tag:NqPeRLG/oUfVFj+TB5b8pw==,type:str]", + "labels": {}, + "lifecycle_rule": [], + "location": "ENC[AES256_GCM,data:/iA=,iv:USZFYy+Y6EQkby+VxngvuM+wE2rUUAlSnSSCjKVxZXY=,tag:KWu9waIElkO+I9qOgMHpoQ==,type:str]", + "logging": [], + "name": "ENC[AES256_GCM,data:ii7gtiLb/QO5YFPVS5zXKWDTqXfeqfIyHBbpy7Nhb3Ev7a0=,iv:P6oUFEWPTnOIk1TsZ2p/iwvqE9w5cW3K61B7CDwYAR8=,tag:jme/dw4kWi85MHfyE8paCQ==,type:str]", + "project": "ENC[AES256_GCM,data:6Ui2cIJr1jyP9LBo++tW0G0X3OlVHN0Pz6Ja,iv:IOgPinSl3gHqd9mM81yHJ99zlZjIPiZaT+U4euEN8zU=,tag:R873zGvqi+k2WXm4/ZB18Q==,type:str]", + "project_number": "ENC[AES256_GCM,data:hB5mCZhSwbBsGqYo,iv:6xxLSZW475Y+gR1Rn8qqpqR3ULpZXeXDbDvcDkQ/fDU=,tag:PbR36V+dOG817VPGRk0R4g==,type:float]", + "public_access_prevention": "ENC[AES256_GCM,data:GKLKXsRdQkVi,iv:EYfZFT94fMhXqlYF9aTJslhqr+CpAmV61s0XPJLTJAw=,tag:u4d8N78iowyL426XGH0V1g==,type:str]", + "requester_pays": "ENC[AES256_GCM,data:3/qqAGg=,iv:q7m7ke2No4XoHNWHDOZLjSUzeUacUcoKEz28DpuAVX4=,tag:ezzLmoWviLTu/6GvIU77Qg==,type:bool]", + "retention_policy": [], + "rpo": "ENC[AES256_GCM,data:r0MZu5MO9w==,iv:oLmQ534yqFr6fTqhkrpRcIujbjmFQEJraQiObzyz5Ck=,tag:bCDsyr+FIFs88t1TzuIY3g==,type:str]", + "self_link": "ENC[AES256_GCM,data:LxiJk/Om6TN3Ulddaw8DNFgfImVAEEMoIMVhr79kDp3/QzbBz9291otLIngixL6D9j95wqqbwDkbMlM0Ir8mNlMkFXqaQDN15Iv5,iv:sR49cqD2jIIPndW9bKh2xp/LxJOz73jkCXIc4H+t5qg=,tag:IuJKvHWiEKrrEgfmE1pPhg==,type:str]", + "soft_delete_policy": [ + { + "effective_time": "ENC[AES256_GCM,data:Rrl51gJQtHyScJJ8cWgRUnj3wq1iOO5u,iv:NkxfhYzxg3w0xq3t0kc2iNeZH1M5znoLREzpZCRjpNo=,tag:JC7VMKD2HHNXSabQyO3iPA==,type:str]", + "retention_duration_seconds": "ENC[AES256_GCM,data:gd7BKoIO,iv:6aC0InxPUePgR8sqNF4eemf2bV2ASn/DizMD2Oo8TPc=,tag:YqjWbLQvzLeTwRkndcG9mg==,type:float]" + } + ], + "storage_class": "ENC[AES256_GCM,data:xRkvbXlVUUU=,iv:QzEOxfVBj9Zst57F2Sw0gxH3tf/5cCsgyivM2N7EyiU=,tag:W4jraY+nqOOcOiQTDbu4zA==,type:str]", + "terraform_labels": {}, + "timeouts": null, + "uniform_bucket_level_access": "ENC[AES256_GCM,data:WHqv15c=,iv:Fp6X8nA/Ih4EuelNpaMjbvH93nXeA0jc+62kvo93+Hk=,tag:5UzqoJ5s/TyqEMsUFoT6Gg==,type:bool]", + "url": "ENC[AES256_GCM,data:vz6ziWjSE6LJe6ofZ016ln+gK9N6MhBmQMMVWFZxyzuruO7Opw7UBw==,iv:ewNaHl/2O2F0k6mHgJXmNsA+m6Voa5exGuyE8u85NQs=,tag:jtE3Su+oUb5mMw8dzq7nNQ==,type:str]", + "versioning": [ + { + "enabled": "ENC[AES256_GCM,data:16mSwQ==,iv:q7ZIaYSfAhfULujQPoBWh0ulFZ4w/nh4fX9Ma4OP0hw=,tag:G8eRSpMGF4XP6703PVCXZQ==,type:bool]" + } + ], + "website": [] + }, + "sensitive_attributes": [], + "private": "ENC[AES256_GCM,data:bZ9KViQMt4LZkRriUnRWglMmde5BDzO4lSGMRqTZPUpEZBxsuNcOHgCxOw5XZ2XK6kOYkkB6NJeOTHhCleZ9XC1BYdQuX5KKdmM7cDaDG8bcXih04KVbISF8hZPv2mS2Sd2MUQdRfjAC4LFEQHnnD0inFFUQCNcR+lEt31k8eWZug58jAPU1HbueSzbEXZ1D3zLiCWlraxeCFMWblfsM6nWnlH2vnT5meIIhyg==,iv:maSqgUvgsdL5SjY6ZPnsWoZYXRQyZ0pnS/sDOXGN41A=,tag:ssN0Uh3Htf9HVnPJ0go39A==,type:str]" + } + ] + } + ], + "check_results": null, + "sops": { + "kms": null, + "gcp_kms": null, + "azure_kv": null, + "hc_vault": null, + "age": [ + { + "recipient": "age1c0fqjnprp4pzk8kx5y23mlkreu5z34v3tkrrwrcmf56cmu3zaf0q30sqfv", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBqYzZqU1VaWmdEMDJwbFRB\nT2ZkaExDa2RNRGRUbEdMWkxZRlB2M0QzVnljClJUa2JWSXZVOFdxVGN6L0p6cFZn\nMjM4UEp3YmZ5Lzd1akE2dTZMTU5RZzgKLS0tIDUrVHBaelNxbC9sR05jWHJ2R2tX\nUUVlUWM3MWVSbVdFNXFRV2RhL1ltZmMK5t2/NTzyGVJ6l8tpYNqbKpiA1gI1/DuJ\n8tgVr2h6w6RkpAeL2njC9am7xx65argwTgjoMCicJCA1FkQGonC8Qw==\n-----END AGE ENCRYPTED FILE-----\n" + }, + { + "recipient": "age1g2yz8vzyyzmdsht3398da6nu3pgl54rkw5wuveqh5wfn23r2hy0qu6d4dw", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBIVXF6OG55UGFQeUx6aGMz\nUm9XbDArYUE0ZFRrNmtib0NreFYvK08vNmd3Cm4zYnVtZm1OVjBYMzJDbXJ1b2Ew\nOGtWVGMxMVA0VklXckR5T1A3MGpVY2sKLS0tIGdTS0s3ejFnLy9NakpUQ2tra2Z5\nS1pyeU1YMTRzNFA0aWFobVJlYXYrNDQK0h6SurvqP+QFwLXnwOTQhfg3srpLRUZM\nx0toFWm4Xe6EC/mzvx8aIt5L+/Wfttm8SrskUIbHU/z50hufG/LH9A==\n-----END AGE ENCRYPTED FILE-----\n" + } + ], + "lastmodified": "2024-09-20T16:48:03Z", + "mac": "ENC[AES256_GCM,data:b1BH6RgDTck/Uzmw9dST00bSQQjpE+GiftQxwgM8tBM+aXhLnOJOY5gZnlxKzjAR7UTSO2sbSQ/Vax1lJKLj57HkBiX42hEn2q3u2b2A+uce/q7qyksANH4yX0GJSxfwlR0nIxlZVWTqA7Aje1UoNsCXzqt7MXtjps0Vg0ntZ88=,iv:gU7bli4F6cgA8K/YvqFVqhEXHrCBT1kTcThj41IzUtk=,tag:2APA3KgrBkbsvf0YXFBPhQ==,type:str]", + "pgp": null, + "unencrypted_suffix": "_unencrypted", + "version": "3.9.0" + } +} \ No newline at end of file From 90a2da3357a27fcbccbc38c77c70bf59022e4d2f Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Sat, 21 Sep 2024 04:35:00 +0800 Subject: [PATCH 19/65] feat: Namespace frontend bucket by workspace --- frontend/tf/bucket.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/tf/bucket.tf b/frontend/tf/bucket.tf index 82d856a1a5..9a1ba02072 100644 --- a/frontend/tf/bucket.tf +++ b/frontend/tf/bucket.tf @@ -1,5 +1,5 @@ resource "google_storage_bucket" "frontend" { - name = "${var.project}-frontend" + name = "${var.project}-${terraform.workspace}-frontend" location = "US" force_destroy = true From 2565badeb02d48aa270d2a8668aa36ced075a4df Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Sat, 21 Sep 2024 16:38:55 +0800 Subject: [PATCH 20/65] feat: Add github actions for on change, pr, cleanup --- .github/actions/container_setup/action.yml | 22 +++++++++++ .github/workflows/cleanup_branch.yml | 46 ++++++++++++++++++++++ .github/workflows/on_pr.yml | 2 +- .github/workflows/on_push.yml | 46 +++++++++------------- 4 files changed, 88 insertions(+), 28 deletions(-) create mode 100644 .github/actions/container_setup/action.yml create mode 100644 .github/workflows/cleanup_branch.yml diff --git a/.github/actions/container_setup/action.yml b/.github/actions/container_setup/action.yml new file mode 100644 index 0000000000..86d0c2e2c4 --- /dev/null +++ b/.github/actions/container_setup/action.yml @@ -0,0 +1,22 @@ +name: Setup Action +description: Set up environment, authenticate, and configure git for workflows under the kimyongbeom/peerprep-actions-runner container. + +runs: + using: composite + steps: + - name: Configure Git + shell: bash + run: | + git config --global --add safe.directory "$PWD" + + - name: Decrypt Secret Files + shell: bash + run: | + mkdir -p ${XDG_CONFIG_HOME:-$HOME/.config}/sops/age + echo $AGE_SECRET_KEY > ${XDG_CONFIG_HOME:-$HOME/.config}/sops/age/keys.txt + /bin/bash ./scripts/secret.sh decrypt + + - name: Authenticate to Google Cloud + shell: bash + run: | + make gcloud_auth diff --git a/.github/workflows/cleanup_branch.yml b/.github/workflows/cleanup_branch.yml new file mode 100644 index 0000000000..94797e891a --- /dev/null +++ b/.github/workflows/cleanup_branch.yml @@ -0,0 +1,46 @@ +# This is a basic workflow to help you get started with Actions + +name: Branch Cleanup + +# Controls when the workflow will run +on: + # On push @ branch + pull_request: + types: [closed] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + cleanup: + # Run only if PR is merged + if: github.event.pull_request.merged == true + # The type of runner that the job will run on + runs-on: ubuntu-latest + container: + image: kimyongbeom/peerprep-actions-runner:latest + env: + AGE_SECRET_KEY: ${{ secrets.AGE_SECRET_KEY }} + volumes: + - /var/run/docker.sock:/var/run/docker.sock + options: --privileged + + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/container_setup + + - name: Destroy Global Infrastructure + shell: bash + run: make destroy_infra + + - name: Destroy Backend + shell: bash + run: cd backend && make destroy + + - name: Destroy Frontend + shell: bash + run: . $NVM_DIR/nvm.sh && cd frontend && make destroy + diff --git a/.github/workflows/on_pr.yml b/.github/workflows/on_pr.yml index cc2152bdb3..1f4bb1c79e 100644 --- a/.github/workflows/on_pr.yml +++ b/.github/workflows/on_pr.yml @@ -26,8 +26,8 @@ jobs: # Steps represent a sequence of tasks that will be executed as part of the job steps: - # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/checkout@v4 + - uses: ./.github/actions/container_setup # Runs a single command using the runners shell - name: Run a one-line script diff --git a/.github/workflows/on_push.yml b/.github/workflows/on_push.yml index eb3916733d..2b4f364017 100644 --- a/.github/workflows/on_push.yml +++ b/.github/workflows/on_push.yml @@ -4,8 +4,10 @@ name: Actions on Push # Controls when the workflow will run on: - # Triggers the workflow on push or pull request events but only for the "main" branch + # On push @ branch push: + # When branch is created + create: # Allows you to run this workflow manually from the Actions tab workflow_dispatch: @@ -27,43 +29,33 @@ jobs: # Steps represent a sequence of tasks that will be executed as part of the job steps: - # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/checkout@v4 - # https://github.com/actions/checkout/issues/1169 - - run: git config --global --add safe.directory "$PWD" - - # We don't use this, for now. - # - name: Find Changed Files - # uses: dorny/paths-filter@v3 - # id: changes - # with: - # filters: | - # global_infra: - # - 'tf/**' - # frontend: - # - 'frontend/**' - # backend: - # - 'backend/**' - - name: Decrypt Secret Files - shell: bash - run: | - mkdir -p ${XDG_CONFIG_HOME:-$HOME/.config}/sops/age - echo $AGE_SECRET_KEY > ${XDG_CONFIG_HOME:-$HOME/.config}/sops/age/keys.txt - /bin/bash ./scripts/secret.sh decrypt - - - name: Authenticate to Google Cloud - shell: bash - run: make gcloud_auth + - uses: ./.github/actions/container_setup + + - name: Find Changed Files + uses: dorny/paths-filter@v3 + id: changes + with: + filters: | + global_infra: + - 'tf/**' + frontend: + - 'frontend/**' + backend: + - 'backend/**' - name: Deploy Global Infrastructure shell: bash + if: ${{ github.event_name }} == 'create' || ${{ steps.changes.outputs.global_infra }} == 'true' run: make deploy_infra - name: Deploy Backend + if: ${{ github.event_name }} == 'create' || ${{ steps.changes.outputs.backend }} == 'true' shell: bash run: cd backend && make deploy - name: Deploy Frontend + if: ${{ github.event_name }} == 'create' || ${{ steps.changes.outputs.frontend }} == 'true' shell: bash run: . $NVM_DIR/nvm.sh && cd frontend && make deploy From 25ae4b07a060a5d244cd8f04b37c2b2a8930a8c2 Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Sat, 21 Sep 2024 17:12:54 +0800 Subject: [PATCH 21/65] feat: Add API Urls on PRs --- .github/workflows/pr_setup.yml | 46 ++++++++++++++++++++++++++++++++++ backend/Makefile | 4 +-- frontend/Makefile | 10 ++++++-- 3 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/pr_setup.yml diff --git a/.github/workflows/pr_setup.yml b/.github/workflows/pr_setup.yml new file mode 100644 index 0000000000..63f6f7693e --- /dev/null +++ b/.github/workflows/pr_setup.yml @@ -0,0 +1,46 @@ +# This is a basic workflow to help you get started with Actions + +name: Setup Actions on new Pull Request + +# Controls when the workflow will run +on: + # Triggers the workflow on push or pull request events but only for the "main" branch + pull_request: + types: [opened, synchronize] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + test: + # The type of runner that the job will run on + runs-on: ubuntu-latest + container: + image: kimyongbeom/peerprep-actions-runner:latest + env: + AGE_SECRET_KEY: ${{ secrets.AGE_SECRET_KEY }} + volumes: + - /var/run/docker.sock:/var/run/docker.sock + options: --privileged + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/container_setup + - name: Get all deployment URLs + id: urls + run: | + echo "::set-output name=frontend::$(cd frontend && make url)" + echo "::set-output name=backend::$(cd backend && make url)" + + + - name: Add a comment to the pull request + uses: peter-evans/create-or-update-comment@v3 + with: + token: ${{ secrets.GITHUB_TOKEN }} + issue-number: ${{ github.event.pull_request.number }} + body: | + Frontend URL: ${{ steps.urls.outputs.frontend }} + Backend URL: ${{ steps.urls.outputs.backend }} diff --git a/backend/Makefile b/backend/Makefile index 9479d4abba..2ab8b98873 100644 --- a/backend/Makefile +++ b/backend/Makefile @@ -25,8 +25,8 @@ infra_destroy: cd tf && \ tofu destroy -auto-approve -api_url: +url: @ . ./source.sh && \ cd tf && \ - tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ + tofu workspace select -or-create $$TERRAFORM_WORKSPACE &> /dev/null && \ tofu output -raw service_url \ No newline at end of file diff --git a/frontend/Makefile b/frontend/Makefile index 42097b65fc..1c4b3605fa 100644 --- a/frontend/Makefile +++ b/frontend/Makefile @@ -3,7 +3,7 @@ SHELL=/bin/bash deploy: infra_deploy code_deploy destroy: infra_destroy -BACKEND_SERVICE_URL=$(shell cd ../backend && $(MAKE) -s api_url | head -n 2) +BACKEND_SERVICE_URL=$(shell cd ../backend && $(MAKE) -s url | head -n 2) test: @echo $(BACKEND_SERVICE_URL) serve: @@ -41,4 +41,10 @@ infra_destroy: . ./source.sh && \ cd tf && \ tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ - tofu destroy -auto-approve \ \ No newline at end of file + tofu destroy -auto-approve \ + +url: + @. ./source.sh && \ + cd tf && \ + tofu workspace select -or-create $$TERRAFORM_WORKSPACE &> /dev/null && \ + tofu output -raw frontend_bucket_website_url \ No newline at end of file From 0858d6fc5ea730db4f84f731bbb45c0016a8f4c5 Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Sat, 21 Sep 2024 17:23:10 +0800 Subject: [PATCH 22/65] test --- .github/workflows/pr_setup.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr_setup.yml b/.github/workflows/pr_setup.yml index 63f6f7693e..ec1126d3fc 100644 --- a/.github/workflows/pr_setup.yml +++ b/.github/workflows/pr_setup.yml @@ -24,6 +24,10 @@ jobs: volumes: - /var/run/docker.sock:/var/run/docker.sock options: --privileged + + permissions: + contents: read + pull-requests: write # Steps represent a sequence of tasks that will be executed as part of the job steps: @@ -32,8 +36,8 @@ jobs: - name: Get all deployment URLs id: urls run: | - echo "::set-output name=frontend::$(cd frontend && make url)" - echo "::set-output name=backend::$(cd backend && make url)" + echo frontend=$(cd frontend && make url) >> $GITHUB_OUTPUT + echo backend=$(cd backend && make url) >> $GITHUB_OUTPUT - name: Add a comment to the pull request From a14789185d1cae12b13335d5350e8ca24658c81e Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Sat, 21 Sep 2024 17:25:36 +0800 Subject: [PATCH 23/65] test --- backend/Makefile | 1 + frontend/Makefile | 1 + 2 files changed, 2 insertions(+) diff --git a/backend/Makefile b/backend/Makefile index 2ab8b98873..23c0c4612c 100644 --- a/backend/Makefile +++ b/backend/Makefile @@ -28,5 +28,6 @@ infra_destroy: url: @ . ./source.sh && \ cd tf && \ + tofu init &> /dev/null && \ tofu workspace select -or-create $$TERRAFORM_WORKSPACE &> /dev/null && \ tofu output -raw service_url \ No newline at end of file diff --git a/frontend/Makefile b/frontend/Makefile index 1c4b3605fa..b0326d2694 100644 --- a/frontend/Makefile +++ b/frontend/Makefile @@ -46,5 +46,6 @@ infra_destroy: url: @. ./source.sh && \ cd tf && \ + tofu init &> /dev/null && \ tofu workspace select -or-create $$TERRAFORM_WORKSPACE &> /dev/null && \ tofu output -raw frontend_bucket_website_url \ No newline at end of file From dbb3917792d0fa47c22979300fb20bf1aec24291 Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Sat, 21 Sep 2024 21:57:49 +0800 Subject: [PATCH 24/65] feat: make urls from base directlry to get all service URLs --- Makefile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Makefile b/Makefile index 909665f4be..4d836c2665 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,6 @@ SHELL := /bin/bash +MAKEFLAGS += --no-print-directory + .PHONY: help gcloud_auth deploy_tf_backend destroy_tf_backend @@ -7,6 +9,10 @@ help: ## Display this help text @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[$$()% 0-9a-zA-Z_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) +urls: ## Get the URL endpoints of all deployed resources. + @echo "FRONTEND_URL: $$(cd frontend && $(MAKE) url)" + @echo "BACKEND_URL: $$(cd backend && $(MAKE) url)" + ## ## Google Cloud CLI ## From cc75956fb16118826875c29feab5f3c998bf646a Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Sat, 21 Sep 2024 17:12:54 +0800 Subject: [PATCH 25/65] feat: Add API Urls on PRs --- .github/workflows/pr_setup.yml | 50 ++++++++++++++++++++++++++++++++++ backend/Makefile | 5 ++-- frontend/Makefile | 11 ++++++-- 3 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/pr_setup.yml diff --git a/.github/workflows/pr_setup.yml b/.github/workflows/pr_setup.yml new file mode 100644 index 0000000000..ec1126d3fc --- /dev/null +++ b/.github/workflows/pr_setup.yml @@ -0,0 +1,50 @@ +# This is a basic workflow to help you get started with Actions + +name: Setup Actions on new Pull Request + +# Controls when the workflow will run +on: + # Triggers the workflow on push or pull request events but only for the "main" branch + pull_request: + types: [opened, synchronize] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + test: + # The type of runner that the job will run on + runs-on: ubuntu-latest + container: + image: kimyongbeom/peerprep-actions-runner:latest + env: + AGE_SECRET_KEY: ${{ secrets.AGE_SECRET_KEY }} + volumes: + - /var/run/docker.sock:/var/run/docker.sock + options: --privileged + + permissions: + contents: read + pull-requests: write + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/container_setup + - name: Get all deployment URLs + id: urls + run: | + echo frontend=$(cd frontend && make url) >> $GITHUB_OUTPUT + echo backend=$(cd backend && make url) >> $GITHUB_OUTPUT + + + - name: Add a comment to the pull request + uses: peter-evans/create-or-update-comment@v3 + with: + token: ${{ secrets.GITHUB_TOKEN }} + issue-number: ${{ github.event.pull_request.number }} + body: | + Frontend URL: ${{ steps.urls.outputs.frontend }} + Backend URL: ${{ steps.urls.outputs.backend }} diff --git a/backend/Makefile b/backend/Makefile index 9479d4abba..23c0c4612c 100644 --- a/backend/Makefile +++ b/backend/Makefile @@ -25,8 +25,9 @@ infra_destroy: cd tf && \ tofu destroy -auto-approve -api_url: +url: @ . ./source.sh && \ cd tf && \ - tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ + tofu init &> /dev/null && \ + tofu workspace select -or-create $$TERRAFORM_WORKSPACE &> /dev/null && \ tofu output -raw service_url \ No newline at end of file diff --git a/frontend/Makefile b/frontend/Makefile index 42097b65fc..b0326d2694 100644 --- a/frontend/Makefile +++ b/frontend/Makefile @@ -3,7 +3,7 @@ SHELL=/bin/bash deploy: infra_deploy code_deploy destroy: infra_destroy -BACKEND_SERVICE_URL=$(shell cd ../backend && $(MAKE) -s api_url | head -n 2) +BACKEND_SERVICE_URL=$(shell cd ../backend && $(MAKE) -s url | head -n 2) test: @echo $(BACKEND_SERVICE_URL) serve: @@ -41,4 +41,11 @@ infra_destroy: . ./source.sh && \ cd tf && \ tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ - tofu destroy -auto-approve \ \ No newline at end of file + tofu destroy -auto-approve \ + +url: + @. ./source.sh && \ + cd tf && \ + tofu init &> /dev/null && \ + tofu workspace select -or-create $$TERRAFORM_WORKSPACE &> /dev/null && \ + tofu output -raw frontend_bucket_website_url \ No newline at end of file From 3d0e20b44b0ce2790f8c33fce6ede819d5b1a7dc Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Sat, 21 Sep 2024 21:57:49 +0800 Subject: [PATCH 26/65] feat: make urls from base directlry to get all service URLs --- Makefile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Makefile b/Makefile index 909665f4be..4d836c2665 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,6 @@ SHELL := /bin/bash +MAKEFLAGS += --no-print-directory + .PHONY: help gcloud_auth deploy_tf_backend destroy_tf_backend @@ -7,6 +9,10 @@ help: ## Display this help text @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[$$()% 0-9a-zA-Z_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) +urls: ## Get the URL endpoints of all deployed resources. + @echo "FRONTEND_URL: $$(cd frontend && $(MAKE) url)" + @echo "BACKEND_URL: $$(cd backend && $(MAKE) url)" + ## ## Google Cloud CLI ## From 62ab0717e161628f8d708b7296da267af22efcbd Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Sat, 21 Sep 2024 22:06:53 +0800 Subject: [PATCH 27/65] fix: Makefile destroy scripts --- Makefile | 1 + backend/Makefile | 3 ++- frontend/Makefile | 7 +++++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 4d836c2665..fda24aa438 100644 --- a/Makefile +++ b/Makefile @@ -36,6 +36,7 @@ deploy_infra: ## Deploy Global OpenTofu/Terraform infrastructure destroy_infra: ## Destroy Global OpenTofu/Terraform infrastructure . source.sh && \ cd tf && \ + tofu init && \ tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ tofu destroy -auto-approve diff --git a/backend/Makefile b/backend/Makefile index 23c0c4612c..a5fff3383e 100644 --- a/backend/Makefile +++ b/backend/Makefile @@ -21,8 +21,9 @@ infra_deploy: infra_destroy: . ./source.sh && - tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ cd tf && \ + tofu init && \ + tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ tofu destroy -auto-approve url: diff --git a/frontend/Makefile b/frontend/Makefile index b0326d2694..bbfcb5c569 100644 --- a/frontend/Makefile +++ b/frontend/Makefile @@ -4,8 +4,10 @@ deploy: infra_deploy code_deploy destroy: infra_destroy BACKEND_SERVICE_URL=$(shell cd ../backend && $(MAKE) -s url | head -n 2) + test: @echo $(BACKEND_SERVICE_URL) + serve: @if [[ "$(BACKEND_SERVICE_URL)" == *"No outputs found"* ]] ; then \ echo "Backend service URL not found, please go to the backend service and deploy it first."; \ @@ -30,7 +32,7 @@ code_deploy: code_build gsutil -m cp -r dist/** $$bucket_url && \ cd tf && tofu output -infra_deploy: tf/* +infra_deploy: . ./source.sh && \ cd tf && \ tofu init && \ @@ -40,7 +42,8 @@ infra_deploy: tf/* infra_destroy: . ./source.sh && \ cd tf && \ - tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ + tofu init && \ + tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ tofu destroy -auto-approve \ url: From 62c6a6f9664b1a5d027a12d17cc95b3baa4284d2 Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Sat, 21 Sep 2024 22:24:51 +0800 Subject: [PATCH 28/65] fix: Fix cleanup branch bug --- .github/workflows/cleanup_branch.yml | 2 ++ backend/Makefile | 2 +- frontend/Makefile | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cleanup_branch.yml b/.github/workflows/cleanup_branch.yml index 94797e891a..cd37d1c9e7 100644 --- a/.github/workflows/cleanup_branch.yml +++ b/.github/workflows/cleanup_branch.yml @@ -31,6 +31,8 @@ jobs: steps: - uses: actions/checkout@v4 - uses: ./.github/actions/container_setup + with: + branch: ${{ github.event.pull_request.head.ref }} - name: Destroy Global Infrastructure shell: bash diff --git a/backend/Makefile b/backend/Makefile index a5fff3383e..df0daac9db 100644 --- a/backend/Makefile +++ b/backend/Makefile @@ -20,7 +20,7 @@ infra_deploy: tofu apply -auto-approve infra_destroy: - . ./source.sh && + . ./source.sh && \ cd tf && \ tofu init && \ tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ diff --git a/frontend/Makefile b/frontend/Makefile index bbfcb5c569..6487536c58 100644 --- a/frontend/Makefile +++ b/frontend/Makefile @@ -37,7 +37,7 @@ infra_deploy: cd tf && \ tofu init && \ tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ - tofu apply -auto-approve \ + tofu apply -auto-approve infra_destroy: . ./source.sh && \ From 349f69a8a2a5663a233cfde6a40f58f54f957ff8 Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Sat, 21 Sep 2024 22:32:22 +0800 Subject: [PATCH 29/65] fix: Fix ref reference in cleanup_branch.yml --- .github/workflows/cleanup_branch.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cleanup_branch.yml b/.github/workflows/cleanup_branch.yml index cd37d1c9e7..c2da47055c 100644 --- a/.github/workflows/cleanup_branch.yml +++ b/.github/workflows/cleanup_branch.yml @@ -32,7 +32,7 @@ jobs: - uses: actions/checkout@v4 - uses: ./.github/actions/container_setup with: - branch: ${{ github.event.pull_request.head.ref }} + ref: ${{ github.event.pull_request.head.ref }} - name: Destroy Global Infrastructure shell: bash From fb6a421ba9b8a05d489450dcf944677760facaeb Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Sat, 21 Sep 2024 22:38:22 +0800 Subject: [PATCH 30/65] feat(GH Actions): Add concurrency control --- .github/workflows/cleanup_branch.yml | 4 +++- .github/workflows/on_pr.yml | 3 +++ .github/workflows/on_push.yml | 3 +++ .github/workflows/pr_setup.yml | 3 +++ 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.github/workflows/cleanup_branch.yml b/.github/workflows/cleanup_branch.yml index c2da47055c..60e5fe8108 100644 --- a/.github/workflows/cleanup_branch.yml +++ b/.github/workflows/cleanup_branch.yml @@ -25,7 +25,9 @@ jobs: volumes: - /var/run/docker.sock:/var/run/docker.sock options: --privileged - + concurrency: + # current branch + group: ${{ github.event.pull_request.head.ref }} # Steps represent a sequence of tasks that will be executed as part of the job steps: diff --git a/.github/workflows/on_pr.yml b/.github/workflows/on_pr.yml index 1f4bb1c79e..acb5993f92 100644 --- a/.github/workflows/on_pr.yml +++ b/.github/workflows/on_pr.yml @@ -23,6 +23,9 @@ jobs: volumes: - /var/run/docker.sock:/var/run/docker.sock options: --privileged + concurrency: + # current branch + group: ${{ github.ref_name }} # Steps represent a sequence of tasks that will be executed as part of the job steps: diff --git a/.github/workflows/on_push.yml b/.github/workflows/on_push.yml index 2b4f364017..f13d279445 100644 --- a/.github/workflows/on_push.yml +++ b/.github/workflows/on_push.yml @@ -25,6 +25,9 @@ jobs: volumes: - /var/run/docker.sock:/var/run/docker.sock options: --privileged + concurrency: + # current branch + group: ${{ github.ref_name }} # Steps represent a sequence of tasks that will be executed as part of the job diff --git a/.github/workflows/pr_setup.yml b/.github/workflows/pr_setup.yml index ec1126d3fc..00b94535c8 100644 --- a/.github/workflows/pr_setup.yml +++ b/.github/workflows/pr_setup.yml @@ -24,6 +24,9 @@ jobs: volumes: - /var/run/docker.sock:/var/run/docker.sock options: --privileged + concurrency: + # current branch + group: ${{ github.head_ref }} permissions: contents: read From a57755b03e909c0ebf8a8a2eac0fbe28d0755c7f Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Sat, 21 Sep 2024 22:42:23 +0800 Subject: [PATCH 31/65] fix(GH Actions): Fix concurrency group key --- .github/workflows/on_pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/on_pr.yml b/.github/workflows/on_pr.yml index acb5993f92..0077a8b2a0 100644 --- a/.github/workflows/on_pr.yml +++ b/.github/workflows/on_pr.yml @@ -25,7 +25,7 @@ jobs: options: --privileged concurrency: # current branch - group: ${{ github.ref_name }} + group: ${{ github.head_ref }} # Steps represent a sequence of tasks that will be executed as part of the job steps: From b399dae075536ce38a0f67bd73ac84ba45cbda9f Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Sat, 21 Sep 2024 22:43:20 +0800 Subject: [PATCH 32/65] fix(scripts): Fix frontend infra_destroy scripts --- frontend/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/Makefile b/frontend/Makefile index 6487536c58..e60161267b 100644 --- a/frontend/Makefile +++ b/frontend/Makefile @@ -44,7 +44,7 @@ infra_destroy: cd tf && \ tofu init && \ tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ - tofu destroy -auto-approve \ + tofu destroy -auto-approve url: @. ./source.sh && \ From a48aa073607903eb00953ceeb4087a81f143c561 Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Sat, 21 Sep 2024 22:49:24 +0800 Subject: [PATCH 33/65] fix: Fix bugs in cleanup script --- frontend/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/Makefile b/frontend/Makefile index e60161267b..cd672d5371 100644 --- a/frontend/Makefile +++ b/frontend/Makefile @@ -43,7 +43,7 @@ infra_destroy: . ./source.sh && \ cd tf && \ tofu init && \ - tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ + tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ tofu destroy -auto-approve url: From ae11a99c0b32667177f4e22ab7c0521bd4af0c0c Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Sat, 21 Sep 2024 22:56:12 +0800 Subject: [PATCH 34/65] test --- .github/workflows/cleanup_branch.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cleanup_branch.yml b/.github/workflows/cleanup_branch.yml index 60e5fe8108..3b8daef5c5 100644 --- a/.github/workflows/cleanup_branch.yml +++ b/.github/workflows/cleanup_branch.yml @@ -32,9 +32,9 @@ jobs: # Steps represent a sequence of tasks that will be executed as part of the job steps: - uses: actions/checkout@v4 - - uses: ./.github/actions/container_setup with: ref: ${{ github.event.pull_request.head.ref }} + - uses: ./.github/actions/container_setup - name: Destroy Global Infrastructure shell: bash From 16f2aa43655cc6c2f60f1df3495fceea7185085c Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Sat, 21 Sep 2024 23:08:54 +0800 Subject: [PATCH 35/65] test --- .github/workflows/cleanup_branch.yml | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/.github/workflows/cleanup_branch.yml b/.github/workflows/cleanup_branch.yml index 3b8daef5c5..5ed248309e 100644 --- a/.github/workflows/cleanup_branch.yml +++ b/.github/workflows/cleanup_branch.yml @@ -13,7 +13,7 @@ on: # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: - cleanup: + cleanup_infra: # Run only if PR is merged if: github.event.pull_request.merged == true # The type of runner that the job will run on @@ -47,4 +47,20 @@ jobs: - name: Destroy Frontend shell: bash run: . $NVM_DIR/nvm.sh && cd frontend && make destroy + + cleanup_branch: + runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: write + steps: + - uses: actions/github-script@v3 + with: + github-token: ${{secrets.GITHUB_TOKEN}} + script: | + github.git.deleteRef({ + owner: context.repo.owner, + repo: context.repo.repo, + ref: ${{ github.event.pull_request.head.ref }} + }) From d2d8c4818d6d1543056aa5361db1d43d70d32da2 Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Sat, 21 Sep 2024 23:14:09 +0800 Subject: [PATCH 36/65] fix: Fix ref --- .github/workflows/cleanup_branch.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cleanup_branch.yml b/.github/workflows/cleanup_branch.yml index 5ed248309e..c91f7b566e 100644 --- a/.github/workflows/cleanup_branch.yml +++ b/.github/workflows/cleanup_branch.yml @@ -55,12 +55,12 @@ jobs: pull-requests: write steps: - - uses: actions/github-script@v3 + - uses: actions/github-script@v7 with: github-token: ${{secrets.GITHUB_TOKEN}} script: | - github.git.deleteRef({ + github.rest.git.deleteRef({ owner: context.repo.owner, repo: context.repo.repo, - ref: ${{ github.event.pull_request.head.ref }} + ref: refs/heads/${{ github.event.pull_request.head.ref }} }) From eb52928b380197a17ad0356baaa9e1c04b99d2a4 Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Sat, 21 Sep 2024 23:18:09 +0800 Subject: [PATCH 37/65] fix: Fix cleanup branch script --- .github/workflows/cleanup_branch.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cleanup_branch.yml b/.github/workflows/cleanup_branch.yml index c91f7b566e..86afc226c6 100644 --- a/.github/workflows/cleanup_branch.yml +++ b/.github/workflows/cleanup_branch.yml @@ -59,8 +59,8 @@ jobs: with: github-token: ${{secrets.GITHUB_TOKEN}} script: | - github.rest.git.deleteRef({ + github.rest.git.deleteRef({ owner: context.repo.owner, repo: context.repo.repo, - ref: refs/heads/${{ github.event.pull_request.head.ref }} + ref: `heads/${context.payload.pull_request.head.ref}` }) From 73853b113f11c25f6935e1924ac329025edc21b0 Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Sat, 21 Sep 2024 23:26:27 +0800 Subject: [PATCH 38/65] fix: Fix Branch cleanup action --- .github/workflows/cleanup_branch.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/cleanup_branch.yml b/.github/workflows/cleanup_branch.yml index 86afc226c6..12e98f7d0e 100644 --- a/.github/workflows/cleanup_branch.yml +++ b/.github/workflows/cleanup_branch.yml @@ -56,11 +56,13 @@ jobs: steps: - uses: actions/github-script@v7 + env: + BRANCH_NAME: ${{ github.event.pull_request.head.ref }} with: github-token: ${{secrets.GITHUB_TOKEN}} script: | github.rest.git.deleteRef({ owner: context.repo.owner, repo: context.repo.repo, - ref: `heads/${context.payload.pull_request.head.ref}` + ref: `heads/${process.env.BRANCH_NAME}` }) From 3042a3b39383c8d43dce2e74a5eb13d393e5868d Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Sat, 21 Sep 2024 23:40:00 +0800 Subject: [PATCH 39/65] fix: --- .github/workflows/cleanup_branch.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/cleanup_branch.yml b/.github/workflows/cleanup_branch.yml index 12e98f7d0e..ad76bed2a6 100644 --- a/.github/workflows/cleanup_branch.yml +++ b/.github/workflows/cleanup_branch.yml @@ -18,6 +18,7 @@ jobs: if: github.event.pull_request.merged == true # The type of runner that the job will run on runs-on: ubuntu-latest + container: image: kimyongbeom/peerprep-actions-runner:latest env: @@ -25,10 +26,13 @@ jobs: volumes: - /var/run/docker.sock:/var/run/docker.sock options: --privileged + concurrency: # current branch group: ${{ github.event.pull_request.head.ref }} + permissions: write-all + # Steps represent a sequence of tasks that will be executed as part of the job steps: - uses: actions/checkout@v4 From 94d6a34cb7e8b4fdec6d254171bd1d0e13a33876 Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Sat, 21 Sep 2024 23:46:09 +0800 Subject: [PATCH 40/65] feat: Delete attempt at clean up merged branch --- .github/workflows/cleanup_branch.yml | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/.github/workflows/cleanup_branch.yml b/.github/workflows/cleanup_branch.yml index ad76bed2a6..7d01fa1240 100644 --- a/.github/workflows/cleanup_branch.yml +++ b/.github/workflows/cleanup_branch.yml @@ -50,23 +50,4 @@ jobs: - name: Destroy Frontend shell: bash - run: . $NVM_DIR/nvm.sh && cd frontend && make destroy - - cleanup_branch: - runs-on: ubuntu-latest - permissions: - contents: read - pull-requests: write - - steps: - - uses: actions/github-script@v7 - env: - BRANCH_NAME: ${{ github.event.pull_request.head.ref }} - with: - github-token: ${{secrets.GITHUB_TOKEN}} - script: | - github.rest.git.deleteRef({ - owner: context.repo.owner, - repo: context.repo.repo, - ref: `heads/${process.env.BRANCH_NAME}` - }) + run: . $NVM_DIR/nvm.sh && cd frontend && make destroy \ No newline at end of file From 2a05f230ffcb8b270bdec39fcf3e8461a431021d Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Mon, 23 Sep 2024 13:44:50 +0800 Subject: [PATCH 41/65] feat: Make local for local deployment --- Makefile | 6 ++---- backend/Makefile | 32 +++++++++++++++++++++++--------- backend/index.ts | 2 +- backend/source.sh | 3 +-- frontend/Makefile | 41 ++++++++++++++++++++++------------------- frontend/src/App.tsx | 2 +- source.sh | 2 ++ tf_backend/bucket.tf | 4 ++++ 8 files changed, 56 insertions(+), 36 deletions(-) diff --git a/Makefile b/Makefile index fda24aa438..0e10953bc4 100644 --- a/Makefile +++ b/Makefile @@ -49,12 +49,10 @@ deploy_tf_backend: ## Deploy the OpenTofu/Terraform backend to GCP unset TF_WORKSPACE && \ cd tf_backend && \ tofu init && \ - tofu apply -auto-approve \ - -var="bucket_name=$$TF_BACKEND_BUCKET_NAME" + tofu apply -auto-approve destroy_tf_backend: ## Destroy the OpenTofu/Terraform backend on GCP . source.sh && \ unset TF_WORKSPACE && \ cd tf_backend && \ - tofu destroy -auto-approve \ - -var="bucket_name=$$TF_BACKEND_BUCKET_NAME" \ No newline at end of file + tofu destroy -auto-approve \ No newline at end of file diff --git a/backend/Makefile b/backend/Makefile index df0daac9db..ad4560c27c 100644 --- a/backend/Makefile +++ b/backend/Makefile @@ -1,34 +1,48 @@ SHELL=/bin/bash -deploy: infra_deploy code_deploy -destroy: infra_destroy +help: ## Show this help + @echo "Usage: make [target]" + @echo "Targets:" + @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " %-20s %s\n", $$1, $$2}' $(MAKEFILE_LIST) -code_build: +local: code_build ## Run the code locally . ./source.sh && \ - docker build -t $$DOCKER_IMAGE_NAME . + docker run -p $$EXPOSED_PORT:$$EXPOSED_PORT $$DOCKER_IMAGE_NAME + echo "Service is running on http://localhost:$$EXPOSED_PORT" -code_deploy: code_build infra_deploy +deploy: infra_deploy code_deploy ## Deploy the code and infrastructure +destroy: infra_destroy ## Destroy the infrastructure + +code_build: ## Build the code + . ./source.sh && \ + docker build -t $$DOCKER_IMAGE_NAME --build-arg="PORT=$$EXPOSED_PORT" . + +code_deploy: code_build infra_deploy ## Deploy the code . ./source.sh && \ docker push $$DOCKER_IMAGE_NAME && \ gcloud run deploy $$CLOUD_RUN_SERVICE_NAME --project $$GCLOUD_PROJECT --image $$DOCKER_IMAGE_NAME --port $$EXPOSED_PORT --region $$GCLOUD_REGION --allow-unauthenticated -infra_deploy: +infra_deploy: ## Deploy the infrastructure . ./source.sh && \ cd tf && \ tofu init && \ tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ tofu apply -auto-approve -infra_destroy: +infra_destroy: ## Destroy the infrastructure . ./source.sh && \ cd tf && \ tofu init && \ tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ tofu destroy -auto-approve -url: +url: ## Get the service URL @ . ./source.sh && \ cd tf && \ tofu init &> /dev/null && \ tofu workspace select -or-create $$TERRAFORM_WORKSPACE &> /dev/null && \ - tofu output -raw service_url \ No newline at end of file + tofu output -raw service_url + +local_url: ## Get the local service URL + @ . ./source.sh && \ + echo http://localhost:$$EXPOSED_PORT \ No newline at end of file diff --git a/backend/index.ts b/backend/index.ts index 00f555fcb9..ad1974014e 100644 --- a/backend/index.ts +++ b/backend/index.ts @@ -11,5 +11,5 @@ app.get('/hello', (req, res) => { }); app.listen(PORT, () => { - console.log('Server is running on localhost:3333'); + console.log('Server is running on localhost:' + PORT); }) diff --git a/backend/source.sh b/backend/source.sh index d53ac266ca..ced24d1c8a 100644 --- a/backend/source.sh +++ b/backend/source.sh @@ -6,11 +6,10 @@ set -o allexport SERVICE_NAME=backend -GCLOUD_REPOSITORY_URL=$(cd ../tf && tofu output -raw repository_url) TF_VAR_service_name=${SERVICE_NAME} DOCKER_IMAGE_NAME=${GCLOUD_REPOSITORY_URL}/${SERVICE_NAME}:$(git rev-parse HEAD) -CLOUD_RUN_SERVICE_NAME=${GCLOUD_PROJECT}-${SERVICE_NAME}-${ENV} +CLOUD_RUN_SERVICE_NAME=$(echo ${GCLOUD_PROJECT}-${SERVICE_NAME}-${ENV} | head -c 49) # Max length is 50 characters TF_VAR_cloud_run_service_name=${CLOUD_RUN_SERVICE_NAME} EXPOSED_PORT=8080 diff --git a/frontend/Makefile b/frontend/Makefile index cd672d5371..a4a3a21449 100644 --- a/frontend/Makefile +++ b/frontend/Makefile @@ -1,52 +1,55 @@ SHELL=/bin/bash -deploy: infra_deploy code_deploy -destroy: infra_destroy +BACKEND_CLOUD_SERVICE_URL=$(shell $(MAKE) -C ../backend -s url | head -n 2) +BACKEND_LOCAL_SERVICE_URL=$(shell $(MAKE) -C ../backend -s local_url) -BACKEND_SERVICE_URL=$(shell cd ../backend && $(MAKE) -s url | head -n 2) +help: ## Show this help + @echo "Usage: make [target]" + @echo "Targets:" + @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " %-20s %s\n", $$1, $$2}' $(MAKEFILE_LIST) -test: - @echo $(BACKEND_SERVICE_URL) - -serve: - @if [[ "$(BACKEND_SERVICE_URL)" == *"No outputs found"* ]] ; then \ - echo "Backend service URL not found, please go to the backend service and deploy it first."; \ - exit 1; \ - fi - export VITE_BACKEND_SERVICE_URL=$(BACKEND_SERVICE_URL) && \ +local: ## Run the code locally + export VITE_BACKEND_SERVICE_URL="$(BACKEND_LOCAL_SERVICE_URL)" && \ yarn run dev -code_build: - @if [[ "$(BACKEND_SERVICE_URL)" == *"No outputs found"* ]] ; then \ +deploy: infra_deploy code_deploy ## Deploy the code and infrastructure +destroy: infra_destroy ## Destroy the infrastructure + + +test: ## Run the tests + @echo $(BACKEND_CLOUD_SERVICE_URL) + +code_build: ## Build the code + @if [[ "$(BACKEND_CLOUD_SERVICE_URL)" == *"No outputs found"* ]] ; then \ echo "Backend service URL not found, please go to the backend service and deploy it first."; \ exit 1; \ fi - export VITE_BACKEND_SERVICE_URL=$(BACKEND_SERVICE_URL) && \ + export VITE_BACKEND_SERVICE_URL=$(BACKEND_CLOUD_SERVICE_URL) && \ yarn && \ yarn run build -code_deploy: code_build +code_deploy: code_build ## Deploy the code . ./source.sh && \ bucket_url=$$(cd tf && tofu output -raw frontend_bucket_url) && \ gsutil -m rm $$bucket_url/'**' || true && \ gsutil -m cp -r dist/** $$bucket_url && \ cd tf && tofu output -infra_deploy: +infra_deploy: ## Deploy the infrastructure . ./source.sh && \ cd tf && \ tofu init && \ tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ tofu apply -auto-approve -infra_destroy: +infra_destroy: ## Destroy the infrastructure . ./source.sh && \ cd tf && \ tofu init && \ tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ tofu destroy -auto-approve -url: +url: ## Get the service URL @. ./source.sh && \ cd tf && \ tofu init &> /dev/null && \ diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 04fc7f0d9f..e64ceb9fc1 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -5,7 +5,7 @@ import './App.css' import axios from 'axios' axios.defaults.baseURL = import.meta.env.VITE_BACKEND_SERVICE_URL - +console.log('Backend service URL:', axios.defaults.baseURL) function App() { const [count, setCount] = useState(0) diff --git a/source.sh b/source.sh index 6f145fd5f9..e4e2d4ea46 100755 --- a/source.sh +++ b/source.sh @@ -28,4 +28,6 @@ fi # https://discuss.hashicorp.com/t/help-using-terraform-workspaces-in-an-automation-pipeline-with-tf-workspace-currently-selected-workspace-x-does-not-exist/40676 TERRAFORM_WORKSPACE=$ENV +GCLOUD_REPOSITORY_URL=${GCLOUD_REGION}-docker.pkg.dev/${GCLOUD_PROJECT}/${ENV} + set +o allexport \ No newline at end of file diff --git a/tf_backend/bucket.tf b/tf_backend/bucket.tf index d8cfd90b39..003c43ab1c 100644 --- a/tf_backend/bucket.tf +++ b/tf_backend/bucket.tf @@ -10,5 +10,9 @@ resource "google_storage_bucket" "tf_state" { versioning { enabled = true } + + lifecycle { + prevent_destroy = true + } } From fe240fc4997fcbef6725b428b116df0f18a7bf1a Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Mon, 23 Sep 2024 13:50:34 +0800 Subject: [PATCH 42/65] feat: Remove tag immutability --- tf/registry.tf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tf/registry.tf b/tf/registry.tf index 597e2bfc60..999d5b9101 100644 --- a/tf/registry.tf +++ b/tf/registry.tf @@ -4,7 +4,8 @@ resource "google_artifact_registry_repository" "repo" { format = "DOCKER" docker_config { - immutable_tags = true + # immutable_tags = true + immutable_tags = false # This sucks, but it fixes some issues with the actions. FIXME: Enable this without triggering errors due to commit hash not being updated with unstaged commits. } } From 7772ef2dcc88cf8f74916f8b6e210b708788511c Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Mon, 23 Sep 2024 23:15:29 +0800 Subject: [PATCH 43/65] docs: Deployment documentation --- Makefile | 11 +++++++++++ README.md | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/Makefile b/Makefile index 0e10953bc4..bdd9c3028d 100644 --- a/Makefile +++ b/Makefile @@ -22,6 +22,17 @@ gcloud_auth: ## Authenticate with gcloud gcloud auth activate-service-account --key-file=$$GOOGLE_APPLICATION_CREDENTIALS && \ gcloud auth configure-docker $$GCLOUD_REGION-docker.pkg.dev --quiet +## Repo-wide +deploy_all: ## Deploy all infrastructure and code + $(MAKE) deploy_infra + $(MAKE) -C frontend deploy + $(MAKE) -C backend deploy + +destroy_all: ## Destroy all infrastructure and code + $(MAKE) destroy_infra + $(MAKE) -C frontend destroy + $(MAKE) -C backend destroy + ## ## Global Terraform Infrastructure ## diff --git a/README.md b/README.md index abb3e61fd6..e206ffbee9 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,55 @@ | Make | 4 | | Bash | 5 | +## Developer Guide + +Here are the scripts relevant in deploying the project. + +### Code and Infrastructure Deployment + +There are two ways to deploy the project to the cloud. + +First, you can simply push to your feature branch, and the CI/CD pipeline will deploy a copy of the infrastructure and the code to the cloud. + +To deploy all infrastructure on the command line, you can run the following command: +```bash +# You may have to authenticate to gcloud first: +make gcloud_auth # You need your age key in the sops file, contact Yongbeom for how to do this. + +make deploy_all + +# This is equivalent to running +make deploy_infra +make deploy # in frontend +make deploy # in backend +``` + + +### Code Deployment + +Once you have deployed the infrastructure, you do not need to do so again, you can simply update our deployment by deploying code. + +To deploy the code, you can do: +```bash +# deploy frontend code +make code_deploy # in frontend directory + +# deploy backend code +make code_deploy # in backend directory +``` + +### Local Deployment + +Alternatively, you can deploy the code locally. + +Run the following commands (in separate terminals) to deploy the frontend and backend code locally. +```bash +# deploy frontend code +make local + +# deploy backend code +make local +``` ## Directory Structure All direct subdirectories of the project base directory (with the following exceptions) are microservices. From 505f8feae5dbb1c2a012c69ce7733b11dfd35933 Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Tue, 24 Sep 2024 00:15:32 +0800 Subject: [PATCH 44/65] feat: Change . source to . ./source --- Makefile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index bdd9c3028d..6381579930 100644 --- a/Makefile +++ b/Makefile @@ -18,7 +18,7 @@ urls: ## Get the URL endpoints of all deployed resources. ## gcloud_auth: ## Authenticate with gcloud - . source.sh && \ + . ./source.sh && \ gcloud auth activate-service-account --key-file=$$GOOGLE_APPLICATION_CREDENTIALS && \ gcloud auth configure-docker $$GCLOUD_REGION-docker.pkg.dev --quiet @@ -38,14 +38,14 @@ destroy_all: ## Destroy all infrastructure and code ## deploy_infra: ## Deploy Global OpenTofu/Terraform infrastructure - . source.sh && \ + . ./source.sh && \ cd tf && \ tofu init && \ tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ tofu apply -auto-approve destroy_infra: ## Destroy Global OpenTofu/Terraform infrastructure - . source.sh && \ + . ./source.sh && \ cd tf && \ tofu init && \ tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ @@ -56,14 +56,14 @@ destroy_infra: ## Destroy Global OpenTofu/Terraform infrastructure ## deploy_tf_backend: ## Deploy the OpenTofu/Terraform backend to GCP - . source.sh && \ + . ./source.sh && \ unset TF_WORKSPACE && \ cd tf_backend && \ tofu init && \ tofu apply -auto-approve destroy_tf_backend: ## Destroy the OpenTofu/Terraform backend on GCP - . source.sh && \ + . ./source.sh && \ unset TF_WORKSPACE && \ cd tf_backend && \ tofu destroy -auto-approve \ No newline at end of file From 9bb20f25d6ef83696662c9bd1f5281900279c9e3 Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Tue, 24 Sep 2024 00:17:41 +0800 Subject: [PATCH 45/65] feat: Add bhanuka to sops secrets --- .sops.yaml | 4 +- Makefile | 6 ++ README.md | 5 +- secrets/gcp_credentials.json.enc | 34 ++++++----- tf_backend/terraform.tfstate.backup.enc | 20 ++++--- tf_backend/terraform.tfstate.enc | 76 +++++++++++++------------ 6 files changed, 84 insertions(+), 61 deletions(-) diff --git a/.sops.yaml b/.sops.yaml index 64e66addc4..049cc3ae99 100644 --- a/.sops.yaml +++ b/.sops.yaml @@ -1,9 +1,11 @@ ## KEYS: # Yongbeom: age1c0fqjnprp4pzk8kx5y23mlkreu5z34v3tkrrwrcmf56cmu3zaf0q30sqfv +# Bhanuka: age1kdym6a2z8trwn3efwj4kw2eypsh2pucl4vk3faqmqglhgx4ek47s3mt3kk # GH Actions Runner: age1g2yz8vzyyzmdsht3398da6nu3pgl54rkw5wuveqh5wfn23r2hy0qu6d4dw creation_rules: # Note: must be comma separated - age: >- age1c0fqjnprp4pzk8kx5y23mlkreu5z34v3tkrrwrcmf56cmu3zaf0q30sqfv, - age1g2yz8vzyyzmdsht3398da6nu3pgl54rkw5wuveqh5wfn23r2hy0qu6d4dw \ No newline at end of file + age1g2yz8vzyyzmdsht3398da6nu3pgl54rkw5wuveqh5wfn23r2hy0qu6d4dw, + age1kdym6a2z8trwn3efwj4kw2eypsh2pucl4vk3faqmqglhgx4ek47s3mt3kk \ No newline at end of file diff --git a/Makefile b/Makefile index 6381579930..f658b44498 100644 --- a/Makefile +++ b/Makefile @@ -13,6 +13,12 @@ urls: ## Get the URL endpoints of all deployed resources. @echo "FRONTEND_URL: $$(cd frontend && $(MAKE) url)" @echo "BACKEND_URL: $$(cd backend && $(MAKE) url)" +encrypt: ## Encrypt the secrets file + ./scripts/secret.sh encrypt + +decrypt: ## Decrypt the secrets file + ./scripts/secret.sh decrypt + ## ## Google Cloud CLI ## diff --git a/README.md b/README.md index e206ffbee9..9ba2a50d9c 100644 --- a/README.md +++ b/README.md @@ -24,8 +24,11 @@ First, you can simply push to your feature branch, and the CI/CD pipeline will d To deploy all infrastructure on the command line, you can run the following command: ```bash +# Decrypt secrets +make decrypt # You need your age key in the sops file, contact Yongbeom for how to do this. + # You may have to authenticate to gcloud first: -make gcloud_auth # You need your age key in the sops file, contact Yongbeom for how to do this. +make gcloud_auth make deploy_all diff --git a/secrets/gcp_credentials.json.enc b/secrets/gcp_credentials.json.enc index 2372780174..35541c4510 100644 --- a/secrets/gcp_credentials.json.enc +++ b/secrets/gcp_credentials.json.enc @@ -1,15 +1,15 @@ { - "type": "ENC[AES256_GCM,data:9n0pwWSZdXralWIPDsFy,iv:1OHje/MnWxDXcSoqPv4ZjLhcXoVNDJ+RwzzQDSC4CPU=,tag:e/ieewg4ajF2BHVncuFuww==,type:str]", - "project_id": "ENC[AES256_GCM,data:VSE+Eep2B75iwGDsEBT9Ie2Ml7k3j2yuo1Qg,iv:Npby4+nmOyr7x75KfGxs4NaTGQgZmUG6ihPTiSsRNXE=,tag:C7x17VTIVug1p6t53yjP2A==,type:str]", - "private_key_id": "ENC[AES256_GCM,data:hvN8SsWi+0yD4diyJ1A6rZ+QDYKzYuyUlEzzbAxMg99lYDcjYzC41Q==,iv:+dbwGz1u94AWql8wsjMD3zf+1jSVBmAwNjT1JwylCX8=,tag:JfFVnAV4bfTqc7agX7BN9Q==,type:str]", - "private_key": "ENC[AES256_GCM,data:23i5iXpM1q2A6dTqGXs+5woNN6+Jcxrm7D/1BuowymTvtXCgcLpLmx7ug5C8dbhOFH4z1VBMASW/ApEyytlMjsyDe83wwghdBIxiHyMuGJALOeB9qPfvmOHfRP3xoyr8L4TkdhP29a0fUHzig9aZlAtTUBIr5ksAOksgJpe9Omy3XF9zbC2HyBUuDYR7yzq2KLt4XemdN/Hqz57+RdUV4PCYk2X/7//Frf2s1qD9mBqoycN5hfO55GYmKpSCamzz/VnnNKEqRlIkm6Mc+khU846kJWv/2xolsuL8eS5sgPbTCONSnVMe45fl8XKkdH8fkztyu8yuRy712Iq6CMIp7WqHqN32kiTq5JYbw5X2Hiy14bCFTbj00nyQxUE8AvQ2yr+q9pD/LwZ1HnF2Uyemdxud8ePnjUARFHJosXgXT/ImmIT+xG2jAml9EHBs887akf+EUV5JAMDeY60/aXGVt8RkceJ1ppQBH2aq1pwRZifCALYLLRqbRwYfY5N/7q16T39n0pCRjsW7OZhK+x4PrTnpFCSYUV1qRqZ0oPFb/FXAoEwI8AVeZt7/452hJ3oK4vVEGr3xsjUjPzwZBPoerW5yQKACruw4ZDSoBLyuFa/L/RbV9NOD88MyJpFuXwjzpxmm8OeDCImE2qcVGmW9BVt828ijdNYotrMdTWMLupaNOvzRnh/ULWER/rLVuSZdLJdlA9mWCwapB/hJR/yI5FKh4OtMxnLZBEHuaKKL/zFh1UXjAbGRZO3Tvp2rQeqayYoM9+y2rtDvelXELk44J2ci3hW1XrtBR/h9Q8FmHv7P+FQXOFhcwrdAFvLcDwcrIgdqQpoMHkDv/NxNcFcoETkFVyQQ1AcsAE66BQWwztOga4pHqgyiUcSapkNhNz0yCkR6ZDMZdLy7ZTC/yLbiAQTI9mycVNsJvmwfz/sN0T3tXXfec86Nf+LQW3cSXWheE1q9X7D4GETyBG7VofeHfT7UwRCK0ykWv9JpVYTJjgoj0HpgxVzMs5B1JCRi2lRo6yuHu5owFQVyXL3wvNK+iE1zvBD2oHTC/lky26C8eUR4iwoahHy6xDy7xYotWU0FAVsvvXdaGwGqjG8B6YBqSROCPI9QHnWrNfHRX6RPlFxJx3gYy8GP1zEqTfVZp17Xmhgy4cfMjt/5IcYJg1uPlKZ1DILrzA57bDUR/G5GGvgWeh0kWAjR3n8SSSk5FaSN0vyWBf+J9aExcxxnQlMgjoDZK31jXgUdC5WlbOrmffj/r3JF6oNUdI5MiXICn+OUZqnSmpTTFGhaNyDcQxrEeqUXhLY9ccBIOLRfwKeTLARDEduGG8IAVNE0CbMjJG0ugbDFdCC7VNpDWi+LcfWDVRJQ/81tXf85H/bpKAzLvJp/kOcsLCf4mPrGfnZqWIslsettkixtFjJDNxls0Ck95lEVb6LgS1UGmg9O7jyLxK939vK0PgGjUQUop24O0R+a9b+/J8ClBPUxGpTTLAdmoGnfaJLyGY22/c/CPgxvJhkwL6RWFXsLVHAzCa6YxHsc9dEPYt0fcEckVjyTyq8+R3YhlGRkDxazj6dAk9PxQnBy6TCtPbQDIAbaCiognQbIbt0/V73S1aNkMgRGM81mj+0YvIB3CvkZ7Js9GfYu3prlcNeEzMfwI+cUa2AV2vRklI5q1LR6DvkxG2CGDG64jv0aHy0E6eEFTwmckB3Hngx9IN7ZCq44Kc5P4NNrhPLh444tcjf/YegJPACW/JYFfryiowsKx5dHOWKFa2BuuOS0mPz/m2cwITTq60FEXIU1SDC2dJ1Zm6/sYYIgSa63uMYMOa0vx+0vNGR+wimUDdWUH6j8YERV2/OBXqRwRqAnG6pJNcZ6jPdmW3ENzh0Gyiv85PeFtFi2cwyO0+KdLUae7sufcq9j9BppcsUCtclA5PwHr0d1YKyID0OuTK2d3e27VU8vAg5zpBBzd6vl0fFHBW8nkVjKIvQRtJ0lcsW6b9SctXwRF5bKuCxQcufK/0YqmjjnP9iQF66Sxd8HjC3GzV20TnEZTPzOHt0OnMImDGyceD4PP7nMga9z6ZGn+hqnRmHAfiuGsZ+nJOjBUSebZK8l6rw2yYHaYvHrYydULdci4WwW2oWc+3SVhIGcbm6KDc10Gx5Sx78TaTdn+Qh63eXw8d8tqaW2XL/M/3KS1y1yY4O3Vzt8Tk87sIW9m4ID+anqRFbQRQUJmi+NKW/b5nfLRaFB+Uu3UUi24LeUuhwWRzkYygkv8q9f08LzI9x/P5URoMBd,iv:G8p3ktf8hXXaoCklv96zOnQ0IfkkHO3sT5XPsXukFe8=,tag:+LmaWBKjX1p5eG0tOSRihg==,type:str]", - "client_email": "ENC[AES256_GCM,data:qXZ2rQsHXASpbyuue70q6U7ypYIjVjKDpwNwmGeE6MR3auVFr8fIskdagFD7vDIWr3y4u1W1m0FSBbo91I4YinrsbwDZmOjE8yvZ28bexA==,iv:v+U4nrPMnw+e1IbgJXXn7NmPDjyZcWYgGrZVh0QOkLs=,tag:v5Cmj3VljFVhPJMcjkFHiw==,type:str]", - "client_id": "ENC[AES256_GCM,data:00dgpzEeU2nO4DyyAsC0qBoGBf2w,iv:5A8zFHcysM7RcsmjmZ/zooezHK4UOFSakcVfFq3T6PU=,tag:fUDjpsTi33uCkbxZAJTOIQ==,type:str]", - "auth_uri": "ENC[AES256_GCM,data:2eMU4vR9mr45dhsamtXFoFTdj3kl008pUNTqTtE88iu3KxMfOyTtsfs=,iv:Zk2a5FzLjXDFKnSUC0MQXCQz45Eztsxr7aBgQD10hcc=,tag:b5Ok77/rUKrSB5Ip1xjmfw==,type:str]", - "token_uri": "ENC[AES256_GCM,data:0lekHrpHHaT6xuqgBAYC9goVj9W/7ByiMae+hAU92a8qvsg=,iv:HsSTnXCw3KDizpXp7GubzNmdc2m5Nxx2gubaWPe2LUk=,tag:HSx0QeJ0PctlgUL1a9Avgw==,type:str]", - "auth_provider_x509_cert_url": "ENC[AES256_GCM,data:fq/+3t4YMQQT4eizd2rcZKrI4ZU+5ow41Ww0wIA3weAEilcmHVOvvhb/,iv:xW+TcWwMm6zqxXIAhmqw5wW7kp9r1CZNcEKlal9VCgM=,tag:gWs4vTPqmSg52SKWf8ttlQ==,type:str]", - "client_x509_cert_url": "ENC[AES256_GCM,data:9p275N8Nkv7QZ2NHd6zfB05NqKkvpl0WQewN12+17SecBD5uTwx0yGmp4WFK6/r0z3NdccZUMLjavnyJ1SSNMKn5WTRkOLqpVyvLQFVvBwx9n7cjpeQTDzJ+RuuDhGe/rFGNJIPmjoK5g7Np7WQhdHlbvbNibm7lrIHqM9UXkoisxMQ=,iv:W41R1OYph/wB7tDsHB2880NdMWCAA25P1bR1txlT2Bk=,tag:7SmrMdF/qdmeQD/NUS15Gw==,type:str]", - "universe_domain": "ENC[AES256_GCM,data:hX2/9LS7c1Z3qGIK/E4=,iv:JqhcirHnsDMaTnynSxDiStSMF+YWWelY4OjKZX6P9QE=,tag:wnVENt8Ckc77WX7porBKvw==,type:str]", + "type": "ENC[AES256_GCM,data:VL8pHjICLUTE9jpmn0Pw,iv:X1Ggju9aWYpMO3eiINQHvJVeh+yH7LpjMljWXhzHJgE=,tag:OqPrP73yesDeMP5vDtfjaw==,type:str]", + "project_id": "ENC[AES256_GCM,data:RVeh8mmrqqzgvBkcAdpPwBFy0ajPqV5BU+Pa,iv:iA46t+N6RdAPAZd4KWw9hBrN5unH2J15P0FwD4UDB3Q=,tag:To5oLpayflx+1nSFynsH+Q==,type:str]", + "private_key_id": "ENC[AES256_GCM,data:O3zr4fJgzkeL1oJxTko8BvgbEBmQfPNTbAtj2NNnrxVQZOQIkNgnuA==,iv:cmHoYstH5A89kJkS36n516fZHdc4o32AZ6aTxuL7uCw=,tag:XLAkbNYv95jnK8/Zp+Pvow==,type:str]", + "private_key": "ENC[AES256_GCM,data:MJotlwEsh8V4wXm4GZ1tReP6K+YqHVkj9sTK1HivW+yQ4ZRrW9suW37NVsSux97G0mikhLEpZQs5L85kJLtgtIqLnVUTyA266Y6vYfL+PME6Ht9R+qHSdfv/J9tjyIucJPhkusDEP3QlTBu5WBjaqgqmbroNkGPrVtrDh8rzwCwEDHE37GETmiPetj12cUDx6EBemKJKu6RwT5Jn9qZ3Ll5ak7Xbq+SbuNFAXreSJdPavpFg5nhtrqGuidVirScacOlhPcYZCauZ+9CF0LGxmJ99QpoP4G1NtzWuOu0VbGkNG7Y4gA1UulIJqAXRX8mPaecf8kzfXoHJn4SqstpbiMdVKQo5J9TENNyIBdwNDu5M7s3ADE67s10/lrr5XCdpvmLLAlyIjRhKZC4kc3aZ4KL1RPuJvBfsfpkuKfZZYkJ2qeAwAk6COavibaVR7pR80jYyRnpAT95HTACHCU0/9s2Cm6v3B77JtrLX8vPf7FPGGvmS6K1oDCW9cNkpmwI6xQ+qKek3+5suvza8IygnDMqPqeamqj0pHWmcuTlRH5tXAORxyNAG8263QaWH5GsZuEHr01R0Ffqd2d45RSKPvr3p+2pZ6Rfgaz1VMRPqDusqOE+VWiJjEpSNciC30aUvJJ1LiNLu25227Jt3kX4ZzBz441bRPwf5ybcQqN32uI+EUX81eenq03qTKCUo9Kkj9uViL93Gf3aTY4gP60/msa/j47NsAZT99TWI30r6/gCvODeHBgNuTa7MFa953+mrLF3IrYI2HqIwhoELSgxcsjwPZrwGerSSusmf03SBB6xfdS733HXTb8R2j3L13zLuaR+NXqo1443snHPv40xtqlyCusTW2grjbGOLviAyXAdsniAigFTpxoTifWaJJ2ys2ebqdfiWUs0AZtRZ4OAJApSsKfJ2fWFcn+YyeZARarI9twKiT1Etn6DcUMrM9TDGssgNzWc28Mo44AdP+WJKU9OJlWw+fsygXdByRNXQPIsBXhNrNe7zsXTkBFCWjjE5+/JPS9bThwjSacKuX43tF09S9GV9qDiVRGn8JVQTtt9c1sSX0lq4yx3LhOk6tBEH8i1bvKog9W+G+QIdktc6vJW3qBxay+HZvOElY3w0Q4j189YVmvEBrV3LuV1r7AYmv9/v5muptfns9OVnu/k250oo8Z7or10LT/acyAvCsAsVOGa0nPLkGEmHA/kLB7CV/eMYWP5Tp1fV7Taur+qchoLLxuhFjXVnf8aLuUUrqwnyL2V/OXprn5WUQrL8+1e+ckuSsPbDBIFmKAqHOXQrJ9XquhB0jLWuGJ8mj1DEQcXIkrBrDOLagcXnZ1WuwwE11OG0KcEnaqgjuMkiVkUC0uXQs2B0ge+UfLdfsaAhwDjKEZWMkfeYHZ6dkZTHgfr+4I86FQyTYR7PXj+DqWq4Vq4ASHTv5qy6i+ksX1HmoIeXGGk4A3DNY5lzuWpmeql2zogLcsCwX1wvR3np8AkaRr3gWExCwtA8RBn3oNEBRuFht4/mE/vo+5lRnX6o3QC/NWieeODHcM4P/FOb9/IHfSf6JgM01J8Fd95/klt4Fk9pdmTDihLvTwza97Pn5rWT+ZHeMD7lwzJeeaRY8s8jvGYn3qtDgeIOvZ8LJOv4UdR9cZw3RnuB6rPmX08a/baQtcrkNbXGTsDMHslbZmUeE/VdjKC8AU9V5XxG6FAxoRkpNH4RXOYX209yI5X3N8r6aXupPgUX/WRcY40AqFFlqYLNR51ipWu5XU0sEAzETzOPjPjFny6vIZm1qMobx+KrHPm9P5IcQZFo1RpgEBZCovymUcKlNXi0EHOu1qoodjgawpoDbsXJQ/urprnaU62eUiukr8kRRba21rTrT0FWwqF7aQhCegCTyP62FF6mjMM12Y05dDN4/i59P/fvjKAhtZ521LjnFby2L9+ODzJF0H022jBiZV1KVsXBv24cngb50iGoh5m1B0y1wT9ueePoSIxDuCa01ZgmeGVScOGpbr9qtgPz6Wtdrmvc39W7TsZ1Rb5W73Y9CUNnskIEfpmJ5mgW3yt04dU96KGuMD2/dBy7LHkOOuICkI3CVF4SOPo3DKJyjEeZoUSFzq03N7p2xYDFIvww/PBbjHqq9p1jEWvRqNApIGv2ldBNs6Ck6Nde2fbm6nY7dDFFe2K/AXh+C+fxpajLQ/zAxuV6d4XprhYrJInSVSBnPQDwJMsCHcphawpgb1AV3+RIxjhD1xNvEK44FezCjYo+JyaxfknjqyXRVpiwfqkl,iv:gdkMK8sWLFpiorei4E2aMCiKFmHCaQGdI3m6uLXlZ0o=,tag:b9uryAVKWNcAOVk96W8EaA==,type:str]", + "client_email": "ENC[AES256_GCM,data:qU4aOT5LuqZSkvdWIZypo4VAcoQI5S2bgrJcQ12IBWhpAwdHtDXGvKN6pEJ578BIJTyHJOpgyCMioFkfZ4MqrCC7mKmkemTne/xF7Q0EaA==,iv:HpKNS6txLhj8a8pJmloaUpEX62XWDUlLSWpqDMfqCB8=,tag:UWCzCWoMK0jaykI73V8aIQ==,type:str]", + "client_id": "ENC[AES256_GCM,data:SMhQBD5uUV7fqEKD1U982B220Ph7,iv:Hr+9jGCfz10wg3XWt1izW3QE1SwRCQuINH6uWbYFq2k=,tag:1S8Siy5eXXpD+03hDi640g==,type:str]", + "auth_uri": "ENC[AES256_GCM,data:PMQS6WjUuqvI3842nUN7EdD0s3tr5EHV+wRKt9pRfl46nA0guDJQWJc=,iv:EbfrOCvdHJ4bHcn7P4cUbxWbHCNWwQ1C3q4Ss/yKEEU=,tag:gCpVi/w50DPrhReabH4S/w==,type:str]", + "token_uri": "ENC[AES256_GCM,data:az6rjxW9XQUxRoTE3yZkComoC5yWdyzEPuRtbE4o6bN4/vo=,iv:WWB/ytmljF0WXZvhgzMv6fwtwQGgCg9UHnuE6vlJQho=,tag:3wO0oIidBn4LcjcCncW3iw==,type:str]", + "auth_provider_x509_cert_url": "ENC[AES256_GCM,data:oXtf+D7iWGzIcXN7KoE6fat912YIqDkuxXzP4lIBLP5kIBjtQuyEEQvK,iv:Ir3w8wyw+gK0P8pUBAc9FazCOdV3uvhxcr8cJ3sy/To=,tag:Z6gRr8fvUYlxdPNgW04jQw==,type:str]", + "client_x509_cert_url": "ENC[AES256_GCM,data:tkgnKCJYsHgAAaW/5UcxjvTMMxEWwpsbXiSGeHrZtf93BsXSGVF5a3TtghscQOGY2adgmNfveuamwovslygkDb8EDdZ8UT1IEr1mZ1Ki54M0+9UKqGqKO2KO/D6p5tgyUVzGLYVJJIdcb3Lawn1VFme4w9dtt13f0R9VzChgo2SQ7fU=,iv:wQiHXnaIG74x7RfTqP0LkYS3DUm7wtE1v5J04SawXQs=,tag:5GCojkxmboFGhM7HxhEkNw==,type:str]", + "universe_domain": "ENC[AES256_GCM,data:6yNZqdhZiOs9t5409ks=,iv:zyvumzUzbAOugXn3J5dwZw9c4J5lMmWkAQK2HuLk6NI=,tag:GQRrovNkcPRmZihWjBiSkw==,type:str]", "sops": { "kms": null, "gcp_kms": null, @@ -18,15 +18,19 @@ "age": [ { "recipient": "age1c0fqjnprp4pzk8kx5y23mlkreu5z34v3tkrrwrcmf56cmu3zaf0q30sqfv", - "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBYVzJVam5mK3l1YkRoTUpM\nK01VOTZHNkpRVDZqcEVvUy9TNkxSaXQyK0cwCmZUTzVoaFFRZGx2RzZNY1VsL2ww\nWWdLRVFuS2J1QmF3TnJzd2Q1d1BBWEEKLS0tIFhoekgwTTBOUkhqdC9JbVlTV1dJ\nTHZLSUpwRFdpUlg3RHprQnB0NVNsTGcKFsIseomUL3q9Z/O8RsFfgVk6gv40qIhi\n/8RO9vdKD9zS8zHwiE8lCNh38BD8PoVLyDc0n3KfWKWmPz02qVCAiw==\n-----END AGE ENCRYPTED FILE-----\n" + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBEWVhteUdYRkxGY2ZJek9o\nYkhlbWRVYnlySWJpWmNIVzN5ZWVicVA1THpvCkpKdlNLNnNVT29FaytDMGN2U2FD\nWnhockFuWGROWFlXa0ZpcnhqUzU4dkkKLS0tIEJhQ0ZIK2UzcHVFKzdLanl1cTMy\nU0VGeHBlZ1pHUXc0aXhML080aTIxZEEKl5gRIzotYRdyD5Q8FIYnnXrfEsKG0LAH\nXaq1Vh0ani3F//nDY6/Tr2g80ms3Gk0lHFopyu0I25NAP2uTxA0hqA==\n-----END AGE ENCRYPTED FILE-----\n" }, { "recipient": "age1g2yz8vzyyzmdsht3398da6nu3pgl54rkw5wuveqh5wfn23r2hy0qu6d4dw", - "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBVRnJINUhQWlBtZkVXdDhv\nVS9tUmQyUWw3RVNHREs0MUZ1eGIxOTFvRlhNCk4xWTZzc3BZMzFtVCtPMGVsVERa\nYWZxWURiUHZmN0lmbFpUUDZtb3lrK00KLS0tIGlPMDh3WXg4NERzVTZnVlBEMzk1\nMTVPR1NtME9Lc2RyVVJqbnhoRlU2TEEK9vaijmtSF2teczSokppTo+YEo5mvXdte\ns64IAoMFFxbTjM39YS50VQhANDlRumZeEgaBPnlAxEcYiIDE/ufHmw==\n-----END AGE ENCRYPTED FILE-----\n" + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB1cVR3SnVIUktRQWtMRWNV\nT0Z6Yk1PL3VCVll3T0JqMmhCVG1JdGYyandBClo1dkR0d0tBNnM5aVJXMGdxbnRZ\nRURkeXFMRjk3a2hsQXhnbDZSR2tmbzAKLS0tIEdndEljMGhBK0lLRm1yb0g0dmll\nRUVSRFJnMFhuMkJMSmg3K1BXY3VOUW8KVu6DqQwDmoA2H3iFZRuo8kyyPV8MGXk3\nIyoQpjsi/Job0KonJmR/ko6MDMPhq+Rxqgrdyl6lgANlRsxjQvUDQg==\n-----END AGE ENCRYPTED FILE-----\n" + }, + { + "recipient": "age1kdym6a2z8trwn3efwj4kw2eypsh2pucl4vk3faqmqglhgx4ek47s3mt3kk", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBidUtyZ3RGUy9EWWw3V3I1\nL2lEeFdEcTA5Q3VxWUllQXNFd1hFaUNsd1RZCnlSRjl5dGo3WVVqdXJyYVEwRFF5\ndjhWMmYxbHdUZXMrZHBxdE5Jcmc2TW8KLS0tIFFydkVDQW9nMTMxcWZTSVlLYUMx\nV1QzaGk2aUdxdGk1WkZLazArQUpHR00KKLTPw/B/EKOWPMR0qV1HeFmaNRclL6kl\nwG+EtPzHAJx3Oy9xmy5WvdfUvHfsS9wbxcgP9anpuhKqbUsO0Vx3Nw==\n-----END AGE ENCRYPTED FILE-----\n" } ], - "lastmodified": "2024-09-20T16:48:03Z", - "mac": "ENC[AES256_GCM,data:PWXGqvgcUCptq4D6i4+7czbr28ii1+GR/d8pjk6d6/OwpjnY/ksk/jvH9seIsbCLzmUD1j1cleMQrpVUYvBaBtlUF8QBVYhzWNhqZO7OVorIyDnKl/E92u2cJ3ZTbzBHkVAu9XewhZUNPwOekB7LXx3Bl6uyLL3MqmqFzrMqjBs=,iv:K69ETx01BYc0rPAQFUz+JOHU8shujDPe11XicW8nV3Q=,tag:xi2YBuI9buTR1sLHQwHw8w==,type:str]", + "lastmodified": "2024-09-23T16:17:07Z", + "mac": "ENC[AES256_GCM,data:cWQi2o+HpMILj//7IqGEBUKEaWHO+RHnfVwuP5tkEvWcTU2GrOGk3ypQT6uF6rXyATlUZBal9psKmOwHhoYQ8A/aFlDMRuSZtthJtcuwGcfw9iDUywP0kRU3t4MVd7ezt9y6XRmXEzkQmB9Petm0M7k8BfKvLvHPgn6cEb9B7Qk=,iv:wrH9IZBZggsLv7eofSBnHQavN4U/kLBeJhCsQ7Vu/xU=,tag:hXbbHqUUzom93YdJy9ajNw==,type:str]", "pgp": null, "unencrypted_suffix": "_unencrypted", "version": "3.9.0" diff --git a/tf_backend/terraform.tfstate.backup.enc b/tf_backend/terraform.tfstate.backup.enc index 9e0ed59c0c..e52dd493b5 100644 --- a/tf_backend/terraform.tfstate.backup.enc +++ b/tf_backend/terraform.tfstate.backup.enc @@ -1,8 +1,8 @@ { - "version": "ENC[AES256_GCM,data:Lw==,iv:kumulXKUGGDB5zzEvXRMZkBlXgtXk7Ti5rr76kSi9N0=,tag:xr/vA2x9nlFvh1iOzEoUmg==,type:float]", - "terraform_version": "ENC[AES256_GCM,data:9I4pNn0=,iv:p/rvLqTY5qfAu1YfGdsUEHpec9uB7PCdaikDhaifv2o=,tag:yEeDLJTC97fYyRnGg4C8nw==,type:str]", - "serial": "ENC[AES256_GCM,data:iw==,iv:C5GrfVIDubIUfWXM5GG7vLW5bUp3mf6lHmJayBsbRLs=,tag:k01TY0oEJW1F+tnPozDWyA==,type:float]", - "lineage": "ENC[AES256_GCM,data:U2W6OJjekOSlTgUAgsM9A83o5qI1gOKDjRn+QIb/Sk0o6Z1C,iv:qDOQ1SGiXBEmwy6LMCJNT8xc/cXlsShcFi2qR31R2d4=,tag:YC3wTixkQ+QyRMpylSlByA==,type:str]", + "version": "ENC[AES256_GCM,data:GQ==,iv:bBg6sMbDIspoWUtromot3pp6ASvI1zCU/zFqL6rdjJI=,tag:pQBJx4JK1J8KXytEmora0g==,type:float]", + "terraform_version": "ENC[AES256_GCM,data:YQEz0ow=,iv:h2awLAvXbju5be7VtXFx4HKpKecSVrQAN2AMNRGId/U=,tag:j8y/GZr8L65HDkyL0yM9cQ==,type:str]", + "serial": "ENC[AES256_GCM,data:jg==,iv:pIzlRjxqVBWjOuBdBECts/Jx3gk/Jg71Wz2xucsmpx0=,tag:Oeqdymxv/PzMDsbV2+v9iA==,type:float]", + "lineage": "ENC[AES256_GCM,data:jg6isZYwhySHoWSI6n+wEY570KvTtrq/z5NhXbW88Vv2kV7L,iv:LrypHbOFDnVyIkkZ3cJgCxQoMbWJf83QOV1MdLSOmfc=,tag:OVXXtJgu2li1sMZ1QYS92Q==,type:str]", "outputs": {}, "resources": [], "check_results": null, @@ -14,15 +14,19 @@ "age": [ { "recipient": "age1c0fqjnprp4pzk8kx5y23mlkreu5z34v3tkrrwrcmf56cmu3zaf0q30sqfv", - "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBqR2huTzJpL2xxaXRtSE43\nRG5YN3FpY0dIeDV1OEg4SzRPYk9wQzZBQkRBCnVqYlFxY1FpcXVRQXFFV1NsTFMv\nQWhSSTEvcjdyZHYwR25oc2hVNUdEN0kKLS0tIHhMZ0t0N3daL0szZXZRelpOWUhL\nQ05RTmx2UjBBeG9tOHI2bEFUM0xZc3MKiMnylHuOPqD41h4cAdvWDwp02tzCGKNl\n/6vVnzey8G1kphA95geHIGHgXse+y/UYjDvLNNpDlx9vK6ZSlNTDcg==\n-----END AGE ENCRYPTED FILE-----\n" + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBYTkJKS0plNWFGY2RxUkJJ\nWFplZ1VqdjRmeVB2NWFseTdlSnJRcjlDYmlRCk85OXZkdUIxK3loM3BiVFlySk10\nUVBINlVQSEJqVmdFQjdaMjN4dDJtVm8KLS0tIDR4di9YaGJMQ3Y5RHoxZUo1M3FG\nckNLYVROaUM1NksvTmpPUGE5MVJiNWcK3gCtfB2BddRctHLiYgKfeTPxvAfIsQsM\nP4c9iesUXEyTqOs1qr+696Y6qkMSbUTA88Pyg+5eq/QdzMD0Ept8aQ==\n-----END AGE ENCRYPTED FILE-----\n" }, { "recipient": "age1g2yz8vzyyzmdsht3398da6nu3pgl54rkw5wuveqh5wfn23r2hy0qu6d4dw", - "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBqMGRpYUl4bE43SC81cUJt\nMFYyUkNVeER4TjRpWUgxS00xTFJaRGlUU0MwCkViZGVlc0Y2OTdGQlF2cXRxR3RF\nRm9ibXFZUjJ4WFpEUmU5YytUVE8wbXMKLS0tIFhFR1UvZ2drNjVUMjVFT0RDRjUy\nS3VUaitEZlFzWWdDcGVVMlFkL0dyV1EKxQAZaF2zMrudQG3J4RZLf2WzuYyTtvyO\nRHmwN6INoGTdKxB3xu63Cp0P7ZbQZzc2QCCbSyHUG321tQrKK8C6Ng==\n-----END AGE ENCRYPTED FILE-----\n" + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA3RWNoSXVNcVZhNVNvVzh4\nQ0t4QkNFdXpoNU80WVlnVUtBRkVEeVMycEZFCjdjSEdqSlVnQnljby9MUXloT24x\nZjA2UGtOUWFlNmR6TFpHREVmbUZ0dEUKLS0tIFl4bWM4b2c5bGVCNmhPU1c1S2tP\nYXRlNElTajdhaTBFZzYvS0I3ZkhEMm8K8IYO5uMao3tan4owSSKmP194v/qGP1za\nZ8EYCfetE9TIOa7wXNNBRfdEMANmhAeYNjRv+BU7j93OPvrkNZ3oHA==\n-----END AGE ENCRYPTED FILE-----\n" + }, + { + "recipient": "age1kdym6a2z8trwn3efwj4kw2eypsh2pucl4vk3faqmqglhgx4ek47s3mt3kk", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBXRVFUZ3NoQXhPRkZtZS84\neHoxLzY0WDFOVHlhUlhWaWFFeE05eVpYTXpVCm9HbHF5ZFIwdkFQbDQzcHBIUytv\nMXRyYk5FbVE2SHZpNlNaQ25KSmNFcDQKLS0tIGU4ZDlCN2FGT3VGN0xoZUxsSFB1\nZENzMm1VYVJ1ZkphcGxRSDVVZnJQcEUKh3O000etUHVBg4Z3xLuSCeEZd9RsozgQ\n+4yUS1CUbjL1qg8ZRC0CFm+2SUs/a/yD43wqqOVMBcOUlfqbv8sEEw==\n-----END AGE ENCRYPTED FILE-----\n" } ], - "lastmodified": "2024-09-20T16:48:03Z", - "mac": "ENC[AES256_GCM,data:hK+YLSiRS9SPsyKPCa7veMobaAipXmaj/bwiJDoQbq457sF4omDifMDpJONKCEesJx1kGNkAZAfBVhw9c2SyCFyy9DtpFRdzUvWKSPyukQlWamywzniXn7OYNlCuPQ5/qRPA9aZ6cFcC8PSnMFnJ9bl14et/4jQY0s8Rrmi7ODs=,iv:9FPS3SQhWFSutqusIWPDUuj8fiq6a90lP+nRRqbWN00=,tag:TJuxqr8hMWTmniuyRPUGeQ==,type:str]", + "lastmodified": "2024-09-23T16:17:07Z", + "mac": "ENC[AES256_GCM,data:S7buyvXob6QWZ3waxjdNhE25QPEF8/CTgn1u6lH5DX5PzwmAfSOz9BQCYg90nznVpWIq0w7H7Moca38FgZqYvV5tZz/r/bMqCPgg00c9uN7dg3V8KEKlHKEqwqdWBzdfihhqDeNV2SmL2SXl7bx3/YV4+JkdFZ6854IxPIt5M3c=,iv:0Wwk/A32WYOIyHA2jJCGqGQVo1ydn0Jd+MinXzN+RBk=,tag:prn5nJtYSVgpDDQjO/Y2Wg==,type:str]", "pgp": null, "unencrypted_suffix": "_unencrypted", "version": "3.9.0" diff --git a/tf_backend/terraform.tfstate.enc b/tf_backend/terraform.tfstate.enc index 28bff57104..039a7e1fbc 100644 --- a/tf_backend/terraform.tfstate.enc +++ b/tf_backend/terraform.tfstate.enc @@ -1,65 +1,65 @@ { - "version": "ENC[AES256_GCM,data:Aw==,iv:Py19YugXLsiH3I6FDZTmXugtSHbB3gI8VWPUEP4Vu+Q=,tag:CeEsK4t8P4+MCeN/ddxvSA==,type:float]", - "terraform_version": "ENC[AES256_GCM,data:Vtiz3nc=,iv:YG6O3podGHr6GdSOVEem8TTsh1gj/bkXwjHpg28EZ4c=,tag:/pplGSYQRxOh/aY33cV25Q==,type:str]", - "serial": "ENC[AES256_GCM,data:Iw==,iv:QWYjHdQZf8xnmFR60sSHNaDOfR9tS3kbO8t0Xhd1azc=,tag:TJzMezbjmEaulsb00KitJQ==,type:float]", - "lineage": "ENC[AES256_GCM,data:ctMEN0yeCRZvFcCwsvTfUWpgHdJq7/D2tNbbFfboAOve1HxF,iv:pxCsPzPDd4dddXECspNTlG/eMGMFH5vITL8E4YMOCPo=,tag:f5ijdb7J48LIDrG1edjQgQ==,type:str]", + "version": "ENC[AES256_GCM,data:1g==,iv:qhRYOCkevAUk4UQptncUIbSq/SXA+ydOuhDNtiBpWyY=,tag:wPccJ0cUrKdBXLLcAod/4g==,type:float]", + "terraform_version": "ENC[AES256_GCM,data:Og9wo6o=,iv:sPwa1nna2TMgqHv7EVr9Nn0dYd2DDopWjkhGcxb1wzw=,tag:3th+SMuOz/k6e994ItP6jA==,type:str]", + "serial": "ENC[AES256_GCM,data:ng==,iv:UbLS6/CTQ4q+5G+4znJzkznNLBa91yQNAgY+8+ehhlo=,tag:bBGS9I2GDY5LOi8f76S35Q==,type:float]", + "lineage": "ENC[AES256_GCM,data:Ezz9EdOLnK6jh3beN5vidzl4QbC/J261tc6sSg480ghwRYY6,iv:hSCR0VabEaOguuKCa3jaBz3yP53fI7592AW2D6IC0n0=,tag:EZQrut2zwdzxJCn/jrboaA==,type:str]", "outputs": {}, "resources": [ { - "mode": "ENC[AES256_GCM,data:Wh7dFJ4e5w==,iv:Em0nfB6sBrPquVSn4mdh8/wYEHzIKmv/g0R+pym2840=,tag:lZ+q75esO3E/njE9HJAbOg==,type:str]", - "type": "ENC[AES256_GCM,data:OSMtijoPBzQsM2u69KvDTT3l9Uao,iv:JftsxFphu5AK28kUOF07OyJbpG+m4RADRV/PO/A/e2I=,tag:bDCmPEsWXhlBYVsGmEK5vg==,type:str]", - "name": "ENC[AES256_GCM,data:tIldIWLq1/c=,iv:QFIiVl42R2w58Lq30KSCOyfQdJi0OB2OQKHE2NbVlvE=,tag:dCTPWytAXp5hksc1mPZ2EQ==,type:str]", - "provider": "ENC[AES256_GCM,data:jIpk2dQvZEE4yOwtsgBFZooNbydd2udvJX5+eU3QRGAFbRaWtn+UoUTluxLvqM50Xao=,iv:H5dv2XA6e8SegwldBz1Ekh1FQ0LhjXOGhuqT+3bAjp4=,tag:AZ9Oh+czRbzozAz4nsLnGQ==,type:str]", + "mode": "ENC[AES256_GCM,data:Sa44uFTOhg==,iv:41gM6dU43tV8Ta5U1zp0AxNYRc20bnq8Ii68cHYlPpY=,tag:BoYx1YNPu6ldK5fVUFrI4Q==,type:str]", + "type": "ENC[AES256_GCM,data:LaBLHyt9M/oHKNCcK+didqJwB1zy,iv:FelCvxpsLfnazCgju4gP6G3M6i6zOVH/5yOKf0tzMOc=,tag:iZRrvsOH/ZAlIyQBJJLBgA==,type:str]", + "name": "ENC[AES256_GCM,data:w+wuPR7vxtM=,iv:LnZW97vDAtsjQ0fzuyQ1x76Lqx054VEx9xw0nkyqJko=,tag:56Dzrmc51DdS8mQ9c3rj0Q==,type:str]", + "provider": "ENC[AES256_GCM,data:GxFIxZbxoMjAYWRqu1cVWhwI15IiKN3mEpN1jl09A53yR0CIghZhBZkW9E6svajJSqg=,iv:QvblJw5HEdMHoSMrUDx4+o4hzWvoexNvbtnGx7+7+tk=,tag:AWaMFIZpgJcDkMP/K6GwLA==,type:str]", "instances": [ { - "schema_version": "ENC[AES256_GCM,data:gw==,iv:r3OiFjFmU8EQOCi7GLW3M7qkLv2S2NaF5YO+TfajymY=,tag:TR8R8tLXcekfuk+lCtUhHQ==,type:float]", + "schema_version": "ENC[AES256_GCM,data:OA==,iv:7fKLPOBSpP14E+q0uQ1lwIawiOAgt4FvNjbfKRREZbE=,tag:PSZTK+maDYJ1CkozbI+7Aw==,type:float]", "attributes": { "autoclass": [], "cors": [], "custom_placement_config": [], - "default_event_based_hold": "ENC[AES256_GCM,data:UeY+H3g=,iv:d8uoDc6vjTr1w8yohiUKPlZYCMj7zel85ySR8BP+r5c=,tag:l+CGT9Qga1Nz7sfXrBwO8w==,type:bool]", + "default_event_based_hold": "ENC[AES256_GCM,data:yBqWVy4=,iv:TcN4ffSaqN5o88vdN3KlL5R1zOVXPYMdDh2NzpRfI8w=,tag:zkhWJBgJSiRobrasMDUCzQ==,type:bool]", "effective_labels": { - "environment": "ENC[AES256_GCM,data:SnV2JbTmXm8t,iv:YVxole7GLIcauH+A6j51fvap/omNwQGKhNvIw8HRtcQ=,tag:L1eX1BK+4P5j8tRibIOkGA==,type:str]", - "goog-terraform-provisioned": "ENC[AES256_GCM,data:PopBpg==,iv:Ys1tSEl+I7qaiy1KgoJlRWNUUPvUFe+jszQsCWh4ObI=,tag:E1HNEfNNe15F4urs3+ZL9Q==,type:str]", - "managed-by": "ENC[AES256_GCM,data:/K8QgSKD/HI=,iv:ZTJZu8bYi7Gh0gqyAThBWaVYz1hgo07Yd+ngDm5zb1s=,tag:wwSRU+Cw7oOqtx+us6SWQg==,type:str]", - "project": "ENC[AES256_GCM,data:vntLUpYkXL4DyEcPAMqGVl3cuvYrN4hXL6j8,iv:Zvbr9hXH4eFoimDHSqkQsxrn4ndp45T9OiYtIOe3nn0=,tag:xpHuZLxNZh6fMbs1EXCI2Q==,type:str]" + "environment": "ENC[AES256_GCM,data:h9n21tv37Fjs,iv:kFHfESNDNq6PknVoiq9hxxKhZbnzNSQ8wZVtyjCDsZI=,tag:rGZ1HrZex9soYxewwmm15g==,type:str]", + "goog-terraform-provisioned": "ENC[AES256_GCM,data:yp+Yvw==,iv:mhsjHsWScGqhdqx2OAMsbQ983mrxgZJoVEqlhjLPNAA=,tag:fCCJ9VWV0w8HIza1q+32Bg==,type:str]", + "managed-by": "ENC[AES256_GCM,data:jd/gghqOODY=,iv:vP6Yl7IHiGoE8P+8LHARU8R/EiokiDEKVYDZsbLtR/w=,tag:VVWGkq+z8CqbQkYZmTNNcg==,type:str]", + "project": "ENC[AES256_GCM,data:6jGUWluirmaA9U5Dv8UFhjWOAowT4e3AgD6n,iv:v88VQxLt3+UBwmqFyWWoEZ2TLD7O7JdMQPVluna9LnA=,tag:aUBP9EkyoU8SRZDP6LPegw==,type:str]" }, - "enable_object_retention": "ENC[AES256_GCM,data:jl0O6aI=,iv:tkE2nBUtcJ1hpAFupWFELfiEANrLsJ/xCOKrURjtNNs=,tag:48NaDsvWG7a6+wNWgvzD4Q==,type:bool]", + "enable_object_retention": "ENC[AES256_GCM,data:iwSohyg=,iv:ITMuifh/Nnp2zoTVfhauZP9xJBT2C5mbNUxuMVzT1OE=,tag:Mu/Q4DvbvZ6nt/GuHA8W4A==,type:bool]", "encryption": [], - "force_destroy": "ENC[AES256_GCM,data:VM567mA=,iv:7WUwnrgBOz87nJ/3sP/9Bsnetj09nx3RQDUpNcJzuSk=,tag:EN2SLS7D11yXRtIZIWTNAg==,type:bool]", - "id": "ENC[AES256_GCM,data:i6xAyw2A+TnhPBwFdUIxOK5Qh1VXn6PucwtkwTw85XPgDHE=,iv:mci2sUwV1zk3gT8aVDEpxGW/Qu5Mnj2yaTqSS9WXBIM=,tag:NqPeRLG/oUfVFj+TB5b8pw==,type:str]", + "force_destroy": "ENC[AES256_GCM,data:Xjcpey8=,iv:cEOcs2U0CeNavdBVmuXgs2LcRF2hPBmsxKhXEpX1O0k=,tag:jXLd43W8RUnemS/7B+WAAQ==,type:bool]", + "id": "ENC[AES256_GCM,data:sSmbpgRux6jueHjU4EJzrzpofTXOQxxStqwhmv6f4yYbDPo=,iv:+caHvvRKpsmRIAYKM+5pbHMzlowkW9ZBnOm8p+4cQPE=,tag:yNeNN2isN6KNJacJUaxZIQ==,type:str]", "labels": {}, "lifecycle_rule": [], - "location": "ENC[AES256_GCM,data:/iA=,iv:USZFYy+Y6EQkby+VxngvuM+wE2rUUAlSnSSCjKVxZXY=,tag:KWu9waIElkO+I9qOgMHpoQ==,type:str]", + "location": "ENC[AES256_GCM,data:m98=,iv:nAWuunqyMD6XildCrIaAw9JLrRAw2713jCEcJ/PYyyo=,tag:8JwZnJ3Er6SpqBJ58jo7SQ==,type:str]", "logging": [], - "name": "ENC[AES256_GCM,data:ii7gtiLb/QO5YFPVS5zXKWDTqXfeqfIyHBbpy7Nhb3Ev7a0=,iv:P6oUFEWPTnOIk1TsZ2p/iwvqE9w5cW3K61B7CDwYAR8=,tag:jme/dw4kWi85MHfyE8paCQ==,type:str]", - "project": "ENC[AES256_GCM,data:6Ui2cIJr1jyP9LBo++tW0G0X3OlVHN0Pz6Ja,iv:IOgPinSl3gHqd9mM81yHJ99zlZjIPiZaT+U4euEN8zU=,tag:R873zGvqi+k2WXm4/ZB18Q==,type:str]", - "project_number": "ENC[AES256_GCM,data:hB5mCZhSwbBsGqYo,iv:6xxLSZW475Y+gR1Rn8qqpqR3ULpZXeXDbDvcDkQ/fDU=,tag:PbR36V+dOG817VPGRk0R4g==,type:float]", - "public_access_prevention": "ENC[AES256_GCM,data:GKLKXsRdQkVi,iv:EYfZFT94fMhXqlYF9aTJslhqr+CpAmV61s0XPJLTJAw=,tag:u4d8N78iowyL426XGH0V1g==,type:str]", - "requester_pays": "ENC[AES256_GCM,data:3/qqAGg=,iv:q7m7ke2No4XoHNWHDOZLjSUzeUacUcoKEz28DpuAVX4=,tag:ezzLmoWviLTu/6GvIU77Qg==,type:bool]", + "name": "ENC[AES256_GCM,data:kCLmMSHP7lck9/M5BTOrvHvX64jZnBIntXgvJW2FgyoeX5M=,iv:Witdq1q7GeT4Xo9qwW5k4vRDXdVEaWvu8VngLF8kwKg=,tag:HLcMuPvfSLVwf64yByBGWw==,type:str]", + "project": "ENC[AES256_GCM,data:rPkWmfyMWNoGw0cEO45m3c9A5DNl37jbbh1D,iv:TJisWDbSFY/NWraxjRkai7xifchugeTm7yskdczuT5U=,tag:kggcx7jb3OmFlwYDFucXeQ==,type:str]", + "project_number": "ENC[AES256_GCM,data:eYMjXgg7XoGRsDYe,iv:tfjGY5MyrxnaV1yAqPX3nZl2UXQriB1pLtMNv2c8g7U=,tag:iTAutsPWeUq1kE/vCHqclg==,type:float]", + "public_access_prevention": "ENC[AES256_GCM,data:nl0Vw4Hw6E8p,iv:ZXwE8GA0F0mvY8tE3wHwfIKFV+bshFtiit04dXB20QE=,tag:MOwMAnnhvNDDEoG7mwAC5w==,type:str]", + "requester_pays": "ENC[AES256_GCM,data:7YeiUnA=,iv:/ks+tekqMomrKiKEsd/5J8JXfwSEEhGDONC2IF5elag=,tag:MUoTMZaYZ7MhZu6hi7Tk0A==,type:bool]", "retention_policy": [], - "rpo": "ENC[AES256_GCM,data:r0MZu5MO9w==,iv:oLmQ534yqFr6fTqhkrpRcIujbjmFQEJraQiObzyz5Ck=,tag:bCDsyr+FIFs88t1TzuIY3g==,type:str]", - "self_link": "ENC[AES256_GCM,data:LxiJk/Om6TN3Ulddaw8DNFgfImVAEEMoIMVhr79kDp3/QzbBz9291otLIngixL6D9j95wqqbwDkbMlM0Ir8mNlMkFXqaQDN15Iv5,iv:sR49cqD2jIIPndW9bKh2xp/LxJOz73jkCXIc4H+t5qg=,tag:IuJKvHWiEKrrEgfmE1pPhg==,type:str]", + "rpo": "ENC[AES256_GCM,data:OZB0y4Urrg==,iv:JY4SR7hldrQ3HBfNUtWsl2wOK0eGbk2nwiEXo8AXJfQ=,tag:8GlKY9VzVU44YOcbmYzDGw==,type:str]", + "self_link": "ENC[AES256_GCM,data:mJqwjhSsdmjCxMKstGbbViDticHfgN6rVyNvhIYfbsUL3jtKBagiUKDezaiz4CJFpxNDMVCkJ6zwLIGV0P0OmNaPYQw4VwN6H4LL,iv:vrsGUd/6aegfVO9v41vuI1vbTXogd7UT//ZW0DfXydU=,tag:Yx2+cu5lX7Ag1Ax1mKStUg==,type:str]", "soft_delete_policy": [ { - "effective_time": "ENC[AES256_GCM,data:Rrl51gJQtHyScJJ8cWgRUnj3wq1iOO5u,iv:NkxfhYzxg3w0xq3t0kc2iNeZH1M5znoLREzpZCRjpNo=,tag:JC7VMKD2HHNXSabQyO3iPA==,type:str]", - "retention_duration_seconds": "ENC[AES256_GCM,data:gd7BKoIO,iv:6aC0InxPUePgR8sqNF4eemf2bV2ASn/DizMD2Oo8TPc=,tag:YqjWbLQvzLeTwRkndcG9mg==,type:float]" + "effective_time": "ENC[AES256_GCM,data:6BmPfj+5KpRncCZq5ITd7COw88BPAHR0,iv:ZovJYSb8mlioShiqseSIwGl5jLjjR9/iECu8RbcwaqY=,tag:FBTGn/0QrZM4qkimkW46fw==,type:str]", + "retention_duration_seconds": "ENC[AES256_GCM,data:y2ug+Iwc,iv:37bzbR20o3t1HZoEVuMjpDmgJVYJKb1W/5jYfFRxQDc=,tag:kq4cAQoWPIUVb3RuyvxGVQ==,type:float]" } ], - "storage_class": "ENC[AES256_GCM,data:xRkvbXlVUUU=,iv:QzEOxfVBj9Zst57F2Sw0gxH3tf/5cCsgyivM2N7EyiU=,tag:W4jraY+nqOOcOiQTDbu4zA==,type:str]", + "storage_class": "ENC[AES256_GCM,data:/TYSlMl0wiQ=,iv:rpPSAexWRMunKdQkD5pyJ8GD1juk7jBLhagO7+yTWIU=,tag:rA7tt+WMys3qr+D5MrU/PQ==,type:str]", "terraform_labels": {}, "timeouts": null, - "uniform_bucket_level_access": "ENC[AES256_GCM,data:WHqv15c=,iv:Fp6X8nA/Ih4EuelNpaMjbvH93nXeA0jc+62kvo93+Hk=,tag:5UzqoJ5s/TyqEMsUFoT6Gg==,type:bool]", - "url": "ENC[AES256_GCM,data:vz6ziWjSE6LJe6ofZ016ln+gK9N6MhBmQMMVWFZxyzuruO7Opw7UBw==,iv:ewNaHl/2O2F0k6mHgJXmNsA+m6Voa5exGuyE8u85NQs=,tag:jtE3Su+oUb5mMw8dzq7nNQ==,type:str]", + "uniform_bucket_level_access": "ENC[AES256_GCM,data:adh0/vo=,iv:GTddd/2pwVhzdvIgP3olN/iDLpk6qwHX6DaxXQMz9vI=,tag:m7hpep5WolhXxVgNx+81ag==,type:bool]", + "url": "ENC[AES256_GCM,data:+MPE3Ktm5cAln2tIR+uQRkrVSbyn9v216/jBu3RKZI2hhLR1lfFIlg==,iv:9Xgug/0k0I3V1kwURg6w7Dus5o6i0FOlRsiMbzZvCQ8=,tag:/Z9I2NYlCUbleLDLkVDIhw==,type:str]", "versioning": [ { - "enabled": "ENC[AES256_GCM,data:16mSwQ==,iv:q7ZIaYSfAhfULujQPoBWh0ulFZ4w/nh4fX9Ma4OP0hw=,tag:G8eRSpMGF4XP6703PVCXZQ==,type:bool]" + "enabled": "ENC[AES256_GCM,data:1HHxPw==,iv:jNurc/beE3RZd2Q0uTr2GMgnBZipm7S6PJoHZfXwmh0=,tag:mANcpJRclJKCUAbEYTfEwg==,type:bool]" } ], "website": [] }, "sensitive_attributes": [], - "private": "ENC[AES256_GCM,data:bZ9KViQMt4LZkRriUnRWglMmde5BDzO4lSGMRqTZPUpEZBxsuNcOHgCxOw5XZ2XK6kOYkkB6NJeOTHhCleZ9XC1BYdQuX5KKdmM7cDaDG8bcXih04KVbISF8hZPv2mS2Sd2MUQdRfjAC4LFEQHnnD0inFFUQCNcR+lEt31k8eWZug58jAPU1HbueSzbEXZ1D3zLiCWlraxeCFMWblfsM6nWnlH2vnT5meIIhyg==,iv:maSqgUvgsdL5SjY6ZPnsWoZYXRQyZ0pnS/sDOXGN41A=,tag:ssN0Uh3Htf9HVnPJ0go39A==,type:str]" + "private": "ENC[AES256_GCM,data:sYD2gd/YbSfWJTz84du9DojuMGJA29wYrFOwdgBj9WBs0gvIICl42p72bZU3n48EQg4DX7URjh4FOE3qe1IlS4a7Znl1B0tPV7M8a5rtrUyOVHSCV+KlbTFzEPbAk08ZjAS4Pxp84XV22FHGBNsG0lMEpLEFZo/nFD/5BRDjTFDivFi0QbigatLV4q+EkwbqZmXqpGnDW+8Jk9SOlX4j4wZ1yGYYVgDH0IZY5A==,iv:Eq7lUXu4vw5IdztYO2P13Q512cc4UpIlco2vnyQtl9I=,tag:1YrRPUg50q0RvbpAIdrLig==,type:str]" } ] } @@ -73,15 +73,19 @@ "age": [ { "recipient": "age1c0fqjnprp4pzk8kx5y23mlkreu5z34v3tkrrwrcmf56cmu3zaf0q30sqfv", - "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBqYzZqU1VaWmdEMDJwbFRB\nT2ZkaExDa2RNRGRUbEdMWkxZRlB2M0QzVnljClJUa2JWSXZVOFdxVGN6L0p6cFZn\nMjM4UEp3YmZ5Lzd1akE2dTZMTU5RZzgKLS0tIDUrVHBaelNxbC9sR05jWHJ2R2tX\nUUVlUWM3MWVSbVdFNXFRV2RhL1ltZmMK5t2/NTzyGVJ6l8tpYNqbKpiA1gI1/DuJ\n8tgVr2h6w6RkpAeL2njC9am7xx65argwTgjoMCicJCA1FkQGonC8Qw==\n-----END AGE ENCRYPTED FILE-----\n" + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA0aDRtdkZZOWxnOHV3RkJv\naW5KTkdCSXZDUGtpMEhQS1VXMlAySXFrWm44Cjc4cWVCZXBvNllMYUtnNjUrOHpx\nbnVkVFA2ZVJXeVBRZjhvUUh3Mll0QW8KLS0tIGhaVUdEUXU0ek5OSEMyc0RKbWFx\nZkZ6T0QxZExEckhMMk0vcFloOHgrc3MKmVA8XIu8sP39eqjTUtFPrBGM9E3/dewZ\nyakozj9DWbP3DgnMbuVr3+cStfG6bngaLTluWVTXQmw5OT3V3OM83g==\n-----END AGE ENCRYPTED FILE-----\n" }, { "recipient": "age1g2yz8vzyyzmdsht3398da6nu3pgl54rkw5wuveqh5wfn23r2hy0qu6d4dw", - "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBIVXF6OG55UGFQeUx6aGMz\nUm9XbDArYUE0ZFRrNmtib0NreFYvK08vNmd3Cm4zYnVtZm1OVjBYMzJDbXJ1b2Ew\nOGtWVGMxMVA0VklXckR5T1A3MGpVY2sKLS0tIGdTS0s3ejFnLy9NakpUQ2tra2Z5\nS1pyeU1YMTRzNFA0aWFobVJlYXYrNDQK0h6SurvqP+QFwLXnwOTQhfg3srpLRUZM\nx0toFWm4Xe6EC/mzvx8aIt5L+/Wfttm8SrskUIbHU/z50hufG/LH9A==\n-----END AGE ENCRYPTED FILE-----\n" + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBYaG9zNzRldDZuZTdFUFh3\nbHhqcHIrSEQ5RTlDelovWUFiZkZSWStaTm00Cmp5dWFva0phSXp2UzNGMVRZTzFa\nTnZjL2FGK2JEN0cvZXQ2VzEzZ2s5bDgKLS0tIDNTT2N2elFjK3V3YjBBalYrVVhn\nQUR5NVVpZlBOSm8wczd2cGtSWVVvQkUKqbmk9+1Q9i8f0JyuNtGx281H2jxTr8nF\nLPzUKCXmrZZn+yzwyhkl8UmFz0F9gKGOP9C3EoowIkKootIB8tEJZQ==\n-----END AGE ENCRYPTED FILE-----\n" + }, + { + "recipient": "age1kdym6a2z8trwn3efwj4kw2eypsh2pucl4vk3faqmqglhgx4ek47s3mt3kk", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBxWld5ZTN3S0xMbjg3bzhM\nSTg4RU5JbWZIaFdIamJseGphb2hMOEFDSGlnCk9GVVNVMEJqM3NPQ01RTUhKZEk4\nS2Jtenl6bkdEaE13TDhlbHViY2lrbmsKLS0tIE55NDQxZEdQbnplaG5EUW1PNUIr\nZUF3R2pJckJpMEZBR0VzZGI1WFVIL2MKmbin+Z2d5eUhKwopoRFDviQPQjlgI6Hh\nSIT2+b6QsKwmbsCa/z4xCDfLId5TJQMYUveVhWH1F8rR2IeD+JR5bg==\n-----END AGE ENCRYPTED FILE-----\n" } ], - "lastmodified": "2024-09-20T16:48:03Z", - "mac": "ENC[AES256_GCM,data:b1BH6RgDTck/Uzmw9dST00bSQQjpE+GiftQxwgM8tBM+aXhLnOJOY5gZnlxKzjAR7UTSO2sbSQ/Vax1lJKLj57HkBiX42hEn2q3u2b2A+uce/q7qyksANH4yX0GJSxfwlR0nIxlZVWTqA7Aje1UoNsCXzqt7MXtjps0Vg0ntZ88=,iv:gU7bli4F6cgA8K/YvqFVqhEXHrCBT1kTcThj41IzUtk=,tag:2APA3KgrBkbsvf0YXFBPhQ==,type:str]", + "lastmodified": "2024-09-23T16:17:07Z", + "mac": "ENC[AES256_GCM,data:tix5eQKYkCeteEV2o2+QzM1P1vpRKqtMqVakr5FgcaXUvQjsr8sL2OvmNO8mXCc9sBOSaBxbzlWnWDzzsDx1ez2TyEug57ZFg0whze9zvaMRVnhVzrEVXS87O0QKd+Q8mqZCAlNI3Aijg+FNMYEWcp9Z3jgc/0dTPNFpYKrotC8=,iv:ItHoYV49/1JKq2x5pnqsTzs9o08F3RCyKQHtPoumw9g=,tag:1w1PBg85p26WFGATcuBAIw==,type:str]", "pgp": null, "unencrypted_suffix": "_unencrypted", "version": "3.9.0" From e9c470cad0d29b806f93d1b8d483e395099e087b Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Wed, 25 Sep 2024 17:31:01 +0800 Subject: [PATCH 46/65] refactor(scripts): Move make gcloud_auth into source.sh --- .github/actions/container_setup/action.yml | 7 +------ Makefile | 10 +--------- README.md | 3 --- source.sh | 4 ++++ 4 files changed, 6 insertions(+), 18 deletions(-) diff --git a/.github/actions/container_setup/action.yml b/.github/actions/container_setup/action.yml index 86d0c2e2c4..aade29ae97 100644 --- a/.github/actions/container_setup/action.yml +++ b/.github/actions/container_setup/action.yml @@ -14,9 +14,4 @@ runs: run: | mkdir -p ${XDG_CONFIG_HOME:-$HOME/.config}/sops/age echo $AGE_SECRET_KEY > ${XDG_CONFIG_HOME:-$HOME/.config}/sops/age/keys.txt - /bin/bash ./scripts/secret.sh decrypt - - - name: Authenticate to Google Cloud - shell: bash - run: | - make gcloud_auth + /bin/bash ./scripts/secret.sh decrypt \ No newline at end of file diff --git a/Makefile b/Makefile index f658b44498..374c8bc2c7 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ SHELL := /bin/bash MAKEFLAGS += --no-print-directory -.PHONY: help gcloud_auth deploy_tf_backend destroy_tf_backend +.PHONY: help deploy_tf_backend destroy_tf_backend @@ -19,14 +19,6 @@ encrypt: ## Encrypt the secrets file decrypt: ## Decrypt the secrets file ./scripts/secret.sh decrypt -## -## Google Cloud CLI -## - -gcloud_auth: ## Authenticate with gcloud - . ./source.sh && \ - gcloud auth activate-service-account --key-file=$$GOOGLE_APPLICATION_CREDENTIALS && \ - gcloud auth configure-docker $$GCLOUD_REGION-docker.pkg.dev --quiet ## Repo-wide deploy_all: ## Deploy all infrastructure and code diff --git a/README.md b/README.md index 9ba2a50d9c..082188fb31 100644 --- a/README.md +++ b/README.md @@ -27,9 +27,6 @@ To deploy all infrastructure on the command line, you can run the following comm # Decrypt secrets make decrypt # You need your age key in the sops file, contact Yongbeom for how to do this. -# You may have to authenticate to gcloud first: -make gcloud_auth - make deploy_all # This is equivalent to running diff --git a/source.sh b/source.sh index e4e2d4ea46..db60a190a9 100755 --- a/source.sh +++ b/source.sh @@ -30,4 +30,8 @@ TERRAFORM_WORKSPACE=$ENV GCLOUD_REPOSITORY_URL=${GCLOUD_REGION}-docker.pkg.dev/${GCLOUD_PROJECT}/${ENV} +# Authenticate into gcloud +gcloud auth activate-service-account --key-file=$GOOGLE_APPLICATION_CREDENTIALS +gcloud auth configure-docker $GCLOUD_REGION-docker.pkg.dev --quiet + set +o allexport \ No newline at end of file From 483c72c3c4f4fa97b4d19efc6098a7c8e190338c Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Wed, 25 Sep 2024 17:53:52 +0800 Subject: [PATCH 47/65] refactor: Refactor all scripts for consistency --- Makefile | 31 +-- README.md | 57 ++++- docker_registry/Makefile | 41 ++++ docker_registry/source.sh | 8 + .../tf}/.terraform.lock.hcl | 0 {tf => docker_registry/tf}/provider.tf | 0 {tf => docker_registry/tf}/registry.tf | 0 frontend/yarn.lock | 213 ++++++++++++++++-- 8 files changed, 302 insertions(+), 48 deletions(-) create mode 100644 docker_registry/Makefile create mode 100644 docker_registry/source.sh rename {tf => docker_registry/tf}/.terraform.lock.hcl (100%) rename {tf => docker_registry/tf}/provider.tf (100%) rename {tf => docker_registry/tf}/registry.tf (100%) diff --git a/Makefile b/Makefile index 374c8bc2c7..9791c162f3 100644 --- a/Makefile +++ b/Makefile @@ -21,33 +21,16 @@ decrypt: ## Decrypt the secrets file ## Repo-wide -deploy_all: ## Deploy all infrastructure and code - $(MAKE) deploy_infra - $(MAKE) -C frontend deploy +deploy: ## Deploy all infrastructure and code + $(MAKE) -C docker_registry deploy $(MAKE) -C backend deploy + $(MAKE) -C frontend deploy -destroy_all: ## Destroy all infrastructure and code - $(MAKE) destroy_infra - $(MAKE) -C frontend destroy +# Recommended to destroy services in the reverse order of deployment. +destroy: ## Destroy all infrastructure and code + $(MAKE) -C frontend destroy $(MAKE) -C backend destroy - -## -## Global Terraform Infrastructure -## - -deploy_infra: ## Deploy Global OpenTofu/Terraform infrastructure - . ./source.sh && \ - cd tf && \ - tofu init && \ - tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ - tofu apply -auto-approve - -destroy_infra: ## Destroy Global OpenTofu/Terraform infrastructure - . ./source.sh && \ - cd tf && \ - tofu init && \ - tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ - tofu destroy -auto-approve + $(MAKE) -C docker_registry destroy ## ## Terraform backend diff --git a/README.md b/README.md index 082188fb31..2848edcbd4 100644 --- a/README.md +++ b/README.md @@ -16,25 +16,67 @@ Here are the scripts relevant in deploying the project. +## Repository Structure + +Except the directories `.github`, `ci`, `scripts`, `secrets`, `tf_backend`, all directories are services. + +Each service has: +- A `tf` directory, which contains the Terraform configuration for the service. +- A `source.sh` file, which sources the base directory's `source.sh` file and adds on any additional environment variables required by the service. +- A `Makefile` which contains the commands to deploy, test and destroy the service. + +Here are the relevant make targets for each service. For some services, the `Makefile` may omit some of these targets (e.g. `docker_registry` service has no code to build or deploy.) + +```sh +Usage: make [target] +Targets: + help Show this help + local Run the code locally + deploy Deploy the code and infrastructure + destroy Destroy the infrastructure + test Run the tests + code_build Build the code + code_deploy Deploy the code + infra_deploy Deploy the infrastructure + infra_destroy Destroy the infrastructure + url Get the service URL +``` + +## Developing ### Code and Infrastructure Deployment -There are two ways to deploy the project to the cloud. +There are two ways to deploy the project to the cloud. Note that every branch creates its own separate deployment copy. First, you can simply push to your feature branch, and the CI/CD pipeline will deploy a copy of the infrastructure and the code to the cloud. -To deploy all infrastructure on the command line, you can run the following command: +To deploy all infrastructure and code on the command line, you can run the following command: ```bash # Decrypt secrets make decrypt # You need your age key in the sops file, contact Yongbeom for how to do this. -make deploy_all +# In the base directory, +make deploy # This is equivalent to running -make deploy_infra +make deploy # in docker_registry make deploy # in frontend make deploy # in backend ``` +To destroy your deployment, you can do: +```bash +# Decrypt secrets +make decrypt # You need your age key in the sops file, contact Yongbeom for how to do this. + +# In the base directory, +make destroy + +# This is equivalent to running +make destroy # in docker_registry +make destroy # in frontend +make destroy # in backend +``` + ### Code Deployment @@ -62,7 +104,7 @@ make local make local ``` -## Directory Structure +## Non-Service Directories All direct subdirectories of the project base directory (with the following exceptions) are microservices. Additional information about some directories is provided below. @@ -85,10 +127,5 @@ Contains secrets for the project. Contains the Terraform configuration for the Terraform state backend. For this project, the terraform backend is stored in a Google Cloud Storage bucket. -### `{service}/tf` -Contains the Terraform configuration for the service. - -Note that each service has its own Terraform configuration, and state. - [^1]: OpenTofu 1.8.0 introduces [static variable evaluation](https://opentofu.org/blog/opentofu-1-8-0/), which we use for the project. \ No newline at end of file diff --git a/docker_registry/Makefile b/docker_registry/Makefile new file mode 100644 index 0000000000..07d4b92d0a --- /dev/null +++ b/docker_registry/Makefile @@ -0,0 +1,41 @@ +SHELL=/bin/bash + +BACKEND_CLOUD_SERVICE_URL=$(shell $(MAKE) -C ../backend -s url | head -n 2) +BACKEND_LOCAL_SERVICE_URL=$(shell $(MAKE) -C ../backend -s local_url) + +help: ## Show this help + @echo "Usage: make [target]" + @echo "Targets:" + @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " %-20s %s\n", $$1, $$2}' $(MAKEFILE_LIST) + +local: ## Run the code locally + export VITE_BACKEND_SERVICE_URL="$(BACKEND_LOCAL_SERVICE_URL)" && \ + yarn run dev + +deploy: infra_deploy ## Deploy all +destroy: infra_destroy ## Destroy all + + +test: ## Run the tests + @echo $(BACKEND_CLOUD_SERVICE_URL) + +infra_deploy: ## Deploy the infrastructure + . ./source.sh && \ + cd tf && \ + tofu init && \ + tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ + tofu apply -auto-approve + +infra_destroy: ## Destroy the infrastructure + . ./source.sh && \ + cd tf && \ + tofu init && \ + tofu workspace select -or-create $$TERRAFORM_WORKSPACE && \ + tofu destroy -auto-approve + +url: ## Get the service URL + @. ./source.sh && \ + cd tf && \ + tofu init &> /dev/null && \ + tofu workspace select -or-create $$TERRAFORM_WORKSPACE &> /dev/null && \ + tofu output -raw frontend_bucket_website_url \ No newline at end of file diff --git a/docker_registry/source.sh b/docker_registry/source.sh new file mode 100644 index 0000000000..bfe40c56ef --- /dev/null +++ b/docker_registry/source.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +set -a + +# Set the environment variables +. ../source.sh + +set +a \ No newline at end of file diff --git a/tf/.terraform.lock.hcl b/docker_registry/tf/.terraform.lock.hcl similarity index 100% rename from tf/.terraform.lock.hcl rename to docker_registry/tf/.terraform.lock.hcl diff --git a/tf/provider.tf b/docker_registry/tf/provider.tf similarity index 100% rename from tf/provider.tf rename to docker_registry/tf/provider.tf diff --git a/tf/registry.tf b/docker_registry/tf/registry.tf similarity index 100% rename from tf/registry.tf rename to docker_registry/tf/registry.tf diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 13bb91baff..2150b84ecd 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -23,7 +23,7 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz" integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ== -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.24.5": +"@babel/core@^7.24.5": version "7.25.2" resolved "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz" integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== @@ -181,11 +181,121 @@ "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" +"@esbuild/aix-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" + integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== + +"@esbuild/android-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" + integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== + +"@esbuild/android-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" + integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== + +"@esbuild/android-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" + integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== + +"@esbuild/darwin-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" + integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== + +"@esbuild/darwin-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" + integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== + +"@esbuild/freebsd-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" + integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== + +"@esbuild/freebsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" + integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== + +"@esbuild/linux-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" + integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== + +"@esbuild/linux-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" + integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== + +"@esbuild/linux-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" + integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== + +"@esbuild/linux-loong64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" + integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== + +"@esbuild/linux-mips64el@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" + integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== + +"@esbuild/linux-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" + integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== + +"@esbuild/linux-riscv64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" + integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== + +"@esbuild/linux-s390x@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" + integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== + "@esbuild/linux-x64@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz" integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== +"@esbuild/netbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" + integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== + +"@esbuild/openbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" + integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== + +"@esbuild/sunos-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" + integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== + +"@esbuild/win32-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" + integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== + +"@esbuild/win32-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" + integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== + +"@esbuild/win32-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" + integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== + "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" @@ -222,7 +332,7 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@^9.9.0", "@eslint/js@9.10.0": +"@eslint/js@9.10.0", "@eslint/js@^9.9.0": version "9.10.0" resolved "https://registry.npmjs.org/@eslint/js/-/js-9.10.0.tgz" integrity sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g== @@ -289,7 +399,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -302,6 +412,61 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@rollup/rollup-android-arm-eabi@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.0.tgz#e8c16c336f060b4cb592f62eb4f0e543d79d51fe" + integrity sha512-/IZQvg6ZR0tAkEi4tdXOraQoWeJy9gbQ/cx4I7k9dJaCk9qrXEcdouxRVz5kZXt5C2bQ9pILoAA+KB4C/d3pfw== + +"@rollup/rollup-android-arm64@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.0.tgz#7a44160a14017fa744912d7037c7d81d6f8a46e7" + integrity sha512-ETHi4bxrYnvOtXeM7d4V4kZWixib2jddFacJjsOjwbgYSRsyXYtZHC4ht134OsslPIcnkqT+TKV4eU8rNBKyyQ== + +"@rollup/rollup-darwin-arm64@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.0.tgz#6122dc37d4a09521d8abe18925956d3b46cfbac9" + integrity sha512-ZWgARzhSKE+gVUX7QWaECoRQsPwaD8ZR0Oxb3aUpzdErTvlEadfQpORPXkKSdKbFci9v8MJfkTtoEHnnW9Ulng== + +"@rollup/rollup-darwin-x64@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.0.tgz#453f345899cbf544aa0d6f5808d24d2e42f605b7" + integrity sha512-h0ZAtOfHyio8Az6cwIGS+nHUfRMWBDO5jXB8PQCARVF6Na/G6XS2SFxDl8Oem+S5ZsHQgtsI7RT4JQnI1qrlaw== + +"@rollup/rollup-linux-arm-gnueabihf@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.0.tgz#3a32fa4e80a62a6d733014838b1123fe76b060fe" + integrity sha512-9pxQJSPwFsVi0ttOmqLY4JJ9pg9t1gKhK0JDbV1yUEETSx55fdyCjt39eBQ54OQCzAF0nVGO6LfEH1KnCPvelA== + +"@rollup/rollup-linux-arm-musleabihf@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.0.tgz#55d3953c54419e93efe124882a3103c8a2f65641" + integrity sha512-YJ5Ku5BmNJZb58A4qSEo3JlIG4d3G2lWyBi13ABlXzO41SsdnUKi3HQHe83VpwBVG4jHFTW65jOQb8qyoR+qzg== + +"@rollup/rollup-linux-arm64-gnu@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.0.tgz#cd626963b9962baf8e09d792e67b87269a5bcfff" + integrity sha512-U4G4u7f+QCqHlVg1Nlx+qapZy+QoG+NV6ux+upo/T7arNGwKvKP2kmGM4W5QTbdewWFgudQxi3kDNST9GT1/mg== + +"@rollup/rollup-linux-arm64-musl@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.0.tgz#ad209270c9937a27346fce5b0670cbdfb1e6a0a6" + integrity sha512-aQpNlKmx3amwkA3a5J6nlXSahE1ijl0L9KuIjVOUhfOh7uw2S4piR3mtpxpRtbnK809SBtyPsM9q15CPTsY7HQ== + +"@rollup/rollup-linux-powerpc64le-gnu@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.0.tgz#fdd173929a5bba8b7e8b37314380213d9604088f" + integrity sha512-9fx6Zj/7vve/Fp4iexUFRKb5+RjLCff6YTRQl4CoDhdMfDoobWmhAxQWV3NfShMzQk1Q/iCnageFyGfqnsmeqQ== + +"@rollup/rollup-linux-riscv64-gnu@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.0.tgz#90b11314fbf45d04083f658e08dc3b32fd713061" + integrity sha512-VWQiCcN7zBgZYLjndIEh5tamtnKg5TGxyZPWcN9zBtXBwfcGSZ5cHSdQZfQH/GB4uRxk0D3VYbOEe/chJhPGLQ== + +"@rollup/rollup-linux-s390x-gnu@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.0.tgz#46bb2f1135aeec646b720d6032d7c86915f8b2ec" + integrity sha512-EHmPnPWvyYqncObwqrosb/CpH3GOjE76vWVs0g4hWsDRUVhg61hBmlVg5TPXqF+g+PvIbqkC7i3h8wbn4Gp2Fg== + "@rollup/rollup-linux-x64-gnu@4.22.0": version "4.22.0" resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.0.tgz" @@ -312,6 +477,21 @@ resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.0.tgz" integrity sha512-anr1Y11uPOQrpuU8XOikY5lH4Qu94oS6j0xrulHk3NkLDq19MlX8Ng/pVipjxBJ9a2l3+F39REZYyWQFkZ4/fw== +"@rollup/rollup-win32-arm64-msvc@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.0.tgz#6bd66c198f80c8e7050cfd901701cfb9555d768a" + integrity sha512-7LB+Bh+Ut7cfmO0m244/asvtIGQr5pG5Rvjz/l1Rnz1kDzM02pSX9jPaS0p+90H5I1x4d1FkCew+B7MOnoatNw== + +"@rollup/rollup-win32-ia32-msvc@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.0.tgz#58daea1f1e65143c44c8f3311f30ff8eefa62bae" + integrity sha512-+3qZ4rer7t/QsC5JwMpcvCVPRcJt1cJrYS/TMJZzXIJbxWFQEVhrIc26IhB+5Z9fT9umfVc+Es2mOZgl+7jdJQ== + +"@rollup/rollup-win32-x64-msvc@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.0.tgz#956948629f6b87de0bdf526b28d940221540bbb6" + integrity sha512-YdicNOSJONVx/vuPkgPTyRoAPx3GbknBZRCOUkK84FJ/YTfs/F0vl/YsMscrB6Y177d+yDRcj+JWMPMCgshwrA== + "@types/babel__core@^7.20.5": version "7.20.5" resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" @@ -385,7 +565,7 @@ natural-compare "^1.4.0" ts-api-utils "^1.3.0" -"@typescript-eslint/parser@^8.0.0 || ^8.0.0-alpha.0", "@typescript-eslint/parser@8.6.0": +"@typescript-eslint/parser@8.6.0": version "8.6.0" resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.6.0.tgz" integrity sha512-eQcbCuA2Vmw45iGfcyG4y6rS7BhWfz9MQuk409WD47qMM+bKCGQWXxvoOs1DUp+T7UBMTtRTVT+kXr7Sh4O9Ow== @@ -467,7 +647,7 @@ acorn-jsx@^5.3.2: resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.12.0: +acorn@^8.12.0: version "8.12.1" resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== @@ -547,7 +727,7 @@ braces@^3.0.3: dependencies: fill-range "^7.1.1" -browserslist@^4.23.1, "browserslist@>= 4.21.0": +browserslist@^4.23.1: version "4.23.3" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz" integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== @@ -598,16 +778,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - color-name@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" @@ -733,7 +913,7 @@ eslint-visitor-keys@^4.0.0: resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz" integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw== -"eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^8.57.0 || ^9.0.0", eslint@^9.9.0, eslint@>=7: +eslint@^9.9.0: version "9.10.0" resolved "https://registry.npmjs.org/eslint/-/eslint-9.10.0.tgz" integrity sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw== @@ -888,6 +1068,11 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" @@ -1361,7 +1546,7 @@ typescript-eslint@^8.0.1: "@typescript-eslint/parser" "8.6.0" "@typescript-eslint/utils" "8.6.0" -typescript@^5.5.3, typescript@>=4.2.0: +typescript@^5.5.3: version "5.6.2" resolved "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz" integrity sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw== @@ -1381,7 +1566,7 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -"vite@^4.2.0 || ^5.0.0", vite@^5.4.1: +vite@^5.4.1: version "5.4.6" resolved "https://registry.npmjs.org/vite/-/vite-5.4.6.tgz" integrity sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q== From f862e9efe4223f8bdaa2406cd45b03f4e48726dd Mon Sep 17 00:00:00 2001 From: Kim Yongbeom Date: Wed, 25 Sep 2024 20:00:59 +0800 Subject: [PATCH 48/65] feat: Update GH Actions --- .github/workflows/cleanup_branch.yml | 2 +- .github/workflows/on_push.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cleanup_branch.yml b/.github/workflows/cleanup_branch.yml index 7d01fa1240..b8aba26a7a 100644 --- a/.github/workflows/cleanup_branch.yml +++ b/.github/workflows/cleanup_branch.yml @@ -42,7 +42,7 @@ jobs: - name: Destroy Global Infrastructure shell: bash - run: make destroy_infra + run: cd docker_registry && make destroy - name: Destroy Backend shell: bash diff --git a/.github/workflows/on_push.yml b/.github/workflows/on_push.yml index f13d279445..2ee4817a87 100644 --- a/.github/workflows/on_push.yml +++ b/.github/workflows/on_push.yml @@ -50,7 +50,7 @@ jobs: - name: Deploy Global Infrastructure shell: bash if: ${{ github.event_name }} == 'create' || ${{ steps.changes.outputs.global_infra }} == 'true' - run: make deploy_infra + run: cd docker_registry && make deploy - name: Deploy Backend if: ${{ github.event_name }} == 'create' || ${{ steps.changes.outputs.backend }} == 'true' From 985dfe95b363a5d137de024d364a2d5013b186bd Mon Sep 17 00:00:00 2001 From: bhnuka <01bhanukaekanayake@gmail.com> Date: Fri, 27 Sep 2024 11:30:32 +0800 Subject: [PATCH 49/65] add question management and question api --- .gitignore | 3 +- frontend/src/App.tsx | 53 +- .../src/__test__/QuestionManagement.test.tsx | 53 + frontend/src/api/questionApi.ts | 51 + .../src/components/QuestionManagement.tsx | 149 + frontend/src/jest.setup.ts | 1 + package-lock.json | 11521 ++++++++++++++++ package.json | 32 + 8 files changed, 11817 insertions(+), 46 deletions(-) create mode 100644 frontend/src/__test__/QuestionManagement.test.tsx create mode 100644 frontend/src/api/questionApi.ts create mode 100644 frontend/src/components/QuestionManagement.tsx create mode 100644 frontend/src/jest.setup.ts create mode 100644 package-lock.json create mode 100644 package.json diff --git a/.gitignore b/.gitignore index 22d12b895f..df09198a98 100644 --- a/.gitignore +++ b/.gitignore @@ -40,4 +40,5 @@ override.tf.json # Ignore CLI configuration files .terraformrc -terraform.rc \ No newline at end of file +terraform.rc +node_modules diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index e64ceb9fc1..4c32c20a0e 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1,50 +1,13 @@ -import { useEffect, useState } from 'react' -import reactLogo from './assets/react.svg' -import viteLogo from '/vite.svg' -import './App.css' -import axios from 'axios' +import React from 'react'; +import QuestionManagement from './components/QuestionManagement'; +import './App.css'; -axios.defaults.baseURL = import.meta.env.VITE_BACKEND_SERVICE_URL -console.log('Backend service URL:', axios.defaults.baseURL) function App() { - const [count, setCount] = useState(0) - - const [res, setRes] = useState('Processing...') - - useEffect(() => { - axios.get('/hello').then((response) => { - setRes(response.data) - }) - }) - return ( - <> -

-

Vite + React

-
- -

- Edit src/App.tsx and save to test HMR -

-

- Pinging the backend service at {axios.defaults.baseURL}:
- {res} -

-
-

- Click on the Vite and React logos to learn more -

- - ) +
+ +
+ ); } -export default App +export default App; \ No newline at end of file diff --git a/frontend/src/__test__/QuestionManagement.test.tsx b/frontend/src/__test__/QuestionManagement.test.tsx new file mode 100644 index 0000000000..5d54995ad1 --- /dev/null +++ b/frontend/src/__test__/QuestionManagement.test.tsx @@ -0,0 +1,53 @@ +import React from 'react'; +import { render, screen, fireEvent, waitFor } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import QuestionManagement from '../components/QuestionManagement'; +import * as api from '../api/questionApi'; + +jest.mock('../api/questionApi'); + +describe('QuestionManagement', () => { + beforeEach(() => { + (api.fetchQuestions as jest.Mock).mockResolvedValue([ + { id: 1, title: 'Test Question', description: 'Test Description', category: 'algorithms', complexity: 'easy' } + ]); + }); + + test('renders question management form', () => { + render(); + expect(screen.getByText('Question Management')).toBeInTheDocument(); + expect(screen.getByPlaceholderText('Question Title')).toBeInTheDocument(); + expect(screen.getByText('Submit')).toBeInTheDocument(); + }); + + test('displays fetched questions', async () => { + render(); + await waitFor(() => { + expect(screen.getByText('Test Question')).toBeInTheDocument(); + }); + }); + + test('handles form submission', async () => { + (api.createQuestion as jest.Mock).mockResolvedValue({ id: 2, title: 'New Question', description: 'New Description', category: 'data-structures', complexity: 'medium' }); + + render(); + + fireEvent.change(screen.getByPlaceholderText('Question Title'), { target: { value: 'New Question' } }); + fireEvent.change(screen.getByPlaceholderText('Question Description'), { target: { value: 'New Description' } }); + fireEvent.change(screen.getByRole('combobox', { name: /category/i }), { target: { value: 'data-structures' } }); + fireEvent.change(screen.getByRole('combobox', { name: /complexity/i }), { target: { value: 'medium' } }); + + fireEvent.click(screen.getByText('Submit')); + + await waitFor(() => { + expect(api.createQuestion).toHaveBeenCalledWith({ + title: 'New Question', + description: 'New Description', + category: 'data-structures', + complexity: 'medium' + }); + }); + }); + + // Add more tests for edit, delete, and error handling as needed +}); \ No newline at end of file diff --git a/frontend/src/api/questionApi.ts b/frontend/src/api/questionApi.ts new file mode 100644 index 0000000000..6d28ef168d --- /dev/null +++ b/frontend/src/api/questionApi.ts @@ -0,0 +1,51 @@ +import axios from 'axios'; + +// Define the Question interface +export interface Question { + id: number; + title: string; + description: string; + category: string; + complexity: string; +} + +const API_URL = 'http://your-api-url.com/api/questions'; + +export const fetchQuestions = async (): Promise => { + try { + const response = await axios.get(API_URL); + return response.data; + } catch (error) { + console.error('Error fetching questions:', error); + throw error; + } +}; + +export const createQuestion = async (questionData: Omit): Promise => { + try { + const response = await axios.post(API_URL, questionData); + return response.data; + } catch (error) { + console.error('Error creating question:', error); + throw error; + } +}; + +export const updateQuestion = async (id: number, questionData: Omit): Promise => { + try { + const response = await axios.put(`${API_URL}/${id}`, questionData); + return response.data; + } catch (error) { + console.error('Error updating question:', error); + throw error; + } +}; + +export const deleteQuestion = async (id: number): Promise => { + try { + await axios.delete(`${API_URL}/${id}`); + } catch (error) { + console.error('Error deleting question:', error); + throw error; + } +}; \ No newline at end of file diff --git a/frontend/src/components/QuestionManagement.tsx b/frontend/src/components/QuestionManagement.tsx new file mode 100644 index 0000000000..a2f70119d3 --- /dev/null +++ b/frontend/src/components/QuestionManagement.tsx @@ -0,0 +1,149 @@ +import React, { useState, useEffect, ChangeEvent, FormEvent } from 'react'; +import { Question, fetchQuestions, createQuestion, updateQuestion, deleteQuestion } from '../api/questionApi'; + +interface FormData extends Omit { + id?: number; +} + +const QuestionManagement: React.FC = () => { + const [questions, setQuestions] = useState([]); + const [formData, setFormData] = useState({ + title: '', + description: '', + category: '', + complexity: '' + }); + const [error, setError] = useState(null); + + useEffect(() => { + fetchQuestionsData(); + }, []); + + const fetchQuestionsData = async () => { + try { + const data = await fetchQuestions(); + setQuestions(data); + } catch (err) { + setError('Failed to fetch questions. Please try again.'); + } + }; + + const handleInputChange = (e: ChangeEvent) => { + const { name, value } = e.target; + setFormData({ ...formData, [name]: value }); + }; + + const validateForm = (): boolean => { + if (!formData.title || !formData.description || !formData.category || !formData.complexity) { + setError('All fields are required'); + return false; + } + return true; + }; + + const handleSubmit = async (e: FormEvent) => { + e.preventDefault(); + if (!validateForm()) return; + + try { + if (formData.id) { + await updateQuestion(formData.id, formData); + } else { + await createQuestion(formData); + } + fetchQuestionsData(); + setFormData({ title: '', description: '', category: '', complexity: '' }); + setError(null); + } catch (err) { + setError('Failed to save question. Please try again.'); + } + }; + + const handleDelete = async (id: number) => { + try { + await deleteQuestion(id); + fetchQuestionsData(); + } catch (err) { + setError('Failed to delete question. Please try again.'); + } + }; + + const handleEdit = (question: Question) => { + setFormData(question); + setError(null); + }; + + return ( +
+

Question Management

+ + {error &&
{error}
} + +
+ +