diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 00000000..c0fc53ab Binary files /dev/null and b/.DS_Store differ diff --git a/.vscode/settings.json b/.vscode/settings.json index 3d25faff..99c499e3 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,3 @@ { - - "liveServer.settings.port": 5502 + "liveServer.settings.port": 5504 } diff --git a/Coverpage.html b/Coverpage.html index 1a0ca0de..09d565b9 100644 --- a/Coverpage.html +++ b/Coverpage.html @@ -1,1224 +1,158 @@ - - Retro - - - - - - - - - - - - + - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
- -
- - - RETRO + +
+ Welcome to
+ + + + Retro World -
-
-
- -
-
+
- - - - - - diff --git a/Css-files/about.css b/Css-files/about.css index b255a580..27ec4701 100644 --- a/Css-files/about.css +++ b/Css-files/about.css @@ -105,7 +105,7 @@ } .mainhead h1 { font-family: Georgia; - font-size: 3.8rem; + font-size: 3rem; color: white; padding-bottom: 20px; } @@ -334,22 +334,21 @@ } .social-icons a { - font-size: 1.2rem; - padding: 8px; - margin: 15px; + font-size: 1rem; + padding: 7px; + margin: 7px 6px 0 8px; text-decoration: none; /* color: white; */ } .fa-facebook{ color: hsl(203, 30%, 26%); - font-size: 1.2rem; + font-size: 1rem; padding: 8px; margin: 15px; } .fa-facebook:hover { - transform: scale(1.5); color:#3B5998; transition: transform 0.2s ease, color 0.2s ease; @@ -357,7 +356,7 @@ .fa-instagram{ color: hsl(203, 30%, 26%); - font-size: 1.2rem; + font-size: 1rem; padding: 8px; margin: 15px; } @@ -368,18 +367,39 @@ } .fa-x-twitter{ color: hsl(203, 30%, 26%); - font-size: 1.2rem; + font-size: 1rem; padding: 8px; margin: 15px; - } - .fa-x-twitter:hover { color:black; transform: scale(1.5); transition: transform 0.2s ease, color 0.2s ease; } - + .fa-youtube { + color: hsl(203, 30%, 26%); + font-size: 1rem; + padding: 8px; + margin: 15px; + } + + .fa-youtube:hover { + transform: scale(1.5); + color: #FF0000; + transition: transform 0.2s ease, color 0.2s ease; + } + + .fa-snapchat { + color: hsl(203, 30%, 26%); + font-size: 1rem; + padding: 8px; + margin: 15px; + } + .fa-snapchat:hover { + transform: scale(1.5); + color: #FFFC00; + transition: transform 0.2s ease, color 0.2s ease; + } .foot_panel4{ background-color: transparent; @@ -432,24 +452,6 @@ background-color: rgb(196, 89, 89); } - .social-icons a{ - font-size: 1.2rem; - padding: 15px; - text-decoration: none; - color: hsl(203, 30%, 26%); - } - - .fa-facebook:hover { - color:#3B5998; - } - - .fa-instagram:hover { - color:#D62976; - } - - .fa-twitter:hover { - color:#00B6F1; - } .cart-section{ padding: 55px 70px 30px 70px; diff --git a/Css-files/content.css b/Css-files/content.css index aa971113..4b2a42e7 100644 --- a/Css-files/content.css +++ b/Css-files/content.css @@ -119,11 +119,11 @@ body { .mainhead { text-align: center; padding-top: 30px; - padding-bottom: 50px; + /* padding-bottom: 50px; */ } .mainhead h1 { font-family: Georgia; - font-size: 3.8rem; + font-size: 3rem; color: white; padding-bottom: 20px; } @@ -240,6 +240,7 @@ input[type="submit"]:hover { .first_cont { display: flex; + flex-wrap: wrap; justify-content: center; } @@ -288,6 +289,7 @@ input[type="submit"]:hover { } .second_cont{ display: flex; + flex-wrap: wrap; padding: 40px; justify-content: center; } @@ -367,10 +369,11 @@ div.deals:hover{ box-shadow: 2px 2px 20px black; } .testimonal__image{ - width:100px; - height:100px; - border-radius:50%; - margin:0 auto 1.5rem; + width: 100px; + height: 100px; + border-radius: 50%; + object-fit: cover; + margin: 0 auto 1.5rem; } .testimonal__title{ margin-bottom: .75rem; @@ -379,7 +382,6 @@ div.deals:hover{ margin-bottom: 1.25rem; } - .section__title{ text-align: center; font-size: 2rem; @@ -389,8 +391,7 @@ div.deals:hover{ /* footer */ .foot-panel2{ background-color: transparent; - color:white; - height: 300px; + /* color:white; */ display: flex; justify-content: space-evenly; } @@ -413,7 +414,7 @@ div.deals:hover{ .foot_panel4{ background-color: transparent; color: white; - height: 160px; + height: auto; font-size: 0.9rem; text-align: center; } @@ -459,8 +460,9 @@ input } .social-icons a{ - font-size: 1.2rem; - padding: 15px; + font-size: 1rem; + padding: 7px; + margin: 7px 6px 0 8px; text-decoration: none; color: brown !important; } @@ -476,6 +478,12 @@ input .fa-twitter:hover { color:#00B6F1; } +.fa-youtube:hover { + color: #FF0000; +} +.fa-snapchat:hover { + color: #FFFC00; +} .cart-section{ padding: 55px 70px 30px 70px; @@ -498,9 +506,12 @@ input .cart table,th,td{ text-align: center; - border: 2px solid black; + border: 2px solid whitesmoke; width: 75%; } +td{ + font-size: 20px; +} #bill{ color: rgb(196, 74, 74); @@ -553,22 +564,26 @@ input flex-direction: column; justify-content: center; align-items: center; - width: 20rem; height: max-content; } #contactForm input, #contactForm textarea { - width: 50%; + width: 64%; padding: 20px; + font-size: 15px; margin: 5px; border-radius: 10px; border: none; } +#contactForm input{ + width: 76%; + font-size: 15px; +} #contactForm h3 { height: 30px; - color: #141414; + color: hsl(357, 82%,35%); } #contactForm textarea { height: 100px; @@ -613,4 +628,4 @@ input border-radius: 50%; padding: 5px 8px; font-size: 12px; -} \ No newline at end of file +} diff --git a/Css-files/contributor.css b/Css-files/contributor.css new file mode 100644 index 00000000..6d0ff7ca --- /dev/null +++ b/Css-files/contributor.css @@ -0,0 +1,262 @@ +body { + font-family: "Poppins"; + color: #333; + display: flex; + justify-content: center; + align-items: center; + min-height: 100vh; + margin: 0; +} + +.container { + text-align: center; +} + +.title { + display: inline-block; + font-size: 3em; + margin-bottom: 20px; + padding: 10px; + color: #bb0111; + text-shadow: 1px 1px 2px rgb(220, 181, 187), + 0 0 1em rgba(216, 130, 200, 0.617), 0 0 0.2em rgba(237, 233, 238, 0.623); + /* border-radius: 20px; */ + /* background-color: rgba(209, 209, 255, 0.8); */ +} + +.contributors-grid { + display: flex; + flex-wrap: wrap; + gap: 20px; + justify-content: center; + padding: 20px; + gap: 40px; +} + +.contributor-card { + width: 300px; + position: relative; + overflow: hidden; + max-width: calc(55% - 16px); + display: flex; + flex-direction: column; + align-items: center; + background-color: #f9e2f9; + /* border: 1px solid #00ebdf; */ + border-radius: 8px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + padding: 16px; + transition: transform 0.5s ease-in-out, box-shadow 0.3s ease; + text-decoration: none; + color: inherit; + /* margin-bottom: 16px; */ +} + +.contributor-card:hover { + transform: scale(1.02); + box-shadow: 1px 1px 23px rgba(11, 9, 11, 0.915); + border: none; + cursor: pointer; +} + +.contributor-card::before { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: linear-gradient(132deg, brown 50%, rgb(206, 203, 203) 51%); + /* background: linear-gradient(130deg, #3b89ff 50%, #eef6ff 50%); */ + transition: transform 0.3s ease-in-out, opacity 0.3s ease-in-out; + transform: translate(-100%, -100%); + opacity: 0; + z-index: -1; +} + +.contributor-card:hover::before { + transform: translate(0, 0); + opacity: 1; +} + +.contributor-card img { + border-radius: 50%; + width: 100px; + height: 100px; + object-fit: cover; + margin-bottom: 10px; + transition: box-shadow 0.3s ease-in-out, border 0.1s ease-in-out; +} + +.contributor-card:hover img { + border: 2px solid rgb(255, 234, 0); + box-shadow: -1px 2px 27px rgb(0, 217, 255); +} + +/* + .contributor-card h2 { + margin: 0 0 10px; + } */ +/* + .contributor-card p { + } */ + +.contributor-card h2 { + font-size: 1.2em; + color: #040404; + position: relative; + z-index: 1; + transition: text-shadow 0.3s ease-in-out, color 0.3s ease-in-out; +} + +.contributor-card p { + font-size: 1.2em; + color: #040404; + position: relative; + z-index: 1; + transition: text-shadow 0.3s ease-in-out, color 0.3s ease-in-out; + margin: 0 0 10px; +} + +.contributor-card:hover h2 { + text-shadow: 1px 1px 2px rgb(0, 108, 108), 0 0 0.2em rgb(0, 14, 108), + 0 0 0.8em rgb(0, 14, 108); + color: white; +} + +.contributor-card:hover p { + text-shadow: 1px 1px 2px rgba(4, 0, 127, 0.715), 0 0 0.2em rgb(5, 18, 168), + 0 0 0.3em rgb(134, 136, 250); + color: white; + + /* font-weight: 400; */ +} + +/* dark mode */ +/* Toggle button styles */ +.toggle-container { + position: fixed; /* Change this as needed for positioning */ + top: 25px; + right: 40px; +} + +.toggle { + appearance: none; + outline: none; + cursor: pointer; + width: 100%; + height: 100%; + box-shadow: inset calc(var(--size) * 0.33) calc(var(--size) * -0.25) 0; + border-radius: 999px; + color: hsl(240, 100%, 95%); + transition: all 500ms; + position: absolute; + top: 0; + left: 0; +} + +.toggle:checked { + background-color: #333; +} +.toggle:checked:before { + transform: translateX(25px); +} + +body { + background-color: #f8f9fa; + color: #212529; +} + +.nav-container { + background-color: #ffffff; +} + +.footer { + background-color: #ffffff; + color: #212529; +} + +/* Dark mode styles */ +body.dark-mode { + background-color: #333; + color: #ffffff; +} + +body.dark-mode .nav-container { + background-color: #343a40; +} + +body.dark-mode .footer { + background-color: #343a40; + color: #ffffff; +} +#toggle { + display: inline-block; + border-radius: 50px; + transition: all 0.4s ease-in-out; + padding: 10px 10px; + background-color: transparent; + border: 2px solid #c6c9d8bf; + color: #c6c9d8bf; + font-weight: 600; + font-size: 14px; + letter-spacing: 2px; + text-decoration: none; +} +.toggle-container { + --size: 2rem; + width: var(--size); + height: var(--size); +} + +.toggle { + appearance: none; + outline: none; + cursor: pointer; + width: 100%; + height: 100%; + box-shadow: inset calc(var(--size) * 0.33) calc(var(--size) * -0.25) 0; + border-radius: 999px; + color: hsl(240, 100%, 95%); + transition: all 500ms; + position: absolute; + top: 25px; + right: 0; + + &:checked { + --ray-size: calc(var(--size) * -0.4); + --offset-orthogonal: calc(var(--size) * 0.65); + --offset-diagonal: calc(var(--size) * 0.45); + transform: scale(0.75); + color: hsl(40, 100%, 50%); + box-shadow: inset 0 0 0 var(--size), + calc(var(--offset-orthogonal) * -1) 0 0 var(--ray-size), + var(--offset-orthogonal) 0 0 var(--ray-size), + 0 calc(var(--offset-orthogonal) * -1) 0 var(--ray-size), + 0 var(--offset-orthogonal) 0 var(--ray-size), + calc(var(--offset-diagonal) * -1) calc(var(--offset-diagonal) * -1) 0 + var(--ray-size), + var(--offset-diagonal) var(--offset-diagonal) 0 var(--ray-size), + calc(var(--offset-diagonal) * -1) var(--offset-diagonal) 0 var(--ray-size), + var(--offset-diagonal) calc(var(--offset-diagonal) * -1) 0 var(--ray-size); + } +} + +/* Apply fade-down animation to the toggle container */ +.toggle-container[data-aos="fade-down"] { + transition: opacity 500ms ease-in-out; + opacity: 0; +} + +.toggle-container[data-aos="fade-down"].aos-animate { + opacity: 1; +} +body.dark-mode .contributor-card { + background: #0e1525; +} +body.dark-mode .contributor-card p { + color: white; +} +body.dark-mode .contributor-card h2 { + color: white; +} diff --git a/Css-files/forgotpass1.css b/Css-files/forgotpass1.css new file mode 100644 index 00000000..245aee19 --- /dev/null +++ b/Css-files/forgotpass1.css @@ -0,0 +1,145 @@ +@import url('https://fonts.googleapis.com/css2?family=Noto+Sans:wght@400;700&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=Philosopher:ital,wght@0,400;0,700;1,400;1,700&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=Philosopher:ital,wght@0,400;0,700;1,400;1,700&family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap'); + +body { + margin: 0; + font-family: 'Noto Sans', sans-serif; + overflow: hidden; + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='100%25' viewBox='0 0 1600 800'%3E%3Cg %3E%3Cpath fill='%23ffb9b0' d='M486 705.8c-109.3-21.8-223.4-32.2-335.3-19.4C99.5 692.1 49 703 0 719.8V800h843.8c-115.9-33.2-230.8-68.1-347.6-92.2C492.8 707.1 489.4 706.5 486 705.8z'/%3E%3Cpath fill='%23ffc1b7' d='M1600 0H0v719.8c49-16.8 99.5-27.8 150.7-33.5c111.9-12.7 226-2.4 335.3 19.4c3.4 0.7 6.8 1.4 10.2 2c116.8 24 231.7 59 347.6 92.2H1600V0z'/%3E%3Cpath fill='%23ffc8bf' d='M478.4 581c3.2 0.8 6.4 1.7 9.5 2.5c196.2 52.5 388.7 133.5 593.5 176.6c174.2 36.6 349.5 29.2 518.6-10.2V0H0v574.9c52.3-17.6 106.5-27.7 161.1-30.9C268.4 537.4 375.7 554.2 478.4 581z'/%3E%3Cpath fill='%23ffcfc6' d='M0 0v429.4c55.6-18.4 113.5-27.3 171.4-27.7c102.8-0.8 203.2 22.7 299.3 54.5c3 1 5.9 2 8.9 3c183.6 62 365.7 146.1 562.4 192.1c198.8 51.8 403.4 40.8 597.3-14.8V0H0z'/%3E%3Cpath fill='%23FFD6CE' d='M181.8 259.4c98.2 6 191.9 35.2 281.3 72.1c2.8 1.1 5.5 2.3 8.3 3.4c171 71.6 342.7 158.5 531.3 207.7c198.8 51.8 403.4 40.8 597.3-14.8V0H0v283.2C59 263.6 120.6 255.7 181.8 259.4z'/%3E%3Cpath fill='%23ffdcd4' d='M1600 0H0v136.3c62.3-20.9 127.7-27.5 192.2-19.2c93.6 12.1 180.5 47.7 263.3 89.6c2.6 1.3 5.1 2.6 7.7 3.9c158.4 81.1 319.7 170.9 500.3 223.2c210.5 61 430.8 49 636.6-16.6V0z'/%3E%3Cpath fill='%23ffe1d9' d='M454.9 86.3C600.7 177 751.6 269.3 924.1 325c208.6 67.4 431.3 60.8 637.9-5.3c12.8-4.1 25.4-8.4 38.1-12.9V0H288.1c56 21.3 108.7 50.6 159.7 82C450.2 83.4 452.5 84.9 454.9 86.3z'/%3E%3Cpath fill='%23ffe6df' d='M1600 0H498c118.1 85.8 243.5 164.5 386.8 216.2c191.8 69.2 400 74.7 595 21.1c40.8-11.2 81.1-25.2 120.3-41.7V0z'/%3E%3Cpath fill='%23ffebe4' d='M1397.5 154.8c47.2-10.6 93.6-25.3 138.6-43.8c21.7-8.9 43-18.8 63.9-29.5V0H643.4c62.9 41.7 129.7 78.2 202.1 107.4C1020.4 178.1 1214.2 196.1 1397.5 154.8z'/%3E%3Cpath fill='%23FFF0EA' d='M1315.3 72.4c75.3-12.6 148.9-37.1 216.8-72.4h-723C966.8 71 1144.7 101 1315.3 72.4z'/%3E%3C/g%3E%3C/svg%3E"); + background-size: cover; +} +.circle { + z-index: 998; + width: 20px; + height: 20px; + border-radius: 50%; + pointer-events: none; + animation: colors 5s infinite; + position: fixed; + transform: translate(-50%, -50%); +} +.card-forgot { + width: 60%; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + padding: 30px 35px; + border-radius: 20px; + box-shadow: 0px 10px 40px rgba(0, 0, 0, 0.15); + background: rgba(236, 236, 236, 0.8); + backdrop-filter: blur(10px); /* Soft background blur effect */ + animation: fadeIn 2s ease-in-out; +} + +@keyframes fadeIn { + 0% { + opacity: 0; + transform: translateY(30px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} +.card-forgot h1 { + color: hsl(203, 30%,26%); + font-family: "Philosopher", sans-serif; + text-transform: uppercase; + text-align: center; +} + +.home-btn { + position: absolute; + top: 32px; + font-family: "Philosopher", sans-serif; + left: 30px; +} + +.home-btn a { + font-size: 30px; + text-decoration: none; + color: rgb(134, 78, 112); + position: relative; + transition: color 0.3s ease; /* Smooth color transition */ +} + +.home-btn a:hover { + color: rgb(141, 108, 108); /* Darken color on hover */ +} + +.home-btn a::after { + content: ''; + position: absolute; + width: 100%; + height: 1.5px; + bottom: -5px; + left: 0; + background-color: transparent; + transition: background-color 0.3s ease; /* Smooth transition */ +} + +.home-btn a:hover::after { + background-color: rgb(141, 108, 108); +} +.textfield { + width: 100%; + margin-bottom: 15px; +} + +.textfield > input { + width: 100%; + height: 45px; + border-radius: 15px; + border: 1px solid #b38484; + padding-left: 10px; + outline: none; + transition: border 0.3s ease; /* Smooth border transition */ +} + +.textfield > input:focus { + border: 2px solid #a76666; /* Highlight border on focus */ +} +.btn-reset { + width: 100%; + padding: 10px 0; + border: none; + background-color: #e55d5d; + color: #fff; + font-size: 18px; + font-weight: bold; + border-radius: 10px; + cursor: pointer; + transition: background-color 0.3s ease; +} + +.btn-reset:hover { + background-color: #ff4a4a; +} + +.error-message { + color: red; + font-family: "Poppins", sans-serif; + margin-top: 10px; +} +.switch-link { + text-align: center; + margin-top: 20px; + font-family: "Poppins", sans-serif; +} + +.switch-link a { + color: hsl(0, 100%, 50%); + text-decoration: none; + font-weight: bold; + transition: color 0.3s ease; +} + +.switch-link a:hover { + color: hsl(203, 30%, 26%); +} \ No newline at end of file diff --git a/Css-files/login1.css b/Css-files/login1.css index 3ba147a6..cbe234ea 100644 --- a/Css-files/login1.css +++ b/Css-files/login1.css @@ -129,7 +129,7 @@ body { } .textfield > input { - width: 100%; + width: 95%; height: 45px; border-radius: 15px; border: 1px solid #b38484; diff --git a/Css-files/popup.css b/Css-files/popup.css new file mode 100644 index 00000000..b429412f --- /dev/null +++ b/Css-files/popup.css @@ -0,0 +1,128 @@ + + /* Styling for the pop-up */ + .popup { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.7); + justify-content: center; + align-items: center; + z-index: 1000; + } + + .popup-content { + display: flex; + background-color: #feaea5; + border-radius: 10px; + max-width: 800px; + height: 450px; + overflow: hidden; + position: relative; + box-shadow: 0 0 15px rgba(0, 0, 0, 0.2); + } + + .popuplogo{ + position: absolute; + top: 0; + right: 12px; + height: 50px; + } + + .popup-left img { + width: 100%; + height: 100%; + object-fit: cover; + } + + .popup-right { + padding: 20px; + width: 50%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + } + + .popup h1 { + font-size: 31px; + color: #8B4513; + margin-bottom: 10px; + margin-top: 45px; + padding-top: 10px; + } + + #h2{ + font-size: 18px; + margin-bottom: 16px; + font-weight: bold; + } + + /* h2 { + font-size: 24px; + margin-bottom: 10px; + color: #4B3B2A; + } */ + + .popup-right p{ + margin-bottom: 26px; + color: #4B3B2A; + margin-bottom: 30px; + } + + input[type="email"] { + width: 100%; + padding: 18px; + padding-bottom: 20px; + margin-bottom: 10px; + border: 1px solid #8B4513; + border-radius: 5px; + font-size: 14px; + } + + #emailForm{ + padding-top: 0px; + padding-bottom: 0px; + } + + .signup-btn { + width: 100%; + padding: 10px 0; + background-color: #8B4513; + color: white; + border: none; + border-radius: 5px; + cursor: pointer; + font-size: 13px; + } + + .signup-btn:hover { + background-color: #6f3920; + font-size: 13.2px; + } + + .no-thanks { + display: block; + margin-top: 14px; + color: #4B3B2A; + text-decoration: none; + margin-bottom: 40px; + } + + .no-thanks:hover { + text-decoration: underline; + color: #381d0a; + } + + .terms { + margin-top: 15px; + font-size: 10px; + color: #4B3B2A; + } + + .terms a { + color: #8B4513; + } + \ No newline at end of file diff --git a/Css-files/signup1.css b/Css-files/signup1.css index 11321066..ce2ce7f5 100644 --- a/Css-files/signup1.css +++ b/Css-files/signup1.css @@ -24,7 +24,6 @@ body { align-items: center; height: 100vh; /* Full viewport height */ padding: 20px; /* Padding to avoid overflow */ - overflow: hidden; /* Prevents overflow */ position:relative; } @@ -154,14 +153,13 @@ body { } /* Responsive design for smaller screens */ -@media only screen and (max-width: 600px) { +@media only screen and (max-width: 980px) { .main-login { flex-direction: column; padding: 0 20px; /* Added padding to avoid edge overflow */ } .card-login { - width: 100%; /* Full width for mobile */ padding: 20px; /* Adjust padding */ } } diff --git a/Html-files/Electronic.html b/Html-files/Electronic.html index 3ac2784e..cafb6bb1 100644 --- a/Html-files/Electronic.html +++ b/Html-files/Electronic.html @@ -1,874 +1,1265 @@ - - - + + + Retro - + - - + + - - - - - - - - - - - - Retro - - + } + + .head_container_service { + height: 30px; + } + + .navbar ul { + overflow: hidden; + display: flex; + justify-content: center; + } + + .navbar li { + float: left; + list-style: none; + padding: 8px 20px; + } + + .navbar li a { + text-decoration: none; + color: black; + font-size: 1.3rem; + font-family: var(--ff-philosopher); + } + + .wrapper { + width: 100%; + height: 100vh; + display: flex; + align-items: center; + justify-content: center; + } + + .container { + height: 400px; + display: flex; + flex-wrap: nowrap; + justify-content: start; + } + + .card { + width: 80px; + border-radius: 2rem; + background-size: cover; + cursor: pointer; + overflow: hidden; + margin: 0 10px; + display: flex; + align-items: flex-end; + transition: 0.6s cubic-bezier(0.28, -0.03, 0, 0.99); + box-shadow: 0px 10px 30px -5px rgba(0, 0, 0, 0.8); + } + + .card > .row { + color: white; + display: flex; + flex-wrap: nowrap; + } + + .card > .row > .icon { + background: #223; + color: white; + border-radius: 50%; + width: 50px; + display: flex; + justify-content: center; + align-items: center; + margin: 15px; + } + + .card > .row > .description { + display: flex; + justify-content: center; + flex-direction: column; + overflow: hidden; + height: 80px; + width: 520px; + opacity: 0; + transform: translateY(30px); + transition-delay: 0.3s; + transition: all ease; + } + + .description p { + color: white; + padding-top: 5px; + } + + .description h4 { + text-transform: uppercase; + } + + input { + display: none; + } + + input:checked + label { + width: 600px; + } + + input:checked + label .description { + opacity: 1 !important; + transform: translateY(0) !important; + } + + .foot-panel2 { + background-color: transparent; + color: white; + height: 300px; + display: flex; + justify-content: space-evenly; + } + + .footer-colums p { + font-weight: 700; + } + + .footer-colums a { + display: block; + font-size: 0.85rem; + margin-top: 10px; + color: #dddddd; + } + .fa-facebook { + color: white; + font-size: 1.2rem; + padding: 8px; + margin: 15px; + } + + .fa-facebook:hover { + transform: scale(1.5); + color: #3b5998; + transition: transform 0.2s ease, color 0.2s ease; + } + + .fa-instagram { + color: white; + font-size: 1.2rem; + padding: 8px; + margin: 15px; + } + .fa-instagram:hover { + transform: scale(1.5); + color: #d62976; + transition: transform 0.2s ease, color 0.2s ease; + } + + .fa-x-twitter { + color: hsl(203, 30%, 26%); + font-size: 1.2rem; + padding: 8px; + margin: 15px; + } + + .fa-x-twitter:hover { + color: black; + transform: scale(1.5); + transition: transform 0.2s ease, color 0.2s ease; + } + + .foot_panel4 { + background-color: transparent; + /* color: white; */ + height: 160px; + font-size: 0.9rem; + text-align: center; + } + + form { + padding-top: 20px; + display: grid; + padding-bottom: 100px; + } + + input, + textarea { + height: 30px; + width: 120%; + padding: 2.5px; + box-sizing: border-box; + border-radius: 2px; + } + + #butt { + background-color: brown; + color: white !important; + padding: 3px; + border: 1px solid white; + border-radius: 4px; + cursor: pointer; + } + + #butt:hover { + background-color: rgb(196, 89, 89); + } + + .social-icons a { + font-size: 1.2rem; + padding: 8px; + margin: 15px; + text-decoration: none; + color: brown !important; + } + + .social-icons a:hover { + color: brown; + background-color: hsl(203%, 29%, 91%); + border-radius: 10px; + transform: scale(1.5); /* Increase size */ + transition: transform 0.3s ease; /* Smooth transition effect */ + } + .fa-brands.fa-facebook:hover { + color: #3b5998 !important; + } + + .fa-brands.fa-instagram:hover { + color: #d62976 !important; + } + + .fa-brands.fa-x-twitter:hover { + color: #181e20 !important; + } + + #sr { + display: none; + position: fixed; + bottom: 70px; + right: 15px; + z-index: 99; + font-size: 18px; + border: none; + outline: none; + background-color: transparent; + color: rgb(17, 17, 17); + cursor: pointer; + padding: 15px; + border-radius: 4px; + } + + #sr:hover { + color: #000; + border-radius: 100px; + } + ::-webkit-scrollbar { + width: 10px; /* Width of the scrollbar */ + } + ::-webkit-scrollbar-track { + background-color: white; /* Color of the track */ + border-radius: 10px; + } + + ::-webkit-scrollbar-thumb { + border-radius: 10px; + background: gray; + border-radius: 6px; /* Rounded corners of the thumb */ + } + + * { + scrollbar-width: thick; /* Width of the scrollbar */ + } + ::-webkit-scrollbar-button { + display: none; + } + + #badgeCount { + position: relative; + top: -7px; + right: 1px; + background-color: red; + color: white; + border-radius: 50%; + padding: 5px 8px; + font-size: 12px; + } + + /*Animation sliders*/ + .wrapper { + width: 100%; + height: 100vh; + display: flex; + align-items: center; + justify-content: center; + } + .container { + height: 400px; + display: flex; + flex-wrap: nowrap; + justify-content: start; + } + .card { + width: 80px; + border-radius: 0.75rem; + background-size: cover; + cursor: pointer; + overflow: hidden; + border-radius: 2rem; + margin: 0 10px; + display: flex; + align-items: flex-end; + transition: 0.6s cubic-bezier(0.28, -0.03, 0, 0.99); + box-shadow: 0px 10px 30px -5px rgba(0, 0, 0, 0.8); + } + .card > .row { + color: white; + display: flex; + flex-wrap: nowrap; + } + .card > .row > .icon { + background: #223; + color: white; + border-radius: 50%; + width: 50px; + display: flex; + justify-content: center; + align-items: center; + margin: 15px; + } + .card > .row > .description { + display: flex; + justify-content: center; + flex-direction: column; + overflow: hidden; + height: 80px; + width: 520px; + opacity: 0; + transform: translateY(30px); + transition-delay: 0.3s; + transition: all ease; + } + .description p { + color: #b0b0ba; + padding-top: 5px; + } + .description h4 { + text-transform: uppercase; + } + input { + display: none; + } + input:checked + label { + width: 600px; + } + input:checked + label .description { + opacity: 1 !important; + transform: translateY(0) !important; + } + .card[for="c1"] { + background-image: url(https://i.pinimg.com/564x/60/88/94/6088941267edcc935e97fd5c856b7821.jpg); + } + .card[for="c2"] { + background-image: url(https://i.pinimg.com/564x/dd/7d/ac/dd7daca632d0f865ba2d9726bb358a50.jpg); + } + .card[for="c3"] { + background-image: url(https://i.pinimg.com/564x/11/44/9b/11449b6ce1ef8dc39c27d3586afa65dd.jpg); + } + .card[for="c4"] { + background-image: url(https://i.pinimg.com/564x/25/00/d0/2500d0ab5a70b750e18fe8685e863ca0.jpg); + } + .card[for="c5"] { + background-image: url(https://i.pinimg.com/564x/e0/5b/12/e05b126721a1582adaccab8b5e219f81.jpg); + } + .card[for="c6"] { + background-image: url(https://i.pinimg.com/564x/5c/c7/70/5cc770adfc5a4d75b4909d698eb447f7.jpg); + } + .card[for="c7"] { + background-image: url(https://i.pinimg.com/474x/9e/84/04/9e84043d5af1b0476a5c1fa12df38aef.jpg); + } + .card[for="c8"] { + background-image: url(https://i.pinimg.com/474x/5c/76/51/5c76513ce8e3443a7a30cd3bbc86d94c.jpg); + } + .card[for="c9"] { + background-image: url(https://i.pinimg.com/564x/cd/89/a5/cd89a5e968ed0b1b68e73a5ac2ffe1b1.jpg); + } + .card[for="c10"] { + background-image: url(https://i.pinimg.com/474x/42/69/19/426919f03cc846b881903e3dd40a0bc6.jpg); + } + + .foot-panel2 .footer-colums a { + /* /* color: black!important; */ + text-decoration: none !important; + transition:transform 0.2s ease, text-decoration-color 0.2s ease; + /* display: inline-block; */ + + + text-decoration: none; + /* color: #000; */ + position: relative; + padding-bottom: 2px; + + } + + .foot-panel2 .footer-colums a::after{ + content: ''; + position: absolute; + left: 0; + bottom: 0; + width: 0; + height: 2px; + background-color: black; + transition: width 0.3s ease; + width:0; + + } + + .foot-panel2 .footer-colums a:hover{ + transform: scale(1.05); + } + + .foot-panel2 .footer-colums a:hover::after{ + width:100%; + } + + Retro + +
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
- -
+
+
+ +
-
- - - - - - - - - - - - - - - - - - - - -
+
+ + + + + + + + + + + + + + + + + + + + +
- - + - + + +
+ + + diff --git a/Html-files/about.html b/Html-files/about.html index 3362ac28..79e09c09 100644 --- a/Html-files/about.html +++ b/Html-files/about.html @@ -29,22 +29,21 @@ @@ -284,6 +366,7 @@
+
+
@@ -341,6 +425,7 @@

C A R T

Price Quantity Actions + Total individual price @@ -375,23 +460,24 @@

C A R T

@@ -399,11 +485,11 @@

C A R T

@@ -425,15 +511,21 @@

Contact Us!

Follow Us

Stay connected with us on social media for the latest updates, latest collection, and vintage adventures. @@ -570,6 +662,21 @@

Follow }); + + +
+ + diff --git a/Html-files/cart.js b/Html-files/cart.js index addf6077..e0f1cd44 100644 --- a/Html-files/cart.js +++ b/Html-files/cart.js @@ -1,22 +1,54 @@ -//CODE FOR TABLE OF ADD TO CART document.addEventListener('DOMContentLoaded', () => { loadCartFromLocalStorage(); - updateBadgeCount() ; // update badge on load - if (document.getElementById('cart-items')){ + updateBadgeCount(); // Update badge on load + if (document.getElementById('cart-items')) { document.getElementById('cart-items').addEventListener('click', (event) => { if (event.target.classList.contains('increase-quantity')) { updateQuantity(event.target, 1); } else if (event.target.classList.contains('decrease-quantity')) { updateQuantity(event.target, -1); } + updateCart(); // Update total price when quantity changes }); } + + const cartTable = document.getElementById('cart-table'); + + // Function to update the total individual price and bill + function updateCart() { + const cartItems = document.querySelectorAll('.cart-item'); + let totalAmount = 0; + + cartItems.forEach(item => { + const price = parseFloat(item.dataset.productPrice); + const quantityElement = item.querySelector('.quantity'); + const quantity = parseInt(quantityElement.textContent, 10); + const totalIndividualPrice = price * quantity; + + // Add or update the total individual price column + let totalCell = item.querySelector('.total-individual-price'); + if (!totalCell) { + totalCell = document.createElement('td'); + totalCell.classList.add('total-individual-price'); + item.appendChild(totalCell); + } + totalCell.textContent = `$${totalIndividualPrice.toFixed(2)}`; + + totalAmount += totalIndividualPrice; + }); + + // Update the cart total + document.getElementById('cart-total').textContent = `Total: $${totalAmount.toFixed(2)}`; + } + + // Initial update on page load + updateCart(); }); function loadCartFromLocalStorage() { const cartItems = JSON.parse(localStorage.getItem('cartItems')) || []; const cartItemsContainer = document.getElementById('cart-items'); - if(cartItemsContainer){ + if (cartItemsContainer) { cartItemsContainer.innerHTML = ''; // Clear existing items cartItems.forEach(item => { @@ -25,7 +57,7 @@ function loadCartFromLocalStorage() { cartItemRow.setAttribute('data-product-id', item.id); cartItemRow.setAttribute('data-product-price', item.price); cartItemRow.innerHTML = ` - ${item.name} + ${item.name} $${item.price.toFixed(2)} ${item.quantity} @@ -69,23 +101,25 @@ function saveCartToLocalStorage() { document.querySelectorAll('.cart-item').forEach(item => { cartItems.push({ id: item.getAttribute('data-product-id'), + name: item.querySelector('td').textContent, // Fetch the item name from the first price: parseFloat(item.getAttribute('data-product-price')), quantity: parseInt(item.querySelector('.quantity').textContent) }); }); localStorage.setItem('cartItems', JSON.stringify(cartItems)); - updateBadgeCount(); // update badge count after saving + updateBadgeCount(); // Update badge count after saving } -//CODE FOR COUPON RECEIVED ON CLICKING ORDER NOW - // Function to generate a random coupon code - const generateCouponCode = () => { + +// Function to generate a random coupon code +const generateCouponCode = () => { const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; let couponCode = ''; for (let i = 0; i < 8; i++) { couponCode += characters.charAt(Math.floor(Math.random() * characters.length)); } return couponCode; -} +}; + // Check if it's the user's first order and apply discount const applyFirstTimeDiscount = () => { let couponCode = localStorage.getItem('couponCode'); @@ -93,12 +127,12 @@ const applyFirstTimeDiscount = () => { couponCode = generateCouponCode(); localStorage.setItem('couponCode', couponCode); } - if(document.getElementById('couponCode')){ + if (document.getElementById('couponCode')) { document.getElementById('couponCode').innerHTML = `Use coupon code ${couponCode} for 30% off!`; alert(`Congratulations! Your coupon code is ${couponCode}. You've received a 30% discount on your first order.`); } - -} +}; + window.onload = applyFirstTimeDiscount; function updateBadgeCount() { diff --git a/Html-files/contact.html b/Html-files/contact.html index 24ecfff9..c5261767 100644 --- a/Html-files/contact.html +++ b/Html-files/contact.html @@ -204,7 +204,7 @@ .foot-panel2 { background-color: rgb(138, 37, 37); color: white; - height: 300px; + height: auto; /* height: fit-content; */ display: flex; /* padding: 10px; */ @@ -237,7 +237,7 @@ flex-direction: column; justify-content: center; align-items: center; - width: 20rem; + width: 100%; height: max-content; } @@ -251,6 +251,7 @@ } #contactForm h3 { + margin-top: 10px; height: 30px; color: #141414; } @@ -273,7 +274,7 @@ .foot_panel4 { background-color: rgb(66, 16, 16); color: white; - height: 160px; + height: 0px; font-size: 0.9rem; text-align: center; } @@ -320,6 +321,47 @@ padding: 20px; } } + + .foot-panel2 ul a { + padding: 0; /* Reset padding */ + list-style: none; /* Remove default bullet points */ + } + + .foot-panel2 ul a { + /* /* color: black!important; */ + text-decoration: none !important; + transition:transform 0.2s ease, text-decoration-color 0.2s ease; + /* display: inline-block; */ + + + text-decoration: none; + color: #000; + position: relative; + padding-bottom: 2px; + + } + + .foot-panel2 ul a::after{ + content: ''; + position: absolute; + left: 0; + bottom: 0; + width: 0; + height: 2px; + background-color: brown; + transition: width 0.3s ease; + width:0; + + } + + .foot-panel2 ul a:hover{ + transform: scale(1.05); + } + + .foot-panel2 ul a:hover::after{ + width:100%; + } + + + +
+
+ +
+

Our Contributors

+
+
+ + + + + +
+ + + + diff --git a/Html-files/contributor.js b/Html-files/contributor.js new file mode 100644 index 00000000..7ffa9ea4 --- /dev/null +++ b/Html-files/contributor.js @@ -0,0 +1,55 @@ +document.addEventListener("DOMContentLoaded", () => { + const contributorsContainer = document.getElementById("contributors"); + + async function fetchContributors() { + try { + const response = await fetch( + `https://api.github.com/repos/Anjaliavv51/Retro/contributors` + ); + const contributors = await response.json(); + + contributorsContainer.innerHTML = ""; + contributors.forEach((contributor) => { + const contributorCard = document.createElement("div"); + contributorCard.className = "contributor-card"; + + contributorCard.innerHTML = ` + + ${contributor.login} + +

${contributor.login}

+

Contributions: ${contributor.contributions}

+ `; + + contributorsContainer.appendChild(contributorCard); + }); + } catch (error) { + console.error("Error fetching contributors:", error); + } + } + + fetchContributors(); +}); + +// Dark mode (remains unchanged) +document.addEventListener("DOMContentLoaded", () => { + const toggleCheckbox = document.getElementById("themeToggle"); + const body = document.body; + + if (localStorage.getItem("dark-mode") === "enabled") { + body.classList.add("dark-mode"); + toggleCheckbox.checked = true; + } else { + toggleCheckbox.checked = false; + } + + toggleCheckbox.addEventListener("change", () => { + if (toggleCheckbox.checked) { + body.classList.add("dark-mode"); + localStorage.setItem("dark-mode", "enabled"); + } else { + body.classList.remove("dark-mode"); + localStorage.setItem("dark-mode", "disabled"); + } + }); +}); diff --git a/Html-files/forgot-pass.html b/Html-files/forgot-pass.html new file mode 100644 index 00000000..df5e7a68 --- /dev/null +++ b/Html-files/forgot-pass.html @@ -0,0 +1,136 @@ + + + + + + + + + Retro - Forgot Password + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+

Forgot Password

+
+
+ + +
+ +

+
+ +
+
+ + +
+ + + + diff --git a/Html-files/logged.html b/Html-files/logged.html index 9aae7864..ef8ab8c7 100644 --- a/Html-files/logged.html +++ b/Html-files/logged.html @@ -16,14 +16,14 @@ #sr { display: none; position: fixed; -bottom: 20px; -right: 30px; +bottom: 70px; +right: 15px; z-index: 99; font-size: 18px; border: none; outline: none; -background-color: #555; -color: white; +background-color: transparent; +color: rgb(17, 17, 17); cursor: pointer; padding: 15px; border-radius: 4px; @@ -154,5 +154,20 @@ animateCircles(); + + +
+ + \ No newline at end of file diff --git a/Html-files/login.html b/Html-files/login.html index d4e62d66..fa220990 100644 --- a/Html-files/login.html +++ b/Html-files/login.html @@ -9,15 +9,13 @@ Retro - - - - - - + + + + + + + + - + + + + /* Media Queries for smaller screens */ + @media (max-width: 768px) { + .main-login { + flex-direction: column; + } + + .container { + width: 300px; + height: 400px; + } + + .left-login, + .right-login { + flex: unset; + width: 100%; + padding: 10px; + } + + .card-login { + padding: 15px; + width: 100%; + } + .right-login{ + height: 60vh; + } + + .btn-login, + #google-login { + width: 100%; + padding: 12px; + } + + h1 { + font-size: 24px; + } + } + + @media (max-width: 480px) { + .container { + width: 250px; + height: 350px; + } + + .card-login { + padding: 10px; + } + + .textfield label { + font-size: 14px; + } + + .textfield input { + padding: 8px; + } + + .btn-login, + #google-login { + padding: 10px; + font-size: 14px; + } + } + +
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+




-

O U R   C O L L E C T I O N

+

O U R   C O L L E C T I O N +

@@ -752,130 +864,132 @@

Follow - + - + - - + + +
+ + - + \ No newline at end of file diff --git a/Html-files/museums.html b/Html-files/museums.html new file mode 100644 index 00000000..15051e7d --- /dev/null +++ b/Html-files/museums.html @@ -0,0 +1,558 @@ + + + + + + + Retro + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Retro Museums

+ +
+ + + + + + + + + + + + + + + + + diff --git a/Html-files/payment2.html b/Html-files/payment2.html index 566ebdbf..38a47ebc 100644 --- a/Html-files/payment2.html +++ b/Html-files/payment2.html @@ -331,5 +331,20 @@

UPI Information

}); }); + + +
+ + diff --git a/Html-files/reviews.html b/Html-files/reviews.html new file mode 100644 index 00000000..d646bd87 --- /dev/null +++ b/Html-files/reviews.html @@ -0,0 +1,1018 @@ + + + + + + + + Retro + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + + + + + +
+
+
+ + +
+ +
+
+

User Story Gallery

+
+
+ + +
+
+ + +
+
+ + +
+ +
+ +
+ +
+

Product Reviews

+
+
+ + +
+
+ + +
+
+ +
+ + + + + +
+
+ +
+
+
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Html-files/services.html b/Html-files/services.html index a847f3ed..720e0c41 100644 --- a/Html-files/services.html +++ b/Html-files/services.html @@ -37,22 +37,21 @@ @@ -363,40 +419,44 @@

S E R V I C E S

-
-
-

Vintage - Vibe!

- +
+ +
+
+ Vintage Vibe +

Vintage Vibe!

+
-
-

Services - for Events

- + +
+ + +
+
+ Services for Events +

Services for Events

+ +
-
-

Retro - Delivery Subscription

- + + + +
+
+ Retro Delivery Subscription +

Retro Delivery Subscription

+
-
+
+
@@ -546,15 +606,17 @@

Our Pages

Home + style="font-family: var(--ff-poppins);color: hsl(208, 7%,46%);">Home About + style="font-family: var(--ff-poppins);color: hsl(208, 7%,46%);">About Services + style="font-family: var(--ff-poppins);color: hsl(208, 7%,46%);">Services Contact + style="font-family: var(--ff-poppins);color: hsl(208, 7%,46%);">Contact Cart + style="font-family: var(--ff-poppins);color: hsl(208, 7%,46%);">Cart + Contributors - -
-

Contact - Us!

- - - - -
-

+
+

Contact Us!

+ + +
+ + +
+ + +
+ + +
+ + + +

Follow Us

Stay @@ -779,7 +854,22 @@

+ + +
+ + - \ No newline at end of file + diff --git a/Html-files/signed.html b/Html-files/signed.html index 9c3059f0..bcaf7502 100644 --- a/Html-files/signed.html +++ b/Html-files/signed.html @@ -16,14 +16,14 @@ #sr { display: none; position: fixed; -bottom: 20px; -right: 30px; +bottom: 70px; +right: 15px; z-index: 99; font-size: 18px; border: none; outline: none; -background-color: #555; -color: white; +background-color: transparent; +color: rgb(17, 17, 17); cursor: pointer; padding: 15px; border-radius: 4px; @@ -161,5 +161,20 @@ animateCircles(); + + +
+ + \ No newline at end of file diff --git a/Html-files/signup.html b/Html-files/signup.html index b9985cf9..17e83eda 100644 --- a/Html-files/signup.html +++ b/Html-files/signup.html @@ -19,14 +19,14 @@ #sr { display: none; position: fixed; -bottom: 20px; -right: 30px; +bottom: 70px; +right: 15px; z-index: 99; font-size: 18px; border: none; outline: none; -background-color: #555; -color: white; +background-color: transparent; +color: rgb(17, 17, 17); cursor: pointer; padding: 15px; border-radius: 4px; @@ -169,6 +169,26 @@ .area .way:nth-child(8):hover ~ .box{transform: rotateX(20deg) rotateY(0deg);} .area .way:nth-child(9):hover ~ .box{transform: rotateX(20deg) rotateY(-20deg);} +
@@ -200,6 +220,7 @@
+ + + +
+ + diff --git a/Images/Login.png b/Images/Login.png new file mode 100644 index 00000000..a55a8845 Binary files /dev/null and b/Images/Login.png differ diff --git a/Images/Loginsave.png b/Images/Loginsave.png new file mode 100644 index 00000000..406a5cc5 Binary files /dev/null and b/Images/Loginsave.png differ diff --git a/Images/booking.png b/Images/booking.png new file mode 100644 index 00000000..6dd1b6b5 Binary files /dev/null and b/Images/booking.png differ diff --git a/Images/customer-service.png b/Images/customer-service.png new file mode 100644 index 00000000..2ce8c21f Binary files /dev/null and b/Images/customer-service.png differ diff --git a/Images/ecommerce.png b/Images/ecommerce.png new file mode 100644 index 00000000..b0b8ac44 Binary files /dev/null and b/Images/ecommerce.png differ diff --git a/Images/popup.jpg b/Images/popup.jpg new file mode 100644 index 00000000..f4839634 Binary files /dev/null and b/Images/popup.jpg differ diff --git a/Images/signup.png b/Images/signup.png new file mode 100644 index 00000000..1a21e797 Binary files /dev/null and b/Images/signup.png differ diff --git a/README.md b/README.md index 904085b8..90bbc862 100644 --- a/README.md +++ b/README.md @@ -29,17 +29,61 @@

-

RocketFeatured In

-

RocketProject Overview

+# 🎥Demo + +https://github.com/user-attachments/assets/9fbd2c41-09e1-4843-88d5-5ee2e64de43d + + +# Table of Contents + +1. [Featured In](#featured-in) +2. [About Us](#about-us) +3. [Tech Stack](#tech-stack) +4. [Get Started](#get-started) +5. [Contributing](#contributing) +6. [Website Preview](#website-preview) +7. [Our Contributors](#our-contributors) +8. [Stargazers](#stargazers) +9. [Forkers](#forkers) +10. [Code of Conduct](#code-of-conduct) +11. [License](#license) + + + +## RocketFeatured In + + + + + + + + + + + + + + + + + + +
Event LogoEvent NameEvent Description
GSSoC 24GirlScript Summer of Code 2024GirlScript Summer of Code is a three-month-long Open Source Program conducted every summer by GirlScript Foundation. It is an initiative to bring more beginners to Open-Source Software Development.
Hacktoberfest 2024Hacktoberfest 2024Hacktoberfest is a month-long celebration of open source software run by DigitalOcean, GitHub, and Twilio. It encourages contributions to open source projects and promotes a global community of developers.
+ +## RocketAbout Us

+Welcome to RETRO! 🌕✨ We invite you to explore the vintage look, a unique journey through timeless designs and aesthetics. Our platform celebrates the elegance of the past, blending classic styles with modern usability to create a seamless, visually stunning experience. + +At Retro, we believe that beauty lies in the details, and our website reflects a passion for vintage-inspired design that transports you to a world where nostalgia meets innovation. Whether you're here for inspiration, design exploration, or simply to immerse yourself in a vintage ambiance, we aim to make your experience truly special. + +Discover the charm of the past and embrace a sophisticated, artistic vibe that never goes out of style. Join us, and let's relive the beauty of the bygone eras, one step at a time! 🌸🕰️ + It is an online platform which enables you to get information about your vintage collections and to place the orders.

##

High VoltageTech Stack

-
- - -
+ HTML5

HTML5 structures the website's content, enabling modern multimedia support and semantic layout.


JavaScript

JavaScript adds interactivity, making the site dynamic with features like form validation and real-time content updates.


Bootstrap

Bootstrap provides a responsive framework with pre-built components for consistent design across devices.


CSS3

CSS3 styles the website, enhancing its appearance and ensuring an adaptive layout.




@@ -94,29 +138,57 @@ It is an online platform which enables you to get information about your vintage -

Contributing - -

We love your input! We want to make contributing to this project as easy and transparent as possible, whether it's. +##

Contributing

-To contribute to the Retro repository using GitHub Desktop, follow these steps: +

We appreciate your feedback! Our goal is to make contribution to this project as easy and transparent as possible. Whether you're interested in:

  • Reporting a bug
  • Discussing the current state of the code
  • Submitting a fix
  • Proposing new features

To get started with contributing, please follow the steps outlined in the Contributing.md.

- Reporting a bug
-Discussing the current state of the code
-Submitting a fix
-Proposing new features +## Website Preview📸 +
+ + + -To get started with contributing, please follow the steps outlined in the [Contributing.md](Contributing.md). +🌐 **Visit our website:** [Retro](https://rococo-mooncake-0d89f7.netlify.app/) +
-
-

Our Contributors Red Heart

+ ##

Our Contributors Red Heart

Thank you for contributing to our repository

- -

Show some Red Heart by starring this awesome repository! + +## Stargazers + +

+ +[![Stargazers repo roster for @Anjaliavv51/Retro](https://reporoster.com/stars/Anjaliavv51/Retro)](https://github.com/Anjaliavv51/Retro/stargazers)
+ +## Forkers + +[![Forkers repo roster for @Anjaliavv51/Retro](https://reporoster.com/forks/Anjaliavv51/Retro)](https://github.com/Anjaliavv51/Retro/network/members) + +# Code of Conduct +We are committed to fostering a welcoming and inclusive environment for everyone. All contributors and participants are expected to uphold the following values: + +- Be respectful of different viewpoints and experiences. +- Show empathy toward others. +- Use inclusive language. + +Please read and follow our [Code of Conduct](CODE_OF_CONDUCT.md) to foster an inclusive community. +If anyone violates these standards, they may be banned from the community. + +## License 📜 + +This project is licensed under the MIT License. For more details, see the [LICENSE](LICENSE.txt) file. + + +

If you find this project helpful, please consider giving it a star!

diff --git a/RETRO.png b/RETRO.png new file mode 100644 index 00000000..f04df0da Binary files /dev/null and b/RETRO.png differ diff --git a/about.png b/about.png new file mode 100644 index 00000000..0044de00 Binary files /dev/null and b/about.png differ diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 00000000..1dcef2d9 --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1,2 @@ +node_modules +.env \ No newline at end of file diff --git a/backend/app.js b/backend/app.js new file mode 100644 index 00000000..2240a583 --- /dev/null +++ b/backend/app.js @@ -0,0 +1,24 @@ +const express = require('express'); +const app = express(); + +const authRouter = require('./router/authRoute.js'); +const databaseconnect = require('./config/databaseConfig.js'); +const cookieParser = require('cookie-parser'); +const cors = require('cors'); + +// connect to db +databaseconnect(); + +app.use(express.json()); // Built-in middleware +app.use(cookieParser()); // Third-party middleware + +app.use(cors({ origin: [process.env.CLIENT_URL], credentials: true })); //Third-party middleware + +// Auth router +app.use('/auth', authRouter); + +app.use('/', (req, res) => { + res.status(200).json({ data: 'JWTauth server ;)' }); +}); + +module.exports = app; diff --git a/backend/backendcode.ev b/backend/backendcode.ev new file mode 100644 index 00000000..1d315525 --- /dev/null +++ b/backend/backendcode.ev @@ -0,0 +1,5 @@ +PORT=3000 +MONGODB_URL=mongodb://username:password@cluster0.mongodb.net/retro_db +SECRET=retroApp_SecretKey_2024! +CLIENT_URL=https://rococo-mooncake-0d89f7.netlify.app +GITHUB_REPO=https://github.com/Anjaliavv51/Retro \ No newline at end of file diff --git a/backend/config/databaseConfig.js b/backend/config/databaseConfig.js new file mode 100644 index 00000000..bf7b6ada --- /dev/null +++ b/backend/config/databaseConfig.js @@ -0,0 +1,14 @@ +const mongoose = require("mongoose"); +require('dotenv').config(); +const MONGODB_URL = + process.env.MONGODB_URL || "mongodb://localhost:27017/my_database"; + +// mongoDb database connection +const databaseconnect = () => { + mongoose + .connect(MONGODB_URL) + .then((conn) => console.log(`connected to DB: ${conn.connection.host}`)) + .catch((err) => console.log(err.message)); +}; + +module.exports = databaseconnect; diff --git a/backend/controller/authController.js b/backend/controller/authController.js new file mode 100644 index 00000000..4410682b --- /dev/null +++ b/backend/controller/authController.js @@ -0,0 +1,190 @@ +const userModel = require("../model/userSchema.js"); +const bcrypt = require("bcrypt"); + +const emailValidator = require("email-validator"); + +/****************************************************** + * @SIGNUP + * @route /api/auth/signup + * @method POST + * @description singUp function for creating new user + * @body name, email, password, confirmPassword + * @returns User Object + ******************************************************/ + +const signUp = async (req, res, next) => { + const { name, email, password, confirmPassword } = req.body; +console.log(name , email,password,confirmPassword) + /// every field is required + if (!name || !email || !password || !confirmPassword) { + return res.status(400).json({ + success: false, + message: "Every field is required" + }); + } + + //validate email using npm package "email-validator" + const validEmail = emailValidator.validate(email); + if (!validEmail) { + return res.status(400).json({ + success: false, + message: "Please provide a valid email address 📩" + }); + } + + try { + /// send password not match err if password !== confirmPassword + if (password !== confirmPassword) { + return res.status(400).json({ + success: false, + message: "password and confirm Password does not match ❌" + }); + } + + const userInfo = new userModel(req.body); + + // userSchema "pre" middleware functions for "save" will hash the password using bcrypt + // before saving the data into the database + const result = await userInfo.save(); + return res.status(200).json({ + success: true, + data: result + }); + } catch (error) { + /// send the message of the email is not unique. + if (error.code === 11000) { + return res.status(400).json({ + success: false, + message: `Account already exist with the provided email ${email} 😒` + }); + } + + return res.status(400).json({ + message: error.message + }); + } +}; + +/****************************************************** + * @SIGNIN + * @route /api/auth/signin + * @method POST + * @description verify user and send cookie with jwt token + * @body email , password + * @returns User Object , cookie + ******************************************************/ + +const signIn = async (req, res, next) => { + const { email, password } = req.body; + console.log(email,password) + + // send response with error message if email or password is missing + if (!email || !password) { + return res.status(400).json({ + success: false, + message: "email and password are required" + }); + } + + try { + // check user exist or not + const user = await userModel + .findOne({ + email + }) + .select("+password"); + + // If user is null or the password is incorrect return response with error message + if (!user || !(await bcrypt.compare(password, user.password))) { + // bcrypt.compare returns boolean value + return res.status(400).json({ + success: false, + message: "invalid credentials" + }); + } + + // Create jwt token using userSchema method( jwtToken() ) + const token = user.jwtToken(); + user.password = undefined; + + const cookieOption = { + secure:true, + maxAge: 24 * 60 * 60 * 1000, //24hr + httpOnly: true // not able to modify the cookie in client side + }; + + res.cookie("token", token, cookieOption); + res.status(200).json({ + success: true, + data: user + }); + } catch (error) { + return res.status(400).json({ + success: false, + message: error.message + }); + } +}; + + +/****************************************************** + * @LOGOUT + * @route /api/auth/logout + * @method GET + * @description Remove the token form cookie + * @returns logout message and cookie without token + ******************************************************/ + +const logout = async (req, res, next) => { + try { + const cookieOption = { + expires: new Date(Date.now()), // current expiry date + httpOnly: true // not able to modify the cookie in client side + }; + + // return response with cookie without token + res.cookie("token", null, cookieOption); + res.status(200).json({ + success: true, + message: "Logged Out" + }); + } catch (error) { + res.stats(400).json({ + success: false, + message: error.message + }); + } +}; + +/****************************************************** + * @GETUSER + * @route /api/auth/user + * @method GET + * @description retrieve user data from mongoDb if user is valid(jwt auth) + * @returns User Object + ******************************************************/ + +const getUser = async (req, res, next) => { + const userId = req.user.id; + try { + const user = await userModel.findById(userId); + return res.status(200).json({ + success: true, + data: user + }); + } catch (error) { + return res.status(400).json({ + success: false, + message: error.message + }); + } +}; + +module.exports = { + signUp, + signIn, + + getUser, + + logout +}; diff --git a/backend/index.js b/backend/index.js new file mode 100644 index 00000000..ba8186d4 --- /dev/null +++ b/backend/index.js @@ -0,0 +1,9 @@ +require('dotenv').config(); +const PORT = process.env.PORT || 5000; + + +const app = require('./app'); + +app.listen(PORT,()=>{ + console.log(`server is listening at http://localhost:${PORT}`); +}) \ No newline at end of file diff --git a/backend/middleware/jwtAuth.js b/backend/middleware/jwtAuth.js new file mode 100644 index 00000000..aeec6509 --- /dev/null +++ b/backend/middleware/jwtAuth.js @@ -0,0 +1,24 @@ +const JWT = require("jsonwebtoken"); + +// router level middleware function +const jwtAuth = (req, res, next) => { + + // get cookie token(jwt token generated using json.sign()) form the request + const token = ( req.cookies?.token) || null; + + // return response if there is no token(jwt token attached with cookie) + if (!token) { + return res.status(400).json({ success: false, message: "NOT authorized" }); + } + + // verify the token + try { + const payload = JWT.verify(token, process.env.SECRET); + req.user = { id: payload.id, email: payload.email }; + } catch (error) { + return res.status(400).json({ success: false, message: error.message }); + } + next(); +}; + +module.exports = jwtAuth; diff --git a/backend/model/userSchema.js b/backend/model/userSchema.js new file mode 100644 index 00000000..3a7cb668 --- /dev/null +++ b/backend/model/userSchema.js @@ -0,0 +1,73 @@ +const mongoose = require('mongoose'); +const { Schema } = mongoose; +const crypto = require('crypto'); +const bcrypt = require('bcrypt'); +const JWT = require('jsonwebtoken'); + +const userSchema = new Schema( + { + name: { + type: String, + require: [true, 'user name is Required'], + + trim: true, + }, + email: { + type: String, + required: [true, 'user email is required'], + unique: true, + lowercase: true, + unique: [true, 'already registered'], + }, + password: { + type: String, + select: false, + }, + forgotPasswordToken: { + type: String, + }, + forgotPasswordExpiryDate: { + type: Date, + }, + }, + { timestamps: true } +); + +// Hash password before saving to the database +userSchema.pre('save', async function (next) { + // If password is not modified then do not hash it + if (!this.isModified('password')) return next(); + this.password = await bcrypt.hash(this.password, 10); + return next(); +}); + +// FIXME: Check if these methods are working as expected +userSchema.methods = { + //method for generating the jwt token + jwtToken() { + return JWT.sign( + { id: this._id, email: this.email }, + process.env.SECRET, + { expiresIn: '24h' } // 24 hours + ); + }, + + //userSchema method for generating and return forgotPassword token + getForgotPasswordToken() { + const forgotToken = crypto.randomBytes(20).toString('hex'); + //step 1 - save to DB + this.forgotPasswordToken = crypto + .createHash('sha256') + .update(forgotToken) + .digest('hex'); + + /// forgot password expiry date + this.forgotPasswordExpiryDate = Date.now() + 20 * 60 * 1000; // 20min + + //step 2 - return values to user + return forgotToken; + }, +}; + +const userModel = mongoose.model('user', userSchema); +module.exports = userModel; diff --git a/backend/package-lock.json b/backend/package-lock.json new file mode 100644 index 00000000..ec65e660 --- /dev/null +++ b/backend/package-lock.json @@ -0,0 +1,1910 @@ +{ + "name": "backend", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "backend", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "bcrypt": "^5.1.1", + "cookie-parser": "^1.4.6", + "cors": "^2.8.5", + "dotenv": "^16.4.5", + "email-validator": "^2.0.4", + "express": "^4.21.0", + "jsonwebtoken": "^9.0.2", + "mongoose": "^8.6.3", + "nodemon": "^3.1.5" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz", + "integrity": "sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==", + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" + }, + "node_modules/@types/whatwg-url": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", + "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", + "dependencies": { + "@types/webidl-conversions": "*" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "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==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/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==" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "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==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bcrypt": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", + "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.11", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "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/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bson": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.8.0.tgz", + "integrity": "sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ==", + "engines": { + "node": ">=16.20.1" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "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==", + "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/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "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==", + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "dependencies": { + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "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==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "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==", + "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/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "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==", + "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==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.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==" + }, + "node_modules/email-validator": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/email-validator/-/email-validator-2.0.4.tgz", + "integrity": "sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==", + "engines": { + "node": ">4.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "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==", + "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==", + "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==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "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==", + "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/express/node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "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" + }, + "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==", + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "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==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "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/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "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==", + "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==", + "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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "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==", + "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/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/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==" + }, + "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==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "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==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/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==" + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/kareem": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", + "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" + }, + "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==", + "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==", + "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==", + "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==", + "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==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mongodb": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.8.0.tgz", + "integrity": "sha512-HGQ9NWDle5WvwMnrvUxsFYPd3JEbqD3RgABHBQRuoCEND0qzhsd0iH5ypHsf1eJ+sXmvmyKpP+FLOKY8Il7jMw==", + "dependencies": { + "@mongodb-js/saslprep": "^1.1.5", + "bson": "^6.7.0", + "mongodb-connection-string-url": "^3.0.0" + }, + "engines": { + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz", + "integrity": "sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==", + "dependencies": { + "@types/whatwg-url": "^11.0.2", + "whatwg-url": "^13.0.0" + } + }, + "node_modules/mongoose": { + "version": "8.6.3", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.6.3.tgz", + "integrity": "sha512-++yRmm7hjMbqVA/8WeiygTnEfrFbiy+OBjQi49GFJIvCQuSYE56myyQWo4j5hbpcHjhHQU8NukMNGTwAWFWjIw==", + "dependencies": { + "bson": "^6.7.0", + "kareem": "2.6.3", + "mongodb": "6.8.0", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "17.1.3" + }, + "engines": { + "node": ">=16.20.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose/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==" + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/mquery/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mquery/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==" + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/nodemon": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.5.tgz", + "integrity": "sha512-V5UtfYc7hjFD4SI3EzD5TR8ChAHEZ+Ns7Z5fBk8fAbTVAj+q3G+w7sHJrHxXBkVn6ApLVTljau8wfHwqmGUjMw==", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nodemon/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==" + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "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==", + "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", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "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==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "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==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "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==", + "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==", + "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/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "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" + }, + "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==", + "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==" + }, + "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==", + "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-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "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==", + "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==" + }, + "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==", + "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/sift": { + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", + "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "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" + }, + "engines": { + "node": ">=8.0" + } + }, + "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==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tr46": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "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==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "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==", + "engines": { + "node": ">= 0.4.0" + } + }, + "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==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", + "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", + "dependencies": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } +} diff --git a/backend/package.json b/backend/package.json new file mode 100644 index 00000000..7380d996 --- /dev/null +++ b/backend/package.json @@ -0,0 +1,24 @@ +{ + "name": "backend", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "start":"nodemon ./index.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "bcrypt": "^5.1.1", + "cookie-parser": "^1.4.6", + "cors": "^2.8.5", + "dotenv": "^16.4.5", + "email-validator": "^2.0.4", + "express": "^4.21.0", + "jsonwebtoken": "^9.0.2", + "mongoose": "^8.6.3", + "nodemon": "^3.1.5" + } +} diff --git a/backend/router/authRoute.js b/backend/router/authRoute.js new file mode 100644 index 00000000..48f66e0e --- /dev/null +++ b/backend/router/authRoute.js @@ -0,0 +1,21 @@ +const express = require("express"); +const authRouter = express.Router(); +const jwtAuth = require("../middleware/jwtAuth.js"); + +const { + signUp, + signIn, + forgotPassword, + resetPassword, + getUser, + logout +} = require("../controller/authController.js"); + +authRouter.post("/signup", signUp); +authRouter.post("/signin", signIn); + + +authRouter.get("/user", jwtAuth, getUser); +authRouter.get("/logout", jwtAuth, logout); + +module.exports = authRouter; diff --git a/collaborative_filtering.py b/collaborative_filtering.py new file mode 100644 index 00000000..92a42fac --- /dev/null +++ b/collaborative_filtering.py @@ -0,0 +1,20 @@ +from surprise import Dataset, Reader, SVD +from surprise.model_selection import train_test_split, accuracy + +# Load data from database +data = cursor.execute('SELECT user_id, item_id, interaction_type FROM user_interactions').fetchall() + +# Convert to Surprise dataset +reader = Reader(rating_scale=(1, 5)) +dataset = Dataset.load_from_df(pd.DataFrame(data, columns=['user_id', 'item_id', 'interaction_type']), reader) + +# Train-test split +trainset, testset = train_test_split(dataset, test_size=0.25) + +# Train model +algo = SVD() +algo.fit(trainset) + +# Test model +predictions = algo.test(testset) +accuracy.rmse(predictions) diff --git a/collection.png b/collection.png new file mode 100644 index 00000000..b695b696 Binary files /dev/null and b/collection.png differ diff --git a/content_based_filtering.py b/content_based_filtering.py new file mode 100644 index 00000000..c1943d15 --- /dev/null +++ b/content_based_filtering.py @@ -0,0 +1,28 @@ +from sklearn.feature_extraction.text import TfidfVectorizer +from sklearn.metrics.pairwise import linear_kernel + +# Example item descriptions +items = [ + {'id': 101, 'description': 'Vintage camera from the 1950s'}, + {'id': 102, 'description': 'Classic vinyl record'}, + {'id': 103, 'description': 'Retro gaming console'} +] + +# Create TF-IDF matrix +tfidf = TfidfVectorizer(stop_words='english') +tfidf_matrix = tfidf.fit_transform([item['description'] for item in items]) + +# Compute cosine similarity +cosine_sim = linear_kernel(tfidf_matrix, tfidf_matrix) + +# Function to get recommendations +def get_recommendations(item_id, cosine_sim=cosine_sim): + idx = next(index for (index, d) in enumerate(items) if d["id"] == item_id) + sim_scores = list(enumerate(cosine_sim[idx])) + sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True) + sim_scores = sim_scores[1:4] + item_indices = [i[0] for i in sim_scores] + return [items[i]['id'] for i in item_indices] + +# Example usage +print(get_recommendations(101)) diff --git a/data_collection.py b/data_collection.py new file mode 100644 index 00000000..33c0e78d --- /dev/null +++ b/data_collection.py @@ -0,0 +1,30 @@ +from datetime import datetime +import sqlite3 + +# Connect to SQLite database +conn = sqlite3.connect('user_data.db') +cursor = conn.cursor() + +# Create table +cursor.execute(''' +CREATE TABLE IF NOT EXISTS user_interactions ( + user_id INTEGER, + item_id INTEGER, + interaction_type TEXT, + timestamp DATETIME +) +''') + +# Function to log interaction +def log_interaction(user_id, item_id, interaction_type): + timestamp = datetime.now() + cursor.execute(''' + INSERT INTO user_interactions (user_id, item_id, interaction_type, timestamp) + VALUES (?, ?, ?, ?) + ''', (user_id, item_id, interaction_type, timestamp)) + conn.commit() + +# Example usage +log_interaction(1, 101, 'click') +log_interaction(1, 102, 'view') +log_interaction(2, 101, 'purchase') diff --git a/gssoc24.png b/gssoc24.png new file mode 100644 index 00000000..c3c16767 Binary files /dev/null and b/gssoc24.png differ diff --git a/hacktoberfest.png b/hacktoberfest.png new file mode 100644 index 00000000..3756d972 Binary files /dev/null and b/hacktoberfest.png differ diff --git a/home.png b/home.png new file mode 100644 index 00000000..f2830887 Binary files /dev/null and b/home.png differ diff --git a/index.html b/index.html index 11660d1f..28ce3336 100644 --- a/index.html +++ b/index.html @@ -1,19 +1,33 @@ - + - + Retro - + + + + + + + + + - - + + - @@ -400,7 +478,7 @@

+
+ + + + + + + + + + +
-
+
Biryani

60s-style florals

From aromatic curries to flavorful biryanis, our menu showcases the diversity and deliciousness of Indian cuisine.

-
+
Plate

60's Dinning Items

Elegant porcelain plates with delicate floral patterns. Each plate tells a story of family gatherings and special occasions.

-
+
Candy

Whimsical Nostalgia: The Stardust Bonbon

The Stardust Bonbon, a sweet relic from an era when the universe was our playground.

@@ -514,25 +718,27 @@

Whims
-

-

Bringing happiness
to you

+

+

Bringing happiness to you

Order your favourite vintage collections!

-
-
-
+ +
+
+

Online Delivery


Order Online
-
+

Click & Collect


Take out Order
-
+ +

-
@@ -624,11 +846,11 @@

Juices -
+ + + + + +

Frequently Asked Questions

+
+
+
+ What is your return policy? + + + + + +
+
Our return policy lasts 30 days...
+
+
+
+ How do I track my order? + + + + + +
+
You can track your order using the tracking number...
+
+
+
+ How long does shipping take? + + + + + +
+
Shipping typically takes 5-7 business days, depending on your location.
+
+
+
+ Can I change my order after it's been placed? + + + + + +
+
If your order hasn't been processed yet, you can contact us to make changes.
+
+
+
+ Do you ship internationally? + + + + + +
+
Yes, we offer international shipping to select countries.
+
+
+
+ Do you offer discounts for bulk orders? + + + + + +
+
Yes, we provide discounts on bulk orders. Please contact our sales team for more details.
+
+
+ +

+ + + +



@@ -733,40 +1113,57 @@

Downlo @@ -781,6 +1178,8 @@

Follow + +

Stay connected with us on social media for the latest updates, latest collection, and vintage adventures. @@ -805,6 +1204,9 @@

Follow +
+ + + + + + + + - + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..8294ce1a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "Retro", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} diff --git a/recommendation.py b/recommendation.py new file mode 100644 index 00000000..355064f6 --- /dev/null +++ b/recommendation.py @@ -0,0 +1,27 @@ +import pandas as pd +from sklearn.metrics.pairwise import cosine_similarity +import numpy as np + +def load_data(): + # Load interaction data + data = pd.read_csv('user_interactions.csv') + return data + +def build_model(data): + # Create user-item interaction matrix + user_item_matrix = data.pivot_table(index='user_id', columns='item_id', values='interaction', aggfunc='count', fill_value=0) + + # Compute cosine similarity between users + user_similarity = cosine_similarity(user_item_matrix) + + return user_item_matrix, user_similarity + +def recommend_items(user_id, user_item_matrix, user_similarity, num_recommendations=5): + user_idx = user_item_matrix.index.get_loc(user_id) + similar_users = list(enumerate(user_similarity[user_idx])) + similar_users = sorted(similar_users, key=lambda x: x[1], reverse=True) + + recommendations = [] + for user, score in similar_users: + if user != user_idx: + similar_user_items = user_item_matrix.iloc diff --git a/script/popup.js b/script/popup.js new file mode 100644 index 00000000..f870dacb --- /dev/null +++ b/script/popup.js @@ -0,0 +1,45 @@ +// Show the pop-up automatically when the page loads +window.onload = function() { + document.getElementById('popup').style.display = 'flex'; +}; + +// Close the pop-up when the user clicks the close button +document.querySelector('.close-btn').addEventListener('click', function() { + document.getElementById('popup').style.display = 'none'; +}); + +document.querySelector('.popuplogo').addEventListener('click', function(event) { + // Redirect to the login page + window.location.href = 'Html-files/signup.html'; // Change to your actual login page URL +}); + +//email validation using a more comprehensive regex +function validateEmail(email) { + const regex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; + return regex.test(email); +} + +// Handle form submission +document.getElementById('emailForm').addEventListener('submit', function(event) { + event.preventDefault(); + + const email = document.getElementById('popup-email').value; + + // Check if the email is valid + if (validateEmail(email)) { + // Hide the pop-up first, then show the alert after 0.1 seconds + document.getElementById('popup').style.display = 'none'; // Close the pop-up + + setTimeout(function() { + alert(`Thank you! A 30% discount code has been sent to ${email}`); + }, 100); // Delay of 100ms (0.1 seconds) + } else { + alert('Please enter a valid email address.'); + } +}); + +// Handle "No thanks" link +document.querySelector('.no-thanks').addEventListener('click', function(event) { + event.preventDefault(); + document.getElementById('popup').style.display = 'none'; +}); diff --git a/shdbxjcsh.html b/shdbxjcsh.html deleted file mode 100644 index 8b137891..00000000 --- a/shdbxjcsh.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/style.css b/style.css index 5b27685a..32f5f69d 100644 --- a/style.css +++ b/style.css @@ -38,7 +38,7 @@ body { color: #fff; border-bottom: 1px solid #fff; } - +*/ .navbar.fixed-top { position: fixed; top: 0; @@ -218,15 +218,17 @@ body { gap: 20px; } - .box { + .service_item { text-align: center; flex: 1; + padding: 10px; + margin: 5px 0; } - .box h2 { + .service_item h2 { font-family: var(--ff-philosopher); color: hsl(357, 82%, 35%); - font-size: 1.5rem; + font-size: 1.7rem; margin-bottom: 10px; } @@ -236,6 +238,7 @@ body { color: white; padding: 12px 30px; font-size: 1rem; + margin-top: 10px; text-decoration: none; border-radius: 10px; transition: background-color 0.3s ease; @@ -244,6 +247,8 @@ body { .order_btn:hover { background-color: hsl(357, 82%, 45%); } + + @@ -322,7 +327,6 @@ body { border-radius: 15px; display: inline-block; color: white; - transition: transform 0.3s ease, background-color 0.3s ease, color 0.3s ease; /* Smooth transition */ transition: transform 0.3s ease, background-color 0.3s ease, color 0.3s ease; }*/ @@ -389,6 +393,9 @@ body { .menu_items { display: flex; + flex-wrap: wrap; + justify-content: center; + align-items: center; overflow: hidden; } @@ -602,7 +609,7 @@ ul a { display: block; font-size: 0.85rem; margin-top: 10px; - color: #dddddd; + /* color: #dddddd; */ text-decoration: none; } @@ -668,9 +675,9 @@ textarea { } .social-icons a { - font-size: 1.2rem; - padding: 8px; - margin: 15px; + font-size: 1rem; + padding: 7px; + margin: 7px 6px 0 8px; text-decoration: none; color: brown !important; } @@ -694,6 +701,15 @@ textarea { color: #181e20 !important; /* color: white; */ } +.fa-brands.fa-twitter:hover { + color:#00B6F1; +} +.fa-brands.fa-youtube:hover { + color: #FF0000; +} +.fa-brands.fa-snapchat:hover { + color: #FFFC00; +} .social-icons a:hover { /* color: brown; */ @@ -797,6 +813,8 @@ textarea { margin-top: 20px; } + + input, textarea { height: 30px; @@ -1086,7 +1104,6 @@ padding-left:2px; margin-top: 5px; width: 60%; } - .nav-logo{ margin-left: 30px; margin-right: 350px; @@ -1097,4 +1114,4 @@ padding-left:2px; margin-left: 0px; margin-right: 0px; } -} \ No newline at end of file +}